001/**
002 * 
003 */
004package org.dllearner.algorithms.isle.metrics;
005
006import org.dllearner.algorithms.isle.index.Index;
007import org.semanticweb.owlapi.model.OWLEntity;
008
009/**
010 * @author Lorenz Buehmann
011 *
012 */
013public class SignificantPMIRelevanceMetric extends AbstractRelevanceMetric {
014
015        protected final double delta;
016        
017        /**
018         * 
019         * @param index:  semantic index
020         * @param delta: parameter varying from 0 to 1 
021         */
022        public SignificantPMIRelevanceMetric(Index index, double delta) {
023                super(index);
024                if (delta<0 ||delta>1)
025                        throw new IllegalArgumentException("Delta parameter should be in [0,1]");
026                this.delta = delta;
027        }
028
029        @Override
030        public synchronized double getRelevance(OWLEntity entityA, OWLEntity entityB){
031                double fA = index.getNumberOfDocumentsFor(entityA);
032                double fB = index.getNumberOfDocumentsFor(entityB);
033                double fAB = index.getNumberOfDocumentsFor(entityA, entityB);
034                
035                double N = index.getTotalNumberOfDocuments();
036                
037                if(fA == 0 || fB == 0 || fAB == 0){
038                        return 0;
039                }
040                
041                double pmi = Math.log(fAB / (fA*fB/N + Math.sqrt(fA)*Math.sqrt(Math.log(delta)/-2)));
042                
043                return pmi;
044        }
045        
046        @Override
047        public synchronized double getNormalizedRelevance(OWLEntity entityA, OWLEntity entityB){
048                //TODO
049                return Double.NaN;
050        }
051
052}