diff options
author | OszkarSemerath <semerath@mit.bme.hu> | 2021-08-09 03:11:04 +0200 |
---|---|---|
committer | OszkarSemerath <semerath@mit.bme.hu> | 2021-08-09 03:11:04 +0200 |
commit | 9040d9e13223859a9b85746deaddd3ae7a3990f2 (patch) | |
tree | 2810dac10603eb5d2f39319d35952b94c6021aba /model-data/src/main/java | |
parent | Symbols (diff) | |
download | refinery-9040d9e13223859a9b85746deaddd3ae7a3990f2.tar.gz refinery-9040d9e13223859a9b85746deaddd3ae7a3990f2.tar.zst refinery-9040d9e13223859a9b85746deaddd3ae7a3990f2.zip |
Initial model version
Diffstat (limited to 'model-data/src/main/java')
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 @@ | |||
1 | package org.eclipse.viatra.solver.data.model; | ||
2 | |||
3 | import java.util.Map; | ||
4 | import java.util.Set; | ||
5 | |||
6 | import org.eclipse.viatra.solver.data.map.Versioned; | ||
7 | import org.eclipse.viatra.solver.data.map.VersionedMap; | ||
8 | import org.eclipse.viatra.solver.data.model.symbols.Symbol; | ||
9 | |||
10 | public 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 @@ | |||
1 | package org.eclipse.viatra.solver.data.model; | ||
2 | |||
3 | import java.util.Set; | ||
4 | |||
5 | import org.eclipse.viatra.solver.data.model.symbols.Symbol; | ||
6 | |||
7 | public 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 @@ | |||
1 | package org.eclipse.viatra.solver.data.model; | ||
2 | |||
3 | import java.util.Collection; | ||
4 | import java.util.Comparator; | ||
5 | import java.util.HashMap; | ||
6 | import java.util.HashSet; | ||
7 | import java.util.LinkedList; | ||
8 | import java.util.List; | ||
9 | import java.util.Map; | ||
10 | import java.util.Map.Entry; | ||
11 | import java.util.Set; | ||
12 | import java.util.TreeMap; | ||
13 | |||
14 | import org.eclipse.viatra.solver.data.map.VersionedMap; | ||
15 | import org.eclipse.viatra.solver.data.map.VersionedMapStore; | ||
16 | import org.eclipse.viatra.solver.data.map.VersionedMapStoreImpl; | ||
17 | import org.eclipse.viatra.solver.data.model.symbols.IntegerSymbol; | ||
18 | import org.eclipse.viatra.solver.data.model.symbols.PredicateSymbol; | ||
19 | import org.eclipse.viatra.solver.data.model.symbols.RealSymbol; | ||
20 | import org.eclipse.viatra.solver.data.model.symbols.Symbol; | ||
21 | import org.eclipse.viatra.solver.data.model.values.TruthValue; | ||
22 | |||
23 | public 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 | } | ||