OR-Tools  9.6
callback.cc
Go to the documentation of this file.
1 // Copyright 2010-2022 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 <optional>
18 #include <utility>
19 #include <vector>
20 
21 #include "absl/container/flat_hash_set.h"
22 #include "absl/status/status.h"
23 #include "absl/status/statusor.h"
24 #include "absl/strings/string_view.h"
25 #include "absl/time/time.h"
26 #include "absl/types/span.h"
27 #include "ortools/base/logging.h"
28 #include "ortools/base/protoutil.h"
30 #include "ortools/math_opt/callback.pb.h"
35 #include "ortools/math_opt/sparse_containers.pb.h"
37 
38 namespace operations_research {
39 namespace math_opt {
40 
41 std::optional<absl::string_view> Enum<CallbackEvent>::ToOptString(
43  switch (value) {
45  return "presolve";
47  return "simplex";
49  return "mip";
51  return "mip_solution";
53  return "mip_node";
55  return "barrier";
56  }
57  return std::nullopt;
58 }
59 
60 absl::Span<const CallbackEvent> Enum<CallbackEvent>::AllValues() {
61  static constexpr CallbackEvent kCallbackEventValues[] = {
65  };
66  return absl::MakeConstSpan(kCallbackEventValues);
67 }
68 
70  const absl::Duration runtime)
71  : event(event), runtime(runtime) {}
72 
74  const CallbackDataProto& proto)
75  // iOS 11 does not support .value() hence we use operator* here and CHECK
76  // below that we have a value.
77  : event(*EnumFromProto(proto.event())),
78  presolve_stats(proto.presolve_stats()),
79  simplex_stats(proto.simplex_stats()),
80  barrier_stats(proto.barrier_stats()),
81  mip_stats(proto.mip_stats()) {
82  CHECK(EnumFromProto(proto.event()).has_value());
83  if (proto.has_primal_solution_vector()) {
84  solution = VariableValuesFromProto(storage, proto.primal_solution_vector())
85  .value();
86  }
87  auto maybe_time = util_time::DecodeGoogleApiProto(proto.runtime());
88  CHECK_OK(maybe_time.status());
89  runtime = *maybe_time;
90 }
91 
93  const ModelStorage* const expected_storage) const {
95  internal::CheckModelStorage(/*storage=*/mip_node_filter.storage(),
96  /*expected_storage=*/expected_storage))
97  << "invalid mip_node_filter";
100  /*expected_storage=*/expected_storage))
101  << "invalid mip_solution_filter";
102  return absl::OkStatus();
103 }
104 
105 CallbackRegistrationProto CallbackRegistration::Proto() const {
106  CallbackRegistrationProto result;
107  for (const CallbackEvent event : events) {
108  result.add_request_registration(EnumToProto(event));
109  }
110  std::sort(result.mutable_request_registration()->begin(),
111  result.mutable_request_registration()->end());
112  *result.mutable_mip_solution_filter() = mip_solution_filter.Proto();
113  *result.mutable_mip_node_filter() = mip_node_filter.Proto();
114  result.set_add_lazy_constraints(add_lazy_constraints);
115  result.set_add_cuts(add_cuts);
116  return result;
117 }
118 
120  const ModelStorage* const expected_storage) const {
121  for (const GeneratedLinearConstraint& constraint : new_constraints) {
123  internal::CheckModelStorage(/*storage=*/constraint.storage(),
124  /*expected_storage=*/expected_storage))
125  << "invalid new_constraints";
126  }
127  for (const VariableMap<double>& solution : suggested_solutions) {
129  /*storage=*/solution.storage(), /*expected_storage=*/expected_storage))
130  << "invalid suggested_solutions";
131  }
132  return absl::OkStatus();
133 }
134 
135 CallbackResultProto CallbackResult::Proto() const {
136  CallbackResultProto result;
137  result.set_terminate(terminate);
138  for (const VariableMap<double>& solution : suggested_solutions) {
139  *result.add_suggested_solutions() = VariableValuesToProto(solution);
140  }
141  for (const GeneratedLinearConstraint& constraint : new_constraints) {
142  CallbackResultProto::GeneratedLinearConstraint* constraint_proto =
143  result.add_cuts();
144  constraint_proto->set_is_lazy(constraint.is_lazy);
145  constraint_proto->set_lower_bound(
146  constraint.linear_constraint.lower_bound_minus_offset());
147  constraint_proto->set_upper_bound(
148  constraint.linear_constraint.upper_bound_minus_offset());
149  *constraint_proto->mutable_linear_expression() =
150  VariableValuesToProto(constraint.linear_constraint.expression.terms());
151  }
152  return result;
153 }
154 
155 } // namespace math_opt
156 } // namespace operations_research
#define RETURN_IF_ERROR(expr)
CpModelProto proto
int64_t value
absl::Status CheckModelStorage(const ModelStorage *const storage, const ModelStorage *const expected_storage)
Definition: key_types.h:69
absl::StatusOr< VariableMap< double > > VariableValuesFromProto(const ModelStorage *const model, const SparseDoubleVectorProto &vars_proto)
SparseDoubleVectorProto VariableValuesToProto(const VariableMap< double > &variable_values)
std::optional< typename EnumProto< P >::Cpp > EnumFromProto(const P proto_value)
Definition: enums.h:279
Enum< E >::Proto EnumToProto(const std::optional< E > value)
Definition: enums.h:268
Collection of objects used to extend the Constraint Solver library.
inline ::absl::StatusOr< absl::Duration > DecodeGoogleApiProto(const google::protobuf::Duration &proto)
Definition: protoutil.h:42
CallbackData(CallbackEvent event, absl::Duration runtime)
Definition: callback.cc:69
std::optional< VariableMap< double > > solution
Definition: callback.h:211
CallbackRegistrationProto Proto() const
Definition: callback.cc:105
absl::Status CheckModelStorage(const ModelStorage *expected_storage) const
Definition: callback.cc:92
absl::flat_hash_set< CallbackEvent > events
Definition: callback.h:168
std::vector< VariableMap< double > > suggested_solutions
Definition: callback.h:275
CallbackResultProto Proto() const
Definition: callback.cc:135
absl::Status CheckModelStorage(const ModelStorage *expected_storage) const
Definition: callback.cc:119
std::vector< GeneratedLinearConstraint > new_constraints
Definition: callback.h:272
static std::optional< absl::string_view > ToOptString(E value)
Definition: basis_status.cc:24
static absl::Span< const E > AllValues()
Definition: basis_status.cc:41