diff options
author | nagilooh <ficsorattila96@gmail.com> | 2023-08-01 12:41:45 +0200 |
---|---|---|
committer | nagilooh <ficsorattila96@gmail.com> | 2023-08-02 12:10:20 +0200 |
commit | 00c8fcf947d3f5c375d49a907bcefa5d8e1dd8ea (patch) | |
tree | 6d0fd3a59d5c46e8337d1b0aab3521842da5a3cb /subprojects/store-query-viatra | |
parent | Add trivial test cases for DSE Strategies (diff) | |
download | refinery-00c8fcf947d3f5c375d49a907bcefa5d8e1dd8ea.tar.gz refinery-00c8fcf947d3f5c375d49a907bcefa5d8e1dd8ea.tar.zst refinery-00c8fcf947d3f5c375d49a907bcefa5d8e1dd8ea.zip |
Update visualization
- Replace guru.nidi:graphviz-java with DOT based solution
- Draws the design space as well as the model states
- Design space nodes link to visualization of the sate
Diffstat (limited to 'subprojects/store-query-viatra')
3 files changed, 30 insertions, 7 deletions
diff --git a/subprojects/store-query-viatra/build.gradle.kts b/subprojects/store-query-viatra/build.gradle.kts index 1f804247..ef73e10a 100644 --- a/subprojects/store-query-viatra/build.gradle.kts +++ b/subprojects/store-query-viatra/build.gradle.kts | |||
@@ -10,7 +10,6 @@ plugins { | |||
10 | 10 | ||
11 | dependencies { | 11 | dependencies { |
12 | implementation(libs.ecore) | 12 | implementation(libs.ecore) |
13 | implementation ("guru.nidi:graphviz-java:0.18.1") | ||
14 | api(libs.viatra) | 13 | api(libs.viatra) |
15 | api(project(":refinery-store-query")) | 14 | api(project(":refinery-store-query")) |
16 | api(project(":refinery-store-reasoning")) | 15 | api(project(":refinery-store-reasoning")) |
diff --git a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/dse/internal/DesignSpaceExplorationAdapterImpl.java b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/dse/internal/DesignSpaceExplorationAdapterImpl.java index c4c51e79..0fcc719d 100644 --- a/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/dse/internal/DesignSpaceExplorationAdapterImpl.java +++ b/subprojects/store-query-viatra/src/main/java/tools/refinery/store/query/dse/internal/DesignSpaceExplorationAdapterImpl.java | |||
@@ -15,6 +15,7 @@ import tools.refinery.store.query.resultset.ResultSet; | |||
15 | import tools.refinery.store.representation.Symbol; | 15 | import tools.refinery.store.representation.Symbol; |
16 | import tools.refinery.store.tuple.Tuple; | 16 | import tools.refinery.store.tuple.Tuple; |
17 | import tools.refinery.store.tuple.Tuple1; | 17 | import tools.refinery.store.tuple.Tuple1; |
18 | import tools.refinery.visualization.ModelVisualizerAdapter; | ||
18 | 19 | ||
19 | import java.util.*; | 20 | import java.util.*; |
20 | 21 | ||
@@ -40,6 +41,8 @@ public class DesignSpaceExplorationAdapterImpl implements DesignSpaceExploration | |||
40 | private Random random = new Random(); | 41 | private Random random = new Random(); |
41 | private Objective[][] leveledObjectives; | 42 | private Objective[][] leveledObjectives; |
42 | private boolean isNewState = false; | 43 | private boolean isNewState = false; |
44 | private final boolean isVisualizationEnabled; | ||
45 | private final ModelVisualizerAdapter modelVisualizerAdapter; | ||
43 | 46 | ||
44 | public List<Long> getTrajectory() { | 47 | public List<Long> getTrajectory() { |
45 | return new LinkedList<>(trajectory); | 48 | return new LinkedList<>(trajectory); |
@@ -66,6 +69,8 @@ public class DesignSpaceExplorationAdapterImpl implements DesignSpaceExploration | |||
66 | statesAndUntraversedActivations = new HashMap<>(); | 69 | statesAndUntraversedActivations = new HashMap<>(); |
67 | statesAndTraversedActivations = new HashMap<>(); | 70 | statesAndTraversedActivations = new HashMap<>(); |
68 | strategy = storeAdapter.getStrategy(); | 71 | strategy = storeAdapter.getStrategy(); |
72 | modelVisualizerAdapter = model.tryGetAdapter(ModelVisualizerAdapter.class).orElse(null); | ||
73 | isVisualizationEnabled = modelVisualizerAdapter != null; | ||
69 | 74 | ||
70 | } | 75 | } |
71 | 76 | ||
@@ -129,6 +134,10 @@ public class DesignSpaceExplorationAdapterImpl implements DesignSpaceExploration | |||
129 | if (trajectory.size() < 2) { | 134 | if (trajectory.size() < 2) { |
130 | return false; | 135 | return false; |
131 | } | 136 | } |
137 | if (isVisualizationEnabled) { | ||
138 | modelVisualizerAdapter.addTransition(trajectory.get(trajectory.size() - 1), | ||
139 | trajectory.get(trajectory.size() - 2), "backtrack"); | ||
140 | } | ||
132 | model.restore(trajectory.get(trajectory.size() - 2)); | 141 | model.restore(trajectory.get(trajectory.size() - 2)); |
133 | trajectory.remove(trajectory.size() - 1); | 142 | trajectory.remove(trajectory.size() - 1); |
134 | return true; | 143 | return true; |
@@ -137,6 +146,10 @@ public class DesignSpaceExplorationAdapterImpl implements DesignSpaceExploration | |||
137 | @Override | 146 | @Override |
138 | public void restoreTrajectory(List<Long> trajectory) { | 147 | public void restoreTrajectory(List<Long> trajectory) { |
139 | model.restore(trajectory.get(trajectory.size() - 1)); | 148 | model.restore(trajectory.get(trajectory.size() - 1)); |
149 | // if (isVisualizationEnabled) { | ||
150 | // modelVisualizerAdapter.addTransition(this.trajectory.get(trajectory.size() - 1), | ||
151 | // trajectory.get(trajectory.size() - 1), "restore"); | ||
152 | // } | ||
140 | this.trajectory = trajectory; | 153 | this.trajectory = trajectory; |
141 | 154 | ||
142 | } | 155 | } |
@@ -173,6 +186,9 @@ public class DesignSpaceExplorationAdapterImpl implements DesignSpaceExploration | |||
173 | public void newSolution() { | 186 | public void newSolution() { |
174 | var state = model.getState(); | 187 | var state = model.getState(); |
175 | solutions.add(state); | 188 | solutions.add(state); |
189 | if (isVisualizationEnabled) { | ||
190 | modelVisualizerAdapter.addSolution(state); | ||
191 | } | ||
176 | } | 192 | } |
177 | 193 | ||
178 | @Override | 194 | @Override |
@@ -212,6 +228,11 @@ public class DesignSpaceExplorationAdapterImpl implements DesignSpaceExploration | |||
212 | isNewState = !statesAndUntraversedActivations.containsKey(newState); | 228 | isNewState = !statesAndUntraversedActivations.containsKey(newState); |
213 | statesAndUntraversedActivations.put(newState, getAllActivations()); | 229 | statesAndUntraversedActivations.put(newState, getAllActivations()); |
214 | statesAndTraversedActivations.put(newState, new HashSet<>()); | 230 | statesAndTraversedActivations.put(newState, new HashSet<>()); |
231 | if (isVisualizationEnabled) { | ||
232 | modelVisualizerAdapter.addTransition(trajectory.get(trajectory.size() - 2), | ||
233 | trajectory.get(trajectory.size() - 1), activation.transformationRule().getName(), | ||
234 | activation.activation()); | ||
235 | } | ||
215 | return true; | 236 | return true; |
216 | } | 237 | } |
217 | 238 | ||
diff --git a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/dse/DebugTest.java b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/dse/DebugTest.java index 969afbcb..821be7e6 100644 --- a/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/dse/DebugTest.java +++ b/subprojects/store-query-viatra/src/test/java/tools/refinery/store/query/dse/DebugTest.java | |||
@@ -5,6 +5,7 @@ import tools.refinery.store.model.ModelStore; | |||
5 | import tools.refinery.store.query.ModelQueryAdapter; | 5 | import tools.refinery.store.query.ModelQueryAdapter; |
6 | import tools.refinery.store.query.dnf.Query; | 6 | import tools.refinery.store.query.dnf.Query; |
7 | import tools.refinery.store.query.dse.internal.TransformationRule; | 7 | import tools.refinery.store.query.dse.internal.TransformationRule; |
8 | import tools.refinery.store.query.dse.strategy.BestFirstStrategy; | ||
8 | import tools.refinery.store.query.dse.strategy.DepthFirstStrategy; | 9 | import tools.refinery.store.query.dse.strategy.DepthFirstStrategy; |
9 | import tools.refinery.store.query.viatra.ViatraModelQueryAdapter; | 10 | import tools.refinery.store.query.viatra.ViatraModelQueryAdapter; |
10 | import tools.refinery.store.query.view.AnySymbolView; | 11 | import tools.refinery.store.query.view.AnySymbolView; |
@@ -12,6 +13,7 @@ import tools.refinery.store.query.view.KeyOnlyView; | |||
12 | import tools.refinery.store.representation.Symbol; | 13 | import tools.refinery.store.representation.Symbol; |
13 | import tools.refinery.store.tuple.Tuple; | 14 | import tools.refinery.store.tuple.Tuple; |
14 | import tools.refinery.visualization.ModelVisualizerAdapter; | 15 | import tools.refinery.visualization.ModelVisualizerAdapter; |
16 | import tools.refinery.visualization.internal.FileFormat; | ||
15 | 17 | ||
16 | public class DebugTest { | 18 | public class DebugTest { |
17 | private static final Symbol<Boolean> classModel = Symbol.of("ClassModel", 1); | 19 | private static final Symbol<Boolean> classModel = Symbol.of("ClassModel", 1); |
@@ -83,30 +85,31 @@ public class DebugTest { | |||
83 | .symbols(classModel, classElement, feature, isEncapsulatedBy, encapsulates, classes, features) | 85 | .symbols(classModel, classElement, feature, isEncapsulatedBy, encapsulates, classes, features) |
84 | .with(ViatraModelQueryAdapter.builder() | 86 | .with(ViatraModelQueryAdapter.builder() |
85 | .queries(createClassPrecondition, createFeaturePrecondition)) | 87 | .queries(createClassPrecondition, createFeaturePrecondition)) |
88 | .with(ModelVisualizerAdapter.builder()) | ||
86 | .with(DesignSpaceExplorationAdapter.builder() | 89 | .with(DesignSpaceExplorationAdapter.builder() |
87 | .transformations(createClassRule, createFeatureRule) | 90 | .transformations(createClassRule, createFeatureRule) |
88 | .strategy(new DepthFirstStrategy(4).continueIfHardObjectivesFulfilled() | 91 | .strategy(new DepthFirstStrategy(4).continueIfHardObjectivesFulfilled() |
89 | // .strategy(new BestFirstStrategy(4).continueIfHardObjectivesFulfilled() | 92 | // .strategy(new BestFirstStrategy(4).continueIfHardObjectivesFulfilled() |
90 | // .goOnOnlyIfFitnessIsBetter() | 93 | // .goOnOnlyIfFitnessIsBetter() |
91 | )) | 94 | )) |
92 | .with(ModelVisualizerAdapter.builder()) | ||
93 | .build(); | 95 | .build(); |
94 | 96 | ||
95 | var model = store.createEmptyModel(); | 97 | var model = store.createEmptyModel(); |
96 | var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); | 98 | var dseAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); |
99 | // dseAdapter.setRandom(1); | ||
97 | var queryEngine = model.getAdapter(ModelQueryAdapter.class); | 100 | var queryEngine = model.getAdapter(ModelQueryAdapter.class); |
98 | 101 | ||
99 | var modelElementInterpretation = model.getInterpretation(classModel); | 102 | var modelElementInterpretation = model.getInterpretation(classModel); |
100 | modelElementInterpretation.put(dseAdapter.createObject(), true); | 103 | var classElementInterpretation = model.getInterpretation(classElement); |
104 | var modelElement = dseAdapter.createObject(); | ||
105 | modelElementInterpretation.put(modelElement, true); | ||
106 | classElementInterpretation.put(modelElement, true); | ||
101 | queryEngine.flushChanges(); | 107 | queryEngine.flushChanges(); |
102 | 108 | ||
103 | 109 | ||
104 | var states = dseAdapter.explore(); | 110 | var states = dseAdapter.explore(); |
105 | var visualizer = model.getAdapter(ModelVisualizerAdapter.class); | 111 | var visualizer = model.getAdapter(ModelVisualizerAdapter.class); |
106 | for (var state : states) { | 112 | visualizer.renderDesignSpace("test_output", FileFormat.SVG); |
107 | var visualization = visualizer.createVisualizationForModelState(state); | ||
108 | visualizer.saveVisualization(visualization, "test_output" + state.hashCode() + ".png"); | ||
109 | } | ||
110 | System.out.println("states size: " + states.size()); | 113 | System.out.println("states size: " + states.size()); |
111 | System.out.println("states: " + states); | 114 | System.out.println("states: " + states); |
112 | 115 | ||