aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2023-11-17 17:21:59 +0100
committerLibravatar Kristóf Marussy <kristof@marussy.com>2023-11-19 14:41:16 +0100
commit78cca26065698c65fc5fe11e3b99a8ba41f0f295 (patch)
tree370c156b526ba36c9158f79fc80b7cbdb7d00ada
parentchore(deps): bump dependencies (diff)
downloadrefinery-78cca26065698c65fc5fe11e3b99a8ba41f0f295.tar.gz
refinery-78cca26065698c65fc5fe11e3b99a8ba41f0f295.tar.zst
refinery-78cca26065698c65fc5fe11e3b99a8ba41f0f295.zip
fix: upper and lower scopes
Make sure the scope bound guides the best-first search and is always obeyed even if it can't be fully represented using the scoped partial model abstraction. For representable bounds (classes and unary predicate that are always fully knwon to be false or true in the initial model) this leads to duplicated computations.
-rw-r--r--subprojects/store-reasoning-scope/src/main/java/tools/refinery/store/reasoning/scope/LowerTypeScopePropagator.java15
-rw-r--r--subprojects/store-reasoning-scope/src/main/java/tools/refinery/store/reasoning/scope/UpperTypeScopePropagator.java23
2 files changed, 30 insertions, 8 deletions
diff --git a/subprojects/store-reasoning-scope/src/main/java/tools/refinery/store/reasoning/scope/LowerTypeScopePropagator.java b/subprojects/store-reasoning-scope/src/main/java/tools/refinery/store/reasoning/scope/LowerTypeScopePropagator.java
index 86401b7e..702e570f 100644
--- a/subprojects/store-reasoning-scope/src/main/java/tools/refinery/store/reasoning/scope/LowerTypeScopePropagator.java
+++ b/subprojects/store-reasoning-scope/src/main/java/tools/refinery/store/reasoning/scope/LowerTypeScopePropagator.java
@@ -13,9 +13,12 @@ import tools.refinery.store.query.dnf.AnyQuery;
13import tools.refinery.store.query.dnf.Query; 13import tools.refinery.store.query.dnf.Query;
14import tools.refinery.store.query.dnf.RelationalQuery; 14import tools.refinery.store.query.dnf.RelationalQuery;
15import tools.refinery.store.query.term.Variable; 15import tools.refinery.store.query.term.Variable;
16import tools.refinery.store.query.term.uppercardinality.UpperCardinalityTerms;
16import tools.refinery.store.reasoning.ReasoningBuilder; 17import tools.refinery.store.reasoning.ReasoningBuilder;
17import tools.refinery.store.reasoning.literal.CountCandidateLowerBoundLiteral; 18import tools.refinery.store.reasoning.literal.CountCandidateLowerBoundLiteral;
19import tools.refinery.store.reasoning.literal.CountUpperBoundLiteral;
18import tools.refinery.store.reasoning.representation.PartialRelation; 20import tools.refinery.store.reasoning.representation.PartialRelation;
21import tools.refinery.store.representation.cardinality.UpperCardinality;
19 22
20import java.util.Collection; 23import java.util.Collection;
21import java.util.List; 24import java.util.List;
@@ -77,10 +80,18 @@ class LowerTypeScopePropagator extends TypeScopePropagator {
77 output.assign(sub(constant(lowerBound), candidateLowerBound)), 80 output.assign(sub(constant(lowerBound), candidateLowerBound)),
78 check(greater(output, constant(0))) 81 check(greater(output, constant(0)))
79 ))); 82 )));
83 var tooFewObjects = Query.of(type.name() + "#tooFew", builder -> builder
84 .clause(UpperCardinality.class, upperBound -> List.of(
85 new CountUpperBoundLiteral(upperBound, type, List.of(Variable.of())),
86 check(UpperCardinalityTerms.less(upperBound,
87 UpperCardinalityTerms.constant(UpperCardinality.of(lowerBound))))
88 )));
80 89
81 storeBuilder.getAdapter(ReasoningBuilder.class).objective(Objectives.value(requiredObjects)); 90 storeBuilder.getAdapter(ReasoningBuilder.class).objective(Objectives.value(requiredObjects));
82 storeBuilder.tryGetAdapter(DesignSpaceExplorationBuilder.class).ifPresent(dseBuilder -> 91 storeBuilder.tryGetAdapter(DesignSpaceExplorationBuilder.class).ifPresent(dseBuilder -> {
83 dseBuilder.accept(Criteria.whenNoMatch(requiredObjects))); 92 dseBuilder.accept(Criteria.whenNoMatch(requiredObjects));
93 dseBuilder.exclude(Criteria.whenHasMatch(tooFewObjects));
94 });
84 } 95 }
85 } 96 }
86} 97}
diff --git a/subprojects/store-reasoning-scope/src/main/java/tools/refinery/store/reasoning/scope/UpperTypeScopePropagator.java b/subprojects/store-reasoning-scope/src/main/java/tools/refinery/store/reasoning/scope/UpperTypeScopePropagator.java
index 634e93bc..b2f8d39b 100644
--- a/subprojects/store-reasoning-scope/src/main/java/tools/refinery/store/reasoning/scope/UpperTypeScopePropagator.java
+++ b/subprojects/store-reasoning-scope/src/main/java/tools/refinery/store/reasoning/scope/UpperTypeScopePropagator.java
@@ -7,20 +7,22 @@ package tools.refinery.store.reasoning.scope;
7 7
8import tools.refinery.store.dse.transition.DesignSpaceExplorationBuilder; 8import tools.refinery.store.dse.transition.DesignSpaceExplorationBuilder;
9import tools.refinery.store.dse.transition.objectives.Criteria; 9import tools.refinery.store.dse.transition.objectives.Criteria;
10import tools.refinery.store.dse.transition.objectives.Objectives;
10import tools.refinery.store.model.ModelStoreBuilder; 11import tools.refinery.store.model.ModelStoreBuilder;
11import tools.refinery.store.query.dnf.AnyQuery; 12import tools.refinery.store.query.dnf.AnyQuery;
12import tools.refinery.store.query.dnf.Query; 13import tools.refinery.store.query.dnf.Query;
13import tools.refinery.store.query.dnf.RelationalQuery; 14import tools.refinery.store.query.dnf.RelationalQuery;
14import tools.refinery.store.query.term.Variable; 15import tools.refinery.store.query.term.Variable;
16import tools.refinery.store.reasoning.ReasoningBuilder;
15import tools.refinery.store.reasoning.literal.CountCandidateUpperBoundLiteral; 17import tools.refinery.store.reasoning.literal.CountCandidateUpperBoundLiteral;
18import tools.refinery.store.reasoning.literal.CountLowerBoundLiteral;
16import tools.refinery.store.reasoning.representation.PartialRelation; 19import tools.refinery.store.reasoning.representation.PartialRelation;
17 20
18import java.util.Collection; 21import java.util.Collection;
19import java.util.List; 22import java.util.List;
20 23
21import static tools.refinery.store.query.literal.Literals.check; 24import static tools.refinery.store.query.literal.Literals.check;
22import static tools.refinery.store.query.term.int_.IntTerms.constant; 25import static tools.refinery.store.query.term.int_.IntTerms.*;
23import static tools.refinery.store.query.term.int_.IntTerms.greater;
24import static tools.refinery.store.reasoning.literal.PartialLiterals.must; 26import static tools.refinery.store.reasoning.literal.PartialLiterals.must;
25import static tools.refinery.store.reasoning.translator.multiobject.MultiObjectTranslator.MULTI_VIEW; 27import static tools.refinery.store.reasoning.translator.multiobject.MultiObjectTranslator.MULTI_VIEW;
26 28
@@ -70,14 +72,23 @@ class UpperTypeScopePropagator extends TypeScopePropagator {
70 public void configure(ModelStoreBuilder storeBuilder) { 72 public void configure(ModelStoreBuilder storeBuilder) {
71 super.configure(storeBuilder); 73 super.configure(storeBuilder);
72 74
73 var tooManyObjects = Query.of(type.name() + "#tooMany", builder -> builder 75 var excessObjects = Query.of(type.name() + "#excess", Integer.class, (builder, output) -> builder
74 .clause(Integer.class, candidateUpperBound -> List.of( 76 .clause(Integer.class, candidateUpperBound -> List.of(
75 new CountCandidateUpperBoundLiteral(candidateUpperBound, type, List.of(Variable.of())), 77 new CountCandidateUpperBoundLiteral(candidateUpperBound, type, List.of(Variable.of())),
76 check(greater(candidateUpperBound, constant(upperBound))) 78 output.assign(sub(candidateUpperBound, constant(upperBound))),
79 check(greater(output, constant(0)))
80 )));
81 var tooManyObjects = Query.of(type.name() + "#tooMany", builder -> builder
82 .clause(Integer.class, lowerBound -> List.of(
83 new CountLowerBoundLiteral(lowerBound, type, List.of(Variable.of())),
84 check(greater(lowerBound, constant(upperBound)))
77 ))); 85 )));
78 86
79 storeBuilder.tryGetAdapter(DesignSpaceExplorationBuilder.class).ifPresent(dseBuilder -> 87 storeBuilder.getAdapter(ReasoningBuilder.class).objective(Objectives.value(excessObjects));
80 dseBuilder.accept(Criteria.whenNoMatch(tooManyObjects))); 88 storeBuilder.tryGetAdapter(DesignSpaceExplorationBuilder.class).ifPresent(dseBuilder -> {
89 dseBuilder.accept(Criteria.whenNoMatch(excessObjects));
90 dseBuilder.exclude(Criteria.whenHasMatch(tooManyObjects));
91 });
81 } 92 }
82 } 93 }
83} 94}