39 #ifndef OR_TOOLS_SAT_CP_MODEL_H_ 40 #define OR_TOOLS_SAT_CP_MODEL_H_ 43 #include <initializer_list> 48 #include "absl/container/flat_hash_map.h" 49 #include "absl/types/span.h" 85 std::string
Name()
const;
91 return other.builder_ == builder_ && other.index_ == index_;
95 return other.builder_ != builder_ || other.index_ != index_;
106 int index()
const {
return index_; }
167 std::string
Name()
const;
170 return other.builder_ == builder_ && other.index_ == index_;
174 return other.builder_ != builder_ || other.index_ != index_;
185 int index()
const {
return index_; }
266 absl::Span<const int64_t> coeffs);
270 absl::Span<const int64_t> coeffs);
287 const std::vector<int>&
variables()
const {
return variables_; }
290 const std::vector<int64_t>&
coefficients()
const {
return coefficients_; }
306 std::vector<int> variables_;
307 std::vector<int64_t> coefficients_;
308 int64_t constant_ = 0;
397 absl::Span<const double> coeffs);
401 absl::Span<const double> coeffs);
404 const std::vector<int>&
variables()
const {
return variables_; }
407 const std::vector<double>&
coefficients()
const {
return coefficients_; }
419 std::vector<int> variables_;
420 std::vector<double> coefficients_;
421 double constant_ = 0;
424 std::ostream&
operator<<(std::ostream& os,
const DoubleLinearExpr& e);
458 std::string
Name()
const;
481 return other.builder_ == builder_ && other.index_ == index_;
486 return other.builder_ != builder_ || other.index_ != index_;
493 int index()
const {
return index_; }
546 const std::string&
Name()
const;
616 void AddTuple(absl::Span<const int64_t> tuple);
761 int64_t size,
BoolVar presence);
818 absl::Span<const IntVar> variables,
889 absl::Span<const IntVar> inverse_variables);
940 absl::Span<const IntVar> transition_variables,
int starting_state,
941 absl::Span<const int> final_states);
945 absl::Span<const IntVar> vars);
949 absl::Span<const LinearExpr> exprs);
953 std::initializer_list<LinearExpr> exprs);
957 absl::Span<const IntVar> vars);
961 absl::Span<const LinearExpr> exprs);
965 std::initializer_list<LinearExpr> exprs);
981 absl::Span<const LinearExpr> exprs);
985 absl::Span<const IntVar> vars);
989 std::initializer_list<LinearExpr> exprs);
1031 absl::Span<const IntVar> variables,
1037 absl::Span<const BoolVar> variables,
1084 bool negate =
false);
1087 int IndexFromConstant(int64_t
value);
1094 int GetOrCreateIntegerIndex(
int index);
1100 absl::flat_hash_map<int64_t, int> constant_to_index_map_;
1101 absl::flat_hash_map<int, int> bool_to_integer_index_map_;
1134 return std::move(lhs);
1138 return std::move(rhs);
1141 if (lhs.variables().size() < rhs.variables().size()) {
1142 rhs += std::move(lhs);
1143 return std::move(rhs);
1145 lhs += std::move(rhs);
1146 return std::move(lhs);
1157 return std::move(lhs);
1162 return std::move(rhs);
1165 lhs -= std::move(rhs);
1166 return std::move(lhs);
1194 return std::move(lhs);
1199 return std::move(rhs);
1203 if (lhs.variables().size() < rhs.variables().size()) {
1204 rhs += std::move(lhs);
1205 return std::move(rhs);
1207 lhs += std::move(rhs);
1208 return std::move(lhs);
1230 return std::move(lhs);
1236 return std::move(rhs);
1240 lhs -= std::move(rhs);
1241 return std::move(lhs);
1267 #endif // OR_TOOLS_SAT_CP_MODEL_H_
void AddArc(int tail, int head, BoolVar literal)
Add an arc to the circuit.
LinearExpr operator-(LinearExpr expr)
friend int64_t SolutionIntegerValue(const CpSolverResponse &r, const LinearExpr &expr)
Evaluates the value of an linear expression in a solver response.
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.
Specialized reservoir constraint.
LinearExpr EndExpr() const
Returns the end linear expression.
IntervalVar()
A default constructed IntervalVar can be used to mean not defined yet.
BoolVar TrueVar()
Creates an always true Boolean variable.
Constraint AddMinEquality(const LinearExpr &target, absl::Span< const IntVar > vars)
Adds target == min(vars).
const CpModelProto & Proto() const
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.
const bool IsConstant() const
std::string DebugString() const
static LinearExpr Term(IntVar var, int64_t coefficient)
Constructs var * coefficient.
A dedicated container for linear expressions with double coefficients.
CircuitConstraint AddCircuitConstraint()
Adds a circuit constraint.
Constraint AddGreaterThan(const LinearExpr &left, const LinearExpr &right)
Adds left > right.
Specialized no_overlap2D constraint.
BoolVar Not() const
Returns the logical negation of the current Boolean variable.
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.
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
ConstraintProto * MutableProto() const
Returns the mutable underlying protobuf object (useful for model edition).
bool operator==(const BoolVar &other) const
TableConstraint AddAllowedAssignments(absl::Span< const IntVar > vars)
Adds an allowed assignments constraint.
friend std::ostream & operator<<(std::ostream &os, const IntervalVar &var)
int index() const
Returns the index of the interval constraint in the model.
ReservoirConstraint AddReservoirConstraint(int64_t min_level, int64_t max_level)
Adds a reservoir constraint with optional refill/emptying events.
const std::vector< double > & coefficients() const
Returns the vector of coefficients.
friend bool SolutionBooleanValue(const CpSolverResponse &r, BoolVar x)
Evaluates the value of a Boolean literal in a solver response.
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.
LinearExpr & operator+=(const LinearExpr &other)
bool operator==(const IntervalVar &other) const
Equality test with another interval variable.
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.
DecisionStrategyProto_VariableSelectionStrategy
Constraint AddMultiplicationEquality(const LinearExpr &target, absl::Span< const LinearExpr > exprs)
Adds target == prod(exprs).
std::string Name() const
Returns the name of the variable (or the empty string if not set).
std::string VarDebugString(const CpModelProto &proto, int index)
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.
Specialized circuit constraint.
Constraint AddBoolXor(absl::Span< const BoolVar > literals)
Adds the constraint that an odd number of literals is true.
::operations_research::Domain Domain() const
Specialized cumulative constraint.
bool operator!=(const IntVar &other) const
Specialized assignment constraint.
void AddEvent(LinearExpr time, int64_t level_change)
Adds a mandatory event.
void Minimize(const LinearExpr &expr)
Adds a linear minimization objective.
IntVar()
A default constructed IntVar can be used to mean not defined yet.
void AddDemand(IntervalVar interval, LinearExpr demand)
Adds a pair (interval, demand) to the constraint.
const std::vector< int64_t > & coefficients() const
Returns the vector of coefficients.
DoubleLinearExpr & operator *=(double coeff)
Multiply the linear expression by a constant.
CumulativeConstraint AddCumulative(LinearExpr capacity)
The cumulative constraint.
bool operator!=(const IntervalVar &other) const
Difference test with another interval variable.
IntVar NewConstant(int64_t value)
Creates a constant variable.
void Maximize(const LinearExpr &expr)
Adds a linear maximization objective.
CpModelProto * MutableProto()
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.
void SetName(const std::string &name)
Sets the name of the model.
void ClearAssumptions()
Remove all assumptions from the model.
const ConstraintProto & Proto() const
Returns the underlying protobuf object (useful for testing).
Constraint AddInverseConstraint(absl::Span< const IntVar > variables, absl::Span< const IntVar > inverse_variables)
An inverse constraint.
BoolVar ToBoolVar() const
Cast IntVar -> BoolVar.
std::string Name() const
Returns the name of the variable.
MultipleCircuitConstraint AddMultipleCircuitConstraint()
Adds a multiple circuit constraint, aka the "VRP" (Vehicle Routing Problem) constraint.
Constraint AddModuloEquality(const LinearExpr &target, const LinearExpr &var, const LinearExpr &mod)
Adds target = var % mod.
Constraint AddExactlyOne(absl::Span< const BoolVar > literals)
Exactly one literal is true. Sum literals == 1.
BoolVar()
A default constructed BoolVar can be used to mean not defined yet.
BoolVar PresenceBoolVar() const
Returns a BoolVar indicating the presence of this interval.
DoubleLinearExpr & AddTerm(IntVar var, double coeff)
Adds a term (var * coeff) to the linear expression.
Constraint AddAtMostOne(absl::Span< const BoolVar > literals)
At most one literal is true. Sum literals <= 1.
std::string DebugString(const CpModelProto *proto=nullptr) const
Debug string. See the documentation for LinearExpr::DebugString().
LinearExpr operator *(LinearExpr expr, int64_t factor)
int index() const
Returns the index of the variable in the model. This will be non-negative.
Constraint AddDivisionEquality(const LinearExpr &target, const LinearExpr &numerator, const LinearExpr &denominator)
Adds target = num / denom (integer division rounded towards 0).
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 std::string & Name() const
Returns the name of the constraint (or the empty string if not set).
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.
IntVar NewIntVar(const Domain &domain)
Creates an integer variable with the given domain.
const CpModelProto & Build() const
Constraint AddAtLeastOne(absl::Span< const BoolVar > literals)
Same as AddBoolOr. Sum literals >= 1.
static LinearExpr FromProto(const LinearExpressionProto &proto)
Constructs a linear expr from its proto representation.
A dedicated container for linear expressions.
Constraint AddAbsEquality(const LinearExpr &target, const LinearExpr &expr)
Adds target == abs(expr).
LinearExpr()=default
Creates an empty linear expression with value zero.
Constraint OnlyEnforceIf(absl::Span< const BoolVar > literals)
The constraint will be enforced iff all literals listed here are true.
static DoubleLinearExpr Sum(absl::Span< const IntVar > vars)
Constructs the sum of a list of variables.
static LinearExpr Sum(absl::Span< const IntVar > vars)
Constructs the sum of a list of variables.
Constraint AddImplication(BoolVar a, BoolVar b)
Adds a => b.
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.
void AddOptionalEvent(LinearExpr time, int64_t level_change, BoolVar is_active)
Adds an optional event.
CpModelProto const * model_proto
void AddArc(int tail, int head, BoolVar literal)
Add an arc to the circuit.
void ClearHints()
Removes all hints.
bool operator!=(const BoolVar &other) const
We call domain any subset of Int64 = [kint64min, kint64max].
const std::vector< int > & variables() const
Returns the vector of variable indices.
LinearExpr operator+(const LinearExpr &lhs, const LinearExpr &rhs)
Specialized automaton constraint.
LinearExpr & operator *=(int64_t factor)
static LinearExpr WeightedSum(absl::Span< const IntVar > vars, absl::Span< const int64_t > coeffs)
Constructs the scalar product of variables and coefficients.
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.
double constant() const
Returns the constant term.
BoolVar WithName(const std::string &name)
Sets the name of the variable.
DoubleLinearExpr & operator+=(double value)
Adds a constant value to the linear expression.
Constraint AddLessThan(const LinearExpr &left, const LinearExpr &right)
Adds left < right.
DoubleLinearExpr & operator-=(double value)
Adds a constant value to the linear expression.
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.
Constraint WithName(const std::string &name)
Sets the name of the constraint.
Specialized circuit constraint.
std::string DebugString() const
int index() const
Returns the index of the variable in the model.
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.
LinearExpr models a quantity that is linear in the decision variables (MPVariable) of an optimization...
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.
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.
LinearExpr SizeExpr() const
Returns the size linear expression.
std::ostream & operator<<(std::ostream &os, const BoolVar &var)
Constraint AddLessOrEqual(const LinearExpr &left, const LinearExpr &right)
Adds left <= right.
LinearExpr & operator-=(const LinearExpr &other)
bool operator==(const IntVar &other) const
std::string Name() const
Returns the name of the interval (or the empty string if not set).
std::string DebugString(const CpModelProto *proto=nullptr) const
Debug string.
Constraint AddLinearConstraint(const LinearExpr &expr, const Domain &domain)
Adds expr in domain.
Wrapper class around the cp_model proto.
static DoubleLinearExpr WeightedSum(absl::Span< const IntVar > vars, absl::Span< const double > coeffs)
Constructs the scalar product of variables and coefficients.
Represents a Interval variable.
const std::vector< int > & variables() const
Returns the vector of variable indices.
void CopyFrom(const CpModelProto &model_proto)
Replaces the current model with the one from the given proto.
Constraint AddMaxEquality(const LinearExpr &target, absl::Span< const IntVar > vars)
Adds target == max(vars).
const bool IsConstant() const
Returns true if the expression has no variables.