aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/store-reasoning-scope/src/test/java/tools/refinery/store/reasoning/scope/MultiObjectTest.java
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <marussy@mit.bme.hu>2023-09-14 19:29:36 +0200
committerLibravatar GitHub <noreply@github.com>2023-09-14 19:29:36 +0200
commit98ed3b6db5f4e51961a161050cc31c66015116e8 (patch)
tree8bfd6d9bc8d6ed23b9eb0f889dd40b6c24fe8f92 /subprojects/store-reasoning-scope/src/test/java/tools/refinery/store/reasoning/scope/MultiObjectTest.java
parentMerge pull request #38 from nagilooh/design-space-exploration (diff)
parentMerge remote-tracking branch 'upstream/main' into partial-interpretation (diff)
downloadrefinery-98ed3b6db5f4e51961a161050cc31c66015116e8.tar.gz
refinery-98ed3b6db5f4e51961a161050cc31c66015116e8.tar.zst
refinery-98ed3b6db5f4e51961a161050cc31c66015116e8.zip
Merge pull request #39 from kris7t/partial-interpretation
Implement partial interpretation based model generation
Diffstat (limited to 'subprojects/store-reasoning-scope/src/test/java/tools/refinery/store/reasoning/scope/MultiObjectTest.java')
-rw-r--r--subprojects/store-reasoning-scope/src/test/java/tools/refinery/store/reasoning/scope/MultiObjectTest.java206
1 files changed, 206 insertions, 0 deletions
diff --git a/subprojects/store-reasoning-scope/src/test/java/tools/refinery/store/reasoning/scope/MultiObjectTest.java b/subprojects/store-reasoning-scope/src/test/java/tools/refinery/store/reasoning/scope/MultiObjectTest.java
new file mode 100644
index 00000000..0132b3f9
--- /dev/null
+++ b/subprojects/store-reasoning-scope/src/test/java/tools/refinery/store/reasoning/scope/MultiObjectTest.java
@@ -0,0 +1,206 @@
1/*
2 * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.store.reasoning.scope;
7
8import org.junit.jupiter.api.BeforeEach;
9import org.junit.jupiter.api.Test;
10import tools.refinery.store.dse.propagation.PropagationAdapter;
11import tools.refinery.store.dse.propagation.PropagationResult;
12import tools.refinery.store.model.Interpretation;
13import tools.refinery.store.model.Model;
14import tools.refinery.store.model.ModelStore;
15import tools.refinery.store.query.viatra.ViatraModelQueryAdapter;
16import tools.refinery.store.reasoning.ReasoningAdapter;
17import tools.refinery.store.reasoning.ReasoningStoreAdapter;
18import tools.refinery.store.reasoning.representation.PartialRelation;
19import tools.refinery.store.reasoning.seed.ModelSeed;
20import tools.refinery.store.reasoning.translator.PartialRelationTranslator;
21import tools.refinery.store.reasoning.translator.multiobject.MultiObjectTranslator;
22import tools.refinery.store.representation.Symbol;
23import tools.refinery.store.representation.TruthValue;
24import tools.refinery.store.representation.cardinality.CardinalityInterval;
25import tools.refinery.store.representation.cardinality.CardinalityIntervals;
26import tools.refinery.store.tuple.Tuple;
27
28import static org.hamcrest.MatcherAssert.assertThat;
29import static org.hamcrest.Matchers.is;
30import static org.junit.jupiter.api.Assertions.assertThrows;
31
32class MultiObjectTest {
33 private static final PartialRelation person = new PartialRelation("Person", 1);
34
35 private ModelStore store;
36 private ReasoningStoreAdapter reasoningStoreAdapter;
37 private Model model;
38 private Interpretation<CardinalityInterval> countStorage;
39
40 @BeforeEach
41 void beforeEach() {
42 store = ModelStore.builder()
43 .with(ViatraModelQueryAdapter.builder())
44 .with(PropagationAdapter.builder())
45 .with(ReasoningAdapter.builder())
46 .with(new MultiObjectTranslator())
47 .with(PartialRelationTranslator.of(person)
48 .symbol(Symbol.of("Person", 1, TruthValue.class, TruthValue.FALSE)))
49 .with(new ScopePropagator()
50 .scope(person, CardinalityIntervals.between(5, 15)))
51 .build();
52 reasoningStoreAdapter = store.getAdapter(ReasoningStoreAdapter.class);
53 model = null;
54 countStorage = null;
55 }
56
57 @Test
58 void oneMultiObjectSatisfiableTest() {
59 createModel(ModelSeed.builder(4)
60 .seed(MultiObjectTranslator.COUNT_SYMBOL, builder -> builder
61 .reducedValue(CardinalityIntervals.ONE)
62 .put(Tuple.of(0), CardinalityIntervals.SET))
63 .seed(person, builder -> builder.reducedValue(TruthValue.TRUE))
64 .build());
65 assertThat(countStorage.get(Tuple.of(0)), is(CardinalityIntervals.between(2, 12)));
66 }
67
68 @Test
69 void oneMultiObjectExistingBoundSatisfiableTest() {
70 createModel(ModelSeed.builder(4)
71 .seed(MultiObjectTranslator.COUNT_SYMBOL, builder -> builder
72 .reducedValue(CardinalityIntervals.ONE)
73 .put(Tuple.of(0), CardinalityIntervals.between(5, 20)))
74 .seed(person, builder -> builder.reducedValue(TruthValue.TRUE))
75 .build());
76 assertThat(countStorage.get(Tuple.of(0)), is(CardinalityIntervals.between(5, 12)));
77 }
78
79 @Test
80 void oneMultiObjectUnsatisfiableUpperTest() {
81 var seed = ModelSeed.builder(21)
82 .seed(MultiObjectTranslator.COUNT_SYMBOL, builder -> builder
83 .reducedValue(CardinalityIntervals.ONE)
84 .put(Tuple.of(0), CardinalityIntervals.SET))
85 .seed(person, builder -> builder.reducedValue(TruthValue.TRUE))
86 .build();
87 assertThrows(IllegalArgumentException.class, () -> reasoningStoreAdapter.createInitialModel(seed));
88 }
89
90 @Test
91 void noMultiObjectSatisfiableTest() {
92 createModel(ModelSeed.builder(10)
93 .seed(MultiObjectTranslator.COUNT_SYMBOL, builder -> builder.reducedValue(CardinalityIntervals.ONE))
94 .seed(person, builder -> builder.reducedValue(TruthValue.TRUE))
95 .build());
96 assertThat(propagate(), is(PropagationResult.UNCHANGED));
97 }
98
99 @Test
100 void noMultiObjectUnsatisfiableTest() {
101 var seed = ModelSeed.builder(2)
102 .seed(MultiObjectTranslator.COUNT_SYMBOL, builder -> builder.reducedValue(CardinalityIntervals.ONE))
103 .seed(person, builder -> builder.reducedValue(TruthValue.TRUE))
104 .build();
105 assertThrows(IllegalArgumentException.class, () -> reasoningStoreAdapter.createInitialModel(seed));
106 }
107
108 @Test
109 void oneMultiObjectExistingBoundUnsatisfiableLowerTest() {
110 var seed = ModelSeed.builder(4)
111 .seed(MultiObjectTranslator.COUNT_SYMBOL, builder -> builder
112 .reducedValue(CardinalityIntervals.ONE)
113 .put(Tuple.of(0), CardinalityIntervals.atLeast(20)))
114 .seed(person, builder -> builder.reducedValue(TruthValue.TRUE))
115 .build();
116 assertThrows(IllegalArgumentException.class, () -> reasoningStoreAdapter.createInitialModel(seed));
117 }
118
119 @Test
120 void oneMultiObjectExistingBoundUnsatisfiableUpperTest() {
121 var seed = ModelSeed.builder(4)
122 .seed(MultiObjectTranslator.COUNT_SYMBOL, builder -> builder
123 .reducedValue(CardinalityIntervals.ONE)
124 .put(Tuple.of(0), CardinalityIntervals.atMost(1)))
125 .seed(person, builder -> builder.reducedValue(TruthValue.TRUE))
126 .build();
127 assertThrows(IllegalArgumentException.class, () -> reasoningStoreAdapter.createInitialModel(seed));
128 }
129
130 @Test
131 void twoMultiObjectsSatisfiableTest() {
132 createModel(ModelSeed.builder(5)
133 .seed(MultiObjectTranslator.COUNT_SYMBOL, builder -> builder
134 .reducedValue(CardinalityIntervals.ONE)
135 .put(Tuple.of(0), CardinalityIntervals.SET)
136 .put(Tuple.of(1), CardinalityIntervals.SET))
137 .seed(person, builder -> builder.reducedValue(TruthValue.TRUE))
138 .build());
139 assertThat(countStorage.get(Tuple.of(0)), is(CardinalityIntervals.atMost(12)));
140 assertThat(countStorage.get(Tuple.of(1)), is(CardinalityIntervals.atMost(12)));
141 }
142
143 @Test
144 void twoMultiObjectsExistingBoundSatisfiableTest() {
145 createModel(ModelSeed.builder(5)
146 .seed(MultiObjectTranslator.COUNT_SYMBOL, builder -> builder
147 .reducedValue(CardinalityIntervals.ONE)
148 .put(Tuple.of(0), CardinalityIntervals.between(7, 20))
149 .put(Tuple.of(1), CardinalityIntervals.atMost(11)))
150 .seed(person, builder -> builder.reducedValue(TruthValue.TRUE))
151 .build());
152 assertThat(countStorage.get(Tuple.of(0)), is(CardinalityIntervals.between(7, 12)));
153 assertThat(countStorage.get(Tuple.of(1)), is(CardinalityIntervals.atMost(5)));
154 }
155
156 @Test
157 void twoMultiObjectsExistingBoundUnsatisfiableUpperTest() {
158 var seed = ModelSeed.builder(5)
159 .seed(MultiObjectTranslator.COUNT_SYMBOL, builder -> builder
160 .reducedValue(CardinalityIntervals.ONE)
161 .put(Tuple.of(0), CardinalityIntervals.between(7, 20))
162 .put(Tuple.of(1), CardinalityIntervals.exactly(11)))
163 .seed(person, builder -> builder.reducedValue(TruthValue.TRUE))
164 .build();
165 assertThrows(IllegalArgumentException.class, () -> reasoningStoreAdapter.createInitialModel(seed));
166 }
167
168 @Test
169 void twoMultiObjectsExistingBoundUnsatisfiableLowerTest() {
170 var seed = ModelSeed.builder(3)
171 .seed(MultiObjectTranslator.COUNT_SYMBOL, builder -> builder
172 .reducedValue(CardinalityIntervals.ONE)
173 .put(Tuple.of(0), CardinalityIntervals.LONE)
174 .put(Tuple.of(1), CardinalityIntervals.atMost(2)))
175 .seed(person, builder -> builder.reducedValue(TruthValue.TRUE))
176 .build();
177 assertThrows(IllegalArgumentException.class, () -> reasoningStoreAdapter.createInitialModel(seed));
178 }
179
180 @Test
181 void multiToSingleTest() {
182 createModel(ModelSeed.builder(5)
183 .seed(MultiObjectTranslator.COUNT_SYMBOL, builder -> builder
184 .reducedValue(CardinalityIntervals.ONE)
185 .put(Tuple.of(0), CardinalityIntervals.LONE)
186 .put(Tuple.of(1), CardinalityIntervals.SET))
187 .seed(person, builder -> builder.reducedValue(TruthValue.TRUE))
188 .build());
189 assertThat(countStorage.get(Tuple.of(0)), is(CardinalityIntervals.LONE));
190 assertThat(countStorage.get(Tuple.of(1)), is(CardinalityIntervals.between(1, 12)));
191 countStorage.put(Tuple.of(0), CardinalityIntervals.ONE);
192 assertThat(propagate(), is(PropagationResult.PROPAGATED));
193 assertThat(countStorage.get(Tuple.of(1)), is(CardinalityIntervals.between(1, 11)));
194 countStorage.put(Tuple.of(1), CardinalityIntervals.ONE);
195 assertThat(propagate(), is(PropagationResult.UNCHANGED));
196 }
197
198 private void createModel(ModelSeed modelSeed) {
199 model = store.getAdapter(ReasoningStoreAdapter.class).createInitialModel(modelSeed);
200 countStorage = model.getInterpretation(MultiObjectTranslator.COUNT_STORAGE);
201 }
202
203 private PropagationResult propagate() {
204 return model.getAdapter(PropagationAdapter.class).propagate();
205 }
206}