20 #include "absl/container/flat_hash_map.h" 21 #include "absl/container/flat_hash_set.h" 33 const std::function<int64_t(
Variable*)>& evaluator) {
39 return evaluator(arg.
Var());
52 int64_t EvalAt(
const Argument& arg,
int pos,
53 const std::function<int64_t(
Variable*)>& evaluator) {
59 return evaluator(arg.
VarAt(pos));
71 const std::function<int64_t(
Variable*)>& evaluator) {
72 absl::flat_hash_set<int64_t> visited;
78 visited.insert(
value);
84 bool CheckAlldifferentExcept0(
86 absl::flat_hash_set<int64_t> visited;
92 visited.insert(
value);
99 const std::function<int64_t(
Variable*)>& evaluator) {
100 const int64_t expected = Eval(
ct.
arguments[0], evaluator);
107 return count == expected;
111 const std::function<int64_t(
Variable*)>& evaluator) {
123 const std::function<int64_t(
Variable*)>& evaluator) {
135 const std::function<int64_t(
Variable*)>& evaluator) {
142 return result % 2 == 1;
146 const std::function<int64_t(
Variable*)>& evaluator) {
152 const int64_t shifted_index = Eval(
ct.
arguments[0], evaluator) - 1;
153 const int64_t element = EvalAt(
ct.
arguments[1], shifted_index, evaluator);
154 const int64_t target = Eval(
ct.
arguments[2], evaluator);
155 return element == target;
158 bool CheckArrayIntElementNonShifted(
163 const int64_t target = Eval(
ct.
arguments[2], evaluator);
164 return element == target;
167 bool CheckArrayVarIntElement(
174 const int64_t shifted_index = Eval(
ct.
arguments[0], evaluator) - 1;
175 const int64_t element = EvalAt(
ct.
arguments[1], shifted_index, evaluator);
176 const int64_t target = Eval(
ct.
arguments[2], evaluator);
177 return element == target;
181 const std::function<int64_t(
Variable*)>& evaluator) {
182 const int64_t expected = Eval(
ct.
arguments[0], evaluator);
189 return count <= expected;
193 const std::function<int64_t(
Variable*)>& evaluator) {
194 const int64_t left = Eval(
ct.
arguments[0], evaluator);
195 const int64_t right = Eval(
ct.
arguments[1], evaluator);
196 const int64_t status = Eval(
ct.
arguments[2], evaluator);
197 return status ==
std::min(left, right);
201 const std::function<int64_t(
Variable*)>& evaluator) {
219 const std::function<int64_t(
Variable*)>& evaluator) {
220 const int64_t left = Eval(
ct.
arguments[0], evaluator);
221 const int64_t right = Eval(
ct.
arguments[1], evaluator);
222 return left == 1 - right;
226 const std::function<int64_t(
Variable*)>& evaluator) {
227 const int64_t left = Eval(
ct.
arguments[0], evaluator);
228 const int64_t right = Eval(
ct.
arguments[1], evaluator);
229 const int64_t status = Eval(
ct.
arguments[2], evaluator);
230 return status ==
std::max(left, right);
234 const std::function<int64_t(
Variable*)>& evaluator) {
235 const int64_t left = Eval(
ct.
arguments[0], evaluator);
236 const int64_t right = Eval(
ct.
arguments[1], evaluator);
237 const int64_t target = Eval(
ct.
arguments[2], evaluator);
238 return target == (left + right == 1);
242 const std::function<int64_t(
Variable*)>& evaluator) {
246 absl::flat_hash_set<int64_t> visited;
248 for (
int i = 0; i < size; ++i) {
249 const int64_t
next = EvalAt(
ct.
arguments[0], current, evaluator) - base;
250 visited.insert(
next);
253 return visited.size() == size;
257 const std::function<int64_t(
Variable*)>& evaluator) {
267 const std::function<int64_t(
Variable*)>& evaluator) {
268 const int64_t count = ComputeCount(
ct, evaluator);
269 const int64_t expected = Eval(
ct.
arguments[2], evaluator);
270 return count == expected;
274 const std::function<int64_t(
Variable*)>& evaluator) {
275 const int64_t count = ComputeCount(
ct, evaluator);
276 const int64_t expected = Eval(
ct.
arguments[2], evaluator);
277 return count >= expected;
281 const std::function<int64_t(
Variable*)>& evaluator) {
282 const int64_t count = ComputeCount(
ct, evaluator);
283 const int64_t expected = Eval(
ct.
arguments[2], evaluator);
284 return count > expected;
288 const std::function<int64_t(
Variable*)>& evaluator) {
289 const int64_t count = ComputeCount(
ct, evaluator);
290 const int64_t expected = Eval(
ct.
arguments[2], evaluator);
291 return count <= expected;
295 const std::function<int64_t(
Variable*)>& evaluator) {
296 const int64_t count = ComputeCount(
ct, evaluator);
297 const int64_t expected = Eval(
ct.
arguments[2], evaluator);
298 return count < expected;
302 const std::function<int64_t(
Variable*)>& evaluator) {
303 const int64_t count = ComputeCount(
ct, evaluator);
304 const int64_t expected = Eval(
ct.
arguments[2], evaluator);
305 return count != expected;
309 const std::function<int64_t(
Variable*)>& evaluator) {
310 const int64_t count = ComputeCount(
ct, evaluator);
311 const int64_t expected = Eval(
ct.
arguments[2], evaluator);
312 const int64_t status = Eval(
ct.
arguments[3], evaluator);
313 return status == (expected == count);
317 const std::function<int64_t(
Variable*)>& evaluator) {
323 absl::flat_hash_map<int64_t, int64_t> usage;
324 for (
int i = 0; i < size; ++i) {
325 const int64_t start = EvalAt(
ct.
arguments[0], i, evaluator);
326 const int64_t duration = EvalAt(
ct.
arguments[1], i, evaluator);
327 const int64_t requirement = EvalAt(
ct.
arguments[2], i, evaluator);
328 for (int64_t t = start; t < start + duration; ++t) {
329 usage[t] += requirement;
339 const std::function<int64_t(
Variable*)>& evaluator) {
344 const std::function<int64_t(
Variable*)>& evaluator) {
349 const std::function<int64_t(
Variable*)>& evaluator) {
354 const std::function<int64_t(
Variable*)>& evaluator) {
359 const std::function<int64_t(
Variable*)>& evaluator) {
363 bool CheckDisjunctiveStrict(
369 const std::function<int64_t(
Variable*)>& evaluator) {
373 std::vector<int64_t> ComputeGlobalCardinalityCards(
375 std::vector<int64_t> cards(Size(
ct.
arguments[1]), 0);
376 absl::flat_hash_map<int64_t, int> positions;
377 for (
int i = 0; i <
ct.
arguments[1].values.size(); ++i) {
380 positions[
value] = i;
385 cards[positions[
value]]++;
391 bool CheckGlobalCardinality(
393 const std::vector<int64_t> cards =
394 ComputeGlobalCardinalityCards(
ct, evaluator);
397 const int64_t card = EvalAt(
ct.
arguments[2], i, evaluator);
398 if (card != cards[i]) {
405 bool CheckGlobalCardinalityClosed(
407 const std::vector<int64_t> cards =
408 ComputeGlobalCardinalityCards(
ct, evaluator);
411 const int64_t card = EvalAt(
ct.
arguments[2], i, evaluator);
412 if (card != cards[i]) {
416 int64_t sum_of_cards = 0;
417 for (int64_t card : cards) {
418 sum_of_cards += card;
423 bool CheckGlobalCardinalityLowUp(
425 const std::vector<int64_t> cards =
426 ComputeGlobalCardinalityCards(
ct, evaluator);
429 for (
int i = 0; i < cards.size(); ++i) {
430 const int64_t card = cards[i];
438 bool CheckGlobalCardinalityLowUpClosed(
440 const std::vector<int64_t> cards =
441 ComputeGlobalCardinalityCards(
ct, evaluator);
444 for (
int i = 0; i < cards.size(); ++i) {
445 const int64_t card = cards[i];
450 int64_t sum_of_cards = 0;
451 for (int64_t card : cards) {
452 sum_of_cards += card;
457 bool CheckGlobalCardinalityOld(
460 std::vector<int64_t> cards(size, 0);
467 for (
int i = 0; i < size; ++i) {
468 const int64_t card = EvalAt(
ct.
arguments[1], i, evaluator);
469 if (card != cards[i]) {
477 const std::function<int64_t(
Variable*)>& evaluator) {
478 const int64_t left = Eval(
ct.
arguments[0], evaluator);
479 const int64_t right = Eval(
ct.
arguments[1], evaluator);
480 return std::abs(left) == right;
484 const std::function<int64_t(
Variable*)>& evaluator) {
485 const int64_t left = Eval(
ct.
arguments[0], evaluator);
486 const int64_t right = Eval(
ct.
arguments[1], evaluator);
487 const int64_t target = Eval(
ct.
arguments[2], evaluator);
488 return target == left / right;
492 const std::function<int64_t(
Variable*)>& evaluator) {
493 const int64_t left = Eval(
ct.
arguments[0], evaluator);
494 const int64_t right = Eval(
ct.
arguments[1], evaluator);
495 return left == right;
499 const std::function<int64_t(
Variable*)>& evaluator) {
500 const int64_t left = Eval(
ct.
arguments[0], evaluator);
501 const int64_t right = Eval(
ct.
arguments[1], evaluator);
502 const bool status = Eval(
ct.
arguments[2], evaluator) != 0;
503 return (status && (left == right)) || !status;
507 const std::function<int64_t(
Variable*)>& evaluator) {
508 const int64_t left = Eval(
ct.
arguments[0], evaluator);
509 const int64_t right = Eval(
ct.
arguments[1], evaluator);
510 const bool status = Eval(
ct.
arguments[2], evaluator) != 0;
511 return status == (left == right);
515 const std::function<int64_t(
Variable*)>& evaluator) {
516 const int64_t left = Eval(
ct.
arguments[0], evaluator);
517 const int64_t right = Eval(
ct.
arguments[1], evaluator);
518 return left >= right;
522 const std::function<int64_t(
Variable*)>& evaluator) {
523 const int64_t left = Eval(
ct.
arguments[0], evaluator);
524 const int64_t right = Eval(
ct.
arguments[1], evaluator);
525 const bool status = Eval(
ct.
arguments[2], evaluator) != 0;
526 return (status && (left >= right)) || !status;
530 const std::function<int64_t(
Variable*)>& evaluator) {
531 const int64_t left = Eval(
ct.
arguments[0], evaluator);
532 const int64_t right = Eval(
ct.
arguments[1], evaluator);
533 const bool status = Eval(
ct.
arguments[2], evaluator) != 0;
534 return status == (left >= right);
538 const std::function<int64_t(
Variable*)>& evaluator) {
539 const int64_t left = Eval(
ct.
arguments[0], evaluator);
540 const int64_t right = Eval(
ct.
arguments[1], evaluator);
545 const std::function<int64_t(
Variable*)>& evaluator) {
546 const int64_t left = Eval(
ct.
arguments[0], evaluator);
547 const int64_t right = Eval(
ct.
arguments[1], evaluator);
548 const bool status = Eval(
ct.
arguments[2], evaluator) != 0;
549 return (status && (left > right)) || !status;
553 const std::function<int64_t(
Variable*)>& evaluator) {
554 const int64_t left = Eval(
ct.
arguments[0], evaluator);
555 const int64_t right = Eval(
ct.
arguments[1], evaluator);
556 const bool status = Eval(
ct.
arguments[2], evaluator) != 0;
557 return status == (left > right);
561 const std::function<int64_t(
Variable*)>& evaluator) {
562 const int64_t left = Eval(
ct.
arguments[0], evaluator);
563 const int64_t right = Eval(
ct.
arguments[1], evaluator);
564 return left <= right;
568 const std::function<int64_t(
Variable*)>& evaluator) {
569 const int64_t left = Eval(
ct.
arguments[0], evaluator);
570 const int64_t right = Eval(
ct.
arguments[1], evaluator);
571 const bool status = Eval(
ct.
arguments[2], evaluator) != 0;
572 return (status && (left <= right)) || !status;
576 const std::function<int64_t(
Variable*)>& evaluator) {
577 const int64_t left = Eval(
ct.
arguments[0], evaluator);
578 const int64_t right = Eval(
ct.
arguments[1], evaluator);
579 const bool status = Eval(
ct.
arguments[2], evaluator) != 0;
580 return status == (left <= right);
584 const std::function<int64_t(
Variable*)>& evaluator) {
585 const int64_t left = Eval(
ct.
arguments[0], evaluator);
586 const int64_t right = Eval(
ct.
arguments[1], evaluator);
591 const std::function<int64_t(
Variable*)>& evaluator) {
592 const int64_t left = Eval(
ct.
arguments[0], evaluator);
593 const int64_t right = Eval(
ct.
arguments[1], evaluator);
594 const bool status = Eval(
ct.
arguments[2], evaluator) != 0;
595 return (status && (left < right)) || !status;
599 const std::function<int64_t(
Variable*)>& evaluator) {
600 const int64_t left = Eval(
ct.
arguments[0], evaluator);
601 const int64_t right = Eval(
ct.
arguments[1], evaluator);
602 const bool status = Eval(
ct.
arguments[2], evaluator) != 0;
603 return status == (left < right);
607 const std::function<int64_t(
Variable*)>& evaluator) {
617 const std::function<int64_t(
Variable*)>& evaluator) {
618 const int64_t left = ComputeIntLin(
ct, evaluator);
619 const int64_t right = Eval(
ct.
arguments[2], evaluator);
620 return left == right;
624 const std::function<int64_t(
Variable*)>& evaluator) {
625 const int64_t left = ComputeIntLin(
ct, evaluator);
626 const int64_t right = Eval(
ct.
arguments[2], evaluator);
627 const bool status = Eval(
ct.
arguments[3], evaluator) != 0;
628 return (status && (left == right)) || !status;
632 const std::function<int64_t(
Variable*)>& evaluator) {
633 const int64_t left = ComputeIntLin(
ct, evaluator);
634 const int64_t right = Eval(
ct.
arguments[2], evaluator);
635 const bool status = Eval(
ct.
arguments[3], evaluator) != 0;
636 return status == (left == right);
640 const std::function<int64_t(
Variable*)>& evaluator) {
641 const int64_t left = ComputeIntLin(
ct, evaluator);
642 const int64_t right = Eval(
ct.
arguments[2], evaluator);
643 return left >= right;
647 const std::function<int64_t(
Variable*)>& evaluator) {
648 const int64_t left = ComputeIntLin(
ct, evaluator);
649 const int64_t right = Eval(
ct.
arguments[2], evaluator);
650 const bool status = Eval(
ct.
arguments[3], evaluator) != 0;
651 return (status && (left >= right)) || !status;
655 const std::function<int64_t(
Variable*)>& evaluator) {
656 const int64_t left = ComputeIntLin(
ct, evaluator);
657 const int64_t right = Eval(
ct.
arguments[2], evaluator);
658 const bool status = Eval(
ct.
arguments[3], evaluator) != 0;
659 return status == (left >= right);
663 const std::function<int64_t(
Variable*)>& evaluator) {
664 const int64_t left = ComputeIntLin(
ct, evaluator);
665 const int64_t right = Eval(
ct.
arguments[2], evaluator);
666 return left <= right;
670 const std::function<int64_t(
Variable*)>& evaluator) {
671 const int64_t left = ComputeIntLin(
ct, evaluator);
672 const int64_t right = Eval(
ct.
arguments[2], evaluator);
673 const bool status = Eval(
ct.
arguments[3], evaluator) != 0;
674 return (status && (left <= right)) || !status;
678 const std::function<int64_t(
Variable*)>& evaluator) {
679 const int64_t left = ComputeIntLin(
ct, evaluator);
680 const int64_t right = Eval(
ct.
arguments[2], evaluator);
681 const bool status = Eval(
ct.
arguments[3], evaluator) != 0;
682 return status == (left <= right);
686 const std::function<int64_t(
Variable*)>& evaluator) {
687 const int64_t left = ComputeIntLin(
ct, evaluator);
688 const int64_t right = Eval(
ct.
arguments[2], evaluator);
689 return left != right;
693 const std::function<int64_t(
Variable*)>& evaluator) {
694 const int64_t left = ComputeIntLin(
ct, evaluator);
695 const int64_t right = Eval(
ct.
arguments[2], evaluator);
696 const bool status = Eval(
ct.
arguments[3], evaluator) != 0;
697 return (status && (left != right)) || !status;
701 const std::function<int64_t(
Variable*)>& evaluator) {
702 const int64_t left = ComputeIntLin(
ct, evaluator);
703 const int64_t right = Eval(
ct.
arguments[2], evaluator);
704 const bool status = Eval(
ct.
arguments[3], evaluator) != 0;
705 return status == (left != right);
709 const std::function<int64_t(
Variable*)>& evaluator) {
710 const int64_t left = Eval(
ct.
arguments[0], evaluator);
711 const int64_t right = Eval(
ct.
arguments[1], evaluator);
712 const int64_t status = Eval(
ct.
arguments[2], evaluator);
713 return status ==
std::max(left, right);
717 const std::function<int64_t(
Variable*)>& evaluator) {
718 const int64_t left = Eval(
ct.
arguments[0], evaluator);
719 const int64_t right = Eval(
ct.
arguments[1], evaluator);
720 const int64_t status = Eval(
ct.
arguments[2], evaluator);
721 return status ==
std::min(left, right);
725 const std::function<int64_t(
Variable*)>& evaluator) {
726 const int64_t left = Eval(
ct.
arguments[0], evaluator);
727 const int64_t right = Eval(
ct.
arguments[1], evaluator);
728 const int64_t target = Eval(
ct.
arguments[2], evaluator);
729 return target == left - right;
733 const std::function<int64_t(
Variable*)>& evaluator) {
734 const int64_t left = Eval(
ct.
arguments[0], evaluator);
735 const int64_t right = Eval(
ct.
arguments[1], evaluator);
736 const int64_t target = Eval(
ct.
arguments[2], evaluator);
737 return target == left % right;
741 const std::function<int64_t(
Variable*)>& evaluator) {
742 const int64_t left = Eval(
ct.
arguments[0], evaluator);
743 const int64_t right = Eval(
ct.
arguments[1], evaluator);
744 return left != right;
748 const std::function<int64_t(
Variable*)>& evaluator) {
749 const int64_t left = Eval(
ct.
arguments[0], evaluator);
750 const int64_t right = Eval(
ct.
arguments[1], evaluator);
751 const bool status = Eval(
ct.
arguments[2], evaluator) != 0;
752 return (status && (left != right)) || !status;
756 const std::function<int64_t(
Variable*)>& evaluator) {
757 const int64_t left = Eval(
ct.
arguments[0], evaluator);
758 const int64_t right = Eval(
ct.
arguments[1], evaluator);
759 const bool status = Eval(
ct.
arguments[2], evaluator) != 0;
760 return status == (left != right);
764 const std::function<int64_t(
Variable*)>& evaluator) {
765 const int64_t left = Eval(
ct.
arguments[0], evaluator);
766 const int64_t right = Eval(
ct.
arguments[1], evaluator);
767 return left == -right;
771 const std::function<int64_t(
Variable*)>& evaluator) {
772 const int64_t left = Eval(
ct.
arguments[0], evaluator);
773 const int64_t right = Eval(
ct.
arguments[1], evaluator);
774 const int64_t target = Eval(
ct.
arguments[2], evaluator);
775 return target == left + right;
779 const std::function<int64_t(
Variable*)>& evaluator) {
780 const int64_t left = Eval(
ct.
arguments[0], evaluator);
781 const int64_t right = Eval(
ct.
arguments[1], evaluator);
782 const int64_t target = Eval(
ct.
arguments[2], evaluator);
783 return target == left * right;
787 const std::function<int64_t(
Variable*)>& evaluator) {
793 for (
int i = 0; i < size; ++i) {
794 const int64_t x = EvalAt(
ct.
arguments[0], i, evaluator) - invf_base;
795 const int64_t y = EvalAt(
ct.
arguments[1], i, evaluator) - f_base;
796 if (x < 0 || x >= size || y < 0 || y >= size) {
802 for (
int i = 0; i < size; ++i) {
803 const int64_t fi = EvalAt(
ct.
arguments[0], i, evaluator) - invf_base;
804 const int64_t invf_fi = EvalAt(
ct.
arguments[1], fi, evaluator) - f_base;
814 const std::function<int64_t(
Variable*)>& evaluator) {
817 const int64_t x = EvalAt(
ct.
arguments[0], i, evaluator);
818 const int64_t y = EvalAt(
ct.
arguments[1], i, evaluator);
831 const std::function<int64_t(
Variable*)>& evaluator) {
834 const int64_t x = EvalAt(
ct.
arguments[0], i, evaluator);
835 const int64_t y = EvalAt(
ct.
arguments[1], i, evaluator);
848 const std::function<int64_t(
Variable*)>& evaluator) {
849 const int64_t max_index = Eval(
ct.
arguments[1], evaluator) - 1;
850 const int64_t max_value = EvalAt(
ct.
arguments[0], max_index, evaluator);
852 for (
int i = 0; i < max_index; ++i) {
853 if (EvalAt(
ct.
arguments[0], i, evaluator) >= max_value) {
858 for (
int i = max_index + 1; i < Size(
ct.
arguments[0]); i++) {
859 if (EvalAt(
ct.
arguments[0], i, evaluator) > max_value) {
868 const std::function<int64_t(
Variable*)>& evaluator) {
873 return max_value == Eval(
ct.
arguments[0], evaluator);
877 const std::function<int64_t(
Variable*)>& evaluator) {
878 const int64_t min_index = Eval(
ct.
arguments[1], evaluator) - 1;
879 const int64_t min_value = EvalAt(
ct.
arguments[0], min_index, evaluator);
881 for (
int i = 0; i < min_index; ++i) {
882 if (EvalAt(
ct.
arguments[0], i, evaluator) <= min_value) {
887 for (
int i = min_index + 1; i < Size(
ct.
arguments[0]); i++) {
888 if (EvalAt(
ct.
arguments[0], i, evaluator) < min_value) {
897 const std::function<int64_t(
Variable*)>& evaluator) {
902 return min_value == Eval(
ct.
arguments[0], evaluator);
905 bool CheckNetworkFlowConservation(
908 const std::function<int64_t(
Variable*)>& evaluator) {
909 std::vector<int64_t> balance(balance_input.
values);
911 const int num_arcs = Size(arcs) / 2;
912 for (
int arc = 0; arc < num_arcs; arc++) {
914 const int head = arcs.
values[arc * 2 + 1] - 1;
915 const int64_t flow = EvalAt(flow_vars, arc, evaluator);
916 balance[
tail] -= flow;
917 balance[
head] += flow;
920 for (
const int64_t
value : balance) {
921 if (
value != 0)
return false;
928 const std::function<int64_t(
Variable*)>& evaluator) {
934 const std::function<int64_t(
Variable*)>& evaluator) {
940 int64_t total_cost = 0;
942 for (
int arc = 0; arc < num_arcs; arc++) {
943 const int64_t flow = EvalAt(
ct.
arguments[3], arc, evaluator);
945 total_cost += flow *
cost;
948 return total_cost == Eval(
ct.
arguments[4], evaluator);
952 const std::function<int64_t(
Variable*)>& evaluator) {
953 const int64_t count = Eval(
ct.
arguments[0], evaluator);
954 absl::flat_hash_set<int64_t> all_values;
956 all_values.insert(EvalAt(
ct.
arguments[1], i, evaluator));
959 return count == all_values.size();
963 const std::function<int64_t(
Variable*)>& evaluator) {
968 const std::function<int64_t(
Variable*)>& evaluator) {
973 const std::function<int64_t(
Variable*)>& evaluator) {
979 const std::function<int64_t(
Variable*)>& evaluator) {
985 const std::function<int64_t(
Variable*)>& evaluator) {
987 const int64_t status = Eval(
ct.
arguments[2], evaluator);
992 const std::function<int64_t(
Variable*)>& evaluator) {
993 const int64_t low = Eval(
ct.
arguments[0], evaluator);
994 const int64_t up = Eval(
ct.
arguments[1], evaluator);
995 const int64_t length = Eval(
ct.
arguments[2], evaluator);
997 int64_t sliding_sum = 0;
998 for (
int i = 0; i < std::min<int64_t>(length, Size(
ct.
arguments[3])); ++i) {
999 sliding_sum += EvalAt(
ct.
arguments[3], i, evaluator);
1001 if (sliding_sum < low || sliding_sum > up) {
1004 for (
int i = length; i < Size(
ct.
arguments[3]); ++i) {
1005 sliding_sum += EvalAt(
ct.
arguments[3], i, evaluator) -
1007 if (sliding_sum < low || sliding_sum > up) {
1015 const std::function<int64_t(
Variable*)>& evaluator) {
1017 absl::flat_hash_map<int64_t, int> init_count;
1018 absl::flat_hash_map<int64_t, int> sorted_count;
1020 init_count[EvalAt(
ct.
arguments[0], i, evaluator)]++;
1021 sorted_count[EvalAt(
ct.
arguments[1], i, evaluator)]++;
1023 if (init_count != sorted_count) {
1026 for (
int i = 0; i < Size(
ct.
arguments[1]) - 1; ++i) {
1036 const std::function<int64_t(
Variable*)>& evaluator) {
1037 absl::flat_hash_set<int64_t> visited;
1040 int64_t current = -1;
1043 if (
next != i && current == -1) {
1045 }
else if (
next == i) {
1046 visited.insert(
next);
1051 const int residual_size = Size(
ct.
arguments[0]) - visited.size();
1052 for (
int i = 0; i < residual_size; ++i) {
1053 const int64_t
next = EvalAt(
ct.
arguments[0], current, evaluator) - base;
1054 visited.insert(
next);
1055 if (
next == current) {
1066 const std::function<int64_t(
Variable*)>& evaluator) {
1070 bool CheckSymmetricAllDifferent(
1073 for (
int i = 0; i < size; ++i) {
1075 if (value < 0 || value >= size) {
1078 const int64_t reverse_value = EvalAt(
ct.
arguments[0],
value, evaluator) - 1;
1079 if (reverse_value != i) {
1087 absl::flat_hash_map<std::string,
1089 std::function<int64_t(
Variable*)>)>>;
1098 CallMap CreateCallMap() {
1100 m[
"fzn_all_different_int"] = CheckAllDifferentInt;
1101 m[
"alldifferent_except_0"] = CheckAlldifferentExcept0;
1102 m[
"among"] = CheckAmong;
1103 m[
"array_bool_and"] = CheckArrayBoolAnd;
1104 m[
"array_bool_element"] = CheckArrayIntElement;
1105 m[
"array_bool_or"] = CheckArrayBoolOr;
1106 m[
"array_bool_xor"] = CheckArrayBoolXor;
1107 m[
"array_int_element"] = CheckArrayIntElement;
1108 m[
"array_int_element_nonshifted"] = CheckArrayIntElementNonShifted;
1109 m[
"array_var_bool_element"] = CheckArrayVarIntElement;
1110 m[
"array_var_int_element"] = CheckArrayVarIntElement;
1111 m[
"at_most_int"] = CheckAtMostInt;
1112 m[
"bool_and"] = CheckBoolAnd;
1113 m[
"bool_clause"] = CheckBoolClause;
1114 m[
"bool_eq"] = CheckIntEq;
1115 m[
"bool2int"] = CheckIntEq;
1116 m[
"bool_eq_imp"] = CheckIntEqImp;
1117 m[
"bool_eq_reif"] = CheckIntEqReif;
1118 m[
"bool_ge"] = CheckIntGe;
1119 m[
"bool_ge_imp"] = CheckIntGeImp;
1120 m[
"bool_ge_reif"] = CheckIntGeReif;
1121 m[
"bool_gt"] = CheckIntGt;
1122 m[
"bool_gt_imp"] = CheckIntGtImp;
1123 m[
"bool_gt_reif"] = CheckIntGtReif;
1124 m[
"bool_le"] = CheckIntLe;
1125 m[
"bool_le_imp"] = CheckIntLeImp;
1126 m[
"bool_le_reif"] = CheckIntLeReif;
1127 m[
"bool_left_imp"] = CheckIntLe;
1128 m[
"bool_lin_eq"] = CheckIntLinEq;
1129 m[
"bool_lin_le"] = CheckIntLinLe;
1130 m[
"bool_lt"] = CheckIntLt;
1131 m[
"bool_lt_imp"] = CheckIntLtImp;
1132 m[
"bool_lt_reif"] = CheckIntLtReif;
1133 m[
"bool_ne"] = CheckIntNe;
1134 m[
"bool_ne_imp"] = CheckIntNeImp;
1135 m[
"bool_ne_reif"] = CheckIntNeReif;
1136 m[
"bool_not"] = CheckBoolNot;
1137 m[
"bool_or"] = CheckBoolOr;
1138 m[
"bool_right_imp"] = CheckIntGe;
1139 m[
"bool_xor"] = CheckBoolXor;
1140 m[
"ortools_circuit"] = CheckCircuit;
1141 m[
"count_eq"] = CheckCountEq;
1142 m[
"count"] = CheckCountEq;
1143 m[
"count_geq"] = CheckCountGeq;
1144 m[
"count_gt"] = CheckCountGt;
1145 m[
"count_leq"] = CheckCountLeq;
1146 m[
"count_lt"] = CheckCountLt;
1147 m[
"count_neq"] = CheckCountNeq;
1148 m[
"count_reif"] = CheckCountReif;
1149 m[
"fzn_cumulative"] = CheckCumulative;
1150 m[
"var_cumulative"] = CheckCumulative;
1151 m[
"variable_cumulative"] = CheckCumulative;
1152 m[
"fixed_cumulative"] = CheckCumulative;
1153 m[
"fzn_diffn"] = CheckDiffn;
1154 m[
"diffn_k_with_sizes"] = CheckDiffnK;
1155 m[
"fzn_diffn_nonstrict"] = CheckDiffnNonStrict;
1156 m[
"diffn_nonstrict_k_with_sizes"] = CheckDiffnNonStrictK;
1157 m[
"disjunctive"] = CheckDisjunctive;
1158 m[
"disjunctive_strict"] = CheckDisjunctiveStrict;
1159 m[
"false_constraint"] = CheckFalseConstraint;
1160 m[
"global_cardinality"] = CheckGlobalCardinality;
1161 m[
"global_cardinality_closed"] = CheckGlobalCardinalityClosed;
1162 m[
"global_cardinality_low_up"] = CheckGlobalCardinalityLowUp;
1163 m[
"global_cardinality_low_up_closed"] = CheckGlobalCardinalityLowUpClosed;
1164 m[
"global_cardinality_old"] = CheckGlobalCardinalityOld;
1165 m[
"int_abs"] = CheckIntAbs;
1166 m[
"int_div"] = CheckIntDiv;
1167 m[
"int_eq"] = CheckIntEq;
1168 m[
"int_eq_imp"] = CheckIntEqImp;
1169 m[
"int_eq_reif"] = CheckIntEqReif;
1170 m[
"int_ge"] = CheckIntGe;
1171 m[
"int_ge_imp"] = CheckIntGeImp;
1172 m[
"int_ge_reif"] = CheckIntGeReif;
1173 m[
"int_gt"] = CheckIntGt;
1174 m[
"int_gt_imp"] = CheckIntGtImp;
1175 m[
"int_gt_reif"] = CheckIntGtReif;
1176 m[
"int_le"] = CheckIntLe;
1177 m[
"int_le_imp"] = CheckIntLeImp;
1178 m[
"int_le_reif"] = CheckIntLeReif;
1179 m[
"int_lin_eq"] = CheckIntLinEq;
1180 m[
"int_lin_eq_imp"] = CheckIntLinEqImp;
1181 m[
"int_lin_eq_reif"] = CheckIntLinEqReif;
1182 m[
"int_lin_ge"] = CheckIntLinGe;
1183 m[
"int_lin_ge_imp"] = CheckIntLinGeImp;
1184 m[
"int_lin_ge_reif"] = CheckIntLinGeReif;
1185 m[
"int_lin_le"] = CheckIntLinLe;
1186 m[
"int_lin_le_imp"] = CheckIntLinLeImp;
1187 m[
"int_lin_le_reif"] = CheckIntLinLeReif;
1188 m[
"int_lin_ne"] = CheckIntLinNe;
1189 m[
"int_lin_ne_imp"] = CheckIntLinNeImp;
1190 m[
"int_lin_ne_reif"] = CheckIntLinNeReif;
1191 m[
"int_lt"] = CheckIntLt;
1192 m[
"int_lt_imp"] = CheckIntLtImp;
1193 m[
"int_lt_reif"] = CheckIntLtReif;
1194 m[
"int_max"] = CheckIntMax;
1195 m[
"int_min"] = CheckIntMin;
1196 m[
"int_minus"] = CheckIntMinus;
1197 m[
"int_mod"] = CheckIntMod;
1198 m[
"int_ne"] = CheckIntNe;
1199 m[
"int_ne_imp"] = CheckIntNeImp;
1200 m[
"int_ne_reif"] = CheckIntNeReif;
1201 m[
"int_negate"] = CheckIntNegate;
1202 m[
"int_plus"] = CheckIntPlus;
1203 m[
"int_times"] = CheckIntTimes;
1204 m[
"ortools_inverse"] = CheckInverse;
1205 m[
"lex_less_bool"] = CheckLexLessInt;
1206 m[
"lex_less_int"] = CheckLexLessInt;
1207 m[
"lex_lesseq_bool"] = CheckLexLesseqInt;
1208 m[
"lex_lesseq_int"] = CheckLexLesseqInt;
1209 m[
"maximum_arg_int"] = CheckMaximumArgInt;
1210 m[
"maximum_int"] = CheckMaximumInt;
1211 m[
"array_int_maximum"] = CheckMaximumInt;
1212 m[
"minimum_arg_int"] = CheckMinimumArgInt;
1213 m[
"minimum_int"] = CheckMinimumInt;
1214 m[
"array_int_minimum"] = CheckMinimumInt;
1215 m[
"ortools_network_flow"] = CheckNetworkFlow;
1216 m[
"ortools_network_flow_cost"] = CheckNetworkFlowCost;
1217 m[
"nvalue"] = CheckNvalue;
1218 m[
"ortools_regular"] = CheckRegular;
1219 m[
"regular_nfa"] = CheckRegularNfa;
1220 m[
"set_in"] = CheckSetIn;
1221 m[
"int_in"] = CheckSetIn;
1222 m[
"set_not_in"] = CheckSetNotIn;
1223 m[
"int_not_in"] = CheckSetNotIn;
1224 m[
"set_in_reif"] = CheckSetInReif;
1225 m[
"sliding_sum"] = CheckSlidingSum;
1226 m[
"sort"] = CheckSort;
1227 m[
"ortools_subcircuit"] = CheckSubCircuit;
1228 m[
"symmetric_all_different"] = CheckSymmetricAllDifferent;
1229 m[
"ortools_table_bool"] = CheckTableInt;
1230 m[
"ortools_table_int"] = CheckTableInt;
1237 const std::function<int64_t(
Variable*)>& evaluator,
1240 const CallMap call_map = CreateCallMap();
1244 if (!checker(*
ct, evaluator)) {
std::string DebugString() const
#define SOLVER_LOG(logger,...)
int64_t ValueAt(int pos) const
std::string DebugString() const
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)
std::vector< Variable * > variables
Variable * VarAt(int pos) const
#define CHECK_EQ(val1, val2)
bool CheckSolution(const Model &model, const std::function< int64_t(Variable *)> &evaluator, SolverLogger *logger)
Collection of objects used to extend the Constraint Solver library.
std::vector< Argument > arguments
std::vector< int64_t > values