19 #include "absl/strings/str_format.h" 32 : cp_model_(cp_model), index_(
index) {}
48 output.append(var_proto.
domain(0) == 0 ?
"false" :
"true");
50 if (var_proto.
name().empty()) {
51 absl::StrAppendFormat(&output,
"BoolVar%i(", index_);
53 absl::StrAppendFormat(&output,
"%s(", var_proto.
name());
56 output.append(var_proto.
domain(0) == 0 ?
"false)" :
"true)");
58 absl::StrAppend(&output, var_proto.
domain(0),
", ", var_proto.
domain(1),
76 : cp_model_(cp_model), index_(
index) {
86 cp_model_ =
var.cp_model_;
95 var.cp_model_ = cp_model_;
106 return absl::StrFormat(
"Not(%s)",
113 return absl::StrCat(var_proto.
domain(0));
116 if (var_proto.
name().empty()) {
117 absl::StrAppend(&output,
"IntVar", index_,
"(");
119 absl::StrAppend(&output, var_proto.
name(),
"(");
123 absl::StrAppend(&output, var_proto.
domain(0),
")");
126 absl::StrAppend(&output, var_proto.
domain(0),
", ", var_proto.
domain(1),
155 absl::Span<const int64_t> coeffs) {
156 CHECK_EQ(vars.size(), coeffs.size());
158 for (
int i = 0; i < vars.size(); ++i) {
159 result.
AddTerm(vars[i], coeffs[i]);
179 absl::Span<const int64_t> coeffs) {
180 CHECK_EQ(vars.size(), coeffs.size());
182 for (
int i = 0; i < vars.size(); ++i) {
183 result.
AddTerm(vars[i], coeffs[i]);
201 variables_.push_back(
var);
202 coefficients_.push_back(coeff);
205 coefficients_.push_back(-coeff);
212 constant_ += expr.constant_;
213 variables_.insert(variables_.end(), expr.variables_.begin(),
214 expr.variables_.end());
215 coefficients_.insert(coefficients_.end(), expr.coefficients_.begin(),
216 expr.coefficients_.end());
224 return variables_.front();
228 CHECK(variables_.empty());
234 for (
int i = 0; i < variables_.size(); ++i) {
235 const int64_t coeff = coefficients_[i];
238 absl::StrAppend(&result, variables_[i].
DebugString());
239 }
else if (coeff == -1) {
240 absl::StrAppend(&result,
"-", variables_[i].
DebugString());
241 }
else if (coeff != 0) {
242 absl::StrAppend(&result, coeff,
" * ", variables_[i].
DebugString());
244 }
else if (coeff == 1) {
245 absl::StrAppend(&result,
" + ", variables_[i].
DebugString());
246 }
else if (coeff > 0) {
247 absl::StrAppend(&result,
" + ", coeff,
" * ",
249 }
else if (coeff == -1) {
250 absl::StrAppend(&result,
" - ", variables_[i].
DebugString());
251 }
else if (coeff < 0) {
252 absl::StrAppend(&result,
" - ", -coeff,
" * ",
257 if (constant_ != 0) {
258 if (variables_.empty()) {
259 return absl::StrCat(constant_);
260 }
else if (constant_ > 0) {
261 absl::StrAppend(&result,
" + ", constant_);
263 absl::StrAppend(&result,
" - ", -constant_);
309 for (
const int64_t t : tuple) {
320 builder_->GetOrCreateIntegerIndex(
time.index_));
328 builder_->GetOrCreateIntegerIndex(
time.index_));
334 int64_t transition_label) {
353 builder_->GetOrCreateIntegerIndex(
demand.index_));
359 : cp_model_(cp_model), index_(
index) {}
367 return CpModelBuilder::LinearExprFromProto(
Proto().start_view(), cp_model_);
371 return CpModelBuilder::LinearExprFromProto(
Proto().size_view(), cp_model_);
375 return CpModelBuilder::LinearExprFromProto(
Proto().end_view(), cp_model_);
391 if (ct_proto.
name().empty()) {
392 absl::StrAppend(&output,
"IntervalVar", index_,
"(");
394 absl::StrAppend(&output, ct_proto.
name(),
"(");
407 int CpModelBuilder::IndexFromConstant(int64_t
value) {
410 IntegerVariableProto*
const var_proto = cp_model_.
add_variables();
412 var_proto->add_domain(
value);
415 return constant_to_index_map_[
value];
418 int CpModelBuilder::GetOrCreateIntegerIndex(
int index) {
424 const IntegerVariableProto& old_var = cp_model_.
variables(
var);
426 IntegerVariableProto*
const new_var = cp_model_.
add_variables();
428 new_var->add_domain(1);
429 if (!old_var.name().empty()) {
430 new_var->set_name(absl::StrCat(
"Not(", old_var.name(),
")"));
433 bool_to_integer_index_map_[
index] = new_index;
436 return bool_to_integer_index_map_[
index];
442 for (
const auto&
interval : domain) {
458 return IntVar(IndexFromConstant(
value), &cp_model_);
462 return BoolVar(IndexFromConstant(1), &cp_model_);
466 return BoolVar(IndexFromConstant(0), &cp_model_);
489 ct->add_enforcement_literal(presence.index_);
491 LinearExprToProto(start,
interval->mutable_start_view());
492 LinearExprToProto(size,
interval->mutable_size_view());
493 LinearExprToProto(end,
interval->mutable_end_view());
501 ct->add_enforcement_literal(presence.index_);
503 LinearExprToProto(start,
interval->mutable_start_view());
504 interval->mutable_size_view()->set_offset(size);
505 LinearExprToProto(start,
interval->mutable_end_view());
513 for (
const BoolVar& lit : literals) {
514 proto->mutable_bool_or()->add_literals(lit.index_);
521 for (
const BoolVar& lit : literals) {
522 proto->mutable_bool_and()->add_literals(lit.index_);
529 for (
const BoolVar& lit : literals) {
530 proto->mutable_bool_xor()->add_literals(lit.index_);
535 void CpModelBuilder::FillLinearTerms(
const LinearExpr& left,
539 proto->add_vars(x.index_);
542 proto->add_coeffs(coeff);
544 for (
const IntVar& x : right.
variables()) {
545 proto->add_vars(x.index_);
548 proto->add_coeffs(-coeff);
555 FillLinearTerms(left, right,
proto->mutable_linear());
557 proto->mutable_linear()->add_domain(rhs);
558 proto->mutable_linear()->add_domain(rhs);
565 FillLinearTerms(left, right,
proto->mutable_linear());
567 proto->mutable_linear()->add_domain(rhs);
575 FillLinearTerms(left, right,
proto->mutable_linear());
578 proto->mutable_linear()->add_domain(rhs);
585 FillLinearTerms(left, right,
proto->mutable_linear());
587 proto->mutable_linear()->add_domain(rhs + 1);
595 FillLinearTerms(left, right,
proto->mutable_linear());
598 proto->mutable_linear()->add_domain(rhs - 1);
606 proto->mutable_linear()->add_vars(x.index_);
609 proto->mutable_linear()->add_coeffs(coeff);
611 const int64_t cst = expr.
constant();
612 for (
const auto& i : domain) {
613 proto->mutable_linear()->add_domain(i.start - cst);
614 proto->mutable_linear()->add_domain(i.end - cst);
622 FillLinearTerms(left, right,
proto->mutable_linear());
625 proto->mutable_linear()->add_domain(rhs - 1);
626 proto->mutable_linear()->add_domain(rhs + 1);
634 proto->mutable_all_diff()->add_vars(GetOrCreateIntegerIndex(
var.index_));
642 proto->mutable_element()->set_index(GetOrCreateIntegerIndex(
index.index_));
643 proto->mutable_element()->set_target(GetOrCreateIntegerIndex(target.index_));
645 proto->mutable_element()->add_vars(GetOrCreateIntegerIndex(
var.index_));
651 absl::Span<const int64_t> values,
654 proto->mutable_element()->set_index(GetOrCreateIntegerIndex(
index.index_));
655 proto->mutable_element()->set_target(GetOrCreateIntegerIndex(target.index_));
656 for (int64_t
value : values) {
657 proto->mutable_element()->add_vars(IndexFromConstant(
value));
671 absl::Span<const IntVar> vars) {
674 proto->mutable_table()->add_vars(GetOrCreateIntegerIndex(
var.index_));
680 absl::Span<const IntVar> vars) {
683 proto->mutable_table()->add_vars(GetOrCreateIntegerIndex(
var.index_));
685 proto->mutable_table()->set_negated(
true);
690 absl::Span<const IntVar> variables,
691 absl::Span<const IntVar> inverse_variables) {
694 proto->mutable_inverse()->add_f_direct(GetOrCreateIntegerIndex(
var.index_));
696 for (
const IntVar&
var : inverse_variables) {
697 proto->mutable_inverse()->add_f_inverse(
698 GetOrCreateIntegerIndex(
var.index_));
706 proto->mutable_reservoir()->set_min_level(min_level);
707 proto->mutable_reservoir()->set_max_level(max_level);
712 absl::Span<const IntVar> transition_variables,
int starting_state,
713 absl::Span<const int> final_states) {
715 for (
const IntVar&
var : transition_variables) {
716 proto->mutable_automaton()->add_vars(GetOrCreateIntegerIndex(
var.index_));
718 proto->mutable_automaton()->set_starting_state(starting_state);
719 for (
const int final_state : final_states) {
720 proto->mutable_automaton()->add_final_states(final_state);
726 absl::Span<const IntVar> vars) {
728 proto->mutable_int_min()->set_target(GetOrCreateIntegerIndex(target.index_));
730 proto->mutable_int_min()->add_vars(GetOrCreateIntegerIndex(
var.index_));
735 void CpModelBuilder::LinearExprToProto(
const LinearExpr& expr,
738 expr_proto->
add_vars(GetOrCreateIntegerIndex(
var.index_));
746 LinearExpr CpModelBuilder::LinearExprFromProto(
747 const LinearExpressionProto& expr_proto, CpModelProto*
model_proto) {
748 LinearExpr result(expr_proto.offset());
749 for (
int i = 0; i < expr_proto.vars_size(); ++i) {
750 result.AddTerm(IntVar(expr_proto.vars(i),
model_proto),
751 expr_proto.coeffs(i));
757 const LinearExpr& target, absl::Span<const LinearExpr> exprs) {
759 LinearExprToProto(target,
proto->mutable_lin_min()->mutable_target());
762 LinearExprToProto(expr, expr_proto);
768 absl::Span<const IntVar> vars) {
770 proto->mutable_int_max()->set_target(GetOrCreateIntegerIndex(target.index_));
772 proto->mutable_int_max()->add_vars(GetOrCreateIntegerIndex(
var.index_));
778 const LinearExpr& target, absl::Span<const LinearExpr> exprs) {
780 LinearExprToProto(target,
proto->mutable_lin_max()->mutable_target());
783 LinearExprToProto(expr, expr_proto);
791 proto->mutable_int_div()->set_target(GetOrCreateIntegerIndex(target.index_));
792 proto->mutable_int_div()->add_vars(GetOrCreateIntegerIndex(numerator.index_));
793 proto->mutable_int_div()->add_vars(
794 GetOrCreateIntegerIndex(denominator.index_));
800 proto->mutable_int_max()->set_target(GetOrCreateIntegerIndex(target.index_));
801 proto->mutable_int_max()->add_vars(GetOrCreateIntegerIndex(
var.index_));
802 proto->mutable_int_max()->add_vars(
810 proto->mutable_int_mod()->set_target(GetOrCreateIntegerIndex(target.index_));
811 proto->mutable_int_mod()->add_vars(GetOrCreateIntegerIndex(
var.index_));
812 proto->mutable_int_mod()->add_vars(GetOrCreateIntegerIndex(mod.index_));
817 absl::Span<const IntVar> vars) {
819 proto->mutable_int_prod()->set_target(GetOrCreateIntegerIndex(target.index_));
821 proto->mutable_int_prod()->add_vars(GetOrCreateIntegerIndex(
var.index_));
829 proto->mutable_no_overlap()->add_intervals(
830 GetOrCreateIntegerIndex(
var.index_));
841 proto->mutable_cumulative()->set_capacity(
842 GetOrCreateIntegerIndex(
capacity.index_));
876 absl::Span<const IntVar> variables,
883 proto->set_variable_selection_strategy(var_strategy);
884 proto->set_domain_reduction_strategy(domain_strategy);
888 absl::Span<const BoolVar> variables,
895 proto->set_variable_selection_strategy(var_strategy);
896 proto->set_domain_reduction_strategy(domain_strategy);
901 GetOrCreateIntegerIndex(
var.index_));
914 for (
const BoolVar& lit : literals) {
926 constant_to_index_map_.clear();
929 if (
var.domain_size() == 2 &&
var.domain(0) ==
var.domain(1)) {
930 constant_to_index_map_[
var.domain(0)] = i;
934 bool_to_integer_index_map_.clear();
942 <<
"CpModelBuilder::GetBoolVarFromProtoIndex: The domain of the variable " 945 <<
"CpModelBuilder::GetBoolVarFromProtoIndex: The domain of the variable " 948 <<
"CpModelBuilder::GetBoolVarFromProtoIndex: The domain of the variable " 964 <<
"CpModelBuilder::GetIntervalVarFromProtoIndex: the referenced " 965 "object is not an interval variable";
972 const std::vector<IntVar>& variables = expr.
variables();
974 for (
int i = 0; i < variables.size(); ++i) {
997 const int ref = x.index_;
void AddArc(int tail, int head, BoolVar literal)
Add an arc to the circuit.
void add_tails(::PROTOBUF_NAMESPACE_ID::int32 value)
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.
Constraint AddModuloEquality(IntVar target, IntVar var, IntVar mod)
Adds target = var % mod.
const std::string & name() const
const ::operations_research::sat::TableConstraintProto & table() const
void set_offset(double value)
void add_actives(::PROTOBUF_NAMESPACE_ID::int32 value)
LinearExpr & AddConstant(int64_t value)
Adds a constant value to the linear expression.
Specialized reservoir constraint.
LinearExpr EndExpr() const
Returns the end linear expression.
IntervalVar()
Default ctor.
BoolVar TrueVar()
Creates an always true Boolean variable.
Constraint AddLinMaxEquality(const LinearExpr &target, absl::Span< const LinearExpr > exprs)
Adds target == max(exprs).
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
Debug string.
Constraint AddAbsEquality(IntVar target, IntVar var)
Adds target == abs(var).
static LinearExpr Term(IntVar var, int64_t coefficient)
Constructs var * coefficient.
::PROTOBUF_NAMESPACE_ID::int64 solution_upper_bounds(int index) const
CircuitConstraint AddCircuitConstraint()
Adds a circuit constraint.
void add_enforcement_literal(::PROTOBUF_NAMESPACE_ID::int32 value)
Constraint AddGreaterThan(const LinearExpr &left, const LinearExpr &right)
Adds left > right.
Specialized no_overlap2D constraint.
#define CHECK_GE(val1, val2)
BoolVar Not() const
Returns the logical negation of the current Boolean variable.
::PROTOBUF_NAMESPACE_ID::RepeatedField< ::PROTOBUF_NAMESPACE_ID::int32 > * mutable_assumptions()
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.
LinearExpr AddConstant(int64_t value) const
Adds a constant value to an integer variable and returns a linear expression.
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
void add_vars(::PROTOBUF_NAMESPACE_ID::int32 value)
::operations_research::sat::CircuitConstraintProto * mutable_circuit()
TableConstraint AddAllowedAssignments(absl::Span< const IntVar > vars)
Adds an allowed assignments constraint.
void add_intervals(::PROTOBUF_NAMESPACE_ID::int32 value)
ReservoirConstraint AddReservoirConstraint(int64_t min_level, int64_t max_level)
Adds a reservoir constraint with optional refill/emptying events.
void add_demands(::PROTOBUF_NAMESPACE_ID::int32 value)
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.
::operations_research::sat::AutomatonConstraintProto * mutable_automaton()
::operations_research::sat::TableConstraintProto * mutable_table()
Constraint AddBoolOr(absl::Span< const BoolVar > literals)
Adds the constraint that at least one of the literals must be true.
Constraint AddProductEquality(IntVar target, absl::Span< const IntVar > vars)
Adds target == prod(vars).
void add_y_intervals(::PROTOBUF_NAMESPACE_ID::int32 value)
IntervalVar NewFixedSizeIntervalVar(const LinearExpr &start, int64_t size)
Creates an interval variable with a fixed size.
DecisionStrategyProto_VariableSelectionStrategy
LinearExpr & AddExpression(const LinearExpr &expr)
Adds another linear expression to the linear expression.
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()
void add_vars(::PROTOBUF_NAMESPACE_ID::int32 value)
Specialized circuit constraint.
Constraint AddBoolXor(absl::Span< const BoolVar > literals)
Adds the constraint that a odd number of literal is true.
::operations_research::sat::NoOverlap2DConstraintProto * mutable_no_overlap_2d()
friend class ReservoirConstraint
Specialized cumulative constraint.
int variables_size() const
Specialized assignment constraint.
void AddDemand(IntervalVar interval, IntVar demand)
Adds a pair (interval, demand) to the constraint.
::operations_research::sat::IntegerVariableProto * add_variables()
void Minimize(const LinearExpr &expr)
Adds a linear minimization objective.
void add_literals(::PROTOBUF_NAMESPACE_ID::int32 value)
const std::vector< int64_t > & coefficients() const
Returns the vector of coefficients.
const std::string & name() const
#define CHECK_LT(val1, val2)
IntVar NewConstant(int64_t value)
Creates a constant variable.
PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final
void Maximize(const LinearExpr &expr)
Adds a linear maximization objective.
LinearExpr & AddTerm(IntVar var, int64_t coeff)
Adds a term (var * coeff) to the linear expression.
::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.
::PROTOBUF_NAMESPACE_ID::int32 enforcement_literal(int index) const
void ClearAssumptions()
Remove all assumptions from the model.
Constraint AddMaxEquality(IntVar target, absl::Span< const IntVar > vars)
Adds target == max(vars).
void add_transition_head(::PROTOBUF_NAMESPACE_ID::int64 value)
IntVar Var() const
Checks that the expression is 1 * var + 0, and returns var.
const ::operations_research::sat::IntegerVariableProto & variables(int index) const
Constraint AddInverseConstraint(absl::Span< const IntVar > variables, absl::Span< const IntVar > inverse_variables)
An inverse constraint.
BoolVar ToBoolVar() const
Cast IntVar -> BoolVar.
MultipleCircuitConstraint AddMultipleCircuitConstraint()
Adds a multiple circuit constraint, aka the "VRP" (Vehicle Routing Problem) constraint.
void set_name(ArgT0 &&arg0, ArgT... args)
void add_times(::PROTOBUF_NAMESPACE_ID::int32 value)
void add_coeffs(::PROTOBUF_NAMESPACE_ID::int64 value)
int64_t SolutionIntegerMax(const CpSolverResponse &r, IntVar x)
Returns the max of an integer variable in a solution.
void add_transition_tail(::PROTOBUF_NAMESPACE_ID::int64 value)
::PROTOBUF_NAMESPACE_ID::int64 solution_lower_bounds(int index) const
LinearExpr & AddVar(IntVar var)
Adds a single integer variable to the linear expression.
BoolVar PresenceBoolVar() const
Returns a BoolVar indicating the presence of this interval.
static LinearExpr ScalProd(absl::Span< const IntVar > vars, absl::Span< const int64_t > coeffs)
Constructs the scalar product of variables and coefficients.
int64_t SolutionIntegerMin(const CpSolverResponse &r, IntVar x)
Returns the min of an integer variable in a solution.
#define CHECK_LE(val1, val2)
const ::operations_research::sat::ConstraintProto & constraints(int index) const
::operations_research::sat::ConstraintProto * add_constraints()
int index() const
Returns the index of the variable in the model.
void add_literals(::PROTOBUF_NAMESPACE_ID::int32 value)
bool ContainsKey(const Collection &collection, const Key &key)
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 ::operations_research::sat::CpObjectiveProto & objective() const
const std::string & Name() const
Returns the name of the constraint (or the empty string if not set).
void add_domain(::PROTOBUF_NAMESPACE_ID::int64 value)
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.
void AddEvent(IntVar time, int64_t demand)
Adds a mandatory event.
IntVar NewIntVar(const Domain &domain)
Creates an integer variable with the given domain.
void add_transition_label(::PROTOBUF_NAMESPACE_ID::int64 value)
Constraint AddMinEquality(IntVar target, absl::Span< const IntVar > vars)
Adds target == min(vars).
int constraints_size() const
A dedicated container for linear expressions.
Constraint OnlyEnforceIf(absl::Span< const BoolVar > literals)
The constraint will be enforced iff all literals listed here are true.
#define CHECK_EQ(val1, val2)
static LinearExpr Sum(absl::Span< const IntVar > vars)
Constructs the sum of a list of variables.
void AddAssumptions(absl::Span< const BoolVar > literals)
Adds multiple literals to the model as assumptions.
Constraint(ConstraintProto *proto)
Constraint AddBoolAnd(absl::Span< const BoolVar > literals)
Adds the constraint that all literals must be true.
bool has_objective() const
::operations_research::sat::DecisionStrategyProto * add_search_strategy()
::operations_research::sat::ConstraintProto * mutable_constraints(int index)
void AddOptionalEvent(IntVar time, int64_t demand, BoolVar is_active)
Adds a optional event.
CpModelProto const * model_proto
void AddArc(int tail, int head, BoolVar literal)
Add an arc to the circuit.
static LinearExpr BooleanScalProd(absl::Span< const BoolVar > vars, absl::Span< const int64_t > coeffs)
Constructs the scalar product of Booleans and coefficients.
void ClearHints()
Remove all hints.
void ScaleObjectiveBy(double scaling)
Sets scaling of the objective.
void add_x_intervals(::PROTOBUF_NAMESPACE_ID::int32 value)
void add_values(::PROTOBUF_NAMESPACE_ID::int64 value)
void set_name(ArgT0 &&arg0, ArgT... args)
We call domain any subset of Int64 = [kint64min, kint64max].
PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final
Constraint AddLinMinEquality(const LinearExpr &target, absl::Span< const LinearExpr > exprs)
Adds target == min(exprs).
Specialized automaton constraint.
::PROTOBUF_NAMESPACE_ID::int64 solution(int index) const
void add_tails(::PROTOBUF_NAMESPACE_ID::int32 value)
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.
BoolVar WithName(const std::string &name)
Sets the name of the variable.
std::string DebugString() const
Debug string.
Constraint AddLessThan(const LinearExpr &left, const LinearExpr &right)
Adds left < right.
IntVar WithName(const std::string &name)
Sets the name of the variable.
BoolVar NewBoolVar()
Creates a Boolean variable.
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(::PROTOBUF_NAMESPACE_ID::int32 value)
Constraint WithName(const std::string &name)
Sets the name of the constraint.
Specialized circuit constraint.
void set_offset(::PROTOBUF_NAMESPACE_ID::int64 value)
std::string DebugString() const
Returns a debug string.
void AddRectangle(IntervalVar x_coordinate, IntervalVar y_coordinate)
Adds a rectangle (parallel to the axis) to the constraint.
NoOverlap2DConstraint AddNoOverlap2D()
The no_overlap_2d constraint prevents a set of boxes from overlapping.
int64_t Value() const
Checks that the expression is constant and returns its value.
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()
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)
void add_coeffs(::PROTOBUF_NAMESPACE_ID::int64 value)
LinearExpr SizeExpr() const
Returns the size linear expression.
void set_scaling_factor(double value)
std::ostream & operator<<(std::ostream &os, const BoolVar &var)
Constraint AddLessOrEqual(const LinearExpr &left, const LinearExpr &right)
Adds left <= right.
::operations_research::sat::ReservoirConstraintProto * mutable_reservoir()
void add_vars(::PROTOBUF_NAMESPACE_ID::int32 value)
::PROTOBUF_NAMESPACE_ID::int64 domain(int index) const
CumulativeConstraint AddCumulative(IntVar capacity)
The cumulative constraint.
friend class CumulativeConstraint
std::string Name() const
Returns the name of the interval (or the empty string if not set).
Constraint AddLinearConstraint(const LinearExpr &expr, const Domain &domain)
Adds expr in domain.
const IntervalConstraintProto & Proto() const
Returns the underlying protobuf object (useful for testing).
void add_heads(::PROTOBUF_NAMESPACE_ID::int32 value)
double scaling_factor() const
Wrapper class around the cp_model proto.
const std::vector< IntVar > & variables() const
Returns the vector of variables.
::operations_research::sat::IntegerVariableProto * mutable_variables(int index)
Constraint AddDivisionEquality(IntVar target, IntVar numerator, IntVar denominator)
Adds target = num / denom (integer division rounded towards 0).
Represents a Interval variable.
static LinearExpr BooleanSum(absl::Span< const BoolVar > vars)
Constructs the sum of a list of Booleans.
void add_values(::PROTOBUF_NAMESPACE_ID::int64 value)
void CopyFrom(const CpModelProto &model_proto)
Replace the current model with the one from the given proto.
int solution_size() const
const IntegerVariableProto & Proto() const
Returns the underlying protobuf object (useful for testing).
void add_demands(::PROTOBUF_NAMESPACE_ID::int64 value)