001    /**
002     * OntDeep.java
003     * jCOLIBRI2 framework. 
004     * @author Juan A. Recio-García.
005     * GAIA - Group for Artificial Intelligence Applications
006     * http://gaia.fdi.ucm.es
007     * 13/01/2007
008     */
009    package jcolibri.method.retrieve.NNretrieval.similarity.local.ontology;
010    
011    import java.util.ArrayList;
012    
013    import jcolibri.datatypes.Instance;
014    import jcolibri.exception.NoApplicableSimilarityFunctionException;
015    import jcolibri.method.retrieve.NNretrieval.similarity.LocalSimilarityFunction;
016    import jcolibri.util.FileIO;
017    import es.ucm.fdi.gaia.ontobridge.OntoBridge;
018    import es.ucm.fdi.gaia.ontobridge.OntologyDocument;
019    
020    /**
021     * This function computes the fdeep similarity. See package documentation for
022     * details.
023     * 
024     * @author Juan A. Recio-Garcia
025     * @version 1.0
026     * @see jcolibri.method.retrieve.NNretrieval.similarity.local
027     */
028    public class OntDeep implements LocalSimilarityFunction
029    {
030    
031            /*
032             * (non-Javadoc)
033             * 
034             * @see jcolibri.method.retrieve.NNretrieval.similarity.LocalSimilarityFunction#compute(java.lang.Object,
035             *      java.lang.Object, jcolibri.cbrcore.CaseComponent,
036             *      jcolibri.cbrcore.CaseComponent, jcolibri.cbrcore.CBRCase,
037             *      jcolibri.cbrcore.CBRQuery, java.lang.String)
038             */
039        public double compute(Object caseObject, Object queryObject) throws NoApplicableSimilarityFunctionException
040        {
041            if ((caseObject == null) || (queryObject == null))
042                return 0;
043            if (!(caseObject instanceof Instance))
044                throw new jcolibri.exception.NoApplicableSimilarityFunctionException(this.getClass(), caseObject.getClass());
045            if (!(queryObject instanceof Instance))
046                throw new jcolibri.exception.NoApplicableSimilarityFunctionException(this.getClass(), queryObject
047                        .getClass());
048    
049            Instance i1 = (Instance) caseObject;
050            Instance i2 = (Instance) queryObject;
051    
052            if (i1.equals(i2))
053                return 1;
054    
055            OntoBridge ob = jcolibri.util.OntoBridgeSingleton.getOntoBridge();
056    
057            double up = ob.maxProfLCS(i1.toString(), i2.toString());
058            double down;
059    
060            int prof1 = ob.profInstance(i1.toString());
061            int prof2 = ob.profInstance(i2.toString());
062            if (prof1 > prof2)
063                down = prof1;
064            else
065                down = prof2;
066    
067            return up / down;
068        }
069    
070        /** Applicable to Instance */
071        public boolean isApplicable(Object o1, Object o2)
072        {
073            if ((o1 == null) && (o2 == null))
074                return true;
075            else if (o1 == null)
076                return o2 instanceof Instance;
077            else if (o2 == null)
078                return o1 instanceof Instance;
079            else
080                return (o1 instanceof Instance) && (o2 instanceof Instance);
081        }
082    
083        /**
084             * Testing method using test5 ontology
085             */
086        public static void main(String[] args)
087        {
088            try
089            {
090                // Obtain a reference to OntoBridge
091                OntoBridge ob = jcolibri.util.OntoBridgeSingleton.getOntoBridge();
092                // Configure it to work with the Pellet reasoner
093                ob.initWithPelletReasoner();
094                // Setup the main ontology
095                OntologyDocument mainOnto = new OntologyDocument("http://gaia.fdi.ucm.es/ontologies/vacation.owl", FileIO
096                        .findFile("jcolibri/test/test5/vacation.owl").toExternalForm());
097                // There are not subontologies
098                ArrayList<OntologyDocument> subOntologies = new ArrayList<OntologyDocument>();
099                // Load the ontology
100                ob.loadOntology(mainOnto, subOntologies, false);
101    
102                OntDeep sim = new OntDeep();
103    
104                System.out.println("deep(CAR,TRAIN)=" + sim.compute(new Instance("CAR"), new Instance("TRAIN")));
105                System.out.println("deep(CAR,IBIZA)=" + sim.compute(new Instance("CAR"), new Instance("IBIZA")));
106                System.out.println("deep(CAR,I101)=" + sim.compute(new Instance("CAR"), new Instance("I101")));
107    
108            } catch (Exception e)
109            {
110                org.apache.commons.logging.LogFactory.getLog(OntDeepBasic.class).error(e);
111            }
112        }
113    
114    }