001/**
002 * 
003 */
004package org.dllearner.algorithms.isle.metrics;
005
006import java.util.HashMap;
007import java.util.Map;
008import java.util.Set;
009
010import org.dllearner.algorithms.isle.index.Index;
011import org.semanticweb.owlapi.model.OWLClassExpression;
012import org.semanticweb.owlapi.model.OWLEntity;
013
014/**
015 * @author Lorenz Buehmann
016 * 
017 */
018public abstract class AbstractRelevanceMetric implements RelevanceMetric {
019
020        protected Index index;
021        protected String name;
022
023        public AbstractRelevanceMetric(Index index) {
024                this.index = index;
025
026                name = getClass().getSimpleName().replace("RelevanceMetric", "");
027        }
028
029        public static Map<OWLEntity, Double> normalizeMinMax(Map<OWLEntity, Double> hmEntity2Score) {
030                Map<OWLEntity, Double> hmEntity2Norm = new HashMap<>();
031
032                double min = Double.MAX_VALUE;
033                double max = Double.MIN_VALUE;
034
035                OWLEntity minE=null;
036                OWLEntity maxE=null;
037                for (OWLEntity e : hmEntity2Score.keySet()) {
038                        double value = hmEntity2Score.get(e);
039                        if (value < min) {
040                                min = value;minE = e;
041                        } else if (value > max) {
042                                max = value;maxE = e;
043                        }
044                }
045//              System.err.println("Max: " + max + "-" + maxE);
046//              System.err.println("Min: " + min + "-" + minE);
047                // System.out.println( "min="+ dMin +" max="+ dMax );
048                for (OWLEntity e : hmEntity2Score.keySet()) {
049                        double value = hmEntity2Score.get(e);
050                        double normalized = 0;
051                        if (min == max) {
052                                normalized = value;
053                                normalized = 0.5;
054                        } else {
055                                normalized = (value - min) / (max - min);
056                        }
057                        hmEntity2Norm.put(e, normalized);
058                }
059                return hmEntity2Norm;
060        }
061        
062        public String getName() {
063                return name;
064        }
065
066        @Override
067        public double getRelevance(OWLEntity entity, OWLClassExpression desc){
068                Set<OWLEntity> entities = desc.getSignature();
069                double score = 0;
070                for (OWLEntity otherEntity : entities) {
071                        double relevance = getRelevance(entity, otherEntity);
072                        if(!Double.isInfinite(relevance)){
073                                score += relevance/entities.size();
074                        }
075                }
076                return score;
077        }
078        
079        @Override
080        public int hashCode() {
081                final int prime = 31;
082                int result = 1;
083                result = prime * result + ((name == null) ? 0 : name.hashCode());
084                return result;
085        }
086
087        @Override
088        public boolean equals(Object obj) {
089                if (this == obj)
090                        return true;
091                if (obj == null)
092                        return false;
093                if (getClass() != obj.getClass())
094                        return false;
095                AbstractRelevanceMetric other = (AbstractRelevanceMetric) obj;
096                if (name == null) {
097                        if (other.name != null)
098                                return false;
099                } else if (!name.equals(other.name))
100                        return false;
101                return true;
102        }
103        
104
105}