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}