14#ifndef OR_TOOLS_LINEAR_SOLVER_WRAPPERS_MODEL_BUILDER_HELPER_H_
15#define OR_TOOLS_LINEAR_SOLVER_WRAPPERS_MODEL_BUILDER_HELPER_H_
27#include "absl/container/btree_map.h"
28#include "absl/container/fixed_array.h"
48class LinearExpr :
public std::enable_shared_from_this<LinearExpr> {
55 static std::shared_ptr<LinearExpr>
Term(std::shared_ptr<LinearExpr> expr,
57 static std::shared_ptr<LinearExpr>
Affine(std::shared_ptr<LinearExpr> expr,
58 double coeff,
double constant);
59 static std::shared_ptr<LinearExpr>
AffineCst(
double value,
double coeff,
61 static std::shared_ptr<LinearExpr>
Constant(
double value);
63 std::shared_ptr<LinearExpr>
Add(std::shared_ptr<LinearExpr> expr);
64 virtual std::shared_ptr<LinearExpr>
AddFloat(
double cst);
65 std::shared_ptr<LinearExpr>
Sub(std::shared_ptr<LinearExpr> expr);
66 virtual std::shared_ptr<LinearExpr>
SubFloat(
double cst);
67 virtual std::shared_ptr<LinearExpr>
RSubFloat(
double cst);
68 virtual std::shared_ptr<LinearExpr>
MulFloat(
double cst);
69 virtual std::shared_ptr<LinearExpr>
Neg();
71 std::shared_ptr<BoundedLinearExpression>
Eq(std::shared_ptr<LinearExpr> rhs);
72 std::shared_ptr<BoundedLinearExpression>
EqCst(
double rhs);
73 std::shared_ptr<BoundedLinearExpression>
Ge(std::shared_ptr<LinearExpr> rhs);
74 std::shared_ptr<BoundedLinearExpression>
GeCst(
double rhs);
75 std::shared_ptr<BoundedLinearExpression>
Le(std::shared_ptr<LinearExpr> rhs);
76 std::shared_ptr<BoundedLinearExpression>
LeCst(
double rhs);
82 std::shared_ptr<Variable> rhs)
const;
89 void AddToProcess(std::shared_ptr<LinearExpr> expr,
double coeff);
91 virtual void AddVarCoeff(std::shared_ptr<Variable> var,
double coeff) = 0;
95 std::vector<std::pair<std::shared_ptr<LinearExpr>,
double>>
to_process_;
102 void AddVarCoeff(std::shared_ptr<Variable> var,
double coeff)
override;
103 double Flatten(std::vector<std::shared_ptr<Variable>>* vars,
104 std::vector<double>* coeffs);
115 void AddVarCoeff(std::shared_ptr<Variable> var,
double coeff)
override;
125 explicit FlatExpr(std::shared_ptr<LinearExpr> expr);
127 FlatExpr(std::shared_ptr<LinearExpr> pos, std::shared_ptr<LinearExpr> neg);
128 FlatExpr(
const std::vector<std::shared_ptr<Variable>>&,
129 const std::vector<double>&,
double);
131 const std::vector<std::shared_ptr<Variable>>&
vars()
const {
return vars_; }
133 const std::vector<double>&
coeffs()
const {
return coeffs_; }
134 double offset()
const {
return offset_; }
137 std::string
ToString()
const override;
141 std::vector<std::shared_ptr<Variable>> vars_;
142 std::vector<double> coeffs_;
150 explicit SumArray(std::vector<std::shared_ptr<LinearExpr>> exprs,
156 std::string
ToString()
const override;
158 std::shared_ptr<LinearExpr>
AddInPlace(std::shared_ptr<LinearExpr> expr);
164 std::vector<std::shared_ptr<LinearExpr>> exprs_;
172 const std::vector<double>& coeffs,
double offset);
176 std::string
ToString()
const override;
180 const absl::FixedArray<std::shared_ptr<LinearExpr>, 2> exprs_;
181 const absl::FixedArray<double, 2> coeffs_;
193 std::string
ToString()
const override;
196 std::shared_ptr<LinearExpr>
expression()
const {
return expr_; }
198 double offset()
const {
return offset_; }
200 std::shared_ptr<LinearExpr>
AddFloat(
double cst)
override;
201 std::shared_ptr<LinearExpr>
SubFloat(
double cst)
override;
202 std::shared_ptr<LinearExpr>
RSubFloat(
double cst)
override;
203 std::shared_ptr<LinearExpr>
MulFloat(
double cst)
override;
204 std::shared_ptr<LinearExpr>
Neg()
override;
207 std::shared_ptr<LinearExpr> expr_;
220 std::string
ToString()
const override;
233 const std::string&
name);
237 const std::string&
name);
242 std::string
name()
const;
254 std::shared_ptr<Variable> var =
255 std::static_pointer_cast<Variable>(shared_from_this());
259 std::string
ToString()
const override;
272 return H::combine(std::move(h), i->index());
281 std::shared_ptr<LinearExpr> neg,
double lower_bound,
286 std::shared_ptr<LinearExpr> neg, int64_t
lower_bound,
293 const std::vector<std::shared_ptr<Variable>>&
vars()
const;
294 const std::vector<double>&
coeffs()
const;
300 std::vector<std::shared_ptr<Variable>> vars_;
301 std::vector<double> coeffs_;
357 std::string
VarName(
int var_index)
const;
396 std::string
name()
const;
406 void AddHint(
int var_index,
double var_value);
454 void SetLogCallback(std::function<
void(
const std::string&)> log_callback);
481 const std::string& solver_specific_parameters);
488 std::atomic<bool> interrupt_solve_ =
false;
489 std::function<void(
const std::string&)> log_callback_;
490 std::optional<MPSolutionResponse> response_;
491 std::optional<MPModelRequest::SolverType> solver_type_;
492 std::optional<double> time_limit_in_second_;
493 std::string solver_specific_parameters_;
494 std::optional<const MPModelProto*> model_of_last_solve_;
495 std::vector<double> activities_;
496 bool solver_output_ =
false;
std::string ToString() const override
AffineExpr(std::shared_ptr< LinearExpr > expr, double coeff, double offset)
std::string DebugString() const override
double coefficient() const
std::shared_ptr< LinearExpr > Neg() override
std::shared_ptr< LinearExpr > SubFloat(double cst) override
~AffineExpr() override=default
std::shared_ptr< LinearExpr > RSubFloat(double cst) override
std::shared_ptr< LinearExpr > AddFloat(double cst) override
void Visit(ExprVisitor &lin, double c) override
std::shared_ptr< LinearExpr > MulFloat(double cst) override
std::shared_ptr< LinearExpr > expression() const
A class to hold a linear expression with bounds.
~BoundedLinearExpression()=default
std::string ToString() const
const std::vector< double > & coeffs() const
BoundedLinearExpression(std::shared_ptr< LinearExpr > expr, double lower_bound, double upper_bound)
bool CastToBool(bool *result) const
double lower_bound() const
double upper_bound() const
const std::vector< std::shared_ptr< Variable > > & vars() const
std::string DebugString() const
void AddVarCoeff(std::shared_ptr< Variable > var, double coeff) override
ExprEvaluator(ModelSolverHelper *helper)
~ExprEvaluator() override=default
double Flatten(std::vector< std::shared_ptr< Variable > > *vars, std::vector< double > *coeffs)
~ExprFlattener() override=default
void AddVarCoeff(std::shared_ptr< Variable > var, double coeff) override
A visitor class to parse a floating point linear expression.
std::vector< std::pair< std::shared_ptr< LinearExpr >, double > > to_process_
void AddToProcess(std::shared_ptr< LinearExpr > expr, double coeff)
Expression visitors.
virtual ~ExprVisitor()=default
virtual void AddVarCoeff(std::shared_ptr< Variable > var, double coeff)=0
void AddConstant(double constant)
std::string ToString() const override
void Visit(ExprVisitor &lin, double c) override
std::string DebugString() const override
~FixedValue() override=default
A flat linear expression sum(vars[i] * coeffs[i]) + offset.
std::string ToString() const override
void Visit(ExprVisitor &lin, double c) override
const std::vector< std::shared_ptr< Variable > > & vars() const
FlatExpr(std::shared_ptr< LinearExpr > expr)
const std::vector< double > & coeffs() const
std::vector< int > VarIndices() const
std::string DebugString() const override
A linear expression that containing variables and constants.
virtual std::string ToString() const =0
std::shared_ptr< LinearExpr > Add(std::shared_ptr< LinearExpr > expr)
std::shared_ptr< BoundedLinearExpression > Le(std::shared_ptr< LinearExpr > rhs)
virtual std::string DebugString() const =0
std::shared_ptr< LinearExpr > Sub(std::shared_ptr< LinearExpr > expr)
std::shared_ptr< BoundedLinearExpression > EqCst(double rhs)
std::shared_ptr< BoundedLinearExpression > LeCst(double rhs)
static std::shared_ptr< LinearExpr > Affine(std::shared_ptr< LinearExpr > expr, double coeff, double constant)
static std::shared_ptr< LinearExpr > Constant(double value)
static std::shared_ptr< LinearExpr > AffineCst(double value, double coeff, double constant)
std::shared_ptr< BoundedLinearExpression > Ge(std::shared_ptr< LinearExpr > rhs)
virtual std::shared_ptr< LinearExpr > Neg()
virtual ~LinearExpr()=default
virtual std::shared_ptr< LinearExpr > RSubFloat(double cst)
virtual std::shared_ptr< LinearExpr > AddFloat(double cst)
virtual void Visit(ExprVisitor &, double)=0
virtual std::shared_ptr< LinearExpr > MulFloat(double cst)
static std::shared_ptr< LinearExpr > Term(std::shared_ptr< LinearExpr > expr, double coeff)
Expressions.
std::shared_ptr< BoundedLinearExpression > GeCst(double rhs)
std::shared_ptr< BoundedLinearExpression > Eq(std::shared_ptr< LinearExpr > rhs)
virtual std::shared_ptr< LinearExpr > SubFloat(double cst)
Simple director class for C#.
virtual void NewMessage(const std::string &message)=0
void SetEnforcedConstraintLowerBound(int ct_index, double lb)
std::vector< int > ConstraintVarIndices(int ct_index) const
std::vector< double > EnforcedConstraintCoefficients(int ct_index) const
void SetVarIntegrality(int var_index, bool is_integer)
void ClearEnforcedConstraintTerms(int ct_index)
void SetEnforcedIndicatorValue(int ct_index, bool positive)
void SafeAddEnforcedConstraintTerm(int ct_index, int var_index, double coeff)
void SetEnforcedConstraintName(int ct_index, const std::string &name)
void SetVarName(int var_index, const std::string &name)
std::string VarName(int var_index) const
double EnforcedConstraintUpperBound(int ct_index) const
void AddConstraintTerm(int ct_index, int var_index, double coeff)
bool WriteToMpsFile(const std::string &filename, const operations_research::MPModelExportOptions &options=MPModelExportOptions())
int num_constraints() const
double ConstraintLowerBound(int ct_index) const
int AddEnforcedLinearConstraint()
int num_variables() const
bool ReadModelFromProtoFile(const std::string &filename)
std::string ExportToMpsString(const operations_research::MPModelExportOptions &options=MPModelExportOptions())
std::string ConstraintName(int ct_index) const
void SetVarUpperBound(int var_index, double ub)
bool EnforcedIndicatorValue(int ct_index) const
void SetObjectiveOffset(double offset)
void SetEnforcedConstraintCoefficient(int ct_index, int var_index, double coeff)
double VarObjectiveCoefficient(int var_index) const
std::string EnforcedConstraintName(int ct_index) const
void AddEnforcedConstraintTerm(int ct_index, int var_index, double coeff)
double ObjectiveOffset() const
double VarUpperBound(int var_index) const
double ConstraintUpperBound(int ct_index) const
MPModelProto * mutable_model()
void OverwriteModel(const ModelBuilderHelper &other_helper)
ModelBuilderHelper.
bool WriteModelToProtoFile(const std::string &filename)
void SetEnforcedIndicatorVariableIndex(int ct_index, int var_index)
void SetConstraintLowerBound(int ct_index, double lb)
bool ImportFromMpsFile(const std::string &mps_file)
void SetEnforcedConstraintUpperBound(int ct_index, double ub)
int AddLinearConstraint()
int EnforcedIndicatorVariableIndex(int ct_index) const
void AddHint(int var_index, double var_value)
void SetMaximize(bool maximize)
int AddVar()
Direct low level model building API.
void SetVarObjectiveCoefficient(int var_index, double coeff)
void SetVarLowerBound(int var_index, double lb)
void SetConstraintName(int ct_index, const std::string &name)
bool ImportFromMpsString(const std::string &mps_string)
bool VarIsIntegral(int var_index) const
bool IsEnforcedConstraint(int ct_index) const
bool ImportFromLpString(const std::string &lp_string)
bool ImportFromLpFile(const std::string &lp_file)
void SetConstraintUpperBound(int ct_index, double ub)
std::vector< double > ConstraintCoefficients(int ct_index) const
const MPModelProto & model() const
double VarLowerBound(int var_index) const
void SafeAddConstraintTerm(int ct_index, int var_index, double coeff)
void ClearConstraintTerms(int ct_index)
void SetConstraintCoefficient(int ct_index, int var_index, double coeff)
void SetName(const std::string &name)
std::string ExportToLpString(const operations_research::MPModelExportOptions &options=MPModelExportOptions())
double EnforcedConstraintLowerBound(int ct_index) const
std::vector< int > EnforcedConstraintVarIndices(int ct_index) const
void Solve(const ModelBuilderHelper &model)
void SetSolverSpecificParameters(const std::string &solver_specific_parameters)
double variable_value(int var_index) const
ModelSolverHelper(const std::string &solver_name)
std::string status_string() const
bool has_response() const
std::optional< MPSolutionResponse > SolveRequest(const MPModelRequest &request)
Only used by the CVXPY interface. Does not store the response internally.
double objective_value() const
If not defined, or no solution, they will silently return 0.
bool SolverIsSupported() const
double activity(int ct_index)
const MPSolutionResponse & response() const
void SetLogCallbackFromDirectorClass(MbLogCallback *log_callback)
bool has_solution() const
double expression_value(std::shared_ptr< LinearExpr > expr) const
double best_objective_bound() const
void EnableOutput(bool enabled)
void SetTimeLimitInSeconds(double limit)
Solve parameters.
double reduced_cost(int var_index) const
void SetLogCallback(std::function< void(const std::string &)> log_callback)
SolveStatus status() const
double dual_value(int ct_index) const
void Visit(ExprVisitor &lin, double c) override
std::shared_ptr< LinearExpr > AddInPlace(std::shared_ptr< LinearExpr > expr)
std::string ToString() const override
std::shared_ptr< LinearExpr > AddFloatInPlace(double cst)
std::string DebugString() const override
~SumArray() override=default
SumArray(std::vector< std::shared_ptr< LinearExpr > > exprs, double offset)
A class to hold a variable index.
bool operator<(const Variable &other) const
Variable(ModelBuilderHelper *helper, int index)
void SetLowerBound(double lb)
double upper_bound() const
double lower_bounds() const
ModelBuilderHelper * helper_
void Visit(ExprVisitor &lin, double c) override
void SetName(const std::string &name)
ModelBuilderHelper * helper() const
std::string DebugString() const override
void SetObjectiveCoefficient(double coeff)
std::string ToString() const override
double objective_coefficient() const
void SetUpperBound(double ub)
void SetIsIntegral(bool is_integral)
std::string ToString() const override
WeightedSumArray(const std::vector< std::shared_ptr< LinearExpr > > &exprs, const std::vector< double > &coeffs, double offset)
void Visit(ExprVisitor &lin, double c) override
std::string DebugString() const override
~WeightedSumArray() override=default
@ SOLVER_TYPE_UNAVAILABLE
@ INVALID_SOLVER_PARAMETERS
H AbslHashValue(H h, std::shared_ptr< Variable > i)
In SWIG mode, we don't want anything besides these top-level includes.
Compare the indices of variables.
bool operator()(std::shared_ptr< Variable > lhs, std::shared_ptr< Variable > rhs) const