From 8843df2228777a4b1e3e2dc268b19ece30419afe Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Thu, 7 Sep 2023 23:08:51 +0200 Subject: refactor(store): neighborhood optimization * Use LinekdHashMap in delta-based stores to improve iteration performance * Avoid allocating ObjectCodeImpl --- .../store/map/internal/delta/VersionedMapDeltaImpl.java | 2 +- .../statecoding/neighbourhood/NeighbourhoodCalculator.java | 14 +++++++++----- .../store/statecoding/neighbourhood/ObjectCodeImpl.java | 7 +++++++ 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 implements VersionedMap { this.store = store; this.defaultValue = defaultValue; - current = new HashMap<>(); + current = new LinkedHashMap<>(); if (summarizeChanges) { this.uncommittedStore = new UncommittedDeltaMapStore<>(this); } 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; import java.util.Objects; public class NeighbourhoodCalculator extends AbstractNeighbourhoodCalculator implements StateCodeCalculator { + private ObjectCodeImpl previousObjectCode = new ObjectCodeImpl(); + private ObjectCodeImpl nextObjectCode = new ObjectCodeImpl(); + public NeighbourhoodCalculator(List> interpretations, IntSet individuals) { super(interpretations, individuals); } public StateCoderResult calculateCodes() { - ObjectCodeImpl previousObjectCode = new ObjectCodeImpl(); + previousObjectCode.clear(); + nextObjectCode.clear(); initializeWithIndividuals(previousObjectCode); int rounds = 0; do { - final ObjectCodeImpl nextObjectCode = rounds == 0 ? new ObjectCodeImpl() : - new ObjectCodeImpl(previousObjectCode.getSize()); - constructNextObjectCodes(previousObjectCode, nextObjectCode); + var tempObjectCode = previousObjectCode; previousObjectCode = nextObjectCode; + nextObjectCode = tempObjectCode; + nextObjectCode.clear(); rounds++; } while (rounds <= 7 && rounds <= previousObjectCode.getEffectiveSize()); @@ -43,7 +47,7 @@ public class NeighbourhoodCalculator extends AbstractNeighbourhoodCalculator imp private long calculateLastSum(ObjectCode codes) { long result = 0; for (var nullImpactValue : nullImpactValues) { - result = result * 31 + Objects.hashCode(((Interpretation) nullImpactValue).get(Tuple0.INSTANCE)); + result = result * PRIME + Objects.hashCode(((Interpretation) nullImpactValue).get(Tuple0.INSTANCE)); } 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 { effectiveSize = copy.effectiveSize; } + public void clear() { + effectiveSize = 0; + for (int i = 0; i < size; i++) { + vector[i] = 0; + } + } + public void ensureSize(int object) { if (object >= size) { size = object + 1; -- cgit v1.2.3-54-g00ecf