diff options
Diffstat (limited to 'subprojects/store-reasoning-scope/src/main/java/tools/refinery/store/reasoning/scope/internal/TypeScopePropagator.java')
-rw-r--r-- | subprojects/store-reasoning-scope/src/main/java/tools/refinery/store/reasoning/scope/internal/TypeScopePropagator.java | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/subprojects/store-reasoning-scope/src/main/java/tools/refinery/store/reasoning/scope/internal/TypeScopePropagator.java b/subprojects/store-reasoning-scope/src/main/java/tools/refinery/store/reasoning/scope/internal/TypeScopePropagator.java new file mode 100644 index 00000000..98f6ed8b --- /dev/null +++ b/subprojects/store-reasoning-scope/src/main/java/tools/refinery/store/reasoning/scope/internal/TypeScopePropagator.java | |||
@@ -0,0 +1,61 @@ | |||
1 | /* | ||
2 | * SPDX-FileCopyrightText: 2023 The Refinery Authors <https://refinery.tools/> | ||
3 | * | ||
4 | * SPDX-License-Identifier: EPL-2.0 | ||
5 | */ | ||
6 | package tools.refinery.store.reasoning.scope.internal; | ||
7 | |||
8 | import com.google.ortools.linearsolver.MPConstraint; | ||
9 | import tools.refinery.store.query.ModelQueryAdapter; | ||
10 | import tools.refinery.store.query.dnf.AnyQuery; | ||
11 | import tools.refinery.store.query.dnf.RelationalQuery; | ||
12 | import tools.refinery.store.query.resultset.ResultSet; | ||
13 | import tools.refinery.store.tuple.Tuple; | ||
14 | |||
15 | import java.util.Collection; | ||
16 | |||
17 | abstract class TypeScopePropagator { | ||
18 | private final ScopePropagatorAdapterImpl adapter; | ||
19 | private final ResultSet<Boolean> allNodes; | ||
20 | private final ResultSet<Boolean> multiNodes; | ||
21 | protected final MPConstraint constraint; | ||
22 | |||
23 | protected TypeScopePropagator(ScopePropagatorAdapterImpl adapter, RelationalQuery allQuery, | ||
24 | RelationalQuery multiQuery) { | ||
25 | this.adapter = adapter; | ||
26 | var queryEngine = adapter.getModel().getAdapter(ModelQueryAdapter.class); | ||
27 | allNodes = queryEngine.getResultSet(allQuery); | ||
28 | multiNodes = queryEngine.getResultSet(multiQuery); | ||
29 | constraint = adapter.makeConstraint(); | ||
30 | constraint.setBounds(0, Double.POSITIVE_INFINITY); | ||
31 | var cursor = multiNodes.getAll(); | ||
32 | while (cursor.move()) { | ||
33 | var variable = adapter.getVariable(cursor.getKey().get(0)); | ||
34 | constraint.setCoefficient(variable, 1); | ||
35 | } | ||
36 | allNodes.addListener(this::allChanged); | ||
37 | multiNodes.addListener(this::multiChanged); | ||
38 | } | ||
39 | |||
40 | public abstract void updateBounds(); | ||
41 | |||
42 | protected int getSingleCount() { | ||
43 | return allNodes.size() - multiNodes.size(); | ||
44 | } | ||
45 | |||
46 | private void allChanged(Tuple ignoredKey, Boolean ignoredOldValue, Boolean ignoredNewValue) { | ||
47 | adapter.markAsChanged(); | ||
48 | } | ||
49 | |||
50 | private void multiChanged(Tuple key, Boolean ignoredOldValue, Boolean newValue) { | ||
51 | var variable = adapter.getVariable(key.get(0)); | ||
52 | constraint.setCoefficient(variable, Boolean.TRUE.equals(newValue) ? 1 : 0); | ||
53 | adapter.markAsChanged(); | ||
54 | } | ||
55 | |||
56 | interface Factory { | ||
57 | TypeScopePropagator createPropagator(ScopePropagatorAdapterImpl adapter); | ||
58 | |||
59 | Collection<AnyQuery> getQueries(); | ||
60 | } | ||
61 | } | ||