17 #include <initializer_list> 21 #include "absl/strings/str_format.h" 34 : builder_(builder), index_(
index) {}
37 DCHECK(builder_ !=
nullptr);
38 if (builder_ ==
nullptr)
return *
this;
46 if (builder_ ==
nullptr)
return "null";
47 const std::string&
name =
52 return absl::StrCat(
"Not(",
name,
")");
57 if (builder_ ==
nullptr)
return "null";
66 output.append(var_proto.
domain(0) == 0 ?
"false" :
"true");
68 if (var_proto.
name().empty()) {
69 absl::StrAppendFormat(&output,
"BoolVar%i(", index_);
71 absl::StrAppendFormat(&output,
"%s(", var_proto.
name());
74 output.append(var_proto.
domain(0) == 0 ?
"false)" :
"true)");
76 absl::StrAppend(&output, var_proto.
domain(0),
", ", var_proto.
domain(1),
94 : builder_(builder), index_(
index) {
99 if (
var.builder_ ==
nullptr) {
103 builder_ =
var.builder_;
104 index_ = builder_->GetOrCreateIntegerIndex(
var.index_);
109 if (builder_ !=
nullptr) {
115 return BoolVar(index_, builder_);
119 DCHECK(builder_ !=
nullptr);
120 if (builder_ ==
nullptr)
return *
this;
126 if (builder_ ==
nullptr)
return "null";
131 if (builder_ ==
nullptr)
return Domain();
136 if (builder_ ==
nullptr)
return "null";
149 absl::StrAppend(&output, var_proto.
domain(0));
151 if (var_proto.
name().empty()) {
152 absl::StrAppend(&output,
"V",
index,
"(");
154 absl::StrAppend(&output, var_proto.
name(),
"(");
160 absl::StrAppend(&output, var_proto.
domain(0),
")");
162 absl::StrAppend(&output, var_proto.
domain(0),
", ", var_proto.
domain(1),
179 variables_.push_back(
index);
180 coefficients_.push_back(1);
184 coefficients_.push_back(-1);
191 variables_.push_back(
var.index_);
192 coefficients_.push_back(1);
199 for (
int i = 0; i < expr_proto.
vars_size(); ++i) {
200 result.variables_.push_back(expr_proto.
vars(i));
201 result.coefficients_.push_back(expr_proto.
coeffs(i));
223 absl::Span<const int64_t> coeffs) {
224 CHECK_EQ(vars.size(), coeffs.size());
226 for (
int i = 0; i < vars.size(); ++i) {
227 result += vars[i] * coeffs[i];
233 absl::Span<const int64_t> coeffs) {
234 CHECK_EQ(vars.size(), coeffs.size());
236 for (
int i = 0; i < vars.size(); ++i) {
237 result += vars[i] * coeffs[i];
255 constant_ += other.constant_;
256 variables_.insert(variables_.end(), other.variables_.begin(),
257 other.variables_.end());
258 coefficients_.insert(coefficients_.end(), other.coefficients_.begin(),
259 other.coefficients_.end());
264 constant_ -= other.constant_;
265 variables_.insert(variables_.end(), other.variables_.begin(),
266 other.variables_.end());
267 for (
const int64_t coeff : other.coefficients_) {
268 coefficients_.push_back(-coeff);
275 for (int64_t& coeff : coefficients_) coeff *= factor;
281 for (
int i = 0; i < variables_.size(); ++i) {
282 const int64_t coeff = coefficients_[i];
283 const std::string var_string =
proto ==
nullptr 284 ? absl::StrCat(
"V", variables_[i])
288 absl::StrAppend(&result, var_string);
289 }
else if (coeff == -1) {
290 absl::StrAppend(&result,
"-", var_string);
291 }
else if (coeff != 0) {
292 absl::StrAppend(&result, coeff,
" * ", var_string);
294 }
else if (coeff == 1) {
295 absl::StrAppend(&result,
" + ", var_string);
296 }
else if (coeff > 0) {
297 absl::StrAppend(&result,
" + ", coeff,
" * ", var_string);
298 }
else if (coeff == -1) {
299 absl::StrAppend(&result,
" - ", var_string);
300 }
else if (coeff < 0) {
301 absl::StrAppend(&result,
" - ", -coeff,
" * ", var_string);
305 if (constant_ != 0) {
306 if (variables_.empty()) {
307 return absl::StrCat(constant_);
308 }
else if (constant_ > 0) {
309 absl::StrAppend(&result,
" + ", constant_);
311 absl::StrAppend(&result,
" - ", -constant_);
347 absl::Span<const IntVar> vars, absl::Span<const double> coeffs) {
348 CHECK_EQ(vars.size(), coeffs.size());
350 for (
int i = 0; i < vars.size(); ++i) {
351 result.
AddTerm(vars[i], coeffs[i]);
357 absl::Span<const BoolVar> vars, absl::Span<const double> coeffs) {
358 CHECK_EQ(vars.size(), coeffs.size());
360 for (
int i = 0; i < vars.size(); ++i) {
361 result.
AddTerm(vars[i], coeffs[i]);
382 constant_ += expr.constant_;
383 variables_.insert(variables_.end(), expr.variables_.begin(),
384 expr.variables_.end());
385 coefficients_.insert(coefficients_.end(), expr.coefficients_.begin(),
386 expr.coefficients_.end());
391 variables_.push_back(
var.index_);
392 coefficients_.push_back(coeff);
399 variables_.push_back(
index);
400 coefficients_.push_back(coeff);
403 coefficients_.push_back(-coeff);
420 constant_ -= expr.constant_;
421 variables_.insert(variables_.end(), expr.variables_.begin(),
422 expr.variables_.end());
424 coefficients_.push_back(-coeff);
431 for (
double& c : coefficients_) {
439 for (
int i = 0; i < variables_.size(); ++i) {
440 const double coeff = coefficients_[i];
441 const std::string var_string =
proto ==
nullptr 442 ? absl::StrCat(
"V", variables_[i])
446 absl::StrAppend(&result, var_string);
447 }
else if (coeff == -1.0) {
448 absl::StrAppend(&result,
"-", var_string);
449 }
else if (coeff != 0.0) {
450 absl::StrAppend(&result, coeff,
" * ", var_string);
452 }
else if (coeff == 1.0) {
453 absl::StrAppend(&result,
" + ", var_string);
454 }
else if (coeff > 0.0) {
455 absl::StrAppend(&result,
" + ", coeff,
" * ", var_string);
456 }
else if (coeff == -1.0) {
457 absl::StrAppend(&result,
" - ", var_string);
458 }
else if (coeff < 0.0) {
459 absl::StrAppend(&result,
" - ", -coeff,
" * ", var_string);
463 if (constant_ != 0.0) {
464 if (variables_.empty()) {
465 return absl::StrCat(constant_);
466 }
else if (constant_ > 0.0) {
467 absl::StrAppend(&result,
" + ", constant_);
469 absl::StrAppend(&result,
" - ", -constant_);
515 for (
const int64_t t : tuple) {
526 builder_->LinearExprToProto(
time);
529 builder_->IndexFromConstant(1));
533 int64_t level_change,
536 builder_->LinearExprToProto(
time);
542 int64_t transition_label) {
561 builder_->LinearExprToProto(
demand);
567 : builder_(builder), index_(
index) {}
570 DCHECK(builder_ !=
nullptr);
571 if (builder_ ==
nullptr)
return *
this;
577 DCHECK(builder_ !=
nullptr);
584 DCHECK(builder_ !=
nullptr);
591 DCHECK(builder_ !=
nullptr);
598 DCHECK(builder_ !=
nullptr);
599 if (builder_ ==
nullptr)
return BoolVar();
605 if (builder_ ==
nullptr)
return "null";
610 if (builder_ ==
nullptr)
return "null";
616 if (ct_proto.
name().empty()) {
617 absl::StrAppend(&output,
"IntervalVar", index_,
"(");
619 absl::StrAppend(&output, ct_proto.
name(),
"(");
637 int CpModelBuilder::IndexFromConstant(int64_t
value) {
638 if (!constant_to_index_map_.contains(
value)) {
645 return constant_to_index_map_[
value];
648 int CpModelBuilder::GetOrCreateIntegerIndex(
int index) {
652 if (!bool_to_integer_index_map_.contains(
index)) {
654 const IntegerVariableProto& old_var = cp_model_.
variables(
var);
656 IntegerVariableProto*
const new_var = cp_model_.
add_variables();
658 new_var->add_domain(1);
659 if (!old_var.name().empty()) {
660 new_var->set_name(absl::StrCat(
"Not(", old_var.name(),
")"));
663 bool_to_integer_index_map_[
index] = new_index;
666 return bool_to_integer_index_map_[
index];
672 for (
const auto&
interval : domain) {
692 return BoolVar(IndexFromConstant(1),
this);
696 return BoolVar(IndexFromConstant(0),
this);
718 ct->add_enforcement_literal(presence.index_);
720 *
interval->mutable_start() = LinearExprToProto(start);
721 *
interval->mutable_size() = LinearExprToProto(size);
722 *
interval->mutable_end() = LinearExprToProto(end);
730 ct->add_enforcement_literal(presence.index_);
732 *
interval->mutable_start() = LinearExprToProto(start);
733 interval->mutable_size()->set_offset(size);
734 *
interval->mutable_end() = LinearExprToProto(start);
741 for (
const BoolVar& lit : literals) {
742 proto->mutable_bool_or()->add_literals(lit.index_);
753 for (
const BoolVar& lit : literals) {
754 proto->mutable_at_most_one()->add_literals(lit.index_);
761 for (
const BoolVar& lit : literals) {
762 proto->mutable_exactly_one()->add_literals(lit.index_);
769 for (
const BoolVar& lit : literals) {
770 proto->mutable_bool_and()->add_literals(lit.index_);
777 for (
const BoolVar& lit : literals) {
778 proto->mutable_bool_xor()->add_literals(lit.index_);
783 void CpModelBuilder::FillLinearTerms(
const LinearExpr& left,
790 proto->add_coeffs(coeff);
796 proto->add_coeffs(-coeff);
803 FillLinearTerms(left, right,
proto->mutable_linear());
805 proto->mutable_linear()->add_domain(rhs);
806 proto->mutable_linear()->add_domain(rhs);
813 FillLinearTerms(left, right,
proto->mutable_linear());
815 proto->mutable_linear()->add_domain(rhs);
823 FillLinearTerms(left, right,
proto->mutable_linear());
826 proto->mutable_linear()->add_domain(rhs);
833 FillLinearTerms(left, right,
proto->mutable_linear());
835 proto->mutable_linear()->add_domain(rhs + 1);
843 FillLinearTerms(left, right,
proto->mutable_linear());
846 proto->mutable_linear()->add_domain(rhs - 1);
854 proto->mutable_linear()->add_vars(x);
857 proto->mutable_linear()->add_coeffs(coeff);
859 const int64_t cst = expr.
constant();
860 for (
const auto& i : domain) {
861 proto->mutable_linear()->add_domain(i.start - cst);
862 proto->mutable_linear()->add_domain(i.end - cst);
870 FillLinearTerms(left, right,
proto->mutable_linear());
873 proto->mutable_linear()->add_domain(rhs - 1);
874 proto->mutable_linear()->add_domain(rhs + 1);
882 auto* expr =
proto->mutable_all_diff()->add_exprs();
883 expr->add_vars(
var.index_);
892 *
proto->mutable_all_diff()->add_exprs() = LinearExprToProto(expr);
898 std::initializer_list<LinearExpr> exprs) {
901 *
proto->mutable_all_diff()->add_exprs() = LinearExprToProto(expr);
909 proto->mutable_element()->set_index(
index.index_);
910 proto->mutable_element()->set_target(target.index_);
912 proto->mutable_element()->add_vars(
var.index_);
918 absl::Span<const int64_t> values,
921 proto->mutable_element()->set_index(
index.index_);
922 proto->mutable_element()->set_target(target.index_);
923 for (int64_t
value : values) {
924 proto->mutable_element()->add_vars(IndexFromConstant(
value));
938 absl::Span<const IntVar> vars) {
941 proto->mutable_table()->add_vars(
var.index_);
947 absl::Span<const IntVar> vars) {
950 proto->mutable_table()->add_vars(
var.index_);
952 proto->mutable_table()->set_negated(
true);
957 absl::Span<const IntVar> variables,
958 absl::Span<const IntVar> inverse_variables) {
961 proto->mutable_inverse()->add_f_direct(
var.index_);
963 for (
const IntVar&
var : inverse_variables) {
964 proto->mutable_inverse()->add_f_inverse(
var.index_);
972 proto->mutable_reservoir()->set_min_level(min_level);
973 proto->mutable_reservoir()->set_max_level(max_level);
978 absl::Span<const IntVar> transition_variables,
int starting_state,
979 absl::Span<const int> final_states) {
981 for (
const IntVar&
var : transition_variables) {
982 proto->mutable_automaton()->add_vars(
var.index_);
984 proto->mutable_automaton()->set_starting_state(starting_state);
985 for (
const int final_state : final_states) {
986 proto->mutable_automaton()->add_final_states(final_state);
997 const int64_t mult = negate ? -1 : 1;
1006 absl::Span<const IntVar> vars) {
1008 *
ct->mutable_lin_max()->mutable_target() =
1009 LinearExprToProto(target,
true);
1011 *
ct->mutable_lin_max()->add_exprs() =
1012 LinearExprToProto(
var,
true);
1018 absl::Span<const LinearExpr> exprs) {
1020 *
ct->mutable_lin_max()->mutable_target() =
1021 LinearExprToProto(target,
true);
1023 *
ct->mutable_lin_max()->add_exprs() =
1024 LinearExprToProto(expr,
true);
1030 const LinearExpr& target, std::initializer_list<LinearExpr> exprs) {
1032 *
ct->mutable_lin_max()->mutable_target() =
1033 LinearExprToProto(target,
true);
1035 *
ct->mutable_lin_max()->add_exprs() =
1036 LinearExprToProto(expr,
true);
1042 absl::Span<const IntVar> vars) {
1044 *
ct->mutable_lin_max()->mutable_target() = LinearExprToProto(target);
1046 *
ct->mutable_lin_max()->add_exprs() = LinearExprToProto(
var);
1052 absl::Span<const LinearExpr> exprs) {
1054 *
ct->mutable_lin_max()->mutable_target() = LinearExprToProto(target);
1056 *
ct->mutable_lin_max()->add_exprs() = LinearExprToProto(expr);
1062 const LinearExpr& target, std::initializer_list<LinearExpr> exprs) {
1064 *
ct->mutable_lin_max()->mutable_target() = LinearExprToProto(target);
1066 *
ct->mutable_lin_max()->add_exprs() = LinearExprToProto(expr);
1075 *
proto->mutable_int_div()->mutable_target() = LinearExprToProto(target);
1076 *
proto->mutable_int_div()->add_exprs() = LinearExprToProto(numerator);
1077 *
proto->mutable_int_div()->add_exprs() = LinearExprToProto(denominator);
1084 *
proto->mutable_lin_max()->mutable_target() = LinearExprToProto(target);
1085 *
proto->mutable_lin_max()->add_exprs() = LinearExprToProto(expr);
1086 *
proto->mutable_lin_max()->add_exprs() =
1087 LinearExprToProto(expr,
true);
1095 *
proto->mutable_int_mod()->mutable_target() = LinearExprToProto(target);
1096 *
proto->mutable_int_mod()->add_exprs() = LinearExprToProto(
var);
1097 *
proto->mutable_int_mod()->add_exprs() = LinearExprToProto(mod);
1102 const LinearExpr& target, absl::Span<const IntVar> vars) {
1104 *
proto->mutable_int_prod()->mutable_target() = LinearExprToProto(target);
1106 *
proto->mutable_int_prod()->add_exprs() = LinearExprToProto(
var);
1112 const LinearExpr& target, absl::Span<const LinearExpr> exprs) {
1114 *
proto->mutable_int_prod()->mutable_target() = LinearExprToProto(target);
1116 *
proto->mutable_int_prod()->add_exprs() = LinearExprToProto(expr);
1122 const LinearExpr& target, std::initializer_list<LinearExpr> exprs) {
1124 *
proto->mutable_int_prod()->mutable_target() = LinearExprToProto(target);
1126 *
proto->mutable_int_prod()->add_exprs() = LinearExprToProto(expr);
1134 *
proto->mutable_int_prod()->mutable_target() = LinearExprToProto(target);
1135 *
proto->mutable_int_prod()->add_exprs() = LinearExprToProto(left);
1136 *
proto->mutable_int_prod()->add_exprs() = LinearExprToProto(right);
1144 proto->mutable_no_overlap()->add_intervals(
var.index_);
1155 *
proto->mutable_cumulative()->mutable_capacity() =
1188 for (
int i = 0; i < expr.
variables().size(); ++i) {
1200 for (
int i = 0; i < expr.
variables().size(); ++i) {
1210 absl::Span<const IntVar> variables,
1217 proto->set_variable_selection_strategy(var_strategy);
1218 proto->set_domain_reduction_strategy(domain_strategy);
1222 absl::Span<const BoolVar> variables,
1229 proto->set_variable_selection_strategy(var_strategy);
1230 proto->set_domain_reduction_strategy(domain_strategy);
1239 if (
var.index_ >= 0) {
1257 for (
const BoolVar& lit : literals) {
1269 constant_to_index_map_.clear();
1272 if (
var.domain_size() == 2 &&
var.domain(0) ==
var.domain(1)) {
1273 constant_to_index_map_[
var.domain(0)] = i;
1277 bool_to_integer_index_map_.clear();
1285 <<
"CpModelBuilder::GetBoolVarFromProtoIndex: The domain of the variable " 1288 <<
"CpModelBuilder::GetBoolVarFromProtoIndex: The domain of the variable " 1291 <<
"CpModelBuilder::GetBoolVarFromProtoIndex: The domain of the variable " 1307 <<
"CpModelBuilder::GetIntervalVarFromProtoIndex: the referenced " 1308 "object is not an interval variable";
1315 const std::vector<int>& variables = expr.
variables();
1317 for (
int i = 0; i < variables.size(); ++i) {
1324 const int ref = x.index_;
void AddArc(int tail, int head, BoolVar literal)
Add an arc to the circuit.
BoolVar FalseVar()
Creates an always false Boolean variable.
IntervalVar NewOptionalFixedSizeIntervalVar(const LinearExpr &start, int64_t size, BoolVar presence)
Creates an optional interval variable with a fixed size.
void add_vars(int32_t value)
const std::string & name() const
const ::operations_research::sat::TableConstraintProto & table() const
void set_offset(double value)
::operations_research::sat::LinearExpressionProto * add_demands()
Specialized reservoir constraint.
LinearExpr EndExpr() const
Returns the end linear expression.
IntervalVar()
A default constructed IntervalVar can be used to mean not defined yet.
BoolVar TrueVar()
Creates an always true Boolean variable.
Constraint AddMinEquality(const LinearExpr &target, absl::Span< const IntVar > vars)
Adds target == min(vars).
const CpModelProto & Proto() const
void AddAssumption(BoolVar lit)
Adds a literal to the model as assumptions.
int64_t SolutionIntegerValue(const CpSolverResponse &r, const LinearExpr &expr)
Evaluates the value of an linear expression in a solver response.
std::string DebugString() const
static LinearExpr Term(IntVar var, int64_t coefficient)
Constructs var * coefficient.
A dedicated container for linear expressions with double coefficients.
void add_enforcement_literal(int32_t value)
CircuitConstraint AddCircuitConstraint()
Adds a circuit constraint.
Constraint AddGreaterThan(const LinearExpr &left, const LinearExpr &right)
Adds left > right.
Specialized no_overlap2D constraint.
#define CHECK_GE(val1, val2)
void add_literals(int32_t value)
BoolVar Not() const
Returns the logical negation of the current Boolean variable.
void add_x_intervals(int32_t value)
int64_t constant() const
Returns the constant term.
void AddDecisionStrategy(absl::Span< const IntVar > variables, DecisionStrategyProto::VariableSelectionStrategy var_strategy, DecisionStrategyProto::DomainReductionStrategy domain_strategy)
Adds a decision strategy on a list of integer variables.
const ::operations_research::sat::LinearExpressionProto & start() const
Constraint AddAllDifferent(absl::Span< const IntVar > vars)
This constraint forces all variables to have different values.
Constraint AddEquality(const LinearExpr &left, const LinearExpr &right)
Adds left == right.
DecisionStrategyProto_DomainReductionStrategy
::operations_research::sat::CircuitConstraintProto * mutable_circuit()
void add_values(int64_t value)
TableConstraint AddAllowedAssignments(absl::Span< const IntVar > vars)
Adds an allowed assignments constraint.
const ::operations_research::sat::LinearExpressionProto & size() const
void add_transition_label(int64_t value)
ReservoirConstraint AddReservoirConstraint(int64_t min_level, int64_t max_level)
Adds a reservoir constraint with optional refill/emptying events.
const std::vector< double > & coefficients() const
Returns the vector of coefficients.
void AddTuple(absl::Span< const int64_t > tuple)
Adds a tuple of possible values to the constraint.
IntervalVar WithName(const std::string &name)
Sets the name of the variable.
LinearExpr & operator+=(const LinearExpr &other)
::operations_research::sat::AutomatonConstraintProto * mutable_automaton()
::operations_research::sat::TableConstraintProto * mutable_table()
int32_t enforcement_literal(int index) const
Constraint AddBoolOr(absl::Span< const BoolVar > literals)
Adds the constraint that at least one of the literals must be true.
void add_coeffs(int64_t value)
IntervalVar NewFixedSizeIntervalVar(const LinearExpr &start, int64_t size)
Creates an interval variable with a fixed size.
DecisionStrategyProto_VariableSelectionStrategy
Constraint AddMultiplicationEquality(const LinearExpr &target, absl::Span< const LinearExpr > exprs)
Adds target == prod(exprs).
std::string Name() const
Returns the name of the variable (or the empty string if not set).
void add_values(int64_t value)
std::string VarDebugString(const CpModelProto &proto, int index)
BoolVar GetBoolVarFromProtoIndex(int index)
Returns the Boolean variable from its index in the proto.
AutomatonConstraint AddAutomaton(absl::Span< const IntVar > transition_variables, int starting_state, absl::Span< const int > final_states)
An automaton constraint.
::operations_research::sat::CumulativeConstraintProto * mutable_cumulative()
Specialized circuit constraint.
Constraint AddBoolXor(absl::Span< const BoolVar > literals)
Adds the constraint that an odd number of literals is true.
::operations_research::Domain Domain() const
::operations_research::sat::NoOverlap2DConstraintProto * mutable_no_overlap_2d()
void add_vars(int32_t value)
friend class ReservoirConstraint
Specialized cumulative constraint.
int variables_size() const
Specialized assignment constraint.
void AddEvent(LinearExpr time, int64_t level_change)
Adds a mandatory event.
::operations_research::sat::IntegerVariableProto * add_variables()
void Minimize(const LinearExpr &expr)
Adds a linear minimization objective.
IntVar()
A default constructed IntVar can be used to mean not defined yet.
void set_offset(int64_t value)
void AddDemand(IntervalVar interval, LinearExpr demand)
Adds a pair (interval, demand) to the constraint.
int32_t vars(int index) const
const std::vector< int64_t > & coefficients() const
Returns the vector of coefficients.
void add_y_intervals(int32_t value)
DoubleLinearExpr & operator *=(double coeff)
Multiply the linear expression by a constant.
CumulativeConstraint AddCumulative(LinearExpr capacity)
The cumulative constraint.
const std::string & name() const
void add_vars(int32_t value)
void add_active_literals(int32_t value)
#define CHECK_LT(val1, val2)
void set_offset(double value)
IntVar NewConstant(int64_t value)
Creates a constant variable.
void Maximize(const LinearExpr &expr)
Adds a linear maximization objective.
CpModelProto * MutableProto()
::operations_research::sat::RoutesConstraintProto * mutable_routes()
IntVar GetIntVarFromProtoIndex(int index)
Returns the integer variable from its index in the proto.
IntervalVar NewIntervalVar(const LinearExpr &start, const LinearExpr &size, const LinearExpr &end)
Creates an interval variable from 3 affine expressions.
Constraint AddNotEqual(const LinearExpr &left, const LinearExpr &right)
Adds left != right.
void SetName(const std::string &name)
Sets the name of the model.
void ClearAssumptions()
Remove all assumptions from the model.
const ::operations_research::sat::IntegerVariableProto & variables(int index) const
void add_heads(int32_t value)
Constraint AddInverseConstraint(absl::Span< const IntVar > variables, absl::Span< const IntVar > inverse_variables)
An inverse constraint.
BoolVar ToBoolVar() const
Cast IntVar -> BoolVar.
void add_tails(int32_t value)
std::string Name() const
Returns the name of the variable.
MultipleCircuitConstraint AddMultipleCircuitConstraint()
Adds a multiple circuit constraint, aka the "VRP" (Vehicle Routing Problem) constraint.
void set_name(ArgT0 &&arg0, ArgT... args)
Constraint AddModuloEquality(const LinearExpr &target, const LinearExpr &var, const LinearExpr &mod)
Adds target = var % mod.
void add_vars(int32_t value)
Constraint AddExactlyOne(absl::Span< const BoolVar > literals)
Exactly one literal is true. Sum literals == 1.
BoolVar()
A default constructed BoolVar can be used to mean not defined yet.
BoolVar PresenceBoolVar() const
Returns a BoolVar indicating the presence of this interval.
DoubleLinearExpr & AddTerm(IntVar var, double coeff)
Adds a term (var * coeff) to the linear expression.
Constraint AddAtMostOne(absl::Span< const BoolVar > literals)
At most one literal is true. Sum literals <= 1.
#define CHECK_LE(val1, val2)
void add_tails(int32_t value)
const ::operations_research::sat::ConstraintProto & constraints(int index) const
void add_transition_tail(int64_t value)
int64_t solution(int index) const
std::string DebugString(const CpModelProto *proto=nullptr) const
Debug string. See the documentation for LinearExpr::DebugString().
::operations_research::sat::ConstraintProto * add_constraints()
Constraint AddDivisionEquality(const LinearExpr &target, const LinearExpr &numerator, const LinearExpr &denominator)
Adds target = num / denom (integer division rounded towards 0).
bool SolutionBooleanValue(const CpSolverResponse &r, BoolVar x)
Evaluates the value of a Boolean literal in a solver response.
Constraint AddElement(IntVar index, absl::Span< const int64_t > values, IntVar target)
Adds the element constraint: values[index] == target.
IntervalVar GetIntervalVarFromProtoIndex(int index)
Returns the interval variable from its index in the proto.
const std::string & Name() const
Returns the name of the constraint (or the empty string if not set).
std::string DebugString() const
Returns a debug string.
BoolVar Not(BoolVar x)
A convenient wrapper so we can write Not(x) instead of x.Not() which is sometimes clearer.
IntVar NewIntVar(const Domain &domain)
Creates an integer variable with the given domain.
::operations_research::sat::FloatObjectiveProto * mutable_floating_point_objective()
::operations_research::sat::LinearExpressionProto * add_time_exprs()
Constraint AddAtLeastOne(absl::Span< const BoolVar > literals)
Same as AddBoolOr. Sum literals >= 1.
static LinearExpr FromProto(const LinearExpressionProto &proto)
Constructs a linear expr from its proto representation.
::PROTOBUF_NAMESPACE_ID::RepeatedField< int32_t > * mutable_assumptions()
#define DCHECK_GE(val1, val2)
int constraints_size() const
A dedicated container for linear expressions.
Constraint AddAbsEquality(const LinearExpr &target, const LinearExpr &expr)
Adds target == abs(expr).
LinearExpr()=default
Creates an empty linear expression with value zero.
void add_domain(int64_t value)
Constraint OnlyEnforceIf(absl::Span< const BoolVar > literals)
The constraint will be enforced iff all literals listed here are true.
static DoubleLinearExpr Sum(absl::Span< const IntVar > vars)
Constructs the sum of a list of variables.
#define CHECK_EQ(val1, val2)
static LinearExpr Sum(absl::Span< const IntVar > vars)
Constructs the sum of a list of variables.
const ::operations_research::sat::LinearExpressionProto & end() const
void AddAssumptions(absl::Span< const BoolVar > literals)
Adds multiple literals to the model as assumptions.
void add_level_changes(int64_t value)
Constraint(ConstraintProto *proto)
Constraint AddBoolAnd(absl::Span< const BoolVar > literals)
Adds the constraint that all literals must be true.
::operations_research::sat::DecisionStrategyProto * add_search_strategy()
void AddOptionalEvent(LinearExpr time, int64_t level_change, BoolVar is_active)
Adds an optional event.
::operations_research::sat::ConstraintProto * mutable_constraints(int index)
CpModelProto const * model_proto
void add_coeffs(int64_t value)
void AddArc(int tail, int head, BoolVar literal)
Add an arc to the circuit.
void ClearHints()
Removes all hints.
#define DCHECK(condition)
void set_name(ArgT0 &&arg0, ArgT... args)
We call domain any subset of Int64 = [kint64min, kint64max].
const std::vector< int > & variables() const
Returns the vector of variable indices.
PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final
Specialized automaton constraint.
LinearExpr & operator *=(int64_t factor)
static LinearExpr WeightedSum(absl::Span< const IntVar > vars, absl::Span< const int64_t > coeffs)
Constructs the scalar product of variables and coefficients.
Constraint AddGreaterOrEqual(const LinearExpr &left, const LinearExpr &right)
Adds left >= right.
Constraint AddVariableElement(IntVar index, absl::Span< const IntVar > variables, IntVar target)
Adds the element constraint: variables[index] == target.
#define DCHECK_EQ(val1, val2)
double constant() const
Returns the constant term.
BoolVar WithName(const std::string &name)
Sets the name of the variable.
void clear_floating_point_objective()
void add_transition_head(int64_t value)
DoubleLinearExpr & operator+=(double value)
Adds a constant value to the linear expression.
void add_intervals(int32_t value)
Constraint AddLessThan(const LinearExpr &left, const LinearExpr &right)
Adds left < right.
DoubleLinearExpr & operator-=(double value)
Adds a constant value to the linear expression.
void set_name(ArgT0 &&arg0, ArgT... args)
void add_literals(int32_t value)
IntVar WithName(const std::string &name)
Sets the name of the variable.
BoolVar NewBoolVar()
Creates a Boolean variable.
#define DCHECK_LE(val1, val2)
Constraint AddNoOverlap(absl::Span< const IntervalVar > vars)
Adds a no-overlap constraint that ensures that all present intervals do not overlap in time.
void add_heads(int32_t value)
Constraint WithName(const std::string &name)
Sets the name of the constraint.
Specialized circuit constraint.
std::string DebugString() const
void AddRectangle(IntervalVar x_coordinate, IntervalVar y_coordinate)
Adds a rectangle (parallel to the axis) to the constraint.
int64_t coeffs(int index) const
NoOverlap2DConstraint AddNoOverlap2D()
The no_overlap_2d constraint prevents a set of boxes from overlapping.
Collection of objects used to extend the Constraint Solver library.
void AddTransition(int tail, int head, int64_t transition_label)
Adds a transitions to the automaton.
TableConstraint AddForbiddenAssignments(absl::Span< const IntVar > vars)
Adds an forbidden assignments constraint.
::operations_research::sat::CpObjectiveProto * mutable_objective()
const ::operations_research::sat::IntervalConstraintProto & interval() const
This file implements a wrapper around the CP-SAT model proto.
absl::Span< const double > coefficients
::operations_research::sat::PartialVariableAssignment * mutable_solution_hint()
void AddHint(IntVar var, int64_t value)
Adds hinting to a variable.
IntervalVar NewOptionalIntervalVar(const LinearExpr &start, const LinearExpr &size, const LinearExpr &end, BoolVar presence)
Creates an optional interval variable from 3 affine expressions and a Boolean variable.
LinearExpr StartExpr() const
Returns the start linear expression.
bool RefIsPositive(int ref)
LinearExpr SizeExpr() const
Returns the size linear expression.
void set_scaling_factor(double value)
std::ostream & operator<<(std::ostream &os, const BoolVar &var)
void add_coeffs(double value)
Constraint AddLessOrEqual(const LinearExpr &left, const LinearExpr &right)
Adds left <= right.
::operations_research::sat::ReservoirConstraintProto * mutable_reservoir()
void set_maximize(bool value)
LinearExpr & operator-=(const LinearExpr &other)
friend class CumulativeConstraint
std::string Name() const
Returns the name of the interval (or the empty string if not set).
std::string DebugString(const CpModelProto *proto=nullptr) const
Debug string.
Constraint AddLinearConstraint(const LinearExpr &expr, const Domain &domain)
Adds expr in domain.
Wrapper class around the cp_model proto.
Domain ReadDomainFromProto(const ProtoWithDomain &proto)
::operations_research::sat::IntegerVariableProto * mutable_variables(int index)
static DoubleLinearExpr WeightedSum(absl::Span< const IntVar > vars, absl::Span< const double > coeffs)
Constructs the scalar product of variables and coefficients.
Represents a Interval variable.
const std::vector< int > & variables() const
Returns the vector of variable indices.
void CopyFrom(const CpModelProto &model_proto)
Replaces the current model with the one from the given proto.
Constraint AddMaxEquality(const LinearExpr &target, absl::Span< const IntVar > vars)
Adds target == max(vars).
int64_t domain(int index) const