aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Attila Ficsor <ficsorattila96@gmail.com>2023-08-07 15:10:07 +0200
committerLibravatar Attila Ficsor <ficsorattila96@gmail.com>2023-08-07 15:12:37 +0200
commitd5d8ad817c2f7d348a1fb40ca3f627ccc4ea37d5 (patch)
tree649097dd4f9239a2072dfea38ecbeae56025aee5
parentClean up design space exploration (diff)
downloadrefinery-d5d8ad817c2f7d348a1fb40ca3f627ccc4ea37d5.tar.gz
refinery-d5d8ad817c2f7d348a1fb40ca3f627ccc4ea37d5.tar.zst
refinery-d5d8ad817c2f7d348a1fb40ca3f627ccc4ea37d5.zip
Update visualizer builder
-rw-r--r--subprojects/store-dse/src/main/java/tools/refinery/store/dse/internal/DesignSpaceExplorationAdapterImpl.java10
-rw-r--r--subprojects/store-dse/src/main/java/tools/refinery/store/dse/objectives/AlwaysSatisfiedRandomHardObjective.java56
-rw-r--r--subprojects/store-dse/src/test/java/tools/refinery/store/dse/CRAExamplesTest.java11
-rw-r--r--subprojects/store-dse/src/test/java/tools/refinery/store/dse/DebugTest.java11
-rw-r--r--subprojects/visualization/src/main/java/tools/refinery/visualization/ModelVisualizerAdapter.java22
-rw-r--r--subprojects/visualization/src/main/java/tools/refinery/visualization/ModelVisualizerBuilder.java5
-rw-r--r--subprojects/visualization/src/main/java/tools/refinery/visualization/ModelVisualizerStoreAdapter.java11
-rw-r--r--subprojects/visualization/src/main/java/tools/refinery/visualization/internal/ModelVisualizeStoreAdapterImpl.java33
-rw-r--r--subprojects/visualization/src/main/java/tools/refinery/visualization/internal/ModelVisualizerAdapterImpl.java88
-rw-r--r--subprojects/visualization/src/main/java/tools/refinery/visualization/internal/ModelVisualizerBuilderImpl.java38
10 files changed, 223 insertions, 62 deletions
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/internal/DesignSpaceExplorationAdapterImpl.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/internal/DesignSpaceExplorationAdapterImpl.java
index 1329480c..008b2dab 100644
--- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/internal/DesignSpaceExplorationAdapterImpl.java
+++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/internal/DesignSpaceExplorationAdapterImpl.java
@@ -96,6 +96,9 @@ public class DesignSpaceExplorationAdapterImpl implements DesignSpaceExploration
96 trajectory.add(state); 96 trajectory.add(state);
97 strategy.initStrategy(this); 97 strategy.initStrategy(this);
98 strategy.explore(); 98 strategy.explore();
99 if (isVisualizationEnabled) {
100 modelVisualizerAdapter.visualize();
101 }
99 return solutions; 102 return solutions;
100 } 103 }
101 104
@@ -247,7 +250,7 @@ public class DesignSpaceExplorationAdapterImpl implements DesignSpaceExploration
247 isNewState = !statesAndTraversedActivations.containsKey(newState); 250 isNewState = !statesAndTraversedActivations.containsKey(newState);
248 if (isVisualizationEnabled) { 251 if (isVisualizationEnabled) {
249 if (isNewState) { 252 if (isNewState) {
250 modelVisualizerAdapter.addState(newState); 253 modelVisualizerAdapter.addState(newState, getFitness().values());
251 } 254 }
252 // TODO: Change to this: 255 // TODO: Change to this:
253 modelVisualizerAdapter.addTransition(previousState, newState, activation.transformationRule().getName(), 256 modelVisualizerAdapter.addTransition(previousState, newState, activation.transformationRule().getName(),
@@ -272,11 +275,6 @@ public class DesignSpaceExplorationAdapterImpl implements DesignSpaceExploration
272 fireActivation(activationId); 275 fireActivation(activationId);
273 } 276 }
274 277
275 @Override
276 public boolean isCurrentInTrajectory() {
277 return trajectory.contains(model.getState());
278 }
279
280 public List<Activation> getAllActivations() { 278 public List<Activation> getAllActivations() {
281 List<Activation> result = new LinkedList<>(); 279 List<Activation> result = new LinkedList<>();
282 for (var rule : transformationRules) { 280 for (var rule : transformationRules) {
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/objectives/AlwaysSatisfiedRandomHardObjective.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/objectives/AlwaysSatisfiedRandomHardObjective.java
new file mode 100644
index 00000000..327d5e2f
--- /dev/null
+++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/objectives/AlwaysSatisfiedRandomHardObjective.java
@@ -0,0 +1,56 @@
1/*******************************************************************************
2 * Copyright (c) 2010-2016, Andras Szabolcs Nagy, Zoltan Ujhelyi and Daniel Varro
3 * Copyright (c) 2023 The Refinery Authors <https://refinery.tools/>
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v. 2.0 which is available at
6 * http://www.eclipse.org/legal/epl-v20.html.
7 *
8 * SPDX-License-Identifier: EPL-2.0
9 *******************************************************************************/
10package tools.refinery.store.dse.objectives;
11
12import tools.refinery.store.dse.DesignSpaceExplorationAdapter;
13
14import java.util.Random;
15
16/**
17 * This hard objective is fulfilled in any circumstances. Use it if all states should be regarded as a valid solution.
18 *
19 * @author Andras Szabolcs Nagy
20 *
21 */
22public class AlwaysSatisfiedRandomHardObjective extends BaseObjective {
23
24 private static final String DEFAULT_NAME = "AlwaysSatisfiedDummyHardObjective";
25 private static final Random random = new Random(0);
26
27 public AlwaysSatisfiedRandomHardObjective() {
28 super(DEFAULT_NAME);
29 }
30
31 public AlwaysSatisfiedRandomHardObjective(String name) {
32 super(name);
33 }
34
35 @Override
36 public Double getFitness(DesignSpaceExplorationAdapter context) {
37// return 0d;
38 return random.nextDouble();
39 }
40
41 @Override
42 public boolean isHardObjective() {
43 return true;
44 }
45
46 @Override
47 public boolean satisfiesHardObjective(Double fitness) {
48 return true;
49 }
50
51 @Override
52 public Objective createNew() {
53 return this;
54 }
55
56}
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 f1e90280..23f0e703 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
@@ -188,7 +188,13 @@ class CRAExamplesTest {
188 .queries(feature, assignFeaturePreconditionHelper, assignFeaturePrecondition, 188 .queries(feature, assignFeaturePreconditionHelper, assignFeaturePrecondition,
189 deleteEmptyClassPrecondition, createClassPreconditionHelper, createClassPrecondition, 189 deleteEmptyClassPrecondition, createClassPreconditionHelper, createClassPrecondition,
190 moveFeaturePrecondition)) 190 moveFeaturePrecondition))
191 .with(ModelVisualizerAdapter.builder()) 191 .with(ModelVisualizerAdapter.builder()
192 .withOutputpath("test_output")
193 .withFormat(FileFormat.DOT)
194 .withFormat(FileFormat.SVG)
195 .saveStates()
196 .saveDesignSpace()
197 )
192 .with(DesignSpaceExplorationAdapter.builder() 198 .with(DesignSpaceExplorationAdapter.builder()
193 .transformations(assignFeatureRule, deleteEmptyClassRule, createClassRule, moveFeatureRule) 199 .transformations(assignFeatureRule, deleteEmptyClassRule, createClassRule, moveFeatureRule)
194// .strategy(new DepthFirstStrategy(3).continueIfHardObjectivesFulfilled() 200// .strategy(new DepthFirstStrategy(3).continueIfHardObjectivesFulfilled()
@@ -271,9 +277,6 @@ class CRAExamplesTest {
271 277
272 var states = dseAdapter.explore(); 278 var states = dseAdapter.explore();
273 System.out.println("states size: " + states.size()); 279 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 } 280 }
278 281
279} 282}
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 553510c8..88c4f152 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
@@ -90,7 +90,13 @@ class DebugTest {
90 .symbols(classModel, classElement, feature, isEncapsulatedBy, encapsulates, classes, features) 90 .symbols(classModel, classElement, feature, isEncapsulatedBy, encapsulates, classes, features)
91 .with(ViatraModelQueryAdapter.builder() 91 .with(ViatraModelQueryAdapter.builder()
92 .queries(createClassPrecondition, createFeaturePrecondition)) 92 .queries(createClassPrecondition, createFeaturePrecondition))
93 .with(ModelVisualizerAdapter.builder()) 93 .with(ModelVisualizerAdapter.builder()
94 .withOutputpath("test_output")
95 .withFormat(FileFormat.DOT)
96 .withFormat(FileFormat.SVG)
97 .saveStates()
98 .saveDesignSpace()
99 )
94 .with(DesignSpaceExplorationAdapter.builder() 100 .with(DesignSpaceExplorationAdapter.builder()
95 .transformations(createClassRule, createFeatureRule) 101 .transformations(createClassRule, createFeatureRule)
96 .strategy(new DepthFirstStrategy(4).continueIfHardObjectivesFulfilled() 102 .strategy(new DepthFirstStrategy(4).continueIfHardObjectivesFulfilled()
@@ -113,10 +119,7 @@ class DebugTest {
113 119
114 120
115 var states = dseAdapter.explore(); 121 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()); 122 System.out.println("states size: " + states.size());
119 System.out.println("states: " + states);
120 123
121 } 124 }
122} 125}
diff --git a/subprojects/visualization/src/main/java/tools/refinery/visualization/ModelVisualizerAdapter.java b/subprojects/visualization/src/main/java/tools/refinery/visualization/ModelVisualizerAdapter.java
index bc32323d..ae87d8ac 100644
--- a/subprojects/visualization/src/main/java/tools/refinery/visualization/ModelVisualizerAdapter.java
+++ b/subprojects/visualization/src/main/java/tools/refinery/visualization/ModelVisualizerAdapter.java
@@ -8,9 +8,10 @@ package tools.refinery.visualization;
8import tools.refinery.store.adapter.ModelAdapter; 8import tools.refinery.store.adapter.ModelAdapter;
9import tools.refinery.store.map.Version; 9import tools.refinery.store.map.Version;
10import tools.refinery.store.tuple.Tuple; 10import tools.refinery.store.tuple.Tuple;
11import tools.refinery.visualization.internal.FileFormat;
12import tools.refinery.visualization.internal.ModelVisualizerBuilderImpl; 11import tools.refinery.visualization.internal.ModelVisualizerBuilderImpl;
13 12
13import java.util.Collection;
14
14public interface ModelVisualizerAdapter extends ModelAdapter { 15public interface ModelVisualizerAdapter extends ModelAdapter {
15 16
16 ModelVisualizerStoreAdapter getStoreAdapter(); 17 ModelVisualizerStoreAdapter getStoreAdapter();
@@ -18,27 +19,14 @@ public interface ModelVisualizerAdapter extends ModelAdapter {
18 return new ModelVisualizerBuilderImpl(); 19 return new ModelVisualizerBuilderImpl();
19 } 20 }
20 21
21 public String createDotForCurrentModelState();
22
23 public String createDotForModelState(Version version);
24
25 public boolean saveDot(String dot, String filePath);
26
27 public boolean renderDot(String dot, String filePath);
28
29 public boolean renderDot(String dot, FileFormat format, String filePath);
30
31 public void addTransition(Version from, Version to, String action); 22 public void addTransition(Version from, Version to, String action);
32 23
33 24
34 public void addTransition(Version from, Version to, String action, Tuple activation); 25 public void addTransition(Version from, Version to, String action, Tuple activation);
35 public void addState(Version state); 26 public void addState(Version state);
27 public void addState(Version state, Collection<Double> fitness);
28 public void addState(Version state, String label);
36 public void addSolution(Version state); 29 public void addSolution(Version state);
37 30 public void visualize();
38 public boolean saveDesignSpace(String path);
39
40 public boolean renderDesignSpace(String path);
41
42 public boolean renderDesignSpace(String path, FileFormat format);
43 31
44} 32}
diff --git a/subprojects/visualization/src/main/java/tools/refinery/visualization/ModelVisualizerBuilder.java b/subprojects/visualization/src/main/java/tools/refinery/visualization/ModelVisualizerBuilder.java
index 56cc425e..592f5fcf 100644
--- a/subprojects/visualization/src/main/java/tools/refinery/visualization/ModelVisualizerBuilder.java
+++ b/subprojects/visualization/src/main/java/tools/refinery/visualization/ModelVisualizerBuilder.java
@@ -6,6 +6,11 @@
6package tools.refinery.visualization; 6package tools.refinery.visualization;
7 7
8import tools.refinery.store.adapter.ModelAdapterBuilder; 8import tools.refinery.store.adapter.ModelAdapterBuilder;
9import tools.refinery.visualization.internal.FileFormat;
9 10
10public interface ModelVisualizerBuilder extends ModelAdapterBuilder { 11public interface ModelVisualizerBuilder extends ModelAdapterBuilder {
12 ModelVisualizerBuilder withOutputpath(String outputpath);
13 ModelVisualizerBuilder withFormat(FileFormat format);
14 ModelVisualizerBuilder saveDesignSpace();
15 ModelVisualizerBuilder saveStates();
11} 16}
diff --git a/subprojects/visualization/src/main/java/tools/refinery/visualization/ModelVisualizerStoreAdapter.java b/subprojects/visualization/src/main/java/tools/refinery/visualization/ModelVisualizerStoreAdapter.java
index 6e6453fd..46663b2a 100644
--- a/subprojects/visualization/src/main/java/tools/refinery/visualization/ModelVisualizerStoreAdapter.java
+++ b/subprojects/visualization/src/main/java/tools/refinery/visualization/ModelVisualizerStoreAdapter.java
@@ -6,6 +6,17 @@
6package tools.refinery.visualization; 6package tools.refinery.visualization;
7 7
8import tools.refinery.store.adapter.ModelStoreAdapter; 8import tools.refinery.store.adapter.ModelStoreAdapter;
9import tools.refinery.visualization.internal.FileFormat;
10
11import java.util.Set;
9 12
10public interface ModelVisualizerStoreAdapter extends ModelStoreAdapter { 13public interface ModelVisualizerStoreAdapter extends ModelStoreAdapter {
14
15 String getOutputPath();
16
17 boolean isRenderDesignSpace();
18
19 boolean isRenderStates();
20
21 Set<FileFormat> getFormats();
11} 22}
diff --git a/subprojects/visualization/src/main/java/tools/refinery/visualization/internal/ModelVisualizeStoreAdapterImpl.java b/subprojects/visualization/src/main/java/tools/refinery/visualization/internal/ModelVisualizeStoreAdapterImpl.java
index b4db2682..04be22d6 100644
--- a/subprojects/visualization/src/main/java/tools/refinery/visualization/internal/ModelVisualizeStoreAdapterImpl.java
+++ b/subprojects/visualization/src/main/java/tools/refinery/visualization/internal/ModelVisualizeStoreAdapterImpl.java
@@ -10,11 +10,22 @@ import tools.refinery.store.model.Model;
10import tools.refinery.store.model.ModelStore; 10import tools.refinery.store.model.ModelStore;
11import tools.refinery.visualization.ModelVisualizerStoreAdapter; 11import tools.refinery.visualization.ModelVisualizerStoreAdapter;
12 12
13import java.util.Set;
14
13public class ModelVisualizeStoreAdapterImpl implements ModelVisualizerStoreAdapter { 15public class ModelVisualizeStoreAdapterImpl implements ModelVisualizerStoreAdapter {
14 private final ModelStore store; 16 private final ModelStore store;
17 private final String outputPath;
18 private final boolean renderDesignSpace;
19 private final boolean renderStates;
20 private final Set<FileFormat> formats;
15 21
16 public ModelVisualizeStoreAdapterImpl(ModelStore store) { 22 public ModelVisualizeStoreAdapterImpl(ModelStore store, String outputPath, Set<FileFormat> formats,
23 boolean renderDesignSpace, boolean renderStates) {
17 this.store = store; 24 this.store = store;
25 this.outputPath = outputPath;
26 this.formats = formats;
27 this.renderDesignSpace = renderDesignSpace;
28 this.renderStates = renderStates;
18 } 29 }
19 30
20 @Override 31 @Override
@@ -26,4 +37,24 @@ public class ModelVisualizeStoreAdapterImpl implements ModelVisualizerStoreAdapt
26 public ModelAdapter createModelAdapter(Model model) { 37 public ModelAdapter createModelAdapter(Model model) {
27 return new ModelVisualizerAdapterImpl(model, this); 38 return new ModelVisualizerAdapterImpl(model, this);
28 } 39 }
40
41 @Override
42 public String getOutputPath() {
43 return outputPath;
44 }
45
46 @Override
47 public boolean isRenderDesignSpace() {
48 return renderDesignSpace;
49 }
50
51 @Override
52 public boolean isRenderStates() {
53 return renderStates;
54 }
55
56 @Override
57 public Set<FileFormat> getFormats() {
58 return formats;
59 }
29} 60}
diff --git a/subprojects/visualization/src/main/java/tools/refinery/visualization/internal/ModelVisualizerAdapterImpl.java b/subprojects/visualization/src/main/java/tools/refinery/visualization/internal/ModelVisualizerAdapterImpl.java
index efafe5a2..531969b4 100644
--- a/subprojects/visualization/src/main/java/tools/refinery/visualization/internal/ModelVisualizerAdapterImpl.java
+++ b/subprojects/visualization/src/main/java/tools/refinery/visualization/internal/ModelVisualizerAdapterImpl.java
@@ -26,6 +26,11 @@ public class ModelVisualizerAdapterImpl implements ModelVisualizerAdapter {
26 private final Map<Version, Integer> states = new HashMap<>(); 26 private final Map<Version, Integer> states = new HashMap<>();
27 private int transitionCounter = 0; 27 private int transitionCounter = 0;
28 private Integer numberOfStates = 0; 28 private Integer numberOfStates = 0;
29 private final String outputPath;
30 private final Set<FileFormat> formats;
31 private final boolean renderDesignSpace;
32 private final boolean renderStates;
33
29 private static final Map<Object, String> truthValueToDot = Map.of( 34 private static final Map<Object, String> truthValueToDot = Map.of(
30 TruthValue.TRUE, "1", 35 TruthValue.TRUE, "1",
31 TruthValue.FALSE, "0", 36 TruthValue.FALSE, "0",
@@ -38,6 +43,14 @@ public class ModelVisualizerAdapterImpl implements ModelVisualizerAdapter {
38 public ModelVisualizerAdapterImpl(Model model, ModelVisualizerStoreAdapter storeAdapter) { 43 public ModelVisualizerAdapterImpl(Model model, ModelVisualizerStoreAdapter storeAdapter) {
39 this.model = model; 44 this.model = model;
40 this.storeAdapter = storeAdapter; 45 this.storeAdapter = storeAdapter;
46 this.outputPath = storeAdapter.getOutputPath();
47 this.formats = storeAdapter.getFormats();
48 if (formats.isEmpty()) {
49 formats.add(FileFormat.SVG);
50 }
51 this.renderDesignSpace = storeAdapter.isRenderDesignSpace();
52 this.renderStates = storeAdapter.isRenderStates();
53
41 this.allInterpretations = new HashMap<>(); 54 this.allInterpretations = new HashMap<>();
42 for (var symbol : storeAdapter.getStore().getSymbols()) { 55 for (var symbol : storeAdapter.getStore().getSymbols()) {
43 var arity = symbol.arity(); 56 var arity = symbol.arity();
@@ -68,8 +81,7 @@ public class ModelVisualizerAdapterImpl implements ModelVisualizerAdapter {
68 return storeAdapter; 81 return storeAdapter;
69 } 82 }
70 83
71 @Override 84 private String createDotForCurrentModelState() {
72 public String createDotForCurrentModelState() {
73 85
74 var unaryTupleToInterpretationsMap = new HashMap<Tuple, LinkedHashSet<Interpretation<?>>>(); 86 var unaryTupleToInterpretationsMap = new HashMap<Tuple, LinkedHashSet<Interpretation<?>>>();
75 87
@@ -229,8 +241,7 @@ public class ModelVisualizerAdapterImpl implements ModelVisualizerAdapter {
229 }; 241 };
230 } 242 }
231 243
232 @Override 244 private String createDotForModelState(Version version) {
233 public String createDotForModelState(Version version) {
234 var currentVersion = model.getState(); 245 var currentVersion = model.getState();
235 model.restore(version); 246 model.restore(version);
236 var graph = createDotForCurrentModelState(); 247 var graph = createDotForCurrentModelState();
@@ -238,8 +249,7 @@ public class ModelVisualizerAdapterImpl implements ModelVisualizerAdapter {
238 return graph; 249 return graph;
239 } 250 }
240 251
241 @Override 252 private boolean saveDot(String dot, String filePath) {
242 public boolean saveDot(String dot, String filePath) {
243 File file = new File(filePath); 253 File file = new File(filePath);
244 file.getParentFile().mkdirs(); 254 file.getParentFile().mkdirs();
245 255
@@ -252,13 +262,11 @@ public class ModelVisualizerAdapterImpl implements ModelVisualizerAdapter {
252 return true; 262 return true;
253 } 263 }
254 264
255 @Override 265 private boolean renderDot(String dot, String filePath) {
256 public boolean renderDot(String dot, String filePath) {
257 return renderDot(dot, FileFormat.SVG, filePath); 266 return renderDot(dot, FileFormat.SVG, filePath);
258 } 267 }
259 268
260 @Override 269 private boolean renderDot(String dot, FileFormat format, String filePath) {
261 public boolean renderDot(String dot, FileFormat format, String filePath) {
262 try { 270 try {
263 Process process = new ProcessBuilder("dot", "-T" + format.getFormat(), "-o", filePath).start(); 271 Process process = new ProcessBuilder("dot", "-T" + format.getFormat(), "-o", filePath).start();
264 272
@@ -305,15 +313,21 @@ public class ModelVisualizerAdapterImpl implements ModelVisualizerAdapter {
305 313
306 @Override 314 @Override
307 public void addState(Version state, Collection<Double> fitness) { 315 public void addState(Version state, Collection<Double> fitness) {
316 var labelBuilder = new StringBuilder();
317 for (var f : fitness) {
318 labelBuilder.append(f).append(", ");
319 }
320 addState(state, labelBuilder.toString());
321 }
322
323 @Override
324 public void addState(Version state, String label) {
308 if (states.containsKey(state)) { 325 if (states.containsKey(state)) {
309 return; 326 return;
310 } 327 }
311 states.put(state, numberOfStates++); 328 states.put(state, numberOfStates++);
312 designSpaceBuilder.append(states.get(state)).append(" [label = \"").append(states.get(state)).append(" ("); 329 designSpaceBuilder.append(states.get(state)).append(" [label = \"").append(states.get(state)).append(" (");
313 330 designSpaceBuilder.append(label);
314 for (var f : fitness) {
315 designSpaceBuilder.append(f).append(", ");
316 }
317 designSpaceBuilder.append(")\"\n").append("URL=\"./").append(states.get(state)).append(".svg\"]\n"); 331 designSpaceBuilder.append(")\"\n").append("URL=\"./").append(states.get(state)).append(".svg\"]\n");
318 } 332 }
319 333
@@ -328,8 +342,7 @@ public class ModelVisualizerAdapterImpl implements ModelVisualizerAdapter {
328 return designSpaceBuilder.toString(); 342 return designSpaceBuilder.toString();
329 } 343 }
330 344
331 @Override 345 private boolean saveDesignSpace(String path) {
332 public boolean saveDesignSpace(String path) {
333 saveDot(buildDesignSpaceDot(), path + "/designSpace.dot"); 346 saveDot(buildDesignSpaceDot(), path + "/designSpace.dot");
334 for (var entry : states.entrySet()) { 347 for (var entry : states.entrySet()) {
335 saveDot(createDotForModelState(entry.getKey()), path + "/" + entry.getValue() + ".dot"); 348 saveDot(createDotForModelState(entry.getKey()), path + "/" + entry.getValue() + ".dot");
@@ -337,21 +350,38 @@ public class ModelVisualizerAdapterImpl implements ModelVisualizerAdapter {
337 return true; 350 return true;
338 } 351 }
339 352
340 @Override 353 private void renderDesignSpace(String path, Set<FileFormat> formats) {
341 public boolean renderDesignSpace(String path) { 354 File filePath = new File(path);
342 return renderDesignSpace(path, FileFormat.SVG); 355 filePath.mkdirs();
356 if (renderStates) {
357 for (var entry : states.entrySet()) {
358 var stateId = entry.getValue();
359 var stateDot = createDotForModelState(entry.getKey());
360 for (var format : formats) {
361 if (format == FileFormat.DOT) {
362 saveDot(stateDot, path + "/" + stateId + ".dot");
363 }
364 else {
365 renderDot(stateDot, format, path + "/" + stateId + "." + format.getFormat());
366 }
367 }
368 }
369 }
370 if (renderDesignSpace) {
371 var designSpaceDot = buildDesignSpaceDot();
372 for (var format : formats) {
373 if (format == FileFormat.DOT) {
374 saveDot(designSpaceDot, path + "/designSpace.dot");
375 }
376 else {
377 renderDot(designSpaceDot, format, path + "/designSpace." + format.getFormat());
378 }
379 }
380 }
343 } 381 }
344 382
345 @Override 383 @Override
346 public boolean renderDesignSpace(String path, FileFormat format) { 384 public void visualize() {
347// for (var entry : states.entrySet()) { 385 renderDesignSpace(outputPath, formats);
348// var stateId = entry.getValue();
349// var stateDot = createDotForModelState(entry.getKey());
350// saveDot(stateDot, path + "/" + stateId + ".dot");
351// renderDot(stateDot, format, path + "/" + stateId + "." + format.getFormat());
352// }
353 var designSpaceDot = buildDesignSpaceDot();
354 saveDot(designSpaceDot, path + "/designSpace.dot");
355 return renderDot(designSpaceDot, format, path + "/designSpace." + format.getFormat());
356 } 386 }
357} 387}
diff --git a/subprojects/visualization/src/main/java/tools/refinery/visualization/internal/ModelVisualizerBuilderImpl.java b/subprojects/visualization/src/main/java/tools/refinery/visualization/internal/ModelVisualizerBuilderImpl.java
index d19cf2cf..e4d801d8 100644
--- a/subprojects/visualization/src/main/java/tools/refinery/visualization/internal/ModelVisualizerBuilderImpl.java
+++ b/subprojects/visualization/src/main/java/tools/refinery/visualization/internal/ModelVisualizerBuilderImpl.java
@@ -9,11 +9,47 @@ import tools.refinery.store.adapter.AbstractModelAdapterBuilder;
9import tools.refinery.store.model.ModelStore; 9import tools.refinery.store.model.ModelStore;
10import tools.refinery.visualization.ModelVisualizerBuilder; 10import tools.refinery.visualization.ModelVisualizerBuilder;
11 11
12import java.util.LinkedHashSet;
13import java.util.Set;
14
12public class ModelVisualizerBuilderImpl 15public class ModelVisualizerBuilderImpl
13 extends AbstractModelAdapterBuilder<ModelVisualizeStoreAdapterImpl> 16 extends AbstractModelAdapterBuilder<ModelVisualizeStoreAdapterImpl>
14 implements ModelVisualizerBuilder { 17 implements ModelVisualizerBuilder {
18 private String outputPath;
19 private boolean saveDesignSpace = false;
20 private boolean saveStates = false;
21 private Set<FileFormat> formats = new LinkedHashSet<>();
22
15 @Override 23 @Override
16 protected ModelVisualizeStoreAdapterImpl doBuild(ModelStore store) { 24 protected ModelVisualizeStoreAdapterImpl doBuild(ModelStore store) {
17 return new ModelVisualizeStoreAdapterImpl(store); 25 return new ModelVisualizeStoreAdapterImpl(store, outputPath, formats, saveDesignSpace, saveStates);
26 }
27
28 @Override
29 public ModelVisualizerBuilder withOutputpath(String outputpath) {
30 checkNotConfigured();
31 this.outputPath = outputpath;
32 return this;
33 }
34
35 @Override
36 public ModelVisualizerBuilder withFormat(FileFormat format) {
37 checkNotConfigured();
38 this.formats.add(format);
39 return this;
40 }
41
42 @Override
43 public ModelVisualizerBuilder saveDesignSpace() {
44 checkNotConfigured();
45 this.saveDesignSpace = true;
46 return this;
47 }
48
49 @Override
50 public ModelVisualizerBuilder saveStates() {
51 checkNotConfigured();
52 this.saveStates = true;
53 return this;
18 } 54 }
19} 55}