aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2023-09-07 23:08:51 +0200
committerLibravatar Kristóf Marussy <kristof@marussy.com>2023-09-07 23:08:51 +0200
commit8843df2228777a4b1e3e2dc268b19ece30419afe (patch)
treefd92eb07cca85775062a037be7dc050c83c3d9df
parentfix(dse): best-first strategy (diff)
downloadrefinery-8843df2228777a4b1e3e2dc268b19ece30419afe.tar.gz
refinery-8843df2228777a4b1e3e2dc268b19ece30419afe.tar.zst
refinery-8843df2228777a4b1e3e2dc268b19ece30419afe.zip
refactor(store): neighborhood optimization
* Use LinekdHashMap in delta-based stores to improve iteration performance * Avoid allocating ObjectCodeImpl
-rw-r--r--subprojects/store/src/main/java/tools/refinery/store/map/internal/delta/VersionedMapDeltaImpl.java2
-rw-r--r--subprojects/store/src/main/java/tools/refinery/store/statecoding/neighbourhood/NeighbourhoodCalculator.java14
-rw-r--r--subprojects/store/src/main/java/tools/refinery/store/statecoding/neighbourhood/ObjectCodeImpl.java7
3 files changed, 17 insertions, 6 deletions
diff --git a/subprojects/store/src/main/java/tools/refinery/store/map/internal/delta/VersionedMapDeltaImpl.java b/subprojects/store/src/main/java/tools/refinery/store/map/internal/delta/VersionedMapDeltaImpl.java
index d530ae87..8be42712 100644
--- a/subprojects/store/src/main/java/tools/refinery/store/map/internal/delta/VersionedMapDeltaImpl.java
+++ b/subprojects/store/src/main/java/tools/refinery/store/map/internal/delta/VersionedMapDeltaImpl.java
@@ -23,7 +23,7 @@ public class VersionedMapDeltaImpl<K, V> implements VersionedMap<K, V> {
23 this.store = store; 23 this.store = store;
24 this.defaultValue = defaultValue; 24 this.defaultValue = defaultValue;
25 25
26 current = new HashMap<>(); 26 current = new LinkedHashMap<>();
27 if (summarizeChanges) { 27 if (summarizeChanges) {
28 this.uncommittedStore = new UncommittedDeltaMapStore<>(this); 28 this.uncommittedStore = new UncommittedDeltaMapStore<>(this);
29 } else { 29 } else {
diff --git a/subprojects/store/src/main/java/tools/refinery/store/statecoding/neighbourhood/NeighbourhoodCalculator.java b/subprojects/store/src/main/java/tools/refinery/store/statecoding/neighbourhood/NeighbourhoodCalculator.java
index 785fda7a..1442c915 100644
--- a/subprojects/store/src/main/java/tools/refinery/store/statecoding/neighbourhood/NeighbourhoodCalculator.java
+++ b/subprojects/store/src/main/java/tools/refinery/store/statecoding/neighbourhood/NeighbourhoodCalculator.java
@@ -18,21 +18,25 @@ import java.util.List;
18import java.util.Objects; 18import java.util.Objects;
19 19
20public class NeighbourhoodCalculator extends AbstractNeighbourhoodCalculator implements StateCodeCalculator { 20public class NeighbourhoodCalculator extends AbstractNeighbourhoodCalculator implements StateCodeCalculator {
21 private ObjectCodeImpl previousObjectCode = new ObjectCodeImpl();
22 private ObjectCodeImpl nextObjectCode = new ObjectCodeImpl();
23
21 public NeighbourhoodCalculator(List<? extends Interpretation<?>> interpretations, IntSet individuals) { 24 public NeighbourhoodCalculator(List<? extends Interpretation<?>> interpretations, IntSet individuals) {
22 super(interpretations, individuals); 25 super(interpretations, individuals);
23 } 26 }
24 27
25 public StateCoderResult calculateCodes() { 28 public StateCoderResult calculateCodes() {
26 ObjectCodeImpl previousObjectCode = new ObjectCodeImpl(); 29 previousObjectCode.clear();
30 nextObjectCode.clear();
27 initializeWithIndividuals(previousObjectCode); 31 initializeWithIndividuals(previousObjectCode);
28 32
29 int rounds = 0; 33 int rounds = 0;
30 do { 34 do {
31 final ObjectCodeImpl nextObjectCode = rounds == 0 ? new ObjectCodeImpl() :
32 new ObjectCodeImpl(previousObjectCode.getSize());
33
34 constructNextObjectCodes(previousObjectCode, nextObjectCode); 35 constructNextObjectCodes(previousObjectCode, nextObjectCode);
36 var tempObjectCode = previousObjectCode;
35 previousObjectCode = nextObjectCode; 37 previousObjectCode = nextObjectCode;
38 nextObjectCode = tempObjectCode;
39 nextObjectCode.clear();
36 rounds++; 40 rounds++;
37 } while (rounds <= 7 && rounds <= previousObjectCode.getEffectiveSize()); 41 } while (rounds <= 7 && rounds <= previousObjectCode.getEffectiveSize());
38 42
@@ -43,7 +47,7 @@ public class NeighbourhoodCalculator extends AbstractNeighbourhoodCalculator imp
43 private long calculateLastSum(ObjectCode codes) { 47 private long calculateLastSum(ObjectCode codes) {
44 long result = 0; 48 long result = 0;
45 for (var nullImpactValue : nullImpactValues) { 49 for (var nullImpactValue : nullImpactValues) {
46 result = result * 31 + Objects.hashCode(((Interpretation<?>) nullImpactValue).get(Tuple0.INSTANCE)); 50 result = result * PRIME + Objects.hashCode(((Interpretation<?>) nullImpactValue).get(Tuple0.INSTANCE));
47 } 51 }
48 52
49 for (int i = 0; i < codes.getSize(); i++) { 53 for (int i = 0; i < codes.getSize(); i++) {
diff --git a/subprojects/store/src/main/java/tools/refinery/store/statecoding/neighbourhood/ObjectCodeImpl.java b/subprojects/store/src/main/java/tools/refinery/store/statecoding/neighbourhood/ObjectCodeImpl.java
index 0cd7ff58..422e1d73 100644
--- a/subprojects/store/src/main/java/tools/refinery/store/statecoding/neighbourhood/ObjectCodeImpl.java
+++ b/subprojects/store/src/main/java/tools/refinery/store/statecoding/neighbourhood/ObjectCodeImpl.java
@@ -32,6 +32,13 @@ public class ObjectCodeImpl implements ObjectCode {
32 effectiveSize = copy.effectiveSize; 32 effectiveSize = copy.effectiveSize;
33 } 33 }
34 34
35 public void clear() {
36 effectiveSize = 0;
37 for (int i = 0; i < size; i++) {
38 vector[i] = 0;
39 }
40 }
41
35 public void ensureSize(int object) { 42 public void ensureSize(int object) {
36 if (object >= size) { 43 if (object >= size) {
37 size = object + 1; 44 size = object + 1;