17#include <initializer_list>
23#include "absl/container/flat_hash_map.h"
24#include "absl/log/check.h"
25#include "absl/strings/str_cat.h"
26#include "absl/strings/str_format.h"
27#include "absl/strings/string_view.h"
28#include "absl/types/span.h"
37 : builder_(builder), index_(index) {}
40 DCHECK(builder_ !=
nullptr);
41 if (builder_ ==
nullptr)
return *
this;
42 builder_->MutableProto()
49 if (builder_ ==
nullptr)
return "null";
50 absl::string_view name =
51 builder_->Proto().variables(
PositiveRef(index_)).name();
53 return std::string(name);
55 return absl::StrCat(
"Not(", name,
")");
60 if (builder_ ==
nullptr)
return "null";
69 output.append(var_proto.
domain(0) == 0 ?
"false" :
"true");
71 if (var_proto.
name().empty()) {
72 absl::StrAppendFormat(&output,
"BoolVar%i(", index_);
74 absl::StrAppendFormat(&output,
"%s(", var_proto.
name());
77 output.append(var_proto.
domain(0) == 0 ?
"false)" :
"true)");
79 absl::StrAppend(&output, var_proto.
domain(0),
", ", var_proto.
domain(1),
95 : builder_(builder), index_(index) {
100 if (var.builder_ ==
nullptr) {
104 builder_ = var.builder_;
105 index_ = builder_->GetOrCreateIntegerIndex(var.index_);
110 if (builder_ !=
nullptr) {
113 DCHECK_GE(proto.
domain(0), 0);
114 DCHECK_LE(proto.
domain(1), 1);
116 return BoolVar(index_, builder_);
120 DCHECK(builder_ !=
nullptr);
121 if (builder_ ==
nullptr)
return *
this;
122 builder_->MutableProto()->mutable_variables(index_)->set_name(
name);
127 if (builder_ ==
nullptr)
return "null";
128 return builder_->Proto().variables(index_).name();
132 if (builder_ ==
nullptr)
return Domain();
137 if (builder_ ==
nullptr)
return "null";
150 absl::StrAppend(&output, var_proto.
domain(0));
152 if (var_proto.
name().empty()) {
153 absl::StrAppend(&output,
"V", index,
"(");
155 absl::StrAppend(&output, var_proto.
name(),
"(");
161 absl::StrAppend(&output, var_proto.
domain(0),
")");
163 absl::StrAppend(&output, var_proto.
domain(0),
", ", var_proto.
domain(1),
177 DCHECK(var.builder_ !=
nullptr);
178 const int index = var.index_;
180 variables_.push_back(index);
181 coefficients_.push_back(1);
185 coefficients_.push_back(-1);
191 DCHECK(var.builder_ !=
nullptr);
192 variables_.push_back(var.index_);
193 coefficients_.push_back(1);
201 result.variables_.push_back(expr_proto.
vars(
i));
202 result.coefficients_.push_back(expr_proto.
coeffs(
i));
209 for (
const IntVar& var : vars) {
217 for (
const BoolVar& var : vars) {
224 absl::Span<const int64_t> coeffs) {
225 CHECK_EQ(vars.size(), coeffs.size());
227 for (
int i = 0;
i < vars.size(); ++
i) {
228 result += vars[
i] * coeffs[
i];
234 absl::Span<const int64_t> coeffs) {
235 CHECK_EQ(vars.size(), coeffs.size());
237 for (
int i = 0;
i < vars.size(); ++
i) {
238 result += vars[
i] * coeffs[
i];
245 result += var * coefficient;
251 result += var * coefficient;
256 constant_ += other.constant_;
257 variables_.insert(variables_.end(), other.variables_.begin(),
258 other.variables_.end());
259 coefficients_.insert(coefficients_.end(), other.coefficients_.begin(),
260 other.coefficients_.end());
265 constant_ -= other.constant_;
266 variables_.insert(variables_.end(), other.variables_.begin(),
267 other.variables_.end());
268 for (
const int64_t coeff : other.coefficients_) {
269 coefficients_.push_back(-coeff);
276 for (int64_t& coeff : coefficients_) coeff *= factor;
282 for (
int i = 0;
i < variables_.size(); ++
i) {
283 const int64_t coeff = coefficients_[
i];
284 const std::string var_string = proto ==
nullptr
285 ? absl::StrCat(
"V", variables_[
i])
289 absl::StrAppend(&result, var_string);
290 }
else if (coeff == -1) {
291 absl::StrAppend(&result,
"-", var_string);
292 }
else if (coeff != 0) {
293 absl::StrAppend(&result, coeff,
" * ", var_string);
295 }
else if (coeff == 1) {
296 absl::StrAppend(&result,
" + ", var_string);
297 }
else if (coeff > 0) {
298 absl::StrAppend(&result,
" + ", coeff,
" * ", var_string);
299 }
else if (coeff == -1) {
300 absl::StrAppend(&result,
" - ", var_string);
301 }
else if (coeff < 0) {
302 absl::StrAppend(&result,
" - ", -coeff,
" * ", var_string);
306 if (constant_ != 0) {
307 if (variables_.empty()) {
308 return absl::StrCat(constant_);
309 }
else if (constant_ > 0) {
310 absl::StrAppend(&result,
" + ", constant_);
312 absl::StrAppend(&result,
" - ", -constant_);
323DoubleLinearExpr::DoubleLinearExpr() =
default;
333 for (
const IntVar& var : vars) {
341 for (
const BoolVar& var : vars) {
348 absl::Span<const IntVar> vars, absl::Span<const double> coeffs) {
349 CHECK_EQ(vars.size(), coeffs.size());
351 for (
int i = 0;
i < vars.size(); ++
i) {
358 absl::Span<const BoolVar> vars, absl::Span<const double> coeffs) {
359 CHECK_EQ(vars.size(), coeffs.size());
361 for (
int i = 0;
i < vars.size(); ++
i) {
383 constant_ += expr.constant_;
384 variables_.insert(variables_.end(), expr.variables_.begin(),
385 expr.variables_.end());
386 coefficients_.insert(coefficients_.end(), expr.coefficients_.begin(),
387 expr.coefficients_.end());
392 variables_.push_back(var.index_);
393 coefficients_.push_back(coeff);
398 const int index = var.index_;
400 variables_.push_back(index);
401 coefficients_.push_back(coeff);
404 coefficients_.push_back(-coeff);
412 const std::vector<int>& indices = expr.
variables();
414 for (
int i = 0;
i < indices.size(); ++
i) {
415 variables_.push_back(indices[
i]);
416 coefficients_.push_back(1.0 *
static_cast<double>(
coefficients[
i]) * coeff);
433 constant_ -= expr.constant_;
434 variables_.insert(variables_.end(), expr.variables_.begin(),
435 expr.variables_.end());
437 coefficients_.push_back(-coeff);
444 for (
double& c : coefficients_) {
452 for (
int i = 0;
i < variables_.size(); ++
i) {
453 const double coeff = coefficients_[
i];
454 const std::string var_string = proto ==
nullptr
455 ? absl::StrCat(
"V", variables_[
i])
459 absl::StrAppend(&result, var_string);
460 }
else if (coeff == -1.0) {
461 absl::StrAppend(&result,
"-", var_string);
462 }
else if (coeff != 0.0) {
463 absl::StrAppend(&result, coeff,
" * ", var_string);
465 }
else if (coeff == 1.0) {
466 absl::StrAppend(&result,
" + ", var_string);
467 }
else if (coeff > 0.0) {
468 absl::StrAppend(&result,
" + ", coeff,
" * ", var_string);
469 }
else if (coeff == -1.0) {
470 absl::StrAppend(&result,
" - ", var_string);
471 }
else if (coeff < 0.0) {
472 absl::StrAppend(&result,
" - ", -coeff,
" * ", var_string);
476 if (constant_ != 0.0) {
477 if (variables_.empty()) {
478 return absl::StrCat(constant_);
479 }
else if (constant_ > 0.0) {
480 absl::StrAppend(&result,
" + ", constant_);
482 absl::StrAppend(&result,
" - ", -constant_);
503 for (
const BoolVar& var : literals) {
504 proto_->add_enforcement_literal(var.index_);
510 proto_->add_enforcement_literal(literal.index_);
515 proto_->mutable_circuit()->add_tails(tail);
516 proto_->mutable_circuit()->add_heads(head);
517 proto_->mutable_circuit()->add_literals(literal.index_);
521 proto_->mutable_routes()->add_tails(tail);
522 proto_->mutable_routes()->add_heads(head);
523 proto_->mutable_routes()->add_literals(literal.index_);
527 CHECK_EQ(tuple.size(),
proto_->table().exprs_size());
528 for (
const int64_t t : tuple) {
529 proto_->mutable_table()->add_values(t);
538 *
proto_->mutable_reservoir()->add_time_exprs() =
539 builder_->LinearExprToProto(time);
540 proto_->mutable_reservoir()->add_level_changes()->set_offset(level_change);
541 proto_->mutable_reservoir()->add_active_literals(
542 builder_->IndexFromConstant(1));
546 int64_t level_change,
548 *
proto_->mutable_reservoir()->add_time_exprs() =
549 builder_->LinearExprToProto(time);
550 proto_->mutable_reservoir()->add_level_changes()->set_offset(level_change);
551 proto_->mutable_reservoir()->add_active_literals(is_active.index_);
555 int64_t transition_label) {
556 proto_->mutable_automaton()->add_transition_tail(tail);
557 proto_->mutable_automaton()->add_transition_head(head);
558 proto_->mutable_automaton()->add_transition_label(transition_label);
563 proto_->mutable_no_overlap_2d()->add_x_intervals(x_coordinate.index_);
564 proto_->mutable_no_overlap_2d()->add_y_intervals(y_coordinate.index_);
572 proto_->mutable_cumulative()->add_intervals(interval.index_);
573 *
proto_->mutable_cumulative()->add_demands() =
574 builder_->LinearExprToProto(demand);
580 : builder_(builder), index_(index) {}
583 DCHECK(builder_ !=
nullptr);
584 if (builder_ ==
nullptr)
return *
this;
585 builder_->MutableProto()->mutable_constraints(index_)->set_name(name);
590 DCHECK(builder_ !=
nullptr);
593 builder_->Proto().constraints(index_).interval().start());
597 DCHECK(builder_ !=
nullptr);
600 builder_->Proto().constraints(index_).interval().size());
604 DCHECK(builder_ !=
nullptr);
607 builder_->Proto().constraints(index_).interval().end());
611 DCHECK(builder_ !=
nullptr);
612 if (builder_ ==
nullptr)
return BoolVar();
613 if (builder_->Proto().constraints(index_).enforcement_literal_size() == 0) {
614 return builder_->TrueVar();
616 return BoolVar(builder_->Proto().constraints(index_).enforcement_literal(0),
621 if (builder_ ==
nullptr)
return "null";
622 return builder_->Proto().constraints(index_).name();
626 if (builder_ ==
nullptr)
return "null";
632 if (ct_proto.
name().empty()) {
633 absl::StrAppend(&output,
"IntervalVar", index_,
"(");
635 absl::StrAppend(&output, ct_proto.
name(),
"(");
650 cp_model_.set_name(name);
653int CpModelBuilder::IndexFromConstant(int64_t value) {
654 if (!constant_to_index_map_.contains(value)) {
659 constant_to_index_map_[value] = index;
661 return constant_to_index_map_[value];
664int CpModelBuilder::GetOrCreateIntegerIndex(
int index) {
668 if (!bool_to_integer_index_map_.contains(index)) {
670 const IntegerVariableProto& old_var = cp_model_.variables(var);
671 const int new_index = cp_model_.variables_size();
672 IntegerVariableProto*
const new_var = cp_model_.add_variables();
673 new_var->add_domain(0);
674 new_var->add_domain(1);
675 if (!old_var.name().empty()) {
676 new_var->set_name(absl::StrCat(
"Not(", old_var.name(),
")"));
679 bool_to_integer_index_map_[index] = new_index;
682 return bool_to_integer_index_map_[index];
686 const int index = cp_model_.variables_size();
688 for (
const auto& interval : domain) {
692 return IntVar(index,
this);
696 const int index = cp_model_.variables_size();
704 return IntVar(IndexFromConstant(value),
this);
708 return BoolVar(IndexFromConstant(1),
this);
712 return BoolVar(IndexFromConstant(0),
this);
718 const int index = cp_model_.constraints_size();
729 const int index = cp_model_.constraints_size();
734 *interval->
mutable_end() = LinearExprToProto(start);
743 const int index = cp_model_.constraints_size();
755 const int index = cp_model_.constraints_size();
761 *interval->
mutable_end() = LinearExprToProto(start);
771 const int index = var.
index();
776 cp_model_.mutable_variables(
NegatedRef(index)));
793 for (
const BoolVar& lit : literals) {
808 for (
const BoolVar& lit : literals) {
816 for (
const BoolVar& lit : literals) {
822void CpModelBuilder::FillLinearTerms(
const LinearExpr& left,
898 const int64_t cst = expr.
constant();
899 for (
const auto&
i : domain) {
920 for (
const IntVar& var : vars) {
937 std::initializer_list<LinearExpr> exprs) {
950 LinearExprToProto(target);
951 for (
const IntVar& var : variables) {
958 absl::Span<const int64_t> values,
963 LinearExprToProto(target);
964 for (int64_t value : values) {
971 absl::Span<const LinearExpr> expressions,
976 LinearExprToProto(target);
984 LinearExpr index, std::initializer_list<LinearExpr> expressions,
989 LinearExprToProto(target);
1005 absl::Span<const LinearExpr> expressions) {
1014 absl::Span<const IntVar> variables) {
1016 for (
const IntVar var : variables) {
1025 std::initializer_list<LinearExpr> expressions) {
1034 absl::Span<const LinearExpr> expressions) {
1041 absl::Span<const IntVar> variables) {
1048 std::initializer_list<LinearExpr> expressions) {
1055 absl::Span<const IntVar> variables,
1056 absl::Span<const IntVar> inverse_variables) {
1058 for (
const IntVar& var : variables) {
1061 for (
const IntVar& var : inverse_variables) {
1068 int64_t max_level) {
1076 absl::Span<const LinearExpr> transition_expressions,
int starting_state,
1077 absl::Span<const int> final_states) {
1079 for (
const LinearExpr& expr : transition_expressions) {
1083 for (
const int final_state : final_states) {
1090 absl::Span<const IntVar> transition_variables,
int starting_state,
1091 absl::Span<const int> final_states) {
1093 for (
const IntVar& var : transition_variables) {
1099 for (
const int final_state : final_states) {
1106 std::initializer_list<LinearExpr> transition_expressions,
1107 int starting_state, absl::Span<const int> final_states) {
1109 for (
const LinearExpr& expr : transition_expressions) {
1113 for (
const int final_state : final_states) {
1122 for (
const int var : expr.
variables()) {
1125 const int64_t mult = negate ? -1 : 1;
1134 absl::Span<const IntVar> vars) {
1137 LinearExprToProto(target,
true);
1138 for (
const IntVar& var : vars) {
1140 LinearExprToProto(var,
true);
1146 absl::Span<const LinearExpr> exprs) {
1149 LinearExprToProto(target,
true);
1152 LinearExprToProto(expr,
true);
1158 const LinearExpr& target, std::initializer_list<LinearExpr> exprs) {
1161 LinearExprToProto(target,
true);
1164 LinearExprToProto(expr,
true);
1170 absl::Span<const IntVar> vars) {
1173 for (
const IntVar& var : vars) {
1180 absl::Span<const LinearExpr> exprs) {
1190 const LinearExpr& target, std::initializer_list<LinearExpr> exprs) {
1215 LinearExprToProto(expr,
true);
1230 const LinearExpr& target, absl::Span<const IntVar> vars) {
1233 for (
const IntVar& var : vars) {
1240 const LinearExpr& target, absl::Span<const LinearExpr> exprs) {
1250 const LinearExpr& target, std::initializer_list<LinearExpr> exprs) {
1284 LinearExprToProto(capacity);
1291 cp_model_.mutable_objective()->add_vars(x);
1294 cp_model_.mutable_objective()->add_coeffs(coeff);
1296 cp_model_.mutable_objective()->set_offset(expr.
constant());
1302 cp_model_.mutable_objective()->add_vars(x);
1305 cp_model_.mutable_objective()->add_coeffs(-coeff);
1307 cp_model_.mutable_objective()->set_offset(-expr.
constant());
1308 cp_model_.mutable_objective()->set_scaling_factor(-1.0);
1314 cp_model_.mutable_floating_point_objective()->add_vars(expr.
variables()[
i]);
1315 cp_model_.mutable_floating_point_objective()->add_coeffs(
1318 cp_model_.mutable_floating_point_objective()->set_offset(expr.
constant());
1319 cp_model_.mutable_floating_point_objective()->set_maximize(
false);
1325 cp_model_.mutable_floating_point_objective()->add_vars(expr.
variables()[
i]);
1326 cp_model_.mutable_floating_point_objective()->add_coeffs(
1329 cp_model_.mutable_floating_point_objective()->set_offset(expr.
constant());
1330 cp_model_.mutable_floating_point_objective()->set_maximize(
true);
1334 cp_model_.clear_objective();
1335 cp_model_.clear_floating_point_objective();
1339 return cp_model_.has_objective() || cp_model_.has_floating_point_objective();
1343 absl::Span<const IntVar> variables,
1347 for (
const IntVar& var : variables) {
1349 if (var.index_ >= 0) {
1363 absl::Span<const BoolVar> variables,
1367 for (
const BoolVar& var : variables) {
1369 if (var.index_ >= 0) {
1383 absl::Span<const LinearExpr> expressions,
1388 *proto->
add_exprs() = LinearExprToProto(expr);
1395 std::initializer_list<LinearExpr> expressions,
1400 *proto->
add_exprs() = LinearExprToProto(expr);
1407 cp_model_.mutable_solution_hint()->add_vars(var.index_);
1408 cp_model_.mutable_solution_hint()->add_values(value);
1412 if (var.index_ >= 0) {
1413 cp_model_.mutable_solution_hint()->add_vars(var.index_);
1414 cp_model_.mutable_solution_hint()->add_values(value);
1416 cp_model_.mutable_solution_hint()->add_vars(
PositiveRef(var.index_));
1417 cp_model_.mutable_solution_hint()->add_values(!value);
1422 cp_model_.mutable_solution_hint()->Clear();
1426 cp_model_.mutable_assumptions()->Add(lit.index_);
1430 for (
const BoolVar& lit : literals) {
1431 cp_model_.mutable_assumptions()->Add(lit.index_);
1436 cp_model_.mutable_assumptions()->Clear();
1441 clone.ResetAndImport(cp_model_);
1445void CpModelBuilder::ResetAndImport(
const CpModelProto& model_proto) {
1446 cp_model_ = model_proto;
1448 constant_to_index_map_.clear();
1452 constant_to_index_map_[var.
domain(0)] =
i;
1456 bool_to_integer_index_map_.clear();
1461 CHECK_LT(index, cp_model_.variables_size());
1464 <<
"CpModelBuilder::GetBoolVarFromProtoIndex: The domain of the variable "
1466 CHECK_GE(0, proto.
domain(0))
1467 <<
"CpModelBuilder::GetBoolVarFromProtoIndex: The domain of the variable "
1469 CHECK_LE(1, proto.
domain(1))
1470 <<
"CpModelBuilder::GetBoolVarFromProtoIndex: The domain of the variable "
1477 CHECK_LT(index, cp_model_.variables_size());
1478 return IntVar(index,
this);
1483 CHECK_LT(index, cp_model_.constraints_size());
1486 <<
"CpModelBuilder::GetIntervalVarFromProtoIndex: the referenced "
1487 "object is not an interval variable";
1498 const std::vector<int>& variables = expr.
variables();
1499 const std::vector<int64_t>& coefficients = expr.
coefficients();
1500 for (
int i = 0;
i < variables.size(); ++
i) {
1501 result += r.
solution(variables[
i]) * coefficients[
i];
1507 const int ref = x.index_;
virtual std::string DebugString() const
Constraint(Solver *const solver)
IntVar(Solver *s)
-------— IntVar -------—
LinearExpr & operator+=(const LinearExpr &rhs)
LinearExpr & operator-=(const LinearExpr &rhs)
LinearExpr & operator*=(double rhs)
virtual std::string name() const
Object naming.
::operations_research::sat::LinearExpressionProto *PROTOBUF_NONNULL add_exprs()
void add_final_states(::int64_t value)
::operations_research::sat::LinearExpressionProto *PROTOBUF_NONNULL add_exprs()
void set_starting_state(::int64_t value)
void AddTransition(int tail, int head, int64_t transition_label)
Adds a transitions to the automaton.
void add_literals(::int32_t value)
BoolVar WithName(absl::string_view name)
std::string Name() const
Returns the name of the variable.
BoolVar Not() const
Returns the logical negation of the current Boolean variable.
std::string DebugString() const
void AddArc(int tail, int head, BoolVar literal)
ConstraintCase constraint_case() const
::operations_research::sat::BoolArgumentProto *PROTOBUF_NONNULL mutable_bool_and()
::operations_research::sat::CumulativeConstraintProto *PROTOBUF_NONNULL mutable_cumulative()
::operations_research::sat::NoOverlapConstraintProto *PROTOBUF_NONNULL mutable_no_overlap()
::operations_research::sat::AllDifferentConstraintProto *PROTOBUF_NONNULL mutable_all_diff()
const ::std::string & name() const
::operations_research::sat::IntervalConstraintProto *PROTOBUF_NONNULL mutable_interval()
::operations_research::sat::ReservoirConstraintProto *PROTOBUF_NONNULL mutable_reservoir()
::operations_research::sat::BoolArgumentProto *PROTOBUF_NONNULL mutable_bool_xor()
::operations_research::sat::LinearArgumentProto *PROTOBUF_NONNULL mutable_int_div()
::operations_research::sat::LinearArgumentProto *PROTOBUF_NONNULL mutable_int_prod()
::operations_research::sat::BoolArgumentProto *PROTOBUF_NONNULL mutable_exactly_one()
::operations_research::sat::BoolArgumentProto *PROTOBUF_NONNULL mutable_bool_or()
void add_enforcement_literal(::int32_t value)
::operations_research::sat::LinearArgumentProto *PROTOBUF_NONNULL mutable_lin_max()
::operations_research::sat::LinearConstraintProto *PROTOBUF_NONNULL mutable_linear()
::operations_research::sat::ElementConstraintProto *PROTOBUF_NONNULL mutable_element()
::operations_research::sat::TableConstraintProto *PROTOBUF_NONNULL mutable_table()
::operations_research::sat::InverseConstraintProto *PROTOBUF_NONNULL mutable_inverse()
::operations_research::sat::LinearArgumentProto *PROTOBUF_NONNULL mutable_int_mod()
::operations_research::sat::BoolArgumentProto *PROTOBUF_NONNULL mutable_at_most_one()
::operations_research::sat::AutomatonConstraintProto *PROTOBUF_NONNULL mutable_automaton()
Constraint WithName(absl::string_view name)
Sets the name of the constraint.
Constraint OnlyEnforceIf(absl::Span< const BoolVar > literals)
Constraint(ConstraintProto *proto)
ConstraintProto * MutableProto() const
Returns the mutable underlying protobuf object (useful for model edition).
absl::string_view Name() const
Returns the name of the constraint (or the empty string if not set).
bool HasObjective() const
Checks whether the model contains an objective.
BoolVar GetBoolVarFromProtoIndex(int index)
Returns the Boolean variable from its index in the proto.
IntVar NewIntVar(const Domain &domain)
Creates an integer variable with the given domain.
Constraint AddInverseConstraint(absl::Span< const IntVar > variables, absl::Span< const IntVar > inverse_variables)
void Minimize(const LinearExpr &expr)
Adds a linear minimization objective.
NoOverlap2DConstraint AddNoOverlap2D()
Constraint AddBoolXor(absl::Span< const BoolVar > literals)
Adds the constraint that an odd number of literals is true.
IntervalVar NewIntervalVar(const LinearExpr &start, const LinearExpr &size, const LinearExpr &end)
Creates an interval variable from 3 affine expressions.
IntVar GetIntVarFromProtoIndex(int index)
Returns the integer variable from its index in the proto.
Constraint AddMultiplicationEquality(const LinearExpr &target, absl::Span< const LinearExpr > exprs)
Adds target == prod(exprs).
CpModelBuilder Clone() const
Returns a cloned version of the current model.
IntVar NewConstant(int64_t value)
Constraint AddBoolAnd(absl::Span< const BoolVar > literals)
Adds the constraint that all literals must be true.
Constraint AddMaxEquality(const LinearExpr &target, absl::Span< const IntVar > vars)
Adds target == max(vars).
void Maximize(const LinearExpr &expr)
Adds a linear maximization objective.
TableConstraint AddAllowedAssignments(absl::Span< const LinearExpr > expressions)
void FixVariable(IntVar var, int64_t value)
ReservoirConstraint AddReservoirConstraint(int64_t min_level, int64_t max_level)
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.
Constraint AddLessOrEqual(const LinearExpr &left, const LinearExpr &right)
Adds left <= right.
IntervalVar NewOptionalIntervalVar(const LinearExpr &start, const LinearExpr &size, const LinearExpr &end, BoolVar presence)
void ClearAssumptions()
Remove all assumptions from the model.
Constraint AddLinearConstraint(const LinearExpr &expr, const Domain &domain)
Adds expr in domain.
void AddHint(IntVar var, int64_t value)
Adds hinting to a variable.
Constraint AddAllDifferent(absl::Span< const IntVar > vars)
This constraint forces all variables to have different values.
IntervalVar GetIntervalVarFromProtoIndex(int index)
Returns the interval variable from its index in the proto.
AutomatonConstraint AddAutomaton(absl::Span< const LinearExpr > transition_expressions, int starting_state, absl::Span< const int > final_states)
Constraint AddExactlyOne(absl::Span< const BoolVar > literals)
Exactly one literal is true. Sum literals == 1.
Constraint AddMinEquality(const LinearExpr &target, absl::Span< const IntVar > vars)
Adds target == min(vars).
void AddAssumption(BoolVar lit)
Adds a literal to the model as assumptions.
bool ExportToFile(absl::string_view filename) const
Export the model to file.
Constraint AddGreaterOrEqual(const LinearExpr &left, const LinearExpr &right)
Adds left >= right.
Constraint AddLessThan(const LinearExpr &left, const LinearExpr &right)
Adds left < right.
MultipleCircuitConstraint AddMultipleCircuitConstraint()
Constraint AddNoOverlap(absl::Span< const IntervalVar > vars)
BoolVar NewBoolVar()
Creates a Boolean variable.
friend class CumulativeConstraint
Constraint AddNotEqual(const LinearExpr &left, const LinearExpr &right)
Adds left != right.
Constraint AddAtLeastOne(absl::Span< const BoolVar > literals)
Same as AddBoolOr(). Sum literals >= 1.
void ClearObjective()
Removes the objective from the model.
Constraint AddAtMostOne(absl::Span< const BoolVar > literals)
At most one literal is true. Sum literals <= 1.
void ClearHints()
Removes all hints.
void AddAssumptions(absl::Span< const BoolVar > literals)
Adds multiple literals to the model as assumptions.
Constraint AddGreaterThan(const LinearExpr &left, const LinearExpr &right)
Adds left > right.
CircuitConstraint AddCircuitConstraint()
Constraint AddDivisionEquality(const LinearExpr &target, const LinearExpr &numerator, const LinearExpr &denominator)
Adds target = num / denom (integer division rounded towards 0).
Constraint AddEquality(const LinearExpr &left, const LinearExpr &right)
Adds left == right.
TableConstraint AddForbiddenAssignments(absl::Span< const LinearExpr > expression)
void SetName(absl::string_view name)
Sets the name of the model.
Constraint AddAbsEquality(const LinearExpr &target, const LinearExpr &expr)
Adds target == abs(expr).
friend class ReservoirConstraint
Constraint AddBoolOr(absl::Span< const BoolVar > literals)
Adds the constraint that at least one of the literals must be true.
IntervalVar NewFixedSizeIntervalVar(const LinearExpr &start, int64_t size)
Creates an interval variable with a fixed size.
CumulativeConstraint AddCumulative(LinearExpr capacity)
Constraint AddModuloEquality(const LinearExpr &target, const LinearExpr &var, const LinearExpr &mod)
Adds target = var % mod.
Constraint AddVariableElement(LinearExpr index, absl::Span< const IntVar > variables, LinearExpr target)
Adds the element constraint: variables[index] == target.
IntervalVar NewOptionalFixedSizeIntervalVar(const LinearExpr &start, int64_t size, BoolVar presence)
Creates an optional interval variable with a fixed size.
Constraint AddElement(LinearExpr index, absl::Span< const LinearExpr > expressions, LinearExpr target)
Adds the element constraint: expressions[index] == target.
const ::operations_research::sat::IntegerVariableProto & variables(int index) const
const ::operations_research::sat::ConstraintProto & constraints(int index) const
::operations_research::sat::IntegerVariableProto *PROTOBUF_NONNULL add_variables()
int variables_size() const
repeated .operations_research.sat.IntegerVariableProto variables = 2;
::int64_t solution(int index) const
::operations_research::sat::LinearExpressionProto *PROTOBUF_NONNULL mutable_capacity()
void AddDemand(IntervalVar interval, LinearExpr demand)
Adds a pair (interval, demand) to the constraint.
DecisionStrategyProto_DomainReductionStrategy DomainReductionStrategy
void set_variable_selection_strategy(::operations_research::sat::DecisionStrategyProto_VariableSelectionStrategy value)
void set_domain_reduction_strategy(::operations_research::sat::DecisionStrategyProto_DomainReductionStrategy value)
DecisionStrategyProto_VariableSelectionStrategy VariableSelectionStrategy
nested types -------------------------------------------------—
::operations_research::sat::LinearExpressionProto *PROTOBUF_NONNULL add_exprs()
const std::vector< double > & coefficients() const
Returns the vector of coefficients.
static DoubleLinearExpr Sum(absl::Span< const IntVar > vars)
Constructs the sum of a list of variables.
DoubleLinearExpr & operator*=(double coeff)
Multiply the linear expression by a constant.
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.
double constant() const
Returns the constant term.
static DoubleLinearExpr WeightedSum(absl::Span< const IntVar > vars, absl::Span< const double > coeffs)
Constructs the scalar product of variables and coefficients.
DoubleLinearExpr & operator-=(double value)
Adds a constant value to the linear expression.
const std::vector< int > & variables() const
Returns the vector of variable indices.
std::string DebugString(const CpModelProto *proto=nullptr) const
Debug string. See the documentation for LinearExpr::DebugString().
DoubleLinearExpr & AddExpression(const LinearExpr &exprs, double coeff=1.0)
Adds a linear expression to the double linear expression.
::operations_research::sat::LinearExpressionProto *PROTOBUF_NONNULL add_exprs()
::operations_research::sat::LinearExpressionProto *PROTOBUF_NONNULL mutable_linear_index()
::operations_research::sat::LinearExpressionProto *PROTOBUF_NONNULL mutable_linear_target()
std::string Name() const
Returns the name of the variable (or the empty string if not set).
std::string DebugString() const
int index() const
Returns the index of the variable in the model. This will be non-negative.
IntVar WithName(absl::string_view name)
Sets the name of the variable.
BoolVar ToBoolVar() const
::operations_research::Domain Domain() const
int domain_size() const
repeated int64 domain = 2;
const ::std::string & name() const
void add_domain(::int64_t value)
::int64_t domain(int index) const
::operations_research::sat::LinearExpressionProto *PROTOBUF_NONNULL mutable_start()
::operations_research::sat::LinearExpressionProto *PROTOBUF_NONNULL mutable_size()
::operations_research::sat::LinearExpressionProto *PROTOBUF_NONNULL mutable_end()
const ::operations_research::sat::LinearExpressionProto & end() const
IntervalVar WithName(absl::string_view name)
Sets the name of the variable.
LinearExpr StartExpr() const
std::string Name() const
Returns the name of the interval (or the empty string if not set).
LinearExpr EndExpr() const
LinearExpr SizeExpr() const
BoolVar PresenceBoolVar() const
std::string DebugString() const
Returns a debug string.
void add_f_inverse(::int32_t value)
void add_f_direct(::int32_t value)
::operations_research::sat::LinearExpressionProto *PROTOBUF_NONNULL mutable_target()
::operations_research::sat::LinearExpressionProto *PROTOBUF_NONNULL add_exprs()
void add_vars(::int32_t value)
void add_domain(::int64_t value)
void add_coeffs(::int64_t value)
static LinearExpr Sum(absl::Span< const IntVar > vars)
NOLINTEND(google-explicit-constructor)
std::string DebugString(const CpModelProto *proto=nullptr) const
static LinearExpr WeightedSum(absl::Span< const IntVar > vars, absl::Span< const int64_t > coeffs)
Constructs the scalar product of variables and coefficients.
static LinearExpr Term(IntVar var, int64_t coefficient)
Constructs var * coefficient.
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.
const std::vector< int > & variables() const
Returns the vector of variable indices.
const std::vector< int64_t > & coefficients() const
Returns the vector of coefficients.
::int64_t coeffs(int index) const
::int32_t vars(int index) const
void set_offset(::int64_t value)
void add_coeffs(::int64_t value)
void add_vars(::int32_t value)
int vars_size() const
repeated int32 vars = 1;
void AddArc(int tail, int head, BoolVar literal)
void AddRectangle(IntervalVar x_coordinate, IntervalVar y_coordinate)
Adds a rectangle (parallel to the axis) to the constraint.
void add_intervals(::int32_t value)
void set_max_level(::int64_t value)
void set_min_level(::int64_t value)
void AddOptionalEvent(LinearExpr time, int64_t level_change, BoolVar is_active)
void AddEvent(LinearExpr time, int64_t level_change)
::operations_research::sat::LinearExpressionProto *PROTOBUF_NONNULL add_exprs()
void set_negated(bool value)
void AddTuple(absl::Span< const int64_t > tuple)
Adds a tuple of possible values to the constraint.
std::string VarDebugString(const CpModelProto &proto, int index)
bool RefIsPositive(int ref)
bool WriteModelProtoToFile(const M &proto, absl::string_view filename)
std::ostream & operator<<(std::ostream &os, const BoolVar &var)
void FillDomainInProto(const Domain &domain, ProtoWithDomain *proto)
Serializes a Domain into the domain field of a proto.
Domain ReadDomainFromProto(const ProtoWithDomain &proto)
Reads a Domain from the domain field of a proto.
int64_t SolutionIntegerValue(const CpSolverResponse &r, const LinearExpr &expr)
Evaluates the value of an linear expression in a solver response.
int NegatedRef(int ref)
Small utility functions to deal with negative variable/literal references.
bool SolutionBooleanValue(const CpSolverResponse &r, BoolVar x)
Evaluates the value of a Boolean literal in a solver response.
In SWIG mode, we don't want anything besides these top-level includes.
ClosedInterval::Iterator end(ClosedInterval interval)
std::ostream & operator<<(std::ostream &out, const Assignment &assignment)
std::ostream & operator<<(std::ostream &out, const std::pair< First, Second > &p)