From 9ce65c5a963b03ee97fe9cb6c5aa65a3c04a80a8 Mon Sep 17 00:00:00 2001 From: yzhou Date: Tue, 21 Apr 2015 10:34:27 +0100 Subject: initial version --- src/uk/ac/ox/cs/pagoda/rules/ApproxProgram.java | 111 ++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 src/uk/ac/ox/cs/pagoda/rules/ApproxProgram.java (limited to 'src/uk/ac/ox/cs/pagoda/rules/ApproxProgram.java') diff --git a/src/uk/ac/ox/cs/pagoda/rules/ApproxProgram.java b/src/uk/ac/ox/cs/pagoda/rules/ApproxProgram.java new file mode 100644 index 0000000..3b9d6fc --- /dev/null +++ b/src/uk/ac/ox/cs/pagoda/rules/ApproxProgram.java @@ -0,0 +1,111 @@ +package uk.ac.ox.cs.pagoda.rules; + +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; + +import org.semanticweb.HermiT.model.DLClause; +import org.semanticweb.owlapi.model.OWLAxiom; +import org.semanticweb.owlapi.model.OWLSubPropertyChainOfAxiom; +import org.semanticweb.owlapi.model.OWLTransitiveObjectPropertyAxiom; + +import uk.ac.ox.cs.pagoda.owl.OWLHelper; + +public abstract class ApproxProgram extends Program { + + /** + * mapping from over-approximated DLClauses to DLClauses from the original ontology + */ + Map correspondence = new HashMap(); + + protected Approximator m_approx = null; + + protected ApproxProgram() { initApproximator(); } + + protected abstract void initApproximator(); + + @Override + public void transform() { + super.transform(); + Iterator iterClause = transitiveClauses.iterator(); + for (Iterator iterAxiom = transitiveAxioms.iterator(); iterAxiom.hasNext(); ) + addCorrespondence(iterClause.next(), iterAxiom.next()); + + iterClause = subPropChainClauses.iterator(); + for (Iterator iterAxiom = subPropChainAxioms.iterator(); iterAxiom.hasNext(); ) + addCorrespondence(iterClause.next(), iterAxiom.next()); + } + + @Override + public Collection convert2Clauses(DLClause clause) { + Collection ret = botStrategy.process(m_approx.convert(clause, clause)); +// OWLAxiom correspondingAxiom = OWLHelper.getOWLAxiom(ontology, clause); + for (DLClause newClause: ret) { + addCorrespondence(newClause, clause); +// addCorrespondence(newClause, correspondingAxiom); + } + return ret; + } + + private void addCorrespondence(DLClause newClause, Object corresponding) { + Object object; + if ((object = correspondence.get(newClause)) != null) { + if (object.equals(corresponding)) + return ; + + if (object instanceof DLClause) { + DLClause c1 = (DLClause) object; + if (c1.getHeadLength() == 1) return ; + DLClause c2 = (DLClause) corresponding; + if (c2.getHeadLength() == 1) { + correspondence.put(newClause, c2); + return ; + } + ClauseSet list = new ClauseSet(c1, c2); + correspondence.put(newClause, list); + } + else if (object instanceof ClauseSet){ + ClauseSet list = (ClauseSet) object; + list.add((DLClause) corresponding); + } + } + correspondence.put(newClause, corresponding); + } + + public OWLAxiom getEquivalentAxiom(DLClause clause) { + Object obj = correspondence.get(clause); + while (obj != null && obj instanceof DLClause && !obj.equals(clause) && correspondence.containsKey((DLClause) obj)) + obj = correspondence.get(clause); + if (obj instanceof OWLAxiom) + return (OWLAxiom) obj; + else if (obj != null) + return OWLHelper.getOWLAxiom(ontology, (DLClause) obj); + else { + return OWLHelper.getOWLAxiom(ontology, clause); + } + } + + public DLClause getCorrespondingClause(DLClause clause) { + Object obj = correspondence.get(clause); + if (obj instanceof DLClause) + return (DLClause) obj; + else + return clause; + } +} + +class ClauseSet extends HashSet { + + public ClauseSet(DLClause first, DLClause second) { + add(first); + add(second); + } + + /** + * + */ + private static final long serialVersionUID = 1L; + +} \ No newline at end of file -- cgit v1.2.3