aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects
diff options
context:
space:
mode:
Diffstat (limited to 'subprojects')
-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}