-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathExpressionConstraint.java
More file actions
124 lines (105 loc) · 3.97 KB
/
ExpressionConstraint.java
File metadata and controls
124 lines (105 loc) · 3.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package de.vill.model.constraint;
import de.vill.model.Feature;
import de.vill.model.building.VariableReference;
import de.vill.model.expression.Expression;
import de.vill.util.ConstantSymbols;
import java.util.*;
public abstract class ExpressionConstraint extends Constraint {
private Expression left;
private Expression right;
private final String expressionSymbol;
public ExpressionConstraint(Expression left, Expression right, String expressionSymbol) {
this.left = left;
this.right = right;
this.expressionSymbol = expressionSymbol;
}
public Expression getLeft() {
return left;
}
public Expression getRight() {
return right;
}
public void setLeft(Expression expression) {
left = expression;
}
public void setRight(Expression expression) {
right = expression;
}
public String getExpressionSymbol() {
return expressionSymbol;
}
@Override
public String toString(boolean withSubmodels, String currentAlias) {
return left.toString(withSubmodels, currentAlias) +
" " +
expressionSymbol +
" " +
right.toString(withSubmodels, currentAlias);
}
@Override
public List<Constraint> getConstraintSubParts() {
return Collections.emptyList();
}
public List<Expression> getExpressionSubParts() {
return Arrays.asList(left, right);
}
public void replaceExpressionSubPart(Expression oldSubExpression, Expression newSubExpression) {
if (left == oldSubExpression) {
left = newSubExpression;
} else if (right == oldSubExpression) {
right = newSubExpression;
}
}
@Override
public void replaceConstraintSubPart(Constraint oldSubConstraint, Constraint newSubConstraint) {
// no sub constraints
}
public boolean evaluate(Set<Feature> selectedFeatures) {
double leftResult = left.evaluate(selectedFeatures);
double rightResult = right.evaluate(selectedFeatures);
if (Double.isNaN(leftResult) || Double.isNaN(rightResult) || Double.isInfinite(leftResult) || Double.isInfinite(rightResult)){
return false;
}
if (ConstantSymbols.EQUALS.equals(expressionSymbol)) {
return leftResult == rightResult;
} else if (ConstantSymbols.LOWER.equals(expressionSymbol)) {
return leftResult < rightResult;
} else if (ConstantSymbols.GREATER.equals(expressionSymbol)) {
return leftResult > rightResult;
} else if (ConstantSymbols.GREATER_OR_EQUAL.equals(expressionSymbol)) {
return leftResult >= rightResult;
} else if (ConstantSymbols.LOWER_OR_EQUAL.equals(expressionSymbol)) {
return leftResult <= rightResult;
} else if (ConstantSymbols.NOT_EQUALS.equals(expressionSymbol)) {
return leftResult != rightResult;
}
return false;
}
@Override
public int hashCode(int level) {
final int prime = 31;
int result = prime * level + (left == null ? 0 : left.hashCode());
result = prime * result + (right == null ? 0 : right.hashCode());
result = prime * result + (expressionSymbol == null ? 0 : expressionSymbol.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
ExpressionConstraint other = (ExpressionConstraint) obj;
return Objects.equals(expressionSymbol, other.expressionSymbol) && Objects.equals(left, other.left)
&& Objects.equals(right, other.right);
}
@Override
public List<VariableReference> getReferences() {
List<VariableReference> references = new ArrayList<>();
references.addAll(left.getReferences());
references.addAll(right.getReferences());
return references;
}
}