aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/store-dse
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2024-06-28 21:21:53 +0200
committerLibravatar Kristóf Marussy <kristof@marussy.com>2024-06-28 21:44:58 +0200
commitb52a4b0b330c4f4903fb4aa41a63980774b43c85 (patch)
treee0a0f90580d6b571572d4aab173b09e66c96ef94 /subprojects/store-dse
parentrefactor: improve propagation traceability (diff)
downloadrefinery-main.tar.gz
refinery-main.tar.zst
refinery-main.zip
refactor: improve propagation rule diagnosticsHEADmain
Diffstat (limited to 'subprojects/store-dse')
-rw-r--r--subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/PropagationBuilder.java2
-rw-r--r--subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/PropagationRejectedResult.java8
-rw-r--r--subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/PropagationAdapterImpl.java10
-rw-r--r--subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/PropagationBuilderImpl.java9
-rw-r--r--subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/PropagationStoreAdapterImpl.java10
-rw-r--r--subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/rule/BoundPropagationRule.java3
6 files changed, 33 insertions, 9 deletions
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/PropagationBuilder.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/PropagationBuilder.java
index f8a89b30..2a22f00d 100644
--- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/PropagationBuilder.java
+++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/PropagationBuilder.java
@@ -27,6 +27,8 @@ public interface PropagationBuilder extends ModelAdapterBuilder {
27 27
28 PropagationBuilder propagator(Propagator propagator); 28 PropagationBuilder propagator(Propagator propagator);
29 29
30 PropagationBuilder throwOnFatalRejection(boolean throwOnFatalRejection);
31
30 @Override 32 @Override
31 PropagationStoreAdapter build(ModelStore store); 33 PropagationStoreAdapter build(ModelStore store);
32} 34}
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/PropagationRejectedResult.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/PropagationRejectedResult.java
index 6d696de7..0ef1dc38 100644
--- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/PropagationRejectedResult.java
+++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/PropagationRejectedResult.java
@@ -5,7 +5,11 @@
5 */ 5 */
6package tools.refinery.store.dse.propagation; 6package tools.refinery.store.dse.propagation;
7 7
8public record PropagationRejectedResult(Object reason, String message) implements PropagationResult { 8public record PropagationRejectedResult(Object reason, String message, boolean fatal) implements PropagationResult {
9 public PropagationRejectedResult(Object reason, String message) {
10 this(reason, message, false);
11 }
12
9 @Override 13 @Override
10 public PropagationResult andThen(PropagationResult next) { 14 public PropagationResult andThen(PropagationResult next) {
11 return this; 15 return this;
@@ -18,7 +22,7 @@ public record PropagationRejectedResult(Object reason, String message) implement
18 22
19 @Override 23 @Override
20 public void throwIfRejected() { 24 public void throwIfRejected() {
21 throw new IllegalArgumentException(formatMessage()); 25 throw new IllegalStateException(formatMessage());
22 } 26 }
23 27
24 public String formatMessage() { 28 public String formatMessage() {
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/PropagationAdapterImpl.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/PropagationAdapterImpl.java
index fdd19217..7158a7ab 100644
--- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/PropagationAdapterImpl.java
+++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/PropagationAdapterImpl.java
@@ -5,10 +5,7 @@
5 */ 5 */
6package tools.refinery.store.dse.propagation.impl; 6package tools.refinery.store.dse.propagation.impl;
7 7
8import tools.refinery.store.dse.propagation.BoundPropagator; 8import tools.refinery.store.dse.propagation.*;
9import tools.refinery.store.dse.propagation.PropagationAdapter;
10import tools.refinery.store.dse.propagation.PropagationResult;
11import tools.refinery.store.dse.propagation.PropagationStoreAdapter;
12import tools.refinery.store.model.Model; 9import tools.refinery.store.model.Model;
13 10
14class PropagationAdapterImpl implements PropagationAdapter { 11class PropagationAdapterImpl implements PropagationAdapter {
@@ -35,6 +32,11 @@ class PropagationAdapterImpl implements PropagationAdapter {
35 lastResult = propagateOne(); 32 lastResult = propagateOne();
36 result = result.andThen(lastResult); 33 result = result.andThen(lastResult);
37 } while (lastResult.isChanged()); 34 } while (lastResult.isChanged());
35 if (lastResult instanceof PropagationRejectedResult rejectedResult &&
36 rejectedResult.fatal() &&
37 storeAdapter.isThrowOnFatalRejection()) {
38 rejectedResult.throwIfRejected();
39 }
38 return result; 40 return result;
39 } 41 }
40 42
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/PropagationBuilderImpl.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/PropagationBuilderImpl.java
index c844a89f..da32fe44 100644
--- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/PropagationBuilderImpl.java
+++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/PropagationBuilderImpl.java
@@ -20,6 +20,7 @@ public class PropagationBuilderImpl extends AbstractModelAdapterBuilder<Propagat
20 implements PropagationBuilder { 20 implements PropagationBuilder {
21 private final Set<Rule> propagationRules = new LinkedHashSet<>(); 21 private final Set<Rule> propagationRules = new LinkedHashSet<>();
22 private final Deque<Propagator> propagators = new ArrayDeque<>(); 22 private final Deque<Propagator> propagators = new ArrayDeque<>();
23 private boolean throwOnFatalRejection = true;
23 24
24 @Override 25 @Override
25 public PropagationBuilder rule(Rule propagationRule) { 26 public PropagationBuilder rule(Rule propagationRule) {
@@ -36,6 +37,12 @@ public class PropagationBuilderImpl extends AbstractModelAdapterBuilder<Propagat
36 } 37 }
37 38
38 @Override 39 @Override
40 public PropagationBuilder throwOnFatalRejection(boolean throwOnFatalRejection) {
41 this.throwOnFatalRejection = throwOnFatalRejection;
42 return this;
43 }
44
45 @Override
39 protected void doConfigure(ModelStoreBuilder storeBuilder) { 46 protected void doConfigure(ModelStoreBuilder storeBuilder) {
40 super.doConfigure(storeBuilder); 47 super.doConfigure(storeBuilder);
41 if (!propagationRules.isEmpty()) { 48 if (!propagationRules.isEmpty()) {
@@ -48,6 +55,6 @@ public class PropagationBuilderImpl extends AbstractModelAdapterBuilder<Propagat
48 55
49 @Override 56 @Override
50 protected PropagationStoreAdapter doBuild(ModelStore store) { 57 protected PropagationStoreAdapter doBuild(ModelStore store) {
51 return new PropagationStoreAdapterImpl(store, List.copyOf(propagators)); 58 return new PropagationStoreAdapterImpl(store, List.copyOf(propagators), throwOnFatalRejection);
52 } 59 }
53} 60}
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/PropagationStoreAdapterImpl.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/PropagationStoreAdapterImpl.java
index a223caed..4f7b8622 100644
--- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/PropagationStoreAdapterImpl.java
+++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/PropagationStoreAdapterImpl.java
@@ -13,13 +13,17 @@ import tools.refinery.store.model.ModelStore;
13 13
14import java.util.List; 14import java.util.List;
15 15
16// This should not be a record, because we don't want auto-generated {@code equals} and {@code hashCode} methods.
17@SuppressWarnings("ClassCanBeRecord")
16class PropagationStoreAdapterImpl implements PropagationStoreAdapter { 18class PropagationStoreAdapterImpl implements PropagationStoreAdapter {
17 private final ModelStore store; 19 private final ModelStore store;
18 private final List<Propagator> propagators; 20 private final List<Propagator> propagators;
21 private final boolean throwOnFatalRejection;
19 22
20 PropagationStoreAdapterImpl(ModelStore store, List<Propagator> propagators) { 23 PropagationStoreAdapterImpl(ModelStore store, List<Propagator> propagators, boolean throwOnFatalRejection) {
21 this.store = store; 24 this.store = store;
22 this.propagators = propagators; 25 this.propagators = propagators;
26 this.throwOnFatalRejection = throwOnFatalRejection;
23 } 27 }
24 28
25 @Override 29 @Override
@@ -35,4 +39,8 @@ class PropagationStoreAdapterImpl implements PropagationStoreAdapter {
35 List<Propagator> getPropagators() { 39 List<Propagator> getPropagators() {
36 return propagators; 40 return propagators;
37 } 41 }
42
43 boolean isThrowOnFatalRejection() {
44 return throwOnFatalRejection;
45 }
38} 46}
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/rule/BoundPropagationRule.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/rule/BoundPropagationRule.java
index f91882be..cc1e0486 100644
--- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/rule/BoundPropagationRule.java
+++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/propagation/impl/rule/BoundPropagationRule.java
@@ -44,7 +44,8 @@ class BoundPropagationRule {
44 44
45 public PropagationResult fireAll() { 45 public PropagationResult fireAll() {
46 if (!firedActivations.isEmpty()) { 46 if (!firedActivations.isEmpty()) {
47 throw new IllegalStateException("Stuck propagation rule '%s'.".formatted(rule.getName())); 47 return new PropagationRejectedResult(rule, "Propagation rule '%s' got stuck.".formatted(rule.getName()),
48 true);
48 } 49 }
49 if (resultSet.size() == 0) { 50 if (resultSet.size() == 0) {
50 return PropagationResult.UNCHANGED; 51 return PropagationResult.UNCHANGED;