C++ Reference

C++ Reference: Linear solver

linear_solver.h
Go to the documentation of this file.
1 // Copyright 2010-2021 Google LLC
2 // Licensed under the Apache License, Version 2.0 (the "License");
3 // you may not use this file except in compliance with the License.
4 // You may obtain a copy of the License at
5 //
6 // http://www.apache.org/licenses/LICENSE-2.0
7 //
8 // Unless required by applicable law or agreed to in writing, software
9 // distributed under the License is distributed on an "AS IS" BASIS,
10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 // See the License for the specific language governing permissions and
12 // limitations under the License.
13 
134 #ifndef OR_TOOLS_LINEAR_SOLVER_LINEAR_SOLVER_H_
135 #define OR_TOOLS_LINEAR_SOLVER_LINEAR_SOLVER_H_
136 
137 #include <cstdint>
138 #include <functional>
139 #include <limits>
140 #include <map>
141 #include <memory>
142 #include <string>
143 #include <utility>
144 #include <vector>
145 
146 #include "absl/container/flat_hash_map.h"
147 #include "absl/flags/parse.h"
148 #include "absl/flags/usage.h"
149 #include "absl/status/status.h"
150 #include "absl/strings/match.h"
151 #include "absl/strings/str_format.h"
152 #include "absl/types/optional.h"
153 #include "ortools/base/integral_types.h"
154 #include "ortools/base/logging.h"
155 #include "ortools/base/macros.h"
156 #include "ortools/base/timer.h"
159 #include "ortools/linear_solver/linear_solver_callback.h"
160 #include "ortools/port/proto_utils.h"
161 
162 ABSL_DECLARE_FLAG(bool, linear_solver_enable_verbose_output);
163 
164 namespace operations_research {
165 
166 constexpr double kDefaultPrimalTolerance = 1e-07;
167 
168 class MPConstraint;
169 class MPObjective;
170 class MPSolverInterface;
171 class MPSolverParameters;
172 class MPVariable;
173 
174 // There is a homonymous version taking a MPSolver::OptimizationProblemType.
175 bool SolverTypeIsMip(MPModelRequest::SolverType solver_type);
176 
181 class MPSolver {
182  public:
190  // Linear programming problems.
191  // ----------------------------
194  GLOP_LINEAR_PROGRAMMING = 2, // Recommended default value. Made in Google.
195 
196  // Integer programming problems.
197  // -----------------------------
198  SCIP_MIXED_INTEGER_PROGRAMMING = 3, // Recommended default value.
201 
202  // Commercial software (need license).
209 
210  // Boolean optimization problem (requires only integer variables and works
211  // best with only Boolean variables).
213 
214  // SAT based solver (requires only integer and Boolean variables).
215  // If you pass it mixed integer problems, it will scale coefficients to
216  // integer values, and solver continuous variables as integral variables.
218 
219  // Dedicated knapsack solvers.
221  };
222 
224  MPSolver(const std::string& name, OptimizationProblemType problem_type);
225  virtual ~MPSolver();
226 
255  static MPSolver* CreateSolver(const std::string& solver_id);
256 
261  static bool SupportsProblemType(OptimizationProblemType problem_type);
262 
268  static bool ParseSolverType(absl::string_view solver_id,
270 
276  const std::string& solver_id);
277 
278  bool IsMIP() const;
279 
281  const std::string& Name() const {
282  return name_; // Set at construction.
283  }
284 
287  return problem_type_; // Set at construction.
288  }
289 
295  void Clear();
296 
298  int NumVariables() const { return variables_.size(); }
299 
304  const std::vector<MPVariable*>& variables() const { return variables_; }
305 
309  MPVariable* variable(int index) const { return variables_[index]; }
310 
316  MPVariable* LookupVariableOrNull(const std::string& var_name) const;
317 
325  MPVariable* MakeVar(double lb, double ub, bool integer,
326  const std::string& name);
327 
329  MPVariable* MakeNumVar(double lb, double ub, const std::string& name);
330 
332  MPVariable* MakeIntVar(double lb, double ub, const std::string& name);
333 
335  MPVariable* MakeBoolVar(const std::string& name);
336 
351  void MakeVarArray(int nb, double lb, double ub, bool integer,
352  const std::string& name_prefix,
353  std::vector<MPVariable*>* vars);
354 
356  void MakeNumVarArray(int nb, double lb, double ub, const std::string& name,
357  std::vector<MPVariable*>* vars);
358 
360  void MakeIntVarArray(int nb, double lb, double ub, const std::string& name,
361  std::vector<MPVariable*>* vars);
362 
364  void MakeBoolVarArray(int nb, const std::string& name,
365  std::vector<MPVariable*>* vars);
366 
368  int NumConstraints() const { return constraints_.size(); }
369 
375  const std::vector<MPConstraint*>& constraints() const { return constraints_; }
376 
378  MPConstraint* constraint(int index) const { return constraints_[index]; }
379 
388  const std::string& constraint_name) const;
389 
398  MPConstraint* MakeRowConstraint(double lb, double ub);
399 
402 
404  MPConstraint* MakeRowConstraint(double lb, double ub,
405  const std::string& name);
406 
408  MPConstraint* MakeRowConstraint(const std::string& name);
409 
415 
418  const std::string& name);
419 
426  const MPObjective& Objective() const { return *objective_; }
427 
429  MPObjective* MutableObjective() { return objective_.get(); }
430 
451  NOT_SOLVED = 6
452  };
453 
456 
459 
464  void Write(const std::string& file_name);
465 
472  std::vector<double> ComputeConstraintActivities() const;
473 
492  bool VerifySolution(double tolerance, bool log_errors) const;
493 
502  void Reset();
503 
512 
520  MPSolverResponseStatus LoadModelFromProto(const MPModelProto& input_model,
521  std::string* error_message);
530  const MPModelProto& input_model, std::string* error_message);
531 
533  void FillSolutionResponseProto(MPSolutionResponse* response) const;
534 
550  static void SolveWithProto(const MPModelRequest& model_request,
551  MPSolutionResponse* response);
552 
554  void ExportModelToProto(MPModelProto* output_model) const;
555 
589  absl::Status LoadSolutionFromProto(
590  const MPSolutionResponse& response,
591  double tolerance = kDefaultPrimalTolerance);
592 
598 
605  bool ExportModelAsLpFormat(bool obfuscate, std::string* model_str) const;
606  bool ExportModelAsMpsFormat(bool fixed_format, bool obfuscate,
607  std::string* model_str) const;
608 
619  absl::Status SetNumThreads(int num_threads);
620 
622  int GetNumThreads() const { return num_threads_; }
623 
630  bool SetSolverSpecificParametersAsString(const std::string& parameters);
632  return solver_specific_parameter_string_;
633  }
634 
648  void SetHint(std::vector<std::pair<const MPVariable*, double> > hint);
649 
654  enum BasisStatus {
655  FREE = 0,
659  BASIC
660  };
661 
674  const std::vector<MPSolver::BasisStatus>& variable_statuses,
675  const std::vector<MPSolver::BasisStatus>& constraint_statuses);
676 
682  static double infinity() { return std::numeric_limits<double>::infinity(); }
683 
692  bool OutputIsEnabled() const;
693 
695  void EnableOutput();
696 
699 
700  absl::Duration TimeLimit() const { return time_limit_; }
701  void SetTimeLimit(absl::Duration time_limit) {
702  DCHECK_GE(time_limit, absl::ZeroDuration());
703  time_limit_ = time_limit;
704  }
705 
706  absl::Duration DurationSinceConstruction() const {
707  return absl::Now() - construction_time_;
708  }
709 
711  int64_t iterations() const;
712 
718  int64_t nodes() const;
719 
721  std::string SolverVersion() const;
722 
737 
762 
777  ABSL_MUST_USE_RESULT bool NextSolution();
778 
779  // Does not take ownership of "mp_callback".
780  //
781  // As of 2019-10-22, only SCIP and Gurobi support Callbacks.
782  // SCIP does not support suggesting a heuristic solution in the callback.
783  //
784  // See go/mpsolver-callbacks for additional documentation.
785  void SetCallback(MPCallback* mp_callback);
786  bool SupportsCallbacks() const;
787 
788  // DEPRECATED: Use TimeLimit() and SetTimeLimit(absl::Duration) instead.
789  // NOTE: These deprecated functions used the convention time_limit = 0 to mean
790  // "no limit", which now corresponds to time_limit_ = InfiniteDuration().
791  int64_t time_limit() const {
792  return time_limit_ == absl::InfiniteDuration()
793  ? 0
794  : absl::ToInt64Milliseconds(time_limit_);
795  }
796  void set_time_limit(int64_t time_limit_milliseconds) {
797  SetTimeLimit(time_limit_milliseconds == 0
798  ? absl::InfiniteDuration()
799  : absl::Milliseconds(time_limit_milliseconds));
800  }
801  double time_limit_in_secs() const {
802  return static_cast<double>(time_limit()) / 1000.0;
803  }
804 
805  // DEPRECATED: Use DurationSinceConstruction() instead.
806  int64_t wall_time() const {
807  return absl::ToInt64Milliseconds(DurationSinceConstruction());
808  }
809 
810  friend class GLPKInterface;
811  friend class CLPInterface;
812  friend class CBCInterface;
813  friend class SCIPInterface;
814  friend class GurobiInterface;
815  friend class CplexInterface;
816  friend class XpressInterface;
817  friend class SLMInterface;
818  friend class MPSolverInterface;
819  friend class GLOPInterface;
820  friend class BopInterface;
821  friend class SatInterface;
822  friend class KnapsackInterface;
823 
824  // Debugging: verify that the given MPVariable* belongs to this solver.
825  bool OwnsVariable(const MPVariable* var) const;
826 
827  private:
828  // Computes the size of the constraint with the largest number of
829  // coefficients with index in [min_constraint_index,
830  // max_constraint_index)
831  int ComputeMaxConstraintSize(int min_constraint_index,
832  int max_constraint_index) const;
833 
834  // Returns true if the model has constraints with lower bound > upper bound.
835  bool HasInfeasibleConstraints() const;
836 
837  // Returns true if the model has at least 1 integer variable.
838  bool HasIntegerVariables() const;
839 
840  // Generates the map from variable names to their indices.
841  void GenerateVariableNameIndex() const;
842 
843  // Generates the map from constraint names to their indices.
844  void GenerateConstraintNameIndex() const;
845 
846  // The name of the linear programming problem.
847  const std::string name_;
848 
849  // The type of the linear programming problem.
850  const OptimizationProblemType problem_type_;
851 
852  // The solver interface.
853  std::unique_ptr<MPSolverInterface> interface_;
854 
855  // The vector of variables in the problem.
856  std::vector<MPVariable*> variables_;
857  // A map from a variable's name to its index in variables_.
858  mutable absl::optional<absl::flat_hash_map<std::string, int> >
859  variable_name_to_index_;
860  // Whether variables have been extracted to the underlying interface.
861  std::vector<bool> variable_is_extracted_;
862 
863  // The vector of constraints in the problem.
864  std::vector<MPConstraint*> constraints_;
865  // A map from a constraint's name to its index in constraints_.
866  mutable absl::optional<absl::flat_hash_map<std::string, int> >
867  constraint_name_to_index_;
868  // Whether constraints have been extracted to the underlying interface.
869  std::vector<bool> constraint_is_extracted_;
870 
871  // The linear objective function.
872  std::unique_ptr<MPObjective> objective_;
873 
874  // Initial values for all or some of the problem variables that can be
875  // exploited as a starting hint by a solver.
876  //
877  // Note(user): as of 05/05/2015, we can't use >> because of some SWIG errors.
878  //
879  // TODO(user): replace by two vectors, a std::vector<bool> to indicate if a
880  // hint is provided and a std::vector<double> for the hint value.
881  std::vector<std::pair<const MPVariable*, double> > solution_hint_;
882 
883  absl::Duration time_limit_ = absl::InfiniteDuration(); // Default = No limit.
884 
885  const absl::Time construction_time_;
886 
887  // Permanent storage for the number of threads.
888  int num_threads_ = 1;
889 
890  // Permanent storage for SetSolverSpecificParametersAsString().
891  std::string solver_specific_parameter_string_;
892 
893  MPSolverResponseStatus LoadModelFromProtoInternal(
894  const MPModelProto& input_model, bool clear_names,
895  bool check_model_validity, std::string* error_message);
896 
897  DISALLOW_COPY_AND_ASSIGN(MPSolver);
898 };
899 
901  return SolverTypeIsMip(static_cast<MPModelRequest::SolverType>(solver_type));
902 }
903 
904 const absl::string_view ToString(
905  MPSolver::OptimizationProblemType optimization_problem_type);
906 
907 inline std::ostream& operator<<(
908  std::ostream& os,
909  MPSolver::OptimizationProblemType optimization_problem_type) {
910  return os << ToString(optimization_problem_type);
911 }
912 
913 inline std::ostream& operator<<(std::ostream& os,
914  MPSolver::ResultStatus status) {
915  return os << ProtoEnumToString<MPSolverResponseStatus>(
916  static_cast<MPSolverResponseStatus>(status));
917 }
918 
919 bool AbslParseFlag(absl::string_view text,
921  std::string* error);
922 
923 inline std::string AbslUnparseFlag(
924  MPSolver::OptimizationProblemType solver_type) {
925  return std::string(ToString(solver_type));
926 }
927 
929 class MPObjective {
930  public:
935  void Clear();
936 
943  void SetCoefficient(const MPVariable* const var, double coeff);
944 
950  double GetCoefficient(const MPVariable* const var) const;
951 
957  const absl::flat_hash_map<const MPVariable*, double>& terms() const {
958  return coefficients_;
959  }
960 
962  void SetOffset(double value);
963 
965  double offset() const { return offset_; }
966 
971  void OptimizeLinearExpr(const LinearExpr& linear_expr, bool is_maximization);
972 
974  void MaximizeLinearExpr(const LinearExpr& linear_expr) {
975  OptimizeLinearExpr(linear_expr, true);
976  }
978  void MinimizeLinearExpr(const LinearExpr& linear_expr) {
979  OptimizeLinearExpr(linear_expr, false);
980  }
981 
983  void AddLinearExpr(const LinearExpr& linear_expr);
984 
986  void SetOptimizationDirection(bool maximize);
987 
990 
993 
995  bool maximization() const;
996 
998  bool minimization() const;
999 
1011  double Value() const;
1012 
1019  double BestBound() const;
1020 
1021  private:
1022  friend class MPSolver;
1023  friend class MPSolverInterface;
1024  friend class CBCInterface;
1025  friend class CLPInterface;
1026  friend class GLPKInterface;
1027  friend class SCIPInterface;
1028  friend class SLMInterface;
1029  friend class GurobiInterface;
1030  friend class CplexInterface;
1031  friend class XpressInterface;
1032  friend class GLOPInterface;
1033  friend class BopInterface;
1034  friend class SatInterface;
1035  friend class KnapsackInterface;
1036 
1037  // Constructor. An objective points to a single MPSolverInterface
1038  // that is specified in the constructor. An objective cannot belong
1039  // to several models.
1040  // At construction, an MPObjective has no terms (which is equivalent
1041  // on having a coefficient of 0 for all variables), and an offset of 0.
1042  explicit MPObjective(MPSolverInterface* const interface_in)
1043  : interface_(interface_in), coefficients_(1), offset_(0.0) {}
1044 
1045  MPSolverInterface* const interface_;
1046 
1047  // Mapping var -> coefficient.
1048  absl::flat_hash_map<const MPVariable*, double> coefficients_;
1049  // Constant term.
1050  double offset_;
1051 
1052  DISALLOW_COPY_AND_ASSIGN(MPObjective);
1053 };
1054 
1056 class MPVariable {
1057  public:
1059  const std::string& name() const { return name_; }
1060 
1062  void SetInteger(bool integer);
1063 
1065  bool integer() const { return integer_; }
1066 
1074  double solution_value() const;
1075 
1077  int index() const { return index_; }
1078 
1080  double lb() const { return lb_; }
1081 
1083  double ub() const { return ub_; }
1084 
1086  void SetLB(double lb) { SetBounds(lb, ub_); }
1087 
1089  void SetUB(double ub) { SetBounds(lb_, ub); }
1090 
1092  void SetBounds(double lb, double ub);
1093 
1101 
1106  double reduced_cost() const;
1107 
1115 
1126  int branching_priority() const { return branching_priority_; }
1127  void SetBranchingPriority(int priority);
1128 
1129  protected:
1130  friend class MPSolver;
1131  friend class MPSolverInterface;
1132  friend class CBCInterface;
1133  friend class CLPInterface;
1134  friend class GLPKInterface;
1135  friend class SCIPInterface;
1136  friend class SLMInterface;
1137  friend class GurobiInterface;
1138  friend class CplexInterface;
1139  friend class XpressInterface;
1140  friend class GLOPInterface;
1142  friend class BopInterface;
1143  friend class SatInterface;
1144  friend class KnapsackInterface;
1145 
1146  // Constructor. A variable points to a single MPSolverInterface that
1147  // is specified in the constructor. A variable cannot belong to
1148  // several models.
1149  MPVariable(int index, double lb, double ub, bool integer,
1150  const std::string& name, MPSolverInterface* const interface_in)
1151  : index_(index),
1152  lb_(lb),
1153  ub_(ub),
1154  integer_(integer),
1155  name_(name.empty() ? absl::StrFormat("auto_v_%09d", index) : name),
1156  solution_value_(0.0),
1157  reduced_cost_(0.0),
1158  interface_(interface_in) {}
1159 
1160  void set_solution_value(double value) { solution_value_ = value; }
1161  void set_reduced_cost(double reduced_cost) { reduced_cost_ = reduced_cost; }
1162 
1163  private:
1164  const int index_;
1165  double lb_;
1166  double ub_;
1167  bool integer_;
1168  const std::string name_;
1169  double solution_value_;
1170  double reduced_cost_;
1171  int branching_priority_ = 0;
1172  MPSolverInterface* const interface_;
1173  DISALLOW_COPY_AND_ASSIGN(MPVariable);
1174 };
1175 
1182  public:
1184  const std::string& name() const { return name_; }
1185 
1187  void Clear();
1188 
1195  void SetCoefficient(const MPVariable* const var, double coeff);
1196 
1201  double GetCoefficient(const MPVariable* const var) const;
1202 
1208  const absl::flat_hash_map<const MPVariable*, double>& terms() const {
1209  return coefficients_;
1210  }
1211 
1213  double lb() const { return lb_; }
1214 
1216  double ub() const { return ub_; }
1217 
1219  void SetLB(double lb) { SetBounds(lb, ub_); }
1220 
1222  void SetUB(double ub) { SetBounds(lb_, ub); }
1223 
1225  void SetBounds(double lb, double ub);
1226 
1228  bool is_lazy() const { return is_lazy_; }
1229 
1243  void set_is_lazy(bool laziness) { is_lazy_ = laziness; }
1244 
1245  const MPVariable* indicator_variable() const { return indicator_variable_; }
1246  bool indicator_value() const { return indicator_value_; }
1247 
1249  int index() const { return index_; }
1250 
1255  double dual_value() const;
1256 
1270 
1271  protected:
1272  friend class MPSolver;
1273  friend class MPSolverInterface;
1274  friend class CBCInterface;
1275  friend class CLPInterface;
1276  friend class GLPKInterface;
1277  friend class SCIPInterface;
1278  friend class SLMInterface;
1279  friend class GurobiInterface;
1280  friend class CplexInterface;
1281  friend class XpressInterface;
1282  friend class GLOPInterface;
1283  friend class BopInterface;
1284  friend class SatInterface;
1285  friend class KnapsackInterface;
1286 
1287  // Constructor. A constraint points to a single MPSolverInterface
1288  // that is specified in the constructor. A constraint cannot belong
1289  // to several models.
1290  MPConstraint(int index, double lb, double ub, const std::string& name,
1291  MPSolverInterface* const interface_in)
1292  : coefficients_(1),
1293  index_(index),
1294  lb_(lb),
1295  ub_(ub),
1296  name_(name.empty() ? absl::StrFormat("auto_c_%09d", index) : name),
1297  is_lazy_(false),
1298  indicator_variable_(nullptr),
1299  dual_value_(0.0),
1300  interface_(interface_in) {}
1301 
1302  void set_dual_value(double dual_value) { dual_value_ = dual_value; }
1303 
1304  private:
1305  // Returns true if the constraint contains variables that have not
1306  // been extracted yet.
1307  bool ContainsNewVariables();
1308 
1309  // Mapping var -> coefficient.
1310  absl::flat_hash_map<const MPVariable*, double> coefficients_;
1311 
1312  const int index_; // See index().
1313 
1314  // The lower bound for the linear constraint.
1315  double lb_;
1316 
1317  // The upper bound for the linear constraint.
1318  double ub_;
1319 
1320  // Name.
1321  const std::string name_;
1322 
1323  // True if the constraint is "lazy", i.e. the constraint is added to the
1324  // underlying Linear Programming solver only if it is violated.
1325  // By default this parameter is 'false'.
1326  bool is_lazy_;
1327 
1328  // If given, this constraint is only active if `indicator_variable_`'s value
1329  // is equal to `indicator_value_`.
1330  const MPVariable* indicator_variable_;
1331  bool indicator_value_;
1332 
1333  double dual_value_;
1334  MPSolverInterface* const interface_;
1335  DISALLOW_COPY_AND_ASSIGN(MPConstraint);
1336 };
1337 
1365  public:
1370 
1379  DUAL_TOLERANCE = 2
1380  };
1381 
1385  PRESOLVE = 1000,
1391  SCALING = 1003
1392  };
1393 
1399  PRESOLVE_ON = 1
1400  };
1401 
1405  DUAL = 10,
1407  PRIMAL = 11,
1409  BARRIER = 12
1410  };
1411 
1416 
1421  INCREMENTALITY_ON = 1
1422  };
1423 
1429  SCALING_ON = 1
1430  };
1431 
1432  // Placeholder value to indicate that a parameter is set to
1433  // the default value defined in the wrapper.
1434  static const double kDefaultDoubleParamValue;
1435  static const int kDefaultIntegerParamValue;
1436 
1437  // Placeholder value to indicate that a parameter is unknown.
1438  static const double kUnknownDoubleParamValue;
1439  static const int kUnknownIntegerParamValue;
1440 
1441  // Default values for parameters. Only parameters that define the
1442  // properties of the solution returned need to have a default value
1443  // (that is the same for all solvers). You can also define a default
1444  // value for performance parameters when you are confident it is a
1445  // good choice (example: always turn presolve on).
1446  static const double kDefaultRelativeMipGap;
1447  static const double kDefaultPrimalTolerance;
1448  static const double kDefaultDualTolerance;
1451 
1454 
1457 
1460 
1467 
1474 
1476  void Reset();
1477 
1480 
1483 
1484  private:
1485  // Parameter value for each parameter.
1486  // @see DoubleParam
1487  // @see IntegerParam
1488  double relative_mip_gap_value_;
1489  double primal_tolerance_value_;
1490  double dual_tolerance_value_;
1491  int presolve_value_;
1492  int scaling_value_;
1493  int lp_algorithm_value_;
1494  int incrementality_value_;
1495 
1496  // Boolean value indicating whether each parameter is set to the
1497  // solver's default value. Only parameters for which the wrapper
1498  // does not define a default value need such an indicator.
1499  bool lp_algorithm_is_default_;
1500 
1501  DISALLOW_COPY_AND_ASSIGN(MPSolverParameters);
1502 };
1503 
1504 // Whether the given MPSolverResponseStatus (of a solve) would yield an RPC
1505 // error when happening on the linear solver stubby server, see
1506 // ./linear_solver_service.proto.
1507 // Note that RPC errors forbid to carry a response to the client, who can only
1508 // see the RPC error itself (error code + error message).
1510 
1511 // This class wraps the actual mathematical programming solvers. Each
1512 // solver (GLOP, CLP, CBC, GLPK, SCIP) has its own interface class that
1513 // derives from this abstract class. This class is never directly
1514 // accessed by the user.
1515 // @see glop_interface.cc
1516 // @see cbc_interface.cc
1517 // @see clp_interface.cc
1518 // @see glpk_interface.cc
1519 // @see scip_interface.cc
1521  public:
1523  // The underlying solver (CLP, GLPK, ...) and MPSolver are not in
1524  // sync for the model nor for the solution.
1526  // The underlying solver and MPSolver are in sync for the model
1527  // but not for the solution: the model has changed since the
1528  // solution was computed last.
1530  // The underlying solver and MPSolver are in sync for the model and
1531  // the solution.
1533  };
1534 
1535  // When the underlying solver does not provide the number of simplex
1536  // iterations.
1537  static constexpr int64_t kUnknownNumberOfIterations = -1;
1538  // When the underlying solver does not provide the number of
1539  // branch-and-bound nodes.
1540  static constexpr int64_t kUnknownNumberOfNodes = -1;
1541 
1542  // Constructor. The user will access the MPSolverInterface through the
1543  // MPSolver passed as argument.
1544  explicit MPSolverInterface(MPSolver* const solver);
1546 
1547  // ----- Solve -----
1548  // Solves problem with specified parameter values. Returns true if the
1549  // solution is optimal.
1551 
1552  // Directly solves a MPModelRequest, bypassing the MPSolver data structures
1553  // entirely. Returns {} (eg. absl::nullopt) if the feature is not supported by
1554  // the underlying solver.
1555  virtual absl::optional<MPSolutionResponse> DirectlySolveProto(
1556  const MPModelRequest& request) {
1557  return absl::nullopt;
1558  }
1559 
1560  // Writes the model using the solver internal write function. Currently only
1561  // available for GurobiInterface.
1562  virtual void Write(const std::string& filename);
1563 
1564  // ----- Model modifications and extraction -----
1565  // Resets extracted model.
1566  virtual void Reset() = 0;
1567 
1568  // Sets the optimization direction (min/max).
1569  virtual void SetOptimizationDirection(bool maximize) = 0;
1570 
1571  // Modifies bounds of an extracted variable.
1572  virtual void SetVariableBounds(int index, double lb, double ub) = 0;
1573 
1574  // Modifies integrality of an extracted variable.
1575  virtual void SetVariableInteger(int index, bool integer) = 0;
1576 
1577  // Modify bounds of an extracted variable.
1578  virtual void SetConstraintBounds(int index, double lb, double ub) = 0;
1579 
1580  // Adds a linear constraint.
1581  virtual void AddRowConstraint(MPConstraint* const ct) = 0;
1582 
1583  // Adds an indicator constraint. Returns true if the feature is supported by
1584  // the underlying solver.
1585  virtual bool AddIndicatorConstraint(MPConstraint* const ct) {
1586  LOG(ERROR) << "Solver doesn't support indicator constraints.";
1587  return false;
1588  }
1589 
1590  // Add a variable.
1591  virtual void AddVariable(MPVariable* const var) = 0;
1592 
1593  // Changes a coefficient in a constraint.
1594  virtual void SetCoefficient(MPConstraint* const constraint,
1595  const MPVariable* const variable,
1596  double new_value, double old_value) = 0;
1597 
1598  // Clears a constraint from all its terms.
1599  virtual void ClearConstraint(MPConstraint* const constraint) = 0;
1600 
1601  // Changes a coefficient in the linear objective.
1602  virtual void SetObjectiveCoefficient(const MPVariable* const variable,
1603  double coefficient) = 0;
1604 
1605  // Changes the constant term in the linear objective.
1606  virtual void SetObjectiveOffset(double value) = 0;
1607 
1608  // Clears the objective from all its terms.
1609  virtual void ClearObjective() = 0;
1610 
1611  virtual void BranchingPriorityChangedForVariable(int var_index) {}
1612  // ------ Query statistics on the solution and the solve ------
1613  // Returns the number of simplex iterations. The problem must be discrete,
1614  // otherwise it crashes, or returns kUnknownNumberOfIterations in NDEBUG mode.
1615  virtual int64_t iterations() const = 0;
1616  // Returns the number of branch-and-bound nodes. The problem must be discrete,
1617  // otherwise it crashes, or returns kUnknownNumberOfNodes in NDEBUG mode.
1618  virtual int64_t nodes() const = 0;
1619  // Returns the best objective bound. The problem must be discrete, otherwise
1620  // it crashes, or returns trivial bound (+/- inf) in NDEBUG mode.
1621  double best_objective_bound() const;
1622  // Returns the objective value of the best solution found so far.
1623  double objective_value() const;
1624 
1625  // Returns the basis status of a row.
1626  virtual MPSolver::BasisStatus row_status(int constraint_index) const = 0;
1627  // Returns the basis status of a constraint.
1628  virtual MPSolver::BasisStatus column_status(int variable_index) const = 0;
1629 
1630  // Checks whether the solution is synchronized with the model, i.e. whether
1631  // the model has changed since the solution was computed last.
1632  // If it isn't, it crashes in NDEBUG, and returns false othwerwise.
1634  // Checks whether a feasible solution exists. The behavior is similar to
1635  // CheckSolutionIsSynchronized() above.
1636  virtual bool CheckSolutionExists() const;
1637  // Handy shortcut to do both checks above (it is often used).
1640  }
1641 
1642  // ----- Misc -----
1643  // Queries problem type. For simplicity, the distinction between
1644  // continuous and discrete is based on the declaration of the user
1645  // when the solver is created (example: GLPK_LINEAR_PROGRAMMING
1646  // vs. GLPK_MIXED_INTEGER_PROGRAMMING), not on the actual content of
1647  // the model.
1648  // Returns true if the problem is continuous.
1649  virtual bool IsContinuous() const = 0;
1650  // Returns true if the problem is continuous and linear.
1651  virtual bool IsLP() const = 0;
1652  // Returns true if the problem is discrete and linear.
1653  virtual bool IsMIP() const = 0;
1654 
1655  // Returns the index of the last variable extracted.
1657 
1658  bool variable_is_extracted(int var_index) const {
1659  return solver_->variable_is_extracted_[var_index];
1660  }
1661  void set_variable_as_extracted(int var_index, bool extracted) {
1662  solver_->variable_is_extracted_[var_index] = extracted;
1663  }
1664  bool constraint_is_extracted(int ct_index) const {
1665  return solver_->constraint_is_extracted_[ct_index];
1666  }
1667  void set_constraint_as_extracted(int ct_index, bool extracted) {
1668  solver_->constraint_is_extracted_[ct_index] = extracted;
1669  }
1670 
1671  // Returns the boolean indicating the verbosity of the solver output.
1672  bool quiet() const { return quiet_; }
1673  // Sets the boolean indicating the verbosity of the solver output.
1674  void set_quiet(bool quiet_value) { quiet_ = quiet_value; }
1675 
1676  // Returns the result status of the last solve.
1679  return result_status_;
1680  }
1681 
1682  // Returns a string describing the underlying solver and its version.
1683  virtual std::string SolverVersion() const = 0;
1684 
1685  // Returns the underlying solver.
1686  virtual void* underlying_solver() = 0;
1687 
1688  // Computes exact condition number. Only available for continuous
1689  // problems and only implemented in GLPK.
1690  virtual double ComputeExactConditionNumber() const;
1691 
1692  // See MPSolver::SetStartingLpBasis().
1693  virtual void SetStartingLpBasis(
1694  const std::vector<MPSolver::BasisStatus>& variable_statuses,
1695  const std::vector<MPSolver::BasisStatus>& constraint_statuses) {
1696  LOG(FATAL) << "Not supported by this solver.";
1697  }
1698 
1699  virtual bool InterruptSolve() { return false; }
1700 
1701  // See MPSolver::NextSolution() for contract.
1702  virtual bool NextSolution() { return false; }
1703 
1704  // See MPSolver::SetCallback() for details.
1705  virtual void SetCallback(MPCallback* mp_callback) {
1706  LOG(FATAL) << "Callbacks not supported for this solver.";
1707  }
1708 
1709  virtual bool SupportsCallbacks() const { return false; }
1710 
1711  friend class MPSolver;
1712 
1713  // To access the maximize_ bool and the MPSolver.
1714  friend class MPConstraint;
1715  friend class MPObjective;
1716 
1717  protected:
1719  // Indicates whether the model and the solution are synchronized.
1721  // Indicates whether the solve has reached optimality,
1722  // infeasibility, a limit, etc.
1724  // Optimization direction.
1726 
1727  // Index in MPSolver::variables_ of last constraint extracted.
1729  // Index in MPSolver::constraints_ of last variable extracted.
1731 
1732  // The value of the objective function.
1734 
1735  // The value of the best objective bound. Used only for MIP solvers.
1737 
1738  // Boolean indicator for the verbosity of the solver output.
1739  bool quiet_;
1740 
1741  // Index of dummy variable created for empty constraints or the
1742  // objective offset.
1743  static const int kDummyVariableIndex;
1744 
1745  // Extracts model stored in MPSolver.
1747  // Extracts the variables that have not been extracted yet.
1748  virtual void ExtractNewVariables() = 0;
1749  // Extracts the constraints that have not been extracted yet.
1750  virtual void ExtractNewConstraints() = 0;
1751  // Extracts the objective.
1752  virtual void ExtractObjective() = 0;
1753  // Resets the extraction information.
1755  // Change synchronization status from SOLUTION_SYNCHRONIZED to
1756  // MODEL_SYNCHRONIZED. To be used for model changes.
1758 
1759  // Sets parameters common to LP and MIP in the underlying solver.
1761  // Sets MIP specific parameters in the underlying solver.
1763  // Sets all parameters in the underlying solver.
1764  virtual void SetParameters(const MPSolverParameters& param) = 0;
1765  // Sets an unsupported double parameter.
1767  // Sets an unsupported integer parameter.
1770  // Sets a supported double parameter to an unsupported value.
1772  double value);
1773  // Sets a supported integer parameter to an unsupported value.
1775  MPSolverParameters::IntegerParam param, int value);
1776  // Sets each parameter in the underlying solver.
1777  virtual void SetRelativeMipGap(double value) = 0;
1778  virtual void SetPrimalTolerance(double value) = 0;
1779  virtual void SetDualTolerance(double value) = 0;
1780  virtual void SetPresolveMode(int value) = 0;
1781 
1782  // Sets the number of threads to be used by the solver.
1783  virtual absl::Status SetNumThreads(int num_threads);
1784 
1785  // Pass solver specific parameters in text format. The format is
1786  // solver-specific and is the same as the corresponding solver configuration
1787  // file format. Returns true if the operation was successful.
1788  //
1789  // Default implementation returns true if the input is empty. It returns false
1790  // and logs a WARNING if the input is not empty.
1792  const std::string& parameters);
1793 
1794  // Sets the scaling mode.
1795  virtual void SetScalingMode(int value) = 0;
1796  virtual void SetLpAlgorithm(int value) = 0;
1797 };
1798 
1799 } // namespace operations_research
1800 
1801 #endif // OR_TOOLS_LINEAR_SOLVER_LINEAR_SOLVER_H_
LinearExpr models a quantity that is linear in the decision variables (MPVariable) of an optimization...
Definition: linear_expr.h:114
An expression of the form:
Definition: linear_expr.h:192
The class for constraints of a Mathematical Programming (MP) model.
void SetBounds(double lb, double ub)
Sets both the lower and upper bounds.
void SetCoefficient(const MPVariable *const var, double coeff)
Sets the coefficient of the variable on the constraint.
double GetCoefficient(const MPVariable *const var) const
Gets the coefficient of a given variable on the constraint (which is 0 if the variable does not appea...
void SetUB(double ub)
Sets the upper bound.
double ub() const
Returns the upper bound.
const MPVariable * indicator_variable() const
const absl::flat_hash_map< const MPVariable *, double > & terms() const
Returns a map from variables to their coefficients in the constraint.
MPConstraint(int index, double lb, double ub, const std::string &name, MPSolverInterface *const interface_in)
void Clear()
Clears all variables and coefficients. Does not clear the bounds.
bool is_lazy() const
Advanced usage: returns true if the constraint is "lazy" (see below).
void set_is_lazy(bool laziness)
Advanced usage: sets the constraint "laziness".
int index() const
Returns the index of the constraint in the MPSolver::constraints_.
double lb() const
Returns the lower bound.
void set_dual_value(double dual_value)
const std::string & name() const
Returns the name of the constraint.
void SetLB(double lb)
Sets the lower bound.
MPSolver::BasisStatus basis_status() const
Advanced usage: returns the basis status of the constraint.
double dual_value() const
Advanced usage: returns the dual value of the constraint in the current solution (only available for ...
A class to express a linear objective.
void SetMaximization()
Sets the optimization direction to maximize.
void SetCoefficient(const MPVariable *const var, double coeff)
Sets the coefficient of the variable in the objective.
double GetCoefficient(const MPVariable *const var) const
Gets the coefficient of a given variable in the objective.
void SetOffset(double value)
Sets the constant term in the objective.
bool maximization() const
Is the optimization direction set to maximize?
void OptimizeLinearExpr(const LinearExpr &linear_expr, bool is_maximization)
Resets the current objective to take the value of linear_expr, and sets the objective direction to ma...
void AddLinearExpr(const LinearExpr &linear_expr)
Adds linear_expr to the current objective, does not change the direction.
const absl::flat_hash_map< const MPVariable *, double > & terms() const
Returns a map from variables to their coefficients in the objective.
void MinimizeLinearExpr(const LinearExpr &linear_expr)
Resets the current objective to minimize linear_expr.
double Value() const
Returns the objective value of the best solution found so far.
double offset() const
Gets the constant term in the objective.
double BestBound() const
Returns the best objective bound.
bool minimization() const
Is the optimization direction set to minimize?
void Clear()
Clears the offset, all variables and coefficients, and the optimization direction.
void SetMinimization()
Sets the optimization direction to minimize.
void MaximizeLinearExpr(const LinearExpr &linear_expr)
Resets the current objective to maximize linear_expr.
void SetOptimizationDirection(bool maximize)
Sets the optimization direction (maximize: true or minimize: false).
This mathematical programming (MP) solver class is the main class though which users build and solve ...
void FillSolutionResponseProto(MPSolutionResponse *response) const
Encodes the current solution in a solution response protocol buffer.
int NumConstraints() const
Returns the number of constraints.
MPConstraint * MakeRowConstraint(const LinearRange &range)
Creates a constraint owned by MPSolver enforcing: range.lower_bound() <= range.linear_expr() <= range...
MPConstraint * MakeRowConstraint(double lb, double ub)
Creates a linear constraint with given bounds.
void * underlying_solver()
Advanced usage: returns the underlying solver.
ABSL_MUST_USE_RESULT bool NextSolution()
Some solvers (MIP only, not LP) can produce multiple solutions to the problem.
const std::string & Name() const
Returns the name of the model set at construction.
MPConstraint * constraint(int index) const
Returns the constraint at the given index.
void MakeBoolVarArray(int nb, const std::string &name, std::vector< MPVariable * > *vars)
Creates an array of boolean variables.
MPVariable * MakeBoolVar(const std::string &name)
Creates a boolean variable.
MPObjective * MutableObjective()
Returns the mutable objective object.
bool VerifySolution(double tolerance, bool log_errors) const
Advanced usage: Verifies the correctness of the solution.
MPConstraint * MakeRowConstraint(const std::string &name)
Creates a named constraint with -infinity and +infinity bounds.
MPVariable * MakeIntVar(double lb, double ub, const std::string &name)
Creates an integer variable.
const std::vector< MPVariable * > & variables() const
Returns the array of variables handled by the MPSolver.
static MPSolver * CreateSolver(const std::string &solver_id)
Recommended factory method to create a MPSolver instance, especially in non C++ languages.
absl::Duration DurationSinceConstruction() const
void Reset()
Advanced usage: resets extracted model to solve from scratch.
static bool ParseSolverType(absl::string_view solver_id, OptimizationProblemType *type)
Parses the name of the solver.
static OptimizationProblemType ParseSolverTypeOrDie(const std::string &solver_id)
Parses the name of the solver and returns the correct optimization type or dies.
int64_t iterations() const
Returns the number of simplex iterations.
void SetStartingLpBasis(const std::vector< MPSolver::BasisStatus > &variable_statuses, const std::vector< MPSolver::BasisStatus > &constraint_statuses)
Advanced usage: Incrementality.
void SetHint(std::vector< std::pair< const MPVariable *, double > > hint)
Sets a hint for solution.
double ComputeExactConditionNumber() const
Advanced usage: computes the exact condition number of the current scaled basis: L1norm(B) * L1norm(i...
const MPObjective & Objective() const
Returns the objective object.
ResultStatus
The status of solving the problem.
@ FEASIBLE
feasible, or stopped by limit.
@ NOT_SOLVED
not been solved yet.
@ INFEASIBLE
proven infeasible.
@ UNBOUNDED
proven unbounded.
@ ABNORMAL
abnormal, i.e., error of some kind.
@ MODEL_INVALID
the model is trivially invalid (NaN coefficients, etc).
MPConstraint * MakeRowConstraint(double lb, double ub, const std::string &name)
Creates a named constraint with given bounds.
const std::vector< MPConstraint * > & constraints() const
Returns the array of constraints handled by the MPSolver.
void MakeNumVarArray(int nb, double lb, double ub, const std::string &name, std::vector< MPVariable * > *vars)
Creates an array of continuous variables.
void MakeVarArray(int nb, double lb, double ub, bool integer, const std::string &name_prefix, std::vector< MPVariable * > *vars)
Creates an array of variables.
MPVariable * MakeVar(double lb, double ub, bool integer, const std::string &name)
Creates a variable with the given bounds, integrality requirement and name.
void set_time_limit(int64_t time_limit_milliseconds)
OptimizationProblemType
The type of problems (LP or MIP) that will be solved and the underlying solver (GLOP,...
bool SetSolverSpecificParametersAsString(const std::string &parameters)
Advanced usage: pass solver specific parameters in text format.
absl::Status SetNumThreads(int num_threads)
Sets the number of threads to use by the underlying solver.
std::string SolverVersion() const
Returns a string describing the underlying solver and its version.
void ExportModelToProto(MPModelProto *output_model) const
Exports model to protocol buffer.
int GetNumThreads() const
Returns the number of threads to be used during solve.
void MakeIntVarArray(int nb, double lb, double ub, const std::string &name, std::vector< MPVariable * > *vars)
Creates an array of integer variables.
static double infinity()
Infinity.
std::string GetSolverSpecificParametersAsString() const
MPVariable * LookupVariableOrNull(const std::string &var_name) const
Looks up a variable by name, and returns nullptr if it does not exist.
static void SolveWithProto(const MPModelRequest &model_request, MPSolutionResponse *response)
Solves the model encoded by a MPModelRequest protocol buffer and fills the solution encoded as a MPSo...
int NumVariables() const
Returns the number of variables.
absl::Status ClampSolutionWithinBounds()
Resets values of out of bound variables to the corresponding bound and returns an error if any of the...
ResultStatus Solve()
Solves the problem using the default parameter values.
bool OwnsVariable(const MPVariable *var) const
int64_t nodes() const
Returns the number of branch-and-bound nodes evaluated during the solve.
void Clear()
Clears the objective (including the optimization direction), all variables and constraints.
bool ExportModelAsLpFormat(bool obfuscate, std::string *model_str) const
Shortcuts to the homonymous MPModelProtoExporter methods, via exporting to a MPModelProto with Export...
ResultStatus Solve(const MPSolverParameters &param)
Solves the problem using the specified parameter values.
void Write(const std::string &file_name)
Writes the model using the solver internal write function.
void SetCallback(MPCallback *mp_callback)
MPSolverResponseStatus LoadModelFromProto(const MPModelProto &input_model, std::string *error_message)
Loads model from protocol buffer.
std::vector< double > ComputeConstraintActivities() const
Advanced usage: compute the "activities" of all constraints, which are the sums of their linear terms...
bool OutputIsEnabled() const
Controls (or queries) the amount of output produced by the underlying solver.
bool ExportModelAsMpsFormat(bool fixed_format, bool obfuscate, std::string *model_str) const
MPConstraint * MakeRowConstraint()
Creates a constraint with -infinity and +infinity bounds.
MPConstraint * LookupConstraintOrNull(const std::string &constraint_name) const
Looks up a constraint by name, and returns nullptr if it does not exist.
bool InterruptSolve()
Interrupts the Solve() execution to terminate processing if possible.
MPVariable * variable(int index) const
Returns the variable at position index.
MPSolver(const std::string &name, OptimizationProblemType problem_type)
Create a solver with the given name and underlying solver backend.
void EnableOutput()
Enables solver logging.
void SuppressOutput()
Suppresses solver logging.
absl::Status LoadSolutionFromProto(const MPSolutionResponse &response, double tolerance=kDefaultPrimalTolerance)
Load a solution encoded in a protocol buffer onto this solver for easy access via the MPSolver interf...
MPVariable * MakeNumVar(double lb, double ub, const std::string &name)
Creates a continuous variable.
MPSolverResponseStatus LoadModelFromProtoWithUniqueNamesOrDie(const MPModelProto &input_model, std::string *error_message)
Loads model from protocol buffer.
virtual OptimizationProblemType ProblemType() const
Returns the optimization problem type set at construction.
absl::Duration TimeLimit() const
static bool SupportsProblemType(OptimizationProblemType problem_type)
Whether the given problem type is supported (this will depend on the targets that you linked).
MPConstraint * MakeRowConstraint(const LinearRange &range, const std::string &name)
As above, but also names the constraint.
BasisStatus
Advanced usage: possible basis status values for a variable and the slack variable of a linear constr...
void SetTimeLimit(absl::Duration time_limit)
virtual void SetLpAlgorithm(int value)=0
virtual absl::Status SetNumThreads(int num_threads)
virtual void SetUnsupportedIntegerParam(MPSolverParameters::IntegerParam param)
void SetUnsupportedDoubleParam(MPSolverParameters::DoubleParam param)
virtual void Write(const std::string &filename)
void set_constraint_as_extracted(int ct_index, bool extracted)
virtual bool AddIndicatorConstraint(MPConstraint *const ct)
virtual void AddVariable(MPVariable *const var)=0
void SetMIPParameters(const MPSolverParameters &param)
virtual bool IsContinuous() const =0
virtual int64_t iterations() const =0
virtual int64_t nodes() const =0
MPSolverInterface(MPSolver *const solver)
bool constraint_is_extracted(int ct_index) const
virtual void SetVariableBounds(int index, double lb, double ub)=0
virtual void SetPrimalTolerance(double value)=0
static constexpr int64_t kUnknownNumberOfNodes
virtual void BranchingPriorityChangedForVariable(int var_index)
virtual void SetParameters(const MPSolverParameters &param)=0
virtual void SetRelativeMipGap(double value)=0
virtual void SetIntegerParamToUnsupportedValue(MPSolverParameters::IntegerParam param, int value)
virtual void SetOptimizationDirection(bool maximize)=0
virtual MPSolver::BasisStatus column_status(int variable_index) const =0
virtual void SetScalingMode(int value)=0
virtual MPSolver::BasisStatus row_status(int constraint_index) const =0
virtual std::string SolverVersion() const =0
virtual void ClearConstraint(MPConstraint *const constraint)=0
virtual void SetObjectiveOffset(double value)=0
virtual absl::optional< MPSolutionResponse > DirectlySolveProto(const MPModelRequest &request)
virtual void SetStartingLpBasis(const std::vector< MPSolver::BasisStatus > &variable_statuses, const std::vector< MPSolver::BasisStatus > &constraint_statuses)
virtual void SetVariableInteger(int index, bool integer)=0
virtual bool SetSolverSpecificParametersAsString(const std::string &parameters)
virtual void SetCallback(MPCallback *mp_callback)
bool variable_is_extracted(int var_index) const
virtual void SetDualTolerance(double value)=0
virtual bool CheckSolutionExists() const
virtual void SetPresolveMode(int value)=0
static constexpr int64_t kUnknownNumberOfIterations
virtual MPSolver::ResultStatus Solve(const MPSolverParameters &param)=0
MPSolver::ResultStatus result_status() const
virtual void SetCoefficient(MPConstraint *const constraint, const MPVariable *const variable, double new_value, double old_value)=0
virtual void SetObjectiveCoefficient(const MPVariable *const variable, double coefficient)=0
void SetDoubleParamToUnsupportedValue(MPSolverParameters::DoubleParam param, double value)
void set_variable_as_extracted(int var_index, bool extracted)
virtual void SetConstraintBounds(int index, double lb, double ub)=0
virtual double ComputeExactConditionNumber() const
void SetCommonParameters(const MPSolverParameters &param)
virtual void AddRowConstraint(MPConstraint *const ct)=0
This class stores parameter settings for LP and MIP solvers.
void ResetIntegerParam(MPSolverParameters::IntegerParam param)
Sets an integer parameter to its default value (default value defined in MPSolverParameters if it exi...
void SetDoubleParam(MPSolverParameters::DoubleParam param, double value)
Sets a double parameter to a specific value.
IncrementalityValues
Advanced usage: Incrementality options.
@ INCREMENTALITY_OFF
Start solve from scratch.
@ INCREMENTALITY_ON
Reuse results from previous solve as much as the underlying solver allows.
ScalingValues
Advanced usage: Scaling options.
void Reset()
Sets all parameters to their default value.
DoubleParam
Enumeration of parameters that take continuous values.
@ DUAL_TOLERANCE
Advanced usage: tolerance for dual feasibility of basic solutions.
@ PRIMAL_TOLERANCE
Advanced usage: tolerance for primal feasibility of basic solutions.
@ RELATIVE_MIP_GAP
Limit for relative MIP gap.
static const IncrementalityValues kDefaultIncrementality
double GetDoubleParam(MPSolverParameters::DoubleParam param) const
Returns the value of a double parameter.
IntegerParam
Enumeration of parameters that take integer or categorical values.
@ LP_ALGORITHM
Algorithm to solve linear programs.
@ SCALING
Advanced usage: enable or disable matrix scaling.
@ PRESOLVE
Advanced usage: presolve mode.
@ INCREMENTALITY
Advanced usage: incrementality from one solve to the next.
PresolveValues
For each categorical parameter, enumeration of possible values.
void SetIntegerParam(MPSolverParameters::IntegerParam param, int value)
Sets a integer parameter to a specific value.
int GetIntegerParam(MPSolverParameters::IntegerParam param) const
Returns the value of an integer parameter.
static const PresolveValues kDefaultPresolve
MPSolverParameters()
The constructor sets all parameters to their default value.
void ResetDoubleParam(MPSolverParameters::DoubleParam param)
Sets a double parameter to its default value (default value defined in MPSolverParameters if it exist...
The class for variables of a Mathematical Programming (MP) model.
void SetBounds(double lb, double ub)
Sets both the lower and upper bounds.
double unrounded_solution_value() const
Advanced usage: unrounded solution value.
int branching_priority() const
Advanced usage: Certain MIP solvers (e.g.
void set_solution_value(double value)
void SetBranchingPriority(int priority)
void SetUB(double ub)
Sets the upper bound.
double ub() const
Returns the upper bound.
double reduced_cost() const
Advanced usage: returns the reduced cost of the variable in the current solution (only available for ...
void SetInteger(bool integer)
Sets the integrality requirement of the variable.
MPVariable(int index, double lb, double ub, bool integer, const std::string &name, MPSolverInterface *const interface_in)
void set_reduced_cost(double reduced_cost)
bool integer() const
Returns the integrality requirement of the variable.
int index() const
Returns the index of the variable in the MPSolver::variables_.
double lb() const
Returns the lower bound.
const std::string & name() const
Returns the name of the variable.
void SetLB(double lb)
Sets the lower bound.
double solution_value() const
Returns the value of the variable in the current solution.
MPSolver::BasisStatus basis_status() const
Advanced usage: returns the basis status of the variable in the current solution (only available for ...
This file allows you to write natural code (like a mathematical equation) to model optimization probl...
ABSL_DECLARE_FLAG(bool, linear_solver_enable_verbose_output)
constexpr double kDefaultPrimalTolerance
bool MPSolverResponseStatusIsRpcError(MPSolverResponseStatus status)
bool AbslParseFlag(absl::string_view text, MPSolver::OptimizationProblemType *solver_type, std::string *error)
bool SolverTypeIsMip(MPModelRequest::SolverType solver_type)
std::ostream & operator<<(std::ostream &stream, const LinearExpr &linear_expr)
std::string AbslUnparseFlag(MPSolver::OptimizationProblemType solver_type)
const absl::string_view ToString(MPSolver::OptimizationProblemType optimization_problem_type)