diff options
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; | |||
13 | import tools.refinery.store.query.dnf.Query; | 13 | import tools.refinery.store.query.dnf.Query; |
14 | import tools.refinery.store.query.dnf.RelationalQuery; | 14 | import tools.refinery.store.query.dnf.RelationalQuery; |
15 | import tools.refinery.store.query.term.Variable; | 15 | import tools.refinery.store.query.term.Variable; |
16 | import tools.refinery.store.query.term.uppercardinality.UpperCardinalityTerms; | ||
16 | import tools.refinery.store.reasoning.ReasoningBuilder; | 17 | import tools.refinery.store.reasoning.ReasoningBuilder; |
17 | import tools.refinery.store.reasoning.literal.CountCandidateLowerBoundLiteral; | 18 | import tools.refinery.store.reasoning.literal.CountCandidateLowerBoundLiteral; |
19 | import tools.refinery.store.reasoning.literal.CountUpperBoundLiteral; | ||
18 | import tools.refinery.store.reasoning.representation.PartialRelation; | 20 | import tools.refinery.store.reasoning.representation.PartialRelation; |
21 | import tools.refinery.store.representation.cardinality.UpperCardinality; | ||
19 | 22 | ||
20 | import java.util.Collection; | 23 | import java.util.Collection; |
21 | import java.util.List; | 24 | import 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 | ||
8 | import tools.refinery.store.dse.transition.DesignSpaceExplorationBuilder; | 8 | import tools.refinery.store.dse.transition.DesignSpaceExplorationBuilder; |
9 | import tools.refinery.store.dse.transition.objectives.Criteria; | 9 | import tools.refinery.store.dse.transition.objectives.Criteria; |
10 | import tools.refinery.store.dse.transition.objectives.Objectives; | ||
10 | import tools.refinery.store.model.ModelStoreBuilder; | 11 | import tools.refinery.store.model.ModelStoreBuilder; |
11 | import tools.refinery.store.query.dnf.AnyQuery; | 12 | import tools.refinery.store.query.dnf.AnyQuery; |
12 | import tools.refinery.store.query.dnf.Query; | 13 | import tools.refinery.store.query.dnf.Query; |
13 | import tools.refinery.store.query.dnf.RelationalQuery; | 14 | import tools.refinery.store.query.dnf.RelationalQuery; |
14 | import tools.refinery.store.query.term.Variable; | 15 | import tools.refinery.store.query.term.Variable; |
16 | import tools.refinery.store.reasoning.ReasoningBuilder; | ||
15 | import tools.refinery.store.reasoning.literal.CountCandidateUpperBoundLiteral; | 17 | import tools.refinery.store.reasoning.literal.CountCandidateUpperBoundLiteral; |
18 | import tools.refinery.store.reasoning.literal.CountLowerBoundLiteral; | ||
16 | import tools.refinery.store.reasoning.representation.PartialRelation; | 19 | import tools.refinery.store.reasoning.representation.PartialRelation; |
17 | 20 | ||
18 | import java.util.Collection; | 21 | import java.util.Collection; |
19 | import java.util.List; | 22 | import java.util.List; |
20 | 23 | ||
21 | import static tools.refinery.store.query.literal.Literals.check; | 24 | import static tools.refinery.store.query.literal.Literals.check; |
22 | import static tools.refinery.store.query.term.int_.IntTerms.constant; | 25 | import static tools.refinery.store.query.term.int_.IntTerms.*; |
23 | import static tools.refinery.store.query.term.int_.IntTerms.greater; | ||
24 | import static tools.refinery.store.reasoning.literal.PartialLiterals.must; | 26 | import static tools.refinery.store.reasoning.literal.PartialLiterals.must; |
25 | import static tools.refinery.store.reasoning.translator.multiobject.MultiObjectTranslator.MULTI_VIEW; | 27 | import 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 | } |