diff options
author | Oszkar Semerath <Oszkar Semerath@DESKTOP-DNR7JQ7> | 2021-07-26 01:19:35 +0200 |
---|---|---|
committer | Oszkar Semerath <Oszkar Semerath@DESKTOP-DNR7JQ7> | 2021-07-26 01:19:35 +0200 |
commit | b6a5cfdf6506051a7723e704c2f2c84dfdedfa8d (patch) | |
tree | 0c0b1a8ce4fd363bf02469bd68cd5d1d6ac954e2 /Solvers | |
parent | Smoke test error message update (diff) | |
download | VIATRA-Generator-b6a5cfdf6506051a7723e704c2f2c84dfdedfa8d.tar.gz VIATRA-Generator-b6a5cfdf6506051a7723e704c2f2c84dfdedfa8d.tar.zst VIATRA-Generator-b6a5cfdf6506051a7723e704c2f2c84dfdedfa8d.zip |
VersionedMap interface updates: diffcursors and synchronization
Diffstat (limited to 'Solvers')
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; | |||
5 | import java.util.Set; | 5 | import java.util.Set; |
6 | 6 | ||
7 | import org.eclipse.viatra.solver.data.map.internal.ImmutableNode; | 7 | import org.eclipse.viatra.solver.data.map.internal.ImmutableNode; |
8 | import org.eclipse.viatra.solver.data.map.internal.MapDiffCursor; | ||
8 | import org.eclipse.viatra.solver.data.map.internal.Node; | 9 | import org.eclipse.viatra.solver.data.map.internal.Node; |
9 | import org.eclipse.viatra.solver.data.map.internal.VersionedMapImpl; | 10 | import 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 | ||
6 | import org.eclipse.viatra.solver.data.map.ContinousHashProvider; | 6 | import org.eclipse.viatra.solver.data.map.ContinousHashProvider; |
7 | import org.eclipse.viatra.solver.data.map.Cursor; | 7 | import org.eclipse.viatra.solver.data.map.Cursor; |
8 | import org.eclipse.viatra.solver.data.map.DiffCursor; | ||
8 | import org.eclipse.viatra.solver.data.map.VersionedMap; | 9 | import org.eclipse.viatra.solver.data.map.VersionedMap; |
9 | import org.eclipse.viatra.solver.data.map.VersionedMapStoreImpl; | 10 | import 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 | } |