C++ Reference

C++ Reference: Linear solver

linear_solver.h
Go to the documentation of this file.
1 // Copyright 2010-2018 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 <functional>
138 #include <limits>
139 #include <map>
140 #include <memory>
141 #include <string>
142 #include <utility>
143 #include <vector>
144 
145 #include "absl/container/flat_hash_map.h"
146 #include "absl/status/status.h"
147 #include "absl/strings/match.h"
148 #include "absl/strings/str_format.h"
149 #include "absl/types/optional.h"
150 #include "ortools/base/commandlineflags.h"
151 #include "ortools/base/integral_types.h"
152 #include "ortools/base/logging.h"
153 #include "ortools/base/macros.h"
154 #include "ortools/base/timer.h"
157 #include "ortools/linear_solver/linear_solver_callback.h"
158 #include "ortools/port/proto_utils.h"
159 
160 ABSL_DECLARE_FLAG(bool, linear_solver_enable_verbose_output);
161 
162 namespace operations_research {
163 
164 constexpr double kDefaultPrimalTolerance = 1e-07;
165 
166 class MPConstraint;
167 class MPObjective;
168 class MPSolverInterface;
169 class MPSolverParameters;
170 class MPVariable;
171 
172 // There is a homonymous version taking a MPSolver::OptimizationProblemType.
173 bool SolverTypeIsMip(MPModelRequest::SolverType solver_type);
174 
179 class MPSolver {
180  public:
188  // Linear programming problems.
189  // ----------------------------
192  GLOP_LINEAR_PROGRAMMING = 2, // Recommended default value. Made in Google.
193 
194  // Integer programming problems.
195  // -----------------------------
196  SCIP_MIXED_INTEGER_PROGRAMMING = 3, // Recommended default value.
199 
200  // Commercial software (need license).
207 
208  // Boolean optimization problem (requires only integer variables and works
209  // best with only Boolean variables).
211 
212  // SAT based solver (requires only integer and Boolean variables).
213  // If you pass it mixed integer problems, it will scale coefficients to
214  // integer values, and solver continuous variables as integral variables.
216 
217  // Dedicated knapsack solvers.
219  };
220 
222  MPSolver(const std::string& name, OptimizationProblemType problem_type);
223  virtual ~MPSolver();
224 
253  static MPSolver* CreateSolver(const std::string& solver_id);
254 
259  static bool SupportsProblemType(OptimizationProblemType problem_type);
260 
266  static bool ParseSolverType(absl::string_view solver_id,
268 
274  const std::string& solver_id);
275 
276  bool IsMIP() const;
277 
279  const std::string& Name() const {
280  return name_; // Set at construction.
281  }
282 
285  return problem_type_; // Set at construction.
286  }
287 
293  void Clear();
294 
296  int NumVariables() const { return variables_.size(); }
297 
302  const std::vector<MPVariable*>& variables() const { return variables_; }
303 
309  MPVariable* LookupVariableOrNull(const std::string& var_name) const;
310 
318  MPVariable* MakeVar(double lb, double ub, bool integer,
319  const std::string& name);
320 
322  MPVariable* MakeNumVar(double lb, double ub, const std::string& name);
323 
325  MPVariable* MakeIntVar(double lb, double ub, const std::string& name);
326 
328  MPVariable* MakeBoolVar(const std::string& name);
329 
344  void MakeVarArray(int nb, double lb, double ub, bool integer,
345  const std::string& name_prefix,
346  std::vector<MPVariable*>* vars);
347 
349  void MakeNumVarArray(int nb, double lb, double ub, const std::string& name,
350  std::vector<MPVariable*>* vars);
351 
353  void MakeIntVarArray(int nb, double lb, double ub, const std::string& name,
354  std::vector<MPVariable*>* vars);
355 
357  void MakeBoolVarArray(int nb, const std::string& name,
358  std::vector<MPVariable*>* vars);
359 
361  int NumConstraints() const { return constraints_.size(); }
362 
368  const std::vector<MPConstraint*>& constraints() const { return constraints_; }
369 
378  const std::string& constraint_name) const;
379 
388  MPConstraint* MakeRowConstraint(double lb, double ub);
389 
392 
394  MPConstraint* MakeRowConstraint(double lb, double ub,
395  const std::string& name);
396 
398  MPConstraint* MakeRowConstraint(const std::string& name);
399 
405 
408  const std::string& name);
409 
416  const MPObjective& Objective() const { return *objective_; }
417 
419  MPObjective* MutableObjective() { return objective_.get(); }
420 
441  NOT_SOLVED = 6
442  };
443 
446 
449 
454  void Write(const std::string& file_name);
455 
462  std::vector<double> ComputeConstraintActivities() const;
463 
482  bool VerifySolution(double tolerance, bool log_errors) const;
483 
492  void Reset();
493 
502 
510  MPSolverResponseStatus LoadModelFromProto(const MPModelProto& input_model,
511  std::string* error_message);
520  const MPModelProto& input_model, std::string* error_message);
521 
523  void FillSolutionResponseProto(MPSolutionResponse* response) const;
524 
540  static void SolveWithProto(const MPModelRequest& model_request,
541  MPSolutionResponse* response);
542 
544  void ExportModelToProto(MPModelProto* output_model) const;
545 
577  absl::Status LoadSolutionFromProto(
578  const MPSolutionResponse& response,
579  double tolerance = kDefaultPrimalTolerance);
580 
586 
593  bool ExportModelAsLpFormat(bool obfuscate, std::string* model_str) const;
594  bool ExportModelAsMpsFormat(bool fixed_format, bool obfuscate,
595  std::string* model_str) const;
596 
607  absl::Status SetNumThreads(int num_threads);
608 
610  int GetNumThreads() const { return num_threads_; }
611 
618  bool SetSolverSpecificParametersAsString(const std::string& parameters);
620  return solver_specific_parameter_string_;
621  }
622 
636  void SetHint(std::vector<std::pair<const MPVariable*, double> > hint);
637 
642  enum BasisStatus {
643  FREE = 0,
647  BASIC
648  };
649 
662  const std::vector<MPSolver::BasisStatus>& variable_statuses,
663  const std::vector<MPSolver::BasisStatus>& constraint_statuses);
664 
670  static double infinity() { return std::numeric_limits<double>::infinity(); }
671 
680  bool OutputIsEnabled() const;
681 
683  void EnableOutput();
684 
687 
688  absl::Duration TimeLimit() const { return time_limit_; }
689  void SetTimeLimit(absl::Duration time_limit) {
690  DCHECK_GE(time_limit, absl::ZeroDuration());
691  time_limit_ = time_limit;
692  }
693 
694  absl::Duration DurationSinceConstruction() const {
695  return absl::Now() - construction_time_;
696  }
697 
699  int64 iterations() const;
700 
706  int64 nodes() const;
707 
709  std::string SolverVersion() const;
710 
725 
750 
765  ABSL_MUST_USE_RESULT bool NextSolution();
766 
767  // Does not take ownership of "mp_callback".
768  //
769  // As of 2019-10-22, only SCIP and Gurobi support Callbacks.
770  // SCIP does not support suggesting a heuristic solution in the callback.
771  //
772  // See go/mpsolver-callbacks for additional documentation.
773  void SetCallback(MPCallback* mp_callback);
774  bool SupportsCallbacks() const;
775 
776  // DEPRECATED: Use TimeLimit() and SetTimeLimit(absl::Duration) instead.
777  // NOTE: These deprecated functions used the convention time_limit = 0 to mean
778  // "no limit", which now corresponds to time_limit_ = InfiniteDuration().
779  int64 time_limit() const {
780  return time_limit_ == absl::InfiniteDuration()
781  ? 0
782  : absl::ToInt64Milliseconds(time_limit_);
783  }
784  void set_time_limit(int64 time_limit_milliseconds) {
785  SetTimeLimit(time_limit_milliseconds == 0
786  ? absl::InfiniteDuration()
787  : absl::Milliseconds(time_limit_milliseconds));
788  }
789  double time_limit_in_secs() const {
790  return static_cast<double>(time_limit()) / 1000.0;
791  }
792 
793  // DEPRECATED: Use DurationSinceConstruction() instead.
794  int64 wall_time() const {
795  return absl::ToInt64Milliseconds(DurationSinceConstruction());
796  }
797 
798  // Supports search and loading Gurobi shared library.
799  static bool LoadGurobiSharedLibrary();
800  static void SetGurobiLibraryPath(const std::string& full_library_path);
801 
802  friend class GLPKInterface;
803  friend class CLPInterface;
804  friend class CBCInterface;
805  friend class SCIPInterface;
806  friend class GurobiInterface;
807  friend class CplexInterface;
808  friend class XpressInterface;
809  friend class SLMInterface;
810  friend class MPSolverInterface;
811  friend class GLOPInterface;
812  friend class BopInterface;
813  friend class SatInterface;
814  friend class KnapsackInterface;
815 
816  // Debugging: verify that the given MPVariable* belongs to this solver.
817  bool OwnsVariable(const MPVariable* var) const;
818 
819  private:
820  // Computes the size of the constraint with the largest number of
821  // coefficients with index in [min_constraint_index,
822  // max_constraint_index)
823  int ComputeMaxConstraintSize(int min_constraint_index,
824  int max_constraint_index) const;
825 
826  // Returns true if the model has constraints with lower bound > upper bound.
827  bool HasInfeasibleConstraints() const;
828 
829  // Returns true if the model has at least 1 integer variable.
830  bool HasIntegerVariables() const;
831 
832  // Generates the map from variable names to their indices.
833  void GenerateVariableNameIndex() const;
834 
835  // Generates the map from constraint names to their indices.
836  void GenerateConstraintNameIndex() const;
837 
838  // Checks licenses for commercial solver, and checks shared library loading
839  // for or-tools.
840  static bool GurobiIsCorrectlyInstalled();
841 
842  // The name of the linear programming problem.
843  const std::string name_;
844 
845  // The type of the linear programming problem.
846  const OptimizationProblemType problem_type_;
847 
848  // The solver interface.
849  std::unique_ptr<MPSolverInterface> interface_;
850 
851  // The vector of variables in the problem.
852  std::vector<MPVariable*> variables_;
853  // A map from a variable's name to its index in variables_.
854  mutable absl::optional<absl::flat_hash_map<std::string, int> >
855  variable_name_to_index_;
856  // Whether variables have been extracted to the underlying interface.
857  std::vector<bool> variable_is_extracted_;
858 
859  // The vector of constraints in the problem.
860  std::vector<MPConstraint*> constraints_;
861  // A map from a constraint's name to its index in constraints_.
862  mutable absl::optional<absl::flat_hash_map<std::string, int> >
863  constraint_name_to_index_;
864  // Whether constraints have been extracted to the underlying interface.
865  std::vector<bool> constraint_is_extracted_;
866 
867  // The linear objective function.
868  std::unique_ptr<MPObjective> objective_;
869 
870  // Initial values for all or some of the problem variables that can be
871  // exploited as a starting hint by a solver.
872  //
873  // Note(user): as of 05/05/2015, we can't use >> because of some SWIG errors.
874  //
875  // TODO(user): replace by two vectors, a std::vector<bool> to indicate if a
876  // hint is provided and a std::vector<double> for the hint value.
877  std::vector<std::pair<const MPVariable*, double> > solution_hint_;
878 
879  absl::Duration time_limit_ = absl::InfiniteDuration(); // Default = No limit.
880 
881  const absl::Time construction_time_;
882 
883  // Permanent storage for the number of threads.
884  int num_threads_ = 1;
885 
886  // Permanent storage for SetSolverSpecificParametersAsString().
887  std::string solver_specific_parameter_string_;
888 
889  MPSolverResponseStatus LoadModelFromProtoInternal(
890  const MPModelProto& input_model, bool clear_names,
891  bool check_model_validity, std::string* error_message);
892 
893  DISALLOW_COPY_AND_ASSIGN(MPSolver);
894 };
895 
897  return SolverTypeIsMip(static_cast<MPModelRequest::SolverType>(solver_type));
898 }
899 
900 const absl::string_view ToString(
901  MPSolver::OptimizationProblemType optimization_problem_type);
902 
903 inline std::ostream& operator<<(
904  std::ostream& os,
905  MPSolver::OptimizationProblemType optimization_problem_type) {
906  return os << ToString(optimization_problem_type);
907 }
908 
909 inline std::ostream& operator<<(std::ostream& os,
910  MPSolver::ResultStatus status) {
911  return os << ProtoEnumToString<MPSolverResponseStatus>(
912  static_cast<MPSolverResponseStatus>(status));
913 }
914 
915 bool AbslParseFlag(absl::string_view text,
917  std::string* error);
918 
919 inline std::string AbslUnparseFlag(
920  MPSolver::OptimizationProblemType solver_type) {
921  return std::string(ToString(solver_type));
922 }
923 
925 class MPObjective {
926  public:
931  void Clear();
932 
939  void SetCoefficient(const MPVariable* const var, double coeff);
940 
946  double GetCoefficient(const MPVariable* const var) const;
947 
953  const absl::flat_hash_map<const MPVariable*, double>& terms() const {
954  return coefficients_;
955  }
956 
958  void SetOffset(double value);
959 
961  double offset() const { return offset_; }
962 
967  void OptimizeLinearExpr(const LinearExpr& linear_expr, bool is_maximization);
968 
970  void MaximizeLinearExpr(const LinearExpr& linear_expr) {
971  OptimizeLinearExpr(linear_expr, true);
972  }
974  void MinimizeLinearExpr(const LinearExpr& linear_expr) {
975  OptimizeLinearExpr(linear_expr, false);
976  }
977 
979  void AddLinearExpr(const LinearExpr& linear_expr);
980 
982  void SetOptimizationDirection(bool maximize);
983 
986 
989 
991  bool maximization() const;
992 
994  bool minimization() const;
995 
1007  double Value() const;
1008 
1015  double BestBound() const;
1016 
1017  private:
1018  friend class MPSolver;
1019  friend class MPSolverInterface;
1020  friend class CBCInterface;
1021  friend class CLPInterface;
1022  friend class GLPKInterface;
1023  friend class SCIPInterface;
1024  friend class SLMInterface;
1025  friend class GurobiInterface;
1026  friend class CplexInterface;
1027  friend class XpressInterface;
1028  friend class GLOPInterface;
1029  friend class BopInterface;
1030  friend class SatInterface;
1031  friend class KnapsackInterface;
1032 
1033  // Constructor. An objective points to a single MPSolverInterface
1034  // that is specified in the constructor. An objective cannot belong
1035  // to several models.
1036  // At construction, an MPObjective has no terms (which is equivalent
1037  // on having a coefficient of 0 for all variables), and an offset of 0.
1038  explicit MPObjective(MPSolverInterface* const interface_in)
1039  : interface_(interface_in), coefficients_(1), offset_(0.0) {}
1040 
1041  MPSolverInterface* const interface_;
1042 
1043  // Mapping var -> coefficient.
1044  absl::flat_hash_map<const MPVariable*, double> coefficients_;
1045  // Constant term.
1046  double offset_;
1047 
1048  DISALLOW_COPY_AND_ASSIGN(MPObjective);
1049 };
1050 
1052 class MPVariable {
1053  public:
1055  const std::string& name() const { return name_; }
1056 
1058  void SetInteger(bool integer);
1059 
1061  bool integer() const { return integer_; }
1062 
1070  double solution_value() const;
1071 
1073  int index() const { return index_; }
1074 
1076  double lb() const { return lb_; }
1077 
1079  double ub() const { return ub_; }
1080 
1082  void SetLB(double lb) { SetBounds(lb, ub_); }
1083 
1085  void SetUB(double ub) { SetBounds(lb_, ub); }
1086 
1088  void SetBounds(double lb, double ub);
1089 
1097 
1102  double reduced_cost() const;
1103 
1111 
1122  int branching_priority() const { return branching_priority_; }
1123  void SetBranchingPriority(int priority);
1124 
1125  protected:
1126  friend class MPSolver;
1127  friend class MPSolverInterface;
1128  friend class CBCInterface;
1129  friend class CLPInterface;
1130  friend class GLPKInterface;
1131  friend class SCIPInterface;
1132  friend class SLMInterface;
1133  friend class GurobiInterface;
1134  friend class CplexInterface;
1135  friend class XpressInterface;
1136  friend class GLOPInterface;
1138  friend class BopInterface;
1139  friend class SatInterface;
1140  friend class KnapsackInterface;
1141 
1142  // Constructor. A variable points to a single MPSolverInterface that
1143  // is specified in the constructor. A variable cannot belong to
1144  // several models.
1145  MPVariable(int index, double lb, double ub, bool integer,
1146  const std::string& name, MPSolverInterface* const interface_in)
1147  : index_(index),
1148  lb_(lb),
1149  ub_(ub),
1150  integer_(integer),
1151  name_(name.empty() ? absl::StrFormat("auto_v_%09d", index) : name),
1152  solution_value_(0.0),
1153  reduced_cost_(0.0),
1154  interface_(interface_in) {}
1155 
1156  void set_solution_value(double value) { solution_value_ = value; }
1157  void set_reduced_cost(double reduced_cost) { reduced_cost_ = reduced_cost; }
1158 
1159  private:
1160  const int index_;
1161  double lb_;
1162  double ub_;
1163  bool integer_;
1164  const std::string name_;
1165  double solution_value_;
1166  double reduced_cost_;
1167  int branching_priority_ = 0;
1168  MPSolverInterface* const interface_;
1169  DISALLOW_COPY_AND_ASSIGN(MPVariable);
1170 };
1171 
1178  public:
1180  const std::string& name() const { return name_; }
1181 
1183  void Clear();
1184 
1191  void SetCoefficient(const MPVariable* const var, double coeff);
1192 
1197  double GetCoefficient(const MPVariable* const var) const;
1198 
1204  const absl::flat_hash_map<const MPVariable*, double>& terms() const {
1205  return coefficients_;
1206  }
1207 
1209  double lb() const { return lb_; }
1210 
1212  double ub() const { return ub_; }
1213 
1215  void SetLB(double lb) { SetBounds(lb, ub_); }
1216 
1218  void SetUB(double ub) { SetBounds(lb_, ub); }
1219 
1221  void SetBounds(double lb, double ub);
1222 
1224  bool is_lazy() const { return is_lazy_; }
1225 
1239  void set_is_lazy(bool laziness) { is_lazy_ = laziness; }
1240 
1241  const MPVariable* indicator_variable() const { return indicator_variable_; }
1242  bool indicator_value() const { return indicator_value_; }
1243 
1245  int index() const { return index_; }
1246 
1251  double dual_value() const;
1252 
1266 
1267  protected:
1268  friend class MPSolver;
1269  friend class MPSolverInterface;
1270  friend class CBCInterface;
1271  friend class CLPInterface;
1272  friend class GLPKInterface;
1273  friend class SCIPInterface;
1274  friend class SLMInterface;
1275  friend class GurobiInterface;
1276  friend class CplexInterface;
1277  friend class XpressInterface;
1278  friend class GLOPInterface;
1279  friend class BopInterface;
1280  friend class SatInterface;
1281  friend class KnapsackInterface;
1282 
1283  // Constructor. A constraint points to a single MPSolverInterface
1284  // that is specified in the constructor. A constraint cannot belong
1285  // to several models.
1286  MPConstraint(int index, double lb, double ub, const std::string& name,
1287  MPSolverInterface* const interface_in)
1288  : coefficients_(1),
1289  index_(index),
1290  lb_(lb),
1291  ub_(ub),
1292  name_(name.empty() ? absl::StrFormat("auto_c_%09d", index) : name),
1293  is_lazy_(false),
1294  indicator_variable_(nullptr),
1295  dual_value_(0.0),
1296  interface_(interface_in) {}
1297 
1298  void set_dual_value(double dual_value) { dual_value_ = dual_value; }
1299 
1300  private:
1301  // Returns true if the constraint contains variables that have not
1302  // been extracted yet.
1303  bool ContainsNewVariables();
1304 
1305  // Mapping var -> coefficient.
1306  absl::flat_hash_map<const MPVariable*, double> coefficients_;
1307 
1308  const int index_; // See index().
1309 
1310  // The lower bound for the linear constraint.
1311  double lb_;
1312 
1313  // The upper bound for the linear constraint.
1314  double ub_;
1315 
1316  // Name.
1317  const std::string name_;
1318 
1319  // True if the constraint is "lazy", i.e. the constraint is added to the
1320  // underlying Linear Programming solver only if it is violated.
1321  // By default this parameter is 'false'.
1322  bool is_lazy_;
1323 
1324  // If given, this constraint is only active if `indicator_variable_`'s value
1325  // is equal to `indicator_value_`.
1326  const MPVariable* indicator_variable_;
1327  bool indicator_value_;
1328 
1329  double dual_value_;
1330  MPSolverInterface* const interface_;
1331  DISALLOW_COPY_AND_ASSIGN(MPConstraint);
1332 };
1333 
1361  public:
1366 
1375  DUAL_TOLERANCE = 2
1376  };
1377 
1381  PRESOLVE = 1000,
1387  SCALING = 1003
1388  };
1389 
1395  PRESOLVE_ON = 1
1396  };
1397 
1401  DUAL = 10,
1403  PRIMAL = 11,
1405  BARRIER = 12
1406  };
1407 
1412 
1417  INCREMENTALITY_ON = 1
1418  };
1419 
1425  SCALING_ON = 1
1426  };
1427 
1428  // Placeholder value to indicate that a parameter is set to
1429  // the default value defined in the wrapper.
1430  static const double kDefaultDoubleParamValue;
1431  static const int kDefaultIntegerParamValue;
1432 
1433  // Placeholder value to indicate that a parameter is unknown.
1434  static const double kUnknownDoubleParamValue;
1435  static const int kUnknownIntegerParamValue;
1436 
1437  // Default values for parameters. Only parameters that define the
1438  // properties of the solution returned need to have a default value
1439  // (that is the same for all solvers). You can also define a default
1440  // value for performance parameters when you are confident it is a
1441  // good choice (example: always turn presolve on).
1442  static const double kDefaultRelativeMipGap;
1443  static const double kDefaultPrimalTolerance;
1444  static const double kDefaultDualTolerance;
1447 
1450 
1453 
1456 
1463 
1470 
1472  void Reset();
1473 
1476 
1479 
1480  private:
1481  // Parameter value for each parameter.
1482  // @see DoubleParam
1483  // @see IntegerParam
1484  double relative_mip_gap_value_;
1485  double primal_tolerance_value_;
1486  double dual_tolerance_value_;
1487  int presolve_value_;
1488  int scaling_value_;
1489  int lp_algorithm_value_;
1490  int incrementality_value_;
1491 
1492  // Boolean value indicating whether each parameter is set to the
1493  // solver's default value. Only parameters for which the wrapper
1494  // does not define a default value need such an indicator.
1495  bool lp_algorithm_is_default_;
1496 
1497  DISALLOW_COPY_AND_ASSIGN(MPSolverParameters);
1498 };
1499 
1500 // Whether the given MPSolverResponseStatus (of a solve) would yield an RPC
1501 // error when happening on the linear solver stubby server, see
1502 // ./linear_solver_service.proto.
1503 // Note that RPC errors forbid to carry a response to the client, who can only
1504 // see the RPC error itself (error code + error message).
1506 
1507 // This class wraps the actual mathematical programming solvers. Each
1508 // solver (GLOP, CLP, CBC, GLPK, SCIP) has its own interface class that
1509 // derives from this abstract class. This class is never directly
1510 // accessed by the user.
1511 // @see glop_interface.cc
1512 // @see cbc_interface.cc
1513 // @see clp_interface.cc
1514 // @see glpk_interface.cc
1515 // @see scip_interface.cc
1517  public:
1519  // The underlying solver (CLP, GLPK, ...) and MPSolver are not in
1520  // sync for the model nor for the solution.
1522  // The underlying solver and MPSolver are in sync for the model
1523  // but not for the solution: the model has changed since the
1524  // solution was computed last.
1526  // The underlying solver and MPSolver are in sync for the model and
1527  // the solution.
1529  };
1530 
1531  // When the underlying solver does not provide the number of simplex
1532  // iterations.
1533  static constexpr int64 kUnknownNumberOfIterations = -1;
1534  // When the underlying solver does not provide the number of
1535  // branch-and-bound nodes.
1536  static constexpr int64 kUnknownNumberOfNodes = -1;
1537 
1538  // Constructor. The user will access the MPSolverInterface through the
1539  // MPSolver passed as argument.
1540  explicit MPSolverInterface(MPSolver* const solver);
1542 
1543  // ----- Solve -----
1544  // Solves problem with specified parameter values. Returns true if the
1545  // solution is optimal.
1547 
1548  // Directly solves a MPModelRequest, bypassing the MPSolver data structures
1549  // entirely. Returns {} (eg. absl::nullopt) if the feature is not supported by
1550  // the underlying solver.
1551  virtual absl::optional<MPSolutionResponse> DirectlySolveProto(
1552  const MPModelRequest& request) {
1553  return absl::nullopt;
1554  }
1555 
1556  // Writes the model using the solver internal write function. Currently only
1557  // available for GurobiInterface.
1558  virtual void Write(const std::string& filename);
1559 
1560  // ----- Model modifications and extraction -----
1561  // Resets extracted model.
1562  virtual void Reset() = 0;
1563 
1564  // Sets the optimization direction (min/max).
1565  virtual void SetOptimizationDirection(bool maximize) = 0;
1566 
1567  // Modifies bounds of an extracted variable.
1568  virtual void SetVariableBounds(int index, double lb, double ub) = 0;
1569 
1570  // Modifies integrality of an extracted variable.
1571  virtual void SetVariableInteger(int index, bool integer) = 0;
1572 
1573  // Modify bounds of an extracted variable.
1574  virtual void SetConstraintBounds(int index, double lb, double ub) = 0;
1575 
1576  // Adds a linear constraint.
1577  virtual void AddRowConstraint(MPConstraint* const ct) = 0;
1578 
1579  // Adds an indicator constraint. Returns true if the feature is supported by
1580  // the underlying solver.
1581  virtual bool AddIndicatorConstraint(MPConstraint* const ct) {
1582  LOG(ERROR) << "Solver doesn't support indicator constraints.";
1583  return false;
1584  }
1585 
1586  // Add a variable.
1587  virtual void AddVariable(MPVariable* const var) = 0;
1588 
1589  // Changes a coefficient in a constraint.
1590  virtual void SetCoefficient(MPConstraint* const constraint,
1591  const MPVariable* const variable,
1592  double new_value, double old_value) = 0;
1593 
1594  // Clears a constraint from all its terms.
1595  virtual void ClearConstraint(MPConstraint* const constraint) = 0;
1596 
1597  // Changes a coefficient in the linear objective.
1598  virtual void SetObjectiveCoefficient(const MPVariable* const variable,
1599  double coefficient) = 0;
1600 
1601  // Changes the constant term in the linear objective.
1602  virtual void SetObjectiveOffset(double value) = 0;
1603 
1604  // Clears the objective from all its terms.
1605  virtual void ClearObjective() = 0;
1606 
1607  virtual void BranchingPriorityChangedForVariable(int var_index) {}
1608  // ------ Query statistics on the solution and the solve ------
1609  // Returns the number of simplex iterations. The problem must be discrete,
1610  // otherwise it crashes, or returns kUnknownNumberOfIterations in NDEBUG mode.
1611  virtual int64 iterations() const = 0;
1612  // Returns the number of branch-and-bound nodes. The problem must be discrete,
1613  // otherwise it crashes, or returns kUnknownNumberOfNodes in NDEBUG mode.
1614  virtual int64 nodes() const = 0;
1615  // Returns the best objective bound. The problem must be discrete, otherwise
1616  // it crashes, or returns trivial bound (+/- inf) in NDEBUG mode.
1617  double best_objective_bound() const;
1618  // Returns the objective value of the best solution found so far.
1619  double objective_value() const;
1620 
1621  // Returns the basis status of a row.
1622  virtual MPSolver::BasisStatus row_status(int constraint_index) const = 0;
1623  // Returns the basis status of a constraint.
1624  virtual MPSolver::BasisStatus column_status(int variable_index) const = 0;
1625 
1626  // Checks whether the solution is synchronized with the model, i.e. whether
1627  // the model has changed since the solution was computed last.
1628  // If it isn't, it crashes in NDEBUG, and returns false othwerwise.
1630  // Checks whether a feasible solution exists. The behavior is similar to
1631  // CheckSolutionIsSynchronized() above.
1632  virtual bool CheckSolutionExists() const;
1633  // Handy shortcut to do both checks above (it is often used).
1636  }
1637 
1638  // ----- Misc -----
1639  // Queries problem type. For simplicity, the distinction between
1640  // continuous and discrete is based on the declaration of the user
1641  // when the solver is created (example: GLPK_LINEAR_PROGRAMMING
1642  // vs. GLPK_MIXED_INTEGER_PROGRAMMING), not on the actual content of
1643  // the model.
1644  // Returns true if the problem is continuous.
1645  virtual bool IsContinuous() const = 0;
1646  // Returns true if the problem is continuous and linear.
1647  virtual bool IsLP() const = 0;
1648  // Returns true if the problem is discrete and linear.
1649  virtual bool IsMIP() const = 0;
1650 
1651  // Returns the index of the last variable extracted.
1653 
1654  bool variable_is_extracted(int var_index) const {
1655  return solver_->variable_is_extracted_[var_index];
1656  }
1657  void set_variable_as_extracted(int var_index, bool extracted) {
1658  solver_->variable_is_extracted_[var_index] = extracted;
1659  }
1660  bool constraint_is_extracted(int ct_index) const {
1661  return solver_->constraint_is_extracted_[ct_index];
1662  }
1663  void set_constraint_as_extracted(int ct_index, bool extracted) {
1664  solver_->constraint_is_extracted_[ct_index] = extracted;
1665  }
1666 
1667  // Returns the boolean indicating the verbosity of the solver output.
1668  bool quiet() const { return quiet_; }
1669  // Sets the boolean indicating the verbosity of the solver output.
1670  void set_quiet(bool quiet_value) { quiet_ = quiet_value; }
1671 
1672  // Returns the result status of the last solve.
1675  return result_status_;
1676  }
1677 
1678  // Returns a string describing the underlying solver and its version.
1679  virtual std::string SolverVersion() const = 0;
1680 
1681  // Returns the underlying solver.
1682  virtual void* underlying_solver() = 0;
1683 
1684  // Computes exact condition number. Only available for continuous
1685  // problems and only implemented in GLPK.
1686  virtual double ComputeExactConditionNumber() const;
1687 
1688  // See MPSolver::SetStartingLpBasis().
1689  virtual void SetStartingLpBasis(
1690  const std::vector<MPSolver::BasisStatus>& variable_statuses,
1691  const std::vector<MPSolver::BasisStatus>& constraint_statuses) {
1692  LOG(FATAL) << "Not supported by this solver.";
1693  }
1694 
1695  virtual bool InterruptSolve() { return false; }
1696 
1697  // See MPSolver::NextSolution() for contract.
1698  virtual bool NextSolution() { return false; }
1699 
1700  // See MPSolver::SetCallback() for details.
1701  virtual void SetCallback(MPCallback* mp_callback) {
1702  LOG(FATAL) << "Callbacks not supported for this solver.";
1703  }
1704 
1705  virtual bool SupportsCallbacks() const { return false; }
1706 
1707  friend class MPSolver;
1708 
1709  // To access the maximize_ bool and the MPSolver.
1710  friend class MPConstraint;
1711  friend class MPObjective;
1712 
1713  protected:
1715  // Indicates whether the model and the solution are synchronized.
1717  // Indicates whether the solve has reached optimality,
1718  // infeasibility, a limit, etc.
1720  // Optimization direction.
1722 
1723  // Index in MPSolver::variables_ of last constraint extracted.
1725  // Index in MPSolver::constraints_ of last variable extracted.
1727 
1728  // The value of the objective function.
1730 
1731  // The value of the best objective bound. Used only for MIP solvers.
1733 
1734  // Boolean indicator for the verbosity of the solver output.
1735  bool quiet_;
1736 
1737  // Index of dummy variable created for empty constraints or the
1738  // objective offset.
1739  static const int kDummyVariableIndex;
1740 
1741  // Extracts model stored in MPSolver.
1743  // Extracts the variables that have not been extracted yet.
1744  virtual void ExtractNewVariables() = 0;
1745  // Extracts the constraints that have not been extracted yet.
1746  virtual void ExtractNewConstraints() = 0;
1747  // Extracts the objective.
1748  virtual void ExtractObjective() = 0;
1749  // Resets the extraction information.
1751  // Change synchronization status from SOLUTION_SYNCHRONIZED to
1752  // MODEL_SYNCHRONIZED. To be used for model changes.
1754 
1755  // Sets parameters common to LP and MIP in the underlying solver.
1757  // Sets MIP specific parameters in the underlying solver.
1759  // Sets all parameters in the underlying solver.
1760  virtual void SetParameters(const MPSolverParameters& param) = 0;
1761  // Sets an unsupported double parameter.
1763  // Sets an unsupported integer parameter.
1766  // Sets a supported double parameter to an unsupported value.
1768  double value);
1769  // Sets a supported integer parameter to an unsupported value.
1771  MPSolverParameters::IntegerParam param, int value);
1772  // Sets each parameter in the underlying solver.
1773  virtual void SetRelativeMipGap(double value) = 0;
1774  virtual void SetPrimalTolerance(double value) = 0;
1775  virtual void SetDualTolerance(double value) = 0;
1776  virtual void SetPresolveMode(int value) = 0;
1777 
1778  // Sets the number of threads to be used by the solver.
1779  virtual absl::Status SetNumThreads(int num_threads);
1780 
1781  // Pass solver specific parameters in text format. The format is
1782  // solver-specific and is the same as the corresponding solver configuration
1783  // file format. Returns true if the operation was successful.
1784  //
1785  // Default implementation returns true if the input is empty. It returns false
1786  // and logs a WARNING if the input is not empty.
1788  const std::string& parameters);
1789 
1790  // Sets the scaling mode.
1791  virtual void SetScalingMode(int value) = 0;
1792  virtual void SetLpAlgorithm(int value) = 0;
1793 };
1794 
1795 } // namespace operations_research
1796 
1797 #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...
static void SetGurobiLibraryPath(const std::string &full_library_path)
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.
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.
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.
int64 nodes() const
Returns the number of branch-and-bound nodes evaluated during the solve.
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.
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.
int64 iterations() const
Returns the number of simplex iterations.
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
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.
void set_time_limit(int64 time_limit_milliseconds)
MPSolver(const std::string &name, OptimizationProblemType problem_type)
Create a solver with the given name and underlying solver backend.
void EnableOutput()
Enables solver logging.
static bool LoadGurobiSharedLibrary()
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
static constexpr int64 kUnknownNumberOfNodes
virtual absl::Status SetNumThreads(int num_threads)
virtual void SetUnsupportedIntegerParam(MPSolverParameters::IntegerParam param)
static constexpr int64 kUnknownNumberOfIterations
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
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
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 int64 nodes() const =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 int64 iterations() const =0
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
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)