diff options
Diffstat (limited to 'subprojects/store-reasoning/src/main')
27 files changed, 99 insertions, 70 deletions
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/ReasoningAdapter.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/ReasoningAdapter.java index 7f0ef8b4..a9b3141a 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/ReasoningAdapter.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/ReasoningAdapter.java | |||
@@ -1,11 +1,12 @@ | |||
1 | /* | 1 | /* |
2 | * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/> | 2 | * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors <https://refinery.tools/> |
3 | * | 3 | * |
4 | * SPDX-License-Identifier: EPL-2.0 | 4 | * SPDX-License-Identifier: EPL-2.0 |
5 | */ | 5 | */ |
6 | package tools.refinery.store.reasoning; | 6 | package tools.refinery.store.reasoning; |
7 | 7 | ||
8 | import org.jetbrains.annotations.Nullable; | 8 | import org.jetbrains.annotations.Nullable; |
9 | import tools.refinery.logic.AbstractValue; | ||
9 | import tools.refinery.store.adapter.ModelAdapter; | 10 | import tools.refinery.store.adapter.ModelAdapter; |
10 | import tools.refinery.store.reasoning.internal.ReasoningBuilderImpl; | 11 | import tools.refinery.store.reasoning.internal.ReasoningBuilderImpl; |
11 | import tools.refinery.store.reasoning.interpretation.AnyPartialInterpretation; | 12 | import tools.refinery.store.reasoning.interpretation.AnyPartialInterpretation; |
@@ -27,17 +28,19 @@ public interface ReasoningAdapter extends ModelAdapter { | |||
27 | 28 | ||
28 | default AnyPartialInterpretation getPartialInterpretation(Concreteness concreteness, | 29 | default AnyPartialInterpretation getPartialInterpretation(Concreteness concreteness, |
29 | AnyPartialSymbol partialSymbol) { | 30 | AnyPartialSymbol partialSymbol) { |
30 | return getPartialInterpretation(concreteness, (PartialSymbol<?, ?>) partialSymbol); | 31 | var typedPartialSymbol = (PartialSymbol<?, ?>) partialSymbol; |
32 | return getPartialInterpretation(concreteness, typedPartialSymbol); | ||
31 | } | 33 | } |
32 | 34 | ||
33 | <A, C> PartialInterpretation<A, C> getPartialInterpretation(Concreteness concreteness, | 35 | <A extends AbstractValue<A, C>, C> PartialInterpretation<A, C> getPartialInterpretation( |
34 | PartialSymbol<A, C> partialSymbol); | 36 | Concreteness concreteness, PartialSymbol<A, C> partialSymbol); |
35 | 37 | ||
36 | default AnyPartialInterpretationRefiner getRefiner(AnyPartialSymbol partialSymbol) { | 38 | default AnyPartialInterpretationRefiner getRefiner(AnyPartialSymbol partialSymbol) { |
37 | return getRefiner((PartialSymbol<?, ?>) partialSymbol); | 39 | var typedPartialSymbol = (PartialSymbol<?, ?>) partialSymbol; |
40 | return getRefiner(typedPartialSymbol); | ||
38 | } | 41 | } |
39 | 42 | ||
40 | <A, C> PartialInterpretationRefiner<A, C> getRefiner(PartialSymbol<A, C> partialSymbol); | 43 | <A extends AbstractValue<A, C>, C> PartialInterpretationRefiner<A, C> getRefiner(PartialSymbol<A, C> partialSymbol); |
41 | 44 | ||
42 | @Nullable | 45 | @Nullable |
43 | Tuple1 split(int parentMultiObject); | 46 | Tuple1 split(int parentMultiObject); |
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/actions/MergeActionLiteral.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/actions/MergeActionLiteral.java index 79e0237c..86256331 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/actions/MergeActionLiteral.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/actions/MergeActionLiteral.java | |||
@@ -1,10 +1,11 @@ | |||
1 | /* | 1 | /* |
2 | * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/> | 2 | * SPDX-FileCopyrightText: 2023-2024 The Refinery Authors <https://refinery.tools/> |
3 | * | 3 | * |
4 | * SPDX-License-Identifier: EPL-2.0 | 4 | * SPDX-License-Identifier: EPL-2.0 |
5 | */ | 5 | */ |
6 | package tools.refinery.store.reasoning.actions; | 6 | package tools.refinery.store.reasoning.actions; |
7 | 7 | ||
8 | import tools.refinery.logic.AbstractValue; | ||
8 | import tools.refinery.store.dse.transition.actions.AbstractActionLiteral; | 9 | import tools.refinery.store.dse.transition.actions.AbstractActionLiteral; |
9 | import tools.refinery.store.dse.transition.actions.BoundActionLiteral; | 10 | import tools.refinery.store.dse.transition.actions.BoundActionLiteral; |
10 | import tools.refinery.store.model.Model; | 11 | import tools.refinery.store.model.Model; |
@@ -15,7 +16,7 @@ import tools.refinery.store.tuple.Tuple; | |||
15 | 16 | ||
16 | import java.util.List; | 17 | import java.util.List; |
17 | 18 | ||
18 | public class MergeActionLiteral<A, C> extends AbstractActionLiteral { | 19 | public class MergeActionLiteral<A extends AbstractValue<A, C>, C> extends AbstractActionLiteral { |
19 | private final PartialSymbol<A, C> partialSymbol; | 20 | private final PartialSymbol<A, C> partialSymbol; |
20 | private final List<NodeVariable> parameters; | 21 | private final List<NodeVariable> parameters; |
21 | private final A value; | 22 | private final A value; |
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/actions/PartialActionLiterals.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/actions/PartialActionLiterals.java index 7b4c5446..e8e6880a 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/actions/PartialActionLiterals.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/actions/PartialActionLiterals.java | |||
@@ -5,6 +5,7 @@ | |||
5 | */ | 5 | */ |
6 | package tools.refinery.store.reasoning.actions; | 6 | package tools.refinery.store.reasoning.actions; |
7 | 7 | ||
8 | import tools.refinery.logic.AbstractValue; | ||
8 | import tools.refinery.logic.term.NodeVariable; | 9 | import tools.refinery.logic.term.NodeVariable; |
9 | import tools.refinery.store.reasoning.representation.PartialRelation; | 10 | import tools.refinery.store.reasoning.representation.PartialRelation; |
10 | import tools.refinery.store.reasoning.representation.PartialSymbol; | 11 | import tools.refinery.store.reasoning.representation.PartialSymbol; |
@@ -17,8 +18,8 @@ public final class PartialActionLiterals { | |||
17 | throw new IllegalStateException("This is a static utility class and should not be instantiated directly"); | 18 | throw new IllegalStateException("This is a static utility class and should not be instantiated directly"); |
18 | } | 19 | } |
19 | 20 | ||
20 | public static <A, C> MergeActionLiteral<A, C> merge(PartialSymbol<A, C> partialSymbol, A value, | 21 | public static <A extends AbstractValue<A, C>, C> MergeActionLiteral<A, C> merge( |
21 | NodeVariable... parameters) { | 22 | PartialSymbol<A, C> partialSymbol, A value, NodeVariable... parameters) { |
22 | return new MergeActionLiteral<>(partialSymbol, value, List.of(parameters)); | 23 | return new MergeActionLiteral<>(partialSymbol, value, List.of(parameters)); |
23 | } | 24 | } |
24 | 25 | ||
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/internal/ReasoningAdapterImpl.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/internal/ReasoningAdapterImpl.java index a287cce3..386ae1d8 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/internal/ReasoningAdapterImpl.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/internal/ReasoningAdapterImpl.java | |||
@@ -1,11 +1,12 @@ | |||
1 | /* | 1 | /* |
2 | * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/> | 2 | * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors <https://refinery.tools/> |
3 | * | 3 | * |
4 | * SPDX-License-Identifier: EPL-2.0 | 4 | * SPDX-License-Identifier: EPL-2.0 |
5 | */ | 5 | */ |
6 | package tools.refinery.store.reasoning.internal; | 6 | package tools.refinery.store.reasoning.internal; |
7 | 7 | ||
8 | import org.jetbrains.annotations.Nullable; | 8 | import org.jetbrains.annotations.Nullable; |
9 | import tools.refinery.logic.AbstractValue; | ||
9 | import tools.refinery.store.model.Interpretation; | 10 | import tools.refinery.store.model.Interpretation; |
10 | import tools.refinery.store.model.Model; | 11 | import tools.refinery.store.model.Model; |
11 | import tools.refinery.store.reasoning.ReasoningAdapter; | 12 | import tools.refinery.store.reasoning.ReasoningAdapter; |
@@ -49,7 +50,7 @@ class ReasoningAdapterImpl implements ReasoningAdapter { | |||
49 | createPartialInterpretations(); | 50 | createPartialInterpretations(); |
50 | 51 | ||
51 | var refinerFactories = storeAdapter.getSymbolRefiners(); | 52 | var refinerFactories = storeAdapter.getSymbolRefiners(); |
52 | refiners = new HashMap<>(refinerFactories.size()); | 53 | refiners = HashMap.newHashMap(refinerFactories.size()); |
53 | createRefiners(); | 54 | createRefiners(); |
54 | 55 | ||
55 | storageRefiners = storeAdapter.createStorageRefiner(model); | 56 | storageRefiners = storeAdapter.createStorageRefiner(model); |
@@ -69,7 +70,7 @@ class ReasoningAdapterImpl implements ReasoningAdapter { | |||
69 | for (int i = 0; i < concretenessLength; i++) { | 70 | for (int i = 0; i < concretenessLength; i++) { |
70 | var concreteness = Concreteness.values()[i]; | 71 | var concreteness = Concreteness.values()[i]; |
71 | if (supportedInterpretations.contains(concreteness)) { | 72 | if (supportedInterpretations.contains(concreteness)) { |
72 | partialInterpretations[i] = new HashMap<>(interpretationFactories.size()); | 73 | partialInterpretations[i] = HashMap.newHashMap(interpretationFactories.size()); |
73 | } | 74 | } |
74 | } | 75 | } |
75 | // Create the partial interpretations in order so that factories may refer to interpretations of symbols | 76 | // Create the partial interpretations in order so that factories may refer to interpretations of symbols |
@@ -87,7 +88,7 @@ class ReasoningAdapterImpl implements ReasoningAdapter { | |||
87 | } | 88 | } |
88 | } | 89 | } |
89 | 90 | ||
90 | private <A, C> PartialInterpretation<A, C> createPartialInterpretation( | 91 | private <A extends AbstractValue<A, C>, C> PartialInterpretation<A, C> createPartialInterpretation( |
91 | Concreteness concreteness, PartialInterpretation.Factory<A, C> interpreter, AnyPartialSymbol symbol) { | 92 | Concreteness concreteness, PartialInterpretation.Factory<A, C> interpreter, AnyPartialSymbol symbol) { |
92 | // The builder only allows well-typed assignment of interpreters to symbols. | 93 | // The builder only allows well-typed assignment of interpreters to symbols. |
93 | @SuppressWarnings("unchecked") | 94 | @SuppressWarnings("unchecked") |
@@ -107,7 +108,7 @@ class ReasoningAdapterImpl implements ReasoningAdapter { | |||
107 | } | 108 | } |
108 | } | 109 | } |
109 | 110 | ||
110 | private <A, C> PartialInterpretationRefiner<A, C> createRefiner( | 111 | private <A extends AbstractValue<A, C>, C> PartialInterpretationRefiner<A, C> createRefiner( |
111 | PartialInterpretationRefiner.Factory<A, C> factory, AnyPartialSymbol symbol) { | 112 | PartialInterpretationRefiner.Factory<A, C> factory, AnyPartialSymbol symbol) { |
112 | // The builder only allows well-typed assignment of interpreters to symbols. | 113 | // The builder only allows well-typed assignment of interpreters to symbols. |
113 | @SuppressWarnings("unchecked") | 114 | @SuppressWarnings("unchecked") |
@@ -126,8 +127,8 @@ class ReasoningAdapterImpl implements ReasoningAdapter { | |||
126 | } | 127 | } |
127 | 128 | ||
128 | @Override | 129 | @Override |
129 | public <A, C> PartialInterpretation<A, C> getPartialInterpretation(Concreteness concreteness, | 130 | public <A extends AbstractValue<A, C>, C> PartialInterpretation<A, C> getPartialInterpretation( |
130 | PartialSymbol<A, C> partialSymbol) { | 131 | Concreteness concreteness, PartialSymbol<A, C> partialSymbol) { |
131 | var map = partialInterpretations[concreteness.ordinal()]; | 132 | var map = partialInterpretations[concreteness.ordinal()]; |
132 | if (map == null) { | 133 | if (map == null) { |
133 | throw new IllegalArgumentException("No interpretation for concreteness: " + concreteness); | 134 | throw new IllegalArgumentException("No interpretation for concreteness: " + concreteness); |
@@ -143,7 +144,8 @@ class ReasoningAdapterImpl implements ReasoningAdapter { | |||
143 | } | 144 | } |
144 | 145 | ||
145 | @Override | 146 | @Override |
146 | public <A, C> PartialInterpretationRefiner<A, C> getRefiner(PartialSymbol<A, C> partialSymbol) { | 147 | public <A extends AbstractValue<A, C>, C> PartialInterpretationRefiner<A, C> getRefiner( |
148 | PartialSymbol<A, C> partialSymbol) { | ||
147 | var refiner = refiners.get(partialSymbol); | 149 | var refiner = refiners.get(partialSymbol); |
148 | if (refiner == null) { | 150 | if (refiner == null) { |
149 | throw new IllegalArgumentException("No refiner for partial symbol: " + partialSymbol); | 151 | throw new IllegalArgumentException("No refiner for partial symbol: " + partialSymbol); |
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/interpretation/AbstractPartialInterpretation.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/interpretation/AbstractPartialInterpretation.java index ed291eac..4f51957b 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/interpretation/AbstractPartialInterpretation.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/interpretation/AbstractPartialInterpretation.java | |||
@@ -5,11 +5,13 @@ | |||
5 | */ | 5 | */ |
6 | package tools.refinery.store.reasoning.interpretation; | 6 | package tools.refinery.store.reasoning.interpretation; |
7 | 7 | ||
8 | import tools.refinery.logic.AbstractValue; | ||
8 | import tools.refinery.store.reasoning.ReasoningAdapter; | 9 | import tools.refinery.store.reasoning.ReasoningAdapter; |
9 | import tools.refinery.store.reasoning.literal.Concreteness; | 10 | import tools.refinery.store.reasoning.literal.Concreteness; |
10 | import tools.refinery.store.reasoning.representation.PartialSymbol; | 11 | import tools.refinery.store.reasoning.representation.PartialSymbol; |
11 | 12 | ||
12 | public abstract class AbstractPartialInterpretation<A, C> implements PartialInterpretation<A, C> { | 13 | public abstract class AbstractPartialInterpretation<A extends AbstractValue<A, C>, C> |
14 | implements PartialInterpretation<A, C> { | ||
13 | private final ReasoningAdapter adapter; | 15 | private final ReasoningAdapter adapter; |
14 | private final PartialSymbol<A, C> partialSymbol; | 16 | private final PartialSymbol<A, C> partialSymbol; |
15 | private final Concreteness concreteness; | 17 | private final Concreteness concreteness; |
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/interpretation/PartialInterpretation.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/interpretation/PartialInterpretation.java index 86ffe751..5a304030 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/interpretation/PartialInterpretation.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/interpretation/PartialInterpretation.java | |||
@@ -1,10 +1,11 @@ | |||
1 | /* | 1 | /* |
2 | * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/> | 2 | * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors <https://refinery.tools/> |
3 | * | 3 | * |
4 | * SPDX-License-Identifier: EPL-2.0 | 4 | * SPDX-License-Identifier: EPL-2.0 |
5 | */ | 5 | */ |
6 | package tools.refinery.store.reasoning.interpretation; | 6 | package tools.refinery.store.reasoning.interpretation; |
7 | 7 | ||
8 | import tools.refinery.logic.AbstractValue; | ||
8 | import tools.refinery.store.map.Cursor; | 9 | import tools.refinery.store.map.Cursor; |
9 | import tools.refinery.store.model.ModelStoreBuilder; | 10 | import tools.refinery.store.model.ModelStoreBuilder; |
10 | import tools.refinery.store.reasoning.ReasoningAdapter; | 11 | import tools.refinery.store.reasoning.ReasoningAdapter; |
@@ -14,7 +15,7 @@ import tools.refinery.store.tuple.Tuple; | |||
14 | 15 | ||
15 | import java.util.Set; | 16 | import java.util.Set; |
16 | 17 | ||
17 | public non-sealed interface PartialInterpretation<A, C> extends AnyPartialInterpretation { | 18 | public non-sealed interface PartialInterpretation<A extends AbstractValue<A, C>, C> extends AnyPartialInterpretation { |
18 | @Override | 19 | @Override |
19 | PartialSymbol<A, C> getPartialSymbol(); | 20 | PartialSymbol<A, C> getPartialSymbol(); |
20 | 21 | ||
@@ -23,7 +24,7 @@ public non-sealed interface PartialInterpretation<A, C> extends AnyPartialInterp | |||
23 | Cursor<Tuple, A> getAll(); | 24 | Cursor<Tuple, A> getAll(); |
24 | 25 | ||
25 | @FunctionalInterface | 26 | @FunctionalInterface |
26 | interface Factory<A, C> { | 27 | interface Factory<A extends AbstractValue<A, C>, C> { |
27 | PartialInterpretation<A, C> create(ReasoningAdapter adapter, Concreteness concreteness, | 28 | PartialInterpretation<A, C> create(ReasoningAdapter adapter, Concreteness concreteness, |
28 | PartialSymbol<A, C> partialSymbol); | 29 | PartialSymbol<A, C> partialSymbol); |
29 | 30 | ||
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/AbstractPartialInterpretationRefiner.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/AbstractPartialInterpretationRefiner.java index a7fc5b7e..42943490 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/AbstractPartialInterpretationRefiner.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/AbstractPartialInterpretationRefiner.java | |||
@@ -1,14 +1,16 @@ | |||
1 | /* | 1 | /* |
2 | * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/> | 2 | * SPDX-FileCopyrightText: 2023-2024 The Refinery Authors <https://refinery.tools/> |
3 | * | 3 | * |
4 | * SPDX-License-Identifier: EPL-2.0 | 4 | * SPDX-License-Identifier: EPL-2.0 |
5 | */ | 5 | */ |
6 | package tools.refinery.store.reasoning.refinement; | 6 | package tools.refinery.store.reasoning.refinement; |
7 | 7 | ||
8 | import tools.refinery.logic.AbstractValue; | ||
8 | import tools.refinery.store.reasoning.ReasoningAdapter; | 9 | import tools.refinery.store.reasoning.ReasoningAdapter; |
9 | import tools.refinery.store.reasoning.representation.PartialSymbol; | 10 | import tools.refinery.store.reasoning.representation.PartialSymbol; |
10 | 11 | ||
11 | public abstract class AbstractPartialInterpretationRefiner<A, C> implements PartialInterpretationRefiner<A, C> { | 12 | public abstract class AbstractPartialInterpretationRefiner<A extends AbstractValue<A, C>, C> |
13 | implements PartialInterpretationRefiner<A, C> { | ||
12 | private final ReasoningAdapter adapter; | 14 | private final ReasoningAdapter adapter; |
13 | private final PartialSymbol<A, C> partialSymbol; | 15 | private final PartialSymbol<A, C> partialSymbol; |
14 | 16 | ||
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/ConcreteSymbolRefiner.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/ConcreteSymbolRefiner.java index ebb9b824..d6ac0e9d 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/ConcreteSymbolRefiner.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/ConcreteSymbolRefiner.java | |||
@@ -1,10 +1,11 @@ | |||
1 | /* | 1 | /* |
2 | * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/> | 2 | * SPDX-FileCopyrightText: 2023-2024 The Refinery Authors <https://refinery.tools/> |
3 | * | 3 | * |
4 | * SPDX-License-Identifier: EPL-2.0 | 4 | * SPDX-License-Identifier: EPL-2.0 |
5 | */ | 5 | */ |
6 | package tools.refinery.store.reasoning.refinement; | 6 | package tools.refinery.store.reasoning.refinement; |
7 | 7 | ||
8 | import tools.refinery.logic.AbstractValue; | ||
8 | import tools.refinery.store.model.Interpretation; | 9 | import tools.refinery.store.model.Interpretation; |
9 | import tools.refinery.store.reasoning.ReasoningAdapter; | 10 | import tools.refinery.store.reasoning.ReasoningAdapter; |
10 | import tools.refinery.store.reasoning.representation.PartialSymbol; | 11 | import tools.refinery.store.reasoning.representation.PartialSymbol; |
@@ -13,7 +14,8 @@ import tools.refinery.store.tuple.Tuple; | |||
13 | 14 | ||
14 | import java.util.Objects; | 15 | import java.util.Objects; |
15 | 16 | ||
16 | public class ConcreteSymbolRefiner<A, C> extends AbstractPartialInterpretationRefiner<A, C> { | 17 | public class ConcreteSymbolRefiner<A extends AbstractValue<A, C>, C> |
18 | extends AbstractPartialInterpretationRefiner<A, C> { | ||
17 | private final Interpretation<A> interpretation; | 19 | private final Interpretation<A> interpretation; |
18 | 20 | ||
19 | public ConcreteSymbolRefiner(ReasoningAdapter adapter, PartialSymbol<A, C> partialSymbol, | 21 | public ConcreteSymbolRefiner(ReasoningAdapter adapter, PartialSymbol<A, C> partialSymbol, |
@@ -25,14 +27,14 @@ public class ConcreteSymbolRefiner<A, C> extends AbstractPartialInterpretationRe | |||
25 | @Override | 27 | @Override |
26 | public boolean merge(Tuple key, A value) { | 28 | public boolean merge(Tuple key, A value) { |
27 | var currentValue = interpretation.get(key); | 29 | var currentValue = interpretation.get(key); |
28 | var mergedValue = getPartialSymbol().abstractDomain().commonRefinement(currentValue, value); | 30 | var mergedValue = currentValue.meet(value); |
29 | if (!Objects.equals(currentValue, mergedValue)) { | 31 | if (!Objects.equals(currentValue, mergedValue)) { |
30 | interpretation.put(key, mergedValue); | 32 | interpretation.put(key, mergedValue); |
31 | } | 33 | } |
32 | return true; | 34 | return true; |
33 | } | 35 | } |
34 | 36 | ||
35 | public static <A1, C1> Factory<A1, C1> of(Symbol<A1> concreteSymbol) { | 37 | public static <A1 extends AbstractValue<A1, C1>, C1> Factory<A1, C1> of(Symbol<A1> concreteSymbol) { |
36 | return (adapter, partialSymbol) -> new ConcreteSymbolRefiner<>(adapter, partialSymbol, concreteSymbol); | 38 | return (adapter, partialSymbol) -> new ConcreteSymbolRefiner<>(adapter, partialSymbol, concreteSymbol); |
37 | } | 39 | } |
38 | } | 40 | } |
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/PartialInterpretationRefiner.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/PartialInterpretationRefiner.java index f48d1d1f..c8b182b8 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/PartialInterpretationRefiner.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/PartialInterpretationRefiner.java | |||
@@ -1,22 +1,24 @@ | |||
1 | /* | 1 | /* |
2 | * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/> | 2 | * SPDX-FileCopyrightText: 2023-2024 The Refinery Authors <https://refinery.tools/> |
3 | * | 3 | * |
4 | * SPDX-License-Identifier: EPL-2.0 | 4 | * SPDX-License-Identifier: EPL-2.0 |
5 | */ | 5 | */ |
6 | package tools.refinery.store.reasoning.refinement; | 6 | package tools.refinery.store.reasoning.refinement; |
7 | 7 | ||
8 | import tools.refinery.logic.AbstractValue; | ||
8 | import tools.refinery.store.reasoning.ReasoningAdapter; | 9 | import tools.refinery.store.reasoning.ReasoningAdapter; |
9 | import tools.refinery.store.reasoning.representation.PartialSymbol; | 10 | import tools.refinery.store.reasoning.representation.PartialSymbol; |
10 | import tools.refinery.store.tuple.Tuple; | 11 | import tools.refinery.store.tuple.Tuple; |
11 | 12 | ||
12 | public non-sealed interface PartialInterpretationRefiner<A, C> extends AnyPartialInterpretationRefiner { | 13 | public non-sealed interface PartialInterpretationRefiner<A extends AbstractValue<A, C>, C> |
14 | extends AnyPartialInterpretationRefiner { | ||
13 | @Override | 15 | @Override |
14 | PartialSymbol<A, C> getPartialSymbol(); | 16 | PartialSymbol<A, C> getPartialSymbol(); |
15 | 17 | ||
16 | boolean merge(Tuple key, A value); | 18 | boolean merge(Tuple key, A value); |
17 | 19 | ||
18 | @FunctionalInterface | 20 | @FunctionalInterface |
19 | interface Factory<A, C> { | 21 | interface Factory<A extends AbstractValue<A, C>, C> { |
20 | PartialInterpretationRefiner<A, C> create(ReasoningAdapter adapter, PartialSymbol<A, C> partialSymbol); | 22 | PartialInterpretationRefiner<A, C> create(ReasoningAdapter adapter, PartialSymbol<A, C> partialSymbol); |
21 | } | 23 | } |
22 | } | 24 | } |
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/RefinementBasedInitializer.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/RefinementBasedInitializer.java index b6bccb01..1a2c03a6 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/RefinementBasedInitializer.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/refinement/RefinementBasedInitializer.java | |||
@@ -1,16 +1,17 @@ | |||
1 | /* | 1 | /* |
2 | * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/> | 2 | * SPDX-FileCopyrightText: 2023-2024 The Refinery Authors <https://refinery.tools/> |
3 | * | 3 | * |
4 | * SPDX-License-Identifier: EPL-2.0 | 4 | * SPDX-License-Identifier: EPL-2.0 |
5 | */ | 5 | */ |
6 | package tools.refinery.store.reasoning.refinement; | 6 | package tools.refinery.store.reasoning.refinement; |
7 | 7 | ||
8 | import tools.refinery.logic.AbstractValue; | ||
8 | import tools.refinery.store.model.Model; | 9 | import tools.refinery.store.model.Model; |
9 | import tools.refinery.store.reasoning.ReasoningAdapter; | 10 | import tools.refinery.store.reasoning.ReasoningAdapter; |
10 | import tools.refinery.store.reasoning.representation.PartialSymbol; | 11 | import tools.refinery.store.reasoning.representation.PartialSymbol; |
11 | import tools.refinery.store.reasoning.seed.ModelSeed; | 12 | import tools.refinery.store.reasoning.seed.ModelSeed; |
12 | 13 | ||
13 | public class RefinementBasedInitializer<A, C> implements PartialModelInitializer { | 14 | public class RefinementBasedInitializer<A extends AbstractValue<A, C>, C> implements PartialModelInitializer { |
14 | private final PartialSymbol<A, C> partialSymbol; | 15 | private final PartialSymbol<A, C> partialSymbol; |
15 | 16 | ||
16 | public RefinementBasedInitializer(PartialSymbol<A, C> partialSymbol) { | 17 | public RefinementBasedInitializer(PartialSymbol<A, C> partialSymbol) { |
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/representation/PartialFunction.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/representation/PartialFunction.java index 236be7f8..88b98da8 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/representation/PartialFunction.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/representation/PartialFunction.java | |||
@@ -1,14 +1,16 @@ | |||
1 | /* | 1 | /* |
2 | * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/> | 2 | * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors <https://refinery.tools/> |
3 | * | 3 | * |
4 | * SPDX-License-Identifier: EPL-2.0 | 4 | * SPDX-License-Identifier: EPL-2.0 |
5 | */ | 5 | */ |
6 | package tools.refinery.store.reasoning.representation; | 6 | package tools.refinery.store.reasoning.representation; |
7 | 7 | ||
8 | import tools.refinery.logic.AbstractDomain; | 8 | import tools.refinery.logic.AbstractDomain; |
9 | import tools.refinery.logic.AbstractValue; | ||
9 | 10 | ||
10 | public record PartialFunction<A, C>(String name, int arity, AbstractDomain<A, C> abstractDomain) | 11 | public record PartialFunction<A extends AbstractValue<A, C>, C>( |
11 | implements AnyPartialFunction, PartialSymbol<A, C> { | 12 | String name, int arity, AbstractDomain<A, C> abstractDomain) implements AnyPartialFunction, |
13 | PartialSymbol<A, C> { | ||
12 | @Override | 14 | @Override |
13 | public A defaultValue() { | 15 | public A defaultValue() { |
14 | return null; | 16 | return null; |
@@ -21,7 +23,7 @@ public record PartialFunction<A, C>(String name, int arity, AbstractDomain<A, C> | |||
21 | 23 | ||
22 | @Override | 24 | @Override |
23 | public int hashCode() { | 25 | public int hashCode() { |
24 | // Compare by identity to make hash table lookups more efficient. | 26 | // Compare by identity to make hash table look-ups more efficient. |
25 | return System.identityHashCode(this); | 27 | return System.identityHashCode(this); |
26 | } | 28 | } |
27 | 29 | ||
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/representation/PartialSymbol.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/representation/PartialSymbol.java index 6986d518..21cbfefa 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/representation/PartialSymbol.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/representation/PartialSymbol.java | |||
@@ -1,13 +1,15 @@ | |||
1 | /* | 1 | /* |
2 | * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/> | 2 | * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors <https://refinery.tools/> |
3 | * | 3 | * |
4 | * SPDX-License-Identifier: EPL-2.0 | 4 | * SPDX-License-Identifier: EPL-2.0 |
5 | */ | 5 | */ |
6 | package tools.refinery.store.reasoning.representation; | 6 | package tools.refinery.store.reasoning.representation; |
7 | 7 | ||
8 | import tools.refinery.logic.AbstractDomain; | 8 | import tools.refinery.logic.AbstractDomain; |
9 | import tools.refinery.logic.AbstractValue; | ||
9 | 10 | ||
10 | public sealed interface PartialSymbol<A, C> extends AnyPartialSymbol permits PartialFunction, PartialRelation { | 11 | public sealed interface PartialSymbol<A extends AbstractValue<A, C>, C> extends AnyPartialSymbol |
12 | permits PartialFunction, PartialRelation { | ||
11 | @Override | 13 | @Override |
12 | AbstractDomain<A, C> abstractDomain(); | 14 | AbstractDomain<A, C> abstractDomain(); |
13 | 15 | ||
@@ -17,7 +19,8 @@ public sealed interface PartialSymbol<A, C> extends AnyPartialSymbol permits Par | |||
17 | return new PartialRelation(name, arity); | 19 | return new PartialRelation(name, arity); |
18 | } | 20 | } |
19 | 21 | ||
20 | static <A, C> PartialFunction<A, C> of(String name, int arity, AbstractDomain<A, C> abstractDomain) { | 22 | static <A extends AbstractValue<A, C>, C> PartialFunction<A, C> of( |
23 | String name, int arity, AbstractDomain<A, C> abstractDomain) { | ||
21 | return new PartialFunction<>(name, arity, abstractDomain); | 24 | return new PartialFunction<>(name, arity, abstractDomain); |
22 | } | 25 | } |
23 | } | 26 | } |
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/seed/ModelSeed.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/seed/ModelSeed.java index e6b3eaf9..9cd4862b 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/seed/ModelSeed.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/seed/ModelSeed.java | |||
@@ -1,10 +1,11 @@ | |||
1 | /* | 1 | /* |
2 | * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/> | 2 | * SPDX-FileCopyrightText: 2023-2024 The Refinery Authors <https://refinery.tools/> |
3 | * | 3 | * |
4 | * SPDX-License-Identifier: EPL-2.0 | 4 | * SPDX-License-Identifier: EPL-2.0 |
5 | */ | 5 | */ |
6 | package tools.refinery.store.reasoning.seed; | 6 | package tools.refinery.store.reasoning.seed; |
7 | 7 | ||
8 | import tools.refinery.logic.AbstractValue; | ||
8 | import tools.refinery.store.map.Cursor; | 9 | import tools.refinery.store.map.Cursor; |
9 | import tools.refinery.store.reasoning.representation.AnyPartialSymbol; | 10 | import tools.refinery.store.reasoning.representation.AnyPartialSymbol; |
10 | import tools.refinery.store.reasoning.representation.PartialSymbol; | 11 | import tools.refinery.store.reasoning.representation.PartialSymbol; |
@@ -29,7 +30,7 @@ public class ModelSeed { | |||
29 | return nodeCount; | 30 | return nodeCount; |
30 | } | 31 | } |
31 | 32 | ||
32 | public <A> Seed<A> getSeed(PartialSymbol<A, ?> partialSymbol) { | 33 | public <A extends AbstractValue<A, ?>> Seed<A> getSeed(PartialSymbol<A, ?> partialSymbol) { |
33 | var seed = seeds.get(partialSymbol); | 34 | var seed = seeds.get(partialSymbol); |
34 | if (seed == null) { | 35 | if (seed == null) { |
35 | throw new IllegalArgumentException("No seed for partial symbol " + partialSymbol); | 36 | throw new IllegalArgumentException("No seed for partial symbol " + partialSymbol); |
@@ -48,7 +49,8 @@ public class ModelSeed { | |||
48 | return Collections.unmodifiableSet(seeds.keySet()); | 49 | return Collections.unmodifiableSet(seeds.keySet()); |
49 | } | 50 | } |
50 | 51 | ||
51 | public <A> Cursor<Tuple, A> getCursor(PartialSymbol<A, ?> partialSymbol, A defaultValue) { | 52 | public <A extends AbstractValue<A, ?>> Cursor<Tuple, A> getCursor(PartialSymbol<A, ?> partialSymbol, |
53 | A defaultValue) { | ||
52 | return getSeed(partialSymbol).getCursor(defaultValue, nodeCount); | 54 | return getSeed(partialSymbol).getCursor(defaultValue, nodeCount); |
53 | } | 55 | } |
54 | 56 | ||
@@ -67,7 +69,7 @@ public class ModelSeed { | |||
67 | this.nodeCount = nodeCount; | 69 | this.nodeCount = nodeCount; |
68 | } | 70 | } |
69 | 71 | ||
70 | public <A> Builder seed(PartialSymbol<A, ?> partialSymbol, Seed<A> seed) { | 72 | public <A extends AbstractValue<A, ?>> Builder seed(PartialSymbol<A, ?> partialSymbol, Seed<A> seed) { |
71 | if (seed.arity() != partialSymbol.arity()) { | 73 | if (seed.arity() != partialSymbol.arity()) { |
72 | throw new IllegalStateException("Expected seed of arity %d for partial symbol %s, but got %d instead" | 74 | throw new IllegalStateException("Expected seed of arity %d for partial symbol %s, but got %d instead" |
73 | .formatted(partialSymbol.arity(), partialSymbol, seed.arity())); | 75 | .formatted(partialSymbol.arity(), partialSymbol, seed.arity())); |
@@ -82,7 +84,8 @@ public class ModelSeed { | |||
82 | return this; | 84 | return this; |
83 | } | 85 | } |
84 | 86 | ||
85 | public <A> Builder seed(PartialSymbol<A, ?> partialSymbol, Consumer<Seed.Builder<A>> callback) { | 87 | public <A extends AbstractValue<A, ?>> Builder seed(PartialSymbol<A, ?> partialSymbol, |
88 | Consumer<Seed.Builder<A>> callback) { | ||
86 | var builder = Seed.builder(partialSymbol); | 89 | var builder = Seed.builder(partialSymbol); |
87 | callback.accept(builder); | 90 | callback.accept(builder); |
88 | return seed(partialSymbol, builder.build()); | 91 | return seed(partialSymbol, builder.build()); |
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/seed/Seed.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/seed/Seed.java index d9bad866..32562f01 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/seed/Seed.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/seed/Seed.java | |||
@@ -1,10 +1,11 @@ | |||
1 | /* | 1 | /* |
2 | * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors <https://refinery.tools/> | 2 | * SPDX-FileCopyrightText: 2021-2024 The Refinery Authors <https://refinery.tools/> |
3 | * | 3 | * |
4 | * SPDX-License-Identifier: EPL-2.0 | 4 | * SPDX-License-Identifier: EPL-2.0 |
5 | */ | 5 | */ |
6 | package tools.refinery.store.reasoning.seed; | 6 | package tools.refinery.store.reasoning.seed; |
7 | 7 | ||
8 | import tools.refinery.logic.AbstractValue; | ||
8 | import tools.refinery.store.map.Cursor; | 9 | import tools.refinery.store.map.Cursor; |
9 | import tools.refinery.store.reasoning.representation.PartialSymbol; | 10 | import tools.refinery.store.reasoning.representation.PartialSymbol; |
10 | import tools.refinery.store.representation.Symbol; | 11 | import tools.refinery.store.representation.Symbol; |
@@ -33,7 +34,7 @@ public interface Seed<T> { | |||
33 | return builder(symbol.arity(), symbol.valueType(), symbol.defaultValue()); | 34 | return builder(symbol.arity(), symbol.valueType(), symbol.defaultValue()); |
34 | } | 35 | } |
35 | 36 | ||
36 | static <T> Builder<T> builder(PartialSymbol<T, ?> partialSymbol) { | 37 | static <T extends AbstractValue<T, ?>> Builder<T> builder(PartialSymbol<T, ?> partialSymbol) { |
37 | return builder(partialSymbol.arity(), partialSymbol.abstractDomain().abstractType(), | 38 | return builder(partialSymbol.arity(), partialSymbol.abstractDomain().abstractType(), |
38 | partialSymbol.defaultValue()); | 39 | partialSymbol.defaultValue()); |
39 | } | 40 | } |
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/seed/SeedInitializer.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/seed/SeedInitializer.java index 9af457d8..138e3a64 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/seed/SeedInitializer.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/seed/SeedInitializer.java | |||
@@ -1,16 +1,17 @@ | |||
1 | /* | 1 | /* |
2 | * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/> | 2 | * SPDX-FileCopyrightText: 2023-2024 The Refinery Authors <https://refinery.tools/> |
3 | * | 3 | * |
4 | * SPDX-License-Identifier: EPL-2.0 | 4 | * SPDX-License-Identifier: EPL-2.0 |
5 | */ | 5 | */ |
6 | package tools.refinery.store.reasoning.seed; | 6 | package tools.refinery.store.reasoning.seed; |
7 | 7 | ||
8 | import tools.refinery.logic.AbstractValue; | ||
8 | import tools.refinery.store.model.Model; | 9 | import tools.refinery.store.model.Model; |
9 | import tools.refinery.store.reasoning.refinement.PartialModelInitializer; | 10 | import tools.refinery.store.reasoning.refinement.PartialModelInitializer; |
10 | import tools.refinery.store.reasoning.representation.PartialSymbol; | 11 | import tools.refinery.store.reasoning.representation.PartialSymbol; |
11 | import tools.refinery.store.representation.Symbol; | 12 | import tools.refinery.store.representation.Symbol; |
12 | 13 | ||
13 | public class SeedInitializer<T> implements PartialModelInitializer { | 14 | public class SeedInitializer<T extends AbstractValue<T, ?>> implements PartialModelInitializer { |
14 | private final Symbol<T> symbol; | 15 | private final Symbol<T> symbol; |
15 | private final PartialSymbol<T, ?> partialSymbol; | 16 | private final PartialSymbol<T, ?> partialSymbol; |
16 | 17 | ||
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/PartialSymbolTranslator.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/PartialSymbolTranslator.java index 6cdb287d..f2583098 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/PartialSymbolTranslator.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/PartialSymbolTranslator.java | |||
@@ -6,6 +6,7 @@ | |||
6 | package tools.refinery.store.reasoning.translator; | 6 | package tools.refinery.store.reasoning.translator; |
7 | 7 | ||
8 | import org.jetbrains.annotations.Nullable; | 8 | import org.jetbrains.annotations.Nullable; |
9 | import tools.refinery.logic.AbstractValue; | ||
9 | import tools.refinery.store.dse.transition.DesignSpaceExplorationBuilder; | 10 | import tools.refinery.store.dse.transition.DesignSpaceExplorationBuilder; |
10 | import tools.refinery.store.dse.transition.Rule; | 11 | import tools.refinery.store.dse.transition.Rule; |
11 | import tools.refinery.store.dse.transition.objectives.Criterion; | 12 | import tools.refinery.store.dse.transition.objectives.Criterion; |
@@ -25,8 +26,8 @@ import java.util.ArrayList; | |||
25 | import java.util.List; | 26 | import java.util.List; |
26 | 27 | ||
27 | @SuppressWarnings("UnusedReturnValue") | 28 | @SuppressWarnings("UnusedReturnValue") |
28 | public abstract sealed class PartialSymbolTranslator<A, C> implements AnyPartialSymbolTranslator | 29 | public abstract sealed class PartialSymbolTranslator<A extends AbstractValue<A, C>, C> |
29 | permits PartialRelationTranslator { | 30 | implements AnyPartialSymbolTranslator permits PartialRelationTranslator { |
30 | private final PartialSymbol<A, C> partialSymbol; | 31 | private final PartialSymbol<A, C> partialSymbol; |
31 | private boolean configured = false; | 32 | private boolean configured = false; |
32 | protected PartialInterpretationRefiner.Factory<A, C> interpretationRefiner; | 33 | protected PartialInterpretationRefiner.Factory<A, C> interpretationRefiner; |
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 ef007efc..e83c33ac 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 | |||
@@ -64,7 +64,7 @@ class ContainmentLinkRefiner extends AbstractPartialInterpretationRefiner<TruthV | |||
64 | if (mustLinks.contains(factory.linkType)) { | 64 | if (mustLinks.contains(factory.linkType)) { |
65 | return oldValue; | 65 | return oldValue; |
66 | } | 66 | } |
67 | return new InferredContainment(oldValue.contains().merge(TruthValue.TRUE), | 67 | return new InferredContainment(oldValue.contains().meet(TruthValue.TRUE), |
68 | addToSet(mustLinks, factory.linkType), oldValue.forbiddenLinks()); | 68 | addToSet(mustLinks, factory.linkType), oldValue.forbiddenLinks()); |
69 | } | 69 | } |
70 | 70 | ||
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 3fe63339..00820040 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 | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/> | 2 | * SPDX-FileCopyrightText: 2023-2024 The Refinery Authors <https://refinery.tools/> |
3 | * | 3 | * |
4 | * SPDX-License-Identifier: EPL-2.0 | 4 | * SPDX-License-Identifier: EPL-2.0 |
5 | */ | 5 | */ |
@@ -23,7 +23,7 @@ class ContainsRefiner extends AbstractPartialInterpretationRefiner<TruthValue, B | |||
23 | 23 | ||
24 | static { | 24 | static { |
25 | var values = TruthValue.values(); | 25 | var values = TruthValue.values(); |
26 | EMPTY_VALUES = new LinkedHashMap<>(values.length); | 26 | EMPTY_VALUES = LinkedHashMap.newLinkedHashMap(values.length); |
27 | for (var value : values) { | 27 | for (var value : values) { |
28 | EMPTY_VALUES.put(value, new InferredContainment(value, Set.of(), Set.of())); | 28 | EMPTY_VALUES.put(value, new InferredContainment(value, Set.of(), Set.of())); |
29 | } | 29 | } |
@@ -53,7 +53,7 @@ class ContainsRefiner extends AbstractPartialInterpretationRefiner<TruthValue, B | |||
53 | } | 53 | } |
54 | 54 | ||
55 | public InferredContainment mergeLink(InferredContainment oldValue, TruthValue toMerge) { | 55 | public InferredContainment mergeLink(InferredContainment oldValue, TruthValue toMerge) { |
56 | var newContains = oldValue.contains().merge(toMerge); | 56 | var newContains = oldValue.contains().meet(toMerge); |
57 | if (newContains.equals(oldValue.contains())) { | 57 | if (newContains.equals(oldValue.contains())) { |
58 | return oldValue; | 58 | return oldValue; |
59 | } | 59 | } |
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/InferredContainment.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/InferredContainment.java index 77c7aaf4..0b6503c3 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/InferredContainment.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/containment/InferredContainment.java | |||
@@ -31,11 +31,11 @@ final class InferredContainment { | |||
31 | Set<PartialRelation> forbiddenLinks) { | 31 | Set<PartialRelation> forbiddenLinks) { |
32 | var result = contains; | 32 | var result = contains; |
33 | if (!mustLinks.isEmpty()) { | 33 | if (!mustLinks.isEmpty()) { |
34 | result = result.merge(TruthValue.TRUE); | 34 | result = result.meet(TruthValue.TRUE); |
35 | } | 35 | } |
36 | boolean hasErrorLink = mustLinks.stream().anyMatch(forbiddenLinks::contains); | 36 | boolean hasErrorLink = mustLinks.stream().anyMatch(forbiddenLinks::contains); |
37 | if (mustLinks.size() >= 2 || hasErrorLink) { | 37 | if (mustLinks.size() >= 2 || hasErrorLink) { |
38 | result = result.merge(TruthValue.ERROR); | 38 | result = result.meet(TruthValue.ERROR); |
39 | } | 39 | } |
40 | return result; | 40 | return result; |
41 | } | 41 | } |
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/UndirectedCrossReferenceInitializer.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/UndirectedCrossReferenceInitializer.java index 5bb1b967..84dcfdc5 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/UndirectedCrossReferenceInitializer.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/UndirectedCrossReferenceInitializer.java | |||
@@ -73,7 +73,7 @@ class UndirectedCrossReferenceInitializer implements PartialModelInitializer { | |||
73 | // Already processed entry. | 73 | // Already processed entry. |
74 | continue; | 74 | continue; |
75 | } | 75 | } |
76 | var mergedValue = value.merge(oppositeValue == null ? defaultValue : oppositeValue); | 76 | var mergedValue = value.meet(oppositeValue == null ? defaultValue : oppositeValue); |
77 | mergedMap.put(key, mergedValue); | 77 | mergedMap.put(key, mergedValue); |
78 | if (first != second) { | 78 | if (first != second) { |
79 | mergedMap.put(oppositeKey, mergedValue); | 79 | mergedMap.put(oppositeKey, mergedValue); |
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 a5047768..d1979b8c 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 | |||
@@ -131,7 +131,7 @@ public class MetamodelBuilder { | |||
131 | var oppositeInfo = referenceInfoMap.get(opposite); | 131 | var oppositeInfo = referenceInfoMap.get(opposite); |
132 | validateOpposite(linkType, info, opposite, oppositeInfo); | 132 | validateOpposite(linkType, info, opposite, oppositeInfo); |
133 | targetMultiplicity = oppositeInfo.multiplicity(); | 133 | targetMultiplicity = oppositeInfo.multiplicity(); |
134 | defaultValue = defaultValue.merge(oppositeInfo.defaultValue()); | 134 | defaultValue = defaultValue.meet(oppositeInfo.defaultValue()); |
135 | if (oppositeInfo.containment()) { | 135 | if (oppositeInfo.containment()) { |
136 | // Skip processing this reference and process it once we encounter its containment opposite. | 136 | // Skip processing this reference and process it once we encounter its containment opposite. |
137 | return; | 137 | return; |
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/EqualsRefiner.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/EqualsRefiner.java index 0b89ec58..07595932 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/EqualsRefiner.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/EqualsRefiner.java | |||
@@ -51,7 +51,7 @@ public class EqualsRefiner extends AbstractPartialInterpretationRefiner<TruthVal | |||
51 | return false; | 51 | return false; |
52 | } | 52 | } |
53 | var newCount = currentCount.meet(CardinalityIntervals.LONE); | 53 | var newCount = currentCount.meet(CardinalityIntervals.LONE); |
54 | if (newCount.isEmpty()) { | 54 | if (newCount.isError()) { |
55 | return false; | 55 | return false; |
56 | } | 56 | } |
57 | countInterpretation.put(unaryKey, newCount); | 57 | countInterpretation.put(unaryKey, newCount); |
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/ExistsRefiner.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/ExistsRefiner.java index 3908fedb..83fa4377 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/ExistsRefiner.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/ExistsRefiner.java | |||
@@ -42,7 +42,7 @@ public class ExistsRefiner extends AbstractPartialInterpretationRefiner<TruthVal | |||
42 | } | 42 | } |
43 | default -> throw new IllegalArgumentException("Unknown TruthValue: " + value); | 43 | default -> throw new IllegalArgumentException("Unknown TruthValue: " + value); |
44 | } | 44 | } |
45 | if (newCount.isEmpty()) { | 45 | if (newCount.isError()) { |
46 | return false; | 46 | return false; |
47 | } | 47 | } |
48 | countInterpretation.put(key, newCount); | 48 | countInterpretation.put(key, newCount); |
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/MultiObjectInitializer.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/MultiObjectInitializer.java index 694a800b..eb13174c 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/MultiObjectInitializer.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/MultiObjectInitializer.java | |||
@@ -37,7 +37,7 @@ class MultiObjectInitializer implements PartialModelInitializer { | |||
37 | var uniqueTable = new HashMap<CardinalityInterval, CardinalityInterval>(); | 37 | var uniqueTable = new HashMap<CardinalityInterval, CardinalityInterval>(); |
38 | for (int i = 0; i < intervals.length; i++) { | 38 | for (int i = 0; i < intervals.length; i++) { |
39 | var interval = intervals[i]; | 39 | var interval = intervals[i]; |
40 | if (interval.isEmpty()) { | 40 | if (interval.isError()) { |
41 | throw new TranslationException(ReasoningAdapter.EXISTS_SYMBOL, | 41 | throw new TranslationException(ReasoningAdapter.EXISTS_SYMBOL, |
42 | "Inconsistent existence or equality for node " + i); | 42 | "Inconsistent existence or equality for node " + i); |
43 | } | 43 | } |
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/MultiObjectStorageRefiner.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/MultiObjectStorageRefiner.java index 147ae486..ab401f9e 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/MultiObjectStorageRefiner.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/MultiObjectStorageRefiner.java | |||
@@ -28,7 +28,7 @@ class MultiObjectStorageRefiner implements StorageRefiner { | |||
28 | return false; | 28 | return false; |
29 | } | 29 | } |
30 | var newParentCount = parentCount.take(1); | 30 | var newParentCount = parentCount.take(1); |
31 | if (newParentCount.isEmpty()) { | 31 | if (newParentCount.isError()) { |
32 | return false; | 32 | return false; |
33 | } | 33 | } |
34 | var childKey = Tuple.of(childNode); | 34 | var childKey = Tuple.of(childNode); |
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/opposite/OppositeInterpretation.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/opposite/OppositeInterpretation.java index 7290ab40..75828086 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/opposite/OppositeInterpretation.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/opposite/OppositeInterpretation.java | |||
@@ -1,11 +1,11 @@ | |||
1 | /* | 1 | /* |
2 | * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/> | 2 | * SPDX-FileCopyrightText: 2023-2024 The Refinery Authors <https://refinery.tools/> |
3 | * | 3 | * |
4 | * SPDX-License-Identifier: EPL-2.0 | 4 | * SPDX-License-Identifier: EPL-2.0 |
5 | */ | 5 | */ |
6 | package tools.refinery.store.reasoning.translator.opposite; | 6 | package tools.refinery.store.reasoning.translator.opposite; |
7 | 7 | ||
8 | 8 | import tools.refinery.logic.AbstractValue; | |
9 | import tools.refinery.store.map.AnyVersionedMap; | 9 | import tools.refinery.store.map.AnyVersionedMap; |
10 | import tools.refinery.store.map.Cursor; | 10 | import tools.refinery.store.map.Cursor; |
11 | import tools.refinery.store.reasoning.ReasoningAdapter; | 11 | import tools.refinery.store.reasoning.ReasoningAdapter; |
@@ -17,7 +17,7 @@ import tools.refinery.store.tuple.Tuple; | |||
17 | 17 | ||
18 | import java.util.Set; | 18 | import java.util.Set; |
19 | 19 | ||
20 | class OppositeInterpretation<A, C> extends AbstractPartialInterpretation<A, C> { | 20 | class OppositeInterpretation<A extends AbstractValue<A, C>, C> extends AbstractPartialInterpretation<A, C> { |
21 | private final PartialInterpretation<A, C> opposite; | 21 | private final PartialInterpretation<A, C> opposite; |
22 | 22 | ||
23 | private OppositeInterpretation(ReasoningAdapter adapter, Concreteness concreteness, | 23 | private OppositeInterpretation(ReasoningAdapter adapter, Concreteness concreteness, |
@@ -36,7 +36,7 @@ class OppositeInterpretation<A, C> extends AbstractPartialInterpretation<A, C> { | |||
36 | return new OppositeCursor<>(opposite.getAll()); | 36 | return new OppositeCursor<>(opposite.getAll()); |
37 | } | 37 | } |
38 | 38 | ||
39 | public static <A1, C1> Factory<A1, C1> of(PartialSymbol<A1, C1> oppositeSymbol) { | 39 | public static <A1 extends AbstractValue<A1, C1>, C1> Factory<A1, C1> of(PartialSymbol<A1, C1> oppositeSymbol) { |
40 | return (adapter, concreteness, partialSymbol) -> { | 40 | return (adapter, concreteness, partialSymbol) -> { |
41 | var opposite = adapter.getPartialInterpretation(concreteness, oppositeSymbol); | 41 | var opposite = adapter.getPartialInterpretation(concreteness, oppositeSymbol); |
42 | return new OppositeInterpretation<>(adapter, concreteness, partialSymbol, opposite); | 42 | return new OppositeInterpretation<>(adapter, concreteness, partialSymbol, opposite); |
diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/opposite/OppositeRefiner.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/opposite/OppositeRefiner.java index d09684df..47e3ac6a 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/opposite/OppositeRefiner.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/opposite/OppositeRefiner.java | |||
@@ -1,17 +1,18 @@ | |||
1 | /* | 1 | /* |
2 | * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/> | 2 | * SPDX-FileCopyrightText: 2023-2024 The Refinery Authors <https://refinery.tools/> |
3 | * | 3 | * |
4 | * SPDX-License-Identifier: EPL-2.0 | 4 | * SPDX-License-Identifier: EPL-2.0 |
5 | */ | 5 | */ |
6 | package tools.refinery.store.reasoning.translator.opposite; | 6 | package tools.refinery.store.reasoning.translator.opposite; |
7 | 7 | ||
8 | import tools.refinery.logic.AbstractValue; | ||
8 | import tools.refinery.store.reasoning.ReasoningAdapter; | 9 | import tools.refinery.store.reasoning.ReasoningAdapter; |
9 | import tools.refinery.store.reasoning.refinement.AbstractPartialInterpretationRefiner; | 10 | import tools.refinery.store.reasoning.refinement.AbstractPartialInterpretationRefiner; |
10 | import tools.refinery.store.reasoning.refinement.PartialInterpretationRefiner; | 11 | import tools.refinery.store.reasoning.refinement.PartialInterpretationRefiner; |
11 | import tools.refinery.store.reasoning.representation.PartialSymbol; | 12 | import tools.refinery.store.reasoning.representation.PartialSymbol; |
12 | import tools.refinery.store.tuple.Tuple; | 13 | import tools.refinery.store.tuple.Tuple; |
13 | 14 | ||
14 | public class OppositeRefiner<A, C> extends AbstractPartialInterpretationRefiner<A, C> { | 15 | public class OppositeRefiner<A extends AbstractValue<A, C>, C> extends AbstractPartialInterpretationRefiner<A, C> { |
15 | private final PartialInterpretationRefiner<A, C> opposite; | 16 | private final PartialInterpretationRefiner<A, C> opposite; |
16 | 17 | ||
17 | protected OppositeRefiner(ReasoningAdapter adapter, PartialSymbol<A, C> partialSymbol, | 18 | protected OppositeRefiner(ReasoningAdapter adapter, PartialSymbol<A, C> partialSymbol, |
@@ -26,7 +27,7 @@ public class OppositeRefiner<A, C> extends AbstractPartialInterpretationRefiner< | |||
26 | return opposite.merge(oppositeKey, value); | 27 | return opposite.merge(oppositeKey, value); |
27 | } | 28 | } |
28 | 29 | ||
29 | public static <A1, C1> Factory<A1, C1> of(PartialSymbol<A1, C1> oppositeSymbol) { | 30 | public static <A1 extends AbstractValue<A1, C1>, C1> Factory<A1, C1> of(PartialSymbol<A1, C1> oppositeSymbol) { |
30 | return (adapter, partialSymbol) -> new OppositeRefiner<>(adapter, partialSymbol, oppositeSymbol); | 31 | return (adapter, partialSymbol) -> new OppositeRefiner<>(adapter, partialSymbol, oppositeSymbol); |
31 | } | 32 | } |
32 | } | 33 | } |