001    /**
002     * OntDeepBasic.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/06/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_basic similarity. See package documentation
022     * for details.
023     * 
024     * @author Juan A. Recio-Garcia
025     * @version 1.0
026     * @see jcolibri.method.retrieve.NNretrieval.similarity.local
027     */
028    public class OntDeepBasic 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 = ob.getMaxProf();
059    
060            return up / down;
061        }
062    
063        /** Applicable to Instance */
064        public boolean isApplicable(Object o1, Object o2)
065        {
066            if ((o1 == null) && (o2 == null))
067                return true;
068            else if (o1 == null)
069                return o2 instanceof Instance;
070            else if (o2 == null)
071                return o1 instanceof Instance;
072            else
073                return (o1 instanceof Instance) && (o2 instanceof Instance);
074        }
075    
076        /**
077             * Testing method using test5 ontology
078             */
079        public static void main(String[] args)
080        {
081            try
082            {
083                // Obtain a reference to OntoBridge
084                OntoBridge ob = jcolibri.util.OntoBridgeSingleton.getOntoBridge();
085                // Configure it to work with the Pellet reasoner
086                ob.initWithPelletReasoner();
087                // Setup the main ontology
088                OntologyDocument mainOnto = new OntologyDocument("http://gaia.fdi.ucm.es/ontologies/vacation.owl", FileIO
089                        .findFile("jcolibri/test/test5/vacation.owl").toExternalForm());
090                // There are not subontologies
091                ArrayList<OntologyDocument> subOntologies = new ArrayList<OntologyDocument>();
092                // Load the ontology
093                ob.loadOntology(mainOnto, subOntologies, false);
094    
095                OntDeepBasic sim = new OntDeepBasic();
096    
097                System.out.println("deep_basic(CAR,TRAIN)=" + sim.compute(new Instance("CAR"), new Instance("TRAIN")));
098                System.out.println("deep_basic(CAR,IBIZA)=" + sim.compute(new Instance("CAR"), new Instance("IBIZA")));
099                System.out.println("deep_basic(CAR,I101)=" + sim.compute(new Instance("CAR"), new Instance("I101")));
100    
101            } catch (Exception e)
102            {
103                org.apache.commons.logging.LogFactory.getLog(OntDeepBasic.class).error(e);
104            }
105        }
106    }