Skip to content

Commit 4b02b4e

Browse files
committed
flatzinc: export from google3
1 parent 4ddca40 commit 4b02b4e

7 files changed

Lines changed: 166 additions & 46 deletions

File tree

ortools/flatzinc/checker.cc

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,9 @@ std::vector<int64_t> SetEvalAt(
121121
return domain.values;
122122
}
123123
}
124+
case Argument::INT_LIST: {
125+
return {arg.ValueAt(pos)};
126+
}
124127
case Argument::VAR_REF_ARRAY: {
125128
return set_evaluator(arg.variables[pos]);
126129
}
@@ -336,6 +339,19 @@ bool CheckOrToolsArraySetElement(
336339
const std::vector<int64_t> element =
337340
SetEvalAt(ct.arguments[2], index - min_index, set_evaluator);
338341
const std::vector<int64_t> target = SetEval(ct.arguments[3], set_evaluator);
342+
if (element != target) {
343+
LOG(INFO) << "CheckOrToolsArraySetElement: element: ["
344+
<< absl::StrJoin(element, ",") << "], target: ["
345+
<< absl::StrJoin(target, ",") << "]";
346+
LOG(INFO) << "index: " << ct.arguments[0].DebugString() << " "
347+
<< ct.arguments[0].TypeString();
348+
LOG(INFO) << "index_set: " << ct.arguments[1].DebugString() << " "
349+
<< ct.arguments[1].TypeString();
350+
LOG(INFO) << "element: " << ct.arguments[2].DebugString() << " "
351+
<< ct.arguments[2].TypeString();
352+
LOG(INFO) << "target: " << ct.arguments[3].DebugString() << " "
353+
<< ct.arguments[3].TypeString();
354+
}
339355
return element == target;
340356
}
341357

ortools/flatzinc/cp_model_fz_solver.cc

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,14 @@ struct SetVariable {
8888
if (it == sorted_values.end() || *it != value) return -1;
8989
return it - sorted_values.begin();
9090
}
91+
92+
std::string DebugString() const {
93+
return absl::StrCat(
94+
"SetVariable(var_indices: ", absl::StrJoin(var_indices, ","),
95+
", sorted_values: ", absl::StrJoin(sorted_values, ","),
96+
", card_var_index: ", card_var_index,
97+
", fixed_card: ", fixed_card.value_or(-1), ")");
98+
}
9199
};
92100

93101
// Helper class to convert a flatzinc model to a CpModelProto.
@@ -533,8 +541,8 @@ std::shared_ptr<SetVariable> CpModelProtoWithMapping::LookupSetVarAt(
533541
}
534542
return result;
535543
} else {
536-
LOG(FATAL) << "LookupSetVarAt:Unsupported argument type '" << argument.type
537-
<< "'";
544+
LOG(FATAL) << "LookupSetVarAt:Unsupported argument type '"
545+
<< argument.TypeString() << "'";
538546
}
539547
return std::make_shared<SetVariable>();
540548
}

ortools/flatzinc/model.cc

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ Domain Domain::IntegerValue(int64_t value) {
5858
}
5959

6060
Domain Domain::Interval(int64_t included_min, int64_t included_max) {
61+
if (included_min > included_max) return Domain::EmptyDomain();
6162
Domain result;
6263
result.is_interval = true;
6364
result.values.push_back(included_min);
@@ -765,6 +766,32 @@ int Argument::Size() const {
765766
ABSL_UNREACHABLE();
766767
}
767768

769+
std::string Argument::TypeString() const {
770+
switch (type) {
771+
case INT_VALUE:
772+
return "INT_VALUE";
773+
case INT_INTERVAL:
774+
return "INT_INTERVAL";
775+
case INT_LIST:
776+
return "INT_LIST";
777+
case DOMAIN_LIST:
778+
return "DOMAIN_LIST";
779+
case VAR_REF:
780+
return "VAR_REF";
781+
case VAR_REF_ARRAY:
782+
return "VAR_REF_ARRAY";
783+
case VOID_ARGUMENT:
784+
return "VOID_ARGUMENT";
785+
case FLOAT_VALUE:
786+
return "FLOAT_VALUE";
787+
case FLOAT_INTERVAL:
788+
return "FLOAT_INTERVAL";
789+
case FLOAT_LIST:
790+
return "FLOAT_LIST";
791+
}
792+
ABSL_UNREACHABLE();
793+
}
794+
768795
// ----- Variable -----
769796

770797
Variable::Variable(absl::string_view name_, const Domain& domain_,
@@ -1037,6 +1064,14 @@ Variable* Model::AddFloatConstant(double value) {
10371064
return var;
10381065
}
10391066

1067+
Variable* Model::AddSetConstant(const Domain& domain) {
1068+
Variable* const var = new Variable(domain.DebugString(), domain, true);
1069+
var->domain.is_a_set = true;
1070+
var->domain.is_fixed_set = true;
1071+
variables_.push_back(var);
1072+
return var;
1073+
}
1074+
10401075
void Model::AddConstraint(absl::string_view id, std::vector<Argument> arguments,
10411076
bool is_domain, bool symmetry, bool redundant) {
10421077
Constraint* const constraint =

ortools/flatzinc/model.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,8 @@ struct Argument {
206206
bool HasOneValueAt(int pos) const;
207207
// Returns the number of object in the argument.
208208
int Size() const;
209+
// Returns the string of the type of the argument.
210+
std::string TypeString() const;
209211

210212
Type type;
211213
std::vector<int64_t> values;
@@ -356,6 +358,7 @@ class Model {
356358
bool defined, bool set_is_fixed = false);
357359
Variable* AddConstant(int64_t value);
358360
Variable* AddFloatConstant(double value);
361+
Variable* AddSetConstant(const Domain& domain);
359362
// Creates and add a constraint to the model.
360363
void AddConstraint(absl::string_view id, std::vector<Argument> arguments,
361364
bool is_domain, bool symmetry, bool redundant);

0 commit comments

Comments
 (0)