diff options
Diffstat (limited to 'subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/StronglyConnectedComponentsTest.java')
-rw-r--r-- | subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/StronglyConnectedComponentsTest.java | 261 |
1 files changed, 261 insertions, 0 deletions
diff --git a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/StronglyConnectedComponentsTest.java b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/StronglyConnectedComponentsTest.java new file mode 100644 index 00000000..37795ff3 --- /dev/null +++ b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/StronglyConnectedComponentsTest.java | |||
@@ -0,0 +1,261 @@ | |||
1 | /* | ||
2 | * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/> | ||
3 | * | ||
4 | * SPDX-License-Identifier: EPL-2.0 | ||
5 | */ | ||
6 | package tools.refinery.store.query.viatra; | ||
7 | |||
8 | import org.junit.jupiter.api.Test; | ||
9 | import tools.refinery.store.model.ModelStore; | ||
10 | import tools.refinery.store.query.ModelQueryAdapter; | ||
11 | import tools.refinery.store.query.dnf.Query; | ||
12 | import tools.refinery.store.query.literal.Connectivity; | ||
13 | import tools.refinery.store.query.literal.RepresentativeElectionLiteral; | ||
14 | import tools.refinery.store.query.view.AnySymbolView; | ||
15 | import tools.refinery.store.query.view.KeyOnlyView; | ||
16 | import tools.refinery.store.representation.Symbol; | ||
17 | import tools.refinery.store.tuple.Tuple; | ||
18 | |||
19 | import java.util.List; | ||
20 | import java.util.Map; | ||
21 | |||
22 | import static org.hamcrest.MatcherAssert.assertThat; | ||
23 | import static org.hamcrest.Matchers.is; | ||
24 | import static tools.refinery.store.query.viatra.tests.QueryAssertions.assertResults; | ||
25 | |||
26 | class StronglyConnectedComponentsTest { | ||
27 | private static final Symbol<Boolean> friend = Symbol.of("friend", 2); | ||
28 | private static final AnySymbolView friendView = new KeyOnlyView<>(friend); | ||
29 | |||
30 | @Test | ||
31 | void symbolViewTest() { | ||
32 | var query = Query.of("SymbolViewRepresentative", (builder, p1, p2) -> builder | ||
33 | .clause(v1 -> List.of( | ||
34 | new RepresentativeElectionLiteral(Connectivity.STRONG, friendView, p1, v1), | ||
35 | new RepresentativeElectionLiteral(Connectivity.STRONG, friendView, p2, v1) | ||
36 | ))); | ||
37 | |||
38 | var store = ModelStore.builder() | ||
39 | .symbols(friend) | ||
40 | .with(ViatraModelQueryAdapter.builder() | ||
41 | .queries(query)) | ||
42 | .build(); | ||
43 | |||
44 | var model = store.createEmptyModel(); | ||
45 | var friendInterpretation = model.getInterpretation(friend); | ||
46 | var queryEngine = model.getAdapter(ModelQueryAdapter.class); | ||
47 | var resultSet = queryEngine.getResultSet(query); | ||
48 | |||
49 | friendInterpretation.put(Tuple.of(0, 1), true); | ||
50 | friendInterpretation.put(Tuple.of(1, 0), true); | ||
51 | friendInterpretation.put(Tuple.of(1, 2), true); | ||
52 | queryEngine.flushChanges(); | ||
53 | |||
54 | assertResults(Map.of( | ||
55 | Tuple.of(0, 0), true, | ||
56 | Tuple.of(0, 1), true, | ||
57 | Tuple.of(1, 0), true, | ||
58 | Tuple.of(1, 1), true, | ||
59 | Tuple.of(2, 2), true | ||
60 | ), resultSet); | ||
61 | } | ||
62 | |||
63 | @Test | ||
64 | void symbolViewInsertTest() { | ||
65 | var query = Query.of("SymbolViewRepresentative", (builder, p1, p2) -> builder | ||
66 | .clause(v1 -> List.of( | ||
67 | new RepresentativeElectionLiteral(Connectivity.STRONG, friendView, p1, v1), | ||
68 | new RepresentativeElectionLiteral(Connectivity.STRONG, friendView, p2, v1) | ||
69 | ))); | ||
70 | |||
71 | var store = ModelStore.builder() | ||
72 | .symbols(friend) | ||
73 | .with(ViatraModelQueryAdapter.builder() | ||
74 | .queries(query)) | ||
75 | .build(); | ||
76 | |||
77 | var model = store.createEmptyModel(); | ||
78 | var friendInterpretation = model.getInterpretation(friend); | ||
79 | var queryEngine = model.getAdapter(ModelQueryAdapter.class); | ||
80 | var resultSet = queryEngine.getResultSet(query); | ||
81 | |||
82 | friendInterpretation.put(Tuple.of(0, 1), true); | ||
83 | friendInterpretation.put(Tuple.of(1, 0), true); | ||
84 | friendInterpretation.put(Tuple.of(1, 2), true); | ||
85 | queryEngine.flushChanges(); | ||
86 | |||
87 | friendInterpretation.put(Tuple.of(2, 0), true); | ||
88 | friendInterpretation.put(Tuple.of(0, 3), true); | ||
89 | queryEngine.flushChanges(); | ||
90 | |||
91 | assertResults(Map.of( | ||
92 | Tuple.of(0, 0), true, | ||
93 | Tuple.of(0, 1), true, | ||
94 | Tuple.of(0, 2), true, | ||
95 | Tuple.of(1, 1), true, | ||
96 | Tuple.of(1, 0), true, | ||
97 | Tuple.of(1, 2), true, | ||
98 | Tuple.of(2, 0), true, | ||
99 | Tuple.of(2, 1), true, | ||
100 | Tuple.of(2, 2), true, | ||
101 | Tuple.of(3, 3), true | ||
102 | ), resultSet); | ||
103 | } | ||
104 | |||
105 | @Test | ||
106 | void symbolViewDeleteTest() { | ||
107 | var query = Query.of("SymbolViewRepresentative", (builder, p1, p2) -> builder | ||
108 | .clause(v1 -> List.of( | ||
109 | new RepresentativeElectionLiteral(Connectivity.STRONG, friendView, p1, v1), | ||
110 | new RepresentativeElectionLiteral(Connectivity.STRONG, friendView, p2, v1) | ||
111 | ))); | ||
112 | |||
113 | var store = ModelStore.builder() | ||
114 | .symbols(friend) | ||
115 | .with(ViatraModelQueryAdapter.builder() | ||
116 | .queries(query)) | ||
117 | .build(); | ||
118 | |||
119 | var model = store.createEmptyModel(); | ||
120 | var friendInterpretation = model.getInterpretation(friend); | ||
121 | var queryEngine = model.getAdapter(ModelQueryAdapter.class); | ||
122 | var resultSet = queryEngine.getResultSet(query); | ||
123 | |||
124 | friendInterpretation.put(Tuple.of(0, 1), true); | ||
125 | friendInterpretation.put(Tuple.of(1, 0), true); | ||
126 | friendInterpretation.put(Tuple.of(1, 2), true); | ||
127 | queryEngine.flushChanges(); | ||
128 | |||
129 | friendInterpretation.put(Tuple.of(1, 0), false); | ||
130 | friendInterpretation.put(Tuple.of(1, 2), false); | ||
131 | queryEngine.flushChanges(); | ||
132 | |||
133 | assertResults(Map.of( | ||
134 | Tuple.of(0, 0), true, | ||
135 | Tuple.of(1, 1), true | ||
136 | ), resultSet); | ||
137 | } | ||
138 | |||
139 | @Test | ||
140 | void diagonalSymbolViewTest() { | ||
141 | var person = Symbol.of("Person", 1); | ||
142 | var personView = new KeyOnlyView<>(person); | ||
143 | |||
144 | var query = Query.of("SymbolViewRepresentative", (builder, p1) -> builder | ||
145 | .clause( | ||
146 | personView.call(p1), | ||
147 | new RepresentativeElectionLiteral(Connectivity.STRONG, friendView, p1, p1) | ||
148 | )); | ||
149 | |||
150 | var store = ModelStore.builder() | ||
151 | .symbols(person, friend) | ||
152 | .with(ViatraModelQueryAdapter.builder() | ||
153 | .queries(query)) | ||
154 | .build(); | ||
155 | |||
156 | var model = store.createEmptyModel(); | ||
157 | var personInterpretation = model.getInterpretation(person); | ||
158 | var friendInterpretation = model.getInterpretation(friend); | ||
159 | var queryEngine = model.getAdapter(ModelQueryAdapter.class); | ||
160 | var resultSet = queryEngine.getResultSet(query); | ||
161 | |||
162 | personInterpretation.put(Tuple.of(0), true); | ||
163 | personInterpretation.put(Tuple.of(1), true); | ||
164 | personInterpretation.put(Tuple.of(2), true); | ||
165 | |||
166 | friendInterpretation.put(Tuple.of(0, 1), true); | ||
167 | friendInterpretation.put(Tuple.of(1, 0), true); | ||
168 | friendInterpretation.put(Tuple.of(1, 2), true); | ||
169 | queryEngine.flushChanges(); | ||
170 | |||
171 | assertThat(resultSet.size(), is(2)); | ||
172 | assertThat(resultSet.get(Tuple.of(2)), is(true)); | ||
173 | } | ||
174 | |||
175 | @Test | ||
176 | void diagonalDnfTest() { | ||
177 | var person = Symbol.of("Person", 1); | ||
178 | var personView = new KeyOnlyView<>(person); | ||
179 | |||
180 | var subQuery = Query.of("SubQuery", (builder, p1, p2) -> builder | ||
181 | .clause( | ||
182 | personView.call(p1), | ||
183 | personView.call(p2), | ||
184 | friendView.call(p1, p2) | ||
185 | )) | ||
186 | .getDnf(); | ||
187 | var query = Query.of("SymbolViewRepresentative", (builder, p1) -> builder | ||
188 | .clause( | ||
189 | personView.call(p1), | ||
190 | new RepresentativeElectionLiteral(Connectivity.STRONG, subQuery, p1, p1) | ||
191 | )); | ||
192 | |||
193 | var store = ModelStore.builder() | ||
194 | .symbols(person, friend) | ||
195 | .with(ViatraModelQueryAdapter.builder() | ||
196 | .queries(query)) | ||
197 | .build(); | ||
198 | |||
199 | var model = store.createEmptyModel(); | ||
200 | var personInterpretation = model.getInterpretation(person); | ||
201 | var friendInterpretation = model.getInterpretation(friend); | ||
202 | var queryEngine = model.getAdapter(ModelQueryAdapter.class); | ||
203 | var resultSet = queryEngine.getResultSet(query); | ||
204 | |||
205 | personInterpretation.put(Tuple.of(0), true); | ||
206 | personInterpretation.put(Tuple.of(1), true); | ||
207 | personInterpretation.put(Tuple.of(2), true); | ||
208 | |||
209 | friendInterpretation.put(Tuple.of(0, 1), true); | ||
210 | friendInterpretation.put(Tuple.of(1, 0), true); | ||
211 | friendInterpretation.put(Tuple.of(1, 2), true); | ||
212 | queryEngine.flushChanges(); | ||
213 | |||
214 | assertThat(resultSet.size(), is(2)); | ||
215 | assertThat(resultSet.get(Tuple.of(2)), is(true)); | ||
216 | } | ||
217 | |||
218 | @Test | ||
219 | void loopTest() { | ||
220 | var query = Query.of("SymbolViewRepresentative", (builder, p1, p2) -> builder | ||
221 | .clause(v1 -> List.of( | ||
222 | new RepresentativeElectionLiteral(Connectivity.STRONG, friendView, p1, v1), | ||
223 | new RepresentativeElectionLiteral(Connectivity.STRONG, friendView, p2, v1) | ||
224 | ))); | ||
225 | |||
226 | var store = ModelStore.builder() | ||
227 | .symbols(friend) | ||
228 | .with(ViatraModelQueryAdapter.builder() | ||
229 | .queries(query)) | ||
230 | .build(); | ||
231 | |||
232 | var model = store.createEmptyModel(); | ||
233 | var friendInterpretation = model.getInterpretation(friend); | ||
234 | var queryEngine = model.getAdapter(ModelQueryAdapter.class); | ||
235 | var resultSet = queryEngine.getResultSet(query); | ||
236 | |||
237 | friendInterpretation.put(Tuple.of(0, 1), true); | ||
238 | friendInterpretation.put(Tuple.of(1, 2), true); | ||
239 | friendInterpretation.put(Tuple.of(2, 3), true); | ||
240 | friendInterpretation.put(Tuple.of(3, 0), true); | ||
241 | friendInterpretation.put(Tuple.of(3, 4), true); | ||
242 | queryEngine.flushChanges(); | ||
243 | |||
244 | assertThat(resultSet.get(Tuple.of(0, 1)), is(true)); | ||
245 | assertThat(resultSet.get(Tuple.of(1, 2)), is(true)); | ||
246 | assertThat(resultSet.get(Tuple.of(2, 3)), is(true)); | ||
247 | assertThat(resultSet.get(Tuple.of(3, 0)), is(true)); | ||
248 | assertThat(resultSet.get(Tuple.of(3, 4)), is(false)); | ||
249 | |||
250 | friendInterpretation.put(Tuple.of(2, 3), false); | ||
251 | queryEngine.flushChanges(); | ||
252 | |||
253 | assertThat(resultSet.get(Tuple.of(0, 1)), is(false)); | ||
254 | assertThat(resultSet.get(Tuple.of(0, 2)), is(false)); | ||
255 | assertThat(resultSet.get(Tuple.of(0, 3)), is(false)); | ||
256 | assertThat(resultSet.get(Tuple.of(1, 2)), is(false)); | ||
257 | assertThat(resultSet.get(Tuple.of(2, 3)), is(false)); | ||
258 | assertThat(resultSet.get(Tuple.of(3, 0)), is(false)); | ||
259 | assertThat(resultSet.get(Tuple.of(3, 4)), is(false)); | ||
260 | } | ||
261 | } | ||