20 #include "absl/container/flat_hash_map.h"
21 #include "absl/container/flat_hash_set.h"
39 return evaluator(arg.
Var());
52 int64_t EvalAt(
const Argument& arg,
int pos,
59 return evaluator(arg.
VarAt(pos));
70 bool CheckAllDifferentInt(
73 absl::flat_hash_set<int64_t> visited;
79 visited.insert(
value);
85 bool CheckAlldifferentExcept0(
88 absl::flat_hash_set<int64_t> visited;
94 visited.insert(
value);
102 const int64_t expected = Eval(
ct.
arguments[0], evaluator);
109 return count == expected;
112 bool CheckArrayBoolAnd(
125 bool CheckArrayBoolOr(
138 bool CheckArrayBoolXor(
147 return result % 2 == 1;
150 bool CheckArrayIntElement(
158 const int64_t shifted_index = Eval(
ct.
arguments[0], evaluator) - 1;
159 const int64_t element = EvalAt(
ct.
arguments[1], shifted_index, evaluator);
160 const int64_t target = Eval(
ct.
arguments[2], evaluator);
161 return element == target;
164 bool CheckArrayIntElementNonShifted(
170 const int64_t target = Eval(
ct.
arguments[2], evaluator);
171 return element == target;
174 bool CheckArrayVarIntElement(
182 const int64_t shifted_index = Eval(
ct.
arguments[0], evaluator) - 1;
183 const int64_t element = EvalAt(
ct.
arguments[1], shifted_index, evaluator);
184 const int64_t target = Eval(
ct.
arguments[2], evaluator);
185 return element == target;
190 const int64_t expected = Eval(
ct.
arguments[0], evaluator);
197 return count <= expected;
202 const int64_t left = Eval(
ct.
arguments[0], evaluator);
203 const int64_t right = Eval(
ct.
arguments[1], evaluator);
204 const int64_t status = Eval(
ct.
arguments[2], evaluator);
205 return status ==
std::min(left, right);
208 bool CheckBoolClause(
229 const int64_t left = Eval(
ct.
arguments[0], evaluator);
230 const int64_t right = Eval(
ct.
arguments[1], evaluator);
231 return left == 1 - right;
236 const int64_t left = Eval(
ct.
arguments[0], evaluator);
237 const int64_t right = Eval(
ct.
arguments[1], evaluator);
238 const int64_t status = Eval(
ct.
arguments[2], evaluator);
239 return status ==
std::max(left, right);
244 const int64_t left = Eval(
ct.
arguments[0], evaluator);
245 const int64_t right = Eval(
ct.
arguments[1], evaluator);
246 const int64_t target = Eval(
ct.
arguments[2], evaluator);
247 return target == (left + right == 1);
256 for (
int i = 0; i < size; ++i) {
261 }
else if (
next == size) {
267 absl::flat_hash_set<int64_t> visited;
270 const int64_t
next = EvalAt(
ct.
arguments[0], current, evaluator) + shift;
271 visited.insert(
next);
277 int64_t ComputeCount(
290 const int64_t count = ComputeCount(
ct, evaluator);
291 const int64_t expected = Eval(
ct.
arguments[2], evaluator);
292 return count == expected;
297 const int64_t count = ComputeCount(
ct, evaluator);
298 const int64_t expected = Eval(
ct.
arguments[2], evaluator);
299 return count >= expected;
304 const int64_t count = ComputeCount(
ct, evaluator);
305 const int64_t expected = Eval(
ct.
arguments[2], evaluator);
306 return count > expected;
311 const int64_t count = ComputeCount(
ct, evaluator);
312 const int64_t expected = Eval(
ct.
arguments[2], evaluator);
313 return count <= expected;
318 const int64_t count = ComputeCount(
ct, evaluator);
319 const int64_t expected = Eval(
ct.
arguments[2], evaluator);
320 return count < expected;
325 const int64_t count = ComputeCount(
ct, evaluator);
326 const int64_t expected = Eval(
ct.
arguments[2], evaluator);
327 return count != expected;
332 const int64_t count = ComputeCount(
ct, evaluator);
333 const int64_t expected = Eval(
ct.
arguments[2], evaluator);
334 const int64_t status = Eval(
ct.
arguments[3], evaluator);
335 return status == (expected == count);
338 bool CheckCumulative(
346 absl::flat_hash_map<int64_t, int64_t> usage;
347 for (
int i = 0; i < size; ++i) {
348 const int64_t start = EvalAt(
ct.
arguments[0], i, evaluator);
349 const int64_t duration = EvalAt(
ct.
arguments[1], i, evaluator);
350 const int64_t requirement = EvalAt(
ct.
arguments[2], i, evaluator);
351 for (int64_t t = start; t < start + duration; ++t) {
352 usage[t] += requirement;
371 bool CheckDiffnNonStrict(
377 bool CheckDiffnNonStrictK(
383 bool CheckDisjunctive(
389 bool CheckDisjunctiveStrict(
395 bool CheckFalseConstraint(
401 std::vector<int64_t> ComputeGlobalCardinalityCards(
404 std::vector<int64_t> cards(Size(
ct.
arguments[1]), 0);
405 absl::flat_hash_map<int64_t, int> positions;
406 for (
int i = 0; i <
ct.
arguments[1].values.size(); ++i) {
409 positions[
value] = i;
414 cards[positions[
value]]++;
420 bool CheckGlobalCardinality(
423 const std::vector<int64_t> cards =
424 ComputeGlobalCardinalityCards(
ct, evaluator);
427 const int64_t card = EvalAt(
ct.
arguments[2], i, evaluator);
428 if (card != cards[i]) {
435 bool CheckGlobalCardinalityClosed(
438 const std::vector<int64_t> cards =
439 ComputeGlobalCardinalityCards(
ct, evaluator);
442 const int64_t card = EvalAt(
ct.
arguments[2], i, evaluator);
443 if (card != cards[i]) {
447 int64_t sum_of_cards = 0;
448 for (int64_t card : cards) {
449 sum_of_cards += card;
454 bool CheckGlobalCardinalityLowUp(
457 const std::vector<int64_t> cards =
458 ComputeGlobalCardinalityCards(
ct, evaluator);
461 for (
int i = 0; i < cards.size(); ++i) {
462 const int64_t card = cards[i];
470 bool CheckGlobalCardinalityLowUpClosed(
473 const std::vector<int64_t> cards =
474 ComputeGlobalCardinalityCards(
ct, evaluator);
477 for (
int i = 0; i < cards.size(); ++i) {
478 const int64_t card = cards[i];
483 int64_t sum_of_cards = 0;
484 for (int64_t card : cards) {
485 sum_of_cards += card;
490 bool CheckGlobalCardinalityOld(
494 std::vector<int64_t> cards(size, 0);
501 for (
int i = 0; i < size; ++i) {
502 const int64_t card = EvalAt(
ct.
arguments[1], i, evaluator);
503 if (card != cards[i]) {
512 const int64_t left = Eval(
ct.
arguments[0], evaluator);
513 const int64_t right = Eval(
ct.
arguments[1], evaluator);
514 return std::abs(left) == right;
519 const int64_t left = Eval(
ct.
arguments[0], evaluator);
520 const int64_t right = Eval(
ct.
arguments[1], evaluator);
521 const int64_t target = Eval(
ct.
arguments[2], evaluator);
522 return target == left / right;
527 const int64_t left = Eval(
ct.
arguments[0], evaluator);
528 const int64_t right = Eval(
ct.
arguments[1], evaluator);
529 return left == right;
534 const int64_t left = Eval(
ct.
arguments[0], evaluator);
535 const int64_t right = Eval(
ct.
arguments[1], evaluator);
536 const bool status = Eval(
ct.
arguments[2], evaluator) != 0;
537 return (status && (left == right)) || !status;
542 const int64_t left = Eval(
ct.
arguments[0], evaluator);
543 const int64_t right = Eval(
ct.
arguments[1], evaluator);
544 const bool status = Eval(
ct.
arguments[2], evaluator) != 0;
545 return status == (left == right);
550 const int64_t left = Eval(
ct.
arguments[0], evaluator);
551 const int64_t right = Eval(
ct.
arguments[1], evaluator);
552 return left >= right;
557 const int64_t left = Eval(
ct.
arguments[0], evaluator);
558 const int64_t right = Eval(
ct.
arguments[1], evaluator);
559 const bool status = Eval(
ct.
arguments[2], evaluator) != 0;
560 return (status && (left >= right)) || !status;
565 const int64_t left = Eval(
ct.
arguments[0], evaluator);
566 const int64_t right = Eval(
ct.
arguments[1], evaluator);
567 const bool status = Eval(
ct.
arguments[2], evaluator) != 0;
568 return status == (left >= right);
573 const int64_t left = Eval(
ct.
arguments[0], evaluator);
574 const int64_t right = Eval(
ct.
arguments[1], evaluator);
580 const int64_t left = Eval(
ct.
arguments[0], evaluator);
581 const int64_t right = Eval(
ct.
arguments[1], evaluator);
582 const bool status = Eval(
ct.
arguments[2], evaluator) != 0;
583 return (status && (left > right)) || !status;
588 const int64_t left = Eval(
ct.
arguments[0], evaluator);
589 const int64_t right = Eval(
ct.
arguments[1], evaluator);
590 const bool status = Eval(
ct.
arguments[2], evaluator) != 0;
591 return status == (left > right);
596 const int64_t left = Eval(
ct.
arguments[0], evaluator);
597 const int64_t right = Eval(
ct.
arguments[1], evaluator);
598 return left <= right;
603 const int64_t left = Eval(
ct.
arguments[0], evaluator);
604 const int64_t right = Eval(
ct.
arguments[1], evaluator);
605 const bool status = Eval(
ct.
arguments[2], evaluator) != 0;
606 return (status && (left <= right)) || !status;
611 const int64_t left = Eval(
ct.
arguments[0], evaluator);
612 const int64_t right = Eval(
ct.
arguments[1], evaluator);
613 const bool status = Eval(
ct.
arguments[2], evaluator) != 0;
614 return status == (left <= right);
619 const int64_t left = Eval(
ct.
arguments[0], evaluator);
620 const int64_t right = Eval(
ct.
arguments[1], evaluator);
626 const int64_t left = Eval(
ct.
arguments[0], evaluator);
627 const int64_t right = Eval(
ct.
arguments[1], evaluator);
628 const bool status = Eval(
ct.
arguments[2], evaluator) != 0;
629 return (status && (left < right)) || !status;
634 const int64_t left = Eval(
ct.
arguments[0], evaluator);
635 const int64_t right = Eval(
ct.
arguments[1], evaluator);
636 const bool status = Eval(
ct.
arguments[2], evaluator) != 0;
637 return status == (left < right);
640 int64_t ComputeIntLin(
653 const int64_t left = ComputeIntLin(
ct, evaluator);
654 const int64_t right = Eval(
ct.
arguments[2], evaluator);
655 return left == right;
658 bool CheckIntLinEqImp(
661 const int64_t left = ComputeIntLin(
ct, evaluator);
662 const int64_t right = Eval(
ct.
arguments[2], evaluator);
663 const bool status = Eval(
ct.
arguments[3], evaluator) != 0;
664 return (status && (left == right)) || !status;
667 bool CheckIntLinEqReif(
670 const int64_t left = ComputeIntLin(
ct, evaluator);
671 const int64_t right = Eval(
ct.
arguments[2], evaluator);
672 const bool status = Eval(
ct.
arguments[3], evaluator) != 0;
673 return status == (left == right);
678 const int64_t left = ComputeIntLin(
ct, evaluator);
679 const int64_t right = Eval(
ct.
arguments[2], evaluator);
680 return left >= right;
683 bool CheckIntLinGeImp(
686 const int64_t left = ComputeIntLin(
ct, evaluator);
687 const int64_t right = Eval(
ct.
arguments[2], evaluator);
688 const bool status = Eval(
ct.
arguments[3], evaluator) != 0;
689 return (status && (left >= right)) || !status;
692 bool CheckIntLinGeReif(
695 const int64_t left = ComputeIntLin(
ct, evaluator);
696 const int64_t right = Eval(
ct.
arguments[2], evaluator);
697 const bool status = Eval(
ct.
arguments[3], evaluator) != 0;
698 return status == (left >= right);
703 const int64_t left = ComputeIntLin(
ct, evaluator);
704 const int64_t right = Eval(
ct.
arguments[2], evaluator);
705 return left <= right;
708 bool CheckIntLinLeImp(
711 const int64_t left = ComputeIntLin(
ct, evaluator);
712 const int64_t right = Eval(
ct.
arguments[2], evaluator);
713 const bool status = Eval(
ct.
arguments[3], evaluator) != 0;
714 return (status && (left <= right)) || !status;
717 bool CheckIntLinLeReif(
720 const int64_t left = ComputeIntLin(
ct, evaluator);
721 const int64_t right = Eval(
ct.
arguments[2], evaluator);
722 const bool status = Eval(
ct.
arguments[3], evaluator) != 0;
723 return status == (left <= right);
728 const int64_t left = ComputeIntLin(
ct, evaluator);
729 const int64_t right = Eval(
ct.
arguments[2], evaluator);
730 return left != right;
733 bool CheckIntLinNeImp(
736 const int64_t left = ComputeIntLin(
ct, evaluator);
737 const int64_t right = Eval(
ct.
arguments[2], evaluator);
738 const bool status = Eval(
ct.
arguments[3], evaluator) != 0;
739 return (status && (left != right)) || !status;
742 bool CheckIntLinNeReif(
745 const int64_t left = ComputeIntLin(
ct, evaluator);
746 const int64_t right = Eval(
ct.
arguments[2], evaluator);
747 const bool status = Eval(
ct.
arguments[3], evaluator) != 0;
748 return status == (left != right);
753 const int64_t left = Eval(
ct.
arguments[0], evaluator);
754 const int64_t right = Eval(
ct.
arguments[1], evaluator);
755 const int64_t status = Eval(
ct.
arguments[2], evaluator);
756 return status ==
std::max(left, right);
761 const int64_t left = Eval(
ct.
arguments[0], evaluator);
762 const int64_t right = Eval(
ct.
arguments[1], evaluator);
763 const int64_t status = Eval(
ct.
arguments[2], evaluator);
764 return status ==
std::min(left, right);
769 const int64_t left = Eval(
ct.
arguments[0], evaluator);
770 const int64_t right = Eval(
ct.
arguments[1], evaluator);
771 const int64_t target = Eval(
ct.
arguments[2], evaluator);
772 return target == left - right;
777 const int64_t left = Eval(
ct.
arguments[0], evaluator);
778 const int64_t right = Eval(
ct.
arguments[1], evaluator);
779 const int64_t target = Eval(
ct.
arguments[2], evaluator);
780 return target == left % right;
785 const int64_t left = Eval(
ct.
arguments[0], evaluator);
786 const int64_t right = Eval(
ct.
arguments[1], evaluator);
787 return left != right;
792 const int64_t left = Eval(
ct.
arguments[0], evaluator);
793 const int64_t right = Eval(
ct.
arguments[1], evaluator);
794 const bool status = Eval(
ct.
arguments[2], evaluator) != 0;
795 return (status && (left != right)) || !status;
800 const int64_t left = Eval(
ct.
arguments[0], evaluator);
801 const int64_t right = Eval(
ct.
arguments[1], evaluator);
802 const bool status = Eval(
ct.
arguments[2], evaluator) != 0;
803 return status == (left != right);
808 const int64_t left = Eval(
ct.
arguments[0], evaluator);
809 const int64_t right = Eval(
ct.
arguments[1], evaluator);
810 return left == -right;
815 const int64_t left = Eval(
ct.
arguments[0], evaluator);
816 const int64_t right = Eval(
ct.
arguments[1], evaluator);
817 const int64_t target = Eval(
ct.
arguments[2], evaluator);
818 return target == left + right;
823 const int64_t left = Eval(
ct.
arguments[0], evaluator);
824 const int64_t right = Eval(
ct.
arguments[1], evaluator);
825 const int64_t target = Eval(
ct.
arguments[2], evaluator);
826 return target == left * right;
834 for (
int i = 0; i < size; ++i) {
835 const int64_t x = EvalAt(
ct.
arguments[0], i, evaluator) - 1;
836 const int64_t y = EvalAt(
ct.
arguments[1], i, evaluator) - 1;
837 if (x < 0 || x >= size || y < 0 || y >= size) {
842 for (
int i = 0; i < size; ++i) {
843 const int64_t fi = EvalAt(
ct.
arguments[0], i, evaluator) - 1;
844 const int64_t invf_fi = EvalAt(
ct.
arguments[1], fi, evaluator) - 1;
853 bool CheckLexLessInt(
858 const int64_t x = EvalAt(
ct.
arguments[0], i, evaluator);
859 const int64_t y = EvalAt(
ct.
arguments[1], i, evaluator);
871 bool CheckLexLesseqInt(
876 const int64_t x = EvalAt(
ct.
arguments[0], i, evaluator);
877 const int64_t y = EvalAt(
ct.
arguments[1], i, evaluator);
889 bool CheckMaximumArgInt(
892 const int64_t max_index = Eval(
ct.
arguments[1], evaluator) - 1;
893 const int64_t max_value = EvalAt(
ct.
arguments[0], max_index, evaluator);
895 for (
int i = 0; i < max_index; ++i) {
896 if (EvalAt(
ct.
arguments[0], i, evaluator) >= max_value) {
901 for (
int i = max_index + 1; i < Size(
ct.
arguments[0]); i++) {
902 if (EvalAt(
ct.
arguments[0], i, evaluator) > max_value) {
910 bool CheckMaximumInt(
917 return max_value == Eval(
ct.
arguments[0], evaluator);
920 bool CheckMinimumArgInt(
923 const int64_t min_index = Eval(
ct.
arguments[1], evaluator) - 1;
924 const int64_t min_value = EvalAt(
ct.
arguments[0], min_index, evaluator);
926 for (
int i = 0; i < min_index; ++i) {
927 if (EvalAt(
ct.
arguments[0], i, evaluator) <= min_value) {
932 for (
int i = min_index + 1; i < Size(
ct.
arguments[0]); i++) {
933 if (EvalAt(
ct.
arguments[0], i, evaluator) < min_value) {
941 bool CheckMinimumInt(
948 return min_value == Eval(
ct.
arguments[0], evaluator);
951 bool CheckNetworkFlowConservation(
955 std::vector<int64_t> balance(balance_input.
values);
957 const int num_arcs = Size(arcs) / 2;
958 for (
int arc = 0; arc < num_arcs; arc++) {
960 const int head = arcs.
values[arc * 2 + 1] - 1;
961 const int64_t flow = EvalAt(flow_vars, arc, evaluator);
962 balance[
tail] -= flow;
963 balance[
head] += flow;
966 for (
const int64_t
value : balance) {
967 if (
value != 0)
return false;
973 bool CheckNetworkFlow(
980 bool CheckNetworkFlowCost(
988 int64_t total_cost = 0;
990 for (
int arc = 0; arc < num_arcs; arc++) {
991 const int64_t flow = EvalAt(
ct.
arguments[3], arc, evaluator);
993 total_cost += flow *
cost;
996 return total_cost == Eval(
ct.
arguments[4], evaluator);
1001 const int64_t count = Eval(
ct.
arguments[0], evaluator);
1002 absl::flat_hash_set<int64_t> all_values;
1004 all_values.insert(EvalAt(
ct.
arguments[1], i, evaluator));
1007 return count == all_values.size();
1015 bool CheckRegularNfa(
1036 const int64_t status = Eval(
ct.
arguments[2], evaluator);
1040 bool CheckSlidingSum(
1043 const int64_t low = Eval(
ct.
arguments[0], evaluator);
1044 const int64_t up = Eval(
ct.
arguments[1], evaluator);
1045 const int64_t length = Eval(
ct.
arguments[2], evaluator);
1047 int64_t sliding_sum = 0;
1048 for (
int i = 0; i < std::min<int64_t>(length, Size(
ct.
arguments[3])); ++i) {
1049 sliding_sum += EvalAt(
ct.
arguments[3], i, evaluator);
1051 if (sliding_sum < low || sliding_sum > up) {
1054 for (
int i = length; i < Size(
ct.
arguments[3]); ++i) {
1055 sliding_sum += EvalAt(
ct.
arguments[3], i, evaluator) -
1057 if (sliding_sum < low || sliding_sum > up) {
1067 absl::flat_hash_map<int64_t, int> init_count;
1068 absl::flat_hash_map<int64_t, int> sorted_count;
1070 init_count[EvalAt(
ct.
arguments[0], i, evaluator)]++;
1071 sorted_count[EvalAt(
ct.
arguments[1], i, evaluator)]++;
1073 if (init_count != sorted_count) {
1076 for (
int i = 0; i < Size(
ct.
arguments[1]) - 1; ++i) {
1085 bool CheckSubCircuit(
1088 absl::flat_hash_set<int64_t> visited;
1090 int64_t current = -1;
1093 if (
next != i && current == -1) {
1095 }
else if (
next == i) {
1096 visited.insert(
next);
1101 const int residual_size = Size(
ct.
arguments[0]) - visited.size();
1102 for (
int i = 0; i < residual_size; ++i) {
1104 visited.insert(
next);
1105 if (
next == current) {
1120 bool CheckSymmetricAllDifferent(
1124 for (
int i = 0; i < size; ++i) {
1126 if (value < 0 || value >= size) {
1129 const int64_t reverse_value = EvalAt(
ct.
arguments[0],
value, evaluator) - 1;
1130 if (reverse_value != i) {
1137 using CallMap = absl::flat_hash_map<
1148 CallMap CreateCallMap() {
1150 m[
"fzn_all_different_int"] = CheckAllDifferentInt;
1151 m[
"alldifferent_except_0"] = CheckAlldifferentExcept0;
1152 m[
"among"] = CheckAmong;
1153 m[
"array_bool_and"] = CheckArrayBoolAnd;
1154 m[
"array_bool_element"] = CheckArrayIntElement;
1155 m[
"array_bool_or"] = CheckArrayBoolOr;
1156 m[
"array_bool_xor"] = CheckArrayBoolXor;
1157 m[
"array_int_element"] = CheckArrayIntElement;
1158 m[
"array_int_element_nonshifted"] = CheckArrayIntElementNonShifted;
1159 m[
"array_var_bool_element"] = CheckArrayVarIntElement;
1160 m[
"array_var_int_element"] = CheckArrayVarIntElement;
1161 m[
"at_most_int"] = CheckAtMostInt;
1162 m[
"bool_and"] = CheckBoolAnd;
1163 m[
"bool_clause"] = CheckBoolClause;
1164 m[
"bool_eq"] = CheckIntEq;
1165 m[
"bool2int"] = CheckIntEq;
1166 m[
"bool_eq_imp"] = CheckIntEqImp;
1167 m[
"bool_eq_reif"] = CheckIntEqReif;
1168 m[
"bool_ge"] = CheckIntGe;
1169 m[
"bool_ge_imp"] = CheckIntGeImp;
1170 m[
"bool_ge_reif"] = CheckIntGeReif;
1171 m[
"bool_gt"] = CheckIntGt;
1172 m[
"bool_gt_imp"] = CheckIntGtImp;
1173 m[
"bool_gt_reif"] = CheckIntGtReif;
1174 m[
"bool_le"] = CheckIntLe;
1175 m[
"bool_le_imp"] = CheckIntLeImp;
1176 m[
"bool_le_reif"] = CheckIntLeReif;
1177 m[
"bool_left_imp"] = CheckIntLe;
1178 m[
"bool_lin_eq"] = CheckIntLinEq;
1179 m[
"bool_lin_le"] = CheckIntLinLe;
1180 m[
"bool_lt"] = CheckIntLt;
1181 m[
"bool_lt_imp"] = CheckIntLtImp;
1182 m[
"bool_lt_reif"] = CheckIntLtReif;
1183 m[
"bool_ne"] = CheckIntNe;
1184 m[
"bool_ne_imp"] = CheckIntNeImp;
1185 m[
"bool_ne_reif"] = CheckIntNeReif;
1186 m[
"bool_not"] = CheckBoolNot;
1187 m[
"bool_or"] = CheckBoolOr;
1188 m[
"bool_right_imp"] = CheckIntGe;
1189 m[
"bool_xor"] = CheckBoolXor;
1190 m[
"fzn_circuit"] = CheckCircuit;
1191 m[
"count_eq"] = CheckCountEq;
1192 m[
"count"] = CheckCountEq;
1193 m[
"count_geq"] = CheckCountGeq;
1194 m[
"count_gt"] = CheckCountGt;
1195 m[
"count_leq"] = CheckCountLeq;
1196 m[
"count_lt"] = CheckCountLt;
1197 m[
"count_neq"] = CheckCountNeq;
1198 m[
"count_reif"] = CheckCountReif;
1199 m[
"fzn_cumulative"] = CheckCumulative;
1200 m[
"var_cumulative"] = CheckCumulative;
1201 m[
"variable_cumulative"] = CheckCumulative;
1202 m[
"fixed_cumulative"] = CheckCumulative;
1203 m[
"fzn_diffn"] = CheckDiffn;
1204 m[
"diffn_k_with_sizes"] = CheckDiffnK;
1205 m[
"fzn_diffn_nonstrict"] = CheckDiffnNonStrict;
1206 m[
"diffn_nonstrict_k_with_sizes"] = CheckDiffnNonStrictK;
1207 m[
"disjunctive"] = CheckDisjunctive;
1208 m[
"disjunctive_strict"] = CheckDisjunctiveStrict;
1209 m[
"false_constraint"] = CheckFalseConstraint;
1210 m[
"global_cardinality"] = CheckGlobalCardinality;
1211 m[
"global_cardinality_closed"] = CheckGlobalCardinalityClosed;
1212 m[
"global_cardinality_low_up"] = CheckGlobalCardinalityLowUp;
1213 m[
"global_cardinality_low_up_closed"] = CheckGlobalCardinalityLowUpClosed;
1214 m[
"global_cardinality_old"] = CheckGlobalCardinalityOld;
1215 m[
"int_abs"] = CheckIntAbs;
1216 m[
"int_div"] = CheckIntDiv;
1217 m[
"int_eq"] = CheckIntEq;
1218 m[
"int_eq_imp"] = CheckIntEqImp;
1219 m[
"int_eq_reif"] = CheckIntEqReif;
1220 m[
"int_ge"] = CheckIntGe;
1221 m[
"int_ge_imp"] = CheckIntGeImp;
1222 m[
"int_ge_reif"] = CheckIntGeReif;
1223 m[
"int_gt"] = CheckIntGt;
1224 m[
"int_gt_imp"] = CheckIntGtImp;
1225 m[
"int_gt_reif"] = CheckIntGtReif;
1226 m[
"int_le"] = CheckIntLe;
1227 m[
"int_le_imp"] = CheckIntLeImp;
1228 m[
"int_le_reif"] = CheckIntLeReif;
1229 m[
"int_lin_eq"] = CheckIntLinEq;
1230 m[
"int_lin_eq_imp"] = CheckIntLinEqImp;
1231 m[
"int_lin_eq_reif"] = CheckIntLinEqReif;
1232 m[
"int_lin_ge"] = CheckIntLinGe;
1233 m[
"int_lin_ge_imp"] = CheckIntLinGeImp;
1234 m[
"int_lin_ge_reif"] = CheckIntLinGeReif;
1235 m[
"int_lin_le"] = CheckIntLinLe;
1236 m[
"int_lin_le_imp"] = CheckIntLinLeImp;
1237 m[
"int_lin_le_reif"] = CheckIntLinLeReif;
1238 m[
"int_lin_ne"] = CheckIntLinNe;
1239 m[
"int_lin_ne_imp"] = CheckIntLinNeImp;
1240 m[
"int_lin_ne_reif"] = CheckIntLinNeReif;
1241 m[
"int_lt"] = CheckIntLt;
1242 m[
"int_lt_imp"] = CheckIntLtImp;
1243 m[
"int_lt_reif"] = CheckIntLtReif;
1244 m[
"int_max"] = CheckIntMax;
1245 m[
"int_min"] = CheckIntMin;
1246 m[
"int_minus"] = CheckIntMinus;
1247 m[
"int_mod"] = CheckIntMod;
1248 m[
"int_ne"] = CheckIntNe;
1249 m[
"int_ne_imp"] = CheckIntNeImp;
1250 m[
"int_ne_reif"] = CheckIntNeReif;
1251 m[
"int_negate"] = CheckIntNegate;
1252 m[
"int_plus"] = CheckIntPlus;
1253 m[
"int_times"] = CheckIntTimes;
1254 m[
"fzn_inverse"] = CheckInverse;
1255 m[
"lex_less_bool"] = CheckLexLessInt;
1256 m[
"lex_less_int"] = CheckLexLessInt;
1257 m[
"lex_lesseq_bool"] = CheckLexLesseqInt;
1258 m[
"lex_lesseq_int"] = CheckLexLesseqInt;
1259 m[
"maximum_arg_int"] = CheckMaximumArgInt;
1260 m[
"maximum_int"] = CheckMaximumInt;
1261 m[
"array_int_maximum"] = CheckMaximumInt;
1262 m[
"minimum_arg_int"] = CheckMinimumArgInt;
1263 m[
"minimum_int"] = CheckMinimumInt;
1264 m[
"array_int_minimum"] = CheckMinimumInt;
1265 m[
"ortools_network_flow"] = CheckNetworkFlow;
1266 m[
"ortools_network_flow_cost"] = CheckNetworkFlowCost;
1267 m[
"nvalue"] = CheckNvalue;
1268 m[
"ortools_regular"] = CheckRegular;
1269 m[
"regular_nfa"] = CheckRegularNfa;
1270 m[
"set_in"] = CheckSetIn;
1271 m[
"int_in"] = CheckSetIn;
1272 m[
"set_not_in"] = CheckSetNotIn;
1273 m[
"int_not_in"] = CheckSetNotIn;
1274 m[
"set_in_reif"] = CheckSetInReif;
1275 m[
"sliding_sum"] = CheckSlidingSum;
1276 m[
"sort"] = CheckSort;
1277 m[
"fzn_subcircuit"] = CheckSubCircuit;
1278 m[
"symmetric_all_different"] = CheckSymmetricAllDifferent;
1279 m[
"ortools_table_bool"] = CheckTableInt;
1280 m[
"ortools_table_int"] = CheckTableInt;
1290 const CallMap call_map = CreateCallMap();
1294 if (!checker(*
ct, evaluator)) {
#define CHECK_EQ(val1, val2)
bool ContainsKey(const Collection &collection, const Key &key)
const Collection::value_type::second_type & FindOrDie(const Collection &collection, const typename Collection::value_type::first_type &key)
bool CheckSolution(const Model &model, const std::function< int64_t(IntegerVariable *)> &evaluator, SolverLogger *logger)
Collection of objects used to extend the Constraint Solver library.
IntegerVariable * Var() const
std::vector< IntegerVariable * > variables
IntegerVariable * VarAt(int pos) const
std::string DebugString() const
std::vector< int64_t > values
int64_t ValueAt(int pos) const
std::string DebugString() const
std::vector< Argument > arguments
#define SOLVER_LOG(logger,...)