19 #include "absl/strings/str_format.h"
32 : cp_model_(cp_model), index_(
index) {}
35 cp_model_->mutable_variables(index_)->set_name(
name);
44 const IntegerVariableProto& var_proto = cp_model_->variables(index_);
46 if (var_proto.name().empty() && var_proto.domain_size() == 2 &&
47 var_proto.domain(0) == var_proto.domain(1)) {
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());
55 if (var_proto.domain(0) == var_proto.domain(1)) {
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) {
81 cp_model_->mutable_variables(index_)->set_name(
name);
86 cp_model_ =
var.cp_model_;
95 var.cp_model_ = cp_model_;
106 return absl::StrFormat(
"Not(%s)",
109 const IntegerVariableProto& var_proto = cp_model_->variables(index_);
111 if (var_proto.name().empty() && var_proto.domain_size() == 2 &&
112 var_proto.domain(0) == var_proto.domain(1)) {
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(),
"(");
121 if (var_proto.domain_size() == 2 &&
122 var_proto.domain(0) == var_proto.domain(1)) {
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]);
198 variables_.push_back(
var);
199 coefficients_.push_back(coeff);
202 coefficients_.push_back(-coeff);
218 proto_->add_enforcement_literal(
var.index_);
242 for (
const int64_t t : tuple) {
243 proto_->mutable_table()->add_values(t);
247 ReservoirConstraint::ReservoirConstraint(ConstraintProto*
proto,
252 proto_->mutable_reservoir()->add_times(
253 builder_->GetOrCreateIntegerIndex(
time.index_));
255 proto_->mutable_reservoir()->add_actives(builder_->IndexFromConstant(1));
260 proto_->mutable_reservoir()->add_times(
261 builder_->GetOrCreateIntegerIndex(
time.index_));
263 proto_->mutable_reservoir()->add_actives(is_active.index_);
267 int64_t transition_label) {
268 proto_->mutable_automaton()->add_transition_tail(
tail);
269 proto_->mutable_automaton()->add_transition_head(
head);
270 proto_->mutable_automaton()->add_transition_label(transition_label);
275 proto_->mutable_no_overlap_2d()->add_x_intervals(x_coordinate.index_);
276 proto_->mutable_no_overlap_2d()->add_y_intervals(y_coordinate.index_);
279 CumulativeConstraint::CumulativeConstraint(ConstraintProto*
proto,
285 proto_->mutable_cumulative()->add_demands(
286 builder_->GetOrCreateIntegerIndex(
demand.index_));
292 : cp_model_(cp_model), index_(
index) {}
295 cp_model_->mutable_constraints(index_)->set_name(
name);
310 return BoolVar(cp_model_->constraints(index_).enforcement_literal(0),
315 return cp_model_->constraints(index_).name();
320 const ConstraintProto& ct_proto = cp_model_->constraints(index_);
322 if (ct_proto.name().empty()) {
323 absl::StrAppend(&output,
"IntervalVar", index_,
"(");
325 absl::StrAppend(&output, ct_proto.name(),
"(");
338 int CpModelBuilder::IndexFromConstant(int64_t
value) {
340 const int index = cp_model_.variables_size();
341 IntegerVariableProto*
const var_proto = cp_model_.add_variables();
342 var_proto->add_domain(
value);
343 var_proto->add_domain(
value);
346 return constant_to_index_map_[
value];
349 int CpModelBuilder::GetOrCreateIntegerIndex(
int index) {
355 const IntegerVariableProto& old_var = cp_model_.variables(
var);
356 const int new_index = cp_model_.variables_size();
357 IntegerVariableProto*
const new_var = cp_model_.add_variables();
358 new_var->add_domain(0);
359 new_var->add_domain(1);
360 if (!old_var.name().empty()) {
361 new_var->set_name(absl::StrCat(
"Not(", old_var.name(),
")"));
364 bool_to_integer_index_map_[
index] = new_index;
367 return bool_to_integer_index_map_[
index];
371 const int index = cp_model_.variables_size();
372 IntegerVariableProto*
const var_proto = cp_model_.add_variables();
373 for (
const auto&
interval : domain) {
374 var_proto->add_domain(
interval.start);
375 var_proto->add_domain(
interval.end);
381 const int index = cp_model_.variables_size();
382 IntegerVariableProto*
const var_proto = cp_model_.add_variables();
383 var_proto->add_domain(0);
384 var_proto->add_domain(1);
389 return IntVar(IndexFromConstant(
value), &cp_model_);
393 return BoolVar(IndexFromConstant(1), &cp_model_);
397 return BoolVar(IndexFromConstant(0), &cp_model_);
408 const int index = cp_model_.constraints_size();
409 ConstraintProto*
const ct = cp_model_.add_constraints();
410 ct->add_enforcement_literal(presence.index_);
411 IntervalConstraintProto*
const interval =
ct->mutable_interval();
412 interval->set_start(GetOrCreateIntegerIndex(start.index_));
413 interval->set_size(GetOrCreateIntegerIndex(size.index_));
414 interval->set_end(GetOrCreateIntegerIndex(end.index_));
419 ConstraintProto*
const proto = cp_model_.add_constraints();
420 for (
const BoolVar& lit : literals) {
421 proto->mutable_bool_or()->add_literals(lit.index_);
427 ConstraintProto*
const proto = cp_model_.add_constraints();
428 for (
const BoolVar& lit : literals) {
429 proto->mutable_bool_and()->add_literals(lit.index_);
435 ConstraintProto*
const proto = cp_model_.add_constraints();
436 for (
const BoolVar& lit : literals) {
437 proto->mutable_bool_xor()->add_literals(lit.index_);
442 void CpModelBuilder::FillLinearTerms(
const LinearExpr& left,
444 LinearConstraintProto*
proto) {
446 proto->add_vars(x.index_);
449 proto->add_coeffs(coeff);
451 for (
const IntVar& x : right.
variables()) {
452 proto->add_vars(x.index_);
455 proto->add_coeffs(-coeff);
461 ConstraintProto*
const proto = cp_model_.add_constraints();
462 FillLinearTerms(left, right,
proto->mutable_linear());
464 proto->mutable_linear()->add_domain(rhs);
465 proto->mutable_linear()->add_domain(rhs);
471 ConstraintProto*
const proto = cp_model_.add_constraints();
472 FillLinearTerms(left, right,
proto->mutable_linear());
474 proto->mutable_linear()->add_domain(rhs);
481 ConstraintProto*
const proto = cp_model_.add_constraints();
482 FillLinearTerms(left, right,
proto->mutable_linear());
485 proto->mutable_linear()->add_domain(rhs);
491 ConstraintProto*
const proto = cp_model_.add_constraints();
492 FillLinearTerms(left, right,
proto->mutable_linear());
494 proto->mutable_linear()->add_domain(rhs + 1);
501 ConstraintProto*
const proto = cp_model_.add_constraints();
502 FillLinearTerms(left, right,
proto->mutable_linear());
505 proto->mutable_linear()->add_domain(rhs - 1);
511 ConstraintProto*
const proto = cp_model_.add_constraints();
513 proto->mutable_linear()->add_vars(x.index_);
516 proto->mutable_linear()->add_coeffs(coeff);
518 const int64_t cst = expr.
constant();
519 for (
const auto& i : domain) {
520 proto->mutable_linear()->add_domain(i.start - cst);
521 proto->mutable_linear()->add_domain(i.end - cst);
528 ConstraintProto*
const proto = cp_model_.add_constraints();
529 FillLinearTerms(left, right,
proto->mutable_linear());
532 proto->mutable_linear()->add_domain(rhs - 1);
533 proto->mutable_linear()->add_domain(rhs + 1);
539 ConstraintProto*
const proto = cp_model_.add_constraints();
541 proto->mutable_all_diff()->add_vars(GetOrCreateIntegerIndex(
var.index_));
548 ConstraintProto*
const proto = cp_model_.add_constraints();
549 proto->mutable_element()->set_index(GetOrCreateIntegerIndex(
index.index_));
550 proto->mutable_element()->set_target(GetOrCreateIntegerIndex(target.index_));
552 proto->mutable_element()->add_vars(GetOrCreateIntegerIndex(
var.index_));
558 absl::Span<const int64_t> values,
560 ConstraintProto*
const proto = cp_model_.add_constraints();
561 proto->mutable_element()->set_index(GetOrCreateIntegerIndex(
index.index_));
562 proto->mutable_element()->set_target(GetOrCreateIntegerIndex(target.index_));
563 for (int64_t
value : values) {
564 proto->mutable_element()->add_vars(IndexFromConstant(
value));
578 absl::Span<const IntVar> vars) {
579 ConstraintProto*
const proto = cp_model_.add_constraints();
581 proto->mutable_table()->add_vars(GetOrCreateIntegerIndex(
var.index_));
587 absl::Span<const IntVar> vars) {
588 ConstraintProto*
const proto = cp_model_.add_constraints();
590 proto->mutable_table()->add_vars(GetOrCreateIntegerIndex(
var.index_));
592 proto->mutable_table()->set_negated(
true);
597 absl::Span<const IntVar> variables,
598 absl::Span<const IntVar> inverse_variables) {
599 ConstraintProto*
const proto = cp_model_.add_constraints();
601 proto->mutable_inverse()->add_f_direct(GetOrCreateIntegerIndex(
var.index_));
603 for (
const IntVar&
var : inverse_variables) {
604 proto->mutable_inverse()->add_f_inverse(
605 GetOrCreateIntegerIndex(
var.index_));
612 ConstraintProto*
const proto = cp_model_.add_constraints();
613 proto->mutable_reservoir()->set_min_level(min_level);
614 proto->mutable_reservoir()->set_max_level(max_level);
619 absl::Span<const IntVar> transition_variables,
int starting_state,
620 absl::Span<const int> final_states) {
621 ConstraintProto*
const proto = cp_model_.add_constraints();
622 for (
const IntVar&
var : transition_variables) {
623 proto->mutable_automaton()->add_vars(GetOrCreateIntegerIndex(
var.index_));
625 proto->mutable_automaton()->set_starting_state(starting_state);
626 for (
const int final_state : final_states) {
627 proto->mutable_automaton()->add_final_states(final_state);
633 absl::Span<const IntVar> vars) {
634 ConstraintProto*
const proto = cp_model_.add_constraints();
635 proto->mutable_int_min()->set_target(GetOrCreateIntegerIndex(target.index_));
637 proto->mutable_int_min()->add_vars(GetOrCreateIntegerIndex(
var.index_));
642 void CpModelBuilder::LinearExprToProto(
const LinearExpr& expr,
643 LinearExpressionProto* expr_proto) {
645 expr_proto->add_vars(GetOrCreateIntegerIndex(
var.index_));
648 expr_proto->add_coeffs(coeff);
650 expr_proto->set_offset(expr.
constant());
654 const LinearExpr& target, absl::Span<const LinearExpr> exprs) {
655 ConstraintProto*
const proto = cp_model_.add_constraints();
656 LinearExprToProto(target,
proto->mutable_lin_min()->mutable_target());
658 LinearExpressionProto* expr_proto =
proto->mutable_lin_min()->add_exprs();
659 LinearExprToProto(expr, expr_proto);
665 absl::Span<const IntVar> vars) {
666 ConstraintProto*
const proto = cp_model_.add_constraints();
667 proto->mutable_int_max()->set_target(GetOrCreateIntegerIndex(target.index_));
669 proto->mutable_int_max()->add_vars(GetOrCreateIntegerIndex(
var.index_));
675 const LinearExpr& target, absl::Span<const LinearExpr> exprs) {
676 ConstraintProto*
const proto = cp_model_.add_constraints();
677 LinearExprToProto(target,
proto->mutable_lin_max()->mutable_target());
679 LinearExpressionProto* expr_proto =
proto->mutable_lin_max()->add_exprs();
680 LinearExprToProto(expr, expr_proto);
687 ConstraintProto*
const proto = cp_model_.add_constraints();
688 proto->mutable_int_div()->set_target(GetOrCreateIntegerIndex(target.index_));
689 proto->mutable_int_div()->add_vars(GetOrCreateIntegerIndex(numerator.index_));
690 proto->mutable_int_div()->add_vars(
691 GetOrCreateIntegerIndex(denominator.index_));
696 ConstraintProto*
const proto = cp_model_.add_constraints();
697 proto->mutable_int_max()->set_target(GetOrCreateIntegerIndex(target.index_));
698 proto->mutable_int_max()->add_vars(GetOrCreateIntegerIndex(
var.index_));
699 proto->mutable_int_max()->add_vars(
706 ConstraintProto*
const proto = cp_model_.add_constraints();
707 proto->mutable_int_mod()->set_target(GetOrCreateIntegerIndex(target.index_));
708 proto->mutable_int_mod()->add_vars(GetOrCreateIntegerIndex(
var.index_));
709 proto->mutable_int_mod()->add_vars(GetOrCreateIntegerIndex(mod.index_));
714 absl::Span<const IntVar> vars) {
715 ConstraintProto*
const proto = cp_model_.add_constraints();
716 proto->mutable_int_prod()->set_target(GetOrCreateIntegerIndex(target.index_));
718 proto->mutable_int_prod()->add_vars(GetOrCreateIntegerIndex(
var.index_));
724 ConstraintProto*
const proto = cp_model_.add_constraints();
726 proto->mutable_no_overlap()->add_intervals(
727 GetOrCreateIntegerIndex(
var.index_));
737 ConstraintProto*
const proto = cp_model_.add_constraints();
738 proto->mutable_cumulative()->set_capacity(
739 GetOrCreateIntegerIndex(
capacity.index_));
744 cp_model_.mutable_objective()->Clear();
746 cp_model_.mutable_objective()->add_vars(x.index_);
749 cp_model_.mutable_objective()->add_coeffs(coeff);
751 cp_model_.mutable_objective()->set_offset(expr.
constant());
755 cp_model_.mutable_objective()->Clear();
757 cp_model_.mutable_objective()->add_vars(x.index_);
760 cp_model_.mutable_objective()->add_coeffs(-coeff);
762 cp_model_.mutable_objective()->set_offset(-expr.
constant());
763 cp_model_.mutable_objective()->set_scaling_factor(-1.0);
767 CHECK(cp_model_.has_objective());
768 cp_model_.mutable_objective()->set_scaling_factor(
769 scaling * cp_model_.objective().scaling_factor());
773 absl::Span<const IntVar> variables,
774 DecisionStrategyProto::VariableSelectionStrategy var_strategy,
775 DecisionStrategyProto::DomainReductionStrategy domain_strategy) {
776 DecisionStrategyProto*
const proto = cp_model_.add_search_strategy();
780 proto->set_variable_selection_strategy(var_strategy);
781 proto->set_domain_reduction_strategy(domain_strategy);
785 absl::Span<const BoolVar> variables,
786 DecisionStrategyProto::VariableSelectionStrategy var_strategy,
787 DecisionStrategyProto::DomainReductionStrategy domain_strategy) {
788 DecisionStrategyProto*
const proto = cp_model_.add_search_strategy();
792 proto->set_variable_selection_strategy(var_strategy);
793 proto->set_domain_reduction_strategy(domain_strategy);
797 cp_model_.mutable_solution_hint()->add_vars(
798 GetOrCreateIntegerIndex(
var.index_));
799 cp_model_.mutable_solution_hint()->add_values(
value);
803 cp_model_.mutable_solution_hint()->Clear();
807 cp_model_.mutable_assumptions()->Add(lit.index_);
811 for (
const BoolVar& lit : literals) {
812 cp_model_.mutable_assumptions()->Add(lit.index_);
817 cp_model_.mutable_assumptions()->Clear();
823 constant_to_index_map_.clear();
824 for (
int i = 0; i < cp_model_.variables_size(); ++i) {
825 const IntegerVariableProto&
var = cp_model_.variables(i);
826 if (
var.domain_size() == 2 &&
var.domain(0) ==
var.domain(1)) {
827 constant_to_index_map_[
var.domain(0)] = i;
831 bool_to_integer_index_map_.clear();
837 const IntegerVariableProto&
proto = cp_model_.variables(
index);
839 <<
"CpModelBuilder::GetBoolVarFromProtoIndex: The domain of the variable "
842 <<
"CpModelBuilder::GetBoolVarFromProtoIndex: The domain of the variable "
845 <<
"CpModelBuilder::GetBoolVarFromProtoIndex: The domain of the variable "
859 const ConstraintProto&
ct = cp_model_.constraints(
index);
860 CHECK_EQ(
ct.constraint_case(), ConstraintProto::kInterval)
861 <<
"CpModelBuilder::GetIntervalVarFromProtoIndex: the referenced "
862 "object is not an interval variable";
869 for (
int i = 0; i < expr.
variables().size(); ++i) {
876 if (r.solution_size() > 0) {
877 return r.solution(x.index_);
879 return r.solution_lower_bounds(x.index_);
884 if (r.solution_size() > 0) {
885 return r.solution(x.index_);
887 return r.solution_upper_bounds(x.index_);
892 const int ref = x.index_;
894 return r.solution(ref) == 1;
#define CHECK_LT(val1, val2)
#define CHECK_EQ(val1, val2)
#define CHECK_GE(val1, val2)
#define CHECK_LE(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.
BoolVar WithName(const std::string &name)
Sets the name of the variable.
std::string DebugString() const
Debug string.
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.
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)
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 AddLinearConstraint(const LinearExpr &expr, const Domain &domain)
Adds expr in domain.
void ClearAssumptions()
Remove all assumptions from the model.
Constraint AddAbsEquality(IntVar target, IntVar var)
Adds target == abs(var).
void AddAssumptions(absl::Span< const BoolVar > literals)
Adds multiple literals to the model as assumptions.
MultipleCircuitConstraint AddMultipleCircuitConstraint()
Adds a multiple circuit constraint, aka the "VRP" (Vehicle Routing Problem) constraint.
Constraint AddMinEquality(IntVar target, absl::Span< const IntVar > vars)
Adds target == min(vars).
BoolVar TrueVar()
Creates an always true Boolean variable.
IntVar NewIntVar(const Domain &domain)
Creates an integer variable with the given domain.
Constraint AddMaxEquality(IntVar target, absl::Span< const IntVar > vars)
Adds target == max(vars).
Constraint AddDivisionEquality(IntVar target, IntVar numerator, IntVar denominator)
Adds target = num / denom (integer division rounded towards 0).
void ClearHints()
Remove all hints.
void Maximize(const LinearExpr &expr)
Adds a linear maximization objective.
IntervalVar NewOptionalIntervalVar(IntVar start, IntVar size, IntVar end, BoolVar presence)
Creates an optional interval variable.
BoolVar NewBoolVar()
Creates a Boolean variable.
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.
void ScaleObjectiveBy(double scaling)
Sets scaling of the objective.
CircuitConstraint AddCircuitConstraint()
Adds a circuit constraint.
Constraint AddVariableElement(IntVar index, absl::Span< const IntVar > variables, IntVar target)
Adds the element constraint: variables[index] == target.
CumulativeConstraint AddCumulative(IntVar capacity)
The cumulative constraint.
Constraint AddGreaterThan(const LinearExpr &left, const LinearExpr &right)
Adds left > right.
void CopyFrom(const CpModelProto &model_proto)
Replace 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 a odd number of literal is true.
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.
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.
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 AddModuloEquality(IntVar target, IntVar var, IntVar mod)
Adds target = var % mod.
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/.
Constraint AddLinMinEquality(const LinearExpr &target, absl::Span< const LinearExpr > exprs)
Adds target == min(exprs).
Constraint AddProductEquality(IntVar target, absl::Span< const IntVar > vars)
Adds target == prod(vars).
Constraint AddLinMaxEquality(const LinearExpr &target, absl::Span< const LinearExpr > exprs)
Adds target == max(exprs).
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 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.
Constraint AddInverseConstraint(absl::Span< const IntVar > variables, absl::Span< const IntVar > inverse_variables)
An inverse constraint.
IntervalVar NewIntervalVar(IntVar start, IntVar size, IntVar end)
Creates an interval variable.
Constraint AddNoOverlap(absl::Span< const IntervalVar > vars)
Adds a no-overlap constraint that ensures that all present intervals do not overlap in time.
Specialized cumulative constraint.
void AddDemand(IntervalVar interval, IntVar demand)
Adds a pair (interval, demand) to the constraint.
BoolVar ToBoolVar() const
Cast IntVar -> BoolVar.
std::string DebugString() const
Returns a debug string.
IntVar WithName(const std::string &name)
Sets the name of the variable.
int index() const
Returns the index of the variable in the model.
LinearExpr AddConstant(int64_t value) const
Adds a constant value to an integer variable and returns a linear expression.
const IntegerVariableProto & Proto() const
Returns the underlying protobuf object (useful for testing).
Represents a Interval variable.
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).
IntVar SizeVar() const
Returns the size variable.
std::string DebugString() const
Returns a debug string.
IntervalVar WithName(const std::string &name)
Sets the name of the variable.
IntVar EndVar() const
Returns the end variable.
const IntervalConstraintProto & Proto() const
Returns the underlying protobuf object (useful for testing).
IntervalVar()
Default ctor.
IntVar StartVar() const
Returns the start variable.
A dedicated container for linear expressions.
static LinearExpr Sum(absl::Span< const IntVar > vars)
Constructs the sum of a list of variables.
static LinearExpr BooleanSum(absl::Span< const BoolVar > vars)
Constructs the sum of a list of Booleans.
void AddTerm(IntVar var, int64_t coeff)
Adds a term (var * coeff) to the linear expression.
int64_t constant() const
Returns the constant term.
const std::vector< IntVar > & variables() const
Returns the vector of variables.
static LinearExpr BooleanScalProd(absl::Span< const BoolVar > vars, absl::Span< const int64_t > coeffs)
Constructs the scalar product of Booleans and coefficients.
void AddVar(IntVar var)
Adds a single integer variable to the linear expression.
static LinearExpr ScalProd(absl::Span< const IntVar > vars, absl::Span< const int64_t > coeffs)
Constructs the scalar product of variables and coefficients.
LinearExpr & AddConstant(int64_t value)
Adds a constant value to the linear expression.
const std::vector< int64_t > & coefficients() const
Returns the vector of coefficients.
static LinearExpr Term(IntVar var, int64_t coefficient)
Construncts var * coefficient.
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.
Specialized reservoir constraint.
void AddEvent(IntVar time, int64_t demand)
Adds a mandatory event.
void AddOptionalEvent(IntVar time, int64_t demand, BoolVar is_active)
Adds a optional event.
Specialized assignment constraint.
void AddTuple(absl::Span< const int64_t > tuple)
Adds a tuple of possible values to the constraint.
This file implements a wrapper around the CP-SAT model proto.
CpModelProto const * model_proto
bool ContainsKey(const Collection &collection, const Key &key)
std::ostream & operator<<(std::ostream &os, const BoolVar &var)
bool RefIsPositive(int ref)
int64_t SolutionIntegerMax(const CpSolverResponse &r, IntVar x)
Returns the max of an integer variable in a solution.
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.
int64_t SolutionIntegerValue(const CpSolverResponse &r, const LinearExpr &expr)
Evaluates the value of an linear expression in a solver response.
int64_t SolutionIntegerMin(const CpSolverResponse &r, IntVar x)
Returns the min of an integer variable in a solution.
Collection of objects used to extend the Constraint Solver library.