aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2024-04-26 20:48:40 +0200
committerLibravatar Kristóf Marussy <kristof@marussy.com>2024-04-26 20:49:24 +0200
commitb5085fa78147559d1999e5c2fb3d17b6fa74d5bf (patch)
treed8707f37f4bd00edea9aa20f1cf4e4571122bc01 /subprojects
parentMerge pull request #58 from graphs4value/docs (diff)
downloadrefinery-b5085fa78147559d1999e5c2fb3d17b6fa74d5bf.tar.gz
refinery-b5085fa78147559d1999e5c2fb3d17b6fa74d5bf.tar.zst
refinery-b5085fa78147559d1999e5c2fb3d17b6fa74d5bf.zip
fix(reasoning): default assertions for containment references
Diffstat (limited to 'subprojects')
-rw-r--r--subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainmentLinkRefiner.java2
-rw-r--r--subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/containment/DefaultContainmentTest.java106
2 files changed, 107 insertions, 1 deletions
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainmentLinkRefiner.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainmentLinkRefiner.java
index e83c33ac..adbea26b 100644
--- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainmentLinkRefiner.java
+++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainmentLinkRefiner.java
@@ -116,7 +116,7 @@ class ContainmentLinkRefiner extends AbstractPartialInterpretationRefiner<TruthV
116 this.sourceType = sourceType; 116 this.sourceType = sourceType;
117 this.targetType = targetType; 117 this.targetType = targetType;
118 trueLink = new InferredContainment(TruthValue.TRUE, Set.of(linkType), Set.of()); 118 trueLink = new InferredContainment(TruthValue.TRUE, Set.of(linkType), Set.of());
119 falseLinkUnknownContains = new InferredContainment(TruthValue.FALSE, Set.of(), Set.of(linkType)); 119 falseLinkUnknownContains = new InferredContainment(TruthValue.UNKNOWN, Set.of(), Set.of(linkType));
120 } 120 }
121 121
122 @Override 122 @Override
diff --git a/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/containment/DefaultContainmentTest.java b/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/containment/DefaultContainmentTest.java
new file mode 100644
index 00000000..e80f9744
--- /dev/null
+++ b/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/containment/DefaultContainmentTest.java
@@ -0,0 +1,106 @@
1/*
2 * SPDX-FileCopyrightText: 2024 The Refinery Authors <https://refinery.tools/>
3 *
4 * SPDX-License-Identifier: EPL-2.0
5 */
6package tools.refinery.store.reasoning.translator.containment;
7
8import org.jetbrains.annotations.NotNull;
9import org.junit.jupiter.params.ParameterizedTest;
10import org.junit.jupiter.params.provider.ValueSource;
11import tools.refinery.logic.term.cardinalityinterval.CardinalityIntervals;
12import tools.refinery.logic.term.truthvalue.TruthValue;
13import tools.refinery.store.model.ModelStore;
14import tools.refinery.store.query.interpreter.QueryInterpreterAdapter;
15import tools.refinery.store.reasoning.ReasoningAdapter;
16import tools.refinery.store.reasoning.ReasoningStoreAdapter;
17import tools.refinery.store.reasoning.literal.Concreteness;
18import tools.refinery.store.reasoning.representation.PartialRelation;
19import tools.refinery.store.reasoning.seed.ModelSeed;
20import tools.refinery.store.reasoning.translator.multiobject.MultiObjectTranslator;
21import tools.refinery.store.reasoning.translator.multiplicity.UnconstrainedMultiplicity;
22import tools.refinery.store.reasoning.translator.typehierarchy.TypeHierarchy;
23import tools.refinery.store.reasoning.translator.typehierarchy.TypeHierarchyTranslator;
24import tools.refinery.store.tuple.Tuple;
25
26import java.util.LinkedHashMap;
27
28import static org.hamcrest.MatcherAssert.assertThat;
29import static org.hamcrest.Matchers.is;
30import static tools.refinery.store.reasoning.translator.containment.ContainmentHierarchyTranslator.CONTAINED_SYMBOL;
31import static tools.refinery.store.reasoning.translator.containment.ContainmentHierarchyTranslator.CONTAINS_SYMBOL;
32import static tools.refinery.store.reasoning.translator.multiobject.MultiObjectTranslator.COUNT_SYMBOL;
33
34class DefaultContainmentTest {
35 private final PartialRelation c1 = new PartialRelation("C1", 1);
36 private final PartialRelation c2 = new PartialRelation("C2", 1);
37 private final PartialRelation c3 = new PartialRelation("C2", 1);
38 private final PartialRelation r1 = new PartialRelation("r1", 2);
39 private final PartialRelation r2 = new PartialRelation("r2", 2);
40
41 @ParameterizedTest
42 @ValueSource(booleans = {false, true})
43 void defaultContainmentTest(boolean reverse) {
44 var typeHierarchy = TypeHierarchy.builder()
45 .type(CONTAINED_SYMBOL, true)
46 .type(c1)
47 .type(c2, CONTAINED_SYMBOL)
48 .type(c3, CONTAINED_SYMBOL)
49 .build();
50
51 var containmentHierarchy = getContainmentHierarchy(reverse);
52
53 var store = ModelStore.builder()
54 .with(QueryInterpreterAdapter.builder())
55 .with(ReasoningAdapter.builder())
56 .with(new MultiObjectTranslator())
57 .with(new TypeHierarchyTranslator(typeHierarchy))
58 .with(new ContainmentHierarchyTranslator(containmentHierarchy))
59 .build();
60
61 var modelSeed = ModelSeed.builder(3)
62 .seed(COUNT_SYMBOL, builder -> builder.reducedValue(CardinalityIntervals.ONE))
63 .seed(CONTAINED_SYMBOL, builder -> builder.reducedValue(TruthValue.UNKNOWN))
64 .seed(CONTAINS_SYMBOL, builder -> builder.reducedValue(TruthValue.UNKNOWN))
65 .seed(c1, builder -> builder
66 .reducedValue(TruthValue.UNKNOWN)
67 .put(Tuple.of(0), TruthValue.TRUE))
68 .seed(c2, builder -> builder
69 .reducedValue(TruthValue.UNKNOWN)
70 .put(Tuple.of(1), TruthValue.TRUE))
71 .seed(c3, builder -> builder
72 .reducedValue(TruthValue.UNKNOWN)
73 .put(Tuple.of(2), TruthValue.TRUE))
74 .seed(r1, builder -> builder
75 // The {@code FALSE} value here should not affect {@code r2}.
76 .reducedValue(TruthValue.FALSE)
77 .put(Tuple.of(0, 1), TruthValue.TRUE))
78 .seed(r2, builder -> builder
79 .reducedValue(TruthValue.UNKNOWN)
80 .put(Tuple.of(1, 2), TruthValue.TRUE))
81 .build();
82
83 var model = store.getAdapter(ReasoningStoreAdapter.class).createInitialModel(modelSeed);
84 var reasoningAdapter = model.getAdapter(ReasoningAdapter.class);
85 var r1Interpretation = reasoningAdapter.getPartialInterpretation(Concreteness.PARTIAL, r1);
86 var r2Interpretation = reasoningAdapter.getPartialInterpretation(Concreteness.PARTIAL, r2);
87
88 assertThat(r1Interpretation.get(Tuple.of(0, 1)), is(TruthValue.TRUE));
89 assertThat(r1Interpretation.get(Tuple.of(1, 2)), is(TruthValue.FALSE));
90 assertThat(r2Interpretation.get(Tuple.of(0, 1)), is(TruthValue.FALSE));
91 assertThat(r2Interpretation.get(Tuple.of(1, 2)), is(TruthValue.TRUE));
92 }
93
94 private @NotNull LinkedHashMap<PartialRelation, ContainmentInfo> getContainmentHierarchy(boolean reverse) {
95 // Make sure the order of relations is retained.
96 var containmentHierarchy = new LinkedHashMap<PartialRelation, ContainmentInfo>();
97 if (reverse) {
98 containmentHierarchy.put(r2, new ContainmentInfo(c2, UnconstrainedMultiplicity.INSTANCE, c3));
99 containmentHierarchy.put(r1, new ContainmentInfo(c1, UnconstrainedMultiplicity.INSTANCE, c2));
100 } else {
101 containmentHierarchy.put(r1, new ContainmentInfo(c1, UnconstrainedMultiplicity.INSTANCE, c2));
102 containmentHierarchy.put(r2, new ContainmentInfo(c2, UnconstrainedMultiplicity.INSTANCE, c3));
103 }
104 return containmentHierarchy;
105 }
106}