aboutsummaryrefslogtreecommitdiff
path: root/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj.java
diff options
context:
space:
mode:
authorFederico Igne <federico.igne@cs.ox.ac.uk>2022-05-10 18:17:06 +0100
committerFederico Igne <federico.igne@cs.ox.ac.uk>2022-05-11 12:34:47 +0100
commit17bd9beaf7f358a44e5bf36a5855fe6727d506dc (patch)
tree47e9310a0cff869d9ec017dcb2c81876407782c8 /src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj.java
parent8651164cd632a5db310b457ce32d4fbc97bdc41c (diff)
downloadACQuA-17bd9beaf7f358a44e5bf36a5855fe6727d506dc.tar.gz
ACQuA-17bd9beaf7f358a44e5bf36a5855fe6727d506dc.zip
[pagoda] Move project to Scala
This commit includes a few changes: - The repository still uses Maven to manage dependency but it is now a Scala project. - The code has been ported from OWLAPI 3.4.10 to 5.1.20 - A proof of concept program using both RSAComb and PAGOdA has been added.
Diffstat (limited to 'src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj.java')
-rw-r--r--src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj.java163
1 files changed, 0 insertions, 163 deletions
diff --git a/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj.java b/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj.java
deleted file mode 100644
index b169053..0000000
--- a/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj.java
+++ /dev/null
@@ -1,163 +0,0 @@
1package uk.ac.ox.cs.pagoda.tracking;
2
3import org.semanticweb.HermiT.model.*;
4import uk.ac.ox.cs.pagoda.hermit.DLClauseHelper;
5import uk.ac.ox.cs.pagoda.reasoner.light.BasicQueryEngine;
6import uk.ac.ox.cs.pagoda.rules.UpperDatalogProgram;
7import uk.ac.ox.cs.pagoda.rules.approximators.SkolemTermsManager;
8import uk.ac.ox.cs.pagoda.util.Namespace;
9
10import java.util.*;
11
12public abstract class TrackingRuleEncoderDisj extends TrackingRuleEncoderWithGap {
13
14 public TrackingRuleEncoderDisj(UpperDatalogProgram program, BasicQueryEngine store) {
15 super(program, store);
16 }
17
18 protected Map<DLClause, Collection<DLClause>> disjunctiveRules = new HashMap<DLClause, Collection<DLClause>>();
19
20 /**
21 *
22 */
23 protected void processDisjunctiveRules() {
24 Map<Atom, Collection<DLClause>> auxiliaryAtoms = new HashMap<Atom, Collection<DLClause>>();
25 Map<Individual, Collection<DLClause>> skolemisedAtoms = new HashMap<Individual, Collection<DLClause>>();
26 SkolemTermsManager termsManager = SkolemTermsManager.getInstance();
27
28 for (Map.Entry<DLClause, Collection<DLClause>> entry: disjunctiveRules.entrySet()) {
29 DLClause original = entry.getKey();
30 Collection<DLClause> overClauses = entry.getValue();
31
32 int index = 0;
33 for (Iterator<DLClause> iter = overClauses.iterator(); iter.hasNext();) {
34 DLClause subClause = iter.next();
35 if (DLClauseHelper.hasSubsetBodyAtoms(subClause, original)) {
36 Atom headAtom = subClause.getHeadAtom(0);
37 if ((index = SkolemTermsManager.indexOfSkolemisedIndividual(headAtom)) != -1) {
38 Individual i = (Individual) headAtom.getArgument(index);
39 Collection<DLClause> clauses = skolemisedAtoms.get(i);
40 if (clauses == null) {
41 clauses = new HashSet<DLClause>();
42 skolemisedAtoms.put(i, clauses);
43 }
44 clauses.add(subClause);
45 }
46 else
47 auxiliaryAtoms.put(getAuxiliaryAtom(original, subClause.getHeadAtom(0)), Collections.singleton(subClause));
48 }
49 else
50 super.encodingRule(subClause);
51 }
52
53 for (Atom headAtom: original.getHeadAtoms())
54 if (headAtom.getDLPredicate() instanceof AtLeastConcept) {
55 AtLeastConcept alc = (AtLeastConcept) headAtom.getDLPredicate();
56 Collection<DLClause> clauses = new HashSet<DLClause>();
57 Individual[] individuals = new Individual[alc.getNumber()];
58 for (int i = 0; i < alc.getNumber(); ++i) {
59 individuals[i] = termsManager.getFreshIndividual(original, i);
60 clauses.addAll(skolemisedAtoms.get(individuals[i]));
61 }
62 auxiliaryAtoms.put(getAuxiliaryAtom(original, headAtom, individuals), clauses);
63 }
64
65 index = 0;
66 Atom[] auxAtoms = auxiliaryAtoms.keySet().toArray(new Atom[0]);
67 for (Atom atom: auxAtoms) {
68 for (DLClause subClause: auxiliaryAtoms.get(atom))
69 encodingDisjunctiveRule(subClause, index, auxAtoms);
70 index++;
71 }
72
73 auxiliaryAtoms.clear();
74 }
75 }
76
77 private Atom getAuxiliaryAtom(DLClause original, Atom headAtom, Individual... individuals) {
78 DLPredicate p = headAtom.getDLPredicate();
79 if (p instanceof AtLeastConcept) {
80// AtLeastConcept alc = (AtLeastConcept) p;
81// Individual[] individuals = new Individual[alc.getNumber()];
82// for (int i = 0; i < alc.getNumber(); ++i)
83// individuals[i] = OverApproxExist.getNewIndividual(original, i);
84 return Atom.create(generateAuxiliaryRule((AtLeastConcept) p, original, individuals), headAtom.getArgument(0));
85 }
86 if (p instanceof AtomicConcept)
87 return Atom.create(generateAuxiliaryRule((AtomicConcept) p), headAtom.getArgument(0));
88 if (p instanceof AtomicRole)
89 return Atom.create(generateAuxiliaryRule((AtomicRole) p), headAtom.getArgument(0), headAtom.getArgument(1));
90 if (p instanceof Equality || p instanceof AnnotatedEquality)
91 return Atom.create(generateAuxiliaryRule(Equality.INSTANCE), headAtom.getArgument(0), headAtom.getArgument(1));
92 if (p instanceof Inequality)
93 return Atom.create(generateAuxiliaryRule((Inequality) p), headAtom.getArgument(0), headAtom.getArgument(1));
94
95 return null;
96 }
97
98 private void encodingDisjunctiveRule(DLClause clause, int index, Atom[] auxAtoms) {
99 int validHeadLength = auxAtoms.length;
100 Atom headAtom = clause.getHeadAtom(0);
101 Atom[] bodyAtoms = clause.getBodyAtoms();
102
103 LinkedList<Atom> newHeadAtoms = new LinkedList<Atom>();
104 DLPredicate selected = AtomicConcept.create(getSelectedPredicate());
105 newHeadAtoms.add(Atom.create(selected, getIndividual4GeneralRule(clause)));
106
107 for (Atom atom: bodyAtoms) {
108 Atom newAtom = Atom.create(
109 getTrackingDLPredicate(atom.getDLPredicate()),
110 DLClauseHelper.getArguments(atom));
111 newHeadAtoms.add(newAtom);
112 }
113
114 DLClause newClause;
115 Atom[] newBodyAtoms = new Atom[bodyAtoms.length + validHeadLength + 1];
116
117 newBodyAtoms[0] = Atom.create(
118 getTrackingDLPredicate(headAtom.getDLPredicate()),
119 DLClauseHelper.getArguments(headAtom));
120
121 newBodyAtoms[1] = Atom.create(
122 getGapDLPredicate(headAtom.getDLPredicate()),
123 DLClauseHelper.getArguments(headAtom));
124
125 for (int i = 0; i < validHeadLength; ++i)
126 if (i != index)
127 newBodyAtoms[i + (i < index ? 2 : 1)] = auxAtoms[i];
128
129 for (int i = 0; i < bodyAtoms.length; ++i)
130 newBodyAtoms[i + validHeadLength + 1] = bodyAtoms[i];
131
132 for (Atom atom: newHeadAtoms) {
133 newClause = DLClause.create(new Atom[] {atom}, newBodyAtoms);
134 addTrackingClause(newClause);
135 }
136 }
137
138 protected void addTrackingClause(DLClause clause) {
139 trackingClauses.add(clause);
140 }
141
142 protected void addDisjunctiveRule(DLClause key, DLClause clause) {
143 Collection<DLClause> value = disjunctiveRules.get(key);
144 if (value == null) {
145 value = new LinkedList<DLClause>();
146 disjunctiveRules.put(key, value);
147 }
148 value.add(clause);
149 }
150
151 protected abstract DLPredicate generateAuxiliaryRule(AtLeastConcept p, DLClause original, Individual[] individuals);
152
153 protected abstract DLPredicate generateAuxiliaryRule(AtomicRole p);
154
155 protected abstract DLPredicate generateAuxiliaryRule(AtomicConcept p);
156
157 protected DLPredicate generateAuxiliaryRule(Equality instance) {
158 return generateAuxiliaryRule(AtomicRole.create(Namespace.EQUALITY));
159 }
160
161 protected abstract DLPredicate generateAuxiliaryRule(Inequality instance);
162
163}