aboutsummaryrefslogtreecommitdiff
path: root/src/uk/ac/ox/cs/pagoda/hermit/TermGraph.java
diff options
context:
space:
mode:
authoryzhou <yujiao.zhou@gmail.com>2015-04-21 10:34:27 +0100
committeryzhou <yujiao.zhou@gmail.com>2015-04-21 10:34:27 +0100
commit9ce65c5a963b03ee97fe9cb6c5aa65a3c04a80a8 (patch)
tree47511c0fb89dccff0db4b5990522e04f294d795b /src/uk/ac/ox/cs/pagoda/hermit/TermGraph.java
parentb1ac207612ee8b045244253fb94b866104bc34f2 (diff)
downloadACQuA-9ce65c5a963b03ee97fe9cb6c5aa65a3c04a80a8.tar.gz
ACQuA-9ce65c5a963b03ee97fe9cb6c5aa65a3c04a80a8.zip
initial version
Diffstat (limited to 'src/uk/ac/ox/cs/pagoda/hermit/TermGraph.java')
-rw-r--r--src/uk/ac/ox/cs/pagoda/hermit/TermGraph.java258
1 files changed, 258 insertions, 0 deletions
diff --git a/src/uk/ac/ox/cs/pagoda/hermit/TermGraph.java b/src/uk/ac/ox/cs/pagoda/hermit/TermGraph.java
new file mode 100644
index 0000000..0041cca
--- /dev/null
+++ b/src/uk/ac/ox/cs/pagoda/hermit/TermGraph.java
@@ -0,0 +1,258 @@
1package uk.ac.ox.cs.pagoda.hermit;
2
3import java.util.Collection;
4import java.util.Comparator;
5import java.util.HashMap;
6import java.util.HashSet;
7import java.util.Iterator;
8import java.util.Map;
9import java.util.PriorityQueue;
10import java.util.Set;
11
12import org.semanticweb.HermiT.model.AnnotatedEquality;
13import org.semanticweb.HermiT.model.Atom;
14import org.semanticweb.HermiT.model.AtomicConcept;
15import org.semanticweb.HermiT.model.AtomicRole;
16import org.semanticweb.HermiT.model.Constant;
17import org.semanticweb.HermiT.model.DLClause;
18import org.semanticweb.HermiT.model.DLPredicate;
19import org.semanticweb.HermiT.model.DatatypeRestriction;
20import org.semanticweb.HermiT.model.Equality;
21import org.semanticweb.HermiT.model.Individual;
22import org.semanticweb.HermiT.model.NodeIDLessEqualThan;
23import org.semanticweb.HermiT.model.NodeIDsAscendingOrEqual;
24import org.semanticweb.HermiT.model.Term;
25import org.semanticweb.HermiT.model.Variable;
26
27import uk.ac.ox.cs.pagoda.util.Namespace;
28import uk.ac.ox.cs.pagoda.util.Utility;
29
30public class TermGraph {
31
32 Map<Term, Collection<Edge>> graph = new HashMap<Term, Collection<Edge>>();
33 Map<Term, Collection<AtomicConcept>> term2concepts = new HashMap<Term, Collection<AtomicConcept>>();
34 Set<Term> choosen = new HashSet<Term>(), allTerms = new HashSet<Term>();
35 DLClause clause;
36 Set<Atom> newBodyAtoms = new HashSet<Atom>();
37
38 public TermGraph(DLClause clause) {
39 this.clause = clause;
40 for (Atom atom: clause.getHeadAtoms())
41 for (int i = 0; i < atom.getArity(); ++i)
42 allTerms.add(atom.getArgument(i));
43 for (Atom atom: clause.getBodyAtoms())
44 for (int i = 0; i < atom.getArity(); ++i)
45 allTerms.add(atom.getArgument(i));
46 }
47
48 public DLClause simplify() {
49 constructGraph();
50 chooseTerms();
51
52 PriorityQueue<Term> queue = new PriorityQueue<Term>(allTerms.size(), new Comparator<Term>() {
53
54 @Override
55 public int compare(Term o1, Term o2) {
56 int diff = 0;
57 @SuppressWarnings("rawtypes")
58 Collection set1 = term2concepts.get(o1), set2 = term2concepts.get(o2);
59 int num1 = size(set1), num2 = size(set2);
60
61 if ((diff = num2 - num1) != 0)
62 return diff;
63
64 set1 = graph.get(o1); set2 = graph.get(o2);
65 num1 = size(set1); num2 = size(set2);
66
67 return num2 - num1;
68 }
69
70 private int size(@SuppressWarnings("rawtypes") Collection c) {
71 return c == null ? 0 : c.size();
72 }
73
74 });
75
76 for (Term term: allTerms)
77 queue.add(term);
78
79 while (!queue.isEmpty()) {
80 Term term = queue.remove();
81 if (!choosen.contains(term) && isRepresentative(term))
82 choosen.add(term);
83 }
84
85 boolean flag;
86 for (Iterator<Atom> iter = newBodyAtoms.iterator(); iter.hasNext(); ) {
87 flag = true;
88 Atom atom = iter.next();
89 for (int i = 0; i < atom.getArity(); ++i) {
90 if (!choosen.contains(atom.getArgument(i))) {
91 flag = false;
92 break;
93 }
94 }
95 if (!flag) iter.remove();
96 }
97
98 return DLClause.create(clause.getHeadAtoms(), newBodyAtoms.toArray(new Atom[0]));
99 }
100
101 private boolean isRepresentative(Term term) {
102 boolean flag = true;
103 for (Term otherTerm: choosen)
104 if (!term.equals(otherTerm) && isSubsumedBy(term, otherTerm)) {
105 flag = false;
106 }
107 return flag;
108 }
109
110 private boolean isSubsumedBy(Term t1, Term t2) {
111 Collection<AtomicConcept> set1 = term2concepts.get(t1);
112 Collection<AtomicConcept> set2 = term2concepts.get(t2);
113
114 if (set1 != null)
115 if (set2 == null)
116 return false;
117 else if (!set2.containsAll(set1))
118 return false;
119
120 Collection<Edge> edgeSet1 = graph.get(t1);
121 Collection<Edge> edgeSet2 = graph.get(t2);
122 if (edgeSet1 != null)
123 if (edgeSet2 == null)
124 return false;
125 else {
126 if (!edgeSet2.containsAll(edgeSet1))
127 return false;
128// else {
129// Collection<Edge> restEdge1 = new HashSet<Edge>();
130// for (Edge edge: edgeSet1)
131// if (edge.term == t2);
132// else restEdge1.add(edge);
133//
134// Collection<Edge> restEdge2 = new HashSet<Edge>();
135// for (Edge edge: edgeSet2)
136// if (edge.term == t1);
137// else restEdge2.add(edge);
138//
139// return restEdge2.containsAll(edgeSet1);
140// }
141 }
142
143 return true;
144 }
145
146 private void chooseTerms() {
147 Set<Variable> headVariables = new HashSet<Variable>();
148 for (Atom atom: clause.getHeadAtoms()) {
149 atom.getVariables(headVariables);
150 }
151 choosen.addAll(headVariables);
152
153 for (Term term: allTerms)
154 if (term instanceof Constant || term instanceof Individual)
155 choosen.add(term);
156
157 if (choosen.isEmpty()) choosen.add(Variable.create("X"));
158// propagate();
159 }
160
161// private void propagate() {
162// LinkedList<Term> queue = new LinkedList<Term>(choosen);
163// Term term;
164// while (!queue.isEmpty()) {
165// term = queue.pop();
166// if (graph.containsKey(term))
167// for (Edge edge: graph.get(term))
168// if (!choosen.contains(edge.term)) {
169// choosen.add(edge.term);
170// queue.add(term);
171// }
172// }
173// }
174
175 private void constructGraph() {
176 DLPredicate p;
177 for (Atom bodyAtom: clause.getBodyAtoms()) {
178 p = bodyAtom.getDLPredicate();
179 if (p instanceof AtomicConcept) {
180 newBodyAtoms.add(bodyAtom);
181 addConcept(bodyAtom.getArgument(0), (AtomicConcept) p);
182 }
183 else if (p instanceof AtomicRole) {
184 newBodyAtoms.add(bodyAtom);
185 addEdges(bodyAtom.getArgument(0), bodyAtom.getArgument(1), (AtomicRole) p);
186 }
187 else if (p instanceof DatatypeRestriction)
188 newBodyAtoms.add(bodyAtom);
189 else if (p instanceof NodeIDLessEqualThan || p instanceof NodeIDsAscendingOrEqual);
190 else if (p instanceof Equality || p instanceof AnnotatedEquality) {
191 newBodyAtoms.add(bodyAtom);
192 addEdges(bodyAtom.getArgument(0), bodyAtom.getArgument(1), AtomicRole.create(Namespace.EQUALITY));
193 } else {
194 Utility.logError("Unknown DLPredicate in TermGraph: " + p);
195 }
196 }
197 }
198
199 private void addEdges(Term t1, Term t2, AtomicRole p) {
200 addEdge(t1, new Edge(p, t2, false));
201 addEdge(t2, new Edge(p, t1, true));
202 }
203
204 private void addEdge(Term t, Edge edge) {
205 Collection<Edge> edges;
206 if ((edges = graph.get(t)) == null) {
207 graph.put(t, edges = new HashSet<Edge>());
208 }
209 edges.add(edge);
210 }
211
212 private void addConcept(Term t, AtomicConcept p) {
213 Collection<AtomicConcept> concepts;
214 if ((concepts = term2concepts.get(t)) == null) {
215 term2concepts.put(t, concepts = new HashSet<AtomicConcept>());
216 }
217 concepts.add(p);
218 }
219
220 public boolean mark(Term t) {
221 return choosen.add(t);
222 }
223
224}
225
226class Edge {
227 boolean isInverse;
228 AtomicRole role;
229 Term term;
230
231 public Edge(AtomicRole role, Term term, boolean isInverse) {
232 this.role = role;
233 this.term = term;
234 this.isInverse = isInverse;
235 }
236
237 @Override
238 public int hashCode() {
239 return role.hashCode() * 1997 + term.hashCode() * 2 + (isInverse ? 1 : 0);
240 }
241
242 @Override
243 public boolean equals(Object obj) {
244 if (!(obj instanceof Edge)) return false;
245 Edge other = (Edge) obj;
246 return isInverse == other.isInverse && role.equals(other.role) && term.equals(other.term);
247 }
248
249 @Override
250 public String toString() {
251 if (isInverse)
252 return "inv_" + role.toString() + "_" + term.toString();
253 return role.toString() + "_" + term.toString();
254 }
255
256}
257
258