diff options
Diffstat (limited to 'subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/Dnf.java')
-rw-r--r-- | subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/Dnf.java | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/Dnf.java b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/Dnf.java index 50b245f7..86a1b6b2 100644 --- a/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/Dnf.java +++ b/subprojects/store-query/src/main/java/tools/refinery/store/query/dnf/Dnf.java | |||
@@ -6,9 +6,12 @@ | |||
6 | package tools.refinery.store.query.dnf; | 6 | package tools.refinery.store.query.dnf; |
7 | 7 | ||
8 | import tools.refinery.store.query.Constraint; | 8 | import tools.refinery.store.query.Constraint; |
9 | import tools.refinery.store.query.literal.Reduction; | 9 | import tools.refinery.store.query.InvalidQueryException; |
10 | import tools.refinery.store.query.equality.DnfEqualityChecker; | 10 | import tools.refinery.store.query.equality.DnfEqualityChecker; |
11 | import tools.refinery.store.query.equality.LiteralEqualityHelper; | 11 | import tools.refinery.store.query.equality.LiteralEqualityHelper; |
12 | import tools.refinery.store.query.equality.SubstitutingLiteralEqualityHelper; | ||
13 | import tools.refinery.store.query.equality.SubstitutingLiteralHashCodeHelper; | ||
14 | import tools.refinery.store.query.literal.Reduction; | ||
12 | import tools.refinery.store.query.term.Parameter; | 15 | import tools.refinery.store.query.term.Parameter; |
13 | import tools.refinery.store.query.term.Variable; | 16 | import tools.refinery.store.query.term.Variable; |
14 | 17 | ||
@@ -53,7 +56,7 @@ public final class Dnf implements Constraint { | |||
53 | FunctionalDependency<Variable> functionalDependency) { | 56 | FunctionalDependency<Variable> functionalDependency) { |
54 | for (var variable : toValidate) { | 57 | for (var variable : toValidate) { |
55 | if (!parameterSet.contains(variable)) { | 58 | if (!parameterSet.contains(variable)) { |
56 | throw new IllegalArgumentException( | 59 | throw new InvalidQueryException( |
57 | "Variable %s of functional dependency %s does not appear in the parameter list %s" | 60 | "Variable %s of functional dependency %s does not appear in the parameter list %s" |
58 | .formatted(variable, functionalDependency, symbolicParameters)); | 61 | .formatted(variable, functionalDependency, symbolicParameters)); |
59 | } | 62 | } |
@@ -66,7 +69,7 @@ public final class Dnf implements Constraint { | |||
66 | } | 69 | } |
67 | 70 | ||
68 | public boolean isExplicitlyNamed() { | 71 | public boolean isExplicitlyNamed() { |
69 | return name == null; | 72 | return name != null; |
70 | } | 73 | } |
71 | 74 | ||
72 | public String getUniqueName() { | 75 | public String getUniqueName() { |
@@ -129,7 +132,7 @@ public final class Dnf implements Constraint { | |||
129 | return false; | 132 | return false; |
130 | } | 133 | } |
131 | for (int i = 0; i < numClauses; i++) { | 134 | for (int i = 0; i < numClauses; i++) { |
132 | var literalEqualityHelper = new LiteralEqualityHelper(callEqualityChecker, symbolicParameters, | 135 | var literalEqualityHelper = new SubstitutingLiteralEqualityHelper(callEqualityChecker, symbolicParameters, |
133 | other.symbolicParameters); | 136 | other.symbolicParameters); |
134 | if (!clauses.get(i).equalsWithSubstitution(literalEqualityHelper, other.clauses.get(i))) { | 137 | if (!clauses.get(i).equalsWithSubstitution(literalEqualityHelper, other.clauses.get(i))) { |
135 | return false; | 138 | return false; |
@@ -146,6 +149,18 @@ public final class Dnf implements Constraint { | |||
146 | return false; | 149 | return false; |
147 | } | 150 | } |
148 | 151 | ||
152 | public int hashCodeWithSubstitution() { | ||
153 | var helper = new SubstitutingLiteralHashCodeHelper(); | ||
154 | int result = 0; | ||
155 | for (var symbolicParameter : symbolicParameters) { | ||
156 | result = result * 31 + symbolicParameter.hashCodeWithSubstitution(helper); | ||
157 | } | ||
158 | for (var clause : clauses) { | ||
159 | result = result * 31 + clause.hashCodeWithSubstitution(helper); | ||
160 | } | ||
161 | return result; | ||
162 | } | ||
163 | |||
149 | @Override | 164 | @Override |
150 | public String toString() { | 165 | public String toString() { |
151 | return "%s/%d".formatted(name(), arity()); | 166 | return "%s/%d".formatted(name(), arity()); |
@@ -201,6 +216,13 @@ public final class Dnf implements Constraint { | |||
201 | return new DnfBuilder(name); | 216 | return new DnfBuilder(name); |
202 | } | 217 | } |
203 | 218 | ||
219 | public static DnfBuilder builderFrom(Dnf original) { | ||
220 | var builder = builder(original.name()); | ||
221 | builder.symbolicParameters(original.getSymbolicParameters()); | ||
222 | builder.functionalDependencies(original.getFunctionalDependencies()); | ||
223 | return builder; | ||
224 | } | ||
225 | |||
204 | public static Dnf of(Consumer<DnfBuilder> callback) { | 226 | public static Dnf of(Consumer<DnfBuilder> callback) { |
205 | return of(null, callback); | 227 | return of(null, callback); |
206 | } | 228 | } |