From 1f853e4590d7f235bf8a63fa017fc92369a80a5a Mon Sep 17 00:00:00 2001 From: Attila Ficsor Date: Tue, 8 Aug 2023 13:57:19 +0200 Subject: Refactor search strategy to improve readability --- .../tools/refinery/store/dse/CRAExamplesTest.java | 4 +- .../java/tools/refinery/store/dse/DebugTest.java | 4 +- .../store/dse/DesignSpaceExplorationTest.java | 168 +++++++++++++++++++-- .../refinery/store/dse/TransformationRuleTest.java | 13 +- 4 files changed, 167 insertions(+), 22 deletions(-) (limited to 'subprojects/store-dse/src/test/java/tools') 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 d761db02..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 @@ -201,8 +201,8 @@ class CRAExamplesTest { .with(DesignSpaceExplorationAdapter.builder() .transformations(assignFeatureRule, deleteEmptyClassRule, createClassRule, moveFeatureRule) .objectives(new AlwaysSatisfiedRandomHardObjective()) -// .strategy(new DepthFirstStrategy(3).continueIfHardObjectivesFulfilled() - .strategy(new BestFirstStrategy(6).continueIfHardObjectivesFulfilled() +// .strategy(new DepthFirstStrategy().withDepthLimit(3).continueIfHardObjectivesFulfilled() + .strategy(new BestFirstStrategy().withDepthLimit(6).continueIfHardObjectivesFulfilled() // .goOnOnlyIfFitnessIsBetter() )) .build(); 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 36bc6cce..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 @@ -103,8 +103,8 @@ class DebugTest { .with(DesignSpaceExplorationAdapter.builder() .transformations(createClassRule, createFeatureRule) .objectives(new AlwaysSatisfiedRandomHardObjective()) - .strategy(new DepthFirstStrategy(4).continueIfHardObjectivesFulfilled() -// .strategy(new BestFirstStrategy(4).continueIfHardObjectivesFulfilled() + .strategy(new DepthFirstStrategy().withDepthLimit(4).continueIfHardObjectivesFulfilled() +// .strategy(new BestFirstStrategy().withDepthLimit(4).continueIfHardObjectivesFulfilled() // .goOnOnlyIfFitnessIsBetter() )) .build(); 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 89adbf65..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 @@ -49,7 +49,8 @@ class DesignSpaceExplorationTest { void createObjectTest() { var store = ModelStore.builder() .with(ViatraModelQueryAdapter.builder()) - .with(DesignSpaceExplorationAdapter.builder()) + .with(DesignSpaceExplorationAdapter.builder() + .strategy(new DepthFirstStrategy().withDepthLimit(0))) .build(); var model = store.createEmptyModel(); @@ -77,7 +78,8 @@ class DesignSpaceExplorationTest { void deleteMiddleObjectTest() { var store = ModelStore.builder() .with(ViatraModelQueryAdapter.builder()) - .with(DesignSpaceExplorationAdapter.builder()) + .with(DesignSpaceExplorationAdapter.builder() + .strategy(new DepthFirstStrategy())) .build(); var model = store.createEmptyModel(); @@ -118,7 +120,7 @@ class DesignSpaceExplorationTest { .symbols(classModel) .with(ViatraModelQueryAdapter.builder()) .with(DesignSpaceExplorationAdapter.builder() - .strategy(new DepthFirstStrategy(0))) + .strategy(new DepthFirstStrategy().withDepthLimit(0))) .build(); var model = store.createEmptyModel(); @@ -158,7 +160,7 @@ class DesignSpaceExplorationTest { .queries(createClassPrecondition)) .with(DesignSpaceExplorationAdapter.builder() .transformations(createClassRule) - .strategy(new DepthFirstStrategy(4) + .strategy(new DepthFirstStrategy().withDepthLimit(0) )) .build(); @@ -204,7 +206,7 @@ class DesignSpaceExplorationTest { .queries(createClassPrecondition)) .with(DesignSpaceExplorationAdapter.builder() .transformations(createClassRule) - .strategy(new DepthFirstStrategy(4).continueIfHardObjectivesFulfilled() + .strategy(new DepthFirstStrategy().withDepthLimit(4).continueIfHardObjectivesFulfilled() )) .build(); @@ -272,7 +274,7 @@ class DesignSpaceExplorationTest { .queries(createClassPrecondition, createFeaturePrecondition)) .with(DesignSpaceExplorationAdapter.builder() .transformations(createClassRule, createFeatureRule) - .strategy(new DepthFirstStrategy(10).continueIfHardObjectivesFulfilled() + .strategy(new DepthFirstStrategy().withDepthLimit(10).continueIfHardObjectivesFulfilled() )) .build(); @@ -289,12 +291,81 @@ class DesignSpaceExplorationTest { } @Test - void BFSTrivialTest() { + void DFSSolutionLimitTest() { + var createClassPrecondition = Query.of("CreateClassPrecondition", + (builder, model) -> builder.clause( + classModelView.call(model) + )); + + var createClassRule = new TransformationRule("CreateClass", + createClassPrecondition, + (model) -> { + var classesInterpretation = model.getInterpretation(classes); + var classElementInterpretation = model.getInterpretation(classElement); + return ((Tuple activation) -> { + var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); + var modelElement = activation.get(0); + + var newClassElement = dseAdapter.createObject(); + var newClassElementId = newClassElement.get(0); + + classesInterpretation.put(Tuple.of(modelElement, newClassElementId), true); + classElementInterpretation.put(Tuple.of(newClassElementId), true); + }); + }); + + var createFeaturePrecondition = Query.of("CreateFeaturePrecondition", + (builder, model) -> builder.clause( + classModelView.call(model) + )); + + var createFeatureRule = new TransformationRule("CreateFeature", + createFeaturePrecondition, + (model) -> { + var featuresInterpretation = model.getInterpretation(features); + var featureInterpretation = model.getInterpretation(feature); + return ((Tuple activation) -> { + var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); + var modelElement = activation.get(0); + + var newClassElement = dseAdapter.createObject(); + var newClassElementId = newClassElement.get(0); + + featuresInterpretation.put(Tuple.of(modelElement, newClassElementId), true); + featureInterpretation.put(Tuple.of(newClassElementId), true); + }); + }); + + var store = ModelStore.builder() + .symbols(classModel, classElement, classes, feature, features, isEncapsulatedBy, encapsulates) + .with(ViatraModelQueryAdapter.builder() + .queries(createClassPrecondition, createFeaturePrecondition)) + .with(DesignSpaceExplorationAdapter.builder() + .transformations(createClassRule, createFeatureRule) + .strategy(new DepthFirstStrategy().withSolutionLimit(222) + .continueIfHardObjectivesFulfilled() + )) + .build(); + + var model = store.createEmptyModel(); + var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); + + var modelElementInterpretation = model.getInterpretation(classModel); + modelElementInterpretation.put(dseAdapter.createObject(), true); + queryEngine.flushChanges(); + + var states = dseAdapter.explore(); + assertEquals(222, states.size()); + } + + @Test + void BeFSTrivialTest() { var store = ModelStore.builder() .symbols(classModel) .with(ViatraModelQueryAdapter.builder()) .with(DesignSpaceExplorationAdapter.builder() - .strategy(new BestFirstStrategy(0))) + .strategy(new BestFirstStrategy().withDepthLimit(0))) .build(); var model = store.createEmptyModel(); @@ -305,7 +376,7 @@ class DesignSpaceExplorationTest { } @Test - void BFSOneRuleTest() { + void BeFSOneRuleTest() { var createClassPrecondition = Query.of("CreateClassPrecondition", (builder, model) -> builder.clause( classModelView.call(model) @@ -334,7 +405,7 @@ class DesignSpaceExplorationTest { .queries(createClassPrecondition)) .with(DesignSpaceExplorationAdapter.builder() .transformations(createClassRule) - .strategy(new BestFirstStrategy(4) + .strategy(new BestFirstStrategy().withDepthLimit(4) )) .build(); @@ -351,7 +422,7 @@ class DesignSpaceExplorationTest { } @Test - void BFSContinueTest() { + void BeFSContinueTest() { var createClassPrecondition = Query.of("CreateClassPrecondition", (builder, model) -> builder.clause( classModelView.call(model) @@ -380,7 +451,7 @@ class DesignSpaceExplorationTest { .queries(createClassPrecondition)) .with(DesignSpaceExplorationAdapter.builder() .transformations(createClassRule) - .strategy(new BestFirstStrategy(4).continueIfHardObjectivesFulfilled() + .strategy(new BestFirstStrategy().withDepthLimit(4).continueIfHardObjectivesFulfilled() )) .build(); @@ -397,7 +468,7 @@ class DesignSpaceExplorationTest { } @Test - void BFSCompletenessTest() { + void BeFSCompletenessTest() { var createClassPrecondition = Query.of("CreateClassPrecondition", (builder, model) -> builder.clause( classModelView.call(model) @@ -448,7 +519,7 @@ class DesignSpaceExplorationTest { .queries(createClassPrecondition, createFeaturePrecondition)) .with(DesignSpaceExplorationAdapter.builder() .transformations(createClassRule, createFeatureRule) - .strategy(new BestFirstStrategy(10).continueIfHardObjectivesFulfilled() + .strategy(new BestFirstStrategy().withDepthLimit(10).continueIfHardObjectivesFulfilled() )) .build(); @@ -464,4 +535,73 @@ class DesignSpaceExplorationTest { assertEquals(2047, states.size()); } + @Test + void BeFSSolutionLimitTest() { + var createClassPrecondition = Query.of("CreateClassPrecondition", + (builder, model) -> builder.clause( + classModelView.call(model) + )); + + var createClassRule = new TransformationRule("CreateClass", + createClassPrecondition, + (model) -> { + var classesInterpretation = model.getInterpretation(classes); + var classElementInterpretation = model.getInterpretation(classElement); + return ((Tuple activation) -> { + var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); + var modelElement = activation.get(0); + + var newClassElement = dseAdapter.createObject(); + var newClassElementId = newClassElement.get(0); + + classesInterpretation.put(Tuple.of(modelElement, newClassElementId), true); + classElementInterpretation.put(Tuple.of(newClassElementId), true); + }); + }); + + var createFeaturePrecondition = Query.of("CreateFeaturePrecondition", + (builder, model) -> builder.clause( + classModelView.call(model) + )); + + var createFeatureRule = new TransformationRule("CreateFeature", + createFeaturePrecondition, + (model) -> { + var featuresInterpretation = model.getInterpretation(features); + var featureInterpretation = model.getInterpretation(feature); + return ((Tuple activation) -> { + var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); + var modelElement = activation.get(0); + + var newClassElement = dseAdapter.createObject(); + var newClassElementId = newClassElement.get(0); + + featuresInterpretation.put(Tuple.of(modelElement, newClassElementId), true); + featureInterpretation.put(Tuple.of(newClassElementId), true); + }); + }); + + var store = ModelStore.builder() + .symbols(classModel, classElement, classes, feature, features, isEncapsulatedBy, encapsulates) + .with(ViatraModelQueryAdapter.builder() + .queries(createClassPrecondition, createFeaturePrecondition)) + .with(DesignSpaceExplorationAdapter.builder() + .transformations(createClassRule, createFeatureRule) + .strategy(new BestFirstStrategy().withSolutionLimit(222) + .continueIfHardObjectivesFulfilled() + )) + .build(); + + var model = store.createEmptyModel(); + var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); + + var modelElementInterpretation = model.getInterpretation(classModel); + modelElementInterpretation.put(dseAdapter.createObject(), true); + queryEngine.flushChanges(); + + var states = dseAdapter.explore(); + assertEquals(222, states.size()); + } + } 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 3aa4c92e..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 @@ package tools.refinery.store.dse; import org.junit.jupiter.api.Test; +import tools.refinery.store.dse.strategy.DepthFirstStrategy; import tools.refinery.store.model.ModelStore; import tools.refinery.store.query.ModelQueryAdapter; import tools.refinery.store.query.dnf.Query; @@ -103,7 +104,8 @@ class TransformationRuleTest { .with(ViatraModelQueryAdapter.builder() .queries(assignFeaturePrecondition, assignFeaturePreconditionHelper, deleteEmptyClassPrecondition)) - .with(DesignSpaceExplorationAdapter.builder()) + .with(DesignSpaceExplorationAdapter.builder() + .strategy(new DepthFirstStrategy().withDepthLimit(0))) .build(); var model = store.createEmptyModel(); @@ -195,7 +197,8 @@ class TransformationRuleTest { .symbols(classModel, classElement, feature, isEncapsulatedBy, encapsulates, classes, features) .with(ViatraModelQueryAdapter.builder() .queries(deleteEmptyClassPrecondition)) - .with(DesignSpaceExplorationAdapter.builder()) + .with(DesignSpaceExplorationAdapter.builder() + .strategy(new DepthFirstStrategy().withDepthLimit(0))) .build(); var model = store.createEmptyModel(); @@ -276,7 +279,8 @@ class TransformationRuleTest { .symbols(classModel, classElement, feature, isEncapsulatedBy, encapsulates, classes, features) .with(ViatraModelQueryAdapter.builder() .queries(deleteEmptyClassPrecondition)) - .with(DesignSpaceExplorationAdapter.builder()) + .with(DesignSpaceExplorationAdapter.builder() + .strategy(new DepthFirstStrategy().withDepthLimit(0))) .build(); var model = store.createEmptyModel(); @@ -352,7 +356,8 @@ class TransformationRuleTest { .symbols(classModel, classElement, feature, isEncapsulatedBy, encapsulates, classes, features) .with(ViatraModelQueryAdapter.builder() .queries(deleteEmptyClassPrecondition)) - .with(DesignSpaceExplorationAdapter.builder()) + .with(DesignSpaceExplorationAdapter.builder() + .strategy(new DepthFirstStrategy().withDepthLimit(0))) .build(); var model = store.createEmptyModel(); -- cgit v1.2.3-54-g00ecf