OR-Tools  9.0
math_opt.cc
Go to the documentation of this file.
1 // Copyright 2010-2021 Google LLC
2 // Licensed under the Apache License, Version 2.0 (the "License");
3 // you may not use this file except in compliance with the License.
4 // You may obtain a copy of the License at
5 //
6 // http://www.apache.org/licenses/LICENSE-2.0
7 //
8 // Unless required by applicable law or agreed to in writing, software
9 // distributed under the License is distributed on an "AS IS" BASIS,
10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 // See the License for the specific language governing permissions and
12 // limitations under the License.
13 
15 
16 #include <algorithm>
17 #include <functional>
18 #include <memory>
19 #include <utility>
20 #include <vector>
21 
22 #include "ortools/base/logging.h"
23 #include "absl/container/flat_hash_set.h"
24 #include "absl/status/statusor.h"
25 #include "absl/strings/string_view.h"
26 #include "ortools/base/int_type.h"
27 #include "ortools/math_opt/callback.pb.h"
30 #include "ortools/math_opt/model_update.pb.h"
33 
34 namespace operations_research {
35 namespace math_opt {
36 
37 absl::StatusOr<Result> MathOpt::Solve(
38  const SolveParametersProto& solver_parameters,
39  const ModelSolveParameters& model_parameters,
40  const CallbackRegistration& callback_registration, Callback callback) {
41  CheckModel(model_parameters.model());
42  CheckModel(callback_registration.model());
43  if (callback == nullptr) {
44  CHECK(callback_registration.events.empty())
45  << "No callback was provided to run, but callback events were "
46  "registered.";
47  }
48 
49  bool attempted_incremental_solve = false;
50  if (solver_ != nullptr) {
51  const ModelUpdateProto model_update = model_->ExportModelUpdate();
52  ASSIGN_OR_RETURN(const bool did_update, solver_->Update(model_update));
53  if (did_update) {
54  attempted_incremental_solve = true;
55  } else {
56  solver_ = nullptr;
57  }
58  }
59  if (solver_ == nullptr) {
60  ASSIGN_OR_RETURN(solver_, Solver::New(solver_type_, model_->ExportModel(),
61  solver_initializer_));
62  }
63  model_->Checkpoint();
64 
65  Solver::Callback cb = nullptr;
66  if (callback != nullptr) {
67  cb = [&](const CallbackDataProto& callback_data_proto) {
68  const CallbackData data(model_.get(), callback_data_proto);
69  const CallbackResult result = callback(data);
70  CheckModel(result.model());
71  return result.Proto();
72  };
73  }
74  ASSIGN_OR_RETURN(const SolveResultProto solve_result,
75  solver_->Solve(solver_parameters, model_parameters.Proto(),
76  callback_registration.Proto(), cb));
77  Result result(model_.get(), solve_result);
78  result.attempted_incremental_solve = attempted_incremental_solve;
79  return result;
80 }
81 
83  const BoundedLinearExpression& bounded_expr, absl::string_view name) {
84  CheckModel(bounded_expr.expression.model());
85 
86  const LinearConstraintId constraint = model_->AddLinearConstraint(
87  bounded_expr.lower_bound_minus_offset(),
88  bounded_expr.upper_bound_minus_offset(), name);
89  for (auto [variable, coef] : bounded_expr.expression.raw_terms()) {
90  model_->set_linear_constraint_coefficient(constraint, variable, coef);
91  }
92  return LinearConstraint(model_.get(), constraint);
93 }
94 
95 std::vector<Variable> MathOpt::Variables() {
96  std::vector<Variable> result;
97  result.reserve(model_->num_variables());
98  for (const VariableId var_id : model_->variables()) {
99  result.push_back(Variable(model_.get(), var_id));
100  }
101  return result;
102 }
103 
104 std::vector<Variable> MathOpt::SortedVariables() {
105  std::vector<Variable> result = Variables();
106  std::sort(result.begin(), result.end(),
107  [](const Variable& l, const Variable& r) {
108  return l.typed_id() < r.typed_id();
109  });
110  return result;
111 }
112 
113 std::vector<LinearConstraint> MathOpt::LinearConstraints() {
114  std::vector<LinearConstraint> result;
115  result.reserve(model_->num_linear_constraints());
116  for (const LinearConstraintId lin_con_id : model_->linear_constraints()) {
117  result.push_back(LinearConstraint(model_.get(), lin_con_id));
118  }
119  return result;
120 }
121 
122 std::vector<LinearConstraint> MathOpt::SortedLinearConstraints() {
123  std::vector<LinearConstraint> result = LinearConstraints();
124  std::sort(result.begin(), result.end(),
125  [](const LinearConstraint& l, const LinearConstraint& r) {
126  return l.typed_id() < r.typed_id();
127  });
128  return result;
129 }
130 
131 ModelProto MathOpt::ExportModel() const { return model_->ExportModel(); }
132 
133 void MathOpt::CheckModel(IndexedModel* model) {
134  if (model != nullptr) {
136  }
137 }
138 
139 } // namespace math_opt
140 } // namespace operations_research
#define CHECK(condition)
Definition: base/logging.h:498
#define CHECK_EQ(val1, val2)
Definition: base/logging.h:705
const absl::flat_hash_map< VariableId, double > & raw_terms() const
std::function< CallbackResult(CallbackData)> Callback
Definition: math_opt.h:139
const std::string & name() const
Definition: math_opt.h:302
LinearConstraint AddLinearConstraint(absl::string_view name="")
Definition: math_opt.h:345
std::vector< Variable > Variables()
Definition: math_opt.cc:95
absl::StatusOr< Result > Solve(const SolveParametersProto &solver_parameters, const ModelSolveParameters &model_parameters={}, const CallbackRegistration &callback_registration={}, Callback callback=nullptr)
Definition: math_opt.cc:37
std::vector< LinearConstraint > LinearConstraints()
Definition: math_opt.cc:113
std::vector< LinearConstraint > SortedLinearConstraints()
Definition: math_opt.cc:122
std::vector< Variable > SortedVariables()
Definition: math_opt.cc:104
std::function< CallbackResultProto(const CallbackDataProto &)> Callback
Definition: solver.h:61
static absl::StatusOr< std::unique_ptr< Solver > > New(SolverType solver_type, const ModelProto &model, const SolverInitializerProto &initializer)
Definition: solver.cc:101
const std::string name
int64_t coef
Definition: expr_array.cc:1875
GRBmodel * model
MPCallback * callback
constexpr absl::string_view kObjectsFromOtherIndexedModel
Definition: key_types.h:56
Collection of objects used to extend the Constraint Solver library.
#define ASSIGN_OR_RETURN(lhs, rexpr)
Definition: status_macros.h:55
CallbackRegistrationProto Proto() const
Definition: callback.cc:98
absl::flat_hash_set< CallbackEventProto > events
Definition: callback.h:138
CallbackResultProto Proto() const
Definition: callback.cc:120