diff options
author | Kristóf Marussy <kristof@marussy.com> | 2024-07-02 22:24:46 +0200 |
---|---|---|
committer | Kristóf Marussy <kristof@marussy.com> | 2024-07-03 21:15:38 +0200 |
commit | bb358231316b2803bd382114b97621dcda16989d (patch) | |
tree | 9735a131b4aedb64e89c25fa6c82c394e65ec913 /subprojects | |
parent | fix(reasoning): do not propagate invalidated objects (diff) | |
download | refinery-bb358231316b2803bd382114b97621dcda16989d.tar.gz refinery-bb358231316b2803bd382114b97621dcda16989d.tar.zst refinery-bb358231316b2803bd382114b97621dcda16989d.zip |
feat: container type propagation
Diffstat (limited to 'subprojects')
18 files changed, 177 insertions, 14 deletions
diff --git a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java index fbcbe6ce..1a9100c9 100644 --- a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java +++ b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/ModelInitializer.java | |||
@@ -122,6 +122,8 @@ public class ModelInitializer { | |||
122 | putRelationInfo(builtinSymbols.equals(), new RelationInfo(ReasoningAdapter.EQUALS_SYMBOL, | 122 | putRelationInfo(builtinSymbols.equals(), new RelationInfo(ReasoningAdapter.EQUALS_SYMBOL, |
123 | (TruthValue) null, | 123 | (TruthValue) null, |
124 | null)); | 124 | null)); |
125 | putRelationInfo(builtinSymbols.container(), | ||
126 | new RelationInfo(ContainmentHierarchyTranslator.CONTAINER_SYMBOL, null, TruthValue.UNKNOWN)); | ||
125 | putRelationInfo(builtinSymbols.contained(), | 127 | putRelationInfo(builtinSymbols.contained(), |
126 | new RelationInfo(ContainmentHierarchyTranslator.CONTAINED_SYMBOL, null, TruthValue.UNKNOWN)); | 128 | new RelationInfo(ContainmentHierarchyTranslator.CONTAINED_SYMBOL, null, TruthValue.UNKNOWN)); |
127 | putRelationInfo(builtinSymbols.contains(), new RelationInfo(ContainmentHierarchyTranslator.CONTAINS_SYMBOL, | 129 | putRelationInfo(builtinSymbols.contains(), new RelationInfo(ContainmentHierarchyTranslator.CONTAINS_SYMBOL, |
diff --git a/subprojects/language/src/main/java/tools/refinery/language/utils/BuiltinSymbols.java b/subprojects/language/src/main/java/tools/refinery/language/utils/BuiltinSymbols.java index 72f23e85..3b2ae707 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/utils/BuiltinSymbols.java +++ b/subprojects/language/src/main/java/tools/refinery/language/utils/BuiltinSymbols.java | |||
@@ -12,6 +12,7 @@ public final class BuiltinSymbols { | |||
12 | private final ClassDeclaration node; | 12 | private final ClassDeclaration node; |
13 | private final PredicateDefinition equals; | 13 | private final PredicateDefinition equals; |
14 | private final PredicateDefinition exists; | 14 | private final PredicateDefinition exists; |
15 | private final ClassDeclaration container; | ||
15 | private final ClassDeclaration contained; | 16 | private final ClassDeclaration contained; |
16 | private final PredicateDefinition contains; | 17 | private final PredicateDefinition contains; |
17 | private final PredicateDefinition invalidContainer; | 18 | private final PredicateDefinition invalidContainer; |
@@ -21,6 +22,7 @@ public final class BuiltinSymbols { | |||
21 | node = getDeclaration(ClassDeclaration.class, "node"); | 22 | node = getDeclaration(ClassDeclaration.class, "node"); |
22 | equals = getDeclaration(PredicateDefinition.class, "equals"); | 23 | equals = getDeclaration(PredicateDefinition.class, "equals"); |
23 | exists = getDeclaration(PredicateDefinition.class, "exists"); | 24 | exists = getDeclaration(PredicateDefinition.class, "exists"); |
25 | container = getDeclaration(ClassDeclaration.class, "container"); | ||
24 | contained = getDeclaration(ClassDeclaration.class, "contained"); | 26 | contained = getDeclaration(ClassDeclaration.class, "contained"); |
25 | contains = getDeclaration(PredicateDefinition.class, "contains"); | 27 | contains = getDeclaration(PredicateDefinition.class, "contains"); |
26 | invalidContainer = getDeclaration(PredicateDefinition.class, "invalidContainer"); | 28 | invalidContainer = getDeclaration(PredicateDefinition.class, "invalidContainer"); |
@@ -42,6 +44,10 @@ public final class BuiltinSymbols { | |||
42 | return exists; | 44 | return exists; |
43 | } | 45 | } |
44 | 46 | ||
47 | public ClassDeclaration container() { | ||
48 | return container; | ||
49 | } | ||
50 | |||
45 | public ClassDeclaration contained() { | 51 | public ClassDeclaration contained() { |
46 | return contained; | 52 | return contained; |
47 | } | 53 | } |
diff --git a/subprojects/language/src/main/resources/tools/refinery/language/library/builtin.refinery b/subprojects/language/src/main/resources/tools/refinery/language/library/builtin.refinery index 09c7d92b..6ae6beb1 100644 --- a/subprojects/language/src/main/resources/tools/refinery/language/library/builtin.refinery +++ b/subprojects/language/src/main/resources/tools/refinery/language/library/builtin.refinery | |||
@@ -8,6 +8,8 @@ pred exists(node). | |||
8 | 8 | ||
9 | pred equals(left, right). | 9 | pred equals(left, right). |
10 | 10 | ||
11 | abstract class container extends node. | ||
12 | |||
11 | abstract class contained extends node. | 13 | abstract class contained extends node. |
12 | 14 | ||
13 | pred contains(container, contained contained). | 15 | pred contains(container, contained contained). |
diff --git a/subprojects/store-reasoning-scope/src/test/java/tools/refinery/store/reasoning/scope/PredicateScopeTest.java b/subprojects/store-reasoning-scope/src/test/java/tools/refinery/store/reasoning/scope/PredicateScopeTest.java index f4d5fb60..c39e603b 100644 --- a/subprojects/store-reasoning-scope/src/test/java/tools/refinery/store/reasoning/scope/PredicateScopeTest.java +++ b/subprojects/store-reasoning-scope/src/test/java/tools/refinery/store/reasoning/scope/PredicateScopeTest.java | |||
@@ -56,6 +56,8 @@ class PredicateScopeTest { | |||
56 | .seed(MultiObjectTranslator.COUNT_SYMBOL, builder -> builder | 56 | .seed(MultiObjectTranslator.COUNT_SYMBOL, builder -> builder |
57 | .reducedValue(CardinalityIntervals.ONE) | 57 | .reducedValue(CardinalityIntervals.ONE) |
58 | .put(newIndex, CardinalityIntervals.SET)) | 58 | .put(newIndex, CardinalityIntervals.SET)) |
59 | .seed(ContainmentHierarchyTranslator.CONTAINER_SYMBOL, | ||
60 | builder -> builder.reducedValue(TruthValue.UNKNOWN)) | ||
59 | .seed(ContainmentHierarchyTranslator.CONTAINED_SYMBOL, | 61 | .seed(ContainmentHierarchyTranslator.CONTAINED_SYMBOL, |
60 | builder -> builder.reducedValue(TruthValue.UNKNOWN)) | 62 | builder -> builder.reducedValue(TruthValue.UNKNOWN)) |
61 | .seed(index, builder -> builder | 63 | .seed(index, builder -> builder |
@@ -81,6 +83,8 @@ class PredicateScopeTest { | |||
81 | var store = createStore(); | 83 | var store = createStore(); |
82 | var modelSeed = ModelSeed.builder(8) | 84 | var modelSeed = ModelSeed.builder(8) |
83 | .seed(MultiObjectTranslator.COUNT_SYMBOL, builder -> builder.reducedValue(CardinalityIntervals.ONE)) | 85 | .seed(MultiObjectTranslator.COUNT_SYMBOL, builder -> builder.reducedValue(CardinalityIntervals.ONE)) |
86 | .seed(ContainmentHierarchyTranslator.CONTAINER_SYMBOL, | ||
87 | builder -> builder.reducedValue(TruthValue.UNKNOWN)) | ||
84 | .seed(ContainmentHierarchyTranslator.CONTAINED_SYMBOL, | 88 | .seed(ContainmentHierarchyTranslator.CONTAINED_SYMBOL, |
85 | builder -> builder.reducedValue(TruthValue.UNKNOWN)) | 89 | builder -> builder.reducedValue(TruthValue.UNKNOWN)) |
86 | .seed(ContainmentHierarchyTranslator.CONTAINS_SYMBOL, | 90 | .seed(ContainmentHierarchyTranslator.CONTAINS_SYMBOL, |
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainerTypeInferenceTranslator.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainerTypeInferenceTranslator.java new file mode 100644 index 00000000..76e4b5d1 --- /dev/null +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainerTypeInferenceTranslator.java | |||
@@ -0,0 +1,114 @@ | |||
1 | /* | ||
2 | * SPDX-FileCopyrightText: 2024 The Refinery Authors <https://refinery.tools/> | ||
3 | * | ||
4 | * SPDX-License-Identifier: EPL-2.0 | ||
5 | */ | ||
6 | package tools.refinery.store.reasoning.translator.containment; | ||
7 | |||
8 | import tools.refinery.logic.literal.Literal; | ||
9 | import tools.refinery.logic.term.Variable; | ||
10 | import tools.refinery.store.dse.propagation.PropagationBuilder; | ||
11 | import tools.refinery.store.dse.transition.Rule; | ||
12 | import tools.refinery.store.model.ModelStoreBuilder; | ||
13 | import tools.refinery.store.model.ModelStoreConfiguration; | ||
14 | import tools.refinery.store.reasoning.representation.PartialRelation; | ||
15 | import tools.refinery.store.reasoning.translator.typehierarchy.TypeHierarchy; | ||
16 | |||
17 | import java.util.*; | ||
18 | |||
19 | import static tools.refinery.logic.literal.Literals.not; | ||
20 | import static tools.refinery.store.reasoning.actions.PartialActionLiterals.remove; | ||
21 | import static tools.refinery.store.reasoning.literal.PartialLiterals.may; | ||
22 | import static tools.refinery.store.reasoning.literal.PartialLiterals.must; | ||
23 | import static tools.refinery.store.reasoning.translator.containment.ContainmentHierarchyTranslator.*; | ||
24 | |||
25 | public class ContainerTypeInferenceTranslator implements ModelStoreConfiguration { | ||
26 | private final TypeHierarchy typeHierarchy; | ||
27 | private final Map<PartialRelation, Set<PartialRelation>> possibleContents = new LinkedHashMap<>(); | ||
28 | private final Map<PartialRelation, Set<PartialRelation>> possibleContainers = new LinkedHashMap<>(); | ||
29 | |||
30 | public ContainerTypeInferenceTranslator(TypeHierarchy typeHierarchy, | ||
31 | Map<PartialRelation, ContainmentInfo> containmentInfoMap) { | ||
32 | this.typeHierarchy = typeHierarchy; | ||
33 | for (var containedType : typeHierarchy.getAnalysisResult(CONTAINER_SYMBOL).getConcreteSubtypesAndSelf()) { | ||
34 | possibleContents.put(containedType, new LinkedHashSet<>()); | ||
35 | } | ||
36 | for (var containedType : typeHierarchy.getAnalysisResult(CONTAINED_SYMBOL).getConcreteSubtypesAndSelf()) { | ||
37 | possibleContainers.put(containedType, new LinkedHashSet<>()); | ||
38 | } | ||
39 | for (var entry : containmentInfoMap.entrySet()) { | ||
40 | var containmentLink = entry.getKey(); | ||
41 | var containmentInfo = entry.getValue(); | ||
42 | var sourceType = containmentInfo.sourceType(); | ||
43 | for (var subtype : typeHierarchy.getAnalysisResult(sourceType).getConcreteSubtypesAndSelf()) { | ||
44 | possibleContents.get(subtype).add(containmentLink); | ||
45 | } | ||
46 | var targetType = containmentInfo.targetType(); | ||
47 | for (var subtype : typeHierarchy.getAnalysisResult(targetType).getConcreteSubtypesAndSelf()) { | ||
48 | possibleContainers.get(subtype).add(containmentLink); | ||
49 | } | ||
50 | } | ||
51 | } | ||
52 | |||
53 | @Override | ||
54 | public void apply(ModelStoreBuilder storeBuilder) { | ||
55 | storeBuilder.tryGetAdapter(PropagationBuilder.class).ifPresent(this::configurePropagationBuilder); | ||
56 | } | ||
57 | |||
58 | private void configurePropagationBuilder(PropagationBuilder propagationBuilder) { | ||
59 | configureContainerPropagator(propagationBuilder); | ||
60 | configureContainedPropagator(propagationBuilder); | ||
61 | } | ||
62 | |||
63 | private void configureContainerPropagator(PropagationBuilder propagationBuilder) { | ||
64 | for (var entry : possibleContents.entrySet()) { | ||
65 | var sourceType = entry.getKey(); | ||
66 | var contents = entry.getValue(); | ||
67 | propagationBuilder.rule(Rule.of(sourceType.name() + "#notContainer", (builder, source) -> builder | ||
68 | .clause(target -> { | ||
69 | var literals = new ArrayList<Literal>(); | ||
70 | literals.add(may(sourceType.call(source))); | ||
71 | literals.add(not(must(sourceType.call(source)))); | ||
72 | literals.add(must(CONTAINS_SYMBOL.call(source, target))); | ||
73 | var typeInfo = typeHierarchy.getAnalysisResult(sourceType); | ||
74 | for (var subtype : typeInfo.getDirectSubtypes()) { | ||
75 | literals.add(not(may(subtype.call(source)))); | ||
76 | } | ||
77 | for (var content : contents) { | ||
78 | literals.add(not(may(content.call(source, target)))); | ||
79 | } | ||
80 | return literals; | ||
81 | }) | ||
82 | .action( | ||
83 | remove(sourceType, source) | ||
84 | ) | ||
85 | )); | ||
86 | } | ||
87 | } | ||
88 | |||
89 | private void configureContainedPropagator(PropagationBuilder propagationBuilder) { | ||
90 | for (var entry : possibleContainers.entrySet()) { | ||
91 | var targetType = entry.getKey(); | ||
92 | var containers = entry.getValue(); | ||
93 | propagationBuilder.rule(Rule.of(targetType.name() + "#notContent", (builder, target) -> builder | ||
94 | .clause(() -> { | ||
95 | var literals = new ArrayList<Literal>(); | ||
96 | literals.add(may(targetType.call(target))); | ||
97 | literals.add(not(must(targetType.call(target)))); | ||
98 | literals.add(must(CONTAINED_SYMBOL.call(target))); | ||
99 | var typeInfo = typeHierarchy.getAnalysisResult(targetType); | ||
100 | for (var subtype : typeInfo.getDirectSubtypes()) { | ||
101 | literals.add(not(may(subtype.call(target)))); | ||
102 | } | ||
103 | for (var container : containers) { | ||
104 | literals.add(not(may(container.call(Variable.of(), target)))); | ||
105 | } | ||
106 | return literals; | ||
107 | }) | ||
108 | .action( | ||
109 | remove(targetType, target) | ||
110 | ) | ||
111 | )); | ||
112 | } | ||
113 | } | ||
114 | } | ||
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainmentHierarchyTranslator.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainmentHierarchyTranslator.java index c862bc33..b15a2576 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainmentHierarchyTranslator.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainmentHierarchyTranslator.java | |||
@@ -50,6 +50,7 @@ import static tools.refinery.store.reasoning.actions.PartialActionLiterals.focus | |||
50 | import static tools.refinery.store.reasoning.literal.PartialLiterals.*; | 50 | import static tools.refinery.store.reasoning.literal.PartialLiterals.*; |
51 | 51 | ||
52 | public class ContainmentHierarchyTranslator implements ModelStoreConfiguration { | 52 | public class ContainmentHierarchyTranslator implements ModelStoreConfiguration { |
53 | public static final PartialRelation CONTAINER_SYMBOL = new PartialRelation("container", 1); | ||
53 | public static final PartialRelation CONTAINED_SYMBOL = new PartialRelation("contained", 1); | 54 | public static final PartialRelation CONTAINED_SYMBOL = new PartialRelation("contained", 1); |
54 | public static final PartialRelation INVALID_CONTAINER = new PartialRelation("invalidContainer", | 55 | public static final PartialRelation INVALID_CONTAINER = new PartialRelation("invalidContainer", |
55 | 1); | 56 | 1); |
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainsRefiner.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainsRefiner.java index 00820040..024774bc 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainsRefiner.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/ContainsRefiner.java | |||
@@ -30,12 +30,14 @@ class ContainsRefiner extends AbstractPartialInterpretationRefiner<TruthValue, B | |||
30 | } | 30 | } |
31 | 31 | ||
32 | private final Interpretation<InferredContainment> interpretation; | 32 | private final Interpretation<InferredContainment> interpretation; |
33 | private final PartialInterpretationRefiner<TruthValue, Boolean> containerRefiner; | ||
33 | private final PartialInterpretationRefiner<TruthValue, Boolean> containedRefiner; | 34 | private final PartialInterpretationRefiner<TruthValue, Boolean> containedRefiner; |
34 | 35 | ||
35 | private ContainsRefiner(ReasoningAdapter adapter, PartialSymbol<TruthValue, Boolean> partialSymbol, | 36 | private ContainsRefiner(ReasoningAdapter adapter, PartialSymbol<TruthValue, Boolean> partialSymbol, |
36 | Symbol<InferredContainment> containsStorage) { | 37 | Symbol<InferredContainment> containsStorage) { |
37 | super(adapter, partialSymbol); | 38 | super(adapter, partialSymbol); |
38 | interpretation = adapter.getModel().getInterpretation(containsStorage); | 39 | interpretation = adapter.getModel().getInterpretation(containsStorage); |
40 | containerRefiner = adapter.getRefiner(ContainmentHierarchyTranslator.CONTAINER_SYMBOL); | ||
39 | containedRefiner = adapter.getRefiner(ContainmentHierarchyTranslator.CONTAINED_SYMBOL); | 41 | containedRefiner = adapter.getRefiner(ContainmentHierarchyTranslator.CONTAINED_SYMBOL); |
40 | } | 42 | } |
41 | 43 | ||
@@ -47,7 +49,8 @@ class ContainsRefiner extends AbstractPartialInterpretationRefiner<TruthValue, B | |||
47 | interpretation.put(key, newValue); | 49 | interpretation.put(key, newValue); |
48 | } | 50 | } |
49 | if (value.must()) { | 51 | if (value.must()) { |
50 | return containedRefiner.merge(Tuple.of(key.get(1)), TruthValue.TRUE); | 52 | return containerRefiner.merge(Tuple.of(key.get(0)), TruthValue.TRUE) && |
53 | containedRefiner.merge(Tuple.of(key.get(1)), TruthValue.TRUE); | ||
51 | } | 54 | } |
52 | return true; | 55 | return true; |
53 | } | 56 | } |
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/CrossReferenceUtils.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/CrossReferenceUtils.java index 41d185d7..b322513d 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/CrossReferenceUtils.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/CrossReferenceUtils.java | |||
@@ -30,7 +30,6 @@ import static tools.refinery.logic.literal.Literals.check; | |||
30 | import static tools.refinery.logic.literal.Literals.not; | 30 | import static tools.refinery.logic.literal.Literals.not; |
31 | import static tools.refinery.logic.term.int_.IntTerms.constant; | 31 | import static tools.refinery.logic.term.int_.IntTerms.constant; |
32 | import static tools.refinery.logic.term.int_.IntTerms.less; | 32 | import static tools.refinery.logic.term.int_.IntTerms.less; |
33 | import static tools.refinery.store.reasoning.ReasoningAdapter.EQUALS_SYMBOL; | ||
34 | import static tools.refinery.store.reasoning.actions.PartialActionLiterals.add; | 33 | import static tools.refinery.store.reasoning.actions.PartialActionLiterals.add; |
35 | import static tools.refinery.store.reasoning.actions.PartialActionLiterals.remove; | 34 | import static tools.refinery.store.reasoning.actions.PartialActionLiterals.remove; |
36 | import static tools.refinery.store.reasoning.literal.PartialLiterals.*; | 35 | import static tools.refinery.store.reasoning.literal.PartialLiterals.*; |
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/ContainedTypeHierarchyBuilder.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/ContainedTypeHierarchyBuilder.java index a21da3d4..1cd564bd 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/ContainedTypeHierarchyBuilder.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/ContainedTypeHierarchyBuilder.java | |||
@@ -20,6 +20,17 @@ public class ContainedTypeHierarchyBuilder extends TypeHierarchyBuilder { | |||
20 | return !typeInfoMap.containsKey(type); | 20 | return !typeInfoMap.containsKey(type); |
21 | } | 21 | } |
22 | 22 | ||
23 | void setContainerTypes(Collection<PartialRelation> containerTypes) { | ||
24 | for (var containerType : containerTypes) { | ||
25 | var currentInfo = typeInfoMap.get(containerType); | ||
26 | if (currentInfo == null) { | ||
27 | throw new TranslationException(containerType, "Invalid container type: " + containerType); | ||
28 | } | ||
29 | var newInfo = currentInfo.addSupertype(ContainmentHierarchyTranslator.CONTAINER_SYMBOL); | ||
30 | typeInfoMap.put(containerType, newInfo); | ||
31 | } | ||
32 | } | ||
33 | |||
23 | void setContainedTypes(Collection<PartialRelation> containedTypes) { | 34 | void setContainedTypes(Collection<PartialRelation> containedTypes) { |
24 | for (var containedType : containedTypes) { | 35 | for (var containedType : containedTypes) { |
25 | var currentInfo = typeInfoMap.get(containedType); | 36 | var currentInfo = typeInfoMap.get(containedType); |
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelBuilder.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelBuilder.java index 94bf1c5d..740fe231 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelBuilder.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelBuilder.java | |||
@@ -21,6 +21,7 @@ import java.util.function.Consumer; | |||
21 | public class MetamodelBuilder { | 21 | public class MetamodelBuilder { |
22 | private final ContainedTypeHierarchyBuilder typeHierarchyBuilder = new ContainedTypeHierarchyBuilder(); | 22 | private final ContainedTypeHierarchyBuilder typeHierarchyBuilder = new ContainedTypeHierarchyBuilder(); |
23 | private final Map<PartialRelation, ReferenceInfo> referenceInfoMap = new LinkedHashMap<>(); | 23 | private final Map<PartialRelation, ReferenceInfo> referenceInfoMap = new LinkedHashMap<>(); |
24 | private final Set<PartialRelation> containerTypes = new HashSet<>(); | ||
24 | private final Set<PartialRelation> containedTypes = new HashSet<>(); | 25 | private final Set<PartialRelation> containedTypes = new HashSet<>(); |
25 | private final Map<PartialRelation, ContainmentInfo> containmentHierarchy = new LinkedHashMap<>(); | 26 | private final Map<PartialRelation, ContainmentInfo> containmentHierarchy = new LinkedHashMap<>(); |
26 | private final Map<PartialRelation, DirectedCrossReferenceInfo> directedCrossReferences = new LinkedHashMap<>(); | 27 | private final Map<PartialRelation, DirectedCrossReferenceInfo> directedCrossReferences = new LinkedHashMap<>(); |
@@ -28,6 +29,7 @@ public class MetamodelBuilder { | |||
28 | private final Map<PartialRelation, PartialRelation> oppositeReferences = new LinkedHashMap<>(); | 29 | private final Map<PartialRelation, PartialRelation> oppositeReferences = new LinkedHashMap<>(); |
29 | 30 | ||
30 | MetamodelBuilder() { | 31 | MetamodelBuilder() { |
32 | typeHierarchyBuilder.type(ContainmentHierarchyTranslator.CONTAINER_SYMBOL, true); | ||
31 | typeHierarchyBuilder.type(ContainmentHierarchyTranslator.CONTAINED_SYMBOL, true); | 33 | typeHierarchyBuilder.type(ContainmentHierarchyTranslator.CONTAINED_SYMBOL, true); |
32 | } | 34 | } |
33 | 35 | ||
@@ -105,6 +107,7 @@ public class MetamodelBuilder { | |||
105 | var info = entry.getValue(); | 107 | var info = entry.getValue(); |
106 | processReferenceInfo(linkType, info); | 108 | processReferenceInfo(linkType, info); |
107 | } | 109 | } |
110 | typeHierarchyBuilder.setContainerTypes(containerTypes); | ||
108 | typeHierarchyBuilder.setContainedTypes(containedTypes); | 111 | typeHierarchyBuilder.setContainedTypes(containedTypes); |
109 | var typeHierarchy = typeHierarchyBuilder.build(); | 112 | var typeHierarchy = typeHierarchyBuilder.build(); |
110 | return new Metamodel(typeHierarchy, Collections.unmodifiableMap(containmentHierarchy), | 113 | return new Metamodel(typeHierarchy, Collections.unmodifiableMap(containmentHierarchy), |
@@ -169,6 +172,7 @@ public class MetamodelBuilder { | |||
169 | throw new TranslationException(opposite, "Invalid opposite %s with multiplicity %s of containment %s" | 172 | throw new TranslationException(opposite, "Invalid opposite %s with multiplicity %s of containment %s" |
170 | .formatted(opposite, targetMultiplicity, linkType)); | 173 | .formatted(opposite, targetMultiplicity, linkType)); |
171 | } | 174 | } |
175 | containerTypes.add(sourceType); | ||
172 | containedTypes.add(targetType); | 176 | containedTypes.add(targetType); |
173 | containmentHierarchy.put(linkType, new ContainmentInfo(sourceType, info.multiplicity(), targetType)); | 177 | containmentHierarchy.put(linkType, new ContainmentInfo(sourceType, info.multiplicity(), targetType)); |
174 | } | 178 | } |
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelTranslator.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelTranslator.java index 5afa58f2..36b2d9a1 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelTranslator.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelTranslator.java | |||
@@ -7,6 +7,7 @@ package tools.refinery.store.reasoning.translator.metamodel; | |||
7 | 7 | ||
8 | import tools.refinery.store.model.ModelStoreBuilder; | 8 | import tools.refinery.store.model.ModelStoreBuilder; |
9 | import tools.refinery.store.model.ModelStoreConfiguration; | 9 | import tools.refinery.store.model.ModelStoreConfiguration; |
10 | import tools.refinery.store.reasoning.translator.containment.ContainerTypeInferenceTranslator; | ||
10 | import tools.refinery.store.reasoning.translator.containment.ContainmentHierarchyTranslator; | 11 | import tools.refinery.store.reasoning.translator.containment.ContainmentHierarchyTranslator; |
11 | import tools.refinery.store.reasoning.translator.crossreference.DirectedCrossReferenceTranslator; | 12 | import tools.refinery.store.reasoning.translator.crossreference.DirectedCrossReferenceTranslator; |
12 | import tools.refinery.store.reasoning.translator.crossreference.UndirectedCrossReferenceTranslator; | 13 | import tools.refinery.store.reasoning.translator.crossreference.UndirectedCrossReferenceTranslator; |
@@ -24,6 +25,8 @@ public class MetamodelTranslator implements ModelStoreConfiguration { | |||
24 | public void apply(ModelStoreBuilder storeBuilder) { | 25 | public void apply(ModelStoreBuilder storeBuilder) { |
25 | storeBuilder.with(new TypeHierarchyTranslator(metamodel.typeHierarchy())); | 26 | storeBuilder.with(new TypeHierarchyTranslator(metamodel.typeHierarchy())); |
26 | storeBuilder.with(new ContainmentHierarchyTranslator(metamodel.containmentHierarchy())); | 27 | storeBuilder.with(new ContainmentHierarchyTranslator(metamodel.containmentHierarchy())); |
28 | storeBuilder.with(new ContainerTypeInferenceTranslator(metamodel.typeHierarchy(), | ||
29 | metamodel.containmentHierarchy())); | ||
27 | for (var entry : metamodel.directedCrossReferences().entrySet()) { | 30 | for (var entry : metamodel.directedCrossReferences().entrySet()) { |
28 | storeBuilder.with(new DirectedCrossReferenceTranslator(entry.getKey(), entry.getValue())); | 31 | storeBuilder.with(new DirectedCrossReferenceTranslator(entry.getKey(), entry.getValue())); |
29 | } | 32 | } |
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/ExtendedTypeInfo.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/ExtendedTypeInfo.java index 7a917dcf..f2de384f 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/ExtendedTypeInfo.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/ExtendedTypeInfo.java | |||
@@ -51,7 +51,7 @@ final class ExtendedTypeInfo implements Comparable<ExtendedTypeInfo> { | |||
51 | } | 51 | } |
52 | 52 | ||
53 | public Set<PartialRelation> getAllSupertypesAndSelf() { | 53 | public Set<PartialRelation> getAllSupertypesAndSelf() { |
54 | var allSubtypesAndSelf = new HashSet<PartialRelation>(allSupertypes.size() + 1); | 54 | var allSubtypesAndSelf = HashSet.<PartialRelation>newHashSet(allSupertypes.size() + 1); |
55 | addMust(allSubtypesAndSelf); | 55 | addMust(allSubtypesAndSelf); |
56 | return allSubtypesAndSelf; | 56 | return allSubtypesAndSelf; |
57 | } | 57 | } |
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeAnalysisResult.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeAnalysisResult.java index 324e2b9e..d20b4f4a 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeAnalysisResult.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeAnalysisResult.java | |||
@@ -13,12 +13,14 @@ import java.util.*; | |||
13 | public final class TypeAnalysisResult { | 13 | public final class TypeAnalysisResult { |
14 | private final ExtendedTypeInfo extendedTypeInfo; | 14 | private final ExtendedTypeInfo extendedTypeInfo; |
15 | private final List<PartialRelation> directSubtypes; | 15 | private final List<PartialRelation> directSubtypes; |
16 | private final Set<PartialRelation> concreteSubtypesAndSelf; | ||
16 | private final List<ExtendedTypeInfo> allExternalTypeInfoList; | 17 | private final List<ExtendedTypeInfo> allExternalTypeInfoList; |
17 | private final InferredType inferredType; | 18 | private final InferredType inferredType; |
18 | 19 | ||
19 | public TypeAnalysisResult(ExtendedTypeInfo extendedTypeInfo, List<ExtendedTypeInfo> allExternalTypeInfoList) { | 20 | TypeAnalysisResult(ExtendedTypeInfo extendedTypeInfo, List<ExtendedTypeInfo> allExternalTypeInfoList) { |
20 | this.extendedTypeInfo = extendedTypeInfo; | 21 | this.extendedTypeInfo = extendedTypeInfo; |
21 | directSubtypes = List.copyOf(extendedTypeInfo.getDirectSubtypes()); | 22 | directSubtypes = List.copyOf(extendedTypeInfo.getDirectSubtypes()); |
23 | concreteSubtypesAndSelf = Collections.unmodifiableSet(extendedTypeInfo.getConcreteSubtypesAndSelf()); | ||
22 | this.allExternalTypeInfoList = allExternalTypeInfoList; | 24 | this.allExternalTypeInfoList = allExternalTypeInfoList; |
23 | inferredType = propagateMust(extendedTypeInfo.getAllSupertypesAndSelf(), | 25 | inferredType = propagateMust(extendedTypeInfo.getAllSupertypesAndSelf(), |
24 | extendedTypeInfo.getConcreteSubtypesAndSelf()); | 26 | extendedTypeInfo.getConcreteSubtypesAndSelf()); |
@@ -32,6 +34,10 @@ public final class TypeAnalysisResult { | |||
32 | return directSubtypes; | 34 | return directSubtypes; |
33 | } | 35 | } |
34 | 36 | ||
37 | public Set<PartialRelation> getConcreteSubtypesAndSelf() { | ||
38 | return concreteSubtypesAndSelf; | ||
39 | } | ||
40 | |||
35 | public boolean isAbstractType() { | 41 | public boolean isAbstractType() { |
36 | return extendedTypeInfo.isAbstractType(); | 42 | return extendedTypeInfo.isAbstractType(); |
37 | } | 43 | } |
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeHierarchy.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeHierarchy.java index 3f918c97..ec74ed14 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeHierarchy.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeHierarchy.java | |||
@@ -20,7 +20,7 @@ public class TypeHierarchy { | |||
20 | TypeHierarchy(Map<PartialRelation, TypeInfo> typeInfoMap) { | 20 | TypeHierarchy(Map<PartialRelation, TypeInfo> typeInfoMap) { |
21 | int size = typeInfoMap.size(); | 21 | int size = typeInfoMap.size(); |
22 | allTypes = Collections.unmodifiableSet(new LinkedHashSet<>(typeInfoMap.keySet())); | 22 | allTypes = Collections.unmodifiableSet(new LinkedHashSet<>(typeInfoMap.keySet())); |
23 | extendedTypeInfoMap = new LinkedHashMap<>(size); | 23 | extendedTypeInfoMap = LinkedHashMap.newLinkedHashMap(size); |
24 | var concreteTypes = new LinkedHashSet<PartialRelation>(); | 24 | var concreteTypes = new LinkedHashSet<PartialRelation>(); |
25 | int index = 0; | 25 | int index = 0; |
26 | for (var entry : typeInfoMap.entrySet()) { | 26 | for (var entry : typeInfoMap.entrySet()) { |
@@ -118,7 +118,7 @@ public class TypeHierarchy { | |||
118 | for (var extendedTypeInfo : extendedTypeInfoMap.values()) { | 118 | for (var extendedTypeInfo : extendedTypeInfoMap.values()) { |
119 | var allSubtypes = extendedTypeInfo.getAllSubtypes(); | 119 | var allSubtypes = extendedTypeInfo.getAllSubtypes(); |
120 | var directSubtypes = new LinkedHashSet<>(allSubtypes); | 120 | var directSubtypes = new LinkedHashSet<>(allSubtypes); |
121 | var indirectSubtypes = new LinkedHashSet<PartialRelation>(allSubtypes.size()); | 121 | var indirectSubtypes = LinkedHashSet.<PartialRelation>newLinkedHashSet(allSubtypes.size()); |
122 | for (var subtype : allSubtypes) { | 122 | for (var subtype : allSubtypes) { |
123 | indirectSubtypes.addAll(extendedTypeInfoMap.get(subtype).getAllSubtypes()); | 123 | indirectSubtypes.addAll(extendedTypeInfoMap.get(subtype).getAllSubtypes()); |
124 | } | 124 | } |
@@ -203,7 +203,7 @@ public class TypeHierarchy { | |||
203 | 203 | ||
204 | private Map<PartialRelation, TypeAnalysisResult> computeAnalysisResults() { | 204 | private Map<PartialRelation, TypeAnalysisResult> computeAnalysisResults() { |
205 | var allExtendedTypeInfoList = sortTypes(); | 205 | var allExtendedTypeInfoList = sortTypes(); |
206 | var preservedResults = new LinkedHashMap<PartialRelation, TypeAnalysisResult>( | 206 | var preservedResults = LinkedHashMap.<PartialRelation, TypeAnalysisResult>newLinkedHashMap( |
207 | allExtendedTypeInfoList.size()); | 207 | allExtendedTypeInfoList.size()); |
208 | for (var extendedTypeInfo : allExtendedTypeInfoList) { | 208 | for (var extendedTypeInfo : allExtendedTypeInfoList) { |
209 | var type = extendedTypeInfo.getType(); | 209 | var type = extendedTypeInfo.getType(); |
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeHierarchyTranslator.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeHierarchyTranslator.java index 700bbe88..168d78df 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeHierarchyTranslator.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeHierarchyTranslator.java | |||
@@ -22,6 +22,7 @@ import tools.refinery.store.representation.Symbol; | |||
22 | import java.util.ArrayList; | 22 | import java.util.ArrayList; |
23 | 23 | ||
24 | import static tools.refinery.logic.literal.Literals.not; | 24 | import static tools.refinery.logic.literal.Literals.not; |
25 | import static tools.refinery.store.reasoning.actions.PartialActionLiterals.add; | ||
25 | import static tools.refinery.store.reasoning.literal.PartialLiterals.candidateMust; | 26 | import static tools.refinery.store.reasoning.literal.PartialLiterals.candidateMust; |
26 | import static tools.refinery.store.reasoning.literal.PartialLiterals.may; | 27 | import static tools.refinery.store.reasoning.literal.PartialLiterals.may; |
27 | 28 | ||
@@ -92,7 +93,7 @@ public class TypeHierarchyTranslator implements ModelStoreConfiguration { | |||
92 | ) | 93 | ) |
93 | .action(() -> { | 94 | .action(() -> { |
94 | var actionLiterals = new ArrayList<ActionLiteral>(); | 95 | var actionLiterals = new ArrayList<ActionLiteral>(); |
95 | actionLiterals.add(PartialActionLiterals.add(type, instance)); | 96 | actionLiterals.add(add(type, instance)); |
96 | for (var subtype : result.getDirectSubtypes()) { | 97 | for (var subtype : result.getDirectSubtypes()) { |
97 | actionLiterals.add(PartialActionLiterals.remove(subtype, instance)); | 98 | actionLiterals.add(PartialActionLiterals.remove(subtype, instance)); |
98 | } | 99 | } |
diff --git a/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/containment/ContainmentHierarchyTranslatorTest.java b/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/containment/ContainmentHierarchyTranslatorTest.java index e889b80d..4d46ea63 100644 --- a/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/containment/ContainmentHierarchyTranslatorTest.java +++ b/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/containment/ContainmentHierarchyTranslatorTest.java | |||
@@ -26,8 +26,7 @@ import java.util.Map; | |||
26 | 26 | ||
27 | import static org.hamcrest.MatcherAssert.assertThat; | 27 | import static org.hamcrest.MatcherAssert.assertThat; |
28 | import static org.hamcrest.Matchers.is; | 28 | import static org.hamcrest.Matchers.is; |
29 | import static tools.refinery.store.reasoning.translator.containment.ContainmentHierarchyTranslator.CONTAINED_SYMBOL; | 29 | import static tools.refinery.store.reasoning.translator.containment.ContainmentHierarchyTranslator.*; |
30 | import static tools.refinery.store.reasoning.translator.containment.ContainmentHierarchyTranslator.CONTAINS_SYMBOL; | ||
31 | import static tools.refinery.store.reasoning.translator.multiobject.MultiObjectTranslator.COUNT_SYMBOL; | 30 | import static tools.refinery.store.reasoning.translator.multiobject.MultiObjectTranslator.COUNT_SYMBOL; |
32 | 31 | ||
33 | class ContainmentHierarchyTranslatorTest { | 32 | class ContainmentHierarchyTranslatorTest { |
@@ -41,8 +40,9 @@ class ContainmentHierarchyTranslatorTest { | |||
41 | void beforeEach() { | 40 | void beforeEach() { |
42 | 41 | ||
43 | var typeHierarchy = TypeHierarchy.builder() | 42 | var typeHierarchy = TypeHierarchy.builder() |
43 | .type(CONTAINER_SYMBOL, true) | ||
44 | .type(CONTAINED_SYMBOL, true) | 44 | .type(CONTAINED_SYMBOL, true) |
45 | .type(c1) | 45 | .type(c1, CONTAINER_SYMBOL) |
46 | .type(c2, c1, CONTAINED_SYMBOL) | 46 | .type(c2, c1, CONTAINED_SYMBOL) |
47 | .build(); | 47 | .build(); |
48 | 48 | ||
@@ -64,6 +64,7 @@ class ContainmentHierarchyTranslatorTest { | |||
64 | void treeTest() { | 64 | void treeTest() { |
65 | var modelSeed = ModelSeed.builder(3) | 65 | var modelSeed = ModelSeed.builder(3) |
66 | .seed(COUNT_SYMBOL, builder -> builder.reducedValue(CardinalityIntervals.ONE)) | 66 | .seed(COUNT_SYMBOL, builder -> builder.reducedValue(CardinalityIntervals.ONE)) |
67 | .seed(CONTAINER_SYMBOL, builder -> builder.reducedValue(TruthValue.UNKNOWN)) | ||
67 | .seed(CONTAINED_SYMBOL, builder -> builder.reducedValue(TruthValue.UNKNOWN)) | 68 | .seed(CONTAINED_SYMBOL, builder -> builder.reducedValue(TruthValue.UNKNOWN)) |
68 | .seed(CONTAINS_SYMBOL, builder -> builder.reducedValue(TruthValue.UNKNOWN)) | 69 | .seed(CONTAINS_SYMBOL, builder -> builder.reducedValue(TruthValue.UNKNOWN)) |
69 | .seed(c1, builder -> builder | 70 | .seed(c1, builder -> builder |
@@ -97,6 +98,7 @@ class ContainmentHierarchyTranslatorTest { | |||
97 | void loopTest() { | 98 | void loopTest() { |
98 | var modelSeed = ModelSeed.builder(3) | 99 | var modelSeed = ModelSeed.builder(3) |
99 | .seed(COUNT_SYMBOL, builder -> builder.reducedValue(CardinalityIntervals.ONE)) | 100 | .seed(COUNT_SYMBOL, builder -> builder.reducedValue(CardinalityIntervals.ONE)) |
101 | .seed(CONTAINER_SYMBOL, builder -> builder.reducedValue(TruthValue.UNKNOWN)) | ||
100 | .seed(CONTAINED_SYMBOL, builder -> builder.reducedValue(TruthValue.UNKNOWN)) | 102 | .seed(CONTAINED_SYMBOL, builder -> builder.reducedValue(TruthValue.UNKNOWN)) |
101 | .seed(CONTAINS_SYMBOL, builder -> builder.reducedValue(TruthValue.UNKNOWN)) | 103 | .seed(CONTAINS_SYMBOL, builder -> builder.reducedValue(TruthValue.UNKNOWN)) |
102 | .seed(c1, builder -> builder.reducedValue(TruthValue.UNKNOWN)) | 104 | .seed(c1, builder -> builder.reducedValue(TruthValue.UNKNOWN)) |
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 index e80f9744..2f814b58 100644 --- 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 | |||
@@ -27,8 +27,7 @@ import java.util.LinkedHashMap; | |||
27 | 27 | ||
28 | import static org.hamcrest.MatcherAssert.assertThat; | 28 | import static org.hamcrest.MatcherAssert.assertThat; |
29 | import static org.hamcrest.Matchers.is; | 29 | import static org.hamcrest.Matchers.is; |
30 | import static tools.refinery.store.reasoning.translator.containment.ContainmentHierarchyTranslator.CONTAINED_SYMBOL; | 30 | import static tools.refinery.store.reasoning.translator.containment.ContainmentHierarchyTranslator.*; |
31 | import static tools.refinery.store.reasoning.translator.containment.ContainmentHierarchyTranslator.CONTAINS_SYMBOL; | ||
32 | import static tools.refinery.store.reasoning.translator.multiobject.MultiObjectTranslator.COUNT_SYMBOL; | 31 | import static tools.refinery.store.reasoning.translator.multiobject.MultiObjectTranslator.COUNT_SYMBOL; |
33 | 32 | ||
34 | class DefaultContainmentTest { | 33 | class DefaultContainmentTest { |
@@ -42,8 +41,9 @@ class DefaultContainmentTest { | |||
42 | @ValueSource(booleans = {false, true}) | 41 | @ValueSource(booleans = {false, true}) |
43 | void defaultContainmentTest(boolean reverse) { | 42 | void defaultContainmentTest(boolean reverse) { |
44 | var typeHierarchy = TypeHierarchy.builder() | 43 | var typeHierarchy = TypeHierarchy.builder() |
44 | .type(CONTAINER_SYMBOL, true) | ||
45 | .type(CONTAINED_SYMBOL, true) | 45 | .type(CONTAINED_SYMBOL, true) |
46 | .type(c1) | 46 | .type(c1, CONTAINER_SYMBOL) |
47 | .type(c2, CONTAINED_SYMBOL) | 47 | .type(c2, CONTAINED_SYMBOL) |
48 | .type(c3, CONTAINED_SYMBOL) | 48 | .type(c3, CONTAINED_SYMBOL) |
49 | .build(); | 49 | .build(); |
@@ -60,6 +60,7 @@ class DefaultContainmentTest { | |||
60 | 60 | ||
61 | var modelSeed = ModelSeed.builder(3) | 61 | var modelSeed = ModelSeed.builder(3) |
62 | .seed(COUNT_SYMBOL, builder -> builder.reducedValue(CardinalityIntervals.ONE)) | 62 | .seed(COUNT_SYMBOL, builder -> builder.reducedValue(CardinalityIntervals.ONE)) |
63 | .seed(CONTAINER_SYMBOL, builder -> builder.reducedValue(TruthValue.UNKNOWN)) | ||
63 | .seed(CONTAINED_SYMBOL, builder -> builder.reducedValue(TruthValue.UNKNOWN)) | 64 | .seed(CONTAINED_SYMBOL, builder -> builder.reducedValue(TruthValue.UNKNOWN)) |
64 | .seed(CONTAINS_SYMBOL, builder -> builder.reducedValue(TruthValue.UNKNOWN)) | 65 | .seed(CONTAINS_SYMBOL, builder -> builder.reducedValue(TruthValue.UNKNOWN)) |
65 | .seed(c1, builder -> builder | 66 | .seed(c1, builder -> builder |
diff --git a/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelTest.java b/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelTest.java index f8e9e1b5..f619d7dd 100644 --- a/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelTest.java +++ b/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelTest.java | |||
@@ -68,6 +68,8 @@ class MetamodelTest { | |||
68 | .reducedValue(CardinalityIntervals.ONE) | 68 | .reducedValue(CardinalityIntervals.ONE) |
69 | .put(Tuple.of(1), CardinalityIntervals.SET) | 69 | .put(Tuple.of(1), CardinalityIntervals.SET) |
70 | .put(Tuple.of(4), CardinalityIntervals.SET)) | 70 | .put(Tuple.of(4), CardinalityIntervals.SET)) |
71 | .seed(ContainmentHierarchyTranslator.CONTAINER_SYMBOL, builder -> builder | ||
72 | .reducedValue(TruthValue.UNKNOWN)) | ||
71 | .seed(ContainmentHierarchyTranslator.CONTAINED_SYMBOL, builder -> builder | 73 | .seed(ContainmentHierarchyTranslator.CONTAINED_SYMBOL, builder -> builder |
72 | .reducedValue(TruthValue.UNKNOWN)) | 74 | .reducedValue(TruthValue.UNKNOWN)) |
73 | .seed(ContainmentHierarchyTranslator.CONTAINS_SYMBOL, builder -> builder | 75 | .seed(ContainmentHierarchyTranslator.CONTAINS_SYMBOL, builder -> builder |
@@ -126,6 +128,8 @@ class MetamodelTest { | |||
126 | .reducedValue(CardinalityIntervals.ONE) | 128 | .reducedValue(CardinalityIntervals.ONE) |
127 | .put(Tuple.of(0), CardinalityIntervals.SET) | 129 | .put(Tuple.of(0), CardinalityIntervals.SET) |
128 | .put(Tuple.of(1), CardinalityIntervals.SET)) | 130 | .put(Tuple.of(1), CardinalityIntervals.SET)) |
131 | .seed(ContainmentHierarchyTranslator.CONTAINER_SYMBOL, builder -> builder | ||
132 | .reducedValue(TruthValue.UNKNOWN)) | ||
129 | .seed(ContainmentHierarchyTranslator.CONTAINED_SYMBOL, builder -> builder | 133 | .seed(ContainmentHierarchyTranslator.CONTAINED_SYMBOL, builder -> builder |
130 | .reducedValue(TruthValue.UNKNOWN)) | 134 | .reducedValue(TruthValue.UNKNOWN)) |
131 | .seed(ContainmentHierarchyTranslator.CONTAINS_SYMBOL, builder -> builder | 135 | .seed(ContainmentHierarchyTranslator.CONTAINS_SYMBOL, builder -> builder |