diff options
author | Attila Ficsor <ficsorattila96@gmail.com> | 2023-08-07 15:10:07 +0200 |
---|---|---|
committer | Attila Ficsor <ficsorattila96@gmail.com> | 2023-08-07 15:12:37 +0200 |
commit | d5d8ad817c2f7d348a1fb40ca3f627ccc4ea37d5 (patch) | |
tree | 649097dd4f9239a2072dfea38ecbeae56025aee5 /subprojects/visualization/src/main | |
parent | Clean up design space exploration (diff) | |
download | refinery-d5d8ad817c2f7d348a1fb40ca3f627ccc4ea37d5.tar.gz refinery-d5d8ad817c2f7d348a1fb40ca3f627ccc4ea37d5.tar.zst refinery-d5d8ad817c2f7d348a1fb40ca3f627ccc4ea37d5.zip |
Update visualizer builder
Diffstat (limited to 'subprojects/visualization/src/main')
6 files changed, 149 insertions, 48 deletions
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; | |||
8 | import tools.refinery.store.adapter.ModelAdapter; | 8 | import tools.refinery.store.adapter.ModelAdapter; |
9 | import tools.refinery.store.map.Version; | 9 | import tools.refinery.store.map.Version; |
10 | import tools.refinery.store.tuple.Tuple; | 10 | import tools.refinery.store.tuple.Tuple; |
11 | import tools.refinery.visualization.internal.FileFormat; | ||
12 | import tools.refinery.visualization.internal.ModelVisualizerBuilderImpl; | 11 | import tools.refinery.visualization.internal.ModelVisualizerBuilderImpl; |
13 | 12 | ||
13 | import java.util.Collection; | ||
14 | |||
14 | public interface ModelVisualizerAdapter extends ModelAdapter { | 15 | public 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 @@ | |||
6 | package tools.refinery.visualization; | 6 | package tools.refinery.visualization; |
7 | 7 | ||
8 | import tools.refinery.store.adapter.ModelAdapterBuilder; | 8 | import tools.refinery.store.adapter.ModelAdapterBuilder; |
9 | import tools.refinery.visualization.internal.FileFormat; | ||
9 | 10 | ||
10 | public interface ModelVisualizerBuilder extends ModelAdapterBuilder { | 11 | public 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 @@ | |||
6 | package tools.refinery.visualization; | 6 | package tools.refinery.visualization; |
7 | 7 | ||
8 | import tools.refinery.store.adapter.ModelStoreAdapter; | 8 | import tools.refinery.store.adapter.ModelStoreAdapter; |
9 | import tools.refinery.visualization.internal.FileFormat; | ||
10 | |||
11 | import java.util.Set; | ||
9 | 12 | ||
10 | public interface ModelVisualizerStoreAdapter extends ModelStoreAdapter { | 13 | public 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; | |||
10 | import tools.refinery.store.model.ModelStore; | 10 | import tools.refinery.store.model.ModelStore; |
11 | import tools.refinery.visualization.ModelVisualizerStoreAdapter; | 11 | import tools.refinery.visualization.ModelVisualizerStoreAdapter; |
12 | 12 | ||
13 | import java.util.Set; | ||
14 | |||
13 | public class ModelVisualizeStoreAdapterImpl implements ModelVisualizerStoreAdapter { | 15 | public 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; | |||
9 | import tools.refinery.store.model.ModelStore; | 9 | import tools.refinery.store.model.ModelStore; |
10 | import tools.refinery.visualization.ModelVisualizerBuilder; | 10 | import tools.refinery.visualization.ModelVisualizerBuilder; |
11 | 11 | ||
12 | import java.util.LinkedHashSet; | ||
13 | import java.util.Set; | ||
14 | |||
12 | public class ModelVisualizerBuilderImpl | 15 | public 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 | } |