diff options
Diffstat (limited to 'subprojects/store-dse/src/test/java/tools/refinery/store')
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 | */ |
6 | package tools.refinery.store.dse; | 6 | package tools.refinery.store.dse; |
7 | 7 | ||
8 | import org.junit.jupiter.api.Disabled; | ||
8 | import org.junit.jupiter.api.Test; | 9 | import org.junit.jupiter.api.Test; |
10 | import tools.refinery.store.dse.objectives.AlwaysSatisfiedRandomHardObjective; | ||
9 | import tools.refinery.store.model.ModelStore; | 11 | import tools.refinery.store.model.ModelStore; |
10 | import tools.refinery.store.query.ModelQueryAdapter; | 12 | import tools.refinery.store.query.ModelQueryAdapter; |
11 | import tools.refinery.store.query.dnf.Query; | 13 | import tools.refinery.store.query.dnf.Query; |
@@ -25,7 +27,7 @@ import java.util.List; | |||
25 | 27 | ||
26 | import static tools.refinery.store.query.literal.Literals.not; | 28 | import static tools.refinery.store.query.literal.Literals.not; |
27 | 29 | ||
28 | public class CRAExamplesTest { | 30 | class 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 | */ |
6 | package tools.refinery.store.dse; | 6 | package tools.refinery.store.dse; |
7 | 7 | ||
8 | import org.junit.jupiter.api.Disabled; | ||
8 | import org.junit.jupiter.api.Test; | 9 | import org.junit.jupiter.api.Test; |
10 | import tools.refinery.store.dse.objectives.AlwaysSatisfiedRandomHardObjective; | ||
9 | import tools.refinery.store.model.ModelStore; | 11 | import tools.refinery.store.model.ModelStore; |
10 | import tools.refinery.store.query.ModelQueryAdapter; | 12 | import tools.refinery.store.query.ModelQueryAdapter; |
11 | import tools.refinery.store.query.dnf.Query; | 13 | import tools.refinery.store.query.dnf.Query; |
@@ -20,7 +22,7 @@ import tools.refinery.store.tuple.Tuple; | |||
20 | import tools.refinery.visualization.ModelVisualizerAdapter; | 22 | import tools.refinery.visualization.ModelVisualizerAdapter; |
21 | import tools.refinery.visualization.internal.FileFormat; | 23 | import tools.refinery.visualization.internal.FileFormat; |
22 | 24 | ||
23 | public class DebugTest { | 25 | class 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; | |||
17 | import tools.refinery.store.query.view.KeyOnlyView; | 17 | import tools.refinery.store.query.view.KeyOnlyView; |
18 | import tools.refinery.store.representation.Symbol; | 18 | import tools.refinery.store.representation.Symbol; |
19 | import tools.refinery.store.tuple.Tuple; | 19 | import tools.refinery.store.tuple.Tuple; |
20 | import tools.refinery.visualization.ModelVisualizerAdapter; | ||
21 | 20 | ||
22 | import static org.junit.jupiter.api.Assertions.assertEquals; | 21 | import static org.junit.jupiter.api.Assertions.assertEquals; |
23 | 22 | ||
24 | public class DesignSpaceExplorationTest { | 23 | class 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 @@ | |||
6 | package tools.refinery.store.dse; | 6 | package tools.refinery.store.dse; |
7 | 7 | ||
8 | import org.junit.jupiter.api.Test; | 8 | import org.junit.jupiter.api.Test; |
9 | import tools.refinery.store.dse.strategy.DepthFirstStrategy; | ||
9 | import tools.refinery.store.model.ModelStore; | 10 | import tools.refinery.store.model.ModelStore; |
10 | import tools.refinery.store.query.ModelQueryAdapter; | 11 | import tools.refinery.store.query.ModelQueryAdapter; |
11 | import tools.refinery.store.query.dnf.Query; | 12 | import tools.refinery.store.query.dnf.Query; |
@@ -23,7 +24,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; | |||
23 | import static tools.refinery.store.query.literal.Literals.not; | 24 | import static tools.refinery.store.query.literal.Literals.not; |
24 | import static tools.refinery.store.dse.tests.QueryAssertions.assertResults; | 25 | import static tools.refinery.store.dse.tests.QueryAssertions.assertResults; |
25 | 26 | ||
26 | public class TransformationRuleTest { | 27 | class 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 | } |