001/**
002 * 
003 */
004package org.dllearner.algorithms.isle.metrics;
005
006import java.util.Collections;
007import java.util.HashMap;
008import java.util.Map;
009import java.util.Set;
010import java.util.TreeSet;
011import java.util.concurrent.ExecutorService;
012import java.util.concurrent.Executors;
013import java.util.concurrent.TimeUnit;
014
015import org.apache.log4j.Logger;
016import org.semanticweb.owlapi.model.OWLEntity;
017import org.semanticweb.owlapi.model.OWLOntology;
018
019/**
020 * @author Lorenz Buehmann
021 *
022 */
023public class RelevanceUtils {
024        
025        private static final Logger logger = Logger.getLogger(RelevanceUtils.class);
026        static int maxNrOfThreads = Math.max(1, Runtime.getRuntime().availableProcessors() - 1);
027        static boolean normalize = true;
028        
029        /**
030         * Returns a map containing the relevance score based on the given metric between the entity and each other entity.
031         * @param entity
032         * @param otherEntities
033         * @param metric
034         * @return
035         */
036        public static synchronized Map<OWLEntity, Double> getRelevantEntities(final OWLEntity entity, Set<OWLEntity> otherEntities, final RelevanceMetric metric){
037                logger.info("Get relevant entities for " + entity);
038                final Map<OWLEntity, Double> relevantEntities = Collections.synchronizedMap(new HashMap<>());
039                
040                ExecutorService executor = Executors.newFixedThreadPool(maxNrOfThreads);
041                
042                for (final OWLEntity otherEntity : otherEntities) {
043                        executor.submit(new Runnable() {
044                                @Override
045                                public void run() {
046                                        try {
047//                                              double relevance = metric.getNormalizedRelevance(entity, otherEntity);
048                                                double relevance = metric.getRelevance(entity, otherEntity);
049//                                              logger.info(otherEntity + ":" + relevance);
050                                                relevantEntities.put(otherEntity, relevance);
051                                        } catch (Exception e) {
052                                                e.printStackTrace();
053                                        }
054                                }
055                        });
056                }
057                executor.shutdown();
058        try {
059                        executor.awaitTermination(1, TimeUnit.DAYS);
060                } catch (InterruptedException e) {
061                        e.printStackTrace();
062                }
063                //normalize the values
064        if(normalize){
065                return AbstractRelevanceMetric.normalizeMinMax(relevantEntities);
066        }
067                return relevantEntities;
068        }
069        
070        public static Map<OWLEntity, Double> getRelevantEntities(OWLEntity entity, OWLOntology ontology, RelevanceMetric metric){
071                Set<OWLEntity> owlEntities = new TreeSet<>();
072                owlEntities.addAll(ontology.getClassesInSignature());
073                owlEntities.addAll(ontology.getDataPropertiesInSignature());
074                owlEntities.addAll(ontology.getObjectPropertiesInSignature());
075                
076//              Set<OWLEntity> otherEntities = OWLAPIConverter.getEntities(new HashSet<OWLEntity>(new ArrayList<OWLEntity>(owlEntities).subList(0, 20)));
077                owlEntities.remove(entity);
078                
079                return getRelevantEntities(entity, owlEntities, metric);
080        }
081
082}