From 741ff77e0e841cdf3fd893e1fb3d1ccccc6a83e4 Mon Sep 17 00:00:00 2001 From: nagilooh Date: Thu, 7 Sep 2023 17:34:37 +0200 Subject: fix issues with DSE framework --- .../tools/refinery/store/dse/CRAExamplesTest.java | 28 ++- .../java/tools/refinery/store/dse/DebugTest.java | 190 ++++++++++++--------- .../refinery/store/dse/tests/DummyCriterion.java | 5 + .../refinery/store/dse/tests/DummyObjective.java | 5 + .../store/dse/tests/DummyRandomCriterion.java | 25 +++ .../store/dse/tests/DummyRandomObjective.java | 23 +++ 6 files changed, 176 insertions(+), 100 deletions(-) create mode 100644 subprojects/store-dse/src/test/java/tools/refinery/store/dse/tests/DummyRandomCriterion.java create mode 100644 subprojects/store-dse/src/test/java/tools/refinery/store/dse/tests/DummyRandomObjective.java (limited to 'subprojects/store-dse/src/test/java') 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 f4c38b18..831b9ff0 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 @@ -9,6 +9,8 @@ import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import tools.refinery.store.dse.modification.ModificationAdapter; import tools.refinery.store.dse.strategy.BestFirstStoreManager; +import tools.refinery.store.dse.tests.DummyRandomCriterion; +import tools.refinery.store.dse.tests.DummyRandomObjective; import tools.refinery.store.dse.transition.DesignSpaceExplorationAdapter; import tools.refinery.store.dse.tests.DummyCriterion; import tools.refinery.store.dse.tests.DummyObjective; @@ -188,7 +190,7 @@ class CRAExamplesTest { }); @Test -// @Disabled("This test is only for debugging purposes") + @Disabled("This test is only for debugging purposes") void craTest() { var store = ModelStore.builder() .symbols(classElement, encapsulates, classes, features, attribute, method, dataDependency, @@ -197,24 +199,20 @@ class CRAExamplesTest { .queries(feature, assignFeaturePreconditionHelper, assignFeaturePrecondition, deleteEmptyClassPrecondition, createClassPreconditionHelper, createClassPrecondition, moveFeaturePrecondition)) -// .with(ModelVisualizerAdapter.builder() -// .withOutputpath("test_output") -// .withFormat(FileFormat.DOT) -// .withFormat(FileFormat.SVG) -// .saveStates() -// .saveDesignSpace() -// ) + .with(ModelVisualizerAdapter.builder() + .withOutputpath("test_output") + .withFormat(FileFormat.DOT) + .withFormat(FileFormat.SVG) + .saveStates() + .saveDesignSpace() + ) .with(StateCoderAdapter.builder()) .with(ModificationAdapter.builder()) .with(DesignSpaceExplorationAdapter.builder() .transformations(assignFeatureRule, deleteEmptyClassRule, createClassRule, moveFeatureRule) - .objectives(new DummyObjective()) - .accept(new DummyCriterion(true)) + .objectives(new DummyRandomObjective()) + .accept(new DummyRandomCriterion()) .exclude(new DummyCriterion(false)) -// .objectives(new AlwaysSatisfiedRandomHardObjective()) -// .strategy(new DepthFirstStrategy().withDepthLimit(3).continueIfHardObjectivesFulfilled() -// .strategy(new BestFirstStrategy().withDepthLimit(6).continueIfHardObjectivesFulfilled() -// .goOnOnlyIfFitnessIsBetter()) ) .build(); @@ -296,7 +294,5 @@ class CRAExamplesTest { bestFirst.startExploration(initialVersion); var resultStore = bestFirst.getSolutionStore(); System.out.println("states size: " + resultStore.getSolutions().size()); - var modelVisualizerAdapter = model.getAdapter(ModelVisualizerAdapter.class); - modelVisualizerAdapter.visualize(); } } 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 1d757a5f..87c3892a 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,9 +5,27 @@ */ package tools.refinery.store.dse; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import tools.refinery.store.dse.modification.ModificationAdapter; +import tools.refinery.store.dse.strategy.BestFirstStoreManager; +import tools.refinery.store.dse.tests.DummyCriterion; +import tools.refinery.store.dse.tests.DummyObjective; +import tools.refinery.store.dse.tests.DummyRandomCriterion; +import tools.refinery.store.dse.tests.DummyRandomObjective; +import tools.refinery.store.dse.transition.DesignSpaceExplorationAdapter; +import tools.refinery.store.dse.transition.TransformationRule; +import tools.refinery.store.model.ModelStore; +import tools.refinery.store.query.ModelQueryAdapter; +import tools.refinery.store.query.dnf.Query; +import tools.refinery.store.query.viatra.ViatraModelQueryAdapter; import tools.refinery.store.query.view.AnySymbolView; import tools.refinery.store.query.view.KeyOnlyView; import tools.refinery.store.representation.Symbol; +import tools.refinery.store.statecoding.StateCoderAdapter; +import tools.refinery.store.tuple.Tuple; +import tools.refinery.visualization.ModelVisualizerAdapter; +import tools.refinery.visualization.internal.FileFormat; class DebugTest { private static final Symbol classModel = Symbol.of("ClassModel", 1); @@ -29,88 +47,92 @@ class DebugTest { private static final AnySymbolView classesView = new KeyOnlyView<>(classes); -// @Test -// @Disabled("This test is only for debugging purposes") -// void BFSTest() { -// 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, feature, isEncapsulatedBy, encapsulates, classes, features) -// .with(ViatraModelQueryAdapter.builder() -// .queries(createClassPrecondition, createFeaturePrecondition)) -// .with(ModelVisualizerAdapter.builder() -// .withOutputpath("test_output") -// .withFormat(FileFormat.DOT) -// .withFormat(FileFormat.SVG) -// .saveStates() -// .saveDesignSpace() -// ) -// .with(DesignSpaceExplorationAdapter.builder() -// .transformations(createClassRule, createFeatureRule) -// .objectives(new AlwaysSatisfiedRandomHardObjective()) -// .strategy(new DepthFirstStrategy().withDepthLimit(4).continueIfHardObjectivesFulfilled() -//// .strategy(new BestFirstStrategy().withDepthLimit(4).continueIfHardObjectivesFulfilled() -//// .goOnOnlyIfFitnessIsBetter() -// )) -// .build(); -// -// var model = store.createEmptyModel(); -// var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); -//// dseAdapter.setRandom(1); -// var queryEngine = model.getAdapter(ModelQueryAdapter.class); -// -// var modelElementInterpretation = model.getInterpretation(classModel); -// var classElementInterpretation = model.getInterpretation(classElement); -// var modelElement = dseAdapter.createObject(); -// modelElementInterpretation.put(modelElement, true); -// classElementInterpretation.put(modelElement, true); -// queryEngine.flushChanges(); -// -// -// var states = dseAdapter.explore(); -// System.out.println("states size: " + states.size()); -// -// } + @Test + @Disabled("This test is only for debugging purposes") + void BFSTest() { + 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(ModificationAdapter.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(ModificationAdapter.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, feature, isEncapsulatedBy, encapsulates, classes, features) + .with(ViatraModelQueryAdapter.builder() + .queries(createClassPrecondition, createFeaturePrecondition)) + .with(ModelVisualizerAdapter.builder() + .withOutputpath("test_output") + .withFormat(FileFormat.DOT) + .withFormat(FileFormat.SVG) + .saveStates() + .saveDesignSpace() + ) + .with(StateCoderAdapter.builder()) + .with(ModificationAdapter.builder()) + .with(DesignSpaceExplorationAdapter.builder() + .transformations(createClassRule, createFeatureRule) + .objectives(new DummyRandomObjective()) + .accept(new DummyRandomCriterion()) + .exclude(new DummyRandomCriterion()) + ) + .build(); + + var model = store.createEmptyModel(); + var dseAdapter = model.getAdapter(ModificationAdapter.class); +// dseAdapter.setRandom(1); + var queryEngine = model.getAdapter(ModelQueryAdapter.class); + + var modelElementInterpretation = model.getInterpretation(classModel); + var classElementInterpretation = model.getInterpretation(classElement); + var modelElement = dseAdapter.createObject(); + modelElementInterpretation.put(modelElement, true); + classElementInterpretation.put(modelElement, true); + var initialVersion = model.commit(); + queryEngine.flushChanges(); + + + var bestFirst = new BestFirstStoreManager(store); + bestFirst.startExploration(initialVersion); + var resultStore = bestFirst.getSolutionStore(); + System.out.println("states size: " + resultStore.getSolutions().size()); + + } } diff --git a/subprojects/store-dse/src/test/java/tools/refinery/store/dse/tests/DummyCriterion.java b/subprojects/store-dse/src/test/java/tools/refinery/store/dse/tests/DummyCriterion.java index 6bcbd1c3..2d5a0f36 100644 --- a/subprojects/store-dse/src/test/java/tools/refinery/store/dse/tests/DummyCriterion.java +++ b/subprojects/store-dse/src/test/java/tools/refinery/store/dse/tests/DummyCriterion.java @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ package tools.refinery.store.dse.tests; import tools.refinery.store.dse.transition.objectives.Criterion; diff --git a/subprojects/store-dse/src/test/java/tools/refinery/store/dse/tests/DummyObjective.java b/subprojects/store-dse/src/test/java/tools/refinery/store/dse/tests/DummyObjective.java index 77a23d62..f5d281aa 100644 --- a/subprojects/store-dse/src/test/java/tools/refinery/store/dse/tests/DummyObjective.java +++ b/subprojects/store-dse/src/test/java/tools/refinery/store/dse/tests/DummyObjective.java @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ package tools.refinery.store.dse.tests; import tools.refinery.store.dse.transition.objectives.Objective; diff --git a/subprojects/store-dse/src/test/java/tools/refinery/store/dse/tests/DummyRandomCriterion.java b/subprojects/store-dse/src/test/java/tools/refinery/store/dse/tests/DummyRandomCriterion.java new file mode 100644 index 00000000..71fd4403 --- /dev/null +++ b/subprojects/store-dse/src/test/java/tools/refinery/store/dse/tests/DummyRandomCriterion.java @@ -0,0 +1,25 @@ +/* + * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.store.dse.tests; + +import tools.refinery.store.dse.transition.objectives.Criterion; +import tools.refinery.store.dse.transition.objectives.CriterionCalculator; +import tools.refinery.store.model.Model; + +import java.util.Random; + +public class DummyRandomCriterion implements Criterion { + + @SuppressWarnings("squid:S2245") + private static final Random random = new Random(9856654); + public DummyRandomCriterion() { + } + + @Override + public CriterionCalculator createCalculator(Model model) { + return random::nextBoolean; + } +} diff --git a/subprojects/store-dse/src/test/java/tools/refinery/store/dse/tests/DummyRandomObjective.java b/subprojects/store-dse/src/test/java/tools/refinery/store/dse/tests/DummyRandomObjective.java new file mode 100644 index 00000000..219e74c6 --- /dev/null +++ b/subprojects/store-dse/src/test/java/tools/refinery/store/dse/tests/DummyRandomObjective.java @@ -0,0 +1,23 @@ +/* + * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.store.dse.tests; + +import tools.refinery.store.dse.transition.objectives.Objective; +import tools.refinery.store.dse.transition.objectives.ObjectiveCalculator; +import tools.refinery.store.model.Model; + +import java.util.Random; + +public class DummyRandomObjective implements Objective { + + @SuppressWarnings("squid:S2245") + private static final Random random = new Random(9856654); + + @Override + public ObjectiveCalculator createCalculator(Model model) { + return random::nextDouble; + } +} -- cgit v1.2.3-54-g00ecf