aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/store-dse
diff options
context:
space:
mode:
authorLibravatar OszkarSemerath <semerath@mit.bme.hu>2023-09-05 07:59:17 +0200
committerLibravatar OszkarSemerath <semerath@mit.bme.hu>2023-09-05 14:16:55 +0200
commita00a2a961accd8ebbe34c3c1e50b6fa782e86ca4 (patch)
tree677d5d1b75f9c4781b225ea53b5a8de8a49e9342 /subprojects/store-dse
parentrestructured DSE framework, failing build (diff)
downloadrefinery-a00a2a961accd8ebbe34c3c1e50b6fa782e86ca4.tar.gz
refinery-a00a2a961accd8ebbe34c3c1e50b6fa782e86ca4.tar.zst
refinery-a00a2a961accd8ebbe34c3c1e50b6fa782e86ca4.zip
restructured DSE framework, failing build
Diffstat (limited to 'subprojects/store-dse')
-rw-r--r--subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/CompleteEquivalenceClassStore.java7
-rw-r--r--subprojects/store-dse/src/test/java/tools/refinery/store/dse/CRAExamplesTest.java289
-rw-r--r--subprojects/store-dse/src/test/java/tools/refinery/store/dse/DebugTest.java181
-rw-r--r--subprojects/store-dse/src/test/java/tools/refinery/store/dse/DesignSpaceExplorationTest.java1128
-rw-r--r--subprojects/store-dse/src/test/java/tools/refinery/store/dse/TransformationRuleTest.java808
5 files changed, 1188 insertions, 1225 deletions
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/CompleteEquivalenceClassStore.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/CompleteEquivalenceClassStore.java
index 1555c3be..925e09a3 100644
--- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/CompleteEquivalenceClassStore.java
+++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/CompleteEquivalenceClassStore.java
@@ -7,9 +7,6 @@ package tools.refinery.store.dse.transition.statespace.internal;
7 7
8import org.eclipse.collections.impl.map.mutable.primitive.IntObjectHashMap; 8import org.eclipse.collections.impl.map.mutable.primitive.IntObjectHashMap;
9import tools.refinery.store.dse.transition.VersionWithObjectiveValue; 9import tools.refinery.store.dse.transition.VersionWithObjectiveValue;
10import tools.refinery.store.dse.transition.statespace.ActivationStore;
11import tools.refinery.store.dse.transition.statespace.ObjectivePriorityQueue;
12import tools.refinery.store.dse.transition.statespace.SolutionStore;
13import tools.refinery.store.dse.transition.statespace.EquivalenceClassStore; 10import tools.refinery.store.dse.transition.statespace.EquivalenceClassStore;
14import tools.refinery.store.statecoding.StateCoderResult; 11import tools.refinery.store.statecoding.StateCoderResult;
15import tools.refinery.store.statecoding.StateCoderStoreAdapter; 12import tools.refinery.store.statecoding.StateCoderStoreAdapter;
@@ -68,8 +65,8 @@ public abstract class CompleteEquivalenceClassStore extends AbstractEquivalenceC
68 if (unresolvedSimilarity == null) { 65 if (unresolvedSimilarity == null) {
69 return; 66 return;
70 } 67 }
71 var outcome = this.stateCoderStoreAdapter.checkEquivalence(unresolvedSimilarity.get(0), 68 var outcome = this.stateCoderStoreAdapter.checkEquivalence(unresolvedSimilarity.get(0).version(),
72 unresolvedSimilarity.get(1)); 69 unresolvedSimilarity.get(1).version());
73 if (outcome != StateEquivalenceChecker.EquivalenceResult.ISOMORPHIC) { 70 if (outcome != StateEquivalenceChecker.EquivalenceResult.ISOMORPHIC) {
74 delegate(unresolvedSimilarity.get(1), unresolvedSimilarity.activationSizes, unresolvedSimilarity.accept); 71 delegate(unresolvedSimilarity.get(1), unresolvedSimilarity.activationSizes, unresolvedSimilarity.accept);
75 } 72 }
diff --git a/subprojects/store-dse/src/test/java/tools/refinery/store/dse/CRAExamplesTest.java b/subprojects/store-dse/src/test/java/tools/refinery/store/dse/CRAExamplesTest.java
index b0b416e1..36517709 100644
--- a/subprojects/store-dse/src/test/java/tools/refinery/store/dse/CRAExamplesTest.java
+++ b/subprojects/store-dse/src/test/java/tools/refinery/store/dse/CRAExamplesTest.java
@@ -5,29 +5,20 @@
5 */ 5 */
6package tools.refinery.store.dse; 6package tools.refinery.store.dse;
7 7
8import org.junit.jupiter.api.Disabled; 8import tools.refinery.store.dse.transition.TransformationRule;
9import org.junit.jupiter.api.Test;
10import tools.refinery.store.dse.objectives.AlwaysSatisfiedRandomHardObjective;
11import tools.refinery.store.dse.transition.DesignSpaceExplorationAdapter;
12import tools.refinery.store.model.ModelStore;
13import tools.refinery.store.query.ModelQueryAdapter;
14import tools.refinery.store.query.dnf.Query; 9import tools.refinery.store.query.dnf.Query;
15import tools.refinery.store.query.dnf.RelationalQuery; 10import tools.refinery.store.query.dnf.RelationalQuery;
16import tools.refinery.store.dse.transition.TransformationRule;
17import tools.refinery.store.dse.strategy.BestFirstStrategy;
18import tools.refinery.store.query.viatra.ViatraModelQueryAdapter;
19import tools.refinery.store.query.view.AnySymbolView; 11import tools.refinery.store.query.view.AnySymbolView;
20import tools.refinery.store.query.view.KeyOnlyView; 12import tools.refinery.store.query.view.KeyOnlyView;
21import tools.refinery.store.representation.Symbol; 13import tools.refinery.store.representation.Symbol;
22import tools.refinery.store.tuple.Tuple; 14import tools.refinery.store.tuple.Tuple;
23import tools.refinery.visualization.ModelVisualizerAdapter;
24import tools.refinery.visualization.internal.FileFormat;
25 15
26import java.util.List; 16import java.util.List;
27 17
28import static tools.refinery.store.query.literal.Literals.not; 18import static tools.refinery.store.query.literal.Literals.not;
29 19
30class CRAExamplesTest { 20class CRAExamplesTest {
21
31 private static final Symbol<String> name = Symbol.of("Name", 1, String.class); 22 private static final Symbol<String> name = Symbol.of("Name", 1, String.class);
32 23
33// private static final Symbol<Boolean> classModel = Symbol.of("ClassModel", 1); 24// private static final Symbol<Boolean> classModel = Symbol.of("ClassModel", 1);
@@ -130,42 +121,42 @@ class CRAExamplesTest {
130 }); 121 });
131 }); 122 });
132 123
133 private static final TransformationRule deleteEmptyClassRule = new TransformationRule("DeleteEmptyClass", 124// private static final TransformationRule deleteEmptyClassRule = new TransformationRule("DeleteEmptyClass",
134 deleteEmptyClassPrecondition, 125// deleteEmptyClassPrecondition,
135 (model) -> { 126// (model) -> {
136// var classesInterpretation = model.getInterpretation(classes); 127//// var classesInterpretation = model.getInterpretation(classes);
137 var classElementInterpretation = model.getInterpretation(classElement); 128// var classElementInterpretation = model.getInterpretation(classElement);
138 return ((Tuple activation) -> { 129// return ((Tuple activation) -> {
139 // TODO: can we move dseAdapter outside? 130// // TODO: can we move dseAdapter outside?
140 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); 131// var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
141// var modelElement = activation.get(0); 132//// var modelElement = activation.get(0);
142 var classElement = activation.get(0); 133// var classElement = activation.get(0);
143 134//
144// classesInterpretation.put(Tuple.of(modelElement, classElement), false); 135//// classesInterpretation.put(Tuple.of(modelElement, classElement), false);
145 classElementInterpretation.put(Tuple.of(classElement), false); 136// classElementInterpretation.put(Tuple.of(classElement), false);
146 dseAdapter.deleteObject(Tuple.of(classElement)); 137// dseAdapter.deleteObject(Tuple.of(classElement));
147 }); 138// });
148 }); 139// });
149 140
150 private static final TransformationRule createClassRule = new TransformationRule("CreateClass", 141// private static final TransformationRule createClassRule = new TransformationRule("CreateClass",
151 createClassPrecondition, 142// createClassPrecondition,
152 (model) -> { 143// (model) -> {
153 var classElementInterpretation = model.getInterpretation(classElement); 144// var classElementInterpretation = model.getInterpretation(classElement);
154// var classesInterpretation = model.getInterpretation(classes); 145//// var classesInterpretation = model.getInterpretation(classes);
155 var encapsulatesInterpretation = model.getInterpretation(encapsulates); 146// var encapsulatesInterpretation = model.getInterpretation(encapsulates);
156 return ((Tuple activation) -> { 147// return ((Tuple activation) -> {
157 // TODO: can we move dseAdapter outside? 148// // TODO: can we move dseAdapter outside?
158 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); 149// var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
159// var modelElement = activation.get(0); 150//// var modelElement = activation.get(0);
160 var feature = activation.get(0); 151// var feature = activation.get(0);
161 152//
162 var newClassElement = dseAdapter.createObject(); 153// var newClassElement = dseAdapter.createObject();
163 var newClassElementId = newClassElement.get(0); 154// var newClassElementId = newClassElement.get(0);
164 classElementInterpretation.put(newClassElement, true); 155// classElementInterpretation.put(newClassElement, true);
165// classesInterpretation.put(Tuple.of(modelElement, newClassElementId), true); 156//// classesInterpretation.put(Tuple.of(modelElement, newClassElementId), true);
166 encapsulatesInterpretation.put(Tuple.of(newClassElementId, feature), true); 157// encapsulatesInterpretation.put(Tuple.of(newClassElementId, feature), true);
167 }); 158// });
168 }); 159// });
169 160
170 private static final TransformationRule moveFeatureRule = new TransformationRule("MoveFeature", 161 private static final TransformationRule moveFeatureRule = new TransformationRule("MoveFeature",
171 moveFeaturePrecondition, 162 moveFeaturePrecondition,
@@ -181,106 +172,106 @@ class CRAExamplesTest {
181 }); 172 });
182 }); 173 });
183 174
184 @Test 175// @Test
185 @Disabled("This test is only for debugging purposes") 176// @Disabled("This test is only for debugging purposes")
186 void craTest() { 177// void craTest() {
187 var store = ModelStore.builder() 178// var store = ModelStore.builder()
188 .symbols(classElement, encapsulates, classes, features, attribute, method, dataDependency, 179// .symbols(classElement, encapsulates, classes, features, attribute, method, dataDependency,
189 functionalDependency, name) 180// functionalDependency, name)
190 .with(ViatraModelQueryAdapter.builder() 181// .with(ViatraModelQueryAdapter.builder()
191 .queries(feature, assignFeaturePreconditionHelper, assignFeaturePrecondition, 182// .queries(feature, assignFeaturePreconditionHelper, assignFeaturePrecondition,
192 deleteEmptyClassPrecondition, createClassPreconditionHelper, createClassPrecondition, 183// deleteEmptyClassPrecondition, createClassPreconditionHelper, createClassPrecondition,
193 moveFeaturePrecondition)) 184// moveFeaturePrecondition))
194 .with(ModelVisualizerAdapter.builder() 185// .with(ModelVisualizerAdapter.builder()
195 .withOutputpath("test_output") 186// .withOutputpath("test_output")
196 .withFormat(FileFormat.DOT) 187// .withFormat(FileFormat.DOT)
197 .withFormat(FileFormat.SVG) 188// .withFormat(FileFormat.SVG)
198 .saveStates() 189// .saveStates()
199 .saveDesignSpace() 190// .saveDesignSpace()
200 ) 191// )
201 .with(DesignSpaceExplorationAdapter.builder() 192// .with(DesignSpaceExplorationAdapter.builder()
202 .transformations(assignFeatureRule, deleteEmptyClassRule, createClassRule, moveFeatureRule) 193// .transformations(assignFeatureRule, deleteEmptyClassRule, createClassRule, moveFeatureRule)
203 .objectives(new AlwaysSatisfiedRandomHardObjective()) 194// .objectives(new AlwaysSatisfiedRandomHardObjective())
204// .strategy(new DepthFirstStrategy().withDepthLimit(3).continueIfHardObjectivesFulfilled() 195//// .strategy(new DepthFirstStrategy().withDepthLimit(3).continueIfHardObjectivesFulfilled()
205 .strategy(new BestFirstStrategy().withDepthLimit(6).continueIfHardObjectivesFulfilled() 196// .strategy(new BestFirstStrategy().withDepthLimit(6).continueIfHardObjectivesFulfilled()
206// .goOnOnlyIfFitnessIsBetter() 197//// .goOnOnlyIfFitnessIsBetter()
207 )) 198// ))
208 .build(); 199// .build();
209 200//
210 var model = store.createEmptyModel(); 201// var model = store.createEmptyModel();
211 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); 202// var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
212// dseAdapter.setRandom(1); 203//// dseAdapter.setRandom(1);
213 var queryEngine = model.getAdapter(ModelQueryAdapter.class); 204// var queryEngine = model.getAdapter(ModelQueryAdapter.class);
214 205//
215// var modelInterpretation = model.getInterpretation(classModel); 206//// var modelInterpretation = model.getInterpretation(classModel);
216 var nameInterpretation = model.getInterpretation(name); 207// var nameInterpretation = model.getInterpretation(name);
217 var methodInterpretation = model.getInterpretation(method); 208// var methodInterpretation = model.getInterpretation(method);
218 var attributeInterpretation = model.getInterpretation(attribute); 209// var attributeInterpretation = model.getInterpretation(attribute);
219 var dataDependencyInterpretation = model.getInterpretation(dataDependency); 210// var dataDependencyInterpretation = model.getInterpretation(dataDependency);
220 var functionalDependencyInterpretation = model.getInterpretation(functionalDependency); 211// var functionalDependencyInterpretation = model.getInterpretation(functionalDependency);
221 212//
222// var modelElement = dseAdapter.createObject(); 213//// var modelElement = dseAdapter.createObject();
223 var method1 = dseAdapter.createObject(); 214// var method1 = dseAdapter.createObject();
224 var method1Id = method1.get(0); 215// var method1Id = method1.get(0);
225 var method2 = dseAdapter.createObject(); 216// var method2 = dseAdapter.createObject();
226 var method2Id = method2.get(0); 217// var method2Id = method2.get(0);
227 var method3 = dseAdapter.createObject(); 218// var method3 = dseAdapter.createObject();
228 var method3Id = method3.get(0); 219// var method3Id = method3.get(0);
229 var method4 = dseAdapter.createObject(); 220// var method4 = dseAdapter.createObject();
230 var method4Id = method4.get(0); 221// var method4Id = method4.get(0);
231 var attribute1 = dseAdapter.createObject(); 222// var attribute1 = dseAdapter.createObject();
232 var attribute1Id = attribute1.get(0); 223// var attribute1Id = attribute1.get(0);
233 var attribute2 = dseAdapter.createObject(); 224// var attribute2 = dseAdapter.createObject();
234 var attribute2Id = attribute2.get(0); 225// var attribute2Id = attribute2.get(0);
235 var attribute3 = dseAdapter.createObject(); 226// var attribute3 = dseAdapter.createObject();
236 var attribute3Id = attribute3.get(0); 227// var attribute3Id = attribute3.get(0);
237 var attribute4 = dseAdapter.createObject(); 228// var attribute4 = dseAdapter.createObject();
238 var attribute4Id = attribute4.get(0); 229// var attribute4Id = attribute4.get(0);
239 var attribute5 = dseAdapter.createObject(); 230// var attribute5 = dseAdapter.createObject();
240 var attribute5Id = attribute5.get(0); 231// var attribute5Id = attribute5.get(0);
241 232//
242 nameInterpretation.put(method1, "M1"); 233// nameInterpretation.put(method1, "M1");
243 nameInterpretation.put(method2, "M2"); 234// nameInterpretation.put(method2, "M2");
244 nameInterpretation.put(method3, "M3"); 235// nameInterpretation.put(method3, "M3");
245 nameInterpretation.put(method4, "M4"); 236// nameInterpretation.put(method4, "M4");
246 nameInterpretation.put(attribute1, "A1"); 237// nameInterpretation.put(attribute1, "A1");
247 nameInterpretation.put(attribute2, "A2"); 238// nameInterpretation.put(attribute2, "A2");
248 nameInterpretation.put(attribute3, "A3"); 239// nameInterpretation.put(attribute3, "A3");
249 nameInterpretation.put(attribute4, "A4"); 240// nameInterpretation.put(attribute4, "A4");
250 nameInterpretation.put(attribute5, "A5"); 241// nameInterpretation.put(attribute5, "A5");
251 242//
252 243//
253 244//
254// modelInterpretation.put(modelElement, true); 245//// modelInterpretation.put(modelElement, true);
255 methodInterpretation.put(method1, true); 246// methodInterpretation.put(method1, true);
256 methodInterpretation.put(method2, true); 247// methodInterpretation.put(method2, true);
257 methodInterpretation.put(method3, true); 248// methodInterpretation.put(method3, true);
258 methodInterpretation.put(method4, true); 249// methodInterpretation.put(method4, true);
259 attributeInterpretation.put(attribute1, true); 250// attributeInterpretation.put(attribute1, true);
260 attributeInterpretation.put(attribute2, true); 251// attributeInterpretation.put(attribute2, true);
261 attributeInterpretation.put(attribute3, true); 252// attributeInterpretation.put(attribute3, true);
262 attributeInterpretation.put(attribute4, true); 253// attributeInterpretation.put(attribute4, true);
263 attributeInterpretation.put(attribute5, true); 254// attributeInterpretation.put(attribute5, true);
264 255//
265 dataDependencyInterpretation.put(Tuple.of(method1Id, attribute1Id), true); 256// dataDependencyInterpretation.put(Tuple.of(method1Id, attribute1Id), true);
266 dataDependencyInterpretation.put(Tuple.of(method1Id, attribute3Id), true); 257// dataDependencyInterpretation.put(Tuple.of(method1Id, attribute3Id), true);
267 dataDependencyInterpretation.put(Tuple.of(method2Id, attribute2Id), true); 258// dataDependencyInterpretation.put(Tuple.of(method2Id, attribute2Id), true);
268 dataDependencyInterpretation.put(Tuple.of(method3Id, attribute3Id), true); 259// dataDependencyInterpretation.put(Tuple.of(method3Id, attribute3Id), true);
269 dataDependencyInterpretation.put(Tuple.of(method3Id, attribute4Id), true); 260// dataDependencyInterpretation.put(Tuple.of(method3Id, attribute4Id), true);
270 dataDependencyInterpretation.put(Tuple.of(method4Id, attribute3Id), true); 261// dataDependencyInterpretation.put(Tuple.of(method4Id, attribute3Id), true);
271 dataDependencyInterpretation.put(Tuple.of(method4Id, attribute5Id), true); 262// dataDependencyInterpretation.put(Tuple.of(method4Id, attribute5Id), true);
272 263//
273 functionalDependencyInterpretation.put(Tuple.of(method1Id, attribute3Id), true); 264// functionalDependencyInterpretation.put(Tuple.of(method1Id, attribute3Id), true);
274 functionalDependencyInterpretation.put(Tuple.of(method1Id, attribute4Id), true); 265// functionalDependencyInterpretation.put(Tuple.of(method1Id, attribute4Id), true);
275 functionalDependencyInterpretation.put(Tuple.of(method2Id, attribute1Id), true); 266// functionalDependencyInterpretation.put(Tuple.of(method2Id, attribute1Id), true);
276 functionalDependencyInterpretation.put(Tuple.of(method3Id, attribute1Id), true); 267// functionalDependencyInterpretation.put(Tuple.of(method3Id, attribute1Id), true);
277 functionalDependencyInterpretation.put(Tuple.of(method3Id, attribute4Id), true); 268// functionalDependencyInterpretation.put(Tuple.of(method3Id, attribute4Id), true);
278 functionalDependencyInterpretation.put(Tuple.of(method4Id, attribute2Id), true); 269// functionalDependencyInterpretation.put(Tuple.of(method4Id, attribute2Id), true);
279 270//
280 queryEngine.flushChanges(); 271// queryEngine.flushChanges();
281 272//
282 var states = dseAdapter.explore(); 273// var states = dseAdapter.explore();
283 System.out.println("states size: " + states.size()); 274// System.out.println("states size: " + states.size());
284 } 275// }
285*/ 276//*/
286} 277}
diff --git a/subprojects/store-dse/src/test/java/tools/refinery/store/dse/DebugTest.java b/subprojects/store-dse/src/test/java/tools/refinery/store/dse/DebugTest.java
index 461d9353..1d757a5f 100644
--- a/subprojects/store-dse/src/test/java/tools/refinery/store/dse/DebugTest.java
+++ b/subprojects/store-dse/src/test/java/tools/refinery/store/dse/DebugTest.java
@@ -5,22 +5,9 @@
5 */ 5 */
6package tools.refinery.store.dse; 6package tools.refinery.store.dse;
7 7
8import org.junit.jupiter.api.Disabled;
9import org.junit.jupiter.api.Test;
10import tools.refinery.store.dse.objectives.AlwaysSatisfiedRandomHardObjective;
11import tools.refinery.store.dse.transition.DesignSpaceExplorationAdapter;
12import tools.refinery.store.model.ModelStore;
13import tools.refinery.store.query.ModelQueryAdapter;
14import tools.refinery.store.query.dnf.Query;
15import tools.refinery.store.dse.transition.TransformationRule;
16import tools.refinery.store.dse.strategy.DepthFirstStrategy;
17import tools.refinery.store.query.viatra.ViatraModelQueryAdapter;
18import tools.refinery.store.query.view.AnySymbolView; 8import tools.refinery.store.query.view.AnySymbolView;
19import tools.refinery.store.query.view.KeyOnlyView; 9import tools.refinery.store.query.view.KeyOnlyView;
20import tools.refinery.store.representation.Symbol; 10import tools.refinery.store.representation.Symbol;
21import tools.refinery.store.tuple.Tuple;
22import tools.refinery.visualization.ModelVisualizerAdapter;
23import tools.refinery.visualization.internal.FileFormat;
24 11
25class DebugTest { 12class DebugTest {
26 private static final Symbol<Boolean> classModel = Symbol.of("ClassModel", 1); 13 private static final Symbol<Boolean> classModel = Symbol.of("ClassModel", 1);
@@ -42,88 +29,88 @@ class DebugTest {
42 private static final AnySymbolView classesView = new KeyOnlyView<>(classes); 29 private static final AnySymbolView classesView = new KeyOnlyView<>(classes);
43 30
44 31
45 @Test 32// @Test
46 @Disabled("This test is only for debugging purposes") 33// @Disabled("This test is only for debugging purposes")
47 void BFSTest() { 34// void BFSTest() {
48 var createClassPrecondition = Query.of("CreateClassPrecondition", 35// var createClassPrecondition = Query.of("CreateClassPrecondition",
49 (builder, model) -> builder.clause( 36// (builder, model) -> builder.clause(
50 classModelView.call(model) 37// classModelView.call(model)
51 )); 38// ));
52 39//
53 var createClassRule = new TransformationRule("CreateClass", 40// var createClassRule = new TransformationRule("CreateClass",
54 createClassPrecondition, 41// createClassPrecondition,
55 (model) -> { 42// (model) -> {
56 var classesInterpretation = model.getInterpretation(classes); 43// var classesInterpretation = model.getInterpretation(classes);
57 var classElementInterpretation = model.getInterpretation(classElement); 44// var classElementInterpretation = model.getInterpretation(classElement);
58 return ((Tuple activation) -> { 45// return ((Tuple activation) -> {
59 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); 46// var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
60 var modelElement = activation.get(0); 47// var modelElement = activation.get(0);
61 48//
62 var newClassElement = dseAdapter.createObject(); 49// var newClassElement = dseAdapter.createObject();
63 var newClassElementId = newClassElement.get(0); 50// var newClassElementId = newClassElement.get(0);
64 51//
65 classesInterpretation.put(Tuple.of(modelElement, newClassElementId), true); 52// classesInterpretation.put(Tuple.of(modelElement, newClassElementId), true);
66 classElementInterpretation.put(Tuple.of(newClassElementId), true); 53// classElementInterpretation.put(Tuple.of(newClassElementId), true);
67 }); 54// });
68 }); 55// });
69 56//
70 var createFeaturePrecondition = Query.of("CreateFeaturePrecondition", 57// var createFeaturePrecondition = Query.of("CreateFeaturePrecondition",
71 (builder, model) -> builder.clause( 58// (builder, model) -> builder.clause(
72 classModelView.call(model) 59// classModelView.call(model)
73 )); 60// ));
74 61//
75 var createFeatureRule = new TransformationRule("CreateFeature", 62// var createFeatureRule = new TransformationRule("CreateFeature",
76 createFeaturePrecondition, 63// createFeaturePrecondition,
77 (model) -> { 64// (model) -> {
78 var featuresInterpretation = model.getInterpretation(features); 65// var featuresInterpretation = model.getInterpretation(features);
79 var featureInterpretation = model.getInterpretation(feature); 66// var featureInterpretation = model.getInterpretation(feature);
80 return ((Tuple activation) -> { 67// return ((Tuple activation) -> {
81 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); 68// var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
82 var modelElement = activation.get(0); 69// var modelElement = activation.get(0);
83 70//
84 var newClassElement = dseAdapter.createObject(); 71// var newClassElement = dseAdapter.createObject();
85 var newClassElementId = newClassElement.get(0); 72// var newClassElementId = newClassElement.get(0);
86 73//
87 featuresInterpretation.put(Tuple.of(modelElement, newClassElementId), true); 74// featuresInterpretation.put(Tuple.of(modelElement, newClassElementId), true);
88 featureInterpretation.put(Tuple.of(newClassElementId), true); 75// featureInterpretation.put(Tuple.of(newClassElementId), true);
89 }); 76// });
90 }); 77// });
91 78//
92 var store = ModelStore.builder() 79// var store = ModelStore.builder()
93 .symbols(classModel, classElement, feature, isEncapsulatedBy, encapsulates, classes, features) 80// .symbols(classModel, classElement, feature, isEncapsulatedBy, encapsulates, classes, features)
94 .with(ViatraModelQueryAdapter.builder() 81// .with(ViatraModelQueryAdapter.builder()
95 .queries(createClassPrecondition, createFeaturePrecondition)) 82// .queries(createClassPrecondition, createFeaturePrecondition))
96 .with(ModelVisualizerAdapter.builder() 83// .with(ModelVisualizerAdapter.builder()
97 .withOutputpath("test_output") 84// .withOutputpath("test_output")
98 .withFormat(FileFormat.DOT) 85// .withFormat(FileFormat.DOT)
99 .withFormat(FileFormat.SVG) 86// .withFormat(FileFormat.SVG)
100 .saveStates() 87// .saveStates()
101 .saveDesignSpace() 88// .saveDesignSpace()
102 ) 89// )
103 .with(DesignSpaceExplorationAdapter.builder() 90// .with(DesignSpaceExplorationAdapter.builder()
104 .transformations(createClassRule, createFeatureRule) 91// .transformations(createClassRule, createFeatureRule)
105 .objectives(new AlwaysSatisfiedRandomHardObjective()) 92// .objectives(new AlwaysSatisfiedRandomHardObjective())
106 .strategy(new DepthFirstStrategy().withDepthLimit(4).continueIfHardObjectivesFulfilled() 93// .strategy(new DepthFirstStrategy().withDepthLimit(4).continueIfHardObjectivesFulfilled()
107// .strategy(new BestFirstStrategy().withDepthLimit(4).continueIfHardObjectivesFulfilled() 94//// .strategy(new BestFirstStrategy().withDepthLimit(4).continueIfHardObjectivesFulfilled()
108// .goOnOnlyIfFitnessIsBetter() 95//// .goOnOnlyIfFitnessIsBetter()
109 )) 96// ))
110 .build(); 97// .build();
111 98//
112 var model = store.createEmptyModel(); 99// var model = store.createEmptyModel();
113 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); 100// var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
114// dseAdapter.setRandom(1); 101//// dseAdapter.setRandom(1);
115 var queryEngine = model.getAdapter(ModelQueryAdapter.class); 102// var queryEngine = model.getAdapter(ModelQueryAdapter.class);
116 103//
117 var modelElementInterpretation = model.getInterpretation(classModel); 104// var modelElementInterpretation = model.getInterpretation(classModel);
118 var classElementInterpretation = model.getInterpretation(classElement); 105// var classElementInterpretation = model.getInterpretation(classElement);
119 var modelElement = dseAdapter.createObject(); 106// var modelElement = dseAdapter.createObject();
120 modelElementInterpretation.put(modelElement, true); 107// modelElementInterpretation.put(modelElement, true);
121 classElementInterpretation.put(modelElement, true); 108// classElementInterpretation.put(modelElement, true);
122 queryEngine.flushChanges(); 109// queryEngine.flushChanges();
123 110//
124 111//
125 var states = dseAdapter.explore(); 112// var states = dseAdapter.explore();
126 System.out.println("states size: " + states.size()); 113// System.out.println("states size: " + states.size());
127 114//
128 } 115// }
129} 116}
diff --git a/subprojects/store-dse/src/test/java/tools/refinery/store/dse/DesignSpaceExplorationTest.java b/subprojects/store-dse/src/test/java/tools/refinery/store/dse/DesignSpaceExplorationTest.java
index 083f7ec3..f5f13433 100644
--- a/subprojects/store-dse/src/test/java/tools/refinery/store/dse/DesignSpaceExplorationTest.java
+++ b/subprojects/store-dse/src/test/java/tools/refinery/store/dse/DesignSpaceExplorationTest.java
@@ -5,21 +5,9 @@
5 */ 5 */
6package tools.refinery.store.dse; 6package tools.refinery.store.dse;
7 7
8import org.junit.jupiter.api.Test;
9import tools.refinery.store.dse.transition.DesignSpaceExplorationAdapter;
10import tools.refinery.store.model.ModelStore;
11import tools.refinery.store.query.ModelQueryAdapter;
12import tools.refinery.store.query.dnf.Query;
13import tools.refinery.store.dse.transition.TransformationRule;
14import tools.refinery.store.dse.strategy.BestFirstStrategy;
15import tools.refinery.store.dse.strategy.DepthFirstStrategy;
16import tools.refinery.store.query.viatra.ViatraModelQueryAdapter;
17import tools.refinery.store.query.view.AnySymbolView; 8import tools.refinery.store.query.view.AnySymbolView;
18import tools.refinery.store.query.view.KeyOnlyView; 9import tools.refinery.store.query.view.KeyOnlyView;
19import tools.refinery.store.representation.Symbol; 10import tools.refinery.store.representation.Symbol;
20import tools.refinery.store.tuple.Tuple;
21
22import static org.junit.jupiter.api.Assertions.assertEquals;
23 11
24class DesignSpaceExplorationTest { 12class DesignSpaceExplorationTest {
25// private static final Symbol<Boolean> namedElement = Symbol.of("NamedElement", 1); 13// private static final Symbol<Boolean> namedElement = Symbol.of("NamedElement", 1);
@@ -46,563 +34,563 @@ class DesignSpaceExplorationTest {
46 private static final AnySymbolView featuresView = new KeyOnlyView<>(features); 34 private static final AnySymbolView featuresView = new KeyOnlyView<>(features);
47 private static final AnySymbolView classesView = new KeyOnlyView<>(classes); 35 private static final AnySymbolView classesView = new KeyOnlyView<>(classes);
48 36
49 @Test 37// @Test
50 void createObjectTest() { 38// void createObjectTest() {
51 var store = ModelStore.builder() 39// var store = ModelStore.builder()
52 .with(ViatraModelQueryAdapter.builder()) 40// .with(ViatraModelQueryAdapter.builder())
53 .with(DesignSpaceExplorationAdapter.builder() 41// .with(DesignSpaceExplorationAdapter.builder()
54 .strategy(new DepthFirstStrategy().withDepthLimit(0))) 42// .strategy(new DepthFirstStrategy().withDepthLimit(0)))
55 .build(); 43// .build();
56 44//
57 var model = store.createEmptyModel(); 45// var model = store.createEmptyModel();
58 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); 46// var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
59 47//
60 assertEquals(0, dseAdapter.getModelSize()); 48// assertEquals(0, dseAdapter.getModelSize());
61 49//
62 var newModel = dseAdapter.createObject(); 50// var newModel = dseAdapter.createObject();
63 var newModelId = newModel.get(0); 51// var newModelId = newModel.get(0);
64 var newClass1 = dseAdapter.createObject(); 52// var newClass1 = dseAdapter.createObject();
65 var newClass1Id = newClass1.get(0); 53// var newClass1Id = newClass1.get(0);
66 var newClass2 = dseAdapter.createObject(); 54// var newClass2 = dseAdapter.createObject();
67 var newClass2Id = newClass2.get(0); 55// var newClass2Id = newClass2.get(0);
68 var newField = dseAdapter.createObject(); 56// var newField = dseAdapter.createObject();
69 var newFieldId = newField.get(0); 57// var newFieldId = newField.get(0);
70 58//
71 assertEquals(0, newModelId); 59// assertEquals(0, newModelId);
72 assertEquals(1, newClass1Id); 60// assertEquals(1, newClass1Id);
73 assertEquals(2, newClass2Id); 61// assertEquals(2, newClass2Id);
74 assertEquals(3, newFieldId); 62// assertEquals(3, newFieldId);
75 assertEquals(4, dseAdapter.getModelSize()); 63// assertEquals(4, dseAdapter.getModelSize());
76 } 64// }
77 65
78 @Test 66// @Test
79 void deleteMiddleObjectTest() { 67// void deleteMiddleObjectTest() {
80 var store = ModelStore.builder() 68// var store = ModelStore.builder()
81 .with(ViatraModelQueryAdapter.builder()) 69// .with(ViatraModelQueryAdapter.builder())
82 .with(DesignSpaceExplorationAdapter.builder() 70// .with(DesignSpaceExplorationAdapter.builder()
83 .strategy(new DepthFirstStrategy())) 71// .strategy(new DepthFirstStrategy()))
84 .build(); 72// .build();
85 73//
86 var model = store.createEmptyModel(); 74// var model = store.createEmptyModel();
87 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); 75// var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
88 76//
89 assertEquals(0, dseAdapter.getModelSize()); 77// assertEquals(0, dseAdapter.getModelSize());
90 78//
91 var newObject0 = dseAdapter.createObject(); 79// var newObject0 = dseAdapter.createObject();
92 var newObject0Id = newObject0.get(0); 80// var newObject0Id = newObject0.get(0);
93 var newObject1 = dseAdapter.createObject(); 81// var newObject1 = dseAdapter.createObject();
94 var newObject1Id = newObject1.get(0); 82// var newObject1Id = newObject1.get(0);
95 var newObject2 = dseAdapter.createObject(); 83// var newObject2 = dseAdapter.createObject();
96 var newObject2Id = newObject2.get(0); 84// var newObject2Id = newObject2.get(0);
97 var newObject3 = dseAdapter.createObject(); 85// var newObject3 = dseAdapter.createObject();
98 var newObject3Id = newObject3.get(0); 86// var newObject3Id = newObject3.get(0);
99 87//
100 assertEquals(0, newObject0Id); 88// assertEquals(0, newObject0Id);
101 assertEquals(1, newObject1Id); 89// assertEquals(1, newObject1Id);
102 assertEquals(2, newObject2Id); 90// assertEquals(2, newObject2Id);
103 assertEquals(3, newObject3Id); 91// assertEquals(3, newObject3Id);
104 assertEquals(4, dseAdapter.getModelSize()); 92// assertEquals(4, dseAdapter.getModelSize());
105 93//
106 dseAdapter.deleteObject(newObject1); 94// dseAdapter.deleteObject(newObject1);
107 assertEquals(4, dseAdapter.getModelSize()); 95// assertEquals(4, dseAdapter.getModelSize());
108 96//
109 var newObject4 = dseAdapter.createObject(); 97// var newObject4 = dseAdapter.createObject();
110 var newObject4Id = newObject4.get(0); 98// var newObject4Id = newObject4.get(0);
111 assertEquals(4, newObject4Id); 99// assertEquals(4, newObject4Id);
112 assertEquals(5, dseAdapter.getModelSize()); 100// assertEquals(5, dseAdapter.getModelSize());
113 101//
114 dseAdapter.deleteObject(newObject4); 102// dseAdapter.deleteObject(newObject4);
115 assertEquals(5, dseAdapter.getModelSize()); 103// assertEquals(5, dseAdapter.getModelSize());
116 } 104// }
117 105//
118 @Test 106// @Test
119 void DFSTrivialTest() { 107// void DFSTrivialTest() {
120 var store = ModelStore.builder() 108// var store = ModelStore.builder()
121 .symbols(classModel) 109// .symbols(classModel)
122 .with(ViatraModelQueryAdapter.builder()) 110// .with(ViatraModelQueryAdapter.builder())
123 .with(DesignSpaceExplorationAdapter.builder() 111// .with(DesignSpaceExplorationAdapter.builder()
124 .strategy(new DepthFirstStrategy().withDepthLimit(0))) 112// .strategy(new DepthFirstStrategy().withDepthLimit(0)))
125 .build(); 113// .build();
126 114//
127 var model = store.createEmptyModel(); 115// var model = store.createEmptyModel();
128 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); 116// var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
129 117//
130 var states = dseAdapter.explore(); 118// var states = dseAdapter.explore();
131 assertEquals(1, states.size()); 119// assertEquals(1, states.size());
132 } 120// }
133 121//
134 @Test 122// @Test
135 void DFSOneRuleTest() { 123// void DFSOneRuleTest() {
136 var createClassPrecondition = Query.of("CreateClassPrecondition", 124// var createClassPrecondition = Query.of("CreateClassPrecondition",
137 (builder, model) -> builder.clause( 125// (builder, model) -> builder.clause(
138 classModelView.call(model) 126// classModelView.call(model)
139 )); 127// ));
140 128//
141 var createClassRule = new TransformationRule("CreateClass", 129// var createClassRule = new TransformationRule("CreateClass",
142 createClassPrecondition, 130// createClassPrecondition,
143 (model) -> { 131// (model) -> {
144 var classesInterpretation = model.getInterpretation(classes); 132// var classesInterpretation = model.getInterpretation(classes);
145 var classElementInterpretation = model.getInterpretation(classElement); 133// var classElementInterpretation = model.getInterpretation(classElement);
146 return ((Tuple activation) -> { 134// return ((Tuple activation) -> {
147 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); 135// var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
148 var modelElement = activation.get(0); 136// var modelElement = activation.get(0);
149 137//
150 var newClassElement = dseAdapter.createObject(); 138// var newClassElement = dseAdapter.createObject();
151 var newClassElementId = newClassElement.get(0); 139// var newClassElementId = newClassElement.get(0);
152 140//
153 classesInterpretation.put(Tuple.of(modelElement, newClassElementId), true); 141// classesInterpretation.put(Tuple.of(modelElement, newClassElementId), true);
154 classElementInterpretation.put(Tuple.of(newClassElementId), true); 142// classElementInterpretation.put(Tuple.of(newClassElementId), true);
155 }); 143// });
156 }); 144// });
157 145//
158 var store = ModelStore.builder() 146// var store = ModelStore.builder()
159 .symbols(classModel, classElement, classes) 147// .symbols(classModel, classElement, classes)
160 .with(ViatraModelQueryAdapter.builder() 148// .with(ViatraModelQueryAdapter.builder()
161 .queries(createClassPrecondition)) 149// .queries(createClassPrecondition))
162 .with(DesignSpaceExplorationAdapter.builder() 150// .with(DesignSpaceExplorationAdapter.builder()
163 .transformations(createClassRule) 151// .transformations(createClassRule)
164 .strategy(new DepthFirstStrategy().withDepthLimit(0) 152// .strategy(new DepthFirstStrategy().withDepthLimit(0)
165 )) 153// ))
166 .build(); 154// .build();
167 155//
168 var model = store.createEmptyModel(); 156// var model = store.createEmptyModel();
169 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); 157// var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
170 var queryEngine = model.getAdapter(ModelQueryAdapter.class); 158// var queryEngine = model.getAdapter(ModelQueryAdapter.class);
171 159//
172 var modelElementInterpretation = model.getInterpretation(classModel); 160// var modelElementInterpretation = model.getInterpretation(classModel);
173 modelElementInterpretation.put(dseAdapter.createObject(), true); 161// modelElementInterpretation.put(dseAdapter.createObject(), true);
174 queryEngine.flushChanges(); 162// queryEngine.flushChanges();
175 163//
176 var states = dseAdapter.explore(); 164// var states = dseAdapter.explore();
177 assertEquals(1, states.size()); 165// assertEquals(1, states.size());
178 } 166// }
179 167//
180 @Test 168// @Test
181 void DFSContinueTest() { 169// void DFSContinueTest() {
182 var createClassPrecondition = Query.of("CreateClassPrecondition", 170// var createClassPrecondition = Query.of("CreateClassPrecondition",
183 (builder, model) -> builder.clause( 171// (builder, model) -> builder.clause(
184 classModelView.call(model) 172// classModelView.call(model)
185 )); 173// ));
186 174//
187 var createClassRule = new TransformationRule("CreateClass", 175// var createClassRule = new TransformationRule("CreateClass",
188 createClassPrecondition, 176// createClassPrecondition,
189 (model) -> { 177// (model) -> {
190 var classesInterpretation = model.getInterpretation(classes); 178// var classesInterpretation = model.getInterpretation(classes);
191 var classElementInterpretation = model.getInterpretation(classElement); 179// var classElementInterpretation = model.getInterpretation(classElement);
192 return ((Tuple activation) -> { 180// return ((Tuple activation) -> {
193 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); 181// var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
194 var modelElement = activation.get(0); 182// var modelElement = activation.get(0);
195 183//
196 var newClassElement = dseAdapter.createObject(); 184// var newClassElement = dseAdapter.createObject();
197 var newClassElementId = newClassElement.get(0); 185// var newClassElementId = newClassElement.get(0);
198 186//
199 classesInterpretation.put(Tuple.of(modelElement, newClassElementId), true); 187// classesInterpretation.put(Tuple.of(modelElement, newClassElementId), true);
200 classElementInterpretation.put(Tuple.of(newClassElementId), true); 188// classElementInterpretation.put(Tuple.of(newClassElementId), true);
201 }); 189// });
202 }); 190// });
203 191//
204 var store = ModelStore.builder() 192// var store = ModelStore.builder()
205 .symbols(classModel, classElement, classes) 193// .symbols(classModel, classElement, classes)
206 .with(ViatraModelQueryAdapter.builder() 194// .with(ViatraModelQueryAdapter.builder()
207 .queries(createClassPrecondition)) 195// .queries(createClassPrecondition))
208 .with(DesignSpaceExplorationAdapter.builder() 196// .with(DesignSpaceExplorationAdapter.builder()
209 .transformations(createClassRule) 197// .transformations(createClassRule)
210 .strategy(new DepthFirstStrategy().withDepthLimit(4).continueIfHardObjectivesFulfilled() 198// .strategy(new DepthFirstStrategy().withDepthLimit(4).continueIfHardObjectivesFulfilled()
211 )) 199// ))
212 .build(); 200// .build();
213 201//
214 var model = store.createEmptyModel(); 202// var model = store.createEmptyModel();
215 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); 203// var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
216 var queryEngine = model.getAdapter(ModelQueryAdapter.class); 204// var queryEngine = model.getAdapter(ModelQueryAdapter.class);
217 205//
218 var modelElementInterpretation = model.getInterpretation(classModel); 206// var modelElementInterpretation = model.getInterpretation(classModel);
219 modelElementInterpretation.put(dseAdapter.createObject(), true); 207// modelElementInterpretation.put(dseAdapter.createObject(), true);
220 queryEngine.flushChanges(); 208// queryEngine.flushChanges();
221 209//
222 var states = dseAdapter.explore(); 210// var states = dseAdapter.explore();
223 assertEquals(5, states.size()); 211// assertEquals(5, states.size());
224 } 212// }
225 213//
226 @Test 214// @Test
227 void DFSCompletenessTest() { 215// void DFSCompletenessTest() {
228 var createClassPrecondition = Query.of("CreateClassPrecondition", 216// var createClassPrecondition = Query.of("CreateClassPrecondition",
229 (builder, model) -> builder.clause( 217// (builder, model) -> builder.clause(
230 classModelView.call(model) 218// classModelView.call(model)
231 )); 219// ));
232 220//
233 var createClassRule = new TransformationRule("CreateClass", 221// var createClassRule = new TransformationRule("CreateClass",
234 createClassPrecondition, 222// createClassPrecondition,
235 (model) -> { 223// (model) -> {
236 var classesInterpretation = model.getInterpretation(classes); 224// var classesInterpretation = model.getInterpretation(classes);
237 var classElementInterpretation = model.getInterpretation(classElement); 225// var classElementInterpretation = model.getInterpretation(classElement);
238 return ((Tuple activation) -> { 226// return ((Tuple activation) -> {
239 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); 227// var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
240 var modelElement = activation.get(0); 228// var modelElement = activation.get(0);
241 229//
242 var newClassElement = dseAdapter.createObject(); 230// var newClassElement = dseAdapter.createObject();
243 var newClassElementId = newClassElement.get(0); 231// var newClassElementId = newClassElement.get(0);
244 232//
245 classesInterpretation.put(Tuple.of(modelElement, newClassElementId), true); 233// classesInterpretation.put(Tuple.of(modelElement, newClassElementId), true);
246 classElementInterpretation.put(Tuple.of(newClassElementId), true); 234// classElementInterpretation.put(Tuple.of(newClassElementId), true);
247 }); 235// });
248 }); 236// });
249 237//
250 var createFeaturePrecondition = Query.of("CreateFeaturePrecondition", 238// var createFeaturePrecondition = Query.of("CreateFeaturePrecondition",
251 (builder, model) -> builder.clause( 239// (builder, model) -> builder.clause(
252 classModelView.call(model) 240// classModelView.call(model)
253 )); 241// ));
254 242//
255 var createFeatureRule = new TransformationRule("CreateFeature", 243// var createFeatureRule = new TransformationRule("CreateFeature",
256 createFeaturePrecondition, 244// createFeaturePrecondition,
257 (model) -> { 245// (model) -> {
258 var featuresInterpretation = model.getInterpretation(features); 246// var featuresInterpretation = model.getInterpretation(features);
259 var featureInterpretation = model.getInterpretation(feature); 247// var featureInterpretation = model.getInterpretation(feature);
260 return ((Tuple activation) -> { 248// return ((Tuple activation) -> {
261 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); 249// var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
262 var modelElement = activation.get(0); 250// var modelElement = activation.get(0);
263 251//
264 var newClassElement = dseAdapter.createObject(); 252// var newClassElement = dseAdapter.createObject();
265 var newClassElementId = newClassElement.get(0); 253// var newClassElementId = newClassElement.get(0);
266 254//
267 featuresInterpretation.put(Tuple.of(modelElement, newClassElementId), true); 255// featuresInterpretation.put(Tuple.of(modelElement, newClassElementId), true);
268 featureInterpretation.put(Tuple.of(newClassElementId), true); 256// featureInterpretation.put(Tuple.of(newClassElementId), true);
269 }); 257// });
270 }); 258// });
271 259//
272 var store = ModelStore.builder() 260// var store = ModelStore.builder()
273 .symbols(classModel, classElement, classes, feature, features, isEncapsulatedBy, encapsulates) 261// .symbols(classModel, classElement, classes, feature, features, isEncapsulatedBy, encapsulates)
274 .with(ViatraModelQueryAdapter.builder() 262// .with(ViatraModelQueryAdapter.builder()
275 .queries(createClassPrecondition, createFeaturePrecondition)) 263// .queries(createClassPrecondition, createFeaturePrecondition))
276 .with(DesignSpaceExplorationAdapter.builder() 264// .with(DesignSpaceExplorationAdapter.builder()
277 .transformations(createClassRule, createFeatureRule) 265// .transformations(createClassRule, createFeatureRule)
278 .strategy(new DepthFirstStrategy().withDepthLimit(10).continueIfHardObjectivesFulfilled() 266// .strategy(new DepthFirstStrategy().withDepthLimit(10).continueIfHardObjectivesFulfilled()
279 )) 267// ))
280 .build(); 268// .build();
281 269//
282 var model = store.createEmptyModel(); 270// var model = store.createEmptyModel();
283 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); 271// var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
284 var queryEngine = model.getAdapter(ModelQueryAdapter.class); 272// var queryEngine = model.getAdapter(ModelQueryAdapter.class);
285 273//
286 var modelElementInterpretation = model.getInterpretation(classModel); 274// var modelElementInterpretation = model.getInterpretation(classModel);
287 modelElementInterpretation.put(dseAdapter.createObject(), true); 275// modelElementInterpretation.put(dseAdapter.createObject(), true);
288 queryEngine.flushChanges(); 276// queryEngine.flushChanges();
289 277//
290 var states = dseAdapter.explore(); 278// var states = dseAdapter.explore();
291 assertEquals(2047, states.size()); 279// assertEquals(2047, states.size());
292 } 280// }
293 281//
294 @Test 282// @Test
295 void DFSSolutionLimitTest() { 283// void DFSSolutionLimitTest() {
296 var createClassPrecondition = Query.of("CreateClassPrecondition", 284// var createClassPrecondition = Query.of("CreateClassPrecondition",
297 (builder, model) -> builder.clause( 285// (builder, model) -> builder.clause(
298 classModelView.call(model) 286// classModelView.call(model)
299 )); 287// ));
300 288//
301 var createClassRule = new TransformationRule("CreateClass", 289// var createClassRule = new TransformationRule("CreateClass",
302 createClassPrecondition, 290// createClassPrecondition,
303 (model) -> { 291// (model) -> {
304 var classesInterpretation = model.getInterpretation(classes); 292// var classesInterpretation = model.getInterpretation(classes);
305 var classElementInterpretation = model.getInterpretation(classElement); 293// var classElementInterpretation = model.getInterpretation(classElement);
306 return ((Tuple activation) -> { 294// return ((Tuple activation) -> {
307 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); 295// var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
308 var modelElement = activation.get(0); 296// var modelElement = activation.get(0);
309 297//
310 var newClassElement = dseAdapter.createObject(); 298// var newClassElement = dseAdapter.createObject();
311 var newClassElementId = newClassElement.get(0); 299// var newClassElementId = newClassElement.get(0);
312 300//
313 classesInterpretation.put(Tuple.of(modelElement, newClassElementId), true); 301// classesInterpretation.put(Tuple.of(modelElement, newClassElementId), true);
314 classElementInterpretation.put(Tuple.of(newClassElementId), true); 302// classElementInterpretation.put(Tuple.of(newClassElementId), true);
315 }); 303// });
316 }); 304// });
317 305//
318 var createFeaturePrecondition = Query.of("CreateFeaturePrecondition", 306// var createFeaturePrecondition = Query.of("CreateFeaturePrecondition",
319 (builder, model) -> builder.clause( 307// (builder, model) -> builder.clause(
320 classModelView.call(model) 308// classModelView.call(model)
321 )); 309// ));
322 310//
323 var createFeatureRule = new TransformationRule("CreateFeature", 311// var createFeatureRule = new TransformationRule("CreateFeature",
324 createFeaturePrecondition, 312// createFeaturePrecondition,
325 (model) -> { 313// (model) -> {
326 var featuresInterpretation = model.getInterpretation(features); 314// var featuresInterpretation = model.getInterpretation(features);
327 var featureInterpretation = model.getInterpretation(feature); 315// var featureInterpretation = model.getInterpretation(feature);
328 return ((Tuple activation) -> { 316// return ((Tuple activation) -> {
329 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); 317// var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
330 var modelElement = activation.get(0); 318// var modelElement = activation.get(0);
331 319//
332 var newClassElement = dseAdapter.createObject(); 320// var newClassElement = dseAdapter.createObject();
333 var newClassElementId = newClassElement.get(0); 321// var newClassElementId = newClassElement.get(0);
334 322//
335 featuresInterpretation.put(Tuple.of(modelElement, newClassElementId), true); 323// featuresInterpretation.put(Tuple.of(modelElement, newClassElementId), true);
336 featureInterpretation.put(Tuple.of(newClassElementId), true); 324// featureInterpretation.put(Tuple.of(newClassElementId), true);
337 }); 325// });
338 }); 326// });
339 327//
340 var store = ModelStore.builder() 328// var store = ModelStore.builder()
341 .symbols(classModel, classElement, classes, feature, features, isEncapsulatedBy, encapsulates) 329// .symbols(classModel, classElement, classes, feature, features, isEncapsulatedBy, encapsulates)
342 .with(ViatraModelQueryAdapter.builder() 330// .with(ViatraModelQueryAdapter.builder()
343 .queries(createClassPrecondition, createFeaturePrecondition)) 331// .queries(createClassPrecondition, createFeaturePrecondition))
344 .with(DesignSpaceExplorationAdapter.builder() 332// .with(DesignSpaceExplorationAdapter.builder()
345 .transformations(createClassRule, createFeatureRule) 333// .transformations(createClassRule, createFeatureRule)
346 .strategy(new DepthFirstStrategy().withSolutionLimit(222) 334// .strategy(new DepthFirstStrategy().withSolutionLimit(222)
347 .continueIfHardObjectivesFulfilled() 335// .continueIfHardObjectivesFulfilled()
348 )) 336// ))
349 .build(); 337// .build();
350 338//
351 var model = store.createEmptyModel(); 339// var model = store.createEmptyModel();
352 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); 340// var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
353 var queryEngine = model.getAdapter(ModelQueryAdapter.class); 341// var queryEngine = model.getAdapter(ModelQueryAdapter.class);
354 342//
355 var modelElementInterpretation = model.getInterpretation(classModel); 343// var modelElementInterpretation = model.getInterpretation(classModel);
356 modelElementInterpretation.put(dseAdapter.createObject(), true); 344// modelElementInterpretation.put(dseAdapter.createObject(), true);
357 queryEngine.flushChanges(); 345// queryEngine.flushChanges();
358 346//
359 var states = dseAdapter.explore(); 347// var states = dseAdapter.explore();
360 assertEquals(222, states.size()); 348// assertEquals(222, states.size());
361 } 349// }
362 350//
363 @Test 351// @Test
364 void BeFSTrivialTest() { 352// void BeFSTrivialTest() {
365 var store = ModelStore.builder() 353// var store = ModelStore.builder()
366 .symbols(classModel) 354// .symbols(classModel)
367 .with(ViatraModelQueryAdapter.builder()) 355// .with(ViatraModelQueryAdapter.builder())
368 .with(DesignSpaceExplorationAdapter.builder() 356// .with(DesignSpaceExplorationAdapter.builder()
369 .strategy(new BestFirstStrategy().withDepthLimit(0))) 357// .strategy(new BestFirstStrategy().withDepthLimit(0)))
370 .build(); 358// .build();
371 359//
372 var model = store.createEmptyModel(); 360// var model = store.createEmptyModel();
373 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); 361// var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
374 362//
375 var states = dseAdapter.explore(); 363// var states = dseAdapter.explore();
376 assertEquals(1, states.size()); 364// assertEquals(1, states.size());
377 } 365// }
378 366//
379 @Test 367// @Test
380 void BeFSOneRuleTest() { 368// void BeFSOneRuleTest() {
381 var createClassPrecondition = Query.of("CreateClassPrecondition", 369// var createClassPrecondition = Query.of("CreateClassPrecondition",
382 (builder, model) -> builder.clause( 370// (builder, model) -> builder.clause(
383 classModelView.call(model) 371// classModelView.call(model)
384 )); 372// ));
385 373//
386 var createClassRule = new TransformationRule("CreateClass", 374// var createClassRule = new TransformationRule("CreateClass",
387 createClassPrecondition, 375// createClassPrecondition,
388 (model) -> { 376// (model) -> {
389 var classesInterpretation = model.getInterpretation(classes); 377// var classesInterpretation = model.getInterpretation(classes);
390 var classElementInterpretation = model.getInterpretation(classElement); 378// var classElementInterpretation = model.getInterpretation(classElement);
391 return ((Tuple activation) -> { 379// return ((Tuple activation) -> {
392 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); 380// var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
393 var modelElement = activation.get(0); 381// var modelElement = activation.get(0);
394 382//
395 var newClassElement = dseAdapter.createObject(); 383// var newClassElement = dseAdapter.createObject();
396 var newClassElementId = newClassElement.get(0); 384// var newClassElementId = newClassElement.get(0);
397 385//
398 classesInterpretation.put(Tuple.of(modelElement, newClassElementId), true); 386// classesInterpretation.put(Tuple.of(modelElement, newClassElementId), true);
399 classElementInterpretation.put(Tuple.of(newClassElementId), true); 387// classElementInterpretation.put(Tuple.of(newClassElementId), true);
400 }); 388// });
401 }); 389// });
402 390//
403 var store = ModelStore.builder() 391// var store = ModelStore.builder()
404 .symbols(classModel, classElement, classes) 392// .symbols(classModel, classElement, classes)
405 .with(ViatraModelQueryAdapter.builder() 393// .with(ViatraModelQueryAdapter.builder()
406 .queries(createClassPrecondition)) 394// .queries(createClassPrecondition))
407 .with(DesignSpaceExplorationAdapter.builder() 395// .with(DesignSpaceExplorationAdapter.builder()
408 .transformations(createClassRule) 396// .transformations(createClassRule)
409 .strategy(new BestFirstStrategy().withDepthLimit(4) 397// .strategy(new BestFirstStrategy().withDepthLimit(4)
410 )) 398// ))
411 .build(); 399// .build();
412 400//
413 var model = store.createEmptyModel(); 401// var model = store.createEmptyModel();
414 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); 402// var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
415 var queryEngine = model.getAdapter(ModelQueryAdapter.class); 403// var queryEngine = model.getAdapter(ModelQueryAdapter.class);
416 404//
417 var modelElementInterpretation = model.getInterpretation(classModel); 405// var modelElementInterpretation = model.getInterpretation(classModel);
418 modelElementInterpretation.put(dseAdapter.createObject(), true); 406// modelElementInterpretation.put(dseAdapter.createObject(), true);
419 queryEngine.flushChanges(); 407// queryEngine.flushChanges();
420 408//
421 var states = dseAdapter.explore(); 409// var states = dseAdapter.explore();
422 assertEquals(1, states.size()); 410// assertEquals(1, states.size());
423 } 411// }
424 412//
425 @Test 413// @Test
426 void BeFSContinueTest() { 414// void BeFSContinueTest() {
427 var createClassPrecondition = Query.of("CreateClassPrecondition", 415// var createClassPrecondition = Query.of("CreateClassPrecondition",
428 (builder, model) -> builder.clause( 416// (builder, model) -> builder.clause(
429 classModelView.call(model) 417// classModelView.call(model)
430 )); 418// ));
431 419//
432 var createClassRule = new TransformationRule("CreateClass", 420// var createClassRule = new TransformationRule("CreateClass",
433 createClassPrecondition, 421// createClassPrecondition,
434 (model) -> { 422// (model) -> {
435 var classesInterpretation = model.getInterpretation(classes); 423// var classesInterpretation = model.getInterpretation(classes);
436 var classElementInterpretation = model.getInterpretation(classElement); 424// var classElementInterpretation = model.getInterpretation(classElement);
437 return ((Tuple activation) -> { 425// return ((Tuple activation) -> {
438 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); 426// var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
439 var modelElement = activation.get(0); 427// var modelElement = activation.get(0);
440 428//
441 var newClassElement = dseAdapter.createObject(); 429// var newClassElement = dseAdapter.createObject();
442 var newClassElementId = newClassElement.get(0); 430// var newClassElementId = newClassElement.get(0);
443 431//
444 classesInterpretation.put(Tuple.of(modelElement, newClassElementId), true); 432// classesInterpretation.put(Tuple.of(modelElement, newClassElementId), true);
445 classElementInterpretation.put(Tuple.of(newClassElementId), true); 433// classElementInterpretation.put(Tuple.of(newClassElementId), true);
446 }); 434// });
447 }); 435// });
448 436//
449 var store = ModelStore.builder() 437// var store = ModelStore.builder()
450 .symbols(classModel, classElement, classes) 438// .symbols(classModel, classElement, classes)
451 .with(ViatraModelQueryAdapter.builder() 439// .with(ViatraModelQueryAdapter.builder()
452 .queries(createClassPrecondition)) 440// .queries(createClassPrecondition))
453 .with(DesignSpaceExplorationAdapter.builder() 441// .with(DesignSpaceExplorationAdapter.builder()
454 .transformations(createClassRule) 442// .transformations(createClassRule)
455 .strategy(new BestFirstStrategy().withDepthLimit(4).continueIfHardObjectivesFulfilled() 443// .strategy(new BestFirstStrategy().withDepthLimit(4).continueIfHardObjectivesFulfilled()
456 )) 444// ))
457 .build(); 445// .build();
458 446//
459 var model = store.createEmptyModel(); 447// var model = store.createEmptyModel();
460 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); 448// var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
461 var queryEngine = model.getAdapter(ModelQueryAdapter.class); 449// var queryEngine = model.getAdapter(ModelQueryAdapter.class);
462 450//
463 var modelElementInterpretation = model.getInterpretation(classModel); 451// var modelElementInterpretation = model.getInterpretation(classModel);
464 modelElementInterpretation.put(dseAdapter.createObject(), true); 452// modelElementInterpretation.put(dseAdapter.createObject(), true);
465 queryEngine.flushChanges(); 453// queryEngine.flushChanges();
466 454//
467 var states = dseAdapter.explore(); 455// var states = dseAdapter.explore();
468 assertEquals(5, states.size()); 456// assertEquals(5, states.size());
469 } 457// }
470 458//
471 @Test 459// @Test
472 void BeFSCompletenessTest() { 460// void BeFSCompletenessTest() {
473 var createClassPrecondition = Query.of("CreateClassPrecondition", 461// var createClassPrecondition = Query.of("CreateClassPrecondition",
474 (builder, model) -> builder.clause( 462// (builder, model) -> builder.clause(
475 classModelView.call(model) 463// classModelView.call(model)
476 )); 464// ));
477 465//
478 var createClassRule = new TransformationRule("CreateClass", 466// var createClassRule = new TransformationRule("CreateClass",
479 createClassPrecondition, 467// createClassPrecondition,
480 (model) -> { 468// (model) -> {
481 var classesInterpretation = model.getInterpretation(classes); 469// var classesInterpretation = model.getInterpretation(classes);
482 var classElementInterpretation = model.getInterpretation(classElement); 470// var classElementInterpretation = model.getInterpretation(classElement);
483 return ((Tuple activation) -> { 471// return ((Tuple activation) -> {
484 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); 472// var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
485 var modelElement = activation.get(0); 473// var modelElement = activation.get(0);
486 474//
487 var newClassElement = dseAdapter.createObject(); 475// var newClassElement = dseAdapter.createObject();
488 var newClassElementId = newClassElement.get(0); 476// var newClassElementId = newClassElement.get(0);
489 477//
490 classesInterpretation.put(Tuple.of(modelElement, newClassElementId), true); 478// classesInterpretation.put(Tuple.of(modelElement, newClassElementId), true);
491 classElementInterpretation.put(Tuple.of(newClassElementId), true); 479// classElementInterpretation.put(Tuple.of(newClassElementId), true);
492 }); 480// });
493 }); 481// });
494 482//
495 var createFeaturePrecondition = Query.of("CreateFeaturePrecondition", 483// var createFeaturePrecondition = Query.of("CreateFeaturePrecondition",
496 (builder, model) -> builder.clause( 484// (builder, model) -> builder.clause(
497 classModelView.call(model) 485// classModelView.call(model)
498 )); 486// ));
499 487//
500 var createFeatureRule = new TransformationRule("CreateFeature", 488// var createFeatureRule = new TransformationRule("CreateFeature",
501 createFeaturePrecondition, 489// createFeaturePrecondition,
502 (model) -> { 490// (model) -> {
503 var featuresInterpretation = model.getInterpretation(features); 491// var featuresInterpretation = model.getInterpretation(features);
504 var featureInterpretation = model.getInterpretation(feature); 492// var featureInterpretation = model.getInterpretation(feature);
505 return ((Tuple activation) -> { 493// return ((Tuple activation) -> {
506 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); 494// var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
507 var modelElement = activation.get(0); 495// var modelElement = activation.get(0);
508 496//
509 var newClassElement = dseAdapter.createObject(); 497// var newClassElement = dseAdapter.createObject();
510 var newClassElementId = newClassElement.get(0); 498// var newClassElementId = newClassElement.get(0);
511 499//
512 featuresInterpretation.put(Tuple.of(modelElement, newClassElementId), true); 500// featuresInterpretation.put(Tuple.of(modelElement, newClassElementId), true);
513 featureInterpretation.put(Tuple.of(newClassElementId), true); 501// featureInterpretation.put(Tuple.of(newClassElementId), true);
514 }); 502// });
515 }); 503// });
516 504//
517 var store = ModelStore.builder() 505// var store = ModelStore.builder()
518 .symbols(classModel, classElement, classes, feature, features, isEncapsulatedBy, encapsulates) 506// .symbols(classModel, classElement, classes, feature, features, isEncapsulatedBy, encapsulates)
519 .with(ViatraModelQueryAdapter.builder() 507// .with(ViatraModelQueryAdapter.builder()
520 .queries(createClassPrecondition, createFeaturePrecondition)) 508// .queries(createClassPrecondition, createFeaturePrecondition))
521 .with(DesignSpaceExplorationAdapter.builder() 509// .with(DesignSpaceExplorationAdapter.builder()
522 .transformations(createClassRule, createFeatureRule) 510// .transformations(createClassRule, createFeatureRule)
523 .strategy(new BestFirstStrategy().withDepthLimit(10).continueIfHardObjectivesFulfilled() 511// .strategy(new BestFirstStrategy().withDepthLimit(10).continueIfHardObjectivesFulfilled()
524 )) 512// ))
525 .build(); 513// .build();
526 514//
527 var model = store.createEmptyModel(); 515// var model = store.createEmptyModel();
528 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); 516// var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
529 var queryEngine = model.getAdapter(ModelQueryAdapter.class); 517// var queryEngine = model.getAdapter(ModelQueryAdapter.class);
530 518//
531 var modelElementInterpretation = model.getInterpretation(classModel); 519// var modelElementInterpretation = model.getInterpretation(classModel);
532 modelElementInterpretation.put(dseAdapter.createObject(), true); 520// modelElementInterpretation.put(dseAdapter.createObject(), true);
533 queryEngine.flushChanges(); 521// queryEngine.flushChanges();
534 522//
535 var states = dseAdapter.explore(); 523// var states = dseAdapter.explore();
536 assertEquals(2047, states.size()); 524// assertEquals(2047, states.size());
537 } 525// }
538 526//
539 @Test 527// @Test
540 void BeFSSolutionLimitTest() { 528// void BeFSSolutionLimitTest() {
541 var createClassPrecondition = Query.of("CreateClassPrecondition", 529// var createClassPrecondition = Query.of("CreateClassPrecondition",
542 (builder, model) -> builder.clause( 530// (builder, model) -> builder.clause(
543 classModelView.call(model) 531// classModelView.call(model)
544 )); 532// ));
545 533//
546 var createClassRule = new TransformationRule("CreateClass", 534// var createClassRule = new TransformationRule("CreateClass",
547 createClassPrecondition, 535// createClassPrecondition,
548 (model) -> { 536// (model) -> {
549 var classesInterpretation = model.getInterpretation(classes); 537// var classesInterpretation = model.getInterpretation(classes);
550 var classElementInterpretation = model.getInterpretation(classElement); 538// var classElementInterpretation = model.getInterpretation(classElement);
551 return ((Tuple activation) -> { 539// return ((Tuple activation) -> {
552 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); 540// var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
553 var modelElement = activation.get(0); 541// var modelElement = activation.get(0);
554 542//
555 var newClassElement = dseAdapter.createObject(); 543// var newClassElement = dseAdapter.createObject();
556 var newClassElementId = newClassElement.get(0); 544// var newClassElementId = newClassElement.get(0);
557 545//
558 classesInterpretation.put(Tuple.of(modelElement, newClassElementId), true); 546// classesInterpretation.put(Tuple.of(modelElement, newClassElementId), true);
559 classElementInterpretation.put(Tuple.of(newClassElementId), true); 547// classElementInterpretation.put(Tuple.of(newClassElementId), true);
560 }); 548// });
561 }); 549// });
562 550//
563 var createFeaturePrecondition = Query.of("CreateFeaturePrecondition", 551// var createFeaturePrecondition = Query.of("CreateFeaturePrecondition",
564 (builder, model) -> builder.clause( 552// (builder, model) -> builder.clause(
565 classModelView.call(model) 553// classModelView.call(model)
566 )); 554// ));
567 555//
568 var createFeatureRule = new TransformationRule("CreateFeature", 556// var createFeatureRule = new TransformationRule("CreateFeature",
569 createFeaturePrecondition, 557// createFeaturePrecondition,
570 (model) -> { 558// (model) -> {
571 var featuresInterpretation = model.getInterpretation(features); 559// var featuresInterpretation = model.getInterpretation(features);
572 var featureInterpretation = model.getInterpretation(feature); 560// var featureInterpretation = model.getInterpretation(feature);
573 return ((Tuple activation) -> { 561// return ((Tuple activation) -> {
574 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); 562// var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
575 var modelElement = activation.get(0); 563// var modelElement = activation.get(0);
576 564//
577 var newClassElement = dseAdapter.createObject(); 565// var newClassElement = dseAdapter.createObject();
578 var newClassElementId = newClassElement.get(0); 566// var newClassElementId = newClassElement.get(0);
579 567//
580 featuresInterpretation.put(Tuple.of(modelElement, newClassElementId), true); 568// featuresInterpretation.put(Tuple.of(modelElement, newClassElementId), true);
581 featureInterpretation.put(Tuple.of(newClassElementId), true); 569// featureInterpretation.put(Tuple.of(newClassElementId), true);
582 }); 570// });
583 }); 571// });
584 572//
585 var store = ModelStore.builder() 573// var store = ModelStore.builder()
586 .symbols(classModel, classElement, classes, feature, features, isEncapsulatedBy, encapsulates) 574// .symbols(classModel, classElement, classes, feature, features, isEncapsulatedBy, encapsulates)
587 .with(ViatraModelQueryAdapter.builder() 575// .with(ViatraModelQueryAdapter.builder()
588 .queries(createClassPrecondition, createFeaturePrecondition)) 576// .queries(createClassPrecondition, createFeaturePrecondition))
589 .with(DesignSpaceExplorationAdapter.builder() 577// .with(DesignSpaceExplorationAdapter.builder()
590 .transformations(createClassRule, createFeatureRule) 578// .transformations(createClassRule, createFeatureRule)
591 .strategy(new BestFirstStrategy().withSolutionLimit(222) 579// .strategy(new BestFirstStrategy().withSolutionLimit(222)
592 .continueIfHardObjectivesFulfilled() 580// .continueIfHardObjectivesFulfilled()
593 )) 581// ))
594 .build(); 582// .build();
595 583//
596 var model = store.createEmptyModel(); 584// var model = store.createEmptyModel();
597 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); 585// var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
598 var queryEngine = model.getAdapter(ModelQueryAdapter.class); 586// var queryEngine = model.getAdapter(ModelQueryAdapter.class);
599 587//
600 var modelElementInterpretation = model.getInterpretation(classModel); 588// var modelElementInterpretation = model.getInterpretation(classModel);
601 modelElementInterpretation.put(dseAdapter.createObject(), true); 589// modelElementInterpretation.put(dseAdapter.createObject(), true);
602 queryEngine.flushChanges(); 590// queryEngine.flushChanges();
603 591//
604 var states = dseAdapter.explore(); 592// var states = dseAdapter.explore();
605 assertEquals(222, states.size()); 593// assertEquals(222, states.size());
606 } 594// }
607 595
608} 596}
diff --git a/subprojects/store-dse/src/test/java/tools/refinery/store/dse/TransformationRuleTest.java b/subprojects/store-dse/src/test/java/tools/refinery/store/dse/TransformationRuleTest.java
index 1672b63a..43b04e0d 100644
--- a/subprojects/store-dse/src/test/java/tools/refinery/store/dse/TransformationRuleTest.java
+++ b/subprojects/store-dse/src/test/java/tools/refinery/store/dse/TransformationRuleTest.java
@@ -6,409 +6,409 @@
6package tools.refinery.store.dse; 6package tools.refinery.store.dse;
7 7
8import org.junit.jupiter.api.Test; 8import org.junit.jupiter.api.Test;
9import tools.refinery.store.dse.strategy.DepthFirstStrategy; 9//
10import tools.refinery.store.dse.transition.DesignSpaceExplorationAdapter; 10//import tools.refinery.store.dse.transition.DesignSpaceExplorationAdapter;
11import tools.refinery.store.model.ModelStore; 11//import tools.refinery.store.model.ModelStore;
12import tools.refinery.store.query.ModelQueryAdapter; 12//import tools.refinery.store.query.ModelQueryAdapter;
13import tools.refinery.store.query.dnf.Query; 13//import tools.refinery.store.query.dnf.Query;
14import tools.refinery.store.dse.transition.TransformationRule; 14//import tools.refinery.store.dse.transition.TransformationRule;
15import tools.refinery.store.query.viatra.ViatraModelQueryAdapter; 15//import tools.refinery.store.query.viatra.ViatraModelQueryAdapter;
16import tools.refinery.store.query.view.AnySymbolView; 16//import tools.refinery.store.query.view.AnySymbolView;
17import tools.refinery.store.query.view.KeyOnlyView; 17//import tools.refinery.store.query.view.KeyOnlyView;
18import tools.refinery.store.representation.Symbol; 18//import tools.refinery.store.representation.Symbol;
19import tools.refinery.store.tuple.Tuple; 19//import tools.refinery.store.tuple.Tuple;
20 20//
21import java.util.List; 21//import java.util.List;
22import java.util.Map; 22//import java.util.Map;
23 23//
24import static org.junit.jupiter.api.Assertions.assertEquals; 24//import static org.junit.jupiter.api.Assertions.assertEquals;
25import static tools.refinery.store.query.literal.Literals.not; 25//import static tools.refinery.store.query.literal.Literals.not;
26import static tools.refinery.store.dse.tests.QueryAssertions.assertResults; 26//import static tools.refinery.store.dse.tests.QueryAssertions.assertResults;
27 27//
28class TransformationRuleTest { 28class TransformationRuleTest {
29 29//
30 private static final Symbol<Boolean> classModel = Symbol.of("ClassModel", 1); 30// private static final Symbol<Boolean> classModel = Symbol.of("ClassModel", 1);
31 private static final Symbol<Boolean> classElement = Symbol.of("ClassElement", 1); 31// private static final Symbol<Boolean> classElement = Symbol.of("ClassElement", 1);
32 private static final Symbol<Boolean> feature = Symbol.of("Feature", 1); 32// private static final Symbol<Boolean> feature = Symbol.of("Feature", 1);
33 33//
34 private static final Symbol<Boolean> isEncapsulatedBy = Symbol.of("IsEncapsulatedBy", 2); 34// private static final Symbol<Boolean> isEncapsulatedBy = Symbol.of("IsEncapsulatedBy", 2);
35 private static final Symbol<Boolean> encapsulates = Symbol.of("Encapsulates", 2); 35// private static final Symbol<Boolean> encapsulates = Symbol.of("Encapsulates", 2);
36 36//
37 private static final Symbol<Boolean> features = Symbol.of("Features", 2); 37// private static final Symbol<Boolean> features = Symbol.of("Features", 2);
38 private static final Symbol<Boolean> classes = Symbol.of("Classes", 2); 38// private static final Symbol<Boolean> classes = Symbol.of("Classes", 2);
39 39//
40 private static final AnySymbolView classModelView = new KeyOnlyView<>(classModel); 40// private static final AnySymbolView classModelView = new KeyOnlyView<>(classModel);
41 private static final AnySymbolView classElementView = new KeyOnlyView<>(classElement); 41// private static final AnySymbolView classElementView = new KeyOnlyView<>(classElement);
42 private static final AnySymbolView featureView = new KeyOnlyView<>(feature); 42// private static final AnySymbolView featureView = new KeyOnlyView<>(feature);
43 private static final AnySymbolView isEncapsulatedByView = new KeyOnlyView<>(isEncapsulatedBy); 43// private static final AnySymbolView isEncapsulatedByView = new KeyOnlyView<>(isEncapsulatedBy);
44 private static final AnySymbolView encapsulatesView = new KeyOnlyView<>(encapsulates); 44// private static final AnySymbolView encapsulatesView = new KeyOnlyView<>(encapsulates);
45 private static final AnySymbolView featuresView = new KeyOnlyView<>(features); 45// private static final AnySymbolView featuresView = new KeyOnlyView<>(features);
46 private static final AnySymbolView classesView = new KeyOnlyView<>(classes); 46// private static final AnySymbolView classesView = new KeyOnlyView<>(classes);
47 47//
48 @Test 48// @Test
49 void activationsTest() { 49// void activationsTest() {
50 var assignFeaturePreconditionHelper = Query.of("AssignFeaturePreconditionHelper", 50// var assignFeaturePreconditionHelper = Query.of("AssignFeaturePreconditionHelper",
51 (builder, model, c, f) -> builder.clause( 51// (builder, model, c, f) -> builder.clause(
52 classElementView.call(c), 52// classElementView.call(c),
53 classesView.call(model, c), 53// classesView.call(model, c),
54 encapsulatesView.call(c, f) 54// encapsulatesView.call(c, f)
55 )); 55// ));
56 56//
57 var assignFeaturePrecondition = Query.of("AssignFeaturePrecondition", (builder, c2, f) 57// var assignFeaturePrecondition = Query.of("AssignFeaturePrecondition", (builder, c2, f)
58 -> builder.clause((model, c1) -> List.of( 58// -> builder.clause((model, c1) -> List.of(
59 classModelView.call(model), 59// classModelView.call(model),
60 featureView.call(f), 60// featureView.call(f),
61 classElementView.call(c2), 61// classElementView.call(c2),
62 featuresView.call(model, f), 62// featuresView.call(model, f),
63 classesView.call(model, c1), 63// classesView.call(model, c1),
64 not(assignFeaturePreconditionHelper.call(model, c2, f)), 64// not(assignFeaturePreconditionHelper.call(model, c2, f)),
65 not(encapsulatesView.call(c2, f)) 65// not(encapsulatesView.call(c2, f))
66 ))); 66// )));
67 67//
68 var deleteEmptyClassPrecondition = Query.of("DeleteEmptyClassPrecondition", 68// var deleteEmptyClassPrecondition = Query.of("DeleteEmptyClassPrecondition",
69 (builder, model, c) -> builder.clause((f) -> List.of( 69// (builder, model, c) -> builder.clause((f) -> List.of(
70 classModelView.call(model), 70// classModelView.call(model),
71 classElementView.call(c), 71// classElementView.call(c),
72 featuresView.call(model, f), 72// featuresView.call(model, f),
73 not(encapsulatesView.call(c, f)) 73// not(encapsulatesView.call(c, f))
74 ))); 74// )));
75 75//
76 TransformationRule assignFeatureRule = new TransformationRule("AssignFeature", 76// TransformationRule assignFeatureRule = new TransformationRule("AssignFeature",
77 assignFeaturePrecondition, 77// assignFeaturePrecondition,
78 (model) -> { 78// (model) -> {
79 var isEncapsulatedByInterpretation = model.getInterpretation(isEncapsulatedBy); 79// var isEncapsulatedByInterpretation = model.getInterpretation(isEncapsulatedBy);
80 return ((Tuple activation) -> { 80// return ((Tuple activation) -> {
81 var feature = activation.get(0); 81// var feature = activation.get(0);
82 var classElement = activation.get(1); 82// var classElement = activation.get(1);
83 83//
84 isEncapsulatedByInterpretation.put(Tuple.of(feature, classElement), true); 84// isEncapsulatedByInterpretation.put(Tuple.of(feature, classElement), true);
85 }); 85// });
86 }); 86// });
87 87//
88 TransformationRule deleteEmptyClassRule = new TransformationRule("DeleteEmptyClass", 88// TransformationRule deleteEmptyClassRule = new TransformationRule("DeleteEmptyClass",
89 deleteEmptyClassPrecondition, 89// deleteEmptyClassPrecondition,
90 (model) -> { 90// (model) -> {
91 var classesInterpretation = model.getInterpretation(classes); 91// var classesInterpretation = model.getInterpretation(classes);
92 var classElementInterpretation = model.getInterpretation(classElement); 92// var classElementInterpretation = model.getInterpretation(classElement);
93 return ((Tuple activation) -> { 93// return ((Tuple activation) -> {
94 var modelElement = activation.get(0); 94// var modelElement = activation.get(0);
95 var classElement = activation.get(1); 95// var classElement = activation.get(1);
96 96//
97 classesInterpretation.put(Tuple.of(modelElement, classElement), false); 97// classesInterpretation.put(Tuple.of(modelElement, classElement), false);
98 classElementInterpretation.put(Tuple.of(classElement), false); 98// classElementInterpretation.put(Tuple.of(classElement), false);
99 }); 99// });
100 }); 100// });
101 101//
102 102//
103 var store = ModelStore.builder() 103// var store = ModelStore.builder()
104 .symbols(classModel, classElement, feature, isEncapsulatedBy, encapsulates, classes, features) 104// .symbols(classModel, classElement, feature, isEncapsulatedBy, encapsulates, classes, features)
105 .with(ViatraModelQueryAdapter.builder() 105// .with(ViatraModelQueryAdapter.builder()
106 .queries(assignFeaturePrecondition, assignFeaturePreconditionHelper, 106// .queries(assignFeaturePrecondition, assignFeaturePreconditionHelper,
107 deleteEmptyClassPrecondition)) 107// deleteEmptyClassPrecondition))
108 .with(DesignSpaceExplorationAdapter.builder() 108// .with(DesignSpaceExplorationAdapter.builder()
109 .strategy(new DepthFirstStrategy().withDepthLimit(0))) 109// .strategy(new DepthFirstStrategy().withDepthLimit(0)))
110 .build(); 110// .build();
111 111//
112 var model = store.createEmptyModel(); 112// var model = store.createEmptyModel();
113 var queryEngine = model.getAdapter(ModelQueryAdapter.class); 113// var queryEngine = model.getAdapter(ModelQueryAdapter.class);
114 assignFeatureRule.prepare(model, queryEngine); 114// assignFeatureRule.prepare(model, queryEngine);
115 deleteEmptyClassRule.prepare(model, queryEngine); 115// deleteEmptyClassRule.prepare(model, queryEngine);
116 116//
117 var classModelInterpretation = model.getInterpretation(classModel); 117// var classModelInterpretation = model.getInterpretation(classModel);
118 var classElementInterpretation = model.getInterpretation(classElement); 118// var classElementInterpretation = model.getInterpretation(classElement);
119 var featureInterpretation = model.getInterpretation(feature); 119// var featureInterpretation = model.getInterpretation(feature);
120 var featuresInterpretation = model.getInterpretation(features); 120// var featuresInterpretation = model.getInterpretation(features);
121 var classesInterpretation = model.getInterpretation(classes); 121// var classesInterpretation = model.getInterpretation(classes);
122 122//
123 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); 123// var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
124 var newModel = dseAdapter.createObject(); 124// var newModel = dseAdapter.createObject();
125 var newModelId = newModel.get(0); 125// var newModelId = newModel.get(0);
126 var newClass1 = dseAdapter.createObject(); 126// var newClass1 = dseAdapter.createObject();
127 var newClass1Id = newClass1.get(0); 127// var newClass1Id = newClass1.get(0);
128 var newClass2 = dseAdapter.createObject(); 128// var newClass2 = dseAdapter.createObject();
129 var newClass2Id = newClass2.get(0); 129// var newClass2Id = newClass2.get(0);
130 var newField = dseAdapter.createObject(); 130// var newField = dseAdapter.createObject();
131 var newFieldId = newField.get(0); 131// var newFieldId = newField.get(0);
132 132//
133 classModelInterpretation.put(newModel, true); 133// classModelInterpretation.put(newModel, true);
134 classElementInterpretation.put(newClass1, true); 134// classElementInterpretation.put(newClass1, true);
135 classElementInterpretation.put(newClass2, true); 135// classElementInterpretation.put(newClass2, true);
136 featureInterpretation.put(newField, true); 136// featureInterpretation.put(newField, true);
137 classesInterpretation.put(Tuple.of(newModelId, newClass1Id), true); 137// classesInterpretation.put(Tuple.of(newModelId, newClass1Id), true);
138 classesInterpretation.put(Tuple.of(newModelId, newClass2Id), true); 138// classesInterpretation.put(Tuple.of(newModelId, newClass2Id), true);
139 featuresInterpretation.put(Tuple.of(newModelId, newFieldId), true); 139// featuresInterpretation.put(Tuple.of(newModelId, newFieldId), true);
140 140//
141 queryEngine.flushChanges(); 141// queryEngine.flushChanges();
142 142//
143 var assignFeatureRuleActivations = assignFeatureRule.getAllActivationsAsResultSet(); 143// var assignFeatureRuleActivations = assignFeatureRule.getAllActivationsAsResultSet();
144 var deleteEmptyClassRuleActivations = deleteEmptyClassRule.getAllActivationsAsResultSet(); 144// var deleteEmptyClassRuleActivations = deleteEmptyClassRule.getAllActivationsAsResultSet();
145 145//
146 assertResults(Map.of( 146// assertResults(Map.of(
147 Tuple.of(newClass1Id, newFieldId), true, 147// Tuple.of(newClass1Id, newFieldId), true,
148 Tuple.of(newClass2Id, newFieldId), true 148// Tuple.of(newClass2Id, newFieldId), true
149 ), assignFeatureRuleActivations); 149// ), assignFeatureRuleActivations);
150 150//
151 assertResults(Map.of( 151// assertResults(Map.of(
152 Tuple.of(newModelId, newClass1Id), true, 152// Tuple.of(newModelId, newClass1Id), true,
153 Tuple.of(newModelId, newClass2Id), true 153// Tuple.of(newModelId, newClass2Id), true
154 ), deleteEmptyClassRuleActivations); 154// ), deleteEmptyClassRuleActivations);
155 } 155// }
156 156//
157 @Test 157// @Test
158 void randomActivationTest() { 158// void randomActivationTest() {
159 var deleteEmptyClassPrecondition = Query.of("DeleteEmptyClassPrecondition", 159// var deleteEmptyClassPrecondition = Query.of("DeleteEmptyClassPrecondition",
160 (builder, model, c) -> builder.clause((f) -> List.of( 160// (builder, model, c) -> builder.clause((f) -> List.of(
161 classModelView.call(model), 161// classModelView.call(model),
162 classElementView.call(c), 162// classElementView.call(c),
163 featuresView.call(model, f), 163// featuresView.call(model, f),
164 not(encapsulatesView.call(c, f)) 164// not(encapsulatesView.call(c, f))
165 ))); 165// )));
166 166//
167 TransformationRule deleteEmptyClassRule0 = new TransformationRule("DeleteEmptyClass0", 167// TransformationRule deleteEmptyClassRule0 = new TransformationRule("DeleteEmptyClass0",
168 deleteEmptyClassPrecondition, 168// deleteEmptyClassPrecondition,
169 (model) -> { 169// (model) -> {
170 var classesInterpretation = model.getInterpretation(classes); 170// var classesInterpretation = model.getInterpretation(classes);
171 var classElementInterpretation = model.getInterpretation(classElement); 171// var classElementInterpretation = model.getInterpretation(classElement);
172 return ((Tuple activation) -> { 172// return ((Tuple activation) -> {
173 var modelElement = activation.get(0); 173// var modelElement = activation.get(0);
174 var classElement = activation.get(1); 174// var classElement = activation.get(1);
175 175//
176 classesInterpretation.put(Tuple.of(modelElement, classElement), false); 176// classesInterpretation.put(Tuple.of(modelElement, classElement), false);
177 classElementInterpretation.put(Tuple.of(classElement), false); 177// classElementInterpretation.put(Tuple.of(classElement), false);
178 }); 178// });
179 }, 179// },
180 0L); 180// 0L);
181 181//
182 TransformationRule deleteEmptyClassRule1 = new TransformationRule("DeleteEmptyClass1", 182// TransformationRule deleteEmptyClassRule1 = new TransformationRule("DeleteEmptyClass1",
183 deleteEmptyClassPrecondition, 183// deleteEmptyClassPrecondition,
184 (model) -> { 184// (model) -> {
185 var classesInterpretation = model.getInterpretation(classes); 185// var classesInterpretation = model.getInterpretation(classes);
186 var classElementInterpretation = model.getInterpretation(classElement); 186// var classElementInterpretation = model.getInterpretation(classElement);
187 return ((Tuple activation) -> { 187// return ((Tuple activation) -> {
188 var modelElement = activation.get(0); 188// var modelElement = activation.get(0);
189 var classElement = activation.get(1); 189// var classElement = activation.get(1);
190 190//
191 classesInterpretation.put(Tuple.of(modelElement, classElement), false); 191// classesInterpretation.put(Tuple.of(modelElement, classElement), false);
192 classElementInterpretation.put(Tuple.of(classElement), false); 192// classElementInterpretation.put(Tuple.of(classElement), false);
193 }); 193// });
194 }, 194// },
195 78634L); 195// 78634L);
196 196//
197 var store = ModelStore.builder() 197// var store = ModelStore.builder()
198 .symbols(classModel, classElement, feature, isEncapsulatedBy, encapsulates, classes, features) 198// .symbols(classModel, classElement, feature, isEncapsulatedBy, encapsulates, classes, features)
199 .with(ViatraModelQueryAdapter.builder() 199// .with(ViatraModelQueryAdapter.builder()
200 .queries(deleteEmptyClassPrecondition)) 200// .queries(deleteEmptyClassPrecondition))
201 .with(DesignSpaceExplorationAdapter.builder() 201// .with(DesignSpaceExplorationAdapter.builder()
202 .strategy(new DepthFirstStrategy().withDepthLimit(0))) 202// .strategy(new DepthFirstStrategy().withDepthLimit(0)))
203 .build(); 203// .build();
204 204//
205 var model = store.createEmptyModel(); 205// var model = store.createEmptyModel();
206 var queryEngine = model.getAdapter(ModelQueryAdapter.class); 206// var queryEngine = model.getAdapter(ModelQueryAdapter.class);
207 deleteEmptyClassRule0.prepare(model, queryEngine); 207// deleteEmptyClassRule0.prepare(model, queryEngine);
208 deleteEmptyClassRule1.prepare(model, queryEngine); 208// deleteEmptyClassRule1.prepare(model, queryEngine);
209 209//
210 var classModelInterpretation = model.getInterpretation(classModel); 210// var classModelInterpretation = model.getInterpretation(classModel);
211 var classElementInterpretation = model.getInterpretation(classElement); 211// var classElementInterpretation = model.getInterpretation(classElement);
212 var featureInterpretation = model.getInterpretation(feature); 212// var featureInterpretation = model.getInterpretation(feature);
213 var featuresInterpretation = model.getInterpretation(features); 213// var featuresInterpretation = model.getInterpretation(features);
214 var classesInterpretation = model.getInterpretation(classes); 214// var classesInterpretation = model.getInterpretation(classes);
215 215//
216 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); 216// var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
217 var newModel = dseAdapter.createObject(); 217// var newModel = dseAdapter.createObject();
218 var newModelId = newModel.get(0); 218// var newModelId = newModel.get(0);
219 var newClass1 = dseAdapter.createObject(); 219// var newClass1 = dseAdapter.createObject();
220 var newClass1Id = newClass1.get(0); 220// var newClass1Id = newClass1.get(0);
221 var newClass2 = dseAdapter.createObject(); 221// var newClass2 = dseAdapter.createObject();
222 var newClass2Id = newClass2.get(0); 222// var newClass2Id = newClass2.get(0);
223 var newField = dseAdapter.createObject(); 223// var newField = dseAdapter.createObject();
224 var newFieldId = newField.get(0); 224// var newFieldId = newField.get(0);
225 225//
226 classModelInterpretation.put(newModel, true); 226// classModelInterpretation.put(newModel, true);
227 classElementInterpretation.put(newClass1, true); 227// classElementInterpretation.put(newClass1, true);
228 classElementInterpretation.put(newClass2, true); 228// classElementInterpretation.put(newClass2, true);
229 featureInterpretation.put(newField, true); 229// featureInterpretation.put(newField, true);
230 classesInterpretation.put(Tuple.of(newModelId, newClass1Id), true); 230// classesInterpretation.put(Tuple.of(newModelId, newClass1Id), true);
231 classesInterpretation.put(Tuple.of(newModelId, newClass2Id), true); 231// classesInterpretation.put(Tuple.of(newModelId, newClass2Id), true);
232 featuresInterpretation.put(Tuple.of(newModelId, newFieldId), true); 232// featuresInterpretation.put(Tuple.of(newModelId, newFieldId), true);
233 233//
234 queryEngine.flushChanges(); 234// queryEngine.flushChanges();
235 235//
236 236//
237 var activation0 = deleteEmptyClassRule0.getRandomActivation().activation(); 237// var activation0 = deleteEmptyClassRule0.getRandomActivation().activation();
238 var activation1 = deleteEmptyClassRule1.getRandomActivation().activation(); 238// var activation1 = deleteEmptyClassRule1.getRandomActivation().activation();
239 239//
240 assertResults(Map.of( 240// assertResults(Map.of(
241 Tuple.of(newModelId, newClass1Id), true, 241// Tuple.of(newModelId, newClass1Id), true,
242 Tuple.of(newModelId, newClass2Id), true 242// Tuple.of(newModelId, newClass2Id), true
243 ), deleteEmptyClassRule0.getAllActivationsAsResultSet()); 243// ), deleteEmptyClassRule0.getAllActivationsAsResultSet());
244 244//
245 assertResults(Map.of( 245// assertResults(Map.of(
246 Tuple.of(newModelId, newClass1Id), true, 246// Tuple.of(newModelId, newClass1Id), true,
247 Tuple.of(newModelId, newClass2Id), true 247// Tuple.of(newModelId, newClass2Id), true
248 ), deleteEmptyClassRule1.getAllActivationsAsResultSet()); 248// ), deleteEmptyClassRule1.getAllActivationsAsResultSet());
249 249//
250 assertEquals(Tuple.of(newModelId, newClass2Id), activation0); 250// assertEquals(Tuple.of(newModelId, newClass2Id), activation0);
251 assertEquals(Tuple.of(newModelId, newClass1Id), activation1); 251// assertEquals(Tuple.of(newModelId, newClass1Id), activation1);
252 252//
253 } 253// }
254 254//
255 @Test 255// @Test
256 void fireTest() { 256// void fireTest() {
257 var deleteEmptyClassPrecondition = Query.of("DeleteEmptyClassPrecondition", 257// var deleteEmptyClassPrecondition = Query.of("DeleteEmptyClassPrecondition",
258 (builder, model, c) -> builder.clause((f) -> List.of( 258// (builder, model, c) -> builder.clause((f) -> List.of(
259 classModelView.call(model), 259// classModelView.call(model),
260 classElementView.call(c), 260// classElementView.call(c),
261 featuresView.call(model, f), 261// featuresView.call(model, f),
262 not(encapsulatesView.call(c, f)) 262// not(encapsulatesView.call(c, f))
263 ))); 263// )));
264 264//
265 TransformationRule deleteEmptyClassRule = new TransformationRule("DeleteEmptyClass", 265// TransformationRule deleteEmptyClassRule = new TransformationRule("DeleteEmptyClass",
266 deleteEmptyClassPrecondition, 266// deleteEmptyClassPrecondition,
267 (model) -> { 267// (model) -> {
268 var classesInterpretation = model.getInterpretation(classes); 268// var classesInterpretation = model.getInterpretation(classes);
269 var classElementInterpretation = model.getInterpretation(classElement); 269// var classElementInterpretation = model.getInterpretation(classElement);
270 return ((Tuple activation) -> { 270// return ((Tuple activation) -> {
271 var modelElement = activation.get(0); 271// var modelElement = activation.get(0);
272 var classElement = activation.get(1); 272// var classElement = activation.get(1);
273 273//
274 classesInterpretation.put(Tuple.of(modelElement, classElement), false); 274// classesInterpretation.put(Tuple.of(modelElement, classElement), false);
275 classElementInterpretation.put(Tuple.of(classElement), false); 275// classElementInterpretation.put(Tuple.of(classElement), false);
276 }); 276// });
277 }); 277// });
278 278//
279 var store = ModelStore.builder() 279// var store = ModelStore.builder()
280 .symbols(classModel, classElement, feature, isEncapsulatedBy, encapsulates, classes, features) 280// .symbols(classModel, classElement, feature, isEncapsulatedBy, encapsulates, classes, features)
281 .with(ViatraModelQueryAdapter.builder() 281// .with(ViatraModelQueryAdapter.builder()
282 .queries(deleteEmptyClassPrecondition)) 282// .queries(deleteEmptyClassPrecondition))
283 .with(DesignSpaceExplorationAdapter.builder() 283// .with(DesignSpaceExplorationAdapter.builder()
284 .strategy(new DepthFirstStrategy().withDepthLimit(0))) 284// .strategy(new DepthFirstStrategy().withDepthLimit(0)))
285 .build(); 285// .build();
286 286//
287 var model = store.createEmptyModel(); 287// var model = store.createEmptyModel();
288 var queryEngine = model.getAdapter(ModelQueryAdapter.class); 288// var queryEngine = model.getAdapter(ModelQueryAdapter.class);
289 deleteEmptyClassRule.prepare(model, queryEngine); 289// deleteEmptyClassRule.prepare(model, queryEngine);
290 290//
291 var classModelInterpretation = model.getInterpretation(classModel); 291// var classModelInterpretation = model.getInterpretation(classModel);
292 var classElementInterpretation = model.getInterpretation(classElement); 292// var classElementInterpretation = model.getInterpretation(classElement);
293 var featureInterpretation = model.getInterpretation(feature); 293// var featureInterpretation = model.getInterpretation(feature);
294 var featuresInterpretation = model.getInterpretation(features); 294// var featuresInterpretation = model.getInterpretation(features);
295 var classesInterpretation = model.getInterpretation(classes); 295// var classesInterpretation = model.getInterpretation(classes);
296 296//
297 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); 297// var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
298 var newModel = dseAdapter.createObject(); 298// var newModel = dseAdapter.createObject();
299 var newModelId = newModel.get(0); 299// var newModelId = newModel.get(0);
300 var newClass1 = dseAdapter.createObject(); 300// var newClass1 = dseAdapter.createObject();
301 var newClass1Id = newClass1.get(0); 301// var newClass1Id = newClass1.get(0);
302 var newClass2 = dseAdapter.createObject(); 302// var newClass2 = dseAdapter.createObject();
303 var newClass2Id = newClass2.get(0); 303// var newClass2Id = newClass2.get(0);
304 var newField = dseAdapter.createObject(); 304// var newField = dseAdapter.createObject();
305 var newFieldId = newField.get(0); 305// var newFieldId = newField.get(0);
306 306//
307 classModelInterpretation.put(newModel, true); 307// classModelInterpretation.put(newModel, true);
308 classElementInterpretation.put(newClass1, true); 308// classElementInterpretation.put(newClass1, true);
309 classElementInterpretation.put(newClass2, true); 309// classElementInterpretation.put(newClass2, true);
310 featureInterpretation.put(newField, true); 310// featureInterpretation.put(newField, true);
311 classesInterpretation.put(Tuple.of(newModelId, newClass1Id), true); 311// classesInterpretation.put(Tuple.of(newModelId, newClass1Id), true);
312 classesInterpretation.put(Tuple.of(newModelId, newClass2Id), true); 312// classesInterpretation.put(Tuple.of(newModelId, newClass2Id), true);
313 featuresInterpretation.put(Tuple.of(newModelId, newFieldId), true); 313// featuresInterpretation.put(Tuple.of(newModelId, newFieldId), true);
314 314//
315 queryEngine.flushChanges(); 315// queryEngine.flushChanges();
316 316//
317 assertResults(Map.of( 317// assertResults(Map.of(
318 Tuple.of(newModelId, newClass1Id), true, 318// Tuple.of(newModelId, newClass1Id), true,
319 Tuple.of(newModelId, newClass2Id), true 319// Tuple.of(newModelId, newClass2Id), true
320 ), deleteEmptyClassRule.getAllActivationsAsResultSet()); 320// ), deleteEmptyClassRule.getAllActivationsAsResultSet());
321 321//
322 322//
323 deleteEmptyClassRule.fireActivation(Tuple.of(0, 1)); 323// deleteEmptyClassRule.fireActivation(Tuple.of(0, 1));
324 324//
325 assertResults(Map.of( 325// assertResults(Map.of(
326 Tuple.of(newModelId, newClass1Id), false, 326// Tuple.of(newModelId, newClass1Id), false,
327 Tuple.of(newModelId, newClass2Id), true 327// Tuple.of(newModelId, newClass2Id), true
328 ), deleteEmptyClassRule.getAllActivationsAsResultSet()); 328// ), deleteEmptyClassRule.getAllActivationsAsResultSet());
329 } 329// }
330 330//
331 @Test 331// @Test
332 void randomFireTest() { 332// void randomFireTest() {
333 var deleteEmptyClassPrecondition = Query.of("DeleteEmptyClassPrecondition", 333// var deleteEmptyClassPrecondition = Query.of("DeleteEmptyClassPrecondition",
334 (builder, model, c) -> builder.clause((f) -> List.of( 334// (builder, model, c) -> builder.clause((f) -> List.of(
335 classModelView.call(model), 335// classModelView.call(model),
336 classElementView.call(c), 336// classElementView.call(c),
337 featuresView.call(model, f), 337// featuresView.call(model, f),
338 not(encapsulatesView.call(c, f)) 338// not(encapsulatesView.call(c, f))
339 ))); 339// )));
340 340//
341 TransformationRule deleteEmptyClassRule = new TransformationRule("DeleteEmptyClass0", 341// TransformationRule deleteEmptyClassRule = new TransformationRule("DeleteEmptyClass0",
342 deleteEmptyClassPrecondition, 342// deleteEmptyClassPrecondition,
343 (model) -> { 343// (model) -> {
344 var classesInterpretation = model.getInterpretation(classes); 344// var classesInterpretation = model.getInterpretation(classes);
345 var classElementInterpretation = model.getInterpretation(classElement); 345// var classElementInterpretation = model.getInterpretation(classElement);
346 return ((Tuple activation) -> { 346// return ((Tuple activation) -> {
347 var modelElement = activation.get(0); 347// var modelElement = activation.get(0);
348 var classElement = activation.get(1); 348// var classElement = activation.get(1);
349 349//
350 classesInterpretation.put(Tuple.of(modelElement, classElement), false); 350// classesInterpretation.put(Tuple.of(modelElement, classElement), false);
351 classElementInterpretation.put(Tuple.of(classElement), false); 351// classElementInterpretation.put(Tuple.of(classElement), false);
352 }); 352// });
353 }, 353// },
354 0L); 354// 0L);
355 355//
356 var store = ModelStore.builder() 356// var store = ModelStore.builder()
357 .symbols(classModel, classElement, feature, isEncapsulatedBy, encapsulates, classes, features) 357// .symbols(classModel, classElement, feature, isEncapsulatedBy, encapsulates, classes, features)
358 .with(ViatraModelQueryAdapter.builder() 358// .with(ViatraModelQueryAdapter.builder()
359 .queries(deleteEmptyClassPrecondition)) 359// .queries(deleteEmptyClassPrecondition))
360 .with(DesignSpaceExplorationAdapter.builder() 360// .with(DesignSpaceExplorationAdapter.builder()
361 .strategy(new DepthFirstStrategy().withDepthLimit(0))) 361// .strategy(new DepthFirstStrategy().withDepthLimit(0)))
362 .build(); 362// .build();
363 363//
364 var model = store.createEmptyModel(); 364// var model = store.createEmptyModel();
365 var queryEngine = model.getAdapter(ModelQueryAdapter.class); 365// var queryEngine = model.getAdapter(ModelQueryAdapter.class);
366 deleteEmptyClassRule.prepare(model, queryEngine); 366// deleteEmptyClassRule.prepare(model, queryEngine);
367 367//
368 var classModelInterpretation = model.getInterpretation(classModel); 368// var classModelInterpretation = model.getInterpretation(classModel);
369 var classElementInterpretation = model.getInterpretation(classElement); 369// var classElementInterpretation = model.getInterpretation(classElement);
370 var featureInterpretation = model.getInterpretation(feature); 370// var featureInterpretation = model.getInterpretation(feature);
371 var featuresInterpretation = model.getInterpretation(features); 371// var featuresInterpretation = model.getInterpretation(features);
372 var classesInterpretation = model.getInterpretation(classes); 372// var classesInterpretation = model.getInterpretation(classes);
373 373//
374 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); 374// var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
375 var newModel = dseAdapter.createObject(); 375// var newModel = dseAdapter.createObject();
376 var newModelId = newModel.get(0); 376// var newModelId = newModel.get(0);
377 var newClass1 = dseAdapter.createObject(); 377// var newClass1 = dseAdapter.createObject();
378 var newClass1Id = newClass1.get(0); 378// var newClass1Id = newClass1.get(0);
379 var newClass2 = dseAdapter.createObject(); 379// var newClass2 = dseAdapter.createObject();
380 var newClass2Id = newClass2.get(0); 380// var newClass2Id = newClass2.get(0);
381 var newField = dseAdapter.createObject(); 381// var newField = dseAdapter.createObject();
382 var newFieldId = newField.get(0); 382// var newFieldId = newField.get(0);
383 383//
384 classModelInterpretation.put(newModel, true); 384// classModelInterpretation.put(newModel, true);
385 classElementInterpretation.put(newClass1, true); 385// classElementInterpretation.put(newClass1, true);
386 classElementInterpretation.put(newClass2, true); 386// classElementInterpretation.put(newClass2, true);
387 featureInterpretation.put(newField, true); 387// featureInterpretation.put(newField, true);
388 classesInterpretation.put(Tuple.of(newModelId, newClass1Id), true); 388// classesInterpretation.put(Tuple.of(newModelId, newClass1Id), true);
389 classesInterpretation.put(Tuple.of(newModelId, newClass2Id), true); 389// classesInterpretation.put(Tuple.of(newModelId, newClass2Id), true);
390 featuresInterpretation.put(Tuple.of(newModelId, newFieldId), true); 390// featuresInterpretation.put(Tuple.of(newModelId, newFieldId), true);
391 391//
392 queryEngine.flushChanges(); 392// queryEngine.flushChanges();
393 393//
394 assertResults(Map.of( 394// assertResults(Map.of(
395 Tuple.of(newModelId, newClass1Id), true, 395// Tuple.of(newModelId, newClass1Id), true,
396 Tuple.of(newModelId, newClass2Id), true 396// Tuple.of(newModelId, newClass2Id), true
397 ), deleteEmptyClassRule.getAllActivationsAsResultSet()); 397// ), deleteEmptyClassRule.getAllActivationsAsResultSet());
398 398//
399 deleteEmptyClassRule.fireRandomActivation(); 399// deleteEmptyClassRule.fireRandomActivation();
400 400//
401 assertResults(Map.of( 401// assertResults(Map.of(
402 Tuple.of(newModelId, newClass1Id), true, 402// Tuple.of(newModelId, newClass1Id), true,
403 Tuple.of(newModelId, newClass2Id), false 403// Tuple.of(newModelId, newClass2Id), false
404 ), deleteEmptyClassRule.getAllActivationsAsResultSet()); 404// ), deleteEmptyClassRule.getAllActivationsAsResultSet());
405 405//
406 deleteEmptyClassRule.fireRandomActivation(); 406// deleteEmptyClassRule.fireRandomActivation();
407 407//
408 assertResults(Map.of( 408// assertResults(Map.of(
409 Tuple.of(newModelId, newClass1Id), false, 409// Tuple.of(newModelId, newClass1Id), false,
410 Tuple.of(newModelId, newClass2Id), false 410// Tuple.of(newModelId, newClass2Id), false
411 ), deleteEmptyClassRule.getAllActivationsAsResultSet()); 411// ), deleteEmptyClassRule.getAllActivationsAsResultSet());
412 412//
413 } 413// }
414} 414}