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 namespace operations_research {
161 
162 constexpr double kDefaultPrimalTolerance = 1e-07;
163 
164 class MPConstraint;
165 class MPObjective;
166 class MPSolverInterface;
167 class MPSolverParameters;
168 class MPVariable;
169 
170 // There is a homonymous version taking a MPSolver::OptimizationProblemType.
171 bool SolverTypeIsMip(MPModelRequest::SolverType solver_type);
172 
177 class MPSolver {
178  public:
186  // Linear programming problems.
187  // ----------------------------
190  GLOP_LINEAR_PROGRAMMING = 2, // Recommended default value. Made in Google.
191 
192  // Integer programming problems.
193  // -----------------------------
194  SCIP_MIXED_INTEGER_PROGRAMMING = 3, // Recommended default value.
197 
198  // Commercial software (need license).
205 
206  // Boolean optimization problem (requires only integer variables and works
207  // best with only Boolean variables).
209 
210  // SAT based solver (requires only integer and Boolean variables).
211  // If you pass it mixed integer problems, it will scale coefficients to
212  // integer values, and solver continuous variables as integral variables.
214 
215  // Dedicated knapsack solvers.
217  };
218 
220  MPSolver(const std::string& name, OptimizationProblemType problem_type);
221  virtual ~MPSolver();
222 
251  static MPSolver* CreateSolver(const std::string& solver_id);
252 
257  static bool SupportsProblemType(OptimizationProblemType problem_type);
258 
264  static bool ParseSolverType(absl::string_view solver_id,
266 
272  const std::string& solver_id);
273 
274  bool IsMIP() const;
275 
277  const std::string& Name() const {
278  return name_; // Set at construction.
279  }
280 
283  return problem_type_; // Set at construction.
284  }
285 
291  void Clear();
292 
294  int NumVariables() const { return variables_.size(); }
295 
300  const std::vector<MPVariable*>& variables() const { return variables_; }
301 
307  MPVariable* LookupVariableOrNull(const std::string& var_name) const;
308 
316  MPVariable* MakeVar(double lb, double ub, bool integer,
317  const std::string& name);
318 
320  MPVariable* MakeNumVar(double lb, double ub, const std::string& name);
321 
323  MPVariable* MakeIntVar(double lb, double ub, const std::string& name);
324 
326  MPVariable* MakeBoolVar(const std::string& name);
327 
342  void MakeVarArray(int nb, double lb, double ub, bool integer,
343  const std::string& name_prefix,
344  std::vector<MPVariable*>* vars);
345 
347  void MakeNumVarArray(int nb, double lb, double ub, const std::string& name,
348  std::vector<MPVariable*>* vars);
349 
351  void MakeIntVarArray(int nb, double lb, double ub, const std::string& name,
352  std::vector<MPVariable*>* vars);
353 
355  void MakeBoolVarArray(int nb, const std::string& name,
356  std::vector<MPVariable*>* vars);
357 
359  int NumConstraints() const { return constraints_.size(); }
360 
366  const std::vector<MPConstraint*>& constraints() const { return constraints_; }
367 
376  const std::string& constraint_name) const;
377 
386  MPConstraint* MakeRowConstraint(double lb, double ub);
387 
390 
392  MPConstraint* MakeRowConstraint(double lb, double ub,
393  const std::string& name);
394 
396  MPConstraint* MakeRowConstraint(const std::string& name);
397 
403 
406  const std::string& name);
407 
414  const MPObjective& Objective() const { return *objective_; }
415 
417  MPObjective* MutableObjective() { return objective_.get(); }
418 
439  NOT_SOLVED = 6
440  };
441 
444 
447 
452  void Write(const std::string& file_name);
453 
460  std::vector<double> ComputeConstraintActivities() const;
461 
480  bool VerifySolution(double tolerance, bool log_errors) const;
481 
490  void Reset();
491 
500 
508  MPSolverResponseStatus LoadModelFromProto(const MPModelProto& input_model,
509  std::string* error_message);
518  const MPModelProto& input_model, std::string* error_message);
519 
521  void FillSolutionResponseProto(MPSolutionResponse* response) const;
522 
538  static void SolveWithProto(const MPModelRequest& model_request,
539  MPSolutionResponse* response);
540 
542  void ExportModelToProto(MPModelProto* output_model) const;
543 
575  absl::Status LoadSolutionFromProto(
576  const MPSolutionResponse& response,
577  double tolerance = kDefaultPrimalTolerance);
578 
584 
591  bool ExportModelAsLpFormat(bool obfuscate, std::string* model_str) const;
592  bool ExportModelAsMpsFormat(bool fixed_format, bool obfuscate,
593  std::string* model_str) const;
594 
605  absl::Status SetNumThreads(int num_threads);
606 
608  int GetNumThreads() const { return num_threads_; }
609 
616  bool SetSolverSpecificParametersAsString(const std::string& parameters);
618  return solver_specific_parameter_string_;
619  }
620 
634  void SetHint(std::vector<std::pair<const MPVariable*, double> > hint);
635 
640  enum BasisStatus {
641  FREE = 0,
645  BASIC
646  };
647 
660  const std::vector<MPSolver::BasisStatus>& variable_statuses,
661  const std::vector<MPSolver::BasisStatus>& constraint_statuses);
662 
668  static double infinity() { return std::numeric_limits<double>::infinity(); }
669 
678  bool OutputIsEnabled() const;
679 
681  void EnableOutput();
682 
685 
686  absl::Duration TimeLimit() const { return time_limit_; }
687  void SetTimeLimit(absl::Duration time_limit) {
688  DCHECK_GE(time_limit, absl::ZeroDuration());
689  time_limit_ = time_limit;
690  }
691 
692  absl::Duration DurationSinceConstruction() const {
693  return absl::Now() - construction_time_;
694  }
695 
697  int64 iterations() const;
698 
704  int64 nodes() const;
705 
707  std::string SolverVersion() const;
708 
723 
748 
763  ABSL_MUST_USE_RESULT bool NextSolution();
764 
765  // Does not take ownership of "mp_callback".
766  //
767  // As of 2019-10-22, only SCIP and Gurobi support Callbacks.
768  // SCIP does not support suggesting a heuristic solution in the callback.
769  //
770  // See go/mpsolver-callbacks for additional documentation.
771  void SetCallback(MPCallback* mp_callback);
772  bool SupportsCallbacks() const;
773 
774  // DEPRECATED: Use TimeLimit() and SetTimeLimit(absl::Duration) instead.
775  // NOTE: These deprecated functions used the convention time_limit = 0 to mean
776  // "no limit", which now corresponds to time_limit_ = InfiniteDuration().
777  int64 time_limit() const {
778  return time_limit_ == absl::InfiniteDuration()
779  ? 0
780  : absl::ToInt64Milliseconds(time_limit_);
781  }
782  void set_time_limit(int64 time_limit_milliseconds) {
783  SetTimeLimit(time_limit_milliseconds == 0
784  ? absl::InfiniteDuration()
785  : absl::Milliseconds(time_limit_milliseconds));
786  }
787  double time_limit_in_secs() const {
788  return static_cast<double>(time_limit()) / 1000.0;
789  }
790 
791  // DEPRECATED: Use DurationSinceConstruction() instead.
792  int64 wall_time() const {
793  return absl::ToInt64Milliseconds(DurationSinceConstruction());
794  }
795 
796  // Supports search and loading Gurobi shared library.
797  static bool LoadGurobiSharedLibrary();
798  static void SetGurobiLibraryPath(const std::string &full_library_path);
799 
800  friend class GLPKInterface;
801  friend class CLPInterface;
802  friend class CBCInterface;
803  friend class SCIPInterface;
804  friend class GurobiInterface;
805  friend class CplexInterface;
806  friend class XpressInterface;
807  friend class SLMInterface;
808  friend class MPSolverInterface;
809  friend class GLOPInterface;
810  friend class BopInterface;
811  friend class SatInterface;
812  friend class KnapsackInterface;
813 
814  // Debugging: verify that the given MPVariable* belongs to this solver.
815  bool OwnsVariable(const MPVariable* var) const;
816 
817  private:
818  // Computes the size of the constraint with the largest number of
819  // coefficients with index in [min_constraint_index,
820  // max_constraint_index)
821  int ComputeMaxConstraintSize(int min_constraint_index,
822  int max_constraint_index) const;
823 
824  // Returns true if the model has constraints with lower bound > upper bound.
825  bool HasInfeasibleConstraints() const;
826 
827  // Returns true if the model has at least 1 integer variable.
828  bool HasIntegerVariables() const;
829 
830  // Generates the map from variable names to their indices.
831  void GenerateVariableNameIndex() const;
832 
833  // Generates the map from constraint names to their indices.
834  void GenerateConstraintNameIndex() const;
835 
836  // Checks licenses for commercial solver, and checks shared library loading
837  // for or-tools.
838  static bool GurobiIsCorrectlyInstalled();
839 
840  // The name of the linear programming problem.
841  const std::string name_;
842 
843  // The type of the linear programming problem.
844  const OptimizationProblemType problem_type_;
845 
846  // The solver interface.
847  std::unique_ptr<MPSolverInterface> interface_;
848 
849  // The vector of variables in the problem.
850  std::vector<MPVariable*> variables_;
851  // A map from a variable's name to its index in variables_.
852  mutable absl::optional<absl::flat_hash_map<std::string, int> >
853  variable_name_to_index_;
854  // Whether variables have been extracted to the underlying interface.
855  std::vector<bool> variable_is_extracted_;
856 
857  // The vector of constraints in the problem.
858  std::vector<MPConstraint*> constraints_;
859  // A map from a constraint's name to its index in constraints_.
860  mutable absl::optional<absl::flat_hash_map<std::string, int> >
861  constraint_name_to_index_;
862  // Whether constraints have been extracted to the underlying interface.
863  std::vector<bool> constraint_is_extracted_;
864 
865  // The linear objective function.
866  std::unique_ptr<MPObjective> objective_;
867 
868  // Initial values for all or some of the problem variables that can be
869  // exploited as a starting hint by a solver.
870  //
871  // Note(user): as of 05/05/2015, we can't use >> because of some SWIG errors.
872  //
873  // TODO(user): replace by two vectors, a std::vector<bool> to indicate if a
874  // hint is provided and a std::vector<double> for the hint value.
875  std::vector<std::pair<const MPVariable*, double> > solution_hint_;
876 
877  absl::Duration time_limit_ = absl::InfiniteDuration(); // Default = No limit.
878 
879  const absl::Time construction_time_;
880 
881  // Permanent storage for the number of threads.
882  int num_threads_ = 1;
883 
884  // Permanent storage for SetSolverSpecificParametersAsString().
885  std::string solver_specific_parameter_string_;
886 
887  MPSolverResponseStatus LoadModelFromProtoInternal(
888  const MPModelProto& input_model, bool clear_names,
889  bool check_model_validity, std::string* error_message);
890 
891  DISALLOW_COPY_AND_ASSIGN(MPSolver);
892 };
893 
895  return SolverTypeIsMip(static_cast<MPModelRequest::SolverType>(solver_type));
896 }
897 
898 const absl::string_view ToString(
899  MPSolver::OptimizationProblemType optimization_problem_type);
900 
901 inline std::ostream& operator<<(
902  std::ostream& os,
903  MPSolver::OptimizationProblemType optimization_problem_type) {
904  return os << ToString(optimization_problem_type);
905 }
906 
907 inline std::ostream& operator<<(std::ostream& os,
908  MPSolver::ResultStatus status) {
909  return os << ProtoEnumToString<MPSolverResponseStatus>(
910  static_cast<MPSolverResponseStatus>(status));
911 }
912 
913 bool AbslParseFlag(absl::string_view text,
915  std::string* error);
916 
917 inline std::string AbslUnparseFlag(
918  MPSolver::OptimizationProblemType solver_type) {
919  return std::string(ToString(solver_type));
920 }
921 
923 class MPObjective {
924  public:
929  void Clear();
930 
937  void SetCoefficient(const MPVariable* const var, double coeff);
938 
944  double GetCoefficient(const MPVariable* const var) const;
945 
951  const absl::flat_hash_map<const MPVariable*, double>& terms() const {
952  return coefficients_;
953  }
954 
956  void SetOffset(double value);
957 
959  double offset() const { return offset_; }
960 
965  void OptimizeLinearExpr(const LinearExpr& linear_expr, bool is_maximization);
966 
968  void MaximizeLinearExpr(const LinearExpr& linear_expr) {
969  OptimizeLinearExpr(linear_expr, true);
970  }
972  void MinimizeLinearExpr(const LinearExpr& linear_expr) {
973  OptimizeLinearExpr(linear_expr, false);
974  }
975 
977  void AddLinearExpr(const LinearExpr& linear_expr);
978 
980  void SetOptimizationDirection(bool maximize);
981 
984 
987 
989  bool maximization() const;
990 
992  bool minimization() const;
993 
1005  double Value() const;
1006 
1013  double BestBound() const;
1014 
1015  private:
1016  friend class MPSolver;
1017  friend class MPSolverInterface;
1018  friend class CBCInterface;
1019  friend class CLPInterface;
1020  friend class GLPKInterface;
1021  friend class SCIPInterface;
1022  friend class SLMInterface;
1023  friend class GurobiInterface;
1024  friend class CplexInterface;
1025  friend class XpressInterface;
1026  friend class GLOPInterface;
1027  friend class BopInterface;
1028  friend class SatInterface;
1029  friend class KnapsackInterface;
1030 
1031  // Constructor. An objective points to a single MPSolverInterface
1032  // that is specified in the constructor. An objective cannot belong
1033  // to several models.
1034  // At construction, an MPObjective has no terms (which is equivalent
1035  // on having a coefficient of 0 for all variables), and an offset of 0.
1036  explicit MPObjective(MPSolverInterface* const interface_in)
1037  : interface_(interface_in), coefficients_(1), offset_(0.0) {}
1038 
1039  MPSolverInterface* const interface_;
1040 
1041  // Mapping var -> coefficient.
1042  absl::flat_hash_map<const MPVariable*, double> coefficients_;
1043  // Constant term.
1044  double offset_;
1045 
1046  DISALLOW_COPY_AND_ASSIGN(MPObjective);
1047 };
1048 
1050 class MPVariable {
1051  public:
1053  const std::string& name() const { return name_; }
1054 
1056  void SetInteger(bool integer);
1057 
1059  bool integer() const { return integer_; }
1060 
1068  double solution_value() const;
1069 
1071  int index() const { return index_; }
1072 
1074  double lb() const { return lb_; }
1075 
1077  double ub() const { return ub_; }
1078 
1080  void SetLB(double lb) { SetBounds(lb, ub_); }
1081 
1083  void SetUB(double ub) { SetBounds(lb_, ub); }
1084 
1086  void SetBounds(double lb, double ub);
1087 
1095 
1100  double reduced_cost() const;
1101 
1109 
1120  int branching_priority() const { return branching_priority_; }
1121  void SetBranchingPriority(int priority);
1122 
1123  protected:
1124  friend class MPSolver;
1125  friend class MPSolverInterface;
1126  friend class CBCInterface;
1127  friend class CLPInterface;
1128  friend class GLPKInterface;
1129  friend class SCIPInterface;
1130  friend class SLMInterface;
1131  friend class GurobiInterface;
1132  friend class CplexInterface;
1133  friend class XpressInterface;
1134  friend class GLOPInterface;
1136  friend class BopInterface;
1137  friend class SatInterface;
1138  friend class KnapsackInterface;
1139 
1140  // Constructor. A variable points to a single MPSolverInterface that
1141  // is specified in the constructor. A variable cannot belong to
1142  // several models.
1143  MPVariable(int index, double lb, double ub, bool integer,
1144  const std::string& name, MPSolverInterface* const interface_in)
1145  : index_(index),
1146  lb_(lb),
1147  ub_(ub),
1148  integer_(integer),
1149  name_(name.empty() ? absl::StrFormat("auto_v_%09d", index) : name),
1150  solution_value_(0.0),
1151  reduced_cost_(0.0),
1152  interface_(interface_in) {}
1153 
1154  void set_solution_value(double value) { solution_value_ = value; }
1155  void set_reduced_cost(double reduced_cost) { reduced_cost_ = reduced_cost; }
1156 
1157  private:
1158  const int index_;
1159  double lb_;
1160  double ub_;
1161  bool integer_;
1162  const std::string name_;
1163  double solution_value_;
1164  double reduced_cost_;
1165  int branching_priority_ = 0;
1166  MPSolverInterface* const interface_;
1167  DISALLOW_COPY_AND_ASSIGN(MPVariable);
1168 };
1169 
1176  public:
1178  const std::string& name() const { return name_; }
1179 
1181  void Clear();
1182 
1189  void SetCoefficient(const MPVariable* const var, double coeff);
1190 
1195  double GetCoefficient(const MPVariable* const var) const;
1196 
1202  const absl::flat_hash_map<const MPVariable*, double>& terms() const {
1203  return coefficients_;
1204  }
1205 
1207  double lb() const { return lb_; }
1208 
1210  double ub() const { return ub_; }
1211 
1213  void SetLB(double lb) { SetBounds(lb, ub_); }
1214 
1216  void SetUB(double ub) { SetBounds(lb_, ub); }
1217 
1219  void SetBounds(double lb, double ub);
1220 
1222  bool is_lazy() const { return is_lazy_; }
1223 
1237  void set_is_lazy(bool laziness) { is_lazy_ = laziness; }
1238 
1239  const MPVariable* indicator_variable() const { return indicator_variable_; }
1240  bool indicator_value() const { return indicator_value_; }
1241 
1243  int index() const { return index_; }
1244 
1249  double dual_value() const;
1250 
1264 
1265  protected:
1266  friend class MPSolver;
1267  friend class MPSolverInterface;
1268  friend class CBCInterface;
1269  friend class CLPInterface;
1270  friend class GLPKInterface;
1271  friend class SCIPInterface;
1272  friend class SLMInterface;
1273  friend class GurobiInterface;
1274  friend class CplexInterface;
1275  friend class XpressInterface;
1276  friend class GLOPInterface;
1277  friend class BopInterface;
1278  friend class SatInterface;
1279  friend class KnapsackInterface;
1280 
1281  // Constructor. A constraint points to a single MPSolverInterface
1282  // that is specified in the constructor. A constraint cannot belong
1283  // to several models.
1284  MPConstraint(int index, double lb, double ub, const std::string& name,
1285  MPSolverInterface* const interface_in)
1286  : coefficients_(1),
1287  index_(index),
1288  lb_(lb),
1289  ub_(ub),
1290  name_(name.empty() ? absl::StrFormat("auto_c_%09d", index) : name),
1291  is_lazy_(false),
1292  indicator_variable_(nullptr),
1293  dual_value_(0.0),
1294  interface_(interface_in) {}
1295 
1296  void set_dual_value(double dual_value) { dual_value_ = dual_value; }
1297 
1298  private:
1299  // Returns true if the constraint contains variables that have not
1300  // been extracted yet.
1301  bool ContainsNewVariables();
1302 
1303  // Mapping var -> coefficient.
1304  absl::flat_hash_map<const MPVariable*, double> coefficients_;
1305 
1306  const int index_; // See index().
1307 
1308  // The lower bound for the linear constraint.
1309  double lb_;
1310 
1311  // The upper bound for the linear constraint.
1312  double ub_;
1313 
1314  // Name.
1315  const std::string name_;
1316 
1317  // True if the constraint is "lazy", i.e. the constraint is added to the
1318  // underlying Linear Programming solver only if it is violated.
1319  // By default this parameter is 'false'.
1320  bool is_lazy_;
1321 
1322  // If given, this constraint is only active if `indicator_variable_`'s value
1323  // is equal to `indicator_value_`.
1324  const MPVariable* indicator_variable_;
1325  bool indicator_value_;
1326 
1327  double dual_value_;
1328  MPSolverInterface* const interface_;
1329  DISALLOW_COPY_AND_ASSIGN(MPConstraint);
1330 };
1331 
1359  public:
1364 
1373  DUAL_TOLERANCE = 2
1374  };
1375 
1379  PRESOLVE = 1000,
1385  SCALING = 1003
1386  };
1387 
1393  PRESOLVE_ON = 1
1394  };
1395 
1399  DUAL = 10,
1401  PRIMAL = 11,
1403  BARRIER = 12
1404  };
1405 
1410 
1415  INCREMENTALITY_ON = 1
1416  };
1417 
1423  SCALING_ON = 1
1424  };
1425 
1426  // Placeholder value to indicate that a parameter is set to
1427  // the default value defined in the wrapper.
1428  static const double kDefaultDoubleParamValue;
1429  static const int kDefaultIntegerParamValue;
1430 
1431  // Placeholder value to indicate that a parameter is unknown.
1432  static const double kUnknownDoubleParamValue;
1433  static const int kUnknownIntegerParamValue;
1434 
1435  // Default values for parameters. Only parameters that define the
1436  // properties of the solution returned need to have a default value
1437  // (that is the same for all solvers). You can also define a default
1438  // value for performance parameters when you are confident it is a
1439  // good choice (example: always turn presolve on).
1440  static const double kDefaultRelativeMipGap;
1441  static const double kDefaultPrimalTolerance;
1442  static const double kDefaultDualTolerance;
1445 
1448 
1451 
1454 
1461 
1468 
1470  void Reset();
1471 
1474 
1477 
1478  private:
1479  // Parameter value for each parameter.
1480  // @see DoubleParam
1481  // @see IntegerParam
1482  double relative_mip_gap_value_;
1483  double primal_tolerance_value_;
1484  double dual_tolerance_value_;
1485  int presolve_value_;
1486  int scaling_value_;
1487  int lp_algorithm_value_;
1488  int incrementality_value_;
1489 
1490  // Boolean value indicating whether each parameter is set to the
1491  // solver's default value. Only parameters for which the wrapper
1492  // does not define a default value need such an indicator.
1493  bool lp_algorithm_is_default_;
1494 
1495  DISALLOW_COPY_AND_ASSIGN(MPSolverParameters);
1496 };
1497 
1498 // Whether the given MPSolverResponseStatus (of a solve) would yield an RPC
1499 // error when happening on the linear solver stubby server, see
1500 // ./linear_solver_service.proto.
1501 // Note that RPC errors forbid to carry a response to the client, who can only
1502 // see the RPC error itself (error code + error message).
1504 
1505 // This class wraps the actual mathematical programming solvers. Each
1506 // solver (GLOP, CLP, CBC, GLPK, SCIP) has its own interface class that
1507 // derives from this abstract class. This class is never directly
1508 // accessed by the user.
1509 // @see glop_interface.cc
1510 // @see cbc_interface.cc
1511 // @see clp_interface.cc
1512 // @see glpk_interface.cc
1513 // @see scip_interface.cc
1515  public:
1517  // The underlying solver (CLP, GLPK, ...) and MPSolver are not in
1518  // sync for the model nor for the solution.
1520  // The underlying solver and MPSolver are in sync for the model
1521  // but not for the solution: the model has changed since the
1522  // solution was computed last.
1524  // The underlying solver and MPSolver are in sync for the model and
1525  // the solution.
1527  };
1528 
1529  // When the underlying solver does not provide the number of simplex
1530  // iterations.
1531  static constexpr int64 kUnknownNumberOfIterations = -1;
1532  // When the underlying solver does not provide the number of
1533  // branch-and-bound nodes.
1534  static constexpr int64 kUnknownNumberOfNodes = -1;
1535 
1536  // Constructor. The user will access the MPSolverInterface through the
1537  // MPSolver passed as argument.
1538  explicit MPSolverInterface(MPSolver* const solver);
1540 
1541  // ----- Solve -----
1542  // Solves problem with specified parameter values. Returns true if the
1543  // solution is optimal.
1545 
1546  // Directly solves a MPModelRequest, bypassing the MPSolver data structures
1547  // entirely. Returns {} (eg. absl::nullopt) if the feature is not supported by
1548  // the underlying solver.
1549  virtual absl::optional<MPSolutionResponse> DirectlySolveProto(
1550  const MPModelRequest& request) {
1551  return absl::nullopt;
1552  }
1553 
1554  // Writes the model using the solver internal write function. Currently only
1555  // available for GurobiInterface.
1556  virtual void Write(const std::string& filename);
1557 
1558  // ----- Model modifications and extraction -----
1559  // Resets extracted model.
1560  virtual void Reset() = 0;
1561 
1562  // Sets the optimization direction (min/max).
1563  virtual void SetOptimizationDirection(bool maximize) = 0;
1564 
1565  // Modifies bounds of an extracted variable.
1566  virtual void SetVariableBounds(int index, double lb, double ub) = 0;
1567 
1568  // Modifies integrality of an extracted variable.
1569  virtual void SetVariableInteger(int index, bool integer) = 0;
1570 
1571  // Modify bounds of an extracted variable.
1572  virtual void SetConstraintBounds(int index, double lb, double ub) = 0;
1573 
1574  // Adds a linear constraint.
1575  virtual void AddRowConstraint(MPConstraint* const ct) = 0;
1576 
1577  // Adds an indicator constraint. Returns true if the feature is supported by
1578  // the underlying solver.
1579  virtual bool AddIndicatorConstraint(MPConstraint* const ct) {
1580  LOG(ERROR) << "Solver doesn't support indicator constraints.";
1581  return false;
1582  }
1583 
1584  // Add a variable.
1585  virtual void AddVariable(MPVariable* const var) = 0;
1586 
1587  // Changes a coefficient in a constraint.
1588  virtual void SetCoefficient(MPConstraint* const constraint,
1589  const MPVariable* const variable,
1590  double new_value, double old_value) = 0;
1591 
1592  // Clears a constraint from all its terms.
1593  virtual void ClearConstraint(MPConstraint* const constraint) = 0;
1594 
1595  // Changes a coefficient in the linear objective.
1596  virtual void SetObjectiveCoefficient(const MPVariable* const variable,
1597  double coefficient) = 0;
1598 
1599  // Changes the constant term in the linear objective.
1600  virtual void SetObjectiveOffset(double value) = 0;
1601 
1602  // Clears the objective from all its terms.
1603  virtual void ClearObjective() = 0;
1604 
1605  virtual void BranchingPriorityChangedForVariable(int var_index) {}
1606  // ------ Query statistics on the solution and the solve ------
1607  // Returns the number of simplex iterations. The problem must be discrete,
1608  // otherwise it crashes, or returns kUnknownNumberOfIterations in NDEBUG mode.
1609  virtual int64 iterations() const = 0;
1610  // Returns the number of branch-and-bound nodes. The problem must be discrete,
1611  // otherwise it crashes, or returns kUnknownNumberOfNodes in NDEBUG mode.
1612  virtual int64 nodes() const = 0;
1613  // Returns the best objective bound. The problem must be discrete, otherwise
1614  // it crashes, or returns trivial_worst_objective_bound() in NDEBUG mode.
1615  virtual double best_objective_bound() const = 0;
1616  // A trivial objective bound: the worst possible value of the objective,
1617  // which will be +infinity if minimizing and -infinity if maximing.
1619  // Returns the objective value of the best solution found so far.
1620  double objective_value() const;
1621 
1622  // Returns the basis status of a row.
1623  virtual MPSolver::BasisStatus row_status(int constraint_index) const = 0;
1624  // Returns the basis status of a constraint.
1625  virtual MPSolver::BasisStatus column_status(int variable_index) const = 0;
1626 
1627  // Checks whether the solution is synchronized with the model, i.e. whether
1628  // the model has changed since the solution was computed last.
1629  // If it isn't, it crashes in NDEBUG, and returns false othwerwise.
1631  // Checks whether a feasible solution exists. The behavior is similar to
1632  // CheckSolutionIsSynchronized() above.
1633  virtual bool CheckSolutionExists() const;
1634  // Handy shortcut to do both checks above (it is often used).
1637  }
1638  // Checks whether information on the best objective bound exists. The behavior
1639  // is similar to CheckSolutionIsSynchronized() above.
1640  virtual bool CheckBestObjectiveBoundExists() const;
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  // Boolean indicator for the verbosity of the solver output.
1736  bool quiet_;
1737 
1738  // Index of dummy variable created for empty constraints or the
1739  // objective offset.
1740  static const int kDummyVariableIndex;
1741 
1742  // Extracts model stored in MPSolver.
1744  // Extracts the variables that have not been extracted yet.
1745  virtual void ExtractNewVariables() = 0;
1746  // Extracts the constraints that have not been extracted yet.
1747  virtual void ExtractNewConstraints() = 0;
1748  // Extracts the objective.
1749  virtual void ExtractObjective() = 0;
1750  // Resets the extraction information.
1752  // Change synchronization status from SOLUTION_SYNCHRONIZED to
1753  // MODEL_SYNCHRONIZED. To be used for model changes.
1755 
1756  // Sets parameters common to LP and MIP in the underlying solver.
1758  // Sets MIP specific parameters in the underlying solver.
1760  // Sets all parameters in the underlying solver.
1761  virtual void SetParameters(const MPSolverParameters& param) = 0;
1762  // Sets an unsupported double parameter.
1764  // Sets an unsupported integer parameter.
1767  // Sets a supported double parameter to an unsupported value.
1769  double value);
1770  // Sets a supported integer parameter to an unsupported value.
1772  MPSolverParameters::IntegerParam param, int value);
1773  // Sets each parameter in the underlying solver.
1774  virtual void SetRelativeMipGap(double value) = 0;
1775  virtual void SetPrimalTolerance(double value) = 0;
1776  virtual void SetDualTolerance(double value) = 0;
1777  virtual void SetPresolveMode(int value) = 0;
1778 
1779  // Sets the number of threads to be used by the solver.
1780  virtual absl::Status SetNumThreads(int num_threads);
1781 
1782  // Pass solver specific parameters in text format. The format is
1783  // solver-specific and is the same as the corresponding solver configuration
1784  // file format. Returns true if the operation was successful.
1785  //
1786  // The default implementation of this method stores the parameters in a
1787  // temporary file and calls ReadParameterFile to import the parameter file
1788  // into the solver. Solvers that support passing the parameters directly can
1789  // override this method to skip the temporary file logic.
1791  const std::string& parameters);
1792 
1793  // Reads a solver-specific file of parameters and set them.
1794  // Returns true if there was no errors.
1795  virtual bool ReadParameterFile(const std::string& filename);
1796 
1797  // Returns a file extension like ".tmp", this is needed because some solvers
1798  // require a given extension for the ReadParameterFile() filename and we need
1799  // to know it to generate a temporary parameter file.
1800  virtual std::string ValidFileExtensionForParameterFile() const;
1801 
1802  // Sets the scaling mode.
1803  virtual void SetScalingMode(int value) = 0;
1804  virtual void SetLpAlgorithm(int value) = 0;
1805 };
1806 
1807 } // namespace operations_research
1808 
1809 #endif // OR_TOOLS_LINEAR_SOLVER_LINEAR_SOLVER_H_
@ XPRESS_LINEAR_PROGRAMMING
int NumConstraints() const
Returns the number of constraints.
bool variable_is_extracted(int var_index) const
void SetMaximization()
Sets the optimization direction to maximize.
@ GLOP_LINEAR_PROGRAMMING
int GetIntegerParam(MPSolverParameters::IntegerParam param) const
Returns the value of an integer parameter.
static bool LoadGurobiSharedLibrary()
@ LP_ALGORITHM
Algorithm to solve linear programs.
void SetCoefficient(const MPVariable *const var, double coeff)
Sets the coefficient of the variable on the constraint.
void * underlying_solver()
Advanced usage: returns the underlying solver.
static bool SupportsProblemType(OptimizationProblemType problem_type)
Whether the given problem type is supported (this will depend on the targets that you linked).
virtual bool IsContinuous() const =0
void Reset()
Advanced usage: resets extracted model to solve from scratch.
virtual bool NextSolution()
friend class XpressInterface
The class for variables of a Mathematical Programming (MP) model.
This mathematical programming (MP) solver class is the main class though which users build and solve ...
void ResetDoubleParam(MPSolverParameters::DoubleParam param)
Sets a double parameter to its default value (default value defined in MPSolverParameters if it exist...
MPConstraint * LookupConstraintOrNull(const std::string &constraint_name) const
Looks up a constraint by name, and returns nullptr if it does not exist.
@ MUST_RELOAD
friend class KnapsackInterface
MPSolverInterface(MPSolver *const solver)
@ PRESOLVE_OFF
Presolve is off.
bool indicator_value() const
MPSolver::ResultStatus result_status_
@ GLPK_MIXED_INTEGER_PROGRAMMING
friend class KnapsackInterface
std::vector< double > ComputeConstraintActivities() const
Advanced usage: compute the "activities" of all constraints, which are the sums of their linear terms...
friend class CLPInterface
@ DUAL_TOLERANCE
Advanced usage: tolerance for dual feasibility of basic solutions.
int index() const
Returns the index of the variable in the MPSolver::variables_.
static const PresolveValues kDefaultPresolve
void Clear()
Clears all variables and coefficients. Does not clear the bounds.
virtual void SetVariableBounds(int index, double lb, double ub)=0
void MakeBoolVarArray(int nb, const std::string &name, std::vector< MPVariable * > *vars)
Creates an array of boolean variables.
bool SolverTypeIsMip(MPModelRequest::SolverType solver_type)
MPSolverResponseStatus
friend class BopInterface
void SetCoefficient(const MPVariable *const var, double coeff)
Sets the coefficient of the variable in the objective.
@ FIXED_VALUE
void MakeIntVarArray(int nb, double lb, double ub, const std::string &name, std::vector< MPVariable * > *vars)
Creates an array of integer variables.
friend class SatInterface
static bool ParseSolverType(absl::string_view solver_id, OptimizationProblemType *type)
Parses the name of the solver.
void MinimizeLinearExpr(const LinearExpr &linear_expr)
Resets the current objective to minimize linear_expr.
virtual void SetIntegerParamToUnsupportedValue(MPSolverParameters::IntegerParam param, int value)
bool ExportModelAsMpsFormat(bool fixed_format, bool obfuscate, std::string *model_str) const
bool ExportModelAsLpFormat(bool obfuscate, std::string *model_str) const
Shortcuts to the homonymous MPModelProtoExporter methods, via exporting to a MPModelProto with Export...
void SuppressOutput()
Suppresses solver logging.
friend class CplexInterface
The class for constraints of a Mathematical Programming (MP) model.
MPConstraint * MakeRowConstraint(const LinearRange &range, const std::string &name)
As above, but also names the constraint.
virtual bool CheckSolutionExists() const
friend class XpressInterface
friend class CBCInterface
@ FEASIBLE
feasible, or stopped by limit.
ABSL_MUST_USE_RESULT bool NextSolution()
Some solvers (MIP only, not LP) can produce multiple solutions to the problem.
virtual void ExtractNewVariables()=0
friend class CBCInterface
virtual void SetOptimizationDirection(bool maximize)=0
const absl::string_view ToString(MPSolver::OptimizationProblemType optimization_problem_type)
double objective_value_
void SetIntegerParam(MPSolverParameters::IntegerParam param, int value)
Sets a integer parameter to a specific value.
MPConstraint * MakeRowConstraint(const std::string &name)
Creates a named constraint with -infinity and +infinity bounds.
@ SCALING_OFF
Scaling is off.
@ CPLEX_MIXED_INTEGER_PROGRAMMING
virtual bool IsMIP() const =0
double GetCoefficient(const MPVariable *const var) const
Gets the coefficient of a given variable in the objective.
bool minimization() const
Is the optimization direction set to minimize?
int64 time_limit() const
static const double kDefaultRelativeMipGap
double offset() const
Gets the constant term in the objective.
virtual void ClearConstraint(MPConstraint *const constraint)=0
@ AT_LOWER_BOUND
bool InterruptSolve()
Interrupts the Solve() execution to terminate processing if possible.
MPConstraint * MakeRowConstraint(double lb, double ub)
Creates a linear constraint with given bounds.
void SetLB(double lb)
Sets the lower bound.
friend class KnapsackInterface
@ DUAL
Dual simplex.
void set_variable_as_extracted(int var_index, bool extracted)
@ MODEL_SYNCHRONIZED
static const double kDefaultDualTolerance
void set_time_limit(int64 time_limit_milliseconds)
friend class XpressInterface
Definition: linear_expr.h:84
virtual bool InterruptSolve()
@ SCALING
Advanced usage: enable or disable matrix scaling.
const absl::flat_hash_map< const MPVariable *, double > & terms() const
Returns a map from variables to their coefficients in the objective.
static double infinity()
Infinity.
@ GLPK_LINEAR_PROGRAMMING
friend class GurobiInterface
virtual void * underlying_solver()=0
PresolveValues
For each categorical parameter, enumeration of possible values.
void ExportModelToProto(MPModelProto *output_model) const
Exports model to protocol buffer.
static const int kDummyVariableIndex
void SetUB(double ub)
Sets the upper bound.
friend class GLOPInterface
LpAlgorithmValues
LP algorithm to use.
MPSolverResponseStatus LoadModelFromProtoWithUniqueNamesOrDie(const MPModelProto &input_model, std::string *error_message)
Loads model from protocol buffer.
friend class SatInterface
const std::string & name() const
Returns the name of the variable.
static const IncrementalityValues kDefaultIncrementality
static const double kUnknownDoubleParamValue
@ RELATIVE_MIP_GAP
Limit for relative MIP gap.
void SetCallback(MPCallback *mp_callback)
virtual void ExtractNewConstraints()=0
double dual_value() const
Advanced usage: returns the dual value of the constraint in the current solution (only available for ...
int last_variable_index_
This class stores parameter settings for LP and MIP solvers.
double ub() const
Returns the upper bound.
virtual bool IsLP() const =0
bool IsMIP() const
An expression of the form:
Definition: linear_expr.h:192
void SetUnsupportedDoubleParam(MPSolverParameters::DoubleParam param)
bool CheckSolutionIsSynchronized() const
int branching_priority() const
Advanced usage: Certain MIP solvers (e.g.
virtual void Reset()=0
bool VerifySolution(double tolerance, bool log_errors) const
Advanced usage: Verifies the correctness of the solution.
ResultStatus Solve()
Solves the problem using the default parameter values.
virtual OptimizationProblemType ProblemType() const
Returns the optimization problem type set at construction.
void SetMinimization()
Sets the optimization direction to minimize.
std::string AbslUnparseFlag(MPSolver::OptimizationProblemType solver_type)
virtual bool SupportsCallbacks() const
void set_is_lazy(bool laziness)
Advanced usage: sets the constraint "laziness".
@ CPLEX_LINEAR_PROGRAMMING
SynchronizationStatus
friend class GurobiInterface
double unrounded_solution_value() const
Advanced usage: unrounded solution value.
static const double kDefaultPrimalTolerance
void SetTimeLimit(absl::Duration time_limit)
virtual int64 nodes() const =0
friend class MPVariableSolutionValueTest
std::string GetSolverSpecificParametersAsString() const
virtual void SetCoefficient(MPConstraint *const constraint, const MPVariable *const variable, double new_value, double old_value)=0
@ INCREMENTALITY
Advanced usage: incrementality from one solve to the next.
MPSolver::BasisStatus basis_status() const
Advanced usage: returns the basis status of the variable in the current solution (only available for ...
const std::string & name() const
Returns the name of the constraint.
MPConstraint(int index, double lb, double ub, const std::string &name, MPSolverInterface *const interface_in)
void SetOffset(double value)
Sets the constant term in the objective.
friend class GLOPInterface
friend class BopInterface
friend class GLOPInterface
int index() const
Returns the index of the constraint in the MPSolver::constraints_.
void SetCommonParameters(const MPSolverParameters &param)
ScalingValues
Advanced usage: Scaling options.
virtual void BranchingPriorityChangedForVariable(int var_index)
virtual MPSolver::BasisStatus row_status(int constraint_index) const =0
virtual bool SetSolverSpecificParametersAsString(const std::string &parameters)
MPVariable(int index, double lb, double ub, bool integer, const std::string &name, MPSolverInterface *const interface_in)
ResultStatus Solve(const MPSolverParameters &param)
Solves the problem using the specified parameter values.
void Reset()
Sets all parameters to their default value.
void Clear()
Clears the objective (including the optimization direction), all variables and constraints.
void set_dual_value(double dual_value)
bool is_lazy() const
Advanced usage: returns true if the constraint is "lazy" (see below).
void ExtractModel()
IncrementalityValues
Advanced usage: Incrementality options.
void set_solution_value(double value)
virtual void SetPresolveMode(int value)=0
bool CheckSolutionIsSynchronizedAndExists() const
@ XPRESS_MIXED_INTEGER_PROGRAMMING
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...
double reduced_cost() const
Advanced usage: returns the reduced cost of the variable in the current solution (only available for ...
int64 nodes() const
Returns the number of branch-and-bound nodes evaluated during the solve.
virtual void AddRowConstraint(MPConstraint *const ct)=0
MPSolver::BasisStatus basis_status() const
Advanced usage: returns the basis status of the constraint.
friend class SatInterface
@ PRIMAL
Primal simplex.
virtual std::string SolverVersion() const =0
MPSolverParameters()
The constructor sets all parameters to their default value.
static const int kDefaultIntegerParamValue
bool AbslParseFlag(absl::string_view text, MPSolver::OptimizationProblemType *solver_type, std::string *error)
@ SAT_INTEGER_PROGRAMMING
bool OwnsVariable(const MPVariable *var) const
void set_constraint_as_extracted(int ct_index, bool extracted)
virtual MPSolver::ResultStatus Solve(const MPSolverParameters &param)=0
@ ABNORMAL
abnormal, i.e., error of some kind.
void SetBounds(double lb, double ub)
Sets both the lower and upper bounds.
friend class CLPInterface
void ResetExtractionInformation()
double objective_value() const
static constexpr int64 kUnknownNumberOfNodes
absl::Status SetNumThreads(int num_threads)
Sets the number of threads to use by the underlying solver.
int64 wall_time() const
bool quiet_
LinearExpr models a quantity that is linear in the decision variables (MPVariable) of an optimization...
Definition: linear_expr.h:114
@ INCREMENTALITY_OFF
Start solve from scratch.
friend class SLMInterface
bool maximize_
static const int kUnknownIntegerParamValue
MPVariable * LookupVariableOrNull(const std::string &var_name) const
Looks up a variable by name, and returns nullptr if it does not exist.
virtual void SetObjectiveOffset(double value)=0
MPVariable * MakeIntVar(double lb, double ub, const std::string &name)
Creates an integer variable.
virtual int64 iterations() const =0
virtual ~MPSolverInterface()
double lb() const
Returns the lower bound.
friend class CplexInterface
void SetInteger(bool integer)
Sets the integrality requirement of the variable.
friend class SLMInterface
@ SCIP_MIXED_INTEGER_PROGRAMMING
virtual bool CheckBestObjectiveBoundExists() const
virtual void AddVariable(MPVariable *const var)=0
MPVariable * MakeNumVar(double lb, double ub, const std::string &name)
Creates a continuous variable.
virtual void SetCallback(MPCallback *mp_callback)
bool integer() const
Returns the integrality requirement of the variable.
virtual void SetParameters(const MPSolverParameters &param)=0
virtual double best_objective_bound() const =0
absl::Duration TimeLimit() const
virtual double ComputeExactConditionNumber() const
@ GUROBI_MIXED_INTEGER_PROGRAMMING
IntegerParam
Enumeration of parameters that take integer or categorical values.
void MakeVarArray(int nb, double lb, double ub, bool integer, const std::string &name_prefix, std::vector< MPVariable * > *vars)
Creates an array of variables.
@ SCALING_ON
Scaling is on.
std::ostream & operator<<(std::ostream &stream, const LinearExpr &linear_expr)
virtual void SetRelativeMipGap(double value)=0
friend class SCIPInterface
bool SupportsCallbacks() const
void MaximizeLinearExpr(const LinearExpr &linear_expr)
Resets the current objective to maximize linear_expr.
@ CBC_MIXED_INTEGER_PROGRAMMING
void FillSolutionResponseProto(MPSolutionResponse *response) const
Encodes the current solution in a solution response protocol buffer.
friend class GurobiInterface
static MPSolver * CreateSolver(const std::string &solver_id)
Recommended factory method to create a MPSolver instance, especially in non C++ languages.
void SetMIPParameters(const MPSolverParameters &param)
virtual bool ReadParameterFile(const std::string &filename)
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...
friend class GLPKInterface
MPObjective * MutableObjective()
Returns the mutable objective object.
virtual void SetScalingMode(int value)=0
@ AT_UPPER_BOUND
absl::Status ClampSolutionWithinBounds()
Resets values of out of bound variables to the corresponding bound and returns an error if any of the...
@ PRESOLVE
Advanced usage: presolve mode.
void EnableOutput()
Enables solver logging.
bool SetSolverSpecificParametersAsString(const std::string &parameters)
Advanced usage: pass solver specific parameters in text format.
const MPObjective & Objective() const
Returns the objective object.
@ OPTIMAL
optimal.
void SetDoubleParamToUnsupportedValue(MPSolverParameters::DoubleParam param, double value)
friend class CBCInterface
static void SetGurobiLibraryPath(const std::string &full_library_path)
friend class SCIPInterface
ResultStatus
The status of solving the problem.
MPConstraint * MakeRowConstraint(const LinearRange &range)
Creates a constraint owned by MPSolver enforcing: range.lower_bound() <= range.linear_expr() <= range...
friend class XpressInterface
OptimizationProblemType
The type of problems (LP or MIP) that will be solved and the underlying solver (GLOP,...
double ub() const
Returns the upper bound.
virtual void ExtractObjective()=0
const std::string & Name() const
Returns the name of the model set at construction.
@ FREE
double GetDoubleParam(MPSolverParameters::DoubleParam param) const
Returns the value of a double parameter.
void SetBounds(double lb, double ub)
Sets both the lower and upper bounds.
void ResetIntegerParam(MPSolverParameters::IntegerParam param)
Sets an integer parameter to its default value (default value defined in MPSolverParameters if it exi...
@ MODEL_INVALID
the model is trivially invalid (NaN coefficients, etc).
void SetUB(double ub)
Sets the upper bound.
virtual std::string ValidFileExtensionForParameterFile() const
const std::vector< MPConstraint * > & constraints() const
Returns the array of constraints handled by the MPSolver.
virtual void SetDualTolerance(double value)=0
friend class CLPInterface
void Write(const std::string &file_name)
Writes the model using the solver internal write function.
virtual void SetConstraintBounds(int index, double lb, double ub)=0
bool maximization() const
Is the optimization direction set to maximize?
friend class SatInterface
bool MPSolverResponseStatusIsRpcError(MPSolverResponseStatus status)
friend class SLMInterface
int GetNumThreads() const
Returns the number of threads to be used during solve.
friend class GLPKInterface
@ BARRIER
Barrier algorithm.
double Value() const
Returns the objective value of the best solution found so far.
virtual void SetLpAlgorithm(int value)=0
friend class GurobiInterface
const absl::flat_hash_map< const MPVariable *, double > & terms() const
Returns a map from variables to their coefficients in the constraint.
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...
@ BOP_INTEGER_PROGRAMMING
MPVariable * MakeVar(double lb, double ub, bool integer, const std::string &name)
Creates a variable with the given bounds, integrality requirement and name.
virtual void SetPrimalTolerance(double value)=0
A class to express a linear objective.
virtual void SetStartingLpBasis(const std::vector< MPSolver::BasisStatus > &variable_statuses, const std::vector< MPSolver::BasisStatus > &constraint_statuses)
int NumVariables() const
Returns the number of variables.
@ PRIMAL_TOLERANCE
Advanced usage: tolerance for primal feasibility of basic solutions.
absl::Duration DurationSinceConstruction() const
friend class CplexInterface
double time_limit_in_secs() const
friend class SCIPInterface
MPConstraint * MakeRowConstraint(double lb, double ub, const std::string &name)
Creates a named constraint with given bounds.
std::string SolverVersion() const
Returns a string describing the underlying solver and its version.
MPSolver *const solver_
friend class GLPKInterface
friend class BopInterface
BasisStatus
Advanced usage: possible basis status values for a variable and the slack variable of a linear constr...
MPSolver(const std::string &name, OptimizationProblemType problem_type)
Create a solver with the given name and underlying solver backend.
MPSolverResponseStatus LoadModelFromProto(const MPModelProto &input_model, std::string *error_message)
Loads model from protocol buffer.
static const double kDefaultDoubleParamValue
friend class SLMInterface
@ SOLUTION_SYNCHRONIZED
void AddLinearExpr(const LinearExpr &linear_expr)
Adds linear_expr to the current objective, does not change the direction.
friend class CLPInterface
const MPVariable * indicator_variable() const
void set_quiet(bool quiet_value)
friend class SCIPInterface
bool constraint_is_extracted(int ct_index) const
double ComputeExactConditionNumber() const
Advanced usage: computes the exact condition number of the current scaled basis: L1norm(B) * L1norm(i...
@ INCREMENTALITY_ON
Reuse results from previous solve as much as the underlying solver allows.
constexpr double kDefaultPrimalTolerance
virtual void ClearObjective()=0
DoubleParam
Enumeration of parameters that take continuous values.
double solution_value() const
Returns the value of the variable in the current solution.
bool OutputIsEnabled() const
Controls (or queries) the amount of output produced by the underlying solver.
const std::vector< MPVariable * > & variables() const
Returns the array of variables handled by the MPSolver.
virtual absl::Status SetNumThreads(int num_threads)
virtual absl::optional< MPSolutionResponse > DirectlySolveProto(const MPModelRequest &request)
static constexpr int64 kUnknownNumberOfIterations
virtual void SetUnsupportedIntegerParam(MPSolverParameters::IntegerParam param)
void SetBranchingPriority(int priority)
void SetLB(double lb)
Sets the lower bound.
@ KNAPSACK_MIXED_INTEGER_PROGRAMMING
void SetHint(std::vector< std::pair< const MPVariable *, double > > hint)
Sets a hint for solution.
virtual void SetObjectiveCoefficient(const MPVariable *const variable, double coefficient)=0
void set_reduced_cost(double reduced_cost)
friend class CBCInterface
MPSolver::ResultStatus result_status() const
int last_constraint_index_
@ PRESOLVE_ON
Presolve is on.
friend class KnapsackInterface
double BestBound() const
Returns the best objective bound.
double trivial_worst_objective_bound() const
void Clear()
Clears the offset, all variables and coefficients, and the optimization direction.
double lb() const
Returns the lower bound.
static OptimizationProblemType ParseSolverTypeOrDie(const std::string &solver_id)
Parses the name of the solver and returns the correct optimization type or dies.
bool quiet() const
friend class GLOPInterface
void SetDoubleParam(MPSolverParameters::DoubleParam param, double value)
Sets a double parameter to a specific value.
void SetStartingLpBasis(const std::vector< MPSolver::BasisStatus > &variable_statuses, const std::vector< MPSolver::BasisStatus > &constraint_statuses)
Advanced usage: Incrementality.
virtual MPSolver::BasisStatus column_status(int variable_index) const =0
virtual ~MPSolver()
friend class BopInterface
void SetOptimizationDirection(bool maximize)
Sets the optimization direction (maximize: true or minimize: false).
virtual bool AddIndicatorConstraint(MPConstraint *const ct)
@ INFEASIBLE
proven infeasible.
int last_variable_index() const
friend class CplexInterface
@ GUROBI_LINEAR_PROGRAMMING
int64 iterations() const
Returns the number of simplex iterations.
@ CLP_LINEAR_PROGRAMMING
virtual void Write(const std::string &filename)
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...
MPConstraint * MakeRowConstraint()
Creates a constraint with -infinity and +infinity bounds.
SynchronizationStatus sync_status_
@ BASIC
void InvalidateSolutionSynchronization()
MPVariable * MakeBoolVar(const std::string &name)
Creates a boolean variable.
void MakeNumVarArray(int nb, double lb, double ub, const std::string &name, std::vector< MPVariable * > *vars)
Creates an array of continuous variables.
virtual void SetVariableInteger(int index, bool integer)=0
@ UNBOUNDED
proven unbounded.
@ NOT_SOLVED
not been solved yet.
friend class GLPKInterface