aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/store-dse/src/test/java/tools
diff options
context:
space:
mode:
Diffstat (limited to 'subprojects/store-dse/src/test/java/tools')
-rw-r--r--subprojects/store-dse/src/test/java/tools/refinery/store/dse/CRAExamplesTest.java21
-rw-r--r--subprojects/store-dse/src/test/java/tools/refinery/store/dse/DebugTest.java21
-rw-r--r--subprojects/store-dse/src/test/java/tools/refinery/store/dse/DesignSpaceExplorationTest.java179
-rw-r--r--subprojects/store-dse/src/test/java/tools/refinery/store/dse/TransformationRuleTest.java33
4 files changed, 202 insertions, 52 deletions
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 4bdb05ec..225de32e 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,7 +5,9 @@
5 */ 5 */
6package tools.refinery.store.dse; 6package tools.refinery.store.dse;
7 7
8import org.junit.jupiter.api.Disabled;
8import org.junit.jupiter.api.Test; 9import org.junit.jupiter.api.Test;
10import tools.refinery.store.dse.objectives.AlwaysSatisfiedRandomHardObjective;
9import tools.refinery.store.model.ModelStore; 11import tools.refinery.store.model.ModelStore;
10import tools.refinery.store.query.ModelQueryAdapter; 12import tools.refinery.store.query.ModelQueryAdapter;
11import tools.refinery.store.query.dnf.Query; 13import tools.refinery.store.query.dnf.Query;
@@ -25,7 +27,7 @@ import java.util.List;
25 27
26import static tools.refinery.store.query.literal.Literals.not; 28import static tools.refinery.store.query.literal.Literals.not;
27 29
28public class CRAExamplesTest { 30class CRAExamplesTest {
29 private static final Symbol<String> name = Symbol.of("Name", 1, String.class); 31 private static final Symbol<String> name = Symbol.of("Name", 1, String.class);
30 32
31// private static final Symbol<Boolean> classModel = Symbol.of("ClassModel", 1); 33// private static final Symbol<Boolean> classModel = Symbol.of("ClassModel", 1);
@@ -180,6 +182,7 @@ public class CRAExamplesTest {
180 }); 182 });
181 183
182 @Test 184 @Test
185 @Disabled("This test is only for debugging purposes")
183 void craTest() { 186 void craTest() {
184 var store = ModelStore.builder() 187 var store = ModelStore.builder()
185 .symbols(classElement, encapsulates, classes, features, attribute, method, dataDependency, 188 .symbols(classElement, encapsulates, classes, features, attribute, method, dataDependency,
@@ -188,11 +191,18 @@ public class CRAExamplesTest {
188 .queries(feature, assignFeaturePreconditionHelper, assignFeaturePrecondition, 191 .queries(feature, assignFeaturePreconditionHelper, assignFeaturePrecondition,
189 deleteEmptyClassPrecondition, createClassPreconditionHelper, createClassPrecondition, 192 deleteEmptyClassPrecondition, createClassPreconditionHelper, createClassPrecondition,
190 moveFeaturePrecondition)) 193 moveFeaturePrecondition))
191 .with(ModelVisualizerAdapter.builder()) 194 .with(ModelVisualizerAdapter.builder()
195 .withOutputpath("test_output")
196 .withFormat(FileFormat.DOT)
197 .withFormat(FileFormat.SVG)
198 .saveStates()
199 .saveDesignSpace()
200 )
192 .with(DesignSpaceExplorationAdapter.builder() 201 .with(DesignSpaceExplorationAdapter.builder()
193 .transformations(assignFeatureRule, deleteEmptyClassRule, createClassRule, moveFeatureRule) 202 .transformations(assignFeatureRule, deleteEmptyClassRule, createClassRule, moveFeatureRule)
194// .strategy(new DepthFirstStrategy(3).continueIfHardObjectivesFulfilled() 203 .objectives(new AlwaysSatisfiedRandomHardObjective())
195 .strategy(new BestFirstStrategy(6).continueIfHardObjectivesFulfilled() 204// .strategy(new DepthFirstStrategy().withDepthLimit(3).continueIfHardObjectivesFulfilled()
205 .strategy(new BestFirstStrategy().withDepthLimit(6).continueIfHardObjectivesFulfilled()
196// .goOnOnlyIfFitnessIsBetter() 206// .goOnOnlyIfFitnessIsBetter()
197 )) 207 ))
198 .build(); 208 .build();
@@ -271,9 +281,6 @@ public class CRAExamplesTest {
271 281
272 var states = dseAdapter.explore(); 282 var states = dseAdapter.explore();
273 System.out.println("states size: " + states.size()); 283 System.out.println("states size: " + states.size());
274 System.out.println("states: " + states);
275 var visualizer = model.getAdapter(ModelVisualizerAdapter.class);
276 visualizer.renderDesignSpace("test_output", FileFormat.SVG);
277 } 284 }
278 285
279} 286}
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 101a5362..c6da896c 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,7 +5,9 @@
5 */ 5 */
6package tools.refinery.store.dse; 6package tools.refinery.store.dse;
7 7
8import org.junit.jupiter.api.Disabled;
8import org.junit.jupiter.api.Test; 9import org.junit.jupiter.api.Test;
10import tools.refinery.store.dse.objectives.AlwaysSatisfiedRandomHardObjective;
9import tools.refinery.store.model.ModelStore; 11import tools.refinery.store.model.ModelStore;
10import tools.refinery.store.query.ModelQueryAdapter; 12import tools.refinery.store.query.ModelQueryAdapter;
11import tools.refinery.store.query.dnf.Query; 13import tools.refinery.store.query.dnf.Query;
@@ -20,7 +22,7 @@ import tools.refinery.store.tuple.Tuple;
20import tools.refinery.visualization.ModelVisualizerAdapter; 22import tools.refinery.visualization.ModelVisualizerAdapter;
21import tools.refinery.visualization.internal.FileFormat; 23import tools.refinery.visualization.internal.FileFormat;
22 24
23public class DebugTest { 25class DebugTest {
24 private static final Symbol<Boolean> classModel = Symbol.of("ClassModel", 1); 26 private static final Symbol<Boolean> classModel = Symbol.of("ClassModel", 1);
25 private static final Symbol<Boolean> classElement = Symbol.of("ClassElement", 1); 27 private static final Symbol<Boolean> classElement = Symbol.of("ClassElement", 1);
26 private static final Symbol<Boolean> feature = Symbol.of("Feature", 1); 28 private static final Symbol<Boolean> feature = Symbol.of("Feature", 1);
@@ -41,6 +43,7 @@ public class DebugTest {
41 43
42 44
43 @Test 45 @Test
46 @Disabled("This test is only for debugging purposes")
44 void BFSTest() { 47 void BFSTest() {
45 var createClassPrecondition = Query.of("CreateClassPrecondition", 48 var createClassPrecondition = Query.of("CreateClassPrecondition",
46 (builder, model) -> builder.clause( 49 (builder, model) -> builder.clause(
@@ -90,11 +93,18 @@ public class DebugTest {
90 .symbols(classModel, classElement, feature, isEncapsulatedBy, encapsulates, classes, features) 93 .symbols(classModel, classElement, feature, isEncapsulatedBy, encapsulates, classes, features)
91 .with(ViatraModelQueryAdapter.builder() 94 .with(ViatraModelQueryAdapter.builder()
92 .queries(createClassPrecondition, createFeaturePrecondition)) 95 .queries(createClassPrecondition, createFeaturePrecondition))
93 .with(ModelVisualizerAdapter.builder()) 96 .with(ModelVisualizerAdapter.builder()
97 .withOutputpath("test_output")
98 .withFormat(FileFormat.DOT)
99 .withFormat(FileFormat.SVG)
100 .saveStates()
101 .saveDesignSpace()
102 )
94 .with(DesignSpaceExplorationAdapter.builder() 103 .with(DesignSpaceExplorationAdapter.builder()
95 .transformations(createClassRule, createFeatureRule) 104 .transformations(createClassRule, createFeatureRule)
96 .strategy(new DepthFirstStrategy(4).continueIfHardObjectivesFulfilled() 105 .objectives(new AlwaysSatisfiedRandomHardObjective())
97// .strategy(new BestFirstStrategy(4).continueIfHardObjectivesFulfilled() 106 .strategy(new DepthFirstStrategy().withDepthLimit(4).continueIfHardObjectivesFulfilled()
107// .strategy(new BestFirstStrategy().withDepthLimit(4).continueIfHardObjectivesFulfilled()
98// .goOnOnlyIfFitnessIsBetter() 108// .goOnOnlyIfFitnessIsBetter()
99 )) 109 ))
100 .build(); 110 .build();
@@ -113,10 +123,7 @@ public class DebugTest {
113 123
114 124
115 var states = dseAdapter.explore(); 125 var states = dseAdapter.explore();
116 var visualizer = model.getAdapter(ModelVisualizerAdapter.class);
117 visualizer.renderDesignSpace("test_output", FileFormat.SVG);
118 System.out.println("states size: " + states.size()); 126 System.out.println("states size: " + states.size());
119 System.out.println("states: " + states);
120 127
121 } 128 }
122} 129}
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 f4644407..91e33f4a 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
@@ -17,11 +17,10 @@ import tools.refinery.store.query.view.AnySymbolView;
17import tools.refinery.store.query.view.KeyOnlyView; 17import tools.refinery.store.query.view.KeyOnlyView;
18import tools.refinery.store.representation.Symbol; 18import tools.refinery.store.representation.Symbol;
19import tools.refinery.store.tuple.Tuple; 19import tools.refinery.store.tuple.Tuple;
20import tools.refinery.visualization.ModelVisualizerAdapter;
21 20
22import static org.junit.jupiter.api.Assertions.assertEquals; 21import static org.junit.jupiter.api.Assertions.assertEquals;
23 22
24public class DesignSpaceExplorationTest { 23class DesignSpaceExplorationTest {
25// private static final Symbol<Boolean> namedElement = Symbol.of("NamedElement", 1); 24// private static final Symbol<Boolean> namedElement = Symbol.of("NamedElement", 1);
26// private static final Symbol<Boolean> attribute = Symbol.of("Attribute", 1); 25// private static final Symbol<Boolean> attribute = Symbol.of("Attribute", 1);
27// private static final Symbol<Boolean> method = Symbol.of("Method", 1); 26// private static final Symbol<Boolean> method = Symbol.of("Method", 1);
@@ -50,7 +49,8 @@ public class DesignSpaceExplorationTest {
50 void createObjectTest() { 49 void createObjectTest() {
51 var store = ModelStore.builder() 50 var store = ModelStore.builder()
52 .with(ViatraModelQueryAdapter.builder()) 51 .with(ViatraModelQueryAdapter.builder())
53 .with(DesignSpaceExplorationAdapter.builder()) 52 .with(DesignSpaceExplorationAdapter.builder()
53 .strategy(new DepthFirstStrategy().withDepthLimit(0)))
54 .build(); 54 .build();
55 55
56 var model = store.createEmptyModel(); 56 var model = store.createEmptyModel();
@@ -78,7 +78,8 @@ public class DesignSpaceExplorationTest {
78 void deleteMiddleObjectTest() { 78 void deleteMiddleObjectTest() {
79 var store = ModelStore.builder() 79 var store = ModelStore.builder()
80 .with(ViatraModelQueryAdapter.builder()) 80 .with(ViatraModelQueryAdapter.builder())
81 .with(DesignSpaceExplorationAdapter.builder()) 81 .with(DesignSpaceExplorationAdapter.builder()
82 .strategy(new DepthFirstStrategy()))
82 .build(); 83 .build();
83 84
84 var model = store.createEmptyModel(); 85 var model = store.createEmptyModel();
@@ -118,9 +119,8 @@ public class DesignSpaceExplorationTest {
118 var store = ModelStore.builder() 119 var store = ModelStore.builder()
119 .symbols(classModel) 120 .symbols(classModel)
120 .with(ViatraModelQueryAdapter.builder()) 121 .with(ViatraModelQueryAdapter.builder())
121 .with(ModelVisualizerAdapter.builder())
122 .with(DesignSpaceExplorationAdapter.builder() 122 .with(DesignSpaceExplorationAdapter.builder()
123 .strategy(new DepthFirstStrategy(0))) 123 .strategy(new DepthFirstStrategy().withDepthLimit(0)))
124 .build(); 124 .build();
125 125
126 var model = store.createEmptyModel(); 126 var model = store.createEmptyModel();
@@ -158,10 +158,9 @@ public class DesignSpaceExplorationTest {
158 .symbols(classModel, classElement, classes) 158 .symbols(classModel, classElement, classes)
159 .with(ViatraModelQueryAdapter.builder() 159 .with(ViatraModelQueryAdapter.builder()
160 .queries(createClassPrecondition)) 160 .queries(createClassPrecondition))
161 .with(ModelVisualizerAdapter.builder())
162 .with(DesignSpaceExplorationAdapter.builder() 161 .with(DesignSpaceExplorationAdapter.builder()
163 .transformations(createClassRule) 162 .transformations(createClassRule)
164 .strategy(new DepthFirstStrategy(4) 163 .strategy(new DepthFirstStrategy().withDepthLimit(0)
165 )) 164 ))
166 .build(); 165 .build();
167 166
@@ -205,10 +204,9 @@ public class DesignSpaceExplorationTest {
205 .symbols(classModel, classElement, classes) 204 .symbols(classModel, classElement, classes)
206 .with(ViatraModelQueryAdapter.builder() 205 .with(ViatraModelQueryAdapter.builder()
207 .queries(createClassPrecondition)) 206 .queries(createClassPrecondition))
208 .with(ModelVisualizerAdapter.builder())
209 .with(DesignSpaceExplorationAdapter.builder() 207 .with(DesignSpaceExplorationAdapter.builder()
210 .transformations(createClassRule) 208 .transformations(createClassRule)
211 .strategy(new DepthFirstStrategy(4).continueIfHardObjectivesFulfilled() 209 .strategy(new DepthFirstStrategy().withDepthLimit(4).continueIfHardObjectivesFulfilled()
212 )) 210 ))
213 .build(); 211 .build();
214 212
@@ -274,10 +272,9 @@ public class DesignSpaceExplorationTest {
274 .symbols(classModel, classElement, classes, feature, features, isEncapsulatedBy, encapsulates) 272 .symbols(classModel, classElement, classes, feature, features, isEncapsulatedBy, encapsulates)
275 .with(ViatraModelQueryAdapter.builder() 273 .with(ViatraModelQueryAdapter.builder()
276 .queries(createClassPrecondition, createFeaturePrecondition)) 274 .queries(createClassPrecondition, createFeaturePrecondition))
277 .with(ModelVisualizerAdapter.builder())
278 .with(DesignSpaceExplorationAdapter.builder() 275 .with(DesignSpaceExplorationAdapter.builder()
279 .transformations(createClassRule, createFeatureRule) 276 .transformations(createClassRule, createFeatureRule)
280 .strategy(new DepthFirstStrategy(10).continueIfHardObjectivesFulfilled() 277 .strategy(new DepthFirstStrategy().withDepthLimit(10).continueIfHardObjectivesFulfilled()
281 )) 278 ))
282 .build(); 279 .build();
283 280
@@ -294,13 +291,81 @@ public class DesignSpaceExplorationTest {
294 } 291 }
295 292
296 @Test 293 @Test
297 void BFSTrivialTest() { 294 void DFSSolutionLimitTest() {
295 var createClassPrecondition = Query.of("CreateClassPrecondition",
296 (builder, model) -> builder.clause(
297 classModelView.call(model)
298 ));
299
300 var createClassRule = new TransformationRule("CreateClass",
301 createClassPrecondition,
302 (model) -> {
303 var classesInterpretation = model.getInterpretation(classes);
304 var classElementInterpretation = model.getInterpretation(classElement);
305 return ((Tuple activation) -> {
306 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
307 var modelElement = activation.get(0);
308
309 var newClassElement = dseAdapter.createObject();
310 var newClassElementId = newClassElement.get(0);
311
312 classesInterpretation.put(Tuple.of(modelElement, newClassElementId), true);
313 classElementInterpretation.put(Tuple.of(newClassElementId), true);
314 });
315 });
316
317 var createFeaturePrecondition = Query.of("CreateFeaturePrecondition",
318 (builder, model) -> builder.clause(
319 classModelView.call(model)
320 ));
321
322 var createFeatureRule = new TransformationRule("CreateFeature",
323 createFeaturePrecondition,
324 (model) -> {
325 var featuresInterpretation = model.getInterpretation(features);
326 var featureInterpretation = model.getInterpretation(feature);
327 return ((Tuple activation) -> {
328 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
329 var modelElement = activation.get(0);
330
331 var newClassElement = dseAdapter.createObject();
332 var newClassElementId = newClassElement.get(0);
333
334 featuresInterpretation.put(Tuple.of(modelElement, newClassElementId), true);
335 featureInterpretation.put(Tuple.of(newClassElementId), true);
336 });
337 });
338
339 var store = ModelStore.builder()
340 .symbols(classModel, classElement, classes, feature, features, isEncapsulatedBy, encapsulates)
341 .with(ViatraModelQueryAdapter.builder()
342 .queries(createClassPrecondition, createFeaturePrecondition))
343 .with(DesignSpaceExplorationAdapter.builder()
344 .transformations(createClassRule, createFeatureRule)
345 .strategy(new DepthFirstStrategy().withSolutionLimit(222)
346 .continueIfHardObjectivesFulfilled()
347 ))
348 .build();
349
350 var model = store.createEmptyModel();
351 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
352 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
353
354 var modelElementInterpretation = model.getInterpretation(classModel);
355 modelElementInterpretation.put(dseAdapter.createObject(), true);
356 queryEngine.flushChanges();
357
358 var states = dseAdapter.explore();
359 assertEquals(222, states.size());
360 }
361
362 @Test
363 void BeFSTrivialTest() {
298 var store = ModelStore.builder() 364 var store = ModelStore.builder()
299 .symbols(classModel) 365 .symbols(classModel)
300 .with(ViatraModelQueryAdapter.builder()) 366 .with(ViatraModelQueryAdapter.builder())
301 .with(ModelVisualizerAdapter.builder())
302 .with(DesignSpaceExplorationAdapter.builder() 367 .with(DesignSpaceExplorationAdapter.builder()
303 .strategy(new BestFirstStrategy(0))) 368 .strategy(new BestFirstStrategy().withDepthLimit(0)))
304 .build(); 369 .build();
305 370
306 var model = store.createEmptyModel(); 371 var model = store.createEmptyModel();
@@ -311,7 +376,7 @@ public class DesignSpaceExplorationTest {
311 } 376 }
312 377
313 @Test 378 @Test
314 void BFSOneRuleTest() { 379 void BeFSOneRuleTest() {
315 var createClassPrecondition = Query.of("CreateClassPrecondition", 380 var createClassPrecondition = Query.of("CreateClassPrecondition",
316 (builder, model) -> builder.clause( 381 (builder, model) -> builder.clause(
317 classModelView.call(model) 382 classModelView.call(model)
@@ -338,10 +403,9 @@ public class DesignSpaceExplorationTest {
338 .symbols(classModel, classElement, classes) 403 .symbols(classModel, classElement, classes)
339 .with(ViatraModelQueryAdapter.builder() 404 .with(ViatraModelQueryAdapter.builder()
340 .queries(createClassPrecondition)) 405 .queries(createClassPrecondition))
341 .with(ModelVisualizerAdapter.builder())
342 .with(DesignSpaceExplorationAdapter.builder() 406 .with(DesignSpaceExplorationAdapter.builder()
343 .transformations(createClassRule) 407 .transformations(createClassRule)
344 .strategy(new BestFirstStrategy(4) 408 .strategy(new BestFirstStrategy().withDepthLimit(4)
345 )) 409 ))
346 .build(); 410 .build();
347 411
@@ -358,7 +422,7 @@ public class DesignSpaceExplorationTest {
358 } 422 }
359 423
360 @Test 424 @Test
361 void BFSContinueTest() { 425 void BeFSContinueTest() {
362 var createClassPrecondition = Query.of("CreateClassPrecondition", 426 var createClassPrecondition = Query.of("CreateClassPrecondition",
363 (builder, model) -> builder.clause( 427 (builder, model) -> builder.clause(
364 classModelView.call(model) 428 classModelView.call(model)
@@ -385,10 +449,9 @@ public class DesignSpaceExplorationTest {
385 .symbols(classModel, classElement, classes) 449 .symbols(classModel, classElement, classes)
386 .with(ViatraModelQueryAdapter.builder() 450 .with(ViatraModelQueryAdapter.builder()
387 .queries(createClassPrecondition)) 451 .queries(createClassPrecondition))
388 .with(ModelVisualizerAdapter.builder())
389 .with(DesignSpaceExplorationAdapter.builder() 452 .with(DesignSpaceExplorationAdapter.builder()
390 .transformations(createClassRule) 453 .transformations(createClassRule)
391 .strategy(new BestFirstStrategy(4).continueIfHardObjectivesFulfilled() 454 .strategy(new BestFirstStrategy().withDepthLimit(4).continueIfHardObjectivesFulfilled()
392 )) 455 ))
393 .build(); 456 .build();
394 457
@@ -405,7 +468,7 @@ public class DesignSpaceExplorationTest {
405 } 468 }
406 469
407 @Test 470 @Test
408 void BFSCompletenessTest() { 471 void BeFSCompletenessTest() {
409 var createClassPrecondition = Query.of("CreateClassPrecondition", 472 var createClassPrecondition = Query.of("CreateClassPrecondition",
410 (builder, model) -> builder.clause( 473 (builder, model) -> builder.clause(
411 classModelView.call(model) 474 classModelView.call(model)
@@ -454,10 +517,9 @@ public class DesignSpaceExplorationTest {
454 .symbols(classModel, classElement, classes, feature, features, isEncapsulatedBy, encapsulates) 517 .symbols(classModel, classElement, classes, feature, features, isEncapsulatedBy, encapsulates)
455 .with(ViatraModelQueryAdapter.builder() 518 .with(ViatraModelQueryAdapter.builder()
456 .queries(createClassPrecondition, createFeaturePrecondition)) 519 .queries(createClassPrecondition, createFeaturePrecondition))
457 .with(ModelVisualizerAdapter.builder())
458 .with(DesignSpaceExplorationAdapter.builder() 520 .with(DesignSpaceExplorationAdapter.builder()
459 .transformations(createClassRule, createFeatureRule) 521 .transformations(createClassRule, createFeatureRule)
460 .strategy(new BestFirstStrategy(10).continueIfHardObjectivesFulfilled() 522 .strategy(new BestFirstStrategy().withDepthLimit(10).continueIfHardObjectivesFulfilled()
461 )) 523 ))
462 .build(); 524 .build();
463 525
@@ -473,4 +535,73 @@ public class DesignSpaceExplorationTest {
473 assertEquals(2047, states.size()); 535 assertEquals(2047, states.size());
474 } 536 }
475 537
538 @Test
539 void BeFSSolutionLimitTest() {
540 var createClassPrecondition = Query.of("CreateClassPrecondition",
541 (builder, model) -> builder.clause(
542 classModelView.call(model)
543 ));
544
545 var createClassRule = new TransformationRule("CreateClass",
546 createClassPrecondition,
547 (model) -> {
548 var classesInterpretation = model.getInterpretation(classes);
549 var classElementInterpretation = model.getInterpretation(classElement);
550 return ((Tuple activation) -> {
551 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
552 var modelElement = activation.get(0);
553
554 var newClassElement = dseAdapter.createObject();
555 var newClassElementId = newClassElement.get(0);
556
557 classesInterpretation.put(Tuple.of(modelElement, newClassElementId), true);
558 classElementInterpretation.put(Tuple.of(newClassElementId), true);
559 });
560 });
561
562 var createFeaturePrecondition = Query.of("CreateFeaturePrecondition",
563 (builder, model) -> builder.clause(
564 classModelView.call(model)
565 ));
566
567 var createFeatureRule = new TransformationRule("CreateFeature",
568 createFeaturePrecondition,
569 (model) -> {
570 var featuresInterpretation = model.getInterpretation(features);
571 var featureInterpretation = model.getInterpretation(feature);
572 return ((Tuple activation) -> {
573 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
574 var modelElement = activation.get(0);
575
576 var newClassElement = dseAdapter.createObject();
577 var newClassElementId = newClassElement.get(0);
578
579 featuresInterpretation.put(Tuple.of(modelElement, newClassElementId), true);
580 featureInterpretation.put(Tuple.of(newClassElementId), true);
581 });
582 });
583
584 var store = ModelStore.builder()
585 .symbols(classModel, classElement, classes, feature, features, isEncapsulatedBy, encapsulates)
586 .with(ViatraModelQueryAdapter.builder()
587 .queries(createClassPrecondition, createFeaturePrecondition))
588 .with(DesignSpaceExplorationAdapter.builder()
589 .transformations(createClassRule, createFeatureRule)
590 .strategy(new BestFirstStrategy().withSolutionLimit(222)
591 .continueIfHardObjectivesFulfilled()
592 ))
593 .build();
594
595 var model = store.createEmptyModel();
596 var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
597 var queryEngine = model.getAdapter(ModelQueryAdapter.class);
598
599 var modelElementInterpretation = model.getInterpretation(classModel);
600 modelElementInterpretation.put(dseAdapter.createObject(), true);
601 queryEngine.flushChanges();
602
603 var states = dseAdapter.explore();
604 assertEquals(222, states.size());
605 }
606
476} 607}
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 312bcebd..5d24d712 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,6 +6,7 @@
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;
9import tools.refinery.store.model.ModelStore; 10import tools.refinery.store.model.ModelStore;
10import tools.refinery.store.query.ModelQueryAdapter; 11import tools.refinery.store.query.ModelQueryAdapter;
11import tools.refinery.store.query.dnf.Query; 12import tools.refinery.store.query.dnf.Query;
@@ -23,7 +24,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
23import static tools.refinery.store.query.literal.Literals.not; 24import static tools.refinery.store.query.literal.Literals.not;
24import static tools.refinery.store.dse.tests.QueryAssertions.assertResults; 25import static tools.refinery.store.dse.tests.QueryAssertions.assertResults;
25 26
26public class TransformationRuleTest { 27class TransformationRuleTest {
27 28
28 private static final Symbol<Boolean> classModel = Symbol.of("ClassModel", 1); 29 private static final Symbol<Boolean> classModel = Symbol.of("ClassModel", 1);
29 private static final Symbol<Boolean> classElement = Symbol.of("ClassElement", 1); 30 private static final Symbol<Boolean> classElement = Symbol.of("ClassElement", 1);
@@ -103,7 +104,8 @@ public class TransformationRuleTest {
103 .with(ViatraModelQueryAdapter.builder() 104 .with(ViatraModelQueryAdapter.builder()
104 .queries(assignFeaturePrecondition, assignFeaturePreconditionHelper, 105 .queries(assignFeaturePrecondition, assignFeaturePreconditionHelper,
105 deleteEmptyClassPrecondition)) 106 deleteEmptyClassPrecondition))
106 .with(DesignSpaceExplorationAdapter.builder()) 107 .with(DesignSpaceExplorationAdapter.builder()
108 .strategy(new DepthFirstStrategy().withDepthLimit(0)))
107 .build(); 109 .build();
108 110
109 var model = store.createEmptyModel(); 111 var model = store.createEmptyModel();
@@ -137,8 +139,8 @@ public class TransformationRuleTest {
137 139
138 queryEngine.flushChanges(); 140 queryEngine.flushChanges();
139 141
140 var assignFeatureRuleActivations = assignFeatureRule.getAllActivationsAsSets(); 142 var assignFeatureRuleActivations = assignFeatureRule.getAllActivationsAsResultSet();
141 var deleteEmptyClassRuleActivations = deleteEmptyClassRule.getAllActivationsAsSets(); 143 var deleteEmptyClassRuleActivations = deleteEmptyClassRule.getAllActivationsAsResultSet();
142 144
143 assertResults(Map.of( 145 assertResults(Map.of(
144 Tuple.of(newClass1Id, newFieldId), true, 146 Tuple.of(newClass1Id, newFieldId), true,
@@ -195,7 +197,8 @@ public class TransformationRuleTest {
195 .symbols(classModel, classElement, feature, isEncapsulatedBy, encapsulates, classes, features) 197 .symbols(classModel, classElement, feature, isEncapsulatedBy, encapsulates, classes, features)
196 .with(ViatraModelQueryAdapter.builder() 198 .with(ViatraModelQueryAdapter.builder()
197 .queries(deleteEmptyClassPrecondition)) 199 .queries(deleteEmptyClassPrecondition))
198 .with(DesignSpaceExplorationAdapter.builder()) 200 .with(DesignSpaceExplorationAdapter.builder()
201 .strategy(new DepthFirstStrategy().withDepthLimit(0)))
199 .build(); 202 .build();
200 203
201 var model = store.createEmptyModel(); 204 var model = store.createEmptyModel();
@@ -236,12 +239,12 @@ public class TransformationRuleTest {
236 assertResults(Map.of( 239 assertResults(Map.of(
237 Tuple.of(newModelId, newClass1Id), true, 240 Tuple.of(newModelId, newClass1Id), true,
238 Tuple.of(newModelId, newClass2Id), true 241 Tuple.of(newModelId, newClass2Id), true
239 ), deleteEmptyClassRule0.getAllActivationsAsSets()); 242 ), deleteEmptyClassRule0.getAllActivationsAsResultSet());
240 243
241 assertResults(Map.of( 244 assertResults(Map.of(
242 Tuple.of(newModelId, newClass1Id), true, 245 Tuple.of(newModelId, newClass1Id), true,
243 Tuple.of(newModelId, newClass2Id), true 246 Tuple.of(newModelId, newClass2Id), true
244 ), deleteEmptyClassRule1.getAllActivationsAsSets()); 247 ), deleteEmptyClassRule1.getAllActivationsAsResultSet());
245 248
246 assertEquals(Tuple.of(newModelId, newClass2Id), activation0); 249 assertEquals(Tuple.of(newModelId, newClass2Id), activation0);
247 assertEquals(Tuple.of(newModelId, newClass1Id), activation1); 250 assertEquals(Tuple.of(newModelId, newClass1Id), activation1);
@@ -276,7 +279,8 @@ public class TransformationRuleTest {
276 .symbols(classModel, classElement, feature, isEncapsulatedBy, encapsulates, classes, features) 279 .symbols(classModel, classElement, feature, isEncapsulatedBy, encapsulates, classes, features)
277 .with(ViatraModelQueryAdapter.builder() 280 .with(ViatraModelQueryAdapter.builder()
278 .queries(deleteEmptyClassPrecondition)) 281 .queries(deleteEmptyClassPrecondition))
279 .with(DesignSpaceExplorationAdapter.builder()) 282 .with(DesignSpaceExplorationAdapter.builder()
283 .strategy(new DepthFirstStrategy().withDepthLimit(0)))
280 .build(); 284 .build();
281 285
282 var model = store.createEmptyModel(); 286 var model = store.createEmptyModel();
@@ -312,7 +316,7 @@ public class TransformationRuleTest {
312 assertResults(Map.of( 316 assertResults(Map.of(
313 Tuple.of(newModelId, newClass1Id), true, 317 Tuple.of(newModelId, newClass1Id), true,
314 Tuple.of(newModelId, newClass2Id), true 318 Tuple.of(newModelId, newClass2Id), true
315 ), deleteEmptyClassRule.getAllActivationsAsSets()); 319 ), deleteEmptyClassRule.getAllActivationsAsResultSet());
316 320
317 321
318 deleteEmptyClassRule.fireActivation(Tuple.of(0, 1)); 322 deleteEmptyClassRule.fireActivation(Tuple.of(0, 1));
@@ -320,7 +324,7 @@ public class TransformationRuleTest {
320 assertResults(Map.of( 324 assertResults(Map.of(
321 Tuple.of(newModelId, newClass1Id), false, 325 Tuple.of(newModelId, newClass1Id), false,
322 Tuple.of(newModelId, newClass2Id), true 326 Tuple.of(newModelId, newClass2Id), true
323 ), deleteEmptyClassRule.getAllActivationsAsSets()); 327 ), deleteEmptyClassRule.getAllActivationsAsResultSet());
324 } 328 }
325 329
326 @Test 330 @Test
@@ -352,7 +356,8 @@ public class TransformationRuleTest {
352 .symbols(classModel, classElement, feature, isEncapsulatedBy, encapsulates, classes, features) 356 .symbols(classModel, classElement, feature, isEncapsulatedBy, encapsulates, classes, features)
353 .with(ViatraModelQueryAdapter.builder() 357 .with(ViatraModelQueryAdapter.builder()
354 .queries(deleteEmptyClassPrecondition)) 358 .queries(deleteEmptyClassPrecondition))
355 .with(DesignSpaceExplorationAdapter.builder()) 359 .with(DesignSpaceExplorationAdapter.builder()
360 .strategy(new DepthFirstStrategy().withDepthLimit(0)))
356 .build(); 361 .build();
357 362
358 var model = store.createEmptyModel(); 363 var model = store.createEmptyModel();
@@ -388,21 +393,21 @@ public class TransformationRuleTest {
388 assertResults(Map.of( 393 assertResults(Map.of(
389 Tuple.of(newModelId, newClass1Id), true, 394 Tuple.of(newModelId, newClass1Id), true,
390 Tuple.of(newModelId, newClass2Id), true 395 Tuple.of(newModelId, newClass2Id), true
391 ), deleteEmptyClassRule.getAllActivationsAsSets()); 396 ), deleteEmptyClassRule.getAllActivationsAsResultSet());
392 397
393 deleteEmptyClassRule.fireRandomActivation(); 398 deleteEmptyClassRule.fireRandomActivation();
394 399
395 assertResults(Map.of( 400 assertResults(Map.of(
396 Tuple.of(newModelId, newClass1Id), true, 401 Tuple.of(newModelId, newClass1Id), true,
397 Tuple.of(newModelId, newClass2Id), false 402 Tuple.of(newModelId, newClass2Id), false
398 ), deleteEmptyClassRule.getAllActivationsAsSets()); 403 ), deleteEmptyClassRule.getAllActivationsAsResultSet());
399 404
400 deleteEmptyClassRule.fireRandomActivation(); 405 deleteEmptyClassRule.fireRandomActivation();
401 406
402 assertResults(Map.of( 407 assertResults(Map.of(
403 Tuple.of(newModelId, newClass1Id), false, 408 Tuple.of(newModelId, newClass1Id), false,
404 Tuple.of(newModelId, newClass2Id), false 409 Tuple.of(newModelId, newClass2Id), false
405 ), deleteEmptyClassRule.getAllActivationsAsSets()); 410 ), deleteEmptyClassRule.getAllActivationsAsResultSet());
406 411
407 } 412 }
408} 413}