001/**
002 * Copyright (C) 2007-2011, Jens Lehmann
003 *
004 * This file is part of DL-Learner.
005 *
006 * DL-Learner is free software; you can redistribute it and/or modify
007 * it under the terms of the GNU General Public License as published by
008 * the Free Software Foundation; either version 3 of the License, or
009 * (at your option) any later version.
010 *
011 * DL-Learner is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
014 * GNU General Public License for more details.
015 *
016 * You should have received a copy of the GNU General Public License
017 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
018 */
019
020package org.dllearner.algorithms.isle.metrics;
021
022import java.util.Arrays;
023import java.util.List;
024
025import org.dllearner.algorithms.el.ELDescriptionTreeComparator;
026import org.dllearner.algorithms.el.ELHeuristic;
027import org.dllearner.algorithms.el.SearchTreeNode;
028import org.dllearner.core.ComponentInitException;
029import org.semanticweb.owlapi.model.OWLClass;
030import org.semanticweb.owlapi.model.OWLClassExpression;
031
032/**
033 * A stable comparator for search tree nodes. Stable means that the order
034 * of nodes will not change during the run of the learning algorithm. In
035 * this implementation, this is ensured by using only covered examples
036 * and tree size as criteria.
037 * 
038 * @author Jens Lehmann
039 *
040 */
041public class RelevanceWeightedStableHeuristic implements ELHeuristic {
042
043        private ELDescriptionTreeComparator cmp = new ELDescriptionTreeComparator();
044        private RelevanceWeightings weightings;
045        private List<RelevanceMetric> relevanceMetrics;
046        private OWLClass classToDescribe;
047        
048        
049        public RelevanceWeightedStableHeuristic(OWLClass classToDescribe, RelevanceWeightings weightings, RelevanceMetric... relevanceMetrics) {
050                this.classToDescribe = classToDescribe;
051                this.weightings = weightings;
052                this.relevanceMetrics = Arrays.asList(relevanceMetrics);
053        }
054        
055        public RelevanceWeightedStableHeuristic(OWLClass classToDescribe, RelevanceWeightings weightings, List<RelevanceMetric> relevanceMetrics) {
056                this.classToDescribe = classToDescribe;
057                this.weightings = weightings;
058                this.relevanceMetrics = relevanceMetrics;
059        }
060        
061        public RelevanceWeightedStableHeuristic(OWLClass classToDescribe, RelevanceMetric... relevanceMetrics) {
062                this(classToDescribe, new DefaultRelevanceWeightings(), relevanceMetrics);
063        }
064        
065        public RelevanceWeightedStableHeuristic(OWLClass classToDescribe, List<RelevanceMetric> relevanceMetrics) {
066                this(classToDescribe, new DefaultRelevanceWeightings(), relevanceMetrics);
067        }
068        
069        /**
070         * @param weightings the weightings to set
071         */
072        public void setWeightings(RelevanceWeightings weightings) {
073                this.weightings = weightings;
074        }
075        
076        /**
077         * @param relevanceMetrics the relevanceMetrics to set
078         */
079        public void setRelevanceMetrics(List<RelevanceMetric> relevanceMetrics) {
080                this.relevanceMetrics = relevanceMetrics;
081        }
082        
083        /**
084         * @param classToDescribe the classToDescribe to set
085         */
086        public void setClassToDescribe(OWLClass classToDescribe) {
087                this.classToDescribe = classToDescribe;
088        }
089        
090        public double getNodeScore(SearchTreeNode node){
091                double score = node.getAccuracy();
092                OWLClassExpression d = node.getDescriptionTree().transformToClassExpression();
093                for (RelevanceMetric metric : relevanceMetrics) {
094                        score += weightings.getWeight(metric.getClass()) * metric.getRelevance(classToDescribe, d);
095                }
096                return score;
097        }
098        
099        @Override
100        public int compare(SearchTreeNode o1, SearchTreeNode o2) {
101        
102//              int diff = o2.getCoveredNegatives() - o1.getCoveredNegatives();
103                double score1 = o1.getScore().getAccuracy();
104                double score2 = o2.getScore().getAccuracy();
105                int diff = Double.compare(score1, score2);
106                if(diff>0) {            
107                        return 1;
108                } else if(diff<0) {
109                        return -1;
110                } else {
111                        
112                        double sizeDiff = o2.getDescriptionTree().getSize()- o1.getDescriptionTree().getSize();
113                        
114                        if(sizeDiff == 0) {
115                                return cmp.compare(o1.getDescriptionTree(), o2.getDescriptionTree());
116                        } else if(sizeDiff>0) {
117                                return 1;
118                        } else {
119                                return -1;
120                        }
121                        
122                }               
123        }
124
125        /* (non-Javadoc)
126         * @see org.dllearner.core.Component#init()
127         */
128        @Override
129        public void init() throws ComponentInitException {
130        }
131
132}