aboutsummaryrefslogtreecommitdiffstats
path: root/Solvers
diff options
context:
space:
mode:
authorLibravatar Oszkar Semerath <Oszkar Semerath@DESKTOP-DNR7JQ7>2021-07-14 00:42:27 +0200
committerLibravatar Oszkar Semerath <Oszkar Semerath@DESKTOP-DNR7JQ7>2021-07-14 00:42:27 +0200
commitb3f04c02792e2ff65935b75245b43f1e50e99860 (patch)
treebc285b39b33eed030c677b11c364190032be1c18 /Solvers
parentTests and iterators (diff)
downloadVIATRA-Generator-b3f04c02792e2ff65935b75245b43f1e50e99860.tar.gz
VIATRA-Generator-b3f04c02792e2ff65935b75245b43f1e50e99860.tar.zst
VIATRA-Generator-b3f04c02792e2ff65935b75245b43f1e50e99860.zip
Merged nodes in cache
Diffstat (limited to 'Solvers')
-rw-r--r--Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMapStoreImpl.java10
-rw-r--r--Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/ImmutableNode.java121
-rw-r--r--Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MutableNode.java99
-rw-r--r--Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/Node.java8
-rw-r--r--Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/VersionedMapImpl.java1
5 files changed, 207 insertions, 32 deletions
diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMapStoreImpl.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMapStoreImpl.java
index c5516cda..d115833e 100644
--- a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMapStoreImpl.java
+++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMapStoreImpl.java
@@ -3,14 +3,18 @@ package org.eclipse.viatra.solver.data.map;
3import java.util.HashMap; 3import java.util.HashMap;
4import java.util.Map; 4import java.util.Map;
5import java.util.Set; 5import java.util.Set;
6import java.util.WeakHashMap;
6 7
7import org.eclipse.viatra.solver.data.map.internal.ImmutableNode; 8import org.eclipse.viatra.solver.data.map.internal.ImmutableNode;
9import org.eclipse.viatra.solver.data.map.internal.Node;
8import org.eclipse.viatra.solver.data.map.internal.VersionedMapImpl; 10import org.eclipse.viatra.solver.data.map.internal.VersionedMapImpl;
9 11
10public class VersionedMapStoreImpl<KEY,VALUE> implements VersionedMapStore<KEY, VALUE> { 12public class VersionedMapStoreImpl<KEY,VALUE> implements VersionedMapStore<KEY, VALUE> {
11 protected final ContinousHashProvider<? super KEY> hashProvider; 13 protected final ContinousHashProvider<? super KEY> hashProvider;
12 protected final VALUE defaultValue; 14 protected final VALUE defaultValue;
15
13 protected Map<Long, ImmutableNode<KEY,VALUE>> states; 16 protected Map<Long, ImmutableNode<KEY,VALUE>> states;
17 protected WeakHashMap<Node<KEY,VALUE>, ImmutableNode<KEY,VALUE>> nodeCache;
14 protected long nextID; 18 protected long nextID;
15 19
16 public VersionedMapStoreImpl(ContinousHashProvider<? super KEY> hashProvider, VALUE defaultValue) { 20 public VersionedMapStoreImpl(ContinousHashProvider<? super KEY> hashProvider, VALUE defaultValue) {
@@ -42,8 +46,12 @@ public class VersionedMapStoreImpl<KEY,VALUE> implements VersionedMapStore<KEY,
42 return states.get(state); 46 return states.get(state);
43 } 47 }
44 48
49 private long getNextID() {
50 if(nextID == Long.MAX_VALUE) throw new IllegalStateException("Map store run out of Id-s");
51 return nextID++;
52 }
45 public long addState(ImmutableNode<KEY,VALUE> data) { 53 public long addState(ImmutableNode<KEY,VALUE> data) {
46 long id = nextID++; 54 long id = getNextID();
47 states.put(id,data); 55 states.put(id,data);
48 return id; 56 return id;
49 } 57 }
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 1765a54e..daff1af1 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
@@ -1,36 +1,54 @@
1package org.eclipse.viatra.solver.data.map.internal; 1package org.eclipse.viatra.solver.data.map.internal;
2 2
3import java.util.Arrays;
4import java.util.Map;
5
3import org.eclipse.viatra.solver.data.map.ContinousHashProvider; 6import org.eclipse.viatra.solver.data.map.ContinousHashProvider;
4 7
5public class ImmutableNode<KEY, VALUE> extends Node<KEY, VALUE> { 8public class ImmutableNode<KEY, VALUE> extends Node<KEY, VALUE> {
6 /** 9 /**
7 * Bitmap defining the stored key and values. 10 * Bitmap defining the stored key and values.
8 */ 11 */
9 int dataMap; 12 final int dataMap;
10 /** 13 /**
11 * Bitmap defining the positions of further nodes. 14 * Bitmap defining the positions of further nodes.
12 */ 15 */
13 int nodeMap; 16 final int nodeMap;
14 /** 17 /**
15 * Stores Keys, Values, and subnodes. Structure: (KEY,VALUE)*,NODE; NODES are stored backwards. 18 * Stores Keys, Values, and subnodes. Structure: (KEY,VALUE)*,NODE; NODES are stored backwards.
16 */ 19 */
17 Object[] content; 20 final Object[] content;
18 21
19 /** 22 /**
20 * Constructor with given content 23 * Hash code derived from immutable hash code
21 */ 24 */
22 protected ImmutableNode(int dataMap, int nodeMap, Object[] content) { 25 final int precalculatedHash;
26
27 private ImmutableNode(int dataMap, int nodeMap, Object[] content, int precalculatedHash) {
28 super();
23 this.dataMap = dataMap; 29 this.dataMap = dataMap;
24 this.nodeMap = nodeMap; 30 this.nodeMap = nodeMap;
25 this.content = content; 31 this.content = content;
32 this.precalculatedHash = precalculatedHash;
26 } 33 }
27 34
28 /** 35 /**
29 * Constructor that copies a mutable node to an immutable. 36 * Constructor that copies a mutable node to an immutable.
30 * @param node 37 * @param node
31 */ 38 */
32 @SuppressWarnings("unchecked") 39 @SuppressWarnings("unchecked")
33 protected ImmutableNode(MutableNode<KEY,VALUE> node) { 40 static <KEY,VALUE> ImmutableNode<KEY,VALUE> constructImmutable(MutableNode<KEY,VALUE> node, Map<Node<KEY, VALUE>, ImmutableNode<KEY, VALUE>> cache) {
41 // 1. try to return from cache
42 ImmutableNode<KEY, VALUE> cachedResult = cache.get(node);
43 if(cachedResult != null) {
44 // 1.1 Already cached, return from cache.
45 return cachedResult;
46 }
47
48 // 2. otherwise construct a new ImmutableNode
49
50 final int resultHash = node.hashCode();
51
34 int size = 0; 52 int size = 0;
35 for(int i = 0; i<node.content.length; i++) { 53 for(int i = 0; i<node.content.length; i++) {
36 if(node.content[i]!=null) { 54 if(node.content[i]!=null) {
@@ -40,28 +58,30 @@ public class ImmutableNode<KEY, VALUE> extends Node<KEY, VALUE> {
40 58
41 int datas = 0; 59 int datas = 0;
42 int nodes = 0; 60 int nodes = 0;
43 this.dataMap = 0; 61 int resultDataMap = 0;
44 this.nodeMap = 0; 62 int resultNodeMap = 0;
45 this.content = new Object[size]; 63 final Object[] resultContent = new Object[size];
46 int bitposition = 1; 64 int bitposition = 1;
47 for(int i = 0; i<factor; i++) { 65 for(int i = 0; i<factor; i++) {
48 Object key = node.content[i*2]; 66 Object key = node.content[i*2];
49 if(key != null) { 67 if(key != null) {
50 dataMap |= bitposition; 68 resultDataMap |= bitposition;
51 content[datas*2] = key; 69 resultContent[datas*2] = key;
52 content[datas*2+1] = node.content[i*2+1]; 70 resultContent[datas*2+1] = node.content[i*2+1];
53 datas++; 71 datas++;
54 } else { 72 } else {
55 Node<KEY,VALUE> subnode = (Node<KEY, VALUE>) node.content[i*2+1]; 73 Node<KEY,VALUE> subnode = (Node<KEY, VALUE>) node.content[i*2+1];
56 if(subnode != null) { 74 if(subnode != null) {
57 ImmutableNode<KEY, VALUE> immutableSubnode = subnode.toImmutable(); 75 ImmutableNode<KEY, VALUE> immutableSubnode = subnode.toImmutable(cache);
58 nodeMap |=bitposition; 76 resultNodeMap |=bitposition;
59 content[size-1-nodes] = immutableSubnode; 77 resultContent[size-1-nodes] = immutableSubnode;
60 nodes++; 78 nodes++;
61 } 79 }
62 } 80 }
63 bitposition<<=1; 81 bitposition<<=1;
64 } 82 }
83
84 return new ImmutableNode<>(resultDataMap, resultNodeMap, resultContent, resultHash);
65 } 85 }
66 86
67 private int index(int bitmap, int bitpos) { 87 private int index(int bitmap, int bitpos) {
@@ -179,6 +199,12 @@ public class ImmutableNode<KEY, VALUE> extends Node<KEY, VALUE> {
179 return this; 199 return this;
180 } 200 }
181 201
202 @Override
203 public ImmutableNode<KEY, VALUE> toImmutable(
204 Map<Node<KEY, VALUE>, ImmutableNode<KEY, VALUE>> cache) {
205 return this;
206 }
207
182 @SuppressWarnings("unchecked") 208 @SuppressWarnings("unchecked")
183 @Override 209 @Override
184 boolean moveToNext(MapCursor<KEY, VALUE> cursor) { 210 boolean moveToNext(MapCursor<KEY, VALUE> cursor) {
@@ -260,4 +286,67 @@ public class ImmutableNode<KEY, VALUE> extends Node<KEY, VALUE> {
260 nodeMask<<=1; 286 nodeMask<<=1;
261 } 287 }
262 } 288 }
289
290 @Override
291 public int hashCode() {
292 return this.precalculatedHash;
293 }
294
295 @Override
296 public boolean equals(Object obj) {
297 if (this == obj)
298 return true;
299 if (obj == null)
300 return false;
301 if (obj instanceof ImmutableNode<?,?>) {
302 ImmutableNode<?,?> other = (ImmutableNode<?,?>) obj;
303 if (precalculatedHash != other.precalculatedHash)
304 return false;
305 if (dataMap != other.dataMap)
306 return false;
307 if (nodeMap != other.nodeMap)
308 return false;
309 if (!Arrays.deepEquals(content, other.content))
310 return false;
311 return true;
312 } else if(obj instanceof MutableNode<?,?>) {
313 return ImmutableNode.compareImmutableMutable(this, (MutableNode<?, ?>) obj);
314 } else {
315 return false;
316 }
317 }
318 public static boolean compareImmutableMutable(
319 ImmutableNode<?, ?> immutable,
320 MutableNode<?, ?> mutable)
321 {
322 int datas = 0;
323 int nodes = 0;
324 final int immutableLength = immutable.content.length;
325 for(int i = 0; i<factor; i++) {
326 Object key = immutable.content[i*2];
327 if(key != null) {
328 if(datas*2+nodes+2 <= immutableLength) {
329 if( mutable.content[datas*2] != key ||
330 mutable.content[datas*2+1] != immutable.content[i*2+1])
331 {
332 return false;
333 }
334 } else return false;
335 datas++;
336 } else {
337 Node<?,?> mutableSubnode = (Node<?, ?>) mutable.content[i*2+1];
338 if(mutableSubnode != null) {
339 if(datas*2+nodes+1 <= immutableLength) {
340 Node<?,?> immutableSubnode = (Node<?, ?>) immutable.content[immutableLength-1-nodes];
341 if(!mutableSubnode.equals(immutableSubnode)) {
342 return false;
343 }
344 nodes++;
345 }
346 }
347 }
348 }
349 return true;
350 }
351
263} 352}
diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MutableNode.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MutableNode.java
index 0a6386a5..6e177d9f 100644
--- a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MutableNode.java
+++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MutableNode.java
@@ -1,11 +1,17 @@
1package org.eclipse.viatra.solver.data.map.internal; 1package org.eclipse.viatra.solver.data.map.internal;
2 2
3import java.util.Arrays;
4import java.util.Map;
5
3import org.eclipse.viatra.solver.data.map.ContinousHashProvider; 6import org.eclipse.viatra.solver.data.map.ContinousHashProvider;
4 7
5public class MutableNode<KEY,VALUE> extends Node<KEY,VALUE> { 8public class MutableNode<KEY,VALUE> extends Node<KEY,VALUE> {
6 Object[] content; 9 int cachedHash;
10 protected Object[] content;
11
7 protected MutableNode() { 12 protected MutableNode() {
8 this.content = new Object[2*factor]; 13 this.content = new Object[2*factor];
14 updateHash();
9 } 15 }
10 public static <KEY,VALUE> MutableNode<KEY,VALUE> initialize( 16 public static <KEY,VALUE> MutableNode<KEY,VALUE> initialize(
11 KEY key, VALUE value, 17 KEY key, VALUE value,
@@ -24,6 +30,10 @@ public class MutableNode<KEY,VALUE> extends Node<KEY,VALUE> {
24 } 30 }
25 } 31 }
26 32
33 /**
34 * Constructs a {@link MutableNode} as a copy of an {@link ImmutableNode}
35 * @param node
36 */
27 protected MutableNode(ImmutableNode<KEY,VALUE> node) { 37 protected MutableNode(ImmutableNode<KEY,VALUE> node) {
28 this.content = new Object[2*factor]; 38 this.content = new Object[2*factor];
29 int dataUsed=0; 39 int dataUsed=0;
@@ -39,6 +49,7 @@ public class MutableNode<KEY,VALUE> extends Node<KEY,VALUE> {
39 nodeUsed++; 49 nodeUsed++;
40 } 50 }
41 } 51 }
52 updateHash();
42 } 53 }
43 54
44 @SuppressWarnings("unchecked") 55 @SuppressWarnings("unchecked")
@@ -57,7 +68,7 @@ public class MutableNode<KEY,VALUE> extends Node<KEY,VALUE> {
57 if(nodeCandidate != null) { 68 if(nodeCandidate != null) {
58 int newHash = newHash(hashProvider, key, hash, depth); 69 int newHash = newHash(hashProvider, key, hash, depth);
59 int newDepth = depth+1; 70 int newDepth = depth+1;
60 return (VALUE) nodeCandidate.getValue(key, hashProvider, defaultValue, newHash, newDepth); 71 return nodeCandidate.getValue(key, hashProvider, defaultValue, newHash, newDepth);
61 } else { 72 } else {
62 return defaultValue; 73 return defaultValue;
63 } 74 }
@@ -89,6 +100,7 @@ public class MutableNode<KEY,VALUE> extends Node<KEY,VALUE> {
89 100
90 subNode.content[newFragment2*2]=key2; 101 subNode.content[newFragment2*2]=key2;
91 subNode.content[newFragment2*2+1]=value2; 102 subNode.content[newFragment2*2+1]=value2;
103 subNode.updateHash();
92 return subNode; 104 return subNode;
93 } else { 105 } else {
94 MutableNode<KEY,VALUE> subSubNode = createNewNode( 106 MutableNode<KEY,VALUE> subSubNode = createNewNode(
@@ -97,6 +109,7 @@ public class MutableNode<KEY,VALUE> extends Node<KEY,VALUE> {
97 key2, value2, newHash2, 109 key2, value2, newHash2,
98 newdepth+1); 110 newdepth+1);
99 subNode.content[newFragment1*2+1] = subSubNode; 111 subNode.content[newFragment1*2+1] = subSubNode;
112 subNode.updateHash();
100 return subNode; 113 return subNode;
101 } 114 }
102 } 115 }
@@ -112,8 +125,7 @@ public class MutableNode<KEY,VALUE> extends Node<KEY,VALUE> {
112 if(value == defaultValue) { 125 if(value == defaultValue) {
113 return removeEntry(selectedHashFragment); 126 return removeEntry(selectedHashFragment);
114 } else { 127 } else {
115 content[2*selectedHashFragment+1] = value; 128 return updateValue(value,selectedHashFragment);
116 return this;
117 } 129 }
118 } else { 130 } else {
119 if(value == defaultValue) { 131 if(value == defaultValue) {
@@ -134,30 +146,50 @@ public class MutableNode<KEY,VALUE> extends Node<KEY,VALUE> {
134 // dont need to add new key-value pair 146 // dont need to add new key-value pair
135 return this; 147 return this;
136 } else { 148 } else {
137 content[2*selectedHashFragment] = key; 149 return addEntry(key, value, selectedHashFragment);
138 content[2*selectedHashFragment+1] = value;
139 return this;
140 } 150 }
141 151
142 } 152 }
143 } 153 }
144 } 154 }
145 155
156 private Node<KEY, VALUE> addEntry(KEY key, VALUE value, int selectedHashFragment) {
157 content[2*selectedHashFragment] = key;
158 content[2*selectedHashFragment+1] = value;
159 updateHash();
160 return this;
161 }
162 /**
163 * Updates an entry in a selected hash-fragment to a non-default value.
164 * @param value
165 * @param selectedHashFragment
166 * @return
167 */
146 Node<KEY, VALUE> updateValue(VALUE value, int selectedHashFragment) { 168 Node<KEY, VALUE> updateValue(VALUE value, int selectedHashFragment) {
147 content[2*selectedHashFragment+1] = value; 169 content[2*selectedHashFragment+1] = value;
170 updateHash();
148 return this; 171 return this;
149 } 172 }
150 173
174 /**
175 *
176 * @param selectedHashFragment
177 * @param newNode
178 * @return
179 */
151 Node<KEY, VALUE> updateSubNode(int selectedHashFragment, Node<KEY, VALUE> newNode) { 180 Node<KEY, VALUE> updateSubNode(int selectedHashFragment, Node<KEY, VALUE> newNode) {
152 content[2*selectedHashFragment+1] = newNode; 181 content[2*selectedHashFragment+1] = newNode;
153 for(int i = 0; i<this.content.length; i++) { 182 for(int i = 0; i<this.content.length; i++) {
154 if(content[i]!=null) return this; 183 if(content[i]!=null) {
184 updateHash();
185 return this;
186 }
155 } 187 }
156 return null; 188 return null;
157 } 189 }
158 190
159 @SuppressWarnings("unchecked") 191 @SuppressWarnings("unchecked")
160 Node<KEY, VALUE> moveDown( 192 private Node<KEY, VALUE> moveDown(
161 KEY key, VALUE value, 193 KEY key, VALUE value,
162 ContinousHashProvider<? super KEY> hashProvider, int hash, 194 ContinousHashProvider<? super KEY> hashProvider, int hash,
163 int depth, int selectedHashFragment, KEY keyCandidate) { 195 int depth, int selectedHashFragment, KEY keyCandidate) {
@@ -172,6 +204,7 @@ public class MutableNode<KEY,VALUE> extends Node<KEY,VALUE> {
172 204
173 content[2*selectedHashFragment] = null; 205 content[2*selectedHashFragment] = null;
174 content[2*selectedHashFragment+1] = subNode; 206 content[2*selectedHashFragment+1] = subNode;
207 updateHash();
175 return this; 208 return this;
176 } 209 }
177 210
@@ -179,6 +212,7 @@ public class MutableNode<KEY,VALUE> extends Node<KEY,VALUE> {
179 content[2*selectedHashFragment] = null; 212 content[2*selectedHashFragment] = null;
180 content[2*selectedHashFragment+1] = null; 213 content[2*selectedHashFragment+1] = null;
181 if(hasContent()) { 214 if(hasContent()) {
215 updateHash();
182 return this; 216 return this;
183 } else { 217 } else {
184 return null; 218 return null;
@@ -209,7 +243,12 @@ public class MutableNode<KEY,VALUE> extends Node<KEY,VALUE> {
209 243
210 @Override 244 @Override
211 public ImmutableNode<KEY,VALUE> toImmutable() { 245 public ImmutableNode<KEY,VALUE> toImmutable() {
212 return new ImmutableNode<KEY,VALUE>(this); 246 return ImmutableNode.constructImmutable(this,null);
247 }
248
249 @Override
250 public ImmutableNode<KEY, VALUE> toImmutable(Map<Node<KEY, VALUE>, ImmutableNode<KEY, VALUE>> cache) {
251 return ImmutableNode.constructImmutable(this,cache);
213 } 252 }
214 253
215 @SuppressWarnings("unchecked") 254 @SuppressWarnings("unchecked")
@@ -295,4 +334,42 @@ public class MutableNode<KEY,VALUE> extends Node<KEY,VALUE> {
295 } 334 }
296 } 335 }
297 } 336 }
337
338 protected void updateHash() {
339 final int prime = 31;
340 int result = 1;
341 result = prime * result + Arrays.deepHashCode(content);
342 this.cachedHash = result;
343 }
344
345 @Override
346 public int hashCode() {
347 return this.cachedHash;
348 }
349
350 public void checkHashCodeConsistency() {
351 int oldHash = this.hashCode();
352 updateHash();
353 int newHash = this.hashCode();
354 if(oldHash != newHash) {
355 throw new IllegalStateException("Inconsistent hash code!");
356 }
357 }
358
359 @Override
360 public boolean equals(Object obj) {
361 if (this == obj)
362 return true;
363 if (obj == null)
364 return false;
365 if (obj instanceof MutableNode<?, ?>) {
366 MutableNode<?,?> other = (MutableNode<?,?>) obj;
367 return Arrays.deepEquals(this.content, other.content);
368 } else if(obj instanceof ImmutableNode<?,?>) {
369 ImmutableNode<?,?> other = (ImmutableNode<?,?>) obj;
370 return ImmutableNode.compareImmutableMutable(other, this);
371 } else {
372 return false;
373 }
374 }
298} 375}
diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/Node.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/Node.java
index e7be5684..7d547dce 100644
--- a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/Node.java
+++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/Node.java
@@ -1,5 +1,7 @@
1package org.eclipse.viatra.solver.data.map.internal; 1package org.eclipse.viatra.solver.data.map.internal;
2 2
3import java.util.Map;
4
3import org.eclipse.viatra.solver.data.map.ContinousHashProvider; 5import org.eclipse.viatra.solver.data.map.ContinousHashProvider;
4 6
5public abstract class Node<KEY,VALUE>{ 7public abstract class Node<KEY,VALUE>{
@@ -54,6 +56,8 @@ public abstract class Node<KEY,VALUE>{
54 56
55 abstract MutableNode<KEY, VALUE> toMutable(); 57 abstract MutableNode<KEY, VALUE> toMutable();
56 public abstract ImmutableNode<KEY, VALUE> toImmutable(); 58 public abstract ImmutableNode<KEY, VALUE> toImmutable();
59 public abstract ImmutableNode<KEY, VALUE> toImmutable(
60 Map<Node<KEY, VALUE>,ImmutableNode<KEY, VALUE>> cache);
57 61
58 /** 62 /**
59 * Moves a {@link MapCursor} to its next position. 63 * Moves a {@link MapCursor} to its next position.
@@ -62,9 +66,6 @@ public abstract class Node<KEY,VALUE>{
62 */ 66 */
63 abstract boolean moveToNext(MapCursor<KEY,VALUE> cursor); 67 abstract boolean moveToNext(MapCursor<KEY,VALUE> cursor);
64 68
65 ///////// For iterators
66 //abstract boolean moveIteratorToNextData(NodeIterator<KEY,VALUE> iterator, int currentIndex);
67 //abstract boolean moveIteratorToNextNode(NodeIterator<KEY,VALUE> iterator, int currentIndex);
68 ///////// FOR printing 69 ///////// FOR printing
69 abstract public void prettyPrint(StringBuilder builder, int depth, int code); 70 abstract public void prettyPrint(StringBuilder builder, int depth, int code);
70 @Override 71 @Override
@@ -73,4 +74,5 @@ public abstract class Node<KEY,VALUE>{
73 prettyPrint(stringBuilder, 0, -1); 74 prettyPrint(stringBuilder, 0, -1);
74 return stringBuilder.toString(); 75 return stringBuilder.toString();
75 } 76 }
77
76} 78}
diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/VersionedMapImpl.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/VersionedMapImpl.java
index 537da4e1..ad734932 100644
--- a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/VersionedMapImpl.java
+++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/VersionedMapImpl.java
@@ -23,7 +23,6 @@ public class VersionedMapImpl<KEY,VALUE> implements VersionedMap<KEY,VALUE>{
23 protected final VALUE defaultValue; 23 protected final VALUE defaultValue;
24 protected Node<KEY,VALUE> root; 24 protected Node<KEY,VALUE> root;
25 WeakHashMap<MapCursor<KEY, VALUE>, Boolean> iterators; 25 WeakHashMap<MapCursor<KEY, VALUE>, Boolean> iterators;
26 //TODO: protected final iterators
27 26
28 public VersionedMapImpl( 27 public VersionedMapImpl(
29 VersionedMapStoreImpl<KEY,VALUE> store, 28 VersionedMapStoreImpl<KEY,VALUE> store,