-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathconstraint.cc
130 lines (123 loc) · 3.57 KB
/
constraint.cc
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
125
126
127
128
129
130
#include <iostream>
#include "constraint.h"
#include "cspsolver.h"
void Constraint::addVariable(int v) {
this->vars.push_back(v);
}
bool AlldiffConstraint::isSatisfied() {
for (int i=0; i<vars.size(); i++) {
auto v1 = csp.getVariable(vars[i]);
if (v1->value >= csp.valueOffset) {
for (int j = i + 1; j < vars.size(); j++) {
auto v2 = csp.getVariable(vars[j]);
if (v2->value >= csp.valueOffset && v2->value == v1->value) {
return false;
}
}
}
}
return true;
}
bool PlusConstraint::isSatisfied() {
bool isComplete = true;
int value = 0;
for (int i : vars) {
auto v = csp.getVariable(i);
if (v->value < csp.valueOffset) {
isComplete = false;
} else {
value += v->value;
}
}
return isComplete ? value == target : value < target;
}
bool MinusConstraint::isSatisfied() {
int value = 0;
for (int i : vars) {
auto v1 = csp.getVariable(i);
if (v1->value >= csp.valueOffset) {
value = v1->value;
for (auto j : vars) {
value -= csp.getVariable(j)->value;
}
if (value == target)
return true;
} else {
return true;
}
}
return false;
}
bool MultiplyConstraint::isSatisfied() {
bool isComplete = true;
int value = 1;
for (int i : vars) {
auto v = csp.getVariable(i);
if (v->value < csp.valueOffset)
isComplete = false;
else if (v->value == 0)
return target == 0;
else {
value *= v->value;
if (target % value != 0)
return false;
}
}
return isComplete ? value == target : value <= target;
}
bool DivideConstraint::isSatisfied() {
bool hasZero = false;
bool unsatisfiable;
int value;
for (int i : vars) {
auto v1 = csp.getVariable(i);
if (v1->value < csp.valueOffset) {
return true; // incomplete
} else if (v1->value == 0) {
if (target != 0 || hasZero)
return false;
hasZero = true;
} else {
value = v1->value;
unsatisfiable = false;
for (auto j : vars) {
auto v2 = csp.getVariable(j);
if (v2->value < csp.valueOffset)
return true;
else if ( (target/value) % v2->value != 0) {
unsatisfiable = true;
break;
} else
value /= v2->value;
}
if (value == target && !unsatisfiable)
return true;
}
}
return false;
}
bool ModuloConstraint::isSatisfied() {
bool hasZero = false;
int value;
for (int i : vars) {
auto v1 = csp.getVariable(i);
if (v1->value < csp.valueOffset) {
return true; // incomplete
} else if (v1->value == 0) {
if (target != 0 || hasZero)
return false;
hasZero = true;
} else {
value = v1->value;
for (auto j : vars) {
auto v2 = csp.getVariable(j);
if (v2->value < csp.valueOffset)
return true;
value %= v2->value;
}
if (value == target)
return true;
}
}
return false;
}