aboutsummaryrefslogtreecommitdiffstats
path: root/store/src/main/java/org/eclipse/viatra/solver/data/model/ModelStoreImpl.java
diff options
context:
space:
mode:
Diffstat (limited to 'store/src/main/java/org/eclipse/viatra/solver/data/model/ModelStoreImpl.java')
-rw-r--r--store/src/main/java/org/eclipse/viatra/solver/data/model/ModelStoreImpl.java121
1 files changed, 0 insertions, 121 deletions
diff --git a/store/src/main/java/org/eclipse/viatra/solver/data/model/ModelStoreImpl.java b/store/src/main/java/org/eclipse/viatra/solver/data/model/ModelStoreImpl.java
deleted file mode 100644
index a97fb27a..00000000
--- a/store/src/main/java/org/eclipse/viatra/solver/data/model/ModelStoreImpl.java
+++ /dev/null
@@ -1,121 +0,0 @@
1package org.eclipse.viatra.solver.data.model;
2
3import java.util.HashMap;
4import java.util.LinkedList;
5import java.util.List;
6import java.util.Map;
7import java.util.Map.Entry;
8import java.util.Set;
9
10import org.eclipse.viatra.solver.data.map.ContinousHashProvider;
11import org.eclipse.viatra.solver.data.map.DiffCursor;
12import org.eclipse.viatra.solver.data.map.VersionedMap;
13import org.eclipse.viatra.solver.data.map.VersionedMapStore;
14import org.eclipse.viatra.solver.data.map.VersionedMapStoreImpl;
15import org.eclipse.viatra.solver.data.model.internal.ModelImpl;
16import org.eclipse.viatra.solver.data.model.internal.SimilarRelationEquivalenceClass;
17import org.eclipse.viatra.solver.data.model.representation.AuxilaryData;
18import org.eclipse.viatra.solver.data.model.representation.DataRepresentation;
19import org.eclipse.viatra.solver.data.model.representation.Relation;
20
21public class ModelStoreImpl implements ModelStore {
22
23 private final Map<DataRepresentation<?, ?>, VersionedMapStore<?, ?>> stores;
24
25 public ModelStoreImpl(Set<DataRepresentation<?, ?>> dataRepresentations) {
26 stores = initStores(dataRepresentations);
27 }
28
29 private Map<DataRepresentation<?, ?>, VersionedMapStore<?, ?>> initStores(
30 Set<DataRepresentation<?, ?>> dataRepresentations) {
31 Map<DataRepresentation<?, ?>, VersionedMapStore<?, ?>> result = new HashMap<>();
32
33 Map<SimilarRelationEquivalenceClass, List<Relation<?>>> symbolRepresentationsPerHashPerArity = new HashMap<>();
34
35 for (DataRepresentation<?, ?> dataRepresentation : dataRepresentations) {
36 if (dataRepresentation instanceof Relation<?> symbolRepresentation) {
37 addOrCreate(symbolRepresentationsPerHashPerArity,
38 new SimilarRelationEquivalenceClass(symbolRepresentation), symbolRepresentation);
39 } else if (dataRepresentation instanceof AuxilaryData<?, ?>) {
40 VersionedMapStoreImpl<?, ?> store = new VersionedMapStoreImpl<>(dataRepresentation.getHashProvider(),
41 dataRepresentation.getDefaultValue());
42 result.put(dataRepresentation, store);
43 } else {
44 throw new UnsupportedOperationException(
45 "Model store does not have strategy to use " + dataRepresentation.getClass() + "!");
46 }
47 }
48 for (List<Relation<?>> symbolGroup : symbolRepresentationsPerHashPerArity.values()) {
49 initRepresentationGroup(result, symbolGroup);
50 }
51
52 return result;
53 }
54
55 private void initRepresentationGroup(Map<DataRepresentation<?, ?>, VersionedMapStore<?, ?>> result,
56 List<Relation<?>> symbolGroup) {
57 final ContinousHashProvider<Tuple> hashProvider = symbolGroup.get(0).getHashProvider();
58 final Object defaultValue = symbolGroup.get(0).getDefaultValue();
59
60 List<VersionedMapStore<Tuple, Object>> maps = VersionedMapStoreImpl
61 .createSharedVersionedMapStores(symbolGroup.size(), hashProvider, defaultValue);
62
63 for (int i = 0; i < symbolGroup.size(); i++) {
64 result.put(symbolGroup.get(i), maps.get(i));
65 }
66 }
67
68 private static <K, V> void addOrCreate(Map<K, List<V>> map, K key, V value) {
69 List<V> list;
70 if (map.containsKey(key)) {
71 list = map.get(key);
72 } else {
73 list = new LinkedList<>();
74 map.put(key, list);
75 }
76 list.add(value);
77 }
78
79 @Override
80 public Set<DataRepresentation<?, ?>> getDataRepresentations() {
81 return this.stores.keySet();
82 }
83
84 @Override
85 public ModelImpl createModel() {
86 Map<DataRepresentation<?, ?>, VersionedMap<?, ?>> maps = new HashMap<>();
87 for (Entry<DataRepresentation<?, ?>, VersionedMapStore<?, ?>> entry : this.stores.entrySet()) {
88 maps.put(entry.getKey(), entry.getValue().createMap());
89 }
90 return new ModelImpl(this, maps);
91 }
92
93 @Override
94 public synchronized ModelImpl createModel(long state) {
95 Map<DataRepresentation<?, ?>, VersionedMap<?, ?>> maps = new HashMap<>();
96 for (Entry<DataRepresentation<?, ?>, VersionedMapStore<?, ?>> entry : this.stores.entrySet()) {
97 maps.put(entry.getKey(), entry.getValue().createMap(state));
98 }
99 return new ModelImpl(this, maps);
100 }
101
102 @Override
103 public synchronized Set<Long> getStates() {
104 var iterator = stores.values().iterator();
105 if (iterator.hasNext()) {
106 return Set.copyOf(iterator.next().getStates());
107 }
108 return Set.of(0l);
109 }
110
111 @Override
112 public synchronized ModelDiffCursor getDiffCursor(long from, long to) {
113 Map<DataRepresentation<?, ?>, DiffCursor<?, ?>> diffcursors = new HashMap<>();
114 for (Entry<DataRepresentation<?, ?>, VersionedMapStore<?, ?>> entry : stores.entrySet()) {
115 DataRepresentation<?, ?> representation = entry.getKey();
116 DiffCursor<?, ?> diffCursor = entry.getValue().getDiffCursor(from, to);
117 diffcursors.put(representation, diffCursor);
118 }
119 return new ModelDiffCursor(diffcursors);
120 }
121}