Skip to content

Commit 6d31264

Browse files
committed
[FZ] support set_le and set_lt; turn off the nosets flag
1 parent 3ca6e92 commit 6d31264

File tree

3 files changed

+288
-136
lines changed

3 files changed

+288
-136
lines changed

ortools/flatzinc/checker.cc

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "ortools/flatzinc/checker.h"
1515

1616
#include <algorithm>
17+
#include <compare>
1718
#include <cstdint>
1819
#include <cstdlib>
1920
#include <functional>
@@ -1404,6 +1405,32 @@ bool CheckSetNe(
14041405
return values_x != values_y;
14051406
}
14061407

1408+
bool CheckSetLe(
1409+
const Constraint& ct, const std::function<int64_t(Variable*)>& evaluator,
1410+
const std::function<std::vector<int64_t>(Variable*)>& set_evaluator) {
1411+
const std::vector<int64_t> values_x = SetEval(ct.arguments[0], set_evaluator);
1412+
const std::vector<int64_t> values_y = SetEval(ct.arguments[1], set_evaluator);
1413+
const int min_size = std::min(values_x.size(), values_y.size());
1414+
for (int i = 0; i < min_size; ++i) {
1415+
if (values_x[i] < values_y[i]) return true;
1416+
if (values_x[i] > values_y[i]) return false;
1417+
}
1418+
return values_y.size() >= values_x.size();
1419+
}
1420+
1421+
bool CheckSetLt(
1422+
const Constraint& ct, const std::function<int64_t(Variable*)>& evaluator,
1423+
const std::function<std::vector<int64_t>(Variable*)>& set_evaluator) {
1424+
const std::vector<int64_t> values_x = SetEval(ct.arguments[0], set_evaluator);
1425+
const std::vector<int64_t> values_y = SetEval(ct.arguments[1], set_evaluator);
1426+
const int min_size = std::min(values_x.size(), values_y.size());
1427+
for (int i = 0; i < min_size; ++i) {
1428+
if (values_x[i] < values_y[i]) return true;
1429+
if (values_x[i] > values_y[i]) return false;
1430+
}
1431+
return values_y.size() > values_x.size();
1432+
}
1433+
14071434
bool CheckSetNeReif(
14081435
const Constraint& ct, const std::function<int64_t(Variable*)>& evaluator,
14091436
const std::function<std::vector<int64_t>(Variable*)>& set_evaluator) {
@@ -1668,6 +1695,8 @@ CallMap CreateCallMap() {
16681695
m["set_in_reif"] = CheckSetInReif;
16691696
m["set_in"] = CheckSetIn;
16701697
m["set_intersect"] = CheckSetIntersect;
1698+
m["set_le"] = CheckSetLe;
1699+
m["set_lt"] = CheckSetLt;
16711700
m["set_ne_reif"] = CheckSetNeReif;
16721701
m["set_ne"] = CheckSetNe;
16731702
m["set_not_in"] = CheckSetNotIn;

0 commit comments

Comments
 (0)