aboutsummaryrefslogtreecommitdiffstats
path: root/Solvers
diff options
context:
space:
mode:
authorLibravatar Oszkar Semerath <Oszkar Semerath@DESKTOP-DNR7JQ7>2021-07-17 15:37:48 +0200
committerLibravatar Oszkar Semerath <Oszkar Semerath@DESKTOP-DNR7JQ7>2021-07-17 15:37:48 +0200
commit97237f587659d4b23ddd80aa7901e472071055b8 (patch)
tree1eb449ea158466c7f06995b57a5314dc58eb69eb /Solvers
parentMerging immutable nodes during commits. (diff)
downloadVIATRA-Generator-97237f587659d4b23ddd80aa7901e472071055b8.tar.gz
VIATRA-Generator-97237f587659d4b23ddd80aa7901e472071055b8.tar.zst
VIATRA-Generator-97237f587659d4b23ddd80aa7901e472071055b8.zip
Caching immutable nodes
Diffstat (limited to 'Solvers')
-rw-r--r--Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/ImmutableNode.java21
1 files changed, 13 insertions, 8 deletions
diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/ImmutableNode.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/ImmutableNode.java
index 539f9d65..229aee74 100644
--- a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/ImmutableNode.java
+++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/ImmutableNode.java
@@ -48,9 +48,6 @@ public class ImmutableNode<KEY, VALUE> extends Node<KEY, VALUE> {
48 } 48 }
49 49
50 // 2. otherwise construct a new ImmutableNode 50 // 2. otherwise construct a new ImmutableNode
51
52 final int resultHash = node.hashCode();
53
54 int size = 0; 51 int size = 0;
55 for(int i = 0; i<node.content.length; i++) { 52 for(int i = 0; i<node.content.length; i++) {
56 if(node.content[i]!=null) { 53 if(node.content[i]!=null) {
@@ -82,8 +79,12 @@ public class ImmutableNode<KEY, VALUE> extends Node<KEY, VALUE> {
82 } 79 }
83 bitposition<<=1; 80 bitposition<<=1;
84 } 81 }
82 final int resultHash = node.hashCode();
83 ImmutableNode<KEY,VALUE> newImmutable = new ImmutableNode<>(resultDataMap, resultNodeMap, resultContent, resultHash);
85 84
86 return new ImmutableNode<>(resultDataMap, resultNodeMap, resultContent, resultHash); 85 // 3. save new immutable.
86 cache.put(newImmutable, newImmutable);
87 return newImmutable;
87 } 88 }
88 89
89 private int index(int bitmap, int bitpos) { 90 private int index(int bitmap, int bitpos) {
@@ -185,7 +186,8 @@ public class ImmutableNode<KEY, VALUE> extends Node<KEY, VALUE> {
185 public long getSize() { 186 public long getSize() {
186 int result = Integer.bitCount(this.dataMap); 187 int result = Integer.bitCount(this.dataMap);
187 for(int subnodeIndex = 0; subnodeIndex < Integer.bitCount(this.nodeMap); subnodeIndex++) { 188 for(int subnodeIndex = 0; subnodeIndex < Integer.bitCount(this.nodeMap); subnodeIndex++) {
188 ImmutableNode<KEY,VALUE> subnode = (ImmutableNode<KEY, VALUE>) this.content[this.content.length-1-subnodeIndex]; 189 ImmutableNode<KEY,VALUE> subnode =
190 (ImmutableNode<KEY, VALUE>) this.content[this.content.length-1-subnodeIndex];
189 result += subnode.getSize(); 191 result += subnode.getSize();
190 } 192 }
191 return result; 193 return result;
@@ -325,8 +327,10 @@ public class ImmutableNode<KEY, VALUE> extends Node<KEY, VALUE> {
325 int nodes = 0; 327 int nodes = 0;
326 final int immutableLength = immutable.content.length; 328 final int immutableLength = immutable.content.length;
327 for(int i = 0; i<factor; i++) { 329 for(int i = 0; i<factor; i++) {
328 Object key = immutable.content[i*2]; 330 Object key = mutable.content[i*2];
331 // For each key candidate
329 if(key != null) { 332 if(key != null) {
333 // Check whether a new Key-Value pair can fit into the immutable container
330 if(datas*2+nodes+2 <= immutableLength) { 334 if(datas*2+nodes+2 <= immutableLength) {
331 if( mutable.content[datas*2] != key || 335 if( mutable.content[datas*2] != key ||
332 mutable.content[datas*2+1] != immutable.content[i*2+1]) 336 mutable.content[datas*2+1] != immutable.content[i*2+1])
@@ -339,16 +343,17 @@ public class ImmutableNode<KEY, VALUE> extends Node<KEY, VALUE> {
339 Node<?,?> mutableSubnode = (Node<?, ?>) mutable.content[i*2+1]; 343 Node<?,?> mutableSubnode = (Node<?, ?>) mutable.content[i*2+1];
340 if(mutableSubnode != null) { 344 if(mutableSubnode != null) {
341 if(datas*2+nodes+1 <= immutableLength) { 345 if(datas*2+nodes+1 <= immutableLength) {
342 Node<?,?> immutableSubnode = (Node<?, ?>) immutable.content[immutableLength-1-nodes]; 346 Object immutableSubnode = immutable.content[immutableLength-1-nodes];
343 if(!mutableSubnode.equals(immutableSubnode)) { 347 if(!mutableSubnode.equals(immutableSubnode)) {
344 return false; 348 return false;
345 } 349 }
346 nodes++; 350 nodes++;
351 } else {
352 return false;
347 } 353 }
348 } 354 }
349 } 355 }
350 } 356 }
351 return true; 357 return true;
352 } 358 }
353
354} 359}