aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/store-reasoning-scope/src/main/java/tools/refinery/store/reasoning/scope/internal/TypeScopePropagator.java
diff options
context:
space:
mode:
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.java61
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 */
6package tools.refinery.store.reasoning.scope.internal;
7
8import com.google.ortools.linearsolver.MPConstraint;
9import tools.refinery.store.query.ModelQueryAdapter;
10import tools.refinery.store.query.dnf.AnyQuery;
11import tools.refinery.store.query.dnf.RelationalQuery;
12import tools.refinery.store.query.resultset.ResultSet;
13import tools.refinery.store.tuple.Tuple;
14
15import java.util.Collection;
16
17abstract 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}