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"
29#include "absl/strings/str_cat.h"
30#include "absl/strings/str_join.h"
31#include "ortools/linear_solver/linear_solver.pb.h"
50class LinearExpr :
public std::enable_shared_from_this<LinearExpr> {
57 static std::shared_ptr<LinearExpr>
Term(std::shared_ptr<LinearExpr> expr,
59 static std::shared_ptr<LinearExpr>
Affine(std::shared_ptr<LinearExpr> expr,
60 double coeff,
double constant);
61 static std::shared_ptr<LinearExpr>
AffineCst(
double value,
double coeff,
63 static std::shared_ptr<LinearExpr>
Constant(
double value);
65 std::shared_ptr<LinearExpr>
Add(std::shared_ptr<LinearExpr> expr);
66 std::shared_ptr<LinearExpr>
AddFloat(
double cst);
67 std::shared_ptr<LinearExpr>
Sub(std::shared_ptr<LinearExpr> expr);
68 std::shared_ptr<LinearExpr>
SubFloat(
double cst);
69 std::shared_ptr<LinearExpr>
RSubFloat(
double cst);
70 std::shared_ptr<LinearExpr>
MulFloat(
double cst);
71 std::shared_ptr<LinearExpr>
Neg();
73 std::shared_ptr<BoundedLinearExpression>
Eq(std::shared_ptr<LinearExpr> rhs);
74 std::shared_ptr<BoundedLinearExpression>
EqCst(
double rhs);
75 std::shared_ptr<BoundedLinearExpression>
Ge(std::shared_ptr<LinearExpr> rhs);
76 std::shared_ptr<BoundedLinearExpression>
GeCst(
double rhs);
77 std::shared_ptr<BoundedLinearExpression>
Le(std::shared_ptr<LinearExpr> rhs);
78 std::shared_ptr<BoundedLinearExpression>
LeCst(
double rhs);
84 std::shared_ptr<Variable> rhs)
const;
91 void AddToProcess(std::shared_ptr<LinearExpr> expr,
double coeff);
93 virtual void AddVarCoeff(std::shared_ptr<Variable> var,
double coeff) = 0;
97 std::vector<std::pair<std::shared_ptr<LinearExpr>,
double>>
to_process_;
104 void AddVarCoeff(std::shared_ptr<Variable> var,
double coeff)
override;
105 double Flatten(std::vector<std::shared_ptr<Variable>>* vars,
106 std::vector<double>* coeffs);
117 void AddVarCoeff(std::shared_ptr<Variable> var,
double coeff)
override;
127 explicit FlatExpr(std::shared_ptr<LinearExpr> expr);
129 FlatExpr(std::shared_ptr<LinearExpr> pos, std::shared_ptr<LinearExpr> neg);
130 FlatExpr(
const std::vector<std::shared_ptr<Variable>>&,
131 const std::vector<double>&,
double);
133 const std::vector<std::shared_ptr<Variable>>&
vars()
const {
return vars_; }
135 const std::vector<double>&
coeffs()
const {
return coeffs_; }
136 double offset()
const {
return offset_; }
139 std::string
ToString()
const override;
143 std::vector<std::shared_ptr<Variable>> vars_;
144 std::vector<double> coeffs_;
152 explicit SumArray(std::vector<std::shared_ptr<LinearExpr>> exprs,
154 : exprs_(
std::move(exprs)), offset_(
offset) {}
158 for (
int i = 0; i < exprs_.size(); ++i) {
161 if (offset_ != 0.0) {
167 if (exprs_.empty()) {
168 if (offset_ != 0.0) {
169 return absl::StrCat(offset_);
173 for (
int i = 0; i < exprs_.size(); ++i) {
175 absl::StrAppend(&s,
" + ");
177 absl::StrAppend(&s, exprs_[i]->
ToString());
179 if (offset_ != 0.0) {
181 absl::StrAppend(&s,
" + ", offset_);
183 absl::StrAppend(&s,
" - ", -offset_);
186 absl::StrAppend(&s,
")");
191 std::string s = absl::StrCat(
193 absl::StrJoin(exprs_,
", ",
194 [](std::string* out, std::shared_ptr<LinearExpr> expr) {
195 absl::StrAppend(out, expr->DebugString());
197 if (offset_ != 0.0) {
198 absl::StrAppend(&s,
", offset=", offset_);
200 absl::StrAppend(&s,
")");
204 void AddInPlace(std::shared_ptr<LinearExpr> expr) { exprs_.push_back(expr); }
207 double offset()
const {
return offset_; }
210 std::vector<std::shared_ptr<LinearExpr>> exprs_;
218 const std::vector<double>& coeffs,
double offset);
222 std::string
ToString()
const override;
226 const absl::FixedArray<std::shared_ptr<LinearExpr>, 2> exprs_;
227 const absl::FixedArray<double, 2> coeffs_;
239 std::string
ToString()
const override;
242 std::shared_ptr<LinearExpr>
expression()
const {
return expr_; }
244 double offset()
const {
return offset_; }
246 std::shared_ptr<LinearExpr>
AddFloat(
double cst);
247 std::shared_ptr<LinearExpr>
SubFloat(
double cst);
248 std::shared_ptr<LinearExpr>
RSubFloat(
double cst);
249 std::shared_ptr<LinearExpr>
MulFloat(
double cst);
250 std::shared_ptr<LinearExpr>
Neg();
253 std::shared_ptr<LinearExpr> expr_;
266 std::string
ToString()
const override;
279 const std::string&
name);
283 const std::string&
name);
288 std::string
name()
const;
300 std::shared_ptr<Variable> var =
301 std::static_pointer_cast<Variable>(shared_from_this());
305 std::string
ToString()
const override;
318 return H::combine(std::move(h), i->index());
327 std::shared_ptr<LinearExpr> neg,
double lower_bound,
332 std::shared_ptr<LinearExpr> neg, int64_t
lower_bound,
339 const std::vector<std::shared_ptr<Variable>>&
vars()
const;
340 const std::vector<double>&
coeffs()
const;
346 std::vector<std::shared_ptr<Variable>> vars_;
347 std::vector<double> coeffs_;
385#if defined(USE_LP_PARSER)
386 bool ImportFromLpString(
const std::string& lp_string);
387 bool ImportFromLpFile(
const std::string& lp_file);
390 const MPModelProto&
model()
const;
405 std::string
VarName(
int var_index)
const;
444 std::string
name()
const;
454 void AddHint(
int var_index,
double var_value);
496 std::optional<MPSolutionResponse>
SolveRequest(
const MPModelRequest& request);
502 void SetLogCallback(std::function<
void(
const std::string&)> log_callback);
508 const MPSolutionResponse&
response()
const;
529 const std::string& solver_specific_parameters);
536 std::atomic<bool> interrupt_solve_ =
false;
537 std::function<void(
const std::string&)> log_callback_;
538 std::optional<MPSolutionResponse> response_;
539 std::optional<MPModelRequest::SolverType> solver_type_;
540 std::optional<double> time_limit_in_second_;
541 std::string solver_specific_parameters_;
542 std::optional<const MPModelProto*> model_of_last_solve_;
543 std::vector<double> activities_;
544 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
~AffineExpr() override=default
std::shared_ptr< LinearExpr > Neg()
std::shared_ptr< LinearExpr > AddFloat(double cst)
std::shared_ptr< LinearExpr > RSubFloat(double cst)
void Visit(ExprVisitor &lin, double c) override
std::shared_ptr< LinearExpr > MulFloat(double cst)
std::shared_ptr< LinearExpr > SubFloat(double cst)
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)
std::shared_ptr< LinearExpr > Neg()
virtual ~LinearExpr()=default
std::shared_ptr< LinearExpr > RSubFloat(double cst)
std::shared_ptr< LinearExpr > AddFloat(double cst)
virtual void Visit(ExprVisitor &, double)=0
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)
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
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::string ToString() const override
void AddFloatInPlace(double cst)
void AddInPlace(std::shared_ptr< LinearExpr > expr)
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