diff options
author | Kristóf Marussy <kristof@marussy.com> | 2023-09-07 20:44:48 +0200 |
---|---|---|
committer | Kristóf Marussy <kristof@marussy.com> | 2023-09-07 20:44:48 +0200 |
commit | df8ebe6dae2203513240a3b001fabc2b8b34d505 (patch) | |
tree | 5f642cda936c190f2f5525992f17a05be2491920 /subprojects/store-dse/src/main | |
parent | feat: declarative DSE rules and model refinement (diff) | |
parent | Add missing copyright headers (diff) | |
download | refinery-df8ebe6dae2203513240a3b001fabc2b8b34d505.tar.gz refinery-df8ebe6dae2203513240a3b001fabc2b8b34d505.tar.zst refinery-df8ebe6dae2203513240a3b001fabc2b8b34d505.zip |
Merge remote-tracking branch 'nagilooh/datastructure' into partial-interpretation
Diffstat (limited to 'subprojects/store-dse/src/main')
11 files changed, 113 insertions, 54 deletions
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/modification/internal/ModificationStoreAdapterImpl.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/modification/internal/ModificationStoreAdapterImpl.java index 913cb33f..62e4227b 100644 --- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/modification/internal/ModificationStoreAdapterImpl.java +++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/modification/internal/ModificationStoreAdapterImpl.java | |||
@@ -24,6 +24,6 @@ public class ModificationStoreAdapterImpl implements ModificationStoreAdapter { | |||
24 | 24 | ||
25 | @Override | 25 | @Override |
26 | public ModelAdapter createModelAdapter(Model model) { | 26 | public ModelAdapter createModelAdapter(Model model) { |
27 | return null; | 27 | return new ModificationAdapterImpl(this, model); |
28 | } | 28 | } |
29 | } | 29 | } |
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/strategy/BestFirstExplorer.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/strategy/BestFirstExplorer.java index 72bbbc55..a2b6268f 100644 --- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/strategy/BestFirstExplorer.java +++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/strategy/BestFirstExplorer.java | |||
@@ -5,7 +5,6 @@ | |||
5 | */ | 5 | */ |
6 | package tools.refinery.store.dse.strategy; | 6 | package tools.refinery.store.dse.strategy; |
7 | 7 | ||
8 | import tools.refinery.store.dse.transition.ObjectiveValue; | ||
9 | import tools.refinery.store.dse.transition.VersionWithObjectiveValue; | 8 | import tools.refinery.store.dse.transition.VersionWithObjectiveValue; |
10 | import tools.refinery.store.model.Model; | 9 | import tools.refinery.store.model.Model; |
11 | 10 | ||
@@ -32,13 +31,11 @@ public class BestFirstExplorer extends BestFirstWorker { | |||
32 | public void explore() { | 31 | public void explore() { |
33 | VersionWithObjectiveValue lastVisited = submit().newVersion(); | 32 | VersionWithObjectiveValue lastVisited = submit().newVersion(); |
34 | 33 | ||
35 | mainLoop: while (shouldRun()) { | 34 | while (shouldRun()) { |
36 | 35 | ||
37 | if (lastVisited == null) { | 36 | if (lastVisited == null) { |
38 | var restored = this.restoreToBest(); | 37 | lastVisited = this.restoreToBest(); |
39 | if(restored != null) { | 38 | if(lastVisited == null) { |
40 | lastVisited = restored; | ||
41 | } else { | ||
42 | return; | 39 | return; |
43 | } | 40 | } |
44 | } | 41 | } |
@@ -47,7 +44,7 @@ public class BestFirstExplorer extends BestFirstWorker { | |||
47 | while(tryActivation && shouldRun()) { | 44 | while(tryActivation && shouldRun()) { |
48 | RandomVisitResult randomVisitResult = this.visitRandomUnvisited(random); | 45 | RandomVisitResult randomVisitResult = this.visitRandomUnvisited(random); |
49 | 46 | ||
50 | tryActivation &= randomVisitResult.shouldRetry(); | 47 | tryActivation = randomVisitResult.shouldRetry(); |
51 | var newSubmit = randomVisitResult.submitResult(); | 48 | var newSubmit = randomVisitResult.submitResult(); |
52 | if(newSubmit != null) { | 49 | if(newSubmit != null) { |
53 | if(!newSubmit.include()) { | 50 | if(!newSubmit.include()) { |
@@ -57,10 +54,14 @@ public class BestFirstExplorer extends BestFirstWorker { | |||
57 | int compareResult = compare(lastVisited,newVisit); | 54 | int compareResult = compare(lastVisited,newVisit); |
58 | if(compareResult >= 0) { | 55 | if(compareResult >= 0) { |
59 | lastVisited = newVisit; | 56 | lastVisited = newVisit; |
60 | continue mainLoop; | 57 | break; |
61 | } | 58 | } |
62 | } | 59 | } |
63 | } | 60 | } |
61 | else { | ||
62 | lastVisited = null; | ||
63 | break; | ||
64 | } | ||
64 | } | 65 | } |
65 | 66 | ||
66 | //final ObjectiveComparatorHelper objectiveComparatorHelper = dseAdapter.getObjectiveComparatorHelper(); | 67 | //final ObjectiveComparatorHelper objectiveComparatorHelper = dseAdapter.getObjectiveComparatorHelper(); |
@@ -160,5 +161,6 @@ public class BestFirstExplorer extends BestFirstWorker { | |||
160 | */ | 161 | */ |
161 | } | 162 | } |
162 | // Interrupted. | 163 | // Interrupted. |
164 | |||
163 | } | 165 | } |
164 | } | 166 | } |
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/strategy/BestFirstStoreManager.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/strategy/BestFirstStoreManager.java index 693b0903..4ccba6f7 100644 --- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/strategy/BestFirstStoreManager.java +++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/strategy/BestFirstStoreManager.java | |||
@@ -17,16 +17,22 @@ import tools.refinery.store.dse.transition.statespace.internal.ObjectivePriority | |||
17 | import tools.refinery.store.dse.transition.statespace.internal.SolutionStoreImpl; | 17 | import tools.refinery.store.dse.transition.statespace.internal.SolutionStoreImpl; |
18 | import tools.refinery.store.map.Version; | 18 | import tools.refinery.store.map.Version; |
19 | import tools.refinery.store.model.ModelStore; | 19 | import tools.refinery.store.model.ModelStore; |
20 | import tools.refinery.store.statecoding.StateCoderResult; | ||
20 | import tools.refinery.store.statecoding.StateCoderStoreAdapter; | 21 | import tools.refinery.store.statecoding.StateCoderStoreAdapter; |
22 | import tools.refinery.visualization.ModelVisualizerStoreAdapter; | ||
23 | import tools.refinery.visualization.statespace.VisualizationStore; | ||
24 | import tools.refinery.visualization.statespace.internal.VisualizationStoreImpl; | ||
21 | 25 | ||
22 | import java.util.function.Consumer; | 26 | import java.util.function.Consumer; |
23 | 27 | ||
24 | public class BestFirstStoreManager { | 28 | public class BestFirstStoreManager { |
29 | |||
25 | ModelStore modelStore; | 30 | ModelStore modelStore; |
26 | ObjectivePriorityQueue objectiveStore; | 31 | ObjectivePriorityQueue objectiveStore; |
27 | ActivationStore activationStore; | 32 | ActivationStore activationStore; |
28 | SolutionStore solutionStore; | 33 | SolutionStore solutionStore; |
29 | EquivalenceClassStore equivalenceClassStore; | 34 | EquivalenceClassStore equivalenceClassStore; |
35 | VisualizationStore visualizationStore; | ||
30 | 36 | ||
31 | public BestFirstStoreManager(ModelStore modelStore) { | 37 | public BestFirstStoreManager(ModelStore modelStore) { |
32 | this.modelStore = modelStore; | 38 | this.modelStore = modelStore; |
@@ -36,17 +42,17 @@ public class BestFirstStoreManager { | |||
36 | objectiveStore = new ObjectivePriorityQueueImpl(storeAdapter.getObjectives()); | 42 | objectiveStore = new ObjectivePriorityQueueImpl(storeAdapter.getObjectives()); |
37 | Consumer<VersionWithObjectiveValue> whenAllActivationsVisited = x -> objectiveStore.remove(x); | 43 | Consumer<VersionWithObjectiveValue> whenAllActivationsVisited = x -> objectiveStore.remove(x); |
38 | activationStore = new ActivationStoreImpl(storeAdapter.getTransformations().size(), whenAllActivationsVisited); | 44 | activationStore = new ActivationStoreImpl(storeAdapter.getTransformations().size(), whenAllActivationsVisited); |
39 | solutionStore = new SolutionStoreImpl(1); | 45 | solutionStore = new SolutionStoreImpl(50); |
40 | equivalenceClassStore = new FastEquivalenceClassStore(modelStore.getAdapter(StateCoderStoreAdapter.class)) { | 46 | equivalenceClassStore = new FastEquivalenceClassStore(modelStore.getAdapter(StateCoderStoreAdapter.class)) { |
41 | @Override | 47 | @Override |
42 | protected void delegate(VersionWithObjectiveValue version, int[] emptyActivations, boolean accept) { | 48 | protected void delegate(VersionWithObjectiveValue version, int[] emptyActivations, boolean accept) { |
43 | objectiveStore.submit(version); | 49 | throw new UnsupportedOperationException("This equivalence storage is not prepared to resolve symmetries!"); |
44 | activationStore.markNewAsVisited(version, emptyActivations); | ||
45 | if(accept) { | ||
46 | solutionStore.submit(version); | ||
47 | } | ||
48 | } | 50 | } |
49 | }; | 51 | }; |
52 | visualizationStore = new VisualizationStoreImpl(); | ||
53 | } | ||
54 | public ModelStore getModelStore() { | ||
55 | return modelStore; | ||
50 | } | 56 | } |
51 | 57 | ||
52 | ObjectivePriorityQueue getObjectiveStore() { | 58 | ObjectivePriorityQueue getObjectiveStore() { |
@@ -57,7 +63,7 @@ public class BestFirstStoreManager { | |||
57 | return activationStore; | 63 | return activationStore; |
58 | } | 64 | } |
59 | 65 | ||
60 | SolutionStore getSolutionStore() { | 66 | public SolutionStore getSolutionStore() { |
61 | return solutionStore; | 67 | return solutionStore; |
62 | } | 68 | } |
63 | 69 | ||
@@ -65,6 +71,10 @@ public class BestFirstStoreManager { | |||
65 | return equivalenceClassStore; | 71 | return equivalenceClassStore; |
66 | } | 72 | } |
67 | 73 | ||
74 | public VisualizationStore getVisualizationStore() { | ||
75 | return visualizationStore; | ||
76 | } | ||
77 | |||
68 | public void startExploration(Version initial) { | 78 | public void startExploration(Version initial) { |
69 | BestFirstExplorer bestFirstExplorer = new BestFirstExplorer(this, modelStore.createModelForState(initial), 1); | 79 | BestFirstExplorer bestFirstExplorer = new BestFirstExplorer(this, modelStore.createModelForState(initial), 1); |
70 | bestFirstExplorer.explore(); | 80 | bestFirstExplorer.explore(); |
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/strategy/BestFirstWorker.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/strategy/BestFirstWorker.java index ea7fe43f..f1bec14f 100644 --- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/strategy/BestFirstWorker.java +++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/strategy/BestFirstWorker.java | |||
@@ -11,8 +11,9 @@ import tools.refinery.store.dse.transition.VersionWithObjectiveValue; | |||
11 | import tools.refinery.store.dse.transition.statespace.internal.ActivationStoreWorker; | 11 | import tools.refinery.store.dse.transition.statespace.internal.ActivationStoreWorker; |
12 | import tools.refinery.store.map.Version; | 12 | import tools.refinery.store.map.Version; |
13 | import tools.refinery.store.model.Model; | 13 | import tools.refinery.store.model.Model; |
14 | import tools.refinery.store.query.ModelQueryAdapter; | ||
14 | import tools.refinery.store.statecoding.StateCoderAdapter; | 15 | import tools.refinery.store.statecoding.StateCoderAdapter; |
15 | 16 | import tools.refinery.visualization.statespace.VisualizationStore; | |
16 | 17 | ||
17 | import java.util.Random; | 18 | import java.util.Random; |
18 | 19 | ||
@@ -22,6 +23,9 @@ public class BestFirstWorker { | |||
22 | final ActivationStoreWorker activationStoreWorker; | 23 | final ActivationStoreWorker activationStoreWorker; |
23 | final StateCoderAdapter stateCoderAdapter; | 24 | final StateCoderAdapter stateCoderAdapter; |
24 | final DesignSpaceExplorationAdapter explorationAdapter; | 25 | final DesignSpaceExplorationAdapter explorationAdapter; |
26 | final ModelQueryAdapter queryAdapter; | ||
27 | final VisualizationStore visualizationStore; | ||
28 | final boolean isVisualizationEnabled; | ||
25 | 29 | ||
26 | public BestFirstWorker(BestFirstStoreManager storeManager, Model model) { | 30 | public BestFirstWorker(BestFirstStoreManager storeManager, Model model) { |
27 | this.storeManager = storeManager; | 31 | this.storeManager = storeManager; |
@@ -29,8 +33,11 @@ public class BestFirstWorker { | |||
29 | 33 | ||
30 | explorationAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); | 34 | explorationAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); |
31 | stateCoderAdapter = model.getAdapter(StateCoderAdapter.class); | 35 | stateCoderAdapter = model.getAdapter(StateCoderAdapter.class); |
36 | queryAdapter = model.getAdapter(ModelQueryAdapter.class); | ||
32 | activationStoreWorker = new ActivationStoreWorker(storeManager.getActivationStore(), | 37 | activationStoreWorker = new ActivationStoreWorker(storeManager.getActivationStore(), |
33 | explorationAdapter.getTransformations()); | 38 | explorationAdapter.getTransformations()); |
39 | visualizationStore = storeManager.getVisualizationStore(); | ||
40 | isVisualizationEnabled = visualizationStore != null; | ||
34 | } | 41 | } |
35 | 42 | ||
36 | private VersionWithObjectiveValue last = null; | 43 | private VersionWithObjectiveValue last = null; |
@@ -39,21 +46,36 @@ public class BestFirstWorker { | |||
39 | 46 | ||
40 | public SubmitResult submit() { | 47 | public SubmitResult submit() { |
41 | if (explorationAdapter.checkExclude()) { | 48 | if (explorationAdapter.checkExclude()) { |
42 | last = null; | ||
43 | return new SubmitResult(false, false, null, null); | 49 | return new SubmitResult(false, false, null, null); |
44 | } | 50 | } |
45 | 51 | ||
46 | Version version = model.commit(); | ||
47 | ObjectiveValue objectiveValue = explorationAdapter.getObjectiveValue(); | ||
48 | var res = new VersionWithObjectiveValue(version, objectiveValue); | ||
49 | var code = stateCoderAdapter.calculateStateCode(); | 52 | var code = stateCoderAdapter.calculateStateCode(); |
50 | var accepted = explorationAdapter.checkAccept(); | ||
51 | 53 | ||
52 | boolean isNew = storeManager.getEquivalenceClassStore().submit(res, code, | 54 | boolean isNew = storeManager.getEquivalenceClassStore().submit(code); |
53 | activationStoreWorker.calculateEmptyActivationSize(), accepted); | 55 | if (isNew) { |
56 | Version version = model.commit(); | ||
57 | ObjectiveValue objectiveValue = explorationAdapter.getObjectiveValue(); | ||
58 | var versionWithObjectiveValue = new VersionWithObjectiveValue(version, objectiveValue); | ||
59 | last = versionWithObjectiveValue; | ||
60 | var accepted = explorationAdapter.checkAccept(); | ||
61 | |||
62 | storeManager.getObjectiveStore().submit(versionWithObjectiveValue); | ||
63 | storeManager.getActivationStore().markNewAsVisited(versionWithObjectiveValue, activationStoreWorker.calculateEmptyActivationSize()); | ||
64 | if(accepted) { | ||
65 | storeManager.solutionStore.submit(versionWithObjectiveValue); | ||
66 | } | ||
67 | |||
68 | if (isVisualizationEnabled) { | ||
69 | visualizationStore.addState(last.version(), last.objectiveValue().toString()); | ||
70 | if (accepted) { | ||
71 | visualizationStore.addSolution(last.version()); | ||
72 | } | ||
73 | } | ||
74 | |||
75 | return new SubmitResult(true, accepted, objectiveValue, last); | ||
76 | } | ||
54 | 77 | ||
55 | last = new VersionWithObjectiveValue(version, objectiveValue); | 78 | return new SubmitResult(false, false, null, null); |
56 | return new SubmitResult(isNew, accepted, objectiveValue, last); | ||
57 | } | 79 | } |
58 | 80 | ||
59 | public void restoreToLast() { | 81 | public void restoreToLast() { |
@@ -65,7 +87,11 @@ public class BestFirstWorker { | |||
65 | public VersionWithObjectiveValue restoreToBest() { | 87 | public VersionWithObjectiveValue restoreToBest() { |
66 | var bestVersion = storeManager.getObjectiveStore().getBest(); | 88 | var bestVersion = storeManager.getObjectiveStore().getBest(); |
67 | if (bestVersion != null) { | 89 | if (bestVersion != null) { |
90 | var oldVersion = model.getState(); | ||
68 | this.model.restore(bestVersion.version()); | 91 | this.model.restore(bestVersion.version()); |
92 | if (isVisualizationEnabled) { | ||
93 | visualizationStore.addTransition(oldVersion, last.version(), ""); | ||
94 | } | ||
69 | } | 95 | } |
70 | return bestVersion; | 96 | return bestVersion; |
71 | } | 97 | } |
@@ -91,14 +117,25 @@ public class BestFirstWorker { | |||
91 | } | 117 | } |
92 | } | 118 | } |
93 | 119 | ||
94 | record RandomVisitResult(SubmitResult submitResult, boolean shouldRetry) { | 120 | public record RandomVisitResult(SubmitResult submitResult, boolean shouldRetry) { |
95 | } | 121 | } |
96 | 122 | ||
97 | public RandomVisitResult visitRandomUnvisited(Random random) { | 123 | public RandomVisitResult visitRandomUnvisited(Random random) { |
98 | if (!model.hasUncommittedChanges()) { | 124 | if (!model.hasUncommittedChanges()) { |
125 | queryAdapter.flushChanges(); | ||
99 | var visitResult = activationStoreWorker.fireRandomActivation(this.last, random); | 126 | var visitResult = activationStoreWorker.fireRandomActivation(this.last, random); |
127 | |||
100 | if (visitResult.successfulVisit()) { | 128 | if (visitResult.successfulVisit()) { |
101 | return new RandomVisitResult(submit(), visitResult.mayHaveMore()); | 129 | Version oldVersion = null; |
130 | if (isVisualizationEnabled) { | ||
131 | oldVersion = last.version(); | ||
132 | } | ||
133 | var submitResult = submit(); | ||
134 | if (isVisualizationEnabled && submitResult.newVersion() != null) { | ||
135 | var newVersion = submitResult.newVersion().version(); | ||
136 | visualizationStore.addTransition(oldVersion, newVersion, ""); | ||
137 | } | ||
138 | return new RandomVisitResult(submitResult, visitResult.mayHaveMore()); | ||
102 | } else { | 139 | } else { |
103 | return new RandomVisitResult(null, visitResult.mayHaveMore()); | 140 | return new RandomVisitResult(null, visitResult.mayHaveMore()); |
104 | } | 141 | } |
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/EquivalenceClassStore.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/EquivalenceClassStore.java index bbe26fe5..28d1488b 100644 --- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/EquivalenceClassStore.java +++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/EquivalenceClassStore.java | |||
@@ -10,6 +10,7 @@ import tools.refinery.store.statecoding.StateCoderResult; | |||
10 | 10 | ||
11 | public interface EquivalenceClassStore { | 11 | public interface EquivalenceClassStore { |
12 | boolean submit(VersionWithObjectiveValue version, StateCoderResult stateCoderResult, int[] emptyActivations, boolean accept); | 12 | boolean submit(VersionWithObjectiveValue version, StateCoderResult stateCoderResult, int[] emptyActivations, boolean accept); |
13 | boolean submit(StateCoderResult stateCoderResult); | ||
13 | boolean hasUnresolvedSymmetry(); | 14 | boolean hasUnresolvedSymmetry(); |
14 | void resolveOneSymmetry(); | 15 | void resolveOneSymmetry(); |
15 | int getNumberOfUnresolvedSymmetries(); | 16 | int getNumberOfUnresolvedSymmetries(); |
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/AbstractEquivalenceClassStore.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/AbstractEquivalenceClassStore.java index 8466a0f3..b5087e86 100644 --- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/AbstractEquivalenceClassStore.java +++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/AbstractEquivalenceClassStore.java | |||
@@ -22,6 +22,13 @@ public abstract class AbstractEquivalenceClassStore implements EquivalenceClassS | |||
22 | protected abstract boolean tryToAdd(StateCoderResult stateCoderResult, VersionWithObjectiveValue newVersion, | 22 | protected abstract boolean tryToAdd(StateCoderResult stateCoderResult, VersionWithObjectiveValue newVersion, |
23 | int[] emptyActivations, boolean accept); | 23 | int[] emptyActivations, boolean accept); |
24 | 24 | ||
25 | public abstract boolean tryToAdd(StateCoderResult stateCoderResult); | ||
26 | |||
27 | @Override | ||
28 | public boolean submit(StateCoderResult stateCoderResult) { | ||
29 | return tryToAdd(stateCoderResult); | ||
30 | } | ||
31 | |||
25 | @Override | 32 | @Override |
26 | public synchronized boolean submit(VersionWithObjectiveValue version, StateCoderResult stateCoderResult, | 33 | public synchronized boolean submit(VersionWithObjectiveValue version, StateCoderResult stateCoderResult, |
27 | int[] emptyActivations, boolean accept) { | 34 | int[] emptyActivations, boolean accept) { |
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/ActivationStoreImpl.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/ActivationStoreImpl.java index 3e59b21a..4d775b5a 100644 --- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/ActivationStoreImpl.java +++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/ActivationStoreImpl.java | |||
@@ -29,7 +29,7 @@ public class ActivationStoreImpl implements ActivationStore { | |||
29 | successful[0] = true; | 29 | successful[0] = true; |
30 | List<ActivationStoreEntry> result = new ArrayList<>(emptyEntrySizes.length); | 30 | List<ActivationStoreEntry> result = new ArrayList<>(emptyEntrySizes.length); |
31 | for(int emptyEntrySize : emptyEntrySizes) { | 31 | for(int emptyEntrySize : emptyEntrySizes) { |
32 | result.add(ActivationStoreListEntry.create(emptyEntrySize)); | 32 | result.add(ActivationStoreEntry.create(emptyEntrySize)); |
33 | } | 33 | } |
34 | return result; | 34 | return result; |
35 | }); | 35 | }); |
@@ -66,10 +66,10 @@ public class ActivationStoreImpl implements ActivationStore { | |||
66 | activation = -1; | 66 | activation = -1; |
67 | } | 67 | } |
68 | 68 | ||
69 | if(hasMoreInActivation) { | 69 | if(!hasMoreInActivation) { |
70 | boolean hasMoreInOtherTransformation = false; | 70 | boolean hasMoreInOtherTransformation = false; |
71 | for (var e : entries) { | 71 | for (var e : entries) { |
72 | if (e != entry && e.getNumberOfVisitedActivations() > 0) { | 72 | if (e != entry && e.getNumberOfUnvisitedActivations() > 0) { |
73 | hasMoreInOtherTransformation = true; | 73 | hasMoreInOtherTransformation = true; |
74 | break; | 74 | break; |
75 | } | 75 | } |
@@ -83,7 +83,7 @@ public class ActivationStoreImpl implements ActivationStore { | |||
83 | actionWhenAllActivationVisited.accept(from); | 83 | actionWhenAllActivationVisited.accept(from); |
84 | } | 84 | } |
85 | 85 | ||
86 | return new VisitResult(false, hasMore, transformation, activation); | 86 | return new VisitResult(successfulVisit, hasMore, transformation, activation); |
87 | } | 87 | } |
88 | 88 | ||
89 | @Override | 89 | @Override |
@@ -108,6 +108,11 @@ public class ActivationStoreImpl implements ActivationStore { | |||
108 | sum1 += entry.getNumberOfUnvisitedActivations(); | 108 | sum1 += entry.getNumberOfUnvisitedActivations(); |
109 | } | 109 | } |
110 | 110 | ||
111 | if(sum1 == 0) { | ||
112 | this.actionWhenAllActivationVisited.accept(version); | ||
113 | return new VisitResult(false, false, -1, -1); | ||
114 | } | ||
115 | |||
111 | int selected = random.nextInt(sum1); | 116 | int selected = random.nextInt(sum1); |
112 | int sum2 = 0; | 117 | int sum2 = 0; |
113 | int transformation = 0; | 118 | int transformation = 0; |
@@ -116,7 +121,7 @@ public class ActivationStoreImpl implements ActivationStore { | |||
116 | var entry = entries.get(transformation); | 121 | var entry = entries.get(transformation); |
117 | int unvisited = entry.getNumberOfUnvisitedActivations(); | 122 | int unvisited = entry.getNumberOfUnvisitedActivations(); |
118 | if (selected < sum2 + unvisited) { | 123 | if (selected < sum2 + unvisited) { |
119 | activation = sum2 + unvisited - selected; | 124 | activation = sum2 + unvisited - selected - 1; |
120 | break; | 125 | break; |
121 | } else { | 126 | } else { |
122 | sum2 += unvisited; | 127 | sum2 += unvisited; |
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/ActivationStoreWorker.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/ActivationStoreWorker.java index e05f5122..881b133c 100644 --- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/ActivationStoreWorker.java +++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/ActivationStoreWorker.java | |||
@@ -8,7 +8,6 @@ package tools.refinery.store.dse.transition.statespace.internal; | |||
8 | import tools.refinery.store.dse.transition.Transformation; | 8 | import tools.refinery.store.dse.transition.Transformation; |
9 | import tools.refinery.store.dse.transition.VersionWithObjectiveValue; | 9 | import tools.refinery.store.dse.transition.VersionWithObjectiveValue; |
10 | import tools.refinery.store.dse.transition.statespace.ActivationStore; | 10 | import tools.refinery.store.dse.transition.statespace.ActivationStore; |
11 | import tools.refinery.store.map.Version; | ||
12 | 11 | ||
13 | import java.util.List; | 12 | import java.util.List; |
14 | import java.util.Random; | 13 | import java.util.Random; |
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/FastEquivalenceClassStore.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/FastEquivalenceClassStore.java index 6ee8e196..6d028124 100644 --- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/FastEquivalenceClassStore.java +++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/FastEquivalenceClassStore.java | |||
@@ -16,12 +16,17 @@ public abstract class FastEquivalenceClassStore extends AbstractEquivalenceClass | |||
16 | 16 | ||
17 | private final MutableIntSet codes = IntSets.mutable.empty(); | 17 | private final MutableIntSet codes = IntSets.mutable.empty(); |
18 | 18 | ||
19 | public FastEquivalenceClassStore(StateCoderStoreAdapter stateCoderStoreAdapter) { | 19 | protected FastEquivalenceClassStore(StateCoderStoreAdapter stateCoderStoreAdapter) { |
20 | super(stateCoderStoreAdapter); | 20 | super(stateCoderStoreAdapter); |
21 | } | 21 | } |
22 | 22 | ||
23 | @Override | 23 | @Override |
24 | protected boolean tryToAdd(StateCoderResult stateCoderResult, VersionWithObjectiveValue newVersion, int[] emptyActivations, boolean accept) { | 24 | protected synchronized boolean tryToAdd(StateCoderResult stateCoderResult, VersionWithObjectiveValue newVersion, |
25 | int[] emptyActivations, boolean accept) { | ||
26 | return this.codes.add(stateCoderResult.modelCode()); | ||
27 | } | ||
28 | |||
29 | public synchronized boolean tryToAdd(StateCoderResult stateCoderResult) { | ||
25 | return this.codes.add(stateCoderResult.modelCode()); | 30 | return this.codes.add(stateCoderResult.modelCode()); |
26 | } | 31 | } |
27 | 32 | ||
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/ObjectivePriorityQueueImpl.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/ObjectivePriorityQueueImpl.java index 249b22da..2f3e142a 100644 --- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/ObjectivePriorityQueueImpl.java +++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/ObjectivePriorityQueueImpl.java | |||
@@ -9,7 +9,6 @@ import tools.refinery.store.dse.transition.ObjectiveValues; | |||
9 | import tools.refinery.store.dse.transition.VersionWithObjectiveValue; | 9 | import tools.refinery.store.dse.transition.VersionWithObjectiveValue; |
10 | import tools.refinery.store.dse.transition.objectives.Objective; | 10 | import tools.refinery.store.dse.transition.objectives.Objective; |
11 | import tools.refinery.store.dse.transition.statespace.ObjectivePriorityQueue; | 11 | import tools.refinery.store.dse.transition.statespace.ObjectivePriorityQueue; |
12 | import tools.refinery.store.map.Version; | ||
13 | 12 | ||
14 | import java.util.Comparator; | 13 | import java.util.Comparator; |
15 | import java.util.List; | 14 | import java.util.List; |
@@ -37,32 +36,27 @@ public class ObjectivePriorityQueueImpl implements ObjectivePriorityQueue { | |||
37 | } | 36 | } |
38 | 37 | ||
39 | @Override | 38 | @Override |
40 | public void submit(VersionWithObjectiveValue versionWithObjectiveValue) { | 39 | public synchronized void submit(VersionWithObjectiveValue versionWithObjectiveValue) { |
41 | priorityQueue.add(versionWithObjectiveValue); | 40 | priorityQueue.add(versionWithObjectiveValue); |
42 | } | 41 | } |
43 | 42 | ||
44 | @Override | 43 | @Override |
45 | public void remove(VersionWithObjectiveValue versionWithObjectiveValue) { | 44 | public synchronized void remove(VersionWithObjectiveValue versionWithObjectiveValue) { |
46 | priorityQueue.remove(versionWithObjectiveValue); | 45 | priorityQueue.remove(versionWithObjectiveValue); |
47 | } | 46 | } |
48 | 47 | ||
49 | @Override | 48 | @Override |
50 | public int getSize() { | 49 | public synchronized int getSize() { |
51 | return priorityQueue.size(); | 50 | return priorityQueue.size(); |
52 | } | 51 | } |
53 | 52 | ||
54 | @Override | 53 | @Override |
55 | public VersionWithObjectiveValue getBest() { | 54 | public synchronized VersionWithObjectiveValue getBest() { |
56 | var best = priorityQueue.peek(); | 55 | return priorityQueue.peek(); |
57 | if (best != null) { | ||
58 | return best; | ||
59 | } else { | ||
60 | throw new IllegalArgumentException("The objective store is empty!"); | ||
61 | } | ||
62 | } | 56 | } |
63 | 57 | ||
64 | @Override | 58 | @Override |
65 | public VersionWithObjectiveValue getRandom(Random random) { | 59 | public synchronized VersionWithObjectiveValue getRandom(Random random) { |
66 | int randomPosition = random.nextInt(getSize()); | 60 | int randomPosition = random.nextInt(getSize()); |
67 | for (VersionWithObjectiveValue entry : this.priorityQueue) { | 61 | for (VersionWithObjectiveValue entry : this.priorityQueue) { |
68 | if (randomPosition-- == 0) { | 62 | if (randomPosition-- == 0) { |
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/SolutionStoreImpl.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/SolutionStoreImpl.java index cc48864f..43548eaa 100644 --- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/SolutionStoreImpl.java +++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/SolutionStoreImpl.java | |||
@@ -10,17 +10,17 @@ import tools.refinery.store.dse.transition.statespace.SolutionStore; | |||
10 | 10 | ||
11 | import java.util.ArrayList; | 11 | import java.util.ArrayList; |
12 | import java.util.List; | 12 | import java.util.List; |
13 | import java.util.SortedSet; | 13 | import java.util.PriorityQueue; |
14 | import java.util.TreeSet; | 14 | |
15 | 15 | ||
16 | public class SolutionStoreImpl implements SolutionStore { | 16 | public class SolutionStoreImpl implements SolutionStore { |
17 | final int maxNumberSolutions; | 17 | final int maxNumberSolutions; |
18 | public static final int UNLIMITED = -1; | 18 | public static final int UNLIMITED = -1; |
19 | final SortedSet<VersionWithObjectiveValue> solutions; | 19 | final PriorityQueue<VersionWithObjectiveValue> solutions; |
20 | 20 | ||
21 | public SolutionStoreImpl(int maxNumberSolutions) { | 21 | public SolutionStoreImpl(int maxNumberSolutions) { |
22 | this.maxNumberSolutions = maxNumberSolutions; | 22 | this.maxNumberSolutions = maxNumberSolutions; |
23 | solutions = new TreeSet<>(ObjectivePriorityQueueImpl.c1); | 23 | solutions = new PriorityQueue<>(ObjectivePriorityQueueImpl.c1.reversed()); |
24 | } | 24 | } |
25 | 25 | ||
26 | 26 | ||
@@ -29,8 +29,7 @@ public class SolutionStoreImpl implements SolutionStore { | |||
29 | boolean removeLast = hasEnoughSolution(); | 29 | boolean removeLast = hasEnoughSolution(); |
30 | solutions.add(version); | 30 | solutions.add(version); |
31 | if(removeLast) { | 31 | if(removeLast) { |
32 | var last = solutions.last(); | 32 | var last = solutions.poll(); |
33 | solutions.remove(last); | ||
34 | return last != version; | 33 | return last != version; |
35 | } else { | 34 | } else { |
36 | return true; | 35 | return true; |