aboutsummaryrefslogtreecommitdiffstats
path: root/Solvers
diff options
context:
space:
mode:
authorLibravatar Oszkar Semerath <Oszkar Semerath@DESKTOP-DNR7JQ7>2021-07-26 01:19:35 +0200
committerLibravatar Oszkar Semerath <Oszkar Semerath@DESKTOP-DNR7JQ7>2021-07-26 01:19:35 +0200
commitb6a5cfdf6506051a7723e704c2f2c84dfdedfa8d (patch)
tree0c0b1a8ce4fd363bf02469bd68cd5d1d6ac954e2 /Solvers
parentSmoke test error message update (diff)
downloadVIATRA-Generator-b6a5cfdf6506051a7723e704c2f2c84dfdedfa8d.tar.gz
VIATRA-Generator-b6a5cfdf6506051a7723e704c2f2c84dfdedfa8d.tar.zst
VIATRA-Generator-b6a5cfdf6506051a7723e704c2f2c84dfdedfa8d.zip
VersionedMap interface updates: diffcursors and synchronization
Diffstat (limited to 'Solvers')
-rw-r--r--Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMap.java1
-rw-r--r--Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMapStore.java3
-rw-r--r--Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMapStoreImpl.java58
-rw-r--r--Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/VersionedMapImpl.java31
4 files changed, 60 insertions, 33 deletions
diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMap.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMap.java
index 28264f2f..2754c246 100644
--- a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMap.java
+++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMap.java
@@ -9,4 +9,5 @@ public interface VersionedMap<KEY,VALUE> extends Versioned{
9 public long getSize(); 9 public long getSize();
10 public Iterator<Map.Entry<KEY,VALUE>> getIterator(); 10 public Iterator<Map.Entry<KEY,VALUE>> getIterator();
11 public Cursor<KEY,VALUE> getCursor(); 11 public Cursor<KEY,VALUE> getCursor();
12 public DiffCursor<KEY,VALUE> getDiffCursor(long state);
12} 13}
diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMapStore.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMapStore.java
index 5a54c13b..d92e5ad6 100644
--- a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMapStore.java
+++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMapStore.java
@@ -6,6 +6,5 @@ public interface VersionedMapStore<KEY, VALUE> {
6 6
7 public VersionedMap<KEY, VALUE> createMap(long state) throws IllegalAccessException; 7 public VersionedMap<KEY, VALUE> createMap(long state) throws IllegalAccessException;
8 8
9 // long addState(Node<KEY, VALUE> data); 9 public DiffCursor<KEY,VALUE> getDiffCursor(long fromState, long toState);
10 //public void removeState(long state);
11} \ No newline at end of file 10} \ No newline at end of file
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 0c00108b..b6a615ed 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
@@ -5,6 +5,7 @@ import java.util.Map;
5import java.util.Set; 5import java.util.Set;
6 6
7import org.eclipse.viatra.solver.data.map.internal.ImmutableNode; 7import org.eclipse.viatra.solver.data.map.internal.ImmutableNode;
8import org.eclipse.viatra.solver.data.map.internal.MapDiffCursor;
8import org.eclipse.viatra.solver.data.map.internal.Node; 9import org.eclipse.viatra.solver.data.map.internal.Node;
9import org.eclipse.viatra.solver.data.map.internal.VersionedMapImpl; 10import org.eclipse.viatra.solver.data.map.internal.VersionedMapImpl;
10 11
@@ -25,7 +26,7 @@ public class VersionedMapStoreImpl<KEY,VALUE> implements VersionedMapStore<KEY,
25 nodeCache = new HashMap<>(); 26 nodeCache = new HashMap<>();
26 } 27 }
27 28
28 Set<Long> getStates() { 29 synchronized Set<Long> getStates() {
29 return states.keySet(); 30 return states.keySet();
30 } 31 }
31 32
@@ -34,29 +35,54 @@ public class VersionedMapStoreImpl<KEY,VALUE> implements VersionedMapStore<KEY,
34 return new VersionedMapImpl<KEY,VALUE>(this,hashProvider,defaultValue); 35 return new VersionedMapImpl<KEY,VALUE>(this,hashProvider,defaultValue);
35 } 36 }
36 @Override 37 @Override
37 public VersionedMap<KEY,VALUE> createMap(long state) throws IllegalAccessException { 38 public VersionedMap<KEY,VALUE> createMap(long state) {
38 ImmutableNode<KEY, VALUE> data = getStateData(state); 39 ImmutableNode<KEY, VALUE> data = revert(state);
39 if(data != null) { 40 if(data != null) {
40 return new VersionedMapImpl<KEY,VALUE>(this,hashProvider,defaultValue,data); 41 return new VersionedMapImpl<KEY,VALUE>(this,hashProvider,defaultValue,data);
41 } else { 42 } else {
42 throw new IllegalAccessException("Store does not contain state " + state + "!"); 43 throw new IllegalArgumentException("Store does not contain state " + state + "!");
43 } 44 }
44 } 45 }
45
46 private long getNextID() {
47 if(nextID == Long.MAX_VALUE) throw new IllegalStateException("Map store run out of Id-s");
48 return nextID++;
49 }
50 46
51 public ImmutableNode<KEY,VALUE> getStateData(long state) { 47 synchronized public ImmutableNode<KEY,VALUE> revert(long state) {
52 return states.get(state); 48 return states.get(state);
53 } 49 }
54 public Map<Node<KEY,VALUE>, ImmutableNode<KEY,VALUE>> getStore() { 50 synchronized public long commit(Node<KEY,VALUE> data, VersionedMapImpl<KEY, VALUE> mapToUpdateRoot) {
55 return this.nodeCache; 51 ImmutableNode<KEY,VALUE> immutable;
56 } 52 if(data != null) {
57 public long addState(ImmutableNode<KEY,VALUE> data) { 53 if(this.nodeCache != null) {
58 long id = getNextID(); 54 immutable = data.toImmutable(this.nodeCache);
59 states.put(id,data); 55 } else {
56 immutable = data.toImmutable();
57 }
58 } else {
59 immutable = null;
60 }
61
62
63 if(nextID == Long.MAX_VALUE) throw new IllegalStateException(
64 "Map store run out of Id-s");
65 long id = nextID++;
66 this.states.put(id, immutable);
67 //mapToUpdateRoot.setRoot(immutable);
60 return id; 68 return id;
61 } 69 }
70
71// public Map<Node<KEY,VALUE>, ImmutableNode<KEY,VALUE>> getStore() {
72// return this.nodeCache;
73// }
74// public long addState(ImmutableNode<KEY,VALUE> data) {
75//
76// states.put(id,data);
77// return id;
78// }
79
80 @Override
81 public DiffCursor<KEY, VALUE> getDiffCursor(long fromState, long toState) {
82 VersionedMap<KEY, VALUE> map1 = createMap(fromState);
83 VersionedMap<KEY, VALUE> map2 = createMap(toState);
84 Cursor<KEY, VALUE> cursor1 = map1.getCursor();
85 Cursor<KEY, VALUE> cursor2 = map2.getCursor();
86 return new MapDiffCursor<KEY, VALUE>(this.defaultValue,cursor1,cursor2);
87 }
62} 88}
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 fd5c9b41..4fb8d7f8 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
@@ -5,6 +5,7 @@ import java.util.Map;
5 5
6import org.eclipse.viatra.solver.data.map.ContinousHashProvider; 6import org.eclipse.viatra.solver.data.map.ContinousHashProvider;
7import org.eclipse.viatra.solver.data.map.Cursor; 7import org.eclipse.viatra.solver.data.map.Cursor;
8import org.eclipse.viatra.solver.data.map.DiffCursor;
8import org.eclipse.viatra.solver.data.map.VersionedMap; 9import org.eclipse.viatra.solver.data.map.VersionedMap;
9import org.eclipse.viatra.solver.data.map.VersionedMapStoreImpl; 10import org.eclipse.viatra.solver.data.map.VersionedMapStoreImpl;
10 11
@@ -84,28 +85,27 @@ public class VersionedMapImpl<KEY,VALUE> implements VersionedMap<KEY,VALUE>{
84 MapEntryIterator<KEY,VALUE> cursor = new MapEntryIterator<>(this.root,this); 85 MapEntryIterator<KEY,VALUE> cursor = new MapEntryIterator<>(this.root,this);
85 return cursor; 86 return cursor;
86 } 87 }
88 @Override
89 public DiffCursor<KEY, VALUE> getDiffCursor(long to) {
90 Cursor<KEY, VALUE> fromCursor = this.getCursor();
91 VersionedMap<KEY, VALUE> toMap = this.store.createMap(to);
92 Cursor<KEY, VALUE> toCursor = toMap.getCursor();
93 return new MapDiffCursor<KEY, VALUE>(defaultValue, fromCursor, toCursor);
94
95 }
96
87 97
88 @Override 98 @Override
89 public long commit() { 99 public long commit() {
90 ImmutableNode<KEY,VALUE> immutable; 100 return this.store.commit(root,this);
91 if(this.root != null) { 101 }
92 Map<Node<KEY, VALUE>, ImmutableNode<KEY, VALUE>> cache = this.store.getStore(); 102 public void setRoot(Node<KEY, VALUE> root) {
93 if(cache != null) { 103 this.root = root;
94 immutable = root.toImmutable(cache);
95 } else {
96 immutable = root.toImmutable();
97 }
98
99 } else {
100 immutable = null;
101 }
102 long result = this.store.addState(immutable);
103 return result;
104 } 104 }
105 105
106 @Override 106 @Override
107 public void restore(long state) { 107 public void restore(long state) {
108 root = this.store.getStateData(state); 108 root = this.store.revert(state);
109 } 109 }
110 110
111 @Override 111 @Override
@@ -146,4 +146,5 @@ public class VersionedMapImpl<KEY,VALUE> implements VersionedMap<KEY,VALUE>{
146 this.root.checkIntegrity(hashProvider, defaultValue, 0); 146 this.root.checkIntegrity(hashProvider, defaultValue, 0);
147 } 147 }
148 } 148 }
149
149} 150}