17#include <initializer_list>
20#include "absl/strings/str_format.h"
33 : builder_(builder), index_(
index) {}
36 DCHECK(builder_ !=
nullptr);
37 if (builder_ ==
nullptr)
return *
this;
45 if (builder_ ==
nullptr)
return "null";
46 const std::string&
name =
51 return absl::StrCat(
"Not(",
name,
")");
56 if (builder_ ==
nullptr)
return "null";
65 output.append(var_proto.
domain(0) == 0 ?
"false" :
"true");
67 if (var_proto.
name().empty()) {
68 absl::StrAppendFormat(&output,
"BoolVar%i(", index_);
70 absl::StrAppendFormat(&output,
"%s(", var_proto.
name());
73 output.append(var_proto.
domain(0) == 0 ?
"false)" :
"true)");
75 absl::StrAppend(&output, var_proto.
domain(0),
", ", var_proto.
domain(1),
93 : builder_(builder), index_(
index) {
98 if (
var.builder_ ==
nullptr) {
102 builder_ =
var.builder_;
103 index_ = builder_->GetOrCreateIntegerIndex(
var.index_);
108 if (builder_ !=
nullptr) {
114 return BoolVar(index_, builder_);
118 DCHECK(builder_ !=
nullptr);
119 if (builder_ ==
nullptr)
return *
this;
125 if (builder_ ==
nullptr)
return "null";
134 if (builder_ ==
nullptr)
return Domain();
139 if (builder_ ==
nullptr)
return "null";
152 absl::StrAppend(&output, var_proto.
domain(0));
154 if (var_proto.
name().empty()) {
155 absl::StrAppend(&output,
"V",
index,
"(");
157 absl::StrAppend(&output, var_proto.
name(),
"(");
163 absl::StrAppend(&output, var_proto.
domain(0),
")");
165 absl::StrAppend(&output, var_proto.
domain(0),
", ", var_proto.
domain(1),
186 for (
int i = 0; i < expr_proto.
vars_size(); ++i) {
187 result.variables_.push_back(expr_proto.
vars(i));
188 result.coefficients_.push_back(expr_proto.
coeffs(i));
218 absl::Span<const int64_t> coeffs) {
219 CHECK_EQ(vars.size(), coeffs.size());
221 for (
int i = 0; i < vars.size(); ++i) {
222 result.
AddTerm(vars[i], coeffs[i]);
228 absl::Span<const int64_t> coeffs) {
229 CHECK_EQ(vars.size(), coeffs.size());
231 for (
int i = 0; i < vars.size(); ++i) {
232 result.
AddTerm(vars[i], coeffs[i]);
238 absl::Span<const int64_t> coeffs) {
239 CHECK_EQ(vars.size(), coeffs.size());
269 absl::Span<const int64_t> coeffs) {
270 CHECK_EQ(vars.size(), coeffs.size());
272 for (
int i = 0; i < vars.size(); ++i) {
273 result.
AddTerm(vars[i], coeffs[i]);
289 variables_.push_back(
var.index_);
290 coefficients_.push_back(coeff);
298 variables_.push_back(
index);
299 coefficients_.push_back(coeff);
303 coefficients_.push_back(-coeff);
310 constant_ += other.constant_;
311 variables_.insert(variables_.end(), other.variables_.begin(),
312 other.variables_.end());
313 coefficients_.insert(coefficients_.end(), other.coefficients_.begin(),
314 other.coefficients_.end());
319 constant_ -= other.constant_;
320 variables_.insert(variables_.end(), other.variables_.begin(),
321 other.variables_.end());
322 for (
const int64_t coeff : other.coefficients_) {
323 coefficients_.push_back(-coeff);
330 for (int64_t& coeff : coefficients_) coeff *= factor;
336 for (
int i = 0; i < variables_.size(); ++i) {
337 const int64_t coeff = coefficients_[i];
338 const std::string var_string =
proto ==
nullptr
339 ? absl::StrCat(
"V", variables_[i])
343 absl::StrAppend(&result, var_string);
344 }
else if (coeff == -1) {
345 absl::StrAppend(&result,
"-", var_string);
346 }
else if (coeff != 0) {
347 absl::StrAppend(&result, coeff,
" * ", var_string);
349 }
else if (coeff == 1) {
350 absl::StrAppend(&result,
" + ", var_string);
351 }
else if (coeff > 0) {
352 absl::StrAppend(&result,
" + ", coeff,
" * ", var_string);
353 }
else if (coeff == -1) {
354 absl::StrAppend(&result,
" - ", var_string);
355 }
else if (coeff < 0) {
356 absl::StrAppend(&result,
" - ", -coeff,
" * ", var_string);
360 if (constant_ != 0) {
361 if (variables_.empty()) {
362 return absl::StrCat(constant_);
363 }
else if (constant_ > 0) {
364 absl::StrAppend(&result,
" + ", constant_);
366 absl::StrAppend(&result,
" - ", -constant_);
410 absl::Span<const double> coeffs) {
411 CHECK_EQ(vars.size(), coeffs.size());
413 for (
int i = 0; i < vars.size(); ++i) {
414 result.
AddTerm(vars[i], coeffs[i]);
420 absl::Span<const double> coeffs) {
421 CHECK_EQ(vars.size(), coeffs.size());
423 for (
int i = 0; i < vars.size(); ++i) {
424 result.
AddTerm(vars[i], coeffs[i]);
430 absl::Span<const double> coeffs) {
431 CHECK_EQ(vars.size(), coeffs.size());
461 constant_ += expr.constant_;
462 variables_.insert(variables_.end(), expr.variables_.begin(),
463 expr.variables_.end());
464 coefficients_.insert(coefficients_.end(), expr.coefficients_.begin(),
465 expr.coefficients_.end());
470 variables_.push_back(
var.index_);
471 coefficients_.push_back(coeff);
478 variables_.push_back(
index);
479 coefficients_.push_back(coeff);
482 coefficients_.push_back(-coeff);
499 constant_ -= expr.constant_;
500 variables_.insert(variables_.end(), expr.variables_.begin(),
501 expr.variables_.end());
503 coefficients_.push_back(-coeff);
510 for (
double& c : coefficients_) {
518 for (
int i = 0; i < variables_.size(); ++i) {
519 const double coeff = coefficients_[i];
520 const std::string var_string =
proto ==
nullptr
521 ? absl::StrCat(
"V", variables_[i])
525 absl::StrAppend(&result, var_string);
526 }
else if (coeff == -1.0) {
527 absl::StrAppend(&result,
"-", var_string);
528 }
else if (coeff != 0.0) {
529 absl::StrAppend(&result, coeff,
" * ", var_string);
531 }
else if (coeff == 1.0) {
532 absl::StrAppend(&result,
" + ", var_string);
533 }
else if (coeff > 0.0) {
534 absl::StrAppend(&result,
" + ", coeff,
" * ", var_string);
535 }
else if (coeff == -1.0) {
536 absl::StrAppend(&result,
" - ", var_string);
537 }
else if (coeff < 0.0) {
538 absl::StrAppend(&result,
" - ", -coeff,
" * ", var_string);
542 if (constant_ != 0.0) {
543 if (variables_.empty()) {
544 return absl::StrCat(constant_);
545 }
else if (constant_ > 0.0) {
546 absl::StrAppend(&result,
" + ", constant_);
548 absl::StrAppend(&result,
" - ", -constant_);
594 for (
const int64_t t : tuple) {
605 builder_->LinearExprToProto(
time);
608 builder_->IndexFromConstant(1));
612 int64_t level_change,
615 builder_->LinearExprToProto(
time);
621 int64_t transition_label) {
640 builder_->LinearExprToProto(
demand);
646 : builder_(builder), index_(
index) {}
649 DCHECK(builder_ !=
nullptr);
650 if (builder_ ==
nullptr)
return *
this;
656 DCHECK(builder_ !=
nullptr);
663 DCHECK(builder_ !=
nullptr);
670 DCHECK(builder_ !=
nullptr);
677 DCHECK(builder_ !=
nullptr);
678 if (builder_ ==
nullptr)
return BoolVar();
684 if (builder_ ==
nullptr)
return "null";
689 if (builder_ ==
nullptr)
return "null";
695 if (ct_proto.
name().empty()) {
696 absl::StrAppend(&output,
"IntervalVar", index_,
"(");
698 absl::StrAppend(&output, ct_proto.
name(),
"(");
716int CpModelBuilder::IndexFromConstant(int64_t
value) {
717 if (!constant_to_index_map_.contains(
value)) {
724 return constant_to_index_map_[
value];
727int CpModelBuilder::GetOrCreateIntegerIndex(
int index) {
731 if (!bool_to_integer_index_map_.contains(
index)) {
733 const IntegerVariableProto& old_var = cp_model_.
variables(
var);
735 IntegerVariableProto*
const new_var = cp_model_.
add_variables();
737 new_var->add_domain(1);
738 if (!old_var.name().empty()) {
739 new_var->set_name(absl::StrCat(
"Not(", old_var.name(),
")"));
742 bool_to_integer_index_map_[
index] = new_index;
745 return bool_to_integer_index_map_[
index];
751 for (
const auto&
interval : domain) {
771 return BoolVar(IndexFromConstant(1),
this);
775 return BoolVar(IndexFromConstant(0),
this);
798 ct->add_enforcement_literal(presence.index_);
800 *
interval->mutable_start() = LinearExprToProto(start);
801 *
interval->mutable_size() = LinearExprToProto(size);
802 *
interval->mutable_end() = LinearExprToProto(end);
810 ct->add_enforcement_literal(presence.index_);
812 *
interval->mutable_start() = LinearExprToProto(start);
813 interval->mutable_size()->set_offset(size);
814 *
interval->mutable_end() = LinearExprToProto(start);
821 for (
const BoolVar& lit : literals) {
822 proto->mutable_bool_or()->add_literals(lit.index_);
829 for (
const BoolVar& lit : literals) {
830 proto->mutable_bool_and()->add_literals(lit.index_);
837 for (
const BoolVar& lit : literals) {
838 proto->mutable_bool_xor()->add_literals(lit.index_);
843void CpModelBuilder::FillLinearTerms(
const LinearExpr& left,
850 proto->add_coeffs(coeff);
856 proto->add_coeffs(-coeff);
863 FillLinearTerms(left, right,
proto->mutable_linear());
865 proto->mutable_linear()->add_domain(rhs);
866 proto->mutable_linear()->add_domain(rhs);
873 FillLinearTerms(left, right,
proto->mutable_linear());
875 proto->mutable_linear()->add_domain(rhs);
883 FillLinearTerms(left, right,
proto->mutable_linear());
886 proto->mutable_linear()->add_domain(rhs);
893 FillLinearTerms(left, right,
proto->mutable_linear());
895 proto->mutable_linear()->add_domain(rhs + 1);
903 FillLinearTerms(left, right,
proto->mutable_linear());
906 proto->mutable_linear()->add_domain(rhs - 1);
914 proto->mutable_linear()->add_vars(x);
917 proto->mutable_linear()->add_coeffs(coeff);
919 const int64_t cst = expr.
constant();
920 for (
const auto& i : domain) {
921 proto->mutable_linear()->add_domain(i.start - cst);
922 proto->mutable_linear()->add_domain(i.end - cst);
930 FillLinearTerms(left, right,
proto->mutable_linear());
933 proto->mutable_linear()->add_domain(rhs - 1);
934 proto->mutable_linear()->add_domain(rhs + 1);
942 auto* expr =
proto->mutable_all_diff()->add_exprs();
943 expr->add_vars(
var.index_);
952 *
proto->mutable_all_diff()->add_exprs() = LinearExprToProto(expr);
958 std::initializer_list<LinearExpr> exprs) {
961 *
proto->mutable_all_diff()->add_exprs() = LinearExprToProto(expr);
969 proto->mutable_element()->set_index(
index.index_);
970 proto->mutable_element()->set_target(target.index_);
972 proto->mutable_element()->add_vars(
var.index_);
978 absl::Span<const int64_t> values,
981 proto->mutable_element()->set_index(
index.index_);
982 proto->mutable_element()->set_target(target.index_);
983 for (int64_t
value : values) {
984 proto->mutable_element()->add_vars(IndexFromConstant(
value));
998 absl::Span<const IntVar> vars) {
1001 proto->mutable_table()->add_vars(
var.index_);
1007 absl::Span<const IntVar> vars) {
1010 proto->mutable_table()->add_vars(
var.index_);
1012 proto->mutable_table()->set_negated(
true);
1017 absl::Span<const IntVar> variables,
1018 absl::Span<const IntVar> inverse_variables) {
1021 proto->mutable_inverse()->add_f_direct(
var.index_);
1023 for (
const IntVar&
var : inverse_variables) {
1024 proto->mutable_inverse()->add_f_inverse(
var.index_);
1030 int64_t max_level) {
1032 proto->mutable_reservoir()->set_min_level(min_level);
1033 proto->mutable_reservoir()->set_max_level(max_level);
1038 absl::Span<const IntVar> transition_variables,
int starting_state,
1039 absl::Span<const int> final_states) {
1041 for (
const IntVar&
var : transition_variables) {
1042 proto->mutable_automaton()->add_vars(
var.index_);
1044 proto->mutable_automaton()->set_starting_state(starting_state);
1045 for (
const int final_state : final_states) {
1046 proto->mutable_automaton()->add_final_states(final_state);
1057 const int64_t mult = negate ? -1 : 1;
1066 absl::Span<const IntVar> vars) {
1068 *
ct->mutable_lin_max()->mutable_target() =
1069 LinearExprToProto(target,
true);
1071 *
ct->mutable_lin_max()->add_exprs() =
1072 LinearExprToProto(
var,
true);
1078 absl::Span<const LinearExpr> exprs) {
1080 *
ct->mutable_lin_max()->mutable_target() =
1081 LinearExprToProto(target,
true);
1083 *
ct->mutable_lin_max()->add_exprs() =
1084 LinearExprToProto(expr,
true);
1090 const LinearExpr& target, std::initializer_list<LinearExpr> exprs) {
1092 *
ct->mutable_lin_max()->mutable_target() =
1093 LinearExprToProto(target,
true);
1095 *
ct->mutable_lin_max()->add_exprs() =
1096 LinearExprToProto(expr,
true);
1102 absl::Span<const IntVar> vars) {
1104 *
ct->mutable_lin_max()->mutable_target() = LinearExprToProto(target);
1106 *
ct->mutable_lin_max()->add_exprs() = LinearExprToProto(
var);
1112 absl::Span<const LinearExpr> exprs) {
1114 *
ct->mutable_lin_max()->mutable_target() = LinearExprToProto(target);
1116 *
ct->mutable_lin_max()->add_exprs() = LinearExprToProto(expr);
1122 const LinearExpr& target, std::initializer_list<LinearExpr> exprs) {
1124 *
ct->mutable_lin_max()->mutable_target() = LinearExprToProto(target);
1126 *
ct->mutable_lin_max()->add_exprs() = LinearExprToProto(expr);
1135 *
proto->mutable_int_div()->mutable_target() = LinearExprToProto(target);
1136 *
proto->mutable_int_div()->add_exprs() = LinearExprToProto(numerator);
1137 *
proto->mutable_int_div()->add_exprs() = LinearExprToProto(denominator);
1144 *
proto->mutable_lin_max()->mutable_target() = LinearExprToProto(target);
1145 *
proto->mutable_lin_max()->add_exprs() = LinearExprToProto(expr);
1146 *
proto->mutable_lin_max()->add_exprs() =
1147 LinearExprToProto(expr,
true);
1155 *
proto->mutable_int_mod()->mutable_target() = LinearExprToProto(target);
1156 *
proto->mutable_int_mod()->add_exprs() = LinearExprToProto(
var);
1157 *
proto->mutable_int_mod()->add_exprs() = LinearExprToProto(mod);
1162 const LinearExpr& target, absl::Span<const IntVar> vars) {
1164 *
proto->mutable_int_prod()->mutable_target() = LinearExprToProto(target);
1166 *
proto->mutable_int_prod()->add_exprs() = LinearExprToProto(
var);
1172 const LinearExpr& target, absl::Span<const LinearExpr> exprs) {
1174 *
proto->mutable_int_prod()->mutable_target() = LinearExprToProto(target);
1176 *
proto->mutable_int_prod()->add_exprs() = LinearExprToProto(expr);
1182 const LinearExpr& target, std::initializer_list<LinearExpr> exprs) {
1184 *
proto->mutable_int_prod()->mutable_target() = LinearExprToProto(target);
1186 *
proto->mutable_int_prod()->add_exprs() = LinearExprToProto(expr);
1194 proto->mutable_no_overlap()->add_intervals(
var.index_);
1205 *
proto->mutable_cumulative()->mutable_capacity() =
1238 for (
int i = 0; i < expr.
variables().size(); ++i) {
1250 for (
int i = 0; i < expr.
variables().size(); ++i) {
1260 absl::Span<const IntVar> variables,
1267 proto->set_variable_selection_strategy(var_strategy);
1268 proto->set_domain_reduction_strategy(domain_strategy);
1272 absl::Span<const BoolVar> variables,
1279 proto->set_variable_selection_strategy(var_strategy);
1280 proto->set_domain_reduction_strategy(domain_strategy);
1289 if (
var.index_ >= 0) {
1307 for (
const BoolVar& lit : literals) {
1319 constant_to_index_map_.clear();
1322 if (
var.domain_size() == 2 &&
var.domain(0) ==
var.domain(1)) {
1323 constant_to_index_map_[
var.domain(0)] = i;
1327 bool_to_integer_index_map_.clear();
1335 <<
"CpModelBuilder::GetBoolVarFromProtoIndex: The domain of the variable "
1338 <<
"CpModelBuilder::GetBoolVarFromProtoIndex: The domain of the variable "
1341 <<
"CpModelBuilder::GetBoolVarFromProtoIndex: The domain of the variable "
1357 <<
"CpModelBuilder::GetIntervalVarFromProtoIndex: the referenced "
1358 "object is not an interval variable";
1365 const std::vector<int>& variables = expr.
variables();
1367 for (
int i = 0; i < variables.size(); ++i) {
1374 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.
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 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 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.
static DoubleLinearExpr ScalProd(absl::Span< const IntVar > vars, absl::Span< const double > coeffs)
Constructs the scalar product of variables and 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().
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.
DoubleLinearExpr & AddConstant(double constant)
Deprecated. Use +=.
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
LinearExpr AddConstant(int64_t value) const
Deprecated. Just do var + cte where needed.
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 & AddVar(IntVar var)
LinearExpr & operator-=(const LinearExpr &other)
LinearExpr & operator*=(int64_t factor)
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.
static LinearExpr BooleanSum(absl::Span< const BoolVar > vars)
Deprecated. Use Sum() instead.
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 BooleanScalProd(absl::Span< const BoolVar > vars, absl::Span< const int64_t > coeffs)
Deprecated. Use ScalProd() instead.
static LinearExpr FromProto(const LinearExpressionProto &proto)
Constructs a linear expr from its proto representation.
static LinearExpr ScalProd(absl::Span< const IntVar > vars, absl::Span< const int64_t > coeffs)
Constructs the scalar product of variables and coefficients.
LinearExpr & AddTerm(BoolVar var, int64_t coeff)
LinearExpr & AddConstant(int64_t value)
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 a 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.