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(),
"(");
637int CpModelBuilder::IndexFromConstant(int64_t
value) {
638 if (!constant_to_index_map_.contains(
value)) {
645 return constant_to_index_map_[
value];
648int 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_);
721 *
interval->mutable_size() = LinearExprToProto(size);
730 ct->add_enforcement_literal(presence.index_);
733 interval->mutable_size()->set_offset(size);
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_);
783void CpModelBuilder::FillLinearTerms(
const LinearExpr& left,
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);
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_;
#define DCHECK_LE(val1, val2)
#define CHECK_LT(val1, val2)
#define CHECK_EQ(val1, val2)
#define CHECK_GE(val1, val2)
#define DCHECK_GE(val1, val2)
#define DCHECK(condition)
#define CHECK_LE(val1, val2)
#define DCHECK_EQ(val1, val2)
We call domain any subset of Int64 = [kint64min, kint64max].
Specialized automaton constraint.
void AddTransition(int tail, int head, int64_t transition_label)
Adds a transitions to the automaton.
void add_transition_tail(int64_t value)
void add_transition_head(int64_t value)
void add_transition_label(int64_t value)
std::string Name() const
Returns the name of the variable.
BoolVar WithName(const std::string &name)
Sets the name of the variable.
std::string DebugString() const
BoolVar()
A default constructed BoolVar can be used to mean not defined yet.
BoolVar Not() const
Returns the logical negation of the current Boolean variable.
Specialized circuit constraint.
void AddArc(int tail, int head, BoolVar literal)
Add an arc to the circuit.
void add_literals(int32_t value)
void add_heads(int32_t value)
void add_tails(int32_t value)
Constraint OnlyEnforceIf(absl::Span< const BoolVar > literals)
The constraint will be enforced iff all literals listed here are true.
Constraint WithName(const std::string &name)
Sets the name of the constraint.
const std::string & Name() const
Returns the name of the constraint (or the empty string if not set).
Constraint(ConstraintProto *proto)
::operations_research::sat::NoOverlap2DConstraintProto * mutable_no_overlap_2d()
::operations_research::sat::TableConstraintProto * mutable_table()
const std::string & name() const
const ::operations_research::sat::IntervalConstraintProto & interval() const
::operations_research::sat::RoutesConstraintProto * mutable_routes()
void set_name(ArgT0 &&arg0, ArgT... args)
int32_t enforcement_literal(int index) const
::operations_research::sat::AutomatonConstraintProto * mutable_automaton()
void add_enforcement_literal(int32_t value)
const ::operations_research::sat::TableConstraintProto & table() const
::operations_research::sat::CumulativeConstraintProto * mutable_cumulative()
::operations_research::sat::CircuitConstraintProto * mutable_circuit()
::operations_research::sat::ReservoirConstraintProto * mutable_reservoir()
Wrapper class around the cp_model proto.
Constraint AddAtMostOne(absl::Span< const BoolVar > literals)
At most one literal is true. Sum literals <= 1.
void AddHint(IntVar var, int64_t value)
Adds hinting to a variable.
TableConstraint AddForbiddenAssignments(absl::Span< const IntVar > vars)
Adds an forbidden assignments constraint.
Constraint AddMinEquality(const LinearExpr &target, absl::Span< const IntVar > vars)
Adds target == min(vars).
Constraint AddLinearConstraint(const LinearExpr &expr, const Domain &domain)
Adds expr in domain.
void ClearAssumptions()
Remove all assumptions from the model.
Constraint AddAbsEquality(const LinearExpr &target, const LinearExpr &expr)
Adds target == abs(expr).
void AddAssumptions(absl::Span< const BoolVar > literals)
Adds multiple literals to the model as assumptions.
IntervalVar NewFixedSizeIntervalVar(const LinearExpr &start, int64_t size)
Creates an interval variable with a fixed size.
MultipleCircuitConstraint AddMultipleCircuitConstraint()
Adds a multiple circuit constraint, aka the "VRP" (Vehicle Routing Problem) constraint.
BoolVar TrueVar()
Creates an always true Boolean variable.
IntVar NewIntVar(const Domain &domain)
Creates an integer variable with the given domain.
void ClearHints()
Removes all hints.
void Maximize(const LinearExpr &expr)
Adds a linear maximization objective.
BoolVar NewBoolVar()
Creates a Boolean variable.
Constraint AddAtLeastOne(absl::Span< const BoolVar > literals)
Same as AddBoolOr. Sum literals >= 1.
Constraint AddMaxEquality(const LinearExpr &target, absl::Span< const IntVar > vars)
Adds target == max(vars).
Constraint AddMultiplicationEquality(const LinearExpr &target, absl::Span< const LinearExpr > exprs)
Adds target == prod(exprs).
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.
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.
CircuitConstraint AddCircuitConstraint()
Adds a circuit constraint.
Constraint AddVariableElement(IntVar index, absl::Span< const IntVar > variables, IntVar target)
Adds the element constraint: variables[index] == target.
Constraint AddGreaterThan(const LinearExpr &left, const LinearExpr &right)
Adds left > right.
void CopyFrom(const CpModelProto &model_proto)
Replaces the current model with the one from the given proto.
Constraint AddLessThan(const LinearExpr &left, const LinearExpr &right)
Adds left < right.
Constraint AddBoolXor(absl::Span< const BoolVar > literals)
Adds the constraint that an odd number of literals is true.
void SetName(const std::string &name)
Sets the name of the model.
Constraint AddElement(IntVar index, absl::Span< const int64_t > values, IntVar target)
Adds the element constraint: values[index] == target.
void AddAssumption(BoolVar lit)
Adds a literal to the model as assumptions.
void Minimize(const LinearExpr &expr)
Adds a linear minimization objective.
CpModelProto * MutableProto()
BoolVar FalseVar()
Creates an always false Boolean variable.
friend class CumulativeConstraint
Constraint AddBoolAnd(absl::Span< const BoolVar > literals)
Adds the constraint that all literals must be true.
IntervalVar GetIntervalVarFromProtoIndex(int index)
Returns the interval variable from its index in the proto.
CumulativeConstraint AddCumulative(LinearExpr capacity)
The cumulative constraint.
Constraint AddLessOrEqual(const LinearExpr &left, const LinearExpr &right)
Adds left <= right.
ReservoirConstraint AddReservoirConstraint(int64_t min_level, int64_t max_level)
Adds a reservoir constraint with optional refill/emptying events.
Constraint AddEquality(const LinearExpr &left, const LinearExpr &right)
Adds left == right.
NoOverlap2DConstraint AddNoOverlap2D()
The no_overlap_2d constraint prevents a set of boxes from overlapping.
Constraint AddGreaterOrEqual(const LinearExpr &left, const LinearExpr &right)
Adds left >= right.
Constraint AddBoolOr(absl::Span< const BoolVar > literals)
Adds the constraint that at least one of the literals must be true.
IntVar GetIntVarFromProtoIndex(int index)
Returns the integer 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.
IntervalVar NewOptionalFixedSizeIntervalVar(const LinearExpr &start, int64_t size, BoolVar presence)
Creates an optional interval variable with a fixed size.
Constraint AddDivisionEquality(const LinearExpr &target, const LinearExpr &numerator, const LinearExpr &denominator)
Adds target = num / denom (integer division rounded towards 0).
friend class ReservoirConstraint
BoolVar GetBoolVarFromProtoIndex(int index)
Returns the Boolean variable from its index in the proto.
Constraint AddNotEqual(const LinearExpr &left, const LinearExpr &right)
Adds left != right.
Constraint AddModuloEquality(const LinearExpr &target, const LinearExpr &var, const LinearExpr &mod)
Adds target = var % mod.
Constraint AddAllDifferent(absl::Span< const IntVar > vars)
This constraint forces all variables to have different values.
TableConstraint AddAllowedAssignments(absl::Span< const IntVar > vars)
Adds an allowed assignments constraint.
IntVar NewConstant(int64_t value)
Creates a constant variable.
IntervalVar NewIntervalVar(const LinearExpr &start, const LinearExpr &size, const LinearExpr &end)
Creates an interval variable from 3 affine expressions.
Constraint AddInverseConstraint(absl::Span< const IntVar > variables, absl::Span< const IntVar > inverse_variables)
An inverse constraint.
Constraint AddExactlyOne(absl::Span< const BoolVar > literals)
Exactly one literal is true. Sum literals == 1.
Constraint AddNoOverlap(absl::Span< const IntervalVar > vars)
Adds a no-overlap constraint that ensures that all present intervals do not overlap in time.
const CpModelProto & Proto() const
::PROTOBUF_NAMESPACE_ID::RepeatedField< int32_t > * mutable_assumptions()
::operations_research::sat::DecisionStrategyProto * add_search_strategy()
::operations_research::sat::FloatObjectiveProto * mutable_floating_point_objective()
const ::operations_research::sat::IntegerVariableProto & variables(int index) const
void set_name(ArgT0 &&arg0, ArgT... args)
void clear_floating_point_objective()
::operations_research::sat::PartialVariableAssignment * mutable_solution_hint()
::operations_research::sat::ConstraintProto * mutable_constraints(int index)
::operations_research::sat::IntegerVariableProto * mutable_variables(int index)
int variables_size() const
::operations_research::sat::ConstraintProto * add_constraints()
::operations_research::sat::IntegerVariableProto * add_variables()
::operations_research::sat::CpObjectiveProto * mutable_objective()
int constraints_size() const
const ::operations_research::sat::ConstraintProto & constraints(int index) const
void add_coeffs(int64_t value)
void add_vars(int32_t value)
void set_offset(double value)
void set_scaling_factor(double value)
int64_t solution(int index) const
Specialized cumulative constraint.
void AddDemand(IntervalVar interval, LinearExpr demand)
Adds a pair (interval, demand) to the constraint.
void add_intervals(int32_t value)
::operations_research::sat::LinearExpressionProto * add_demands()
A dedicated container for linear expressions with double coefficients.
double constant() const
Returns the constant term.
DoubleLinearExpr & operator+=(double value)
Adds a constant value to the linear expression.
std::string DebugString(const CpModelProto *proto=nullptr) const
Debug string. See the documentation for LinearExpr::DebugString().
static DoubleLinearExpr WeightedSum(absl::Span< const IntVar > vars, absl::Span< const double > coeffs)
Constructs the scalar product of variables and coefficients.
const std::vector< double > & coefficients() const
Returns the vector of coefficients.
const std::vector< int > & variables() const
Returns the vector of variable indices.
DoubleLinearExpr & operator-=(double value)
Adds a constant value to the linear expression.
DoubleLinearExpr & AddTerm(IntVar var, double coeff)
Adds a term (var * coeff) to the linear expression.
DoubleLinearExpr & operator*=(double coeff)
Multiply the linear expression by a constant.
static DoubleLinearExpr Sum(absl::Span< const IntVar > vars)
Constructs the sum of a list of variables.
void add_vars(int32_t value)
void add_coeffs(double value)
void set_offset(double value)
void set_maximize(bool value)
BoolVar ToBoolVar() const
Cast IntVar -> BoolVar.
std::string Name() const
Returns the name of the variable (or the empty string if not set).
IntVar()
A default constructed IntVar can be used to mean not defined yet.
std::string DebugString() const
IntVar WithName(const std::string &name)
Sets the name of the variable.
::operations_research::Domain Domain() const
const std::string & name() const
void set_name(ArgT0 &&arg0, ArgT... args)
int64_t domain(int index) const
void add_domain(int64_t value)
const ::operations_research::sat::LinearExpressionProto & end() const
const ::operations_research::sat::LinearExpressionProto & start() const
const ::operations_research::sat::LinearExpressionProto & size() const
Represents a Interval variable.
LinearExpr SizeExpr() const
Returns the size linear expression.
LinearExpr StartExpr() const
Returns the start linear expression.
BoolVar PresenceBoolVar() const
Returns a BoolVar indicating the presence of this interval.
std::string Name() const
Returns the name of the interval (or the empty string if not set).
std::string DebugString() const
Returns a debug string.
IntervalVar WithName(const std::string &name)
Sets the name of the variable.
LinearExpr EndExpr() const
Returns the end linear expression.
IntervalVar()
A default constructed IntervalVar can be used to mean not defined yet.
A dedicated container for linear expressions.
LinearExpr & operator+=(const LinearExpr &other)
LinearExpr & operator-=(const LinearExpr &other)
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.
static LinearExpr Sum(absl::Span< const IntVar > vars)
Constructs the sum of a list of variables.
std::string DebugString(const CpModelProto *proto=nullptr) const
Debug string.
const std::vector< int64_t > & coefficients() const
Returns the vector of coefficients.
const std::vector< int > & variables() const
Returns the vector of variable indices.
int64_t constant() const
Returns the constant term.
LinearExpr()=default
Creates an empty linear expression with value zero.
static LinearExpr FromProto(const LinearExpressionProto &proto)
Constructs a linear expr from its proto representation.
static LinearExpr Term(IntVar var, int64_t coefficient)
Constructs var * coefficient.
void set_offset(int64_t value)
void add_coeffs(int64_t value)
void add_vars(int32_t value)
int32_t vars(int index) const
int64_t coeffs(int index) const
Specialized circuit constraint.
void AddArc(int tail, int head, BoolVar literal)
Add an arc to the circuit.
Specialized no_overlap2D constraint.
void AddRectangle(IntervalVar x_coordinate, IntervalVar y_coordinate)
Adds a rectangle (parallel to the axis) to the constraint.
void add_y_intervals(int32_t value)
void add_x_intervals(int32_t value)
void add_vars(int32_t value)
void add_values(int64_t value)
PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final
Specialized reservoir constraint.
void AddOptionalEvent(LinearExpr time, int64_t level_change, BoolVar is_active)
Adds an optional event.
void AddEvent(LinearExpr time, int64_t level_change)
Adds a mandatory event.
void add_active_literals(int32_t value)
void add_level_changes(int64_t value)
::operations_research::sat::LinearExpressionProto * add_time_exprs()
void add_literals(int32_t value)
void add_heads(int32_t value)
void add_tails(int32_t value)
Specialized assignment constraint.
void AddTuple(absl::Span< const int64_t > tuple)
Adds a tuple of possible values to the constraint.
void add_values(int64_t value)
This file implements a wrapper around the CP-SAT model proto.
CpModelProto const * model_proto
absl::Span< const double > coefficients
DecisionStrategyProto_DomainReductionStrategy
std::ostream & operator<<(std::ostream &os, const BoolVar &var)
bool RefIsPositive(int ref)
std::string VarDebugString(const CpModelProto &proto, int index)
BoolVar Not(BoolVar x)
A convenient wrapper so we can write Not(x) instead of x.Not() which is sometimes clearer.
bool SolutionBooleanValue(const CpSolverResponse &r, BoolVar x)
Evaluates the value of a Boolean literal in a solver response.
DecisionStrategyProto_VariableSelectionStrategy
Domain ReadDomainFromProto(const ProtoWithDomain &proto)
int64_t SolutionIntegerValue(const CpSolverResponse &r, const LinearExpr &expr)
Evaluates the value of an linear expression in a solver response.
Collection of objects used to extend the Constraint Solver library.
std::optional< int64_t > end