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}