aboutsummaryrefslogtreecommitdiffstats
path: root/model-data/src
diff options
context:
space:
mode:
authorLibravatar OszkarSemerath <semerath@mit.bme.hu>2021-08-09 03:11:04 +0200
committerLibravatar OszkarSemerath <semerath@mit.bme.hu>2021-08-09 03:11:04 +0200
commit9040d9e13223859a9b85746deaddd3ae7a3990f2 (patch)
tree2810dac10603eb5d2f39319d35952b94c6021aba /model-data/src
parentSymbols (diff)
downloadrefinery-9040d9e13223859a9b85746deaddd3ae7a3990f2.tar.gz
refinery-9040d9e13223859a9b85746deaddd3ae7a3990f2.tar.zst
refinery-9040d9e13223859a9b85746deaddd3ae7a3990f2.zip
Initial model version
Diffstat (limited to 'model-data/src')
-rw-r--r--model-data/src/main/java/org/eclipse/viatra/solver/data/model/Model.java60
-rw-r--r--model-data/src/main/java/org/eclipse/viatra/solver/data/model/ModelStore.java14
-rw-r--r--model-data/src/main/java/org/eclipse/viatra/solver/data/model/ModelStoreImpl.java102
3 files changed, 176 insertions, 0 deletions
diff --git a/model-data/src/main/java/org/eclipse/viatra/solver/data/model/Model.java b/model-data/src/main/java/org/eclipse/viatra/solver/data/model/Model.java
new file mode 100644
index 00000000..18fab2bf
--- /dev/null
+++ b/model-data/src/main/java/org/eclipse/viatra/solver/data/model/Model.java
@@ -0,0 +1,60 @@
1package org.eclipse.viatra.solver.data.model;
2
3import java.util.Map;
4import java.util.Set;
5
6import org.eclipse.viatra.solver.data.map.Versioned;
7import org.eclipse.viatra.solver.data.map.VersionedMap;
8import org.eclipse.viatra.solver.data.model.symbols.Symbol;
9
10public class Model implements Versioned {
11 private final ModelStore store;
12 private final Map<Symbol, VersionedMap<Tuple,Object>> maps;
13
14 public Model(ModelStore store, Map<Symbol, VersionedMap<Tuple, Object>> maps) {
15 this.store = store;
16 this.maps = maps;
17 }
18
19 public Set<Symbol> getSymbols() {
20 return store.getSymbols();
21 }
22
23 public Object get(Symbol symbol, int... key) {
24 if (maps.containsKey(symbol)) {
25 if (key.length == symbol.getArity()) {
26 return maps.get(symbol).get(Tuple.of(key));
27 } else {
28 throw new IllegalArgumentException("The arity of symbol " + symbol.getName() + "is " + symbol.getArity()
29 + " and not " + key.length);
30 }
31 } else {
32 throw new IllegalArgumentException("Model does define symbol " + symbol.getName());
33 }
34 }
35
36 public void put(Symbol symbol, Object value, int... key) {
37 if (maps.containsKey(symbol)) {
38 if (key.length == symbol.getArity()) {
39 maps.get(symbol).put(Tuple.of(key),value);
40 } else {
41 throw new IllegalArgumentException("The arity of symbol " + symbol.getName() + "is " + symbol.getArity()
42 + " and not " + key.length);
43 }
44 } else {
45 throw new IllegalArgumentException("Model does define symbol " + symbol.getName());
46 }
47 }
48
49 @Override
50 public long commit() {
51 // TODO Auto-generated method stub
52 return 0;
53 }
54
55 @Override
56 public void restore(long state) {
57 // TODO Auto-generated method stub
58
59 }
60}
diff --git a/model-data/src/main/java/org/eclipse/viatra/solver/data/model/ModelStore.java b/model-data/src/main/java/org/eclipse/viatra/solver/data/model/ModelStore.java
new file mode 100644
index 00000000..53d69dc8
--- /dev/null
+++ b/model-data/src/main/java/org/eclipse/viatra/solver/data/model/ModelStore.java
@@ -0,0 +1,14 @@
1package org.eclipse.viatra.solver.data.model;
2
3import java.util.Set;
4
5import org.eclipse.viatra.solver.data.model.symbols.Symbol;
6
7public interface ModelStore {
8
9 Set<Symbol> getSymbols();
10 Model createModel();
11 Model createModel(long state);
12 Set<Long> getStates();
13
14} \ No newline at end of file
diff --git a/model-data/src/main/java/org/eclipse/viatra/solver/data/model/ModelStoreImpl.java b/model-data/src/main/java/org/eclipse/viatra/solver/data/model/ModelStoreImpl.java
new file mode 100644
index 00000000..81fe40f2
--- /dev/null
+++ b/model-data/src/main/java/org/eclipse/viatra/solver/data/model/ModelStoreImpl.java
@@ -0,0 +1,102 @@
1package org.eclipse.viatra.solver.data.model;
2
3import java.util.Collection;
4import java.util.Comparator;
5import java.util.HashMap;
6import java.util.HashSet;
7import java.util.LinkedList;
8import java.util.List;
9import java.util.Map;
10import java.util.Map.Entry;
11import java.util.Set;
12import java.util.TreeMap;
13
14import org.eclipse.viatra.solver.data.map.VersionedMap;
15import org.eclipse.viatra.solver.data.map.VersionedMapStore;
16import org.eclipse.viatra.solver.data.map.VersionedMapStoreImpl;
17import org.eclipse.viatra.solver.data.model.symbols.IntegerSymbol;
18import org.eclipse.viatra.solver.data.model.symbols.PredicateSymbol;
19import org.eclipse.viatra.solver.data.model.symbols.RealSymbol;
20import org.eclipse.viatra.solver.data.model.symbols.Symbol;
21import org.eclipse.viatra.solver.data.model.values.TruthValue;
22
23public class ModelStoreImpl implements ModelStore {
24
25 private final Map<Symbol, VersionedMapStore<Tuple, Object>> stores;
26 private final Set<Long> states = new HashSet<>();
27
28 public ModelStoreImpl(Set<Symbol> symbols) {
29 stores = initStores(symbols);
30 }
31
32 private Map<Symbol, VersionedMapStore<Tuple, Object>> initStores(Set<Symbol> symbols) {
33 Map<Symbol, VersionedMapStore<Tuple, Object>> result = new TreeMap<>(Symbol.symbolComparator);
34
35 Map<Integer, List<PredicateSymbol>> predicateSymbols = new HashMap<>();
36 Map<Integer, List<IntegerSymbol>> integerSymbols = new HashMap<>();
37 Map<Integer, List<RealSymbol>> realSymbols = new HashMap<>();
38 for (Symbol symbol : symbols) {
39 if (symbol instanceof PredicateSymbol) {
40 ModelStoreImpl.addOrCreate(predicateSymbols, symbol.getArity(), (PredicateSymbol) symbol);
41 } else if (symbol instanceof IntegerSymbol) {
42 ModelStoreImpl.addOrCreate(integerSymbols, symbol.getArity(), (IntegerSymbol) symbol);
43 } else if (symbol instanceof RealSymbol) {
44 ModelStoreImpl.addOrCreate(realSymbols, symbol.getArity(), (RealSymbol) symbol);
45 }
46 }
47
48 initPredicateGroup(result, predicateSymbols.values(),TruthValue.False);
49 initPredicateGroup(result, integerSymbols.values(), null);
50 initPredicateGroup(result, realSymbols.values(), null);
51
52 return result;
53 }
54
55 private <V> void initPredicateGroup(Map<Symbol, VersionedMapStore<Tuple, Object>> result,
56 Collection<? extends List<? extends Symbol>> symbolGroups, V defaultValue) {
57 for (List<? extends Symbol> similarSymbols : symbolGroups) {
58 List<VersionedMapStore<Tuple, Object>> maps = VersionedMapStoreImpl.createSharedVersionedMapStores(
59 similarSymbols.size(), TupleHashProvider.instance, defaultValue);
60 for (int i = 0; i < similarSymbols.size(); i++) {
61 result.put(similarSymbols.get(i), maps.get(i));
62 }
63 }
64 }
65
66 private static <K, V> void addOrCreate(Map<K, List<V>> map, K key, V value) {
67 List<V> list;
68 if (map.containsKey(key)) {
69 list = map.get(key);
70 } else {
71 list = new LinkedList<>();
72 map.put(key, list);
73 }
74 list.add(value);
75 }
76 @Override
77 public Set<Symbol> getSymbols() {
78 return this.stores.keySet();
79 }
80 @Override
81 public Model createModel() {
82 Map<Symbol, VersionedMap<Tuple,Object>> maps = new TreeMap<>(Symbol.symbolComparator);
83 for(Entry<Symbol, VersionedMapStore<Tuple, Object>> entry : this.stores.entrySet()) {
84 maps.put(entry.getKey(),entry.getValue().createMap());
85 }
86 return new Model(this, maps);
87 }
88
89 @Override
90 public synchronized Model createModel(long state) {
91 Map<Symbol, VersionedMap<Tuple,Object>> maps = new TreeMap<>(Symbol.symbolComparator);
92 for(Entry<Symbol, VersionedMapStore<Tuple, Object>> entry : this.stores.entrySet()) {
93 maps.put(entry.getKey(),entry.getValue().createMap(state));
94 }
95 return new Model(this, maps);
96 }
97
98 @Override
99 synchronized public Set<Long> getStates() {
100 return this.states;
101 }
102}