aboutsummaryrefslogtreecommitdiffstats
path: root/Solvers
diff options
context:
space:
mode:
authorLibravatar Oszkar Semerath <Oszkar Semerath@DESKTOP-DNR7JQ7>2021-07-15 13:37:53 +0200
committerLibravatar Oszkar Semerath <Oszkar Semerath@DESKTOP-DNR7JQ7>2021-07-15 13:37:53 +0200
commite37581c6ee08aeca46e1adff9f637314019ace82 (patch)
tree1ff347bd43fbf78fb7ecfd298982d2fb431b49ee /Solvers
parenthashcode fix (diff)
downloadVIATRA-Generator-e37581c6ee08aeca46e1adff9f637314019ace82.tar.gz
VIATRA-Generator-e37581c6ee08aeca46e1adff9f637314019ace82.tar.zst
VIATRA-Generator-e37581c6ee08aeca46e1adff9f637314019ace82.zip
Merging immutable nodes during commits.
Diffstat (limited to 'Solvers')
-rw-r--r--Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMapStoreImpl.java21
-rw-r--r--Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MapCursor.java20
-rw-r--r--Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MapEntryIterator.java7
-rw-r--r--Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/VersionedMapImpl.java46
-rw-r--r--Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/tests/org/eclipse/viatra/solver/data/map/SmokeTest1Mutable.java2
-rw-r--r--Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/tests/org/eclipse/viatra/solver/data/map/SmokeTest2Commit.java70
6 files changed, 114 insertions, 52 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 d115833e..0c00108b 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,7 +3,6 @@ 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;
7 6
8import org.eclipse.viatra.solver.data.map.internal.ImmutableNode; 7import 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.Node;
@@ -13,8 +12,8 @@ public class VersionedMapStoreImpl<KEY,VALUE> implements VersionedMapStore<KEY,
13 protected final ContinousHashProvider<? super KEY> hashProvider; 12 protected final ContinousHashProvider<? super KEY> hashProvider;
14 protected final VALUE defaultValue; 13 protected final VALUE defaultValue;
15 14
16 protected Map<Long, ImmutableNode<KEY,VALUE>> states; 15 final protected Map<Long, ImmutableNode<KEY,VALUE>> states;
17 protected WeakHashMap<Node<KEY,VALUE>, ImmutableNode<KEY,VALUE>> nodeCache; 16 final protected Map<Node<KEY,VALUE>, ImmutableNode<KEY,VALUE>> nodeCache;
18 protected long nextID; 17 protected long nextID;
19 18
20 public VersionedMapStoreImpl(ContinousHashProvider<? super KEY> hashProvider, VALUE defaultValue) { 19 public VersionedMapStoreImpl(ContinousHashProvider<? super KEY> hashProvider, VALUE defaultValue) {
@@ -23,6 +22,7 @@ public class VersionedMapStoreImpl<KEY,VALUE> implements VersionedMapStore<KEY,
23 22
24 states = new HashMap<>(); 23 states = new HashMap<>();
25 nextID = 0; 24 nextID = 0;
25 nodeCache = new HashMap<>();
26 } 26 }
27 27
28 Set<Long> getStates() { 28 Set<Long> getStates() {
@@ -42,22 +42,21 @@ public class VersionedMapStoreImpl<KEY,VALUE> implements VersionedMapStore<KEY,
42 throw new IllegalAccessException("Store does not contain state " + state + "!"); 42 throw new IllegalAccessException("Store does not contain state " + state + "!");
43 } 43 }
44 } 44 }
45 private ImmutableNode<KEY,VALUE> getStateData(long state) {
46 return states.get(state);
47 }
48 45
49 private long getNextID() { 46 private long getNextID() {
50 if(nextID == Long.MAX_VALUE) throw new IllegalStateException("Map store run out of Id-s"); 47 if(nextID == Long.MAX_VALUE) throw new IllegalStateException("Map store run out of Id-s");
51 return nextID++; 48 return nextID++;
52 } 49 }
50
51 public ImmutableNode<KEY,VALUE> getStateData(long state) {
52 return states.get(state);
53 }
54 public Map<Node<KEY,VALUE>, ImmutableNode<KEY,VALUE>> getStore() {
55 return this.nodeCache;
56 }
53 public long addState(ImmutableNode<KEY,VALUE> data) { 57 public long addState(ImmutableNode<KEY,VALUE> data) {
54 long id = getNextID(); 58 long id = getNextID();
55 states.put(id,data); 59 states.put(id,data);
56 return id; 60 return id;
57 } 61 }
58// public void removeState(long state) {
59// if(states.containsKey(state)) {
60// this.states.remove(state);
61// }
62// }
63} 62}
diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MapCursor.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MapCursor.java
index d658e9d8..e77d073f 100644
--- a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MapCursor.java
+++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MapCursor.java
@@ -5,6 +5,7 @@ import java.util.ConcurrentModificationException;
5import java.util.Deque; 5import java.util.Deque;
6 6
7import org.eclipse.viatra.solver.data.map.Cursor; 7import org.eclipse.viatra.solver.data.map.Cursor;
8import org.eclipse.viatra.solver.data.map.VersionedMap;
8 9
9public class MapCursor<KEY,VALUE> implements Cursor<KEY,VALUE> { 10public class MapCursor<KEY,VALUE> implements Cursor<KEY,VALUE> {
10 // Constants 11 // Constants
@@ -20,13 +21,11 @@ public class MapCursor<KEY,VALUE> implements Cursor<KEY,VALUE> {
20 KEY key; 21 KEY key;
21 VALUE value; 22 VALUE value;
22 23
23 // State 24 // Hash code for checking concurrent modifications
24 /** 25 final VersionedMap<KEY,VALUE> map;
25 * Dirty bit for Conc 26 final int creationHash;
26 */
27 boolean dirty;
28 27
29 public MapCursor(Node<KEY, VALUE> root) { 28 public MapCursor(Node<KEY, VALUE> root, VersionedMap<KEY,VALUE> map) {
30 // Initializing tree stack 29 // Initializing tree stack
31 super(); 30 super();
32 this.nodeStack = new ArrayDeque<>(); 31 this.nodeStack = new ArrayDeque<>();
@@ -42,7 +41,8 @@ public class MapCursor<KEY,VALUE> implements Cursor<KEY,VALUE> {
42 this.value = null; 41 this.value = null;
43 42
44 // Initializing state 43 // Initializing state
45 this.dirty = false; 44 this.map=map;
45 this.creationHash = map.hashCode();
46 46
47 // move to first 47 // move to first
48 move(); 48 move();
@@ -61,7 +61,7 @@ public class MapCursor<KEY,VALUE> implements Cursor<KEY,VALUE> {
61 } 61 }
62 62
63 public boolean move() { 63 public boolean move() {
64 if(dirty) { 64 if(isDirty()) {
65 throw new ConcurrentModificationException(); 65 throw new ConcurrentModificationException();
66 } 66 }
67 if(!isTerminated()) { 67 if(!isTerminated()) {
@@ -71,7 +71,7 @@ public class MapCursor<KEY,VALUE> implements Cursor<KEY,VALUE> {
71 } 71 }
72 } 72 }
73 73
74 public void setDirty() { 74 public boolean isDirty() {
75 this.dirty = true; 75 return this.map.hashCode() != this.creationHash;
76 } 76 }
77} 77}
diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MapEntryIterator.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MapEntryIterator.java
index 47976b46..e471af31 100644
--- a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MapEntryIterator.java
+++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MapEntryIterator.java
@@ -6,6 +6,8 @@ import java.util.Map;
6import java.util.Map.Entry; 6import java.util.Map.Entry;
7import java.util.NoSuchElementException; 7import java.util.NoSuchElementException;
8 8
9import org.eclipse.viatra.solver.data.map.VersionedMap;
10
9/** 11/**
10 * Preorder iterator for map {@link #Node}s. 12 * Preorder iterator for map {@link #Node}s.
11 * 13 *
@@ -16,9 +18,8 @@ import java.util.NoSuchElementException;
16 */ 18 */
17public class MapEntryIterator<KEY,VALUE> extends MapCursor<KEY, VALUE> implements Iterator<Map.Entry<KEY,VALUE>>{ 19public class MapEntryIterator<KEY,VALUE> extends MapCursor<KEY, VALUE> implements Iterator<Map.Entry<KEY,VALUE>>{
18 20
19 21 public MapEntryIterator(Node<KEY, VALUE> root, VersionedMap<KEY,VALUE> map) {
20 public MapEntryIterator(Node<KEY, VALUE> root) { 22 super(root,map);
21 super(root);
22 23
23 } 24 }
24 25
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 ad734932..e32fa94b 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
@@ -22,7 +22,6 @@ public class VersionedMapImpl<KEY,VALUE> implements VersionedMap<KEY,VALUE>{
22 protected final ContinousHashProvider<? super KEY> hashProvider; 22 protected final ContinousHashProvider<? super KEY> hashProvider;
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;
26 25
27 public VersionedMapImpl( 26 public VersionedMapImpl(
28 VersionedMapStoreImpl<KEY,VALUE> store, 27 VersionedMapStoreImpl<KEY,VALUE> store,
@@ -33,7 +32,6 @@ public class VersionedMapImpl<KEY,VALUE> implements VersionedMap<KEY,VALUE>{
33 this.hashProvider = hashProvider; 32 this.hashProvider = hashProvider;
34 this.defaultValue = defaultValue; 33 this.defaultValue = defaultValue;
35 this.root = null; 34 this.root = null;
36 iterators = new WeakHashMap<>();
37 } 35 }
38 public VersionedMapImpl( 36 public VersionedMapImpl(
39 VersionedMapStoreImpl<KEY,VALUE> store, 37 VersionedMapStoreImpl<KEY,VALUE> store,
@@ -44,7 +42,6 @@ public class VersionedMapImpl<KEY,VALUE> implements VersionedMap<KEY,VALUE>{
44 this.hashProvider = hashProvider; 42 this.hashProvider = hashProvider;
45 this.defaultValue = defaultValue; 43 this.defaultValue = defaultValue;
46 this.root = data; 44 this.root = data;
47 iterators = new WeakHashMap<>();
48 } 45 }
49 46
50 public VALUE getDefaultValue() { 47 public VALUE getDefaultValue() {
@@ -55,9 +52,6 @@ public class VersionedMapImpl<KEY,VALUE> implements VersionedMap<KEY,VALUE>{
55 } 52 }
56 @Override 53 @Override
57 public void put(KEY key, VALUE value) { 54 public void put(KEY key, VALUE value) {
58 for(MapCursor<KEY, VALUE> iterator : iterators.keySet()) {
59 iterator.setDirty();
60 }
61 if(root!=null) { 55 if(root!=null) {
62 root = root.putValue(key, value, hashProvider, defaultValue, hashProvider.getHash(key, 0), 0); 56 root = root.putValue(key, value, hashProvider, defaultValue, hashProvider.getHash(key, 0), 0);
63 } else { 57 } else {
@@ -83,14 +77,12 @@ public class VersionedMapImpl<KEY,VALUE> implements VersionedMap<KEY,VALUE>{
83 @Override 77 @Override
84 public 78 public
85 Iterator<Map.Entry<KEY,VALUE>> getIterator() { 79 Iterator<Map.Entry<KEY,VALUE>> getIterator() {
86 MapEntryIterator<KEY,VALUE> iterator = new MapEntryIterator<>(this.root); 80 MapEntryIterator<KEY,VALUE> iterator = new MapEntryIterator<>(this.root,this);
87 iterators.put(iterator, null);
88 return iterator; 81 return iterator;
89 } 82 }
90 @Override 83 @Override
91 public Cursor<KEY, VALUE> getCursor() { 84 public Cursor<KEY, VALUE> getCursor() {
92 MapEntryIterator<KEY,VALUE> cursor = new MapEntryIterator<>(this.root); 85 MapEntryIterator<KEY,VALUE> cursor = new MapEntryIterator<>(this.root,this);
93 iterators.put(cursor, null);
94 return cursor; 86 return cursor;
95 } 87 }
96 88
@@ -98,7 +90,13 @@ public class VersionedMapImpl<KEY,VALUE> implements VersionedMap<KEY,VALUE>{
98 public long commit() { 90 public long commit() {
99 ImmutableNode<KEY,VALUE> immutable; 91 ImmutableNode<KEY,VALUE> immutable;
100 if(this.root != null) { 92 if(this.root != null) {
101 immutable = root.toImmutable(); 93 Map<Node<KEY, VALUE>, ImmutableNode<KEY, VALUE>> cache = this.store.getStore();
94 if(cache != null) {
95 immutable = root.toImmutable(cache);
96 } else {
97 immutable = root.toImmutable();
98 }
99
102 } else { 100 } else {
103 immutable = null; 101 immutable = null;
104 } 102 }
@@ -108,9 +106,33 @@ public class VersionedMapImpl<KEY,VALUE> implements VersionedMap<KEY,VALUE>{
108 106
109 @Override 107 @Override
110 public void restore(long state) { 108 public void restore(long state) {
111 // TODO Auto-generated method stub 109 root = this.store.getStateData(state);
112 } 110 }
113 111
112 @Override
113 public int hashCode() {
114 final int prime = 31;
115 int result = 1;
116 result = prime * result + ((root == null) ? 0 : root.hashCode());
117 return result;
118 }
119
120 @Override
121 public boolean equals(Object obj) {
122 if (this == obj)
123 return true;
124 if (obj == null)
125 return false;
126 if (getClass() != obj.getClass())
127 return false;
128 VersionedMapImpl<?,?> other = (VersionedMapImpl<?,?>) obj;
129 if (root == null) {
130 if (other.root != null)
131 return false;
132 } else if (!root.equals(other.root))
133 return false;
134 return true;
135 }
114 public void prettyPrint() { 136 public void prettyPrint() {
115 StringBuilder s = new StringBuilder(); 137 StringBuilder s = new StringBuilder();
116 if(this.root != null) { 138 if(this.root != null) {
diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/tests/org/eclipse/viatra/solver/data/map/SmokeTest1Mutable.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/tests/org/eclipse/viatra/solver/data/map/SmokeTest1Mutable.java
index 9b08a7bc..76d40e3c 100644
--- a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/tests/org/eclipse/viatra/solver/data/map/SmokeTest1Mutable.java
+++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/tests/org/eclipse/viatra/solver/data/map/SmokeTest1Mutable.java
@@ -112,6 +112,8 @@ public class SmokeTest1Mutable {
112 } 112 }
113 @Test 113 @Test
114 void SmokeLarge() { 114 void SmokeLarge() {
115 var milis = System.currentTimeMillis();
115 runSmokeTest("SmokeLarge",0, 32*32*32*32, 32*32-1, 2); 116 runSmokeTest("SmokeLarge",0, 32*32*32*32, 32*32-1, 2);
117 System.out.println(System.currentTimeMillis()-milis);
116 } 118 }
117} 119}
diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/tests/org/eclipse/viatra/solver/data/map/SmokeTest2Commit.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/tests/org/eclipse/viatra/solver/data/map/SmokeTest2Commit.java
index 8be9adb6..337725a6 100644
--- a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/tests/org/eclipse/viatra/solver/data/map/SmokeTest2Commit.java
+++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/tests/org/eclipse/viatra/solver/data/map/SmokeTest2Commit.java
@@ -90,30 +90,58 @@ public class SmokeTest2Commit {
90 } 90 }
91 } 91 }
92 92
93 // Mini smoke frequent commints
93 @Test 94 @Test
94 void MiniSmokeK3V2v1() { 95 void MiniSmokeFrequentK3V2v1() {
95 runSmokeTest("MiniSmokeK3V2v1",0, 1000, 3, 2, 10); 96 runSmokeTest("MiniSmokeK3V2v1",0, 1000, 3, 2, 1);
96 } 97 }
97 @Test 98 @Test
98 void MiniSmokeK3V2v2() { 99 void MiniSmokeFrequentK3V2v2() {
99 runSmokeTest("MiniSmokeK3V2v2",1, 1000, 3, 2, 10); 100 runSmokeTest("MiniSmokeK3V2v2",1, 1000, 3, 2, 1);
100 } 101 }
101 @Test 102 @Test
102 void MiniSmokeK3V2v3() { 103 void MiniSmokeFrequentK3V2v3() {
103 runSmokeTest("MiniSmokeK3V2v3",3, 1000, 3, 2, 10); 104 runSmokeTest("MiniSmokeK3V2v3",3, 1000, 3, 2, 1);
104 } 105 }
105 @Test 106 @Test
106 void MiniSmokeK3V3v1() { 107 void MiniSmokeFrequentK3V3v1() {
107 runSmokeTest("MiniSmokeK3V2v1",0, 1000, 3, 3, 10); 108 runSmokeTest("MiniSmokeK3V2v1",0, 1000, 3, 3, 1);
108 } 109 }
109 @Test 110 @Test
110 void MiniSmokeK3V3v2() { 111 void MiniSmokeFrequentK3V3v2() {
111 runSmokeTest("MiniSmokeK3V2v2",1, 1000, 3, 3, 10); 112 runSmokeTest("MiniSmokeK3V2v2",1, 1000, 3, 3, 1);
112 } 113 }
113 @Test 114 @Test
114 void MiniSmokeK3V3v3() { 115 void MiniSmokeFrequentK3V3v3() {
115 runSmokeTest("MiniSmokeK3V2v3",3, 1000, 3, 3, 10); 116 runSmokeTest("MiniSmokeK3V2v3",3, 1000, 3, 3, 1);
116 } 117 }
118 // Mini smoke rare commits
119 @Test
120 void MiniSmokeRareK3V2v1() {
121 runSmokeTest("MiniSmokeK3V2v1",0, 1000, 3, 2, 100);
122 }
123 @Test
124 void MiniSmokeRareK3V2v2() {
125 runSmokeTest("MiniSmokeK3V2v2",1, 1000, 3, 2, 100);
126 }
127 @Test
128 void MiniSmokeKRare3V2v3() {
129 runSmokeTest("MiniSmokeK3V2v3",3, 1000, 3, 2, 100);
130 }
131 @Test
132 void MiniSmokeRareK3V3v1() {
133 runSmokeTest("MiniSmokeK3V2v1",0, 1000, 3, 3, 100);
134 }
135 @Test
136 void MiniSmokeRareK3V3v2() {
137 runSmokeTest("MiniSmokeK3V2v2",1, 1000, 3, 3, 100);
138 }
139 @Test
140 void MiniSmokeRareK3V3v3() {
141 runSmokeTest("MiniSmokeK3V2v3",3, 1000, 3, 3, 100);
142 }
143
144 // Medium smoke
117 @Test 145 @Test
118 void MediumSmokeK3V2v1() { 146 void MediumSmokeK3V2v1() {
119 runSmokeTest("MediumSmokeK3V2v1",1, 1000, 32, 2, 10); 147 runSmokeTest("MediumSmokeK3V2v1",1, 1000, 32, 2, 10);
@@ -126,8 +154,18 @@ public class SmokeTest2Commit {
126 void MediumSmokeK3V2v3() { 154 void MediumSmokeK3V2v3() {
127 runSmokeTest("MediumSmokeK3V2v3",3, 1000, 32, 2, 10); 155 runSmokeTest("MediumSmokeK3V2v3",3, 1000, 32, 2, 10);
128 } 156 }
129// @Test 157
130// void SmokeLarge() { 158 //Large Smoke
131// runSmokeTest("SmokeLarge",0, 32*32*32*32, 32*32-1, 2); 159 @Test
132// } 160 void SmokeLargeRareCommit() {
161 runSmokeTest("SmokeLarge",0, 32*32*32*32, 32*32-1, 2, 100);
162 }
163 @Test
164 void SmokeLargeNormalCommit() {
165 runSmokeTest("SmokeLarge",0, 32*32*32*32, 32*32-1, 2, 10);
166 }
167 @Test
168 void SmokeLargeFrequentCommit() {
169 runSmokeTest("SmokeLarge",0, 32*32*32*32, 32*32-1, 2, 1);
170 }
133} 171}