diff options
Diffstat (limited to 'subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/WeaklyConnectedComponentsTest.java')
-rw-r--r-- | subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/WeaklyConnectedComponentsTest.java | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/WeaklyConnectedComponentsTest.java b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/WeaklyConnectedComponentsTest.java new file mode 100644 index 00000000..613d4284 --- /dev/null +++ b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/viatra/WeaklyConnectedComponentsTest.java | |||
@@ -0,0 +1,188 @@ | |||
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 WeaklyConnectedComponentsTest { | ||
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.WEAK, friendView, p1, v1), | ||
35 | new RepresentativeElectionLiteral(Connectivity.WEAK, 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(2, 3), 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 | Tuple.of(2, 3), true, | ||
61 | Tuple.of(3, 2), true, | ||
62 | Tuple.of(3, 3), true | ||
63 | ), resultSet); | ||
64 | } | ||
65 | |||
66 | @Test | ||
67 | void symbolViewUpdateTest() { | ||
68 | var query = Query.of("SymbolViewRepresentative", (builder, p1, p2) -> builder | ||
69 | .clause(v1 -> List.of( | ||
70 | new RepresentativeElectionLiteral(Connectivity.WEAK, friendView, p1, v1), | ||
71 | new RepresentativeElectionLiteral(Connectivity.WEAK, friendView, p2, v1) | ||
72 | ))); | ||
73 | |||
74 | var store = ModelStore.builder() | ||
75 | .symbols(friend) | ||
76 | .with(ViatraModelQueryAdapter.builder() | ||
77 | .queries(query)) | ||
78 | .build(); | ||
79 | |||
80 | var model = store.createEmptyModel(); | ||
81 | var friendInterpretation = model.getInterpretation(friend); | ||
82 | var queryEngine = model.getAdapter(ModelQueryAdapter.class); | ||
83 | var resultSet = queryEngine.getResultSet(query); | ||
84 | |||
85 | friendInterpretation.put(Tuple.of(0, 1), true); | ||
86 | friendInterpretation.put(Tuple.of(1, 0), true); | ||
87 | friendInterpretation.put(Tuple.of(2, 3), true); | ||
88 | queryEngine.flushChanges(); | ||
89 | |||
90 | friendInterpretation.put(Tuple.of(2, 3), false); | ||
91 | friendInterpretation.put(Tuple.of(1, 0), false); | ||
92 | friendInterpretation.put(Tuple.of(1, 2), true); | ||
93 | queryEngine.flushChanges(); | ||
94 | |||
95 | assertResults(Map.of( | ||
96 | Tuple.of(0, 0), true, | ||
97 | Tuple.of(0, 1), true, | ||
98 | Tuple.of(0, 2), true, | ||
99 | Tuple.of(1, 0), true, | ||
100 | Tuple.of(1, 1), true, | ||
101 | Tuple.of(1, 2), true, | ||
102 | Tuple.of(2, 0), true, | ||
103 | Tuple.of(2, 1), true, | ||
104 | Tuple.of(2, 2), true | ||
105 | ), resultSet); | ||
106 | } | ||
107 | |||
108 | @Test | ||
109 | void diagonalSymbolViewTest() { | ||
110 | var person = Symbol.of("Person", 1); | ||
111 | var personView = new KeyOnlyView<>(person); | ||
112 | |||
113 | var query = Query.of("SymbolViewRepresentative", (builder, p1) -> builder | ||
114 | .clause( | ||
115 | personView.call(p1), | ||
116 | new RepresentativeElectionLiteral(Connectivity.WEAK, friendView, p1, p1) | ||
117 | )); | ||
118 | |||
119 | var store = ModelStore.builder() | ||
120 | .symbols(person, friend) | ||
121 | .with(ViatraModelQueryAdapter.builder() | ||
122 | .queries(query)) | ||
123 | .build(); | ||
124 | |||
125 | var model = store.createEmptyModel(); | ||
126 | var personInterpretation = model.getInterpretation(person); | ||
127 | var friendInterpretation = model.getInterpretation(friend); | ||
128 | var queryEngine = model.getAdapter(ModelQueryAdapter.class); | ||
129 | var resultSet = queryEngine.getResultSet(query); | ||
130 | |||
131 | personInterpretation.put(Tuple.of(0), true); | ||
132 | personInterpretation.put(Tuple.of(1), true); | ||
133 | personInterpretation.put(Tuple.of(2), true); | ||
134 | personInterpretation.put(Tuple.of(3), true); | ||
135 | |||
136 | friendInterpretation.put(Tuple.of(0, 1), true); | ||
137 | friendInterpretation.put(Tuple.of(1, 0), true); | ||
138 | friendInterpretation.put(Tuple.of(2, 3), true); | ||
139 | queryEngine.flushChanges(); | ||
140 | |||
141 | assertThat(resultSet.size(), is(2)); | ||
142 | assertThat(resultSet.get(Tuple.of(2)), is(true)); | ||
143 | } | ||
144 | |||
145 | @Test | ||
146 | void diagonalDnfTest() { | ||
147 | var person = Symbol.of("Person", 1); | ||
148 | var personView = new KeyOnlyView<>(person); | ||
149 | |||
150 | var subQuery = Query.of("SubQuery", (builder, p1, p2) -> builder | ||
151 | .clause( | ||
152 | personView.call(p1), | ||
153 | personView.call(p2), | ||
154 | friendView.call(p1, p2) | ||
155 | )) | ||
156 | .getDnf(); | ||
157 | var query = Query.of("SymbolViewRepresentative", (builder, p1) -> builder | ||
158 | .clause( | ||
159 | personView.call(p1), | ||
160 | new RepresentativeElectionLiteral(Connectivity.WEAK, subQuery, p1, p1) | ||
161 | )); | ||
162 | |||
163 | var store = ModelStore.builder() | ||
164 | .symbols(person, friend) | ||
165 | .with(ViatraModelQueryAdapter.builder() | ||
166 | .queries(query)) | ||
167 | .build(); | ||
168 | |||
169 | var model = store.createEmptyModel(); | ||
170 | var personInterpretation = model.getInterpretation(person); | ||
171 | var friendInterpretation = model.getInterpretation(friend); | ||
172 | var queryEngine = model.getAdapter(ModelQueryAdapter.class); | ||
173 | var resultSet = queryEngine.getResultSet(query); | ||
174 | |||
175 | personInterpretation.put(Tuple.of(0), true); | ||
176 | personInterpretation.put(Tuple.of(1), true); | ||
177 | personInterpretation.put(Tuple.of(2), true); | ||
178 | personInterpretation.put(Tuple.of(3), true); | ||
179 | |||
180 | friendInterpretation.put(Tuple.of(0, 1), true); | ||
181 | friendInterpretation.put(Tuple.of(1, 0), true); | ||
182 | friendInterpretation.put(Tuple.of(2, 3), true); | ||
183 | queryEngine.flushChanges(); | ||
184 | |||
185 | assertThat(resultSet.size(), is(2)); | ||
186 | assertThat(resultSet.get(Tuple.of(2)), is(true)); | ||
187 | } | ||
188 | } | ||