From: <lor...@us...> - 2009-09-02 10:19:52
|
Revision: 1834 http://dl-learner.svn.sourceforge.net/dl-learner/?rev=1834&view=rev Author: lorenz_b Date: 2009-09-02 10:19:41 +0000 (Wed, 02 Sep 2009) Log Message: ----------- added explanation intended view added update method to pellet reasoner, updating the CWA data Modified Paths: -------------- trunk/src/dl-learner/org/dllearner/reasoning/PelletReasoner.java trunk/src/dl-learner/org/dllearner/tools/ore/ExplanationManager.java trunk/src/dl-learner/org/dllearner/tools/ore/OREApplication.java trunk/src/dl-learner/org/dllearner/tools/ore/OntologyModifier.java trunk/src/dl-learner/org/dllearner/tools/ore/explanation/AxiomRanker.java trunk/src/dl-learner/org/dllearner/tools/ore/explanation/CachedExplanationGenerator.java trunk/src/dl-learner/org/dllearner/tools/ore/explanation/RootFinder.java trunk/src/dl-learner/org/dllearner/tools/ore/explanation/relevance/SyntacticRelevanceBasedExplanationGenerator.java trunk/src/dl-learner/org/dllearner/tools/ore/ui/ExplanationTable.java trunk/src/dl-learner/org/dllearner/tools/ore/ui/ExplanationTableModel.java trunk/src/dl-learner/org/dllearner/tools/ore/ui/GraphicalCoveragePanel.java trunk/src/dl-learner/org/dllearner/tools/ore/ui/IndividualsTableModel.java trunk/src/dl-learner/org/dllearner/tools/ore/ui/ManchesterSyntaxRenderer.java trunk/src/dl-learner/org/dllearner/tools/ore/ui/ManchesterSyntaxTableCellRenderer.java trunk/src/dl-learner/org/dllearner/tools/ore/ui/RepairDialog.java trunk/src/dl-learner/org/dllearner/tools/ore/ui/RepairTableModel.java trunk/src/dl-learner/org/dllearner/tools/ore/ui/ResultTable.java trunk/src/dl-learner/org/dllearner/tools/ore/ui/StatusBar.java trunk/src/dl-learner/org/dllearner/tools/ore/ui/wizard/Wizard.java trunk/src/dl-learner/org/dllearner/tools/ore/ui/wizard/WizardController.java trunk/src/dl-learner/org/dllearner/tools/ore/ui/wizard/descriptors/ClassChoosePanelDescriptor.java trunk/src/dl-learner/org/dllearner/tools/ore/ui/wizard/descriptors/InconsistencyExplanationPanelDescriptor.java trunk/src/dl-learner/org/dllearner/tools/ore/ui/wizard/descriptors/KnowledgeSourcePanelDescriptor.java trunk/src/dl-learner/org/dllearner/tools/ore/ui/wizard/descriptors/RepairPanelDescriptor.java trunk/src/dl-learner/org/dllearner/tools/ore/ui/wizard/descriptors/UnsatisfiableExplanationPanelDescriptor.java trunk/src/dl-learner/org/dllearner/tools/ore/ui/wizard/panels/InconsistencyExplanationPanel.java trunk/src/dl-learner/org/dllearner/tools/ore/ui/wizard/panels/LearningPanel.java trunk/src/dl-learner/org/dllearner/tools/ore/ui/wizard/panels/RepairPanel.java trunk/src/dl-learner/org/dllearner/tools/ore/ui/wizard/panels/UnsatisfiableExplanationPanel.java Added Paths: ----------- trunk/src/dl-learner/org/dllearner/tools/ore/TaskManager.java trunk/src/dl-learner/org/dllearner/tools/ore/explanation/relevance/RelevanceBasedGenerator.java trunk/src/dl-learner/org/dllearner/tools/ore/explanation/relevance/SimpleSelectionFunction.java trunk/src/dl-learner/org/dllearner/tools/ore/ui/ChangesTable.java trunk/src/dl-learner/org/dllearner/tools/ore/ui/ChangesTableModel.java trunk/src/dl-learner/org/dllearner/tools/ore/ui/DescriptionPanel.java trunk/src/dl-learner/org/dllearner/tools/ore/ui/ExplanationTablePanel.java trunk/src/dl-learner/org/dllearner/tools/ore/ui/RepairPlanPanel.java trunk/src/dl-learner/org/dllearner/tools/ore/ui/StatsPanel.java Removed Paths: ------------- trunk/src/dl-learner/org/dllearner/tools/ore/ui/wizard/panels/ChangePanel.java trunk/src/dl-learner/org/dllearner/tools/ore/ui/wizard/panels/ChangesPanel.java trunk/src/dl-learner/org/dllearner/tools/ore/ui/wizard/panels/DescriptionPanel.java trunk/src/dl-learner/org/dllearner/tools/ore/ui/wizard/panels/ExplanationTablePanel.java trunk/src/dl-learner/org/dllearner/tools/ore/ui/wizard/panels/RepairPlanPanel.java trunk/src/dl-learner/org/dllearner/tools/ore/ui/wizard/panels/StatsPanel.java Modified: trunk/src/dl-learner/org/dllearner/reasoning/PelletReasoner.java =================================================================== --- trunk/src/dl-learner/org/dllearner/reasoning/PelletReasoner.java 2009-09-01 13:44:00 UTC (rev 1833) +++ trunk/src/dl-learner/org/dllearner/reasoning/PelletReasoner.java 2009-09-02 10:19:41 UTC (rev 1834) @@ -59,7 +59,6 @@ import org.dllearner.kb.OWLAPIOntology; import org.dllearner.kb.OWLFile; import org.dllearner.kb.sparql.SparqlKnowledgeSource; -import org.dllearner.tools.ore.explanation.PelletExplanationGenerator; import org.dllearner.utilities.Helper; import org.dllearner.utilities.owl.ConceptComparator; import org.dllearner.utilities.owl.ConceptTransformation; @@ -72,10 +71,12 @@ import org.mindswap.pellet.utils.SetUtils; import org.mindswap.pellet.utils.progress.ProgressMonitor; import org.semanticweb.owl.apibinding.OWLManager; +import org.semanticweb.owl.inference.OWLReasonerException; import org.semanticweb.owl.model.AddAxiom; import org.semanticweb.owl.model.OWLAnnotation; import org.semanticweb.owl.model.OWLAxiom; import org.semanticweb.owl.model.OWLClass; +import org.semanticweb.owl.model.OWLClassAssertionAxiom; import org.semanticweb.owl.model.OWLConstant; import org.semanticweb.owl.model.OWLDataFactory; import org.semanticweb.owl.model.OWLDataProperty; @@ -87,7 +88,9 @@ import org.semanticweb.owl.model.OWLLabelAnnotation; import org.semanticweb.owl.model.OWLNamedObject; import org.semanticweb.owl.model.OWLObjectProperty; +import org.semanticweb.owl.model.OWLObjectPropertyAssertionAxiom; import org.semanticweb.owl.model.OWLOntology; +import org.semanticweb.owl.model.OWLOntologyChange; import org.semanticweb.owl.model.OWLOntologyChangeException; import org.semanticweb.owl.model.OWLOntologyCreationException; import org.semanticweb.owl.model.OWLOntologyFormat; @@ -286,6 +289,46 @@ dematerialise(); } + /* + * Updates the CWA ontology dematerialised before + */ + public void updateCWAOntology(List<OWLOntologyChange> changes){ + for(OWLOntologyChange change : changes){ + OWLAxiom axiom = change.getAxiom(); + if(axiom instanceof OWLClassAssertionAxiom){ + Individual ind = OWLAPIConverter.convertIndividual(((OWLClassAssertionAxiom)axiom).getIndividual()); + Description desc = OWLAPIConverter.convertClass(((OWLClassAssertionAxiom)axiom).getDescription().asOWLClass()); + if(change instanceof RemoveAxiom){ + classInstancesPos.get(desc).remove(ind); + } else if(change instanceof AddAxiom){ + classInstancesPos.get(desc).add(ind); + } + } else if(axiom instanceof OWLObjectPropertyAssertionAxiom){System.out.println(axiom); + Individual obj = OWLAPIConverter.convertIndividual(((OWLObjectPropertyAssertionAxiom)axiom).getObject()); + Individual sub = OWLAPIConverter.convertIndividual(((OWLObjectPropertyAssertionAxiom)axiom).getSubject()); + ObjectProperty prop = OWLAPIConverter.convertObjectProperty(((OWLObjectPropertyAssertionAxiom)axiom).getProperty().asOWLObjectProperty()); + if(change instanceof RemoveAxiom){ + SortedSet<Individual> fillers = opPos.get(prop).get(sub); + if(fillers != null){ + fillers.remove(obj); + } + } else if(change instanceof AddAxiom){ + SortedSet<Individual> fillers = opPos.get(prop).get(sub); + if(fillers == null){ + fillers = new TreeSet<Individual>(); + fillers.add(obj); + opPos.get(prop).put(sub, fillers); + } else { + fillers.add(obj); + } + } + + + } + } + + } + private void dematerialise(){ long dematStartTime = System.currentTimeMillis(); @@ -409,6 +452,15 @@ reasoner.classify(); } + public void realise(){ + try { + reasoner.realise(); + } catch (OWLReasonerException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + public void refresh(){ reasoner.refresh(); } Modified: trunk/src/dl-learner/org/dllearner/tools/ore/ExplanationManager.java =================================================================== --- trunk/src/dl-learner/org/dllearner/tools/ore/ExplanationManager.java 2009-09-01 13:44:00 UTC (rev 1833) +++ trunk/src/dl-learner/org/dllearner/tools/ore/ExplanationManager.java 2009-09-02 10:19:41 UTC (rev 1834) @@ -1,14 +1,14 @@ package org.dllearner.tools.ore; import java.util.ArrayList; -import java.util.HashSet; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Set; import org.dllearner.tools.ore.explanation.CachedExplanationGenerator; import org.dllearner.tools.ore.explanation.Explanation; import org.dllearner.tools.ore.explanation.RootFinder; -import org.mindswap.pellet.owlapi.PelletReasonerFactory; import org.mindswap.pellet.owlapi.Reasoner; import org.semanticweb.owl.model.OWLAxiom; import org.semanticweb.owl.model.OWLClass; @@ -36,11 +36,14 @@ private RootFinder rootFinder; private boolean ontologyChanged = true; - private boolean isLaconicMode = false; + private boolean isComputeAllExplanations = false; private int maxExplantionCount = 1; private boolean allExplanationWarningChecked = false; + private Map<Explanation, List<Map<OWLAxiom, Integer>>> orderingMap; + private DefaultExplanationOrderer explanationOrderer; + private List<ExplanationManagerListener> listeners; @@ -55,10 +58,11 @@ this.ontology = reasoner.getLoadedOntologies().iterator().next(); manager.addOntologyChangeListener(this); -// manager.addOntologyChangeListener(reasoner); dataFactory = manager.getOWLDataFactory(); RepairManager.getRepairManager(oreMan).addListener(this); - + + explanationOrderer = new DefaultExplanationOrderer(); + orderingMap = new HashMap<Explanation, List<Map<OWLAxiom, Integer>>>(); rootFinder = new RootFinder(); @@ -95,7 +99,7 @@ return rootFinder.getRootClasses(); } - public Set<List<OWLAxiom>> getUnsatisfiableExplanations(OWLClass unsat) { + public Set<Explanation> getUnsatisfiableExplanations(OWLClass unsat) { OWLSubClassAxiom entailment = dataFactory.getOWLSubClassAxiom(unsat, dataFactory.getOWLNothing()); @@ -107,10 +111,10 @@ explanations = gen.getExplanations(entailment, maxExplantionCount); } - return getOrderedExplanations(explanations); + return explanations; } - public Set<List<OWLAxiom>> getInconsistencyExplanations(){ + public Set<Explanation> getInconsistencyExplanations(){ OWLSubClassAxiom entailment = dataFactory.getOWLSubClassAxiom(dataFactory.getOWLThing(), dataFactory.getOWLNothing()); @@ -121,43 +125,44 @@ explanations = gen.getExplanations(entailment, maxExplantionCount); } - return getOrderedExplanations(explanations); + return explanations; } + public List<Map<OWLAxiom, Integer>> getOrdering(Explanation exp){ + List<Map<OWLAxiom, Integer>> orderedAxioms = orderingMap.get(exp); + if(orderedAxioms == null){ + orderedAxioms = new ArrayList<Map<OWLAxiom, Integer>>(exp.getAxioms().size()); + orderedAxioms.addAll(orderExplanation(exp)); + orderingMap.put(exp, orderedAxioms); + } + return orderedAxioms; + } - - private ArrayList<OWLAxiom> getTree2List(Tree<OWLAxiom> tree){ - ArrayList<OWLAxiom> ordering = new ArrayList<OWLAxiom>(); - ordering.add((OWLAxiom)tree.getUserObject()); + private List<Map<OWLAxiom, Integer>> orderExplanation(Explanation exp){ + explanationOrderer = new DefaultExplanationOrderer(); + List<Map<OWLAxiom, Integer>> ordering = new ArrayList<Map<OWLAxiom, Integer>>(exp.getAxioms().size()); + ExplanationTree tree = explanationOrderer.getOrderedExplanation(exp.getEntailment(), exp.getAxioms()); for(Tree<OWLAxiom> child : tree.getChildren()){ ordering.addAll(getTree2List(child)); } return ordering; } - private Set<List<OWLAxiom>> getOrderedExplanations(Set<Explanation> explanations){ - DefaultExplanationOrderer orderer = new DefaultExplanationOrderer(); - Set<List<OWLAxiom>> orderedExplanations = new HashSet<List<OWLAxiom>>(); - ArrayList<OWLAxiom> ordering; - for(Explanation explanation : explanations){ - ordering = new ArrayList<OWLAxiom>(); - ExplanationTree tree = orderer.getOrderedExplanation(explanation.getEntailment(), explanation.getAxioms()); - -// ordering.add(tree.getUserObject()); - for(Tree<OWLAxiom> child : tree.getChildren()){ - ordering.addAll(getTree2List(child)); - } - orderedExplanations.add(ordering); + + + private ArrayList<Map<OWLAxiom, Integer>> getTree2List(Tree<OWLAxiom> tree){ + ArrayList<Map<OWLAxiom, Integer>> ordering = new ArrayList<Map<OWLAxiom, Integer>>(); + Map<OWLAxiom, Integer> axiom2Depth = new HashMap<OWLAxiom, Integer>(); + axiom2Depth.put((OWLAxiom)tree.getUserObject(), Integer.valueOf(tree.getUserObjectPathToRoot().size())); + ordering.add(axiom2Depth); + for(Tree<OWLAxiom> child : tree.getChildren()){ + ordering.addAll(getTree2List(child)); } - return orderedExplanations; + return ordering; } - @Override - public void ontologiesChanged(List<? extends OWLOntologyChange> changes) - throws OWLException { - ontologyChanged = true; - } + public int getArity(OWLClass cl, OWLAxiom ax) { int arity = 0; @@ -249,6 +254,12 @@ public Set<OWLAxiom> getRemainingAxioms(OWLAxiom source, OWLAxiom part){ return gen.getRemainingAxioms(source, part); } + + @Override + public void ontologiesChanged(List<? extends OWLOntologyChange> changes) + throws OWLException { + ontologyChanged = true; + } @Override public void activeOntologyChanged() { @@ -257,5 +268,4 @@ gen = new CachedExplanationGenerator(ontology, reasoner); } - } Modified: trunk/src/dl-learner/org/dllearner/tools/ore/OREApplication.java =================================================================== --- trunk/src/dl-learner/org/dllearner/tools/ore/OREApplication.java 2009-09-01 13:44:00 UTC (rev 1833) +++ trunk/src/dl-learner/org/dllearner/tools/ore/OREApplication.java 2009-09-02 10:19:41 UTC (rev 1834) @@ -31,11 +31,13 @@ import org.dllearner.tools.ore.ui.wizard.Wizard; import org.dllearner.tools.ore.ui.wizard.WizardPanelDescriptor; import org.dllearner.tools.ore.ui.wizard.descriptors.ClassChoosePanelDescriptor; +import org.dllearner.tools.ore.ui.wizard.descriptors.InconsistencyExplanationPanelDescriptor; import org.dllearner.tools.ore.ui.wizard.descriptors.IntroductionPanelDescriptor; import org.dllearner.tools.ore.ui.wizard.descriptors.KnowledgeSourcePanelDescriptor; import org.dllearner.tools.ore.ui.wizard.descriptors.LearningPanelDescriptor; import org.dllearner.tools.ore.ui.wizard.descriptors.RepairPanelDescriptor; import org.dllearner.tools.ore.ui.wizard.descriptors.SavePanelDescriptor; +import org.dllearner.tools.ore.ui.wizard.descriptors.UnsatisfiableExplanationPanelDescriptor; /** @@ -77,18 +79,24 @@ WizardPanelDescriptor descriptor2 = new KnowledgeSourcePanelDescriptor(); wizard.registerWizardPanel(KnowledgeSourcePanelDescriptor.IDENTIFIER, descriptor2); + +// WizardPanelDescriptor descriptor3 = new InconsistencyExplanationPanelDescriptor(); +// wizard.registerWizardPanel(InconsistencyExplanationPanelDescriptor.IDENTIFIER, descriptor3); +// +// WizardPanelDescriptor descriptor4 = new UnsatisfiableExplanationPanelDescriptor(); +// wizard.registerWizardPanel(UnsatisfiableExplanationPanelDescriptor.IDENTIFIER, descriptor4); - WizardPanelDescriptor descriptor3 = new ClassChoosePanelDescriptor(); - wizard.registerWizardPanel(ClassChoosePanelDescriptor.IDENTIFIER, descriptor3); + WizardPanelDescriptor descriptor5 = new ClassChoosePanelDescriptor(); + wizard.registerWizardPanel(ClassChoosePanelDescriptor.IDENTIFIER, descriptor5); - WizardPanelDescriptor descriptor4 = new LearningPanelDescriptor(); - wizard.registerWizardPanel(LearningPanelDescriptor.IDENTIFIER, descriptor4); + WizardPanelDescriptor descriptor6 = new LearningPanelDescriptor(); + wizard.registerWizardPanel(LearningPanelDescriptor.IDENTIFIER, descriptor6); - WizardPanelDescriptor descriptor5 = new RepairPanelDescriptor(); - wizard.registerWizardPanel(RepairPanelDescriptor.IDENTIFIER, descriptor5); + WizardPanelDescriptor descriptor7 = new RepairPanelDescriptor(); + wizard.registerWizardPanel(RepairPanelDescriptor.IDENTIFIER, descriptor7); - WizardPanelDescriptor descriptor6 = new SavePanelDescriptor(); - wizard.registerWizardPanel(SavePanelDescriptor.IDENTIFIER, descriptor6); + WizardPanelDescriptor descriptor8 = new SavePanelDescriptor(); + wizard.registerWizardPanel(SavePanelDescriptor.IDENTIFIER, descriptor8); if (!(args.length == 1)){ wizard.setCurrentPanel(IntroductionPanelDescriptor.IDENTIFIER); Modified: trunk/src/dl-learner/org/dllearner/tools/ore/OntologyModifier.java =================================================================== --- trunk/src/dl-learner/org/dllearner/tools/ore/OntologyModifier.java 2009-09-01 13:44:00 UTC (rev 1833) +++ trunk/src/dl-learner/org/dllearner/tools/ore/OntologyModifier.java 2009-09-02 10:19:41 UTC (rev 1834) @@ -21,6 +21,7 @@ package org.dllearner.tools.ore; import java.net.URI; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashSet; @@ -35,15 +36,8 @@ import org.dllearner.core.owl.ObjectProperty; import org.dllearner.core.owl.ObjectPropertyAssertion; import org.dllearner.core.owl.ObjectQuantorRestriction; -import org.dllearner.reasoning.OWLAPIReasoner; import org.dllearner.reasoning.PelletReasoner; import org.dllearner.utilities.owl.OWLAPIDescriptionConvertVisitor; -import org.mindswap.pellet.owlapi.Reasoner; -import org.semanticweb.owl.apibinding.OWLManager; -import org.semanticweb.owl.debugging.BlackBoxOWLDebugger; -import org.semanticweb.owl.debugging.OWLDebugger; -import org.semanticweb.owl.inference.OWLReasonerException; -import org.semanticweb.owl.inference.OWLSatisfiabilityChecker; import org.semanticweb.owl.io.RDFXMLOntologyFormat; import org.semanticweb.owl.model.AddAxiom; import org.semanticweb.owl.model.OWLAxiom; @@ -52,7 +46,6 @@ import org.semanticweb.owl.model.OWLDataFactory; import org.semanticweb.owl.model.OWLDescription; import org.semanticweb.owl.model.OWLEquivalentClassesAxiom; -import org.semanticweb.owl.model.OWLException; import org.semanticweb.owl.model.OWLIndividual; import org.semanticweb.owl.model.OWLInverseObjectPropertiesAxiom; import org.semanticweb.owl.model.OWLObjectProperty; @@ -226,6 +219,7 @@ RemoveAxiom rm = new RemoveAxiom(ontology, owlCl); changes.add(rm); try { + reasoner.updateCWAOntology(changes); manager.applyChange(rm); return changes; } catch (OWLOntologyChangeException e) { @@ -254,10 +248,9 @@ OWLClassAssertionAxiom owlCl = factory.getOWLClassAssertionAxiom(individualOWLAPI, owlDesc); AddAxiom am = new AddAxiom(ontology, owlCl); - - changes.add(am); try { + reasoner.updateCWAOntology(changes); manager.applyChange(am); return changes; } catch (OWLOntologyChangeException e) { @@ -299,9 +292,8 @@ try { + reasoner.updateCWAOntology(changes); manager.applyChanges(changes); - saveOntology(); - return changes; } catch (OWLOntologyChangeException e) { // TODO Auto-generated catch block @@ -358,7 +350,8 @@ changes.addAll(removeList); try { - manager.applyChanges(removeList); + reasoner.updateCWAOntology(changes); + manager.applyChanges(changes); return changes; } catch (OWLOntologyChangeException e) { // TODO Auto-generated catch block @@ -400,6 +393,7 @@ try { if(remove != null){ + reasoner.updateCWAOntology(changes); manager.applyChange(remove); } @@ -432,6 +426,7 @@ AddAxiom axiom = new AddAxiom(ontology, objAssertion); changes.add(axiom); try { + reasoner.updateCWAOntology(changes); manager.applyChange(axiom); return changes; } catch (OWLOntologyChangeException e) { @@ -450,25 +445,25 @@ */ public void undoChanges(Collection<OWLOntologyChange> changes){ - + List<OWLOntologyChange> undoChanges = new ArrayList<OWLOntologyChange>(changes.size()); for(OWLOntologyChange change : changes){ if(change instanceof RemoveAxiom){ AddAxiom add = new AddAxiom(ontology, change.getAxiom()); - try { - manager.applyChange(add); - } catch (OWLOntologyChangeException e) { - e.printStackTrace(); - } + undoChanges.add(add); } else if(change instanceof AddAxiom){ RemoveAxiom remove = new RemoveAxiom(ontology, change.getAxiom()); - try { - manager.applyChange(remove); - } catch (OWLOntologyChangeException e) { - e.printStackTrace(); - } + undoChanges.add(remove); } } + try { + reasoner.updateCWAOntology(undoChanges); + manager.applyChanges(undoChanges); + } catch (OWLOntologyChangeException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } @@ -575,50 +570,5 @@ public OWLOntology getOntology() { return ontology; } - -/** - * Prints reasons for inconsistent classes. - */ - public void reason(){ -// reasoner.getInconsistencyReasons(ontology); - - - - /* Create a satisfiability checker */ - OWLSatisfiabilityChecker checker = new Reasoner(manager); - try { - checker.loadOntologies(Collections.singleton(ontology)); - } catch (OWLReasonerException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - OWLDebugger debugger = new BlackBoxOWLDebugger(manager, ontology, checker); - - for(OWLClass owlClass : reasoner.getInconsistentOWLClasses()){ - /* Find the sets of support and print them */ - Set<Set<OWLAxiom>> allsos = null; - try { - allsos = debugger.getAllSOSForIncosistentClass(owlClass); - } catch (OWLException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - for (Set<OWLAxiom> sos : allsos){ - System.out.println(sos); - } - } - - - - } - - - - - - - - } Added: trunk/src/dl-learner/org/dllearner/tools/ore/TaskManager.java =================================================================== --- trunk/src/dl-learner/org/dllearner/tools/ore/TaskManager.java (rev 0) +++ trunk/src/dl-learner/org/dllearner/tools/ore/TaskManager.java 2009-09-02 10:19:41 UTC (rev 1834) @@ -0,0 +1,53 @@ +package org.dllearner.tools.ore; + +import javax.swing.JDialog; +import javax.swing.SwingWorker; + +import org.dllearner.tools.ore.ui.StatusBar; + +public class TaskManager { + + private static TaskManager instance; + + private SwingWorker<?, ?> currentTask; + + private Thread currentThread; + + private StatusBar statusBar; + + private JDialog dialog; + + public static synchronized TaskManager getInstance(){ + if(instance == null){ + instance = new TaskManager(); + } + return instance; + } + + public void setStatusBar(StatusBar statusBar){ + this.statusBar = statusBar; + } + + public void setDialog(JDialog dialog){ + this.dialog = dialog; + } + + public void setCurrentTask(SwingWorker<?, ?> task){ + this.currentTask = task; + } + + public void setCurrentThread(Thread t){ + this.currentThread = t; + } + + public void cancelCurrentTask(){ + if(currentTask != null && !currentTask.isCancelled() && !currentTask.isDone()){ + currentTask.cancel(true); + } +// statusBar.setProgressTitle("Canceled"); +// dialog.setCursor(null); + } + + public synchronized void cancelCurrentThread(){currentThread.stop(); + } +} Modified: trunk/src/dl-learner/org/dllearner/tools/ore/explanation/AxiomRanker.java =================================================================== --- trunk/src/dl-learner/org/dllearner/tools/ore/explanation/AxiomRanker.java 2009-09-01 13:44:00 UTC (rev 1833) +++ trunk/src/dl-learner/org/dllearner/tools/ore/explanation/AxiomRanker.java 2009-09-02 10:19:41 UTC (rev 1834) @@ -51,6 +51,7 @@ this.factory = manager.getOWLDataFactory(); ModuleExtractor extractor = ModuleExtractorFactory.createModuleExtractor(); classifier = new IncrementalClassifier(manager, reasoner, extractor); + } public Set<OWLAxiom> computeImpactOnRemoval(OWLAxiom ax){ @@ -58,8 +59,8 @@ try { // IncrementalClassifier classifier = new IncrementalClassifier(manager); -// classifier.loadOntology(ontology); -// classifier.classify(); + classifier.loadOntology(ontology); + classifier.classify(); Set<OWLClass> inc = classifier.getInconsistentClasses(); for(OWLDescription cl : ontology.getClassesInSignature()){ if(!inc.contains(cl)){ @@ -79,8 +80,9 @@ manager.applyChange(new RemoveAxiom(ontology, ax)); + classifier.classify(); - inc = classifier.getInconsistentClasses(); + inc = classifier.getInconsistentClasses();System.out.println(inc); for(OWLDescription cl : ontology.getClassesInSignature()){ if(!inc.contains(cl)){ Modified: trunk/src/dl-learner/org/dllearner/tools/ore/explanation/CachedExplanationGenerator.java =================================================================== --- trunk/src/dl-learner/org/dllearner/tools/ore/explanation/CachedExplanationGenerator.java 2009-09-01 13:44:00 UTC (rev 1833) +++ trunk/src/dl-learner/org/dllearner/tools/ore/explanation/CachedExplanationGenerator.java 2009-09-02 10:19:41 UTC (rev 1834) @@ -149,29 +149,35 @@ @Override public void repairPlanExecuted(List<OWLOntologyChange> changes) { - Map<OWLAxiom, Set<Explanation>> copy = new HashMap<OWLAxiom, Set<Explanation>>(); - for(OWLOntologyChange change : changes){ - if(change instanceof RemoveAxiom){ - for(Entry<OWLAxiom, Set<Explanation>> entry: regularExplanationCache.entrySet()){ - Set<Explanation> explanationsCopy = new HashSet<Explanation>(); - for(Explanation explanation : entry.getValue()){ - if(explanation.getAxioms().contains(change.getAxiom())){ - explanationsCopy.add(explanation); - } - } - if(!explanationsCopy.isEmpty()){ - copy.put(entry.getKey(), explanationsCopy); - } - - - } - } - } - for(Entry<OWLAxiom, Set<Explanation>> copyEntry : copy.entrySet()){ - regularExplanationCache.get(copyEntry.getKey()).removeAll(copyEntry.getValue()); - - } +// Map<OWLAxiom, Set<Explanation>> copy = new HashMap<OWLAxiom, Set<Explanation>>(); +// for(OWLOntologyChange change : changes){ +// if(change instanceof RemoveAxiom){ +// for(Entry<OWLAxiom, Set<Explanation>> entry: regularExplanationCache.entrySet()){ +// Set<Explanation> explanationsCopy = new HashSet<Explanation>(); +// for(Explanation explanation : entry.getValue()){ +// if(explanation.getAxioms().contains(change.getAxiom())){ +// explanationsCopy.add(explanation); +// } +// } +// if(!explanationsCopy.isEmpty()){ +// copy.put(entry.getKey(), explanationsCopy); +// } +// +// +// } +// } +// } +// for(Entry<OWLAxiom, Set<Explanation>> copyEntry : copy.entrySet()){ +// regularExplanationCache.get(copyEntry.getKey()).removeAll(copyEntry.getValue()); +// +// } + regularExplanationCache.clear(); + laconicExplanationCache.clear(); + axiom2Module.clear(); + lastRequestedRegularSize.clear(); + lastRequestedLaconicSize.clear(); + } public Set<OWLAxiom> getSourceAxioms(OWLAxiom ax){ Modified: trunk/src/dl-learner/org/dllearner/tools/ore/explanation/RootFinder.java =================================================================== --- trunk/src/dl-learner/org/dllearner/tools/ore/explanation/RootFinder.java 2009-09-01 13:44:00 UTC (rev 1833) +++ trunk/src/dl-learner/org/dllearner/tools/ore/explanation/RootFinder.java 2009-09-02 10:19:41 UTC (rev 1834) @@ -16,6 +16,7 @@ import org.semanticweb.owl.inference.OWLReasoner; import org.semanticweb.owl.inference.OWLReasonerException; import org.semanticweb.owl.inference.OWLReasonerFactory; +import org.semanticweb.owl.model.AddAxiom; import org.semanticweb.owl.model.AxiomType; import org.semanticweb.owl.model.OWLClass; import org.semanticweb.owl.model.OWLDataAllRestriction; @@ -122,6 +123,11 @@ public void computeRootDerivedClasses(){ rootClasses.clear(); derivedClasses.clear(); + depend2Classes.clear(); + depth2ExistsRestrictionPropertyMap.clear(); + depth2UniversalRestrictionPropertyMap.clear(); + child2Parents.clear(); + parent2Children.clear(); computePossibleRoots(); pruneRoots(); derivedClasses.removeAll(rootClasses); @@ -181,8 +187,10 @@ } } for (OWLClass cls : roots) { - manager.addAxiom(ontology, manager.getOWLDataFactory() + OWLOntologyChange add = new AddAxiom(ontology, manager.getOWLDataFactory() .getOWLDeclarationAxiom(cls)); + manager.applyChange(add); + appliedChanges.add(add); } OWLReasoner checker = reasonerFactory.createReasoner(manager); checker.loadOntologies(Collections.singleton(ontology)); @@ -191,6 +199,13 @@ rootClasses.remove(root); } } + for(OWLOntologyChange change: appliedChanges){ + if(change instanceof RemoveAxiom){ + manager.applyChange(new AddAxiom(ontology, change.getAxiom())); + } else if(change instanceof AddAxiom){ + manager.applyChange(new RemoveAxiom(ontology, change.getAxiom())); + } + } } catch (OWLOntologyChangeException e) { e.printStackTrace(); } catch (OWLReasonerException e) { Added: trunk/src/dl-learner/org/dllearner/tools/ore/explanation/relevance/RelevanceBasedGenerator.java =================================================================== --- trunk/src/dl-learner/org/dllearner/tools/ore/explanation/relevance/RelevanceBasedGenerator.java (rev 0) +++ trunk/src/dl-learner/org/dllearner/tools/ore/explanation/relevance/RelevanceBasedGenerator.java 2009-09-02 10:19:41 UTC (rev 1834) @@ -0,0 +1,400 @@ +package org.dllearner.tools.ore.explanation.relevance; + +import java.net.URI; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.mindswap.pellet.owlapi.PelletReasonerFactory; +import org.mindswap.pellet.owlapi.Reasoner; +import org.mindswap.pellet.utils.SetUtils; +import org.mindswap.pellet.utils.Timer; +import org.semanticweb.owl.apibinding.OWLManager; +import org.semanticweb.owl.inference.OWLReasonerException; +import org.semanticweb.owl.model.OWLAxiom; +import org.semanticweb.owl.model.OWLClass; +import org.semanticweb.owl.model.OWLDataFactory; +import org.semanticweb.owl.model.OWLOntology; +import org.semanticweb.owl.model.OWLOntologyChangeException; +import org.semanticweb.owl.model.OWLOntologyCreationException; +import org.semanticweb.owl.model.OWLOntologyManager; + +import com.clarkparsia.explanation.GlassBoxExplanation; +import com.clarkparsia.explanation.PelletExplanation; +import com.clarkparsia.explanation.TransactionAwareSingleExpGen; +import com.clarkparsia.explanation.util.OntologyUtils; + +public class RelevanceBasedGenerator { + static{ + setup(); + } + + public static void setup() { + GlassBoxExplanation.setup(); + } + + public static final Logger log = Logger.getLogger(RelevanceBasedGenerator.class); + + + private Reasoner globalReasoner; + private OWLOntology ontology; + private OWLOntologyManager manager; + private Reasoner localReasoner; + + private TransactionAwareSingleExpGen singleExpGen; + private PelletReasonerFactory reasonerFactory; + + private Set<Set<OWLAxiom>> allJusts; + private Set<HittingSet> hittingSets; + + private SimpleSelectionFunction selector; + + private PelletExplanation pellet; + + + Map<OWLAxiom, Integer> axiomMap; + + public RelevanceBasedGenerator(OWLOntologyManager manager, + OWLOntology ontology, Reasoner reasoner) { + log.setLevel(Level.DEBUG); + + this.globalReasoner = reasoner; + this.manager = manager; + this.ontology = ontology;//getExampleOntology(); + + reasonerFactory = new PelletReasonerFactory(); + + allJusts = new HashSet<Set<OWLAxiom>>(); + hittingSets = new HashSet<HittingSet>(); + + selector = new SimpleSelectionFunction(); + selector.init(ontology); + } + + private OWLOntology getExampleOntology(){ + try { + OWLDataFactory factory = manager.getOWLDataFactory(); + OWLClass u = factory.getOWLClass(URI.create("U")); + OWLClass a = factory.getOWLClass(URI.create("A")); + OWLClass b = factory.getOWLClass(URI.create("B")); + OWLClass c = factory.getOWLClass(URI.create("C")); + OWLClass d = factory.getOWLClass(URI.create("D")); + OWLClass e = factory.getOWLClass(URI.create("E")); + OWLClass f = factory.getOWLClass(URI.create("F")); + OWLClass g = factory.getOWLClass(URI.create("G")); + OWLClass h = factory.getOWLClass(URI.create("H")); + OWLClass k = factory.getOWLClass(URI.create("K")); + List<OWLAxiom> examples = new ArrayList<OWLAxiom>(); + examples.add( factory.getOWLSubClassAxiom(u, a)); + examples.add( factory.getOWLSubClassAxiom(u, factory.getOWLObjectComplementOf(a))); + examples.add( factory.getOWLSubClassAxiom(u, c)); + examples.add( factory.getOWLSubClassAxiom(c, factory.getOWLObjectComplementOf(b))); + examples.add( factory.getOWLSubClassAxiom(a, b)); + examples.add( factory.getOWLSubClassAxiom(u, g)); + examples.add( factory.getOWLSubClassAxiom(g, e)); + examples.add( factory.getOWLSubClassAxiom(u, f)); + examples.add( factory.getOWLSubClassAxiom(f, factory.getOWLObjectComplementOf(e))); + examples.add( factory.getOWLSubClassAxiom(u, d)); + examples.add( factory.getOWLSubClassAxiom(d, e)); + examples.add( factory.getOWLSubClassAxiom(c, k)); + examples.add( factory.getOWLSubClassAxiom(k, factory.getOWLObjectComplementOf(h))); + examples.add( factory.getOWLSubClassAxiom(b, h)); + OWLOntology example = manager.createOntology(new HashSet<OWLAxiom>(examples)); + axiomMap = new HashMap<OWLAxiom, Integer >(); + for(int i = 1; i<=examples.size(); i++){ + axiomMap.put(examples.get(i - 1), Integer.valueOf(i)); + } + return example; + } catch (OWLOntologyCreationException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (OWLOntologyChangeException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return null; + } + + private Set<Integer> axioms2Integer(Set<OWLAxiom> axioms){ + Set<Integer> path = new HashSet<Integer>(); + for(OWLAxiom ax: axioms){ + path.add(axiomMap.get(ax)); + } + return path; + } + + public Set<Set<OWLAxiom>> getExplanations(OWLClass unsat){ + computeAllJusts(unsat); + return allJusts; + } + + private void computeAllJusts(OWLClass unsat){ + try { + allJusts.clear(); + hittingSets.clear(); + + Set<HittingSet> hittingSetsLocal = new HashSet<HittingSet>(); + + int step = 1; + + OWLOntologyManager man = OWLManager.createOWLOntologyManager(); + OWLOntology temp = man.createOntology(Collections.<OWLAxiom>emptySet()); + + localReasoner = new PelletReasonerFactory().createReasoner(man); + localReasoner.loadOntology(temp); + + singleExpGen = new GlassBoxExplanation(man); + singleExpGen.setOntology(temp); + singleExpGen.setReasoner(localReasoner); + singleExpGen.setReasonerFactory(reasonerFactory); + setup(); + + Set<OWLAxiom> selectedAxioms = selector.getRelatedAxioms(unsat); + Set<OWLAxiom> allAxioms = new HashSet<OWLAxiom>(); + allAxioms.addAll(selectedAxioms); + + while(!selectedAxioms.isEmpty()){log.debug("Step: " + step); + addAxioms(selectedAxioms); + localReasoner.refresh(); + + if(!hittingSetsLocal.isEmpty()){ + for(HittingSet hit : hittingSetsLocal){ + removeAxioms(hit, ontology, manager);globalReasoner.refresh(); + if(globalReasoner.isSatisfiable(unsat)){ + hittingSets.add(hit); + } + addAxioms(hit, ontology, manager);globalReasoner.refresh(); + } + + hittingSetsLocal.removeAll(hittingSets); + + if(hittingSetsLocal.isEmpty()){ + return; + } + + Set<HittingSet> hittingSetsTemp = new HashSet<HittingSet>(hittingSetsLocal); + for(HittingSet hit : hittingSetsTemp){ + removeAxioms(hit, temp, man); + Set<HittingSet> hittingSetsLocalTemp = expandHittingSetTree(unsat, temp, man, hit); + for(HittingSet hit2 : hittingSetsLocalTemp){ + hit2.addAll(hit); + hittingSetsLocal.add(hit2); + } + addAxioms(hit, temp, man); + } + + + } else if(!singleExpGen.getReasoner().isSatisfiable(unsat)){ + + hittingSetsLocal.addAll(expandHittingSetTree(unsat, temp, man, new HittingSet())); + + } + step++; + selectedAxioms = selector.getRelatedAxioms(selectedAxioms); + selectedAxioms.removeAll(allAxioms); + allAxioms.addAll(selectedAxioms); + + + } + + } catch (OWLOntologyCreationException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (OWLOntologyChangeException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (OWLReasonerException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + + private Set<HittingSet> expandHittingSetTree(OWLClass unsat, OWLOntology ont, OWLOntologyManager man, HittingSet currentPath){ + Set<HittingSet> hittingSets = new HashSet<HittingSet>(); + Set<HittingSet> hittingSets1 = new HashSet<HittingSet>(); + Set<Set<OWLAxiom>> currentJusts = new HashSet<Set<OWLAxiom>>(); +// log.debug("CurrentPath: " + axioms2Integer(currentPath)); + log.debug("CurrentPath: " + currentPath); + Set<OWLAxiom> justification = null; + if(!allJusts.isEmpty()){ + for(Set<OWLAxiom> just : allJusts){ + if(!SetUtils.intersects(just, currentPath)){ + log.debug("using global ontology justification reuse:" + just); +// log.debug("using global ontology justification reuse:" + axioms2Integer(just)); + justification = just; + currentJusts.add(justification); + break; + } + } + } + if(justification == null){ +// pellet = new PelletExplanation(man, Collections.singleton(ont)); + justification = singleExpGen.getExplanation(unsat);//pellet.getUnsatisfiableExplanation(unsat); + if(!justification.isEmpty()){ +// log.debug("Found new justification: " + axioms2Integer(justification)); + log.debug("Found new justification: " + justification); + if(allJusts.isEmpty()){ + singleExpGen.beginTransaction(); + } + allJusts.add(justification); + currentJusts.add(justification); + } + } + + + for(OWLAxiom ax : justification){ + hittingSets1.add(new HittingSet(ax)); + } + + while(true){ + Set<HittingSet> hittingSets2 = new HashSet<HittingSet>(); + for(HittingSet hit : hittingSets1){ + boolean earlyPathTermination = false; + for(HittingSet h : SetUtils.union(hittingSets,this.hittingSets)){ + if(hit.containsAll(h)){ + earlyPathTermination = true; +// log.debug("early path termination:" + axioms2Integer(hit) + " contains all " + axioms2Integer(h)); + log.debug("early path termination:" + hit + " contains all " + h); + break; + } + } + if(!earlyPathTermination){ + removeAxioms(hit);localReasoner.refresh(); + if(localReasoner.isSatisfiable(unsat)){ + hittingSets.add(hit); + } else { + hittingSets2.add(hit); + } + addAxioms(hit);localReasoner.refresh(); + } + } + + if(hittingSets1.isEmpty() || hittingSets2.isEmpty()){ + return hittingSets; + } + + hittingSets1.clear(); + for(HittingSet hit : hittingSets2){ +// log.debug("CurrentPath: " + axioms2Integer(hit)); + log.debug("CurrentPath: " + hit); + + justification = null; + if(!currentJusts.isEmpty()){ + for(Set<OWLAxiom> just : allJusts){ + if(!SetUtils.intersects(just, hit)){ + log.debug("using sub ontology justification reuse: " + just); +// log.debug("using sub ontology justification reuse: " + axioms2Integer(just)); + justification = just; + break; + } + } + } + if(justification == null){ + removeAxioms(hit);System.out.println(singleExpGen.getExplanation(unsat)); +// pellet = new PelletExplanation(man, Collections.singleton(ont)); + justification = singleExpGen.getExplanation(unsat);//pellet.getUnsatisfiableExplanation(unsat); + if(!justification.isEmpty()){ +// log.debug("found new justification: " + axioms2Integer(justification)); + log.debug("found new justification: " + justification); + allJusts.add(justification); + currentJusts.add(justification); + } + } + + for(OWLAxiom ax : justification){ + HittingSet h = new HittingSet(hit); + h.add(ax); + hittingSets1.add(h); + } + + addAxioms(hit); + } + + } + } + + private void removeAxioms(Set<OWLAxiom> axioms, OWLOntology ontology, OWLOntologyManager man){ + try { + for(OWLAxiom ax : axioms){ + OntologyUtils.removeAxiom(ax, Collections.singleton(ontology), man); + } + } catch (OWLOntologyChangeException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + + private void removeAxioms(Set<OWLAxiom> axioms){ + try { + for(OWLAxiom ax : axioms){ + OntologyUtils.removeAxiom(ax, singleExpGen.getReasoner().getLoadedOntologies(), singleExpGen.getOntologyManager()); + } + } catch (OWLOntologyChangeException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + + private void addAxioms(Set<OWLAxiom> axioms, OWLOntology ontology, OWLOntologyManager man){ + try { + for(OWLAxiom ax : axioms){ + OntologyUtils.addAxiom(ax, Collections.singleton(ontology), man); + } + } catch (OWLOntologyChangeException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + private void addAxioms(Set<OWLAxiom> axioms){ + try { + for(OWLAxiom ax : axioms){ + OntologyUtils.addAxiom(ax, singleExpGen.getReasoner().getLoadedOntologies(), singleExpGen.getOntologyManager()); + } + } catch (OWLOntologyChangeException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + public static void main(String[] args) throws OWLOntologyCreationException { +// URI file = URI.create("file:examples/ore/koala.owl"); +// String base = "http://protege.stanford.edu/plugins/owl/owl-library/koala.owl#"; +// URI classURI = URI.create(base + "KoalaWithPhD"); + + URI file = URI.create("file:examples/ore/tambis.owl"); + String base = "http://krono.act.uji.es/Links/ontologies/tambis.owl#"; + URI classURI = URI.create(base + "metal"); + + OWLOntologyManager manager = OWLManager.createOWLOntologyManager(); + OWLDataFactory factory = manager.getOWLDataFactory(); + OWLClass cl = factory.getOWLClass(classURI); + OWLOntology ontology = manager.loadOntology(file); + Reasoner reasoner = new PelletReasonerFactory().createReasoner(manager); + reasoner.loadOntology(ontology); + + PelletExplanation pellet = new PelletExplanation(manager, Collections.singleton(ontology)); + Timer t1 = new Timer("pellet"); + t1.start(); + System.out.println(pellet.getUnsatisfiableExplanations(cl).size()); + t1.stop(); + System.out.println(t1.getTotal()); + + RelevanceBasedGenerator expGen = new RelevanceBasedGenerator(manager, ontology, reasoner); + Timer t2 = new Timer("relevance"); + t2.start(); + System.out.println(expGen.getExplanations(cl).size()); + t2.stop(); + System.out.println(t2.getTotal()); + + } +} Added: trunk/src/dl-learner/org/dllearner/tools/ore/explanation/relevance/SimpleSelectionFunction.java =================================================================== --- trunk/src/dl-learner/org/dllearner/tools/ore/explanation/relevance/SimpleSelectionFunction.java (rev 0) +++ trunk/src/dl-learner/org/dllearner/tools/ore/explanation/relevance/SimpleSelectionFunction.java 2009-09-02 10:19:41 UTC (rev 1834) @@ -0,0 +1,135 @@ +/* SimpleSelectionFunction - Decompiled by JODE + * Visit http://jode.sourceforge.net/ + */ +package org.dllearner.tools.ore.explanation.relevance; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.Vector; + +import org.semanticweb.owl.model.OWLAxiom; +import org.semanticweb.owl.model.OWLEntity; +import org.semanticweb.owl.model.OWLOntology; + +public class SimpleSelectionFunction { + private Set<OWLAxiom> allAxioms = new HashSet<OWLAxiom>(); + public Map<OWLAxiom, Set<OWLEntity>> axiomEntities = new HashMap<OWLAxiom, Set<OWLEntity>>(); + + + public void init(OWLOntology onto) { + allAxioms.clear(); + allAxioms = onto.getAxioms(); + + initAxiomEntities(allAxioms); + } + + public void init(HashSet<OWLAxiom> axioms) { + allAxioms.clear(); + allAxioms.addAll(axioms); + initAxiomEntities(allAxioms); + } + + public void initAxiomEntities(Set<OWLAxiom> axioms) { + axiomEntities.clear(); + for (OWLAxiom ax : axioms) { + axiomEntities.put(ax, ax.getSignature()); + } + + } + + public Set<OWLAxiom> getRelatedAxioms(OWLEntity concept) { + Set<OWLAxiom> relatedAxioms = new HashSet<OWLAxiom>(); + for (OWLAxiom ax : allAxioms) { + if (connected(concept, ax)) { + relatedAxioms.add(ax); + } + } + + return relatedAxioms; + } + + public Vector<OWLAxiom> getAllRelatedAxioms(OWLEntity concept) { + Vector<OWLAxiom> allRelated = new Vector<OWLAxiom>(); + Set<OWLAxiom> relatedAxioms = new HashSet<OWLAxiom>(); + Set<OWLAxiom> relatedAxioms_all = new HashSet<OWLAxiom>(); + for (relatedAxioms = getRelatedAxioms(concept); relatedAxioms.size() > 0; relatedAxioms = getRelatedAxioms(relatedAxioms_all)) { + allRelated + .addAll((HashSet<OWLAxiom>) ((HashSet<OWLAxiom>) relatedAxioms) + .clone()); + relatedAxioms_all + .addAll((HashSet<OWLAxiom>) ((HashSet<OWLAxiom>) relatedAxioms) + .clone()); + } + return allRelated; + } + + public Set<OWLAxiom> getRelatedAxioms(Set<OWLAxiom> originalAxioms_in) { + Set<OWLAxiom> relatedAxioms = new HashSet<OWLAxiom>(); + Set<OWLEntity> originalEntities = new HashSet<OWLEntity>(); + Set<OWLAxiom> originalAxioms = new HashSet<OWLAxiom>(originalAxioms_in); + for (OWLAxiom ax : originalAxioms) { + if (axiomEntities.containsKey(ax)) { + originalEntities.addAll(axiomEntities.get(ax)); + } + } + for (OWLEntity ent : originalEntities) { + for (OWLAxiom ax : allAxioms) { + if (!originalAxioms.contains(ax) && connected(ent, ax)) { + relatedAxioms.add(ax); + } + } + } + relatedAxioms.removeAll(originalAxioms_in); + return relatedAxioms; + } + + public Vector<OWLAxiom> getAllRelatedAxioms(Set<OWLAxiom> originalAxioms_in) { + Vector<OWLAxiom> allRelated = new Vector<OWLAxiom>(); + Set<OWLAxiom> relatedAxioms = new HashSet<OWLAxiom>(); + Set<OWLAxiom> relatedAxioms_all = new HashSet<OWLAxiom>(); + for (relatedAxioms = getRelatedAxioms(originalAxioms_in); relatedAxioms + .size() > 0; relatedAxioms = getRelatedAxioms(relatedAxioms_all)) { + allRelated + .addAll((HashSet<OWLAxiom>) ((HashSet<OWLAxiom>) relatedAxioms) + .clone()); + relatedAxioms_all + .addAll((HashSet<OWLAxiom>) ((HashSet<OWLAxiom>) relatedAxioms) + .clone()); + } + return allRelated; + } + + public boolean connected(HashSet<OWLAxiom> axioms, OWLAxiom a) { + boolean flag = false; + for (OWLAxiom ax : axioms) { + if (connected(ax, a) > 0) { + flag = true; + break; + } + } + + return flag; + } + + public int connected(OWLAxiom a1, OWLAxiom a2) { + int num = 0; + Set<OWLEntity> ents1 = axiomEntities.get(a1); + Set<OWLEntity> ents2 = axiomEntities.get(a2); + for(OWLEntity ent : ents1){ + if(ents2.contains(ent)){ + num++; + } + } + + return num; + } + + public boolean connected(OWLEntity c, OWLAxiom a) { + Set<OWLEntity> entities = axiomEntities.get(a); + if (entities.contains(c)) + return true; + return false; + } +} Modified: trunk/src/dl-learner/org/dllearner/tools/ore/explanation/relevance/SyntacticRelevanceBasedExplanationGenerator.java =================================================================== --- trunk/src/dl-learner/org/dllearner/tools/ore/explanation/relevance/SyntacticRelevanceBasedExplanationGenerator.java 2009-09-01 13:44:00 UTC (rev 1833) +++ trunk/src/dl-learner/org/dllearner/tools/ore/explanation/relevance/SyntacticRelevanceBasedExplanationGenerator.java 2009-09-02 10:19:41 UTC (rev 1834) @@ -76,7 +76,7 @@ e.printStackTrace(); } logger.addAppender( fileAppender ); - logger.setLevel(Level.DEBUG); + logger.setLevel(Level.OFF); } @@ -509,7 +509,7 @@ public static void main(String[] args){ URI file = URI.create("http://krono.act.uji.es/Links/ontologies/tambis.owl/at_download/file"); String base = "http://krono.act.uji.es/Links/ontologies/tambis.owl#"; - URI classURI = URI.create(base + "protein"); + URI classURI = URI.create(base + "metal"); try { OWLOntologyManager manager = OWLManager.createOWLOntologyManager(); @@ -590,22 +590,23 @@ Timer t1 = new Timer("pellet"); t1.start(); PelletExplanation exp1 = new PelletExplanation(manager, Collections.singleton(ontology)); - exp1.getUnsatisfiableExplanations(cl, 1); + exp1.getUnsatisfiableExplanations(cl); t1.stop(); Timer t3 = new Timer("module-based"); t3.start(); OWLOntology module = OntologyUtils.getOntologyFromAxioms(ModularityUtils.extractModule(ontology, cl.getSignature(), ModuleType.TOP_OF_BOT)); System.out.println(module); PelletExplanation exp2 = new PelletExplanation(manager, Collections.singleton(module)); - exp2.getUnsatisfiableExplanations(cl, 1); + System.out.println(exp2.getUnsatisfiableExplanations(cl).size()); t3.stop(); Timer t2 = new Timer("syntactic relevance"); t2.start(); Reasoner reasoner = new PelletReasonerFactory().createReasoner(manager); reasoner.loadOntologies(Collections.singleton(ontology)); - SyntacticRelevanceBasedExplanationGenerator expGen = + SyntacticRelevanceBasedExplanationGenerator exp3 = new SyntacticRelevanceBasedExplanationGenerator(reasoner, manager); + System.out.println(exp3.getUnsatisfiableExplanations(cl, Strategie.All_Just_Relevance).size()); System.out.print("J = {"); // for(Set<OWLAxiom> explanation : expGen.getUnsatisfiableExplanations(cl, Strategie.All_Just_Relevance)){ Added: trunk/src/dl-learner/org/dllearner/tools/ore/ui/ChangesTable.java =================================================================== --- trunk/src/dl-learner/org/dllearner/tools/ore/ui/ChangesTable.java (rev 0) +++ trunk/src/dl-learner/org/dllearner/tools/ore/ui/ChangesTable.java 2009-09-02 10:19:41 UTC (rev 1834) @@ -0,0 +1,138 @@ +package org.dllearner.tools.ore.ui; + +import java.awt.Color; +import java.awt.Component; +import java.awt.Cursor; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.List; + +import javax.swing.JTable; +import javax.swing.ListSelectionModel; +import javax.swing.table.DefaultTableCellRenderer; + +import org.jdesktop.swingx.JXTable; +import org.semanticweb.owl.model.OWLOntologyChange; + +public class ChangesTable extends JXTable { + + /** + * + */ + private static final long serialVersionUID = 1137642531002327026L; + + public ChangesTable(){ + setBackground(Color.WHITE); + setModel(new ChangesTableModel()); + setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + setEditable(false); + setTableHeader(null); + setGridColor(Color.LIGHT_GRAY); + setRowHeight(getRowHeight() + 5); + getColumn(0).setMaxWidth(20); + getColumn(2).setMaxWidth(40); + setShowGrid(false); + getColumn(1).setCellRenderer(new ManchesterSyntaxTableCellRenderer()); + getColumn(2).setCellRenderer(new UndoCellRenderer()); + + addKeyListener(new KeyAdapter() { + + public void keyPressed(KeyEvent e) + { + handleKeyPressed(e); + } + + + }); + + addMouseMotionListener(new MouseAdapter() { + + final ChangesTable table; + { + table = ChangesTable.this; + } + + public void mouseMoved(MouseEvent e) { + int row = rowAtPoint(e.getPoint()); + int column = columnAtPoint(e.getPoint()); + + if(column == 2 && row <= table.getRowCount() && row >= 0){ + setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + + } else { + setCursor(null); + } + } + + }); + + addMouseListener(new MouseAdapter() { + final ChangesTable table; + { + table = ChangesTable.this; + } + + public void mouseClicked(MouseEvent e) { + int row = rowAtPoint(e.getPoint()); + int column = columnAtPoint(e.getPoint()); + + if(row >= 0 && row <= table.getRowCount() && column == 2){ + ((ChangesTableModel)table.getModel()).removeChange(rowAtPoint(e.getPoint())); + setCursor(null); + } + } + }); + } + + private void handleKeyPressed(KeyEvent e) + { + int selRow = getSelectedRow(); + if(e.getKeyCode() == KeyEvent.VK_DELETE){ + ((ChangesTableModel)getModel()).removeChange(selRow); + } + + getSelectionModel().clearSelection(); + } + + public void addChanges(List<OWLOntologyChange> changes){ + ((ChangesTableModel)getModel()).addChanges(changes); + } + + public void removeChanges(List<OWLOntologyChange> changes){ + ((ChangesTableModel)getModel()).removeChanges(changes); + } + + public void clear(){ + ((ChangesTableModel)getModel()).clear(); + } + + public List<OWLOntologyChange> getChanges(){ + return ((ChangesTableModel)getModel()).getChanges(); + } + + + class UndoCellRenderer extends DefaultTableCellRenderer{ + + + /** + * + */ + private static final long serialVersionUID = 6941030561135280273L; + + @Override + public Component getTableCellRendererComponent(JTable table, + Object value, boolean isSelected, boolean hasFocus, int row, + int column) { + if(value instanceof LinkLabel){ + return (LinkLabel)value; + } + + return this; + } + + } +} + + Added: trunk/src/dl-learner/org/dllearner/tools/ore/ui/ChangesTableModel.java =================================================================== --- trunk/src/dl-learner/org/dllearner/tools/ore/ui/ChangesTableModel.java (rev 0) +++ trunk/src/dl-learner/org/dllearner/tools/ore/ui/ChangesTableModel.java 2009-09-02 10:19:41 UTC (rev 1834) @@ -0,0 +1,87 @@ +package org.dllearner.tools.ore.ui; + +import java.util.ArrayList; +import java.util.List; + +import javax.swing.table.AbstractTableModel; + +import org.dllearner.tools.ore.OREManager; +import org.semanticweb.owl.model.OWLOntologyChange; +import org.semanticweb.owl.model.RemoveAxiom; + +public class ChangesTableModel extends AbstractTableModel { + + @Override + public boolean isCellEditable(int rowIndex, int columnIndex) { + if(columnIndex == 2){ + return true; + } + return super.isCellEditable(rowIndex, columnIndex); + } + + /** + * + */ + private static final long serialVersionUID = 7573340273483900311L; + + private List<OWLOntologyChange> changes; + + public ChangesTableModel(){ + changes = new ArrayList<OWLOntologyChange>(); + } + + @Override + public int getColumnCount() { + return 3; + } + + @Override + public int getRowCount() { + return changes.size(); + } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + if(columnIndex == 0){ + if(changes.get(rowIndex) instanceof RemoveAxiom){ + return "–"; + } else { + return "+"; + } + } else if(columnIndex == 1){ + return changes.get(rowIndex).getAxiom(); + } + else { + return new LinkLabel("Undo"); + } + + } + + public void addChanges(List<OWLOntologyChange> changes){ + this.changes.addAll(changes); + fireTableDataChanged(); + } + + public void removeChanges(List<OWLOntologyChange> changes){ + this.changes.removeAll(changes); + fireTableDataChanged(); + } + + public void removeChange(int rowIndex){ + List<OWLOntologyChange> undoChanges = new ArrayList<OWLOntologyChange>(1); + undoChanges.add(changes.get(rowIndex)); + this.changes.remove(rowIndex); + OREManager.getInstance().getModifier().undoChanges(undoChanges); + fireTableDataChanged(); + } + + public void clear(){ + this.changes.clear(); + fireTableDataChanged(); + } + + public List<OWLOntologyChange> getChanges(){ + return changes; + } + +} Copied: trunk/src/dl-learner/org/dllearner/tools/ore/ui/DescriptionPanel.java (from rev 1830, trunk/src/dl-learner/org/dllearner/tools/ore/ui/wizard/panels/DescriptionPanel.java) =================================================================== --- trunk/src/dl-learner/org/dllearner/tools/ore/ui/DescriptionPanel.java (rev 0) +++ trunk/src/dl-learner/org/dllearner/tools/ore/ui/DescriptionPanel.java 2009-09-02 10:19:41 UTC (rev 1834) @@ -0,0 +1,136 @@ +/** + * Copyright (C) 2007-2008, Jens Lehmann + * + * This file is part of DL-Learner. + * + * DL-Learner is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * DL-Learner is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +package org.dllearner.tools.ore.ui; + +import java.awt.Color; +import java.awt.Component; +import java.awt.event.ActionListener; + +import javax.swing.BorderFactory; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; +import javax.swing.border.BevelBorder; + +import org.dllearner.core.owl.Description; +import org.dllearner.core.owl.Individual; +import org.dllearner.tools.ore.OREManager; + +/** + * Panel where learned class description is shown, and parts that might occur errors are red colored. + * @author Lorenz Buehmann + * + */ +public class DescriptionPanel extends JPanel{ + + /** + * + */ + private static final long serialVersionUID = -3684937339236885595L; + + + private Individual ind; + private ActionListener aL; + private String mode; + private boolean correct = false; + private Description newClassDescription; + + public DescriptionPanel(Individual ind, ActionListener aL, String mode){ + super(); + setBackground(Color.WHITE); + setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); + this.newClassDescription = OREManager.getInstance().getNewClassDescription().getDescription(); + this.ind = ind; + this.aL = aL; + this.mode = mode; + if(mode.equals("neg")){ + for(JLabel jL : OREManager.getInstance().descriptionToJLabelNeg(ind, newClassDescription)){ + add(jL); + if(jL instanceof DescriptionLabel){ + + ((DescriptionLabel) jL).setIndOre(ind); + ((DescriptionLabel) jL).init(); + ((DescriptionLabel) jL).addActionListeners(aL); + + } + + } + } else if(mode.equals("pos")){ + for(JLabel jL : OREManager.getInstance().descriptionToJLabelPos(ind, newClassDescription)){ + add(jL); + if(jL instanceof DescriptionLabel){ + + ((DescriptionLabel) jL).setIndOre(ind); + ((DescriptionLabel) jL).init(); + ((DescriptionLabel) jL).addActionListeners(aL); + + } + + } + } + } + + /** + * Updates the panel. + */ + public void updatePanel(){ + for(Component c : getComponents()){ + if(c instanceof JLabel){ + remove(c); + } + } +// ore.updateReasoner(); + correct = true; + if (mode.equals("neg")) { + for (JLabel jL : OREManager.getInstance().descriptionToJLabelNeg(ind, newClassDescription)) { + add(jL); + if (jL instanceof DescriptionLabel) { + ((DescriptionLabel) jL).setIndOre(ind); + ((DescriptionLabel) jL).init(); + ((DescriptionLabel) jL).addActionListeners(aL); + correct = false; + + } + } + } else if(mode.equals("pos")){ + for (JLabel jL : OREManager.getInstance().descriptionToJLabelPos(ind, newClassDescription)) { + add(jL); + if (jL instanceof DescriptionLabel) { + ((DescriptionLabe... [truncated message content] |