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"
30#include "ortools/math_opt/callback.pb.h"
35#include "ortools/math_opt/sparse_containers.pb.h"
41std::vector<std::pair<VariableId, double>> SortedVariableValues(
42 const VariableMap<double>& var_map) {
43 std::vector<std::pair<VariableId, double>> result(var_map.raw_map().begin(),
44 var_map.raw_map().end());
45 std::sort(result.begin(), result.end());
55template <
typename Container>
57 const Container& model_items,
58 const ModelStorage*
const init_model =
nullptr) {
59 const ModelStorage* result = init_model;
60 for (
const auto& item : model_items) {
61 const ModelStorage*
const storage = item.storage();
62 if (storage !=
nullptr) {
63 if (result ==
nullptr) {
85 return "mip_solution";
100 return absl::MakeConstSpan(kCallbackEventValues);
104 const CallbackDataProto&
proto)
108 presolve_stats(
proto.presolve_stats()),
109 simplex_stats(
proto.simplex_stats()),
110 barrier_stats(
proto.barrier_stats()),
111 mip_stats(
proto.mip_stats()) {
113 if (
proto.has_primal_solution_vector()) {
115 storage,
MakeView(
proto.primal_solution_vector()).as_map<VariableId>());
131 CallbackRegistrationProto result;
133 result.add_request_registration(
EnumToProto(event));
135 std::sort(result.mutable_request_registration()->begin(),
136 result.mutable_request_registration()->end());
153 CallbackResultProto result;
156 SparseDoubleVectorProto* solution_vector = result.add_suggested_solutions();
157 for (
const auto& [typed_id,
value] : SortedVariableValues(solution)) {
158 solution_vector->add_ids(typed_id.value());
159 solution_vector->add_values(
value);
163 CallbackResultProto::GeneratedLinearConstraint* constraint_proto =
165 constraint_proto->set_is_lazy(constraint.is_lazy);
166 constraint_proto->set_lower_bound(
167 constraint.linear_constraint.lower_bound_minus_offset());
168 constraint_proto->set_upper_bound(
169 constraint.linear_constraint.upper_bound_minus_offset());
170 for (
const auto& [typed_id,
value] : SortedVariableValues(
171 constraint.linear_constraint.expression.terms())) {
172 constraint_proto->mutable_linear_expression()->add_ids(typed_id.value());
173 constraint_proto->mutable_linear_expression()->add_values(
value);
#define CHECK_EQ(val1, val2)
const ModelStorage * ConsistentModelStorage(std::initializer_list< const ModelStorage * > storages)
constexpr absl::string_view kObjectsFromOtherModelStorage
SparseVectorView< T > MakeView(absl::Span< const int64_t > ids, const Collection &values)
std::optional< typename EnumProto< P >::Cpp > EnumFromProto(const P proto_value)
Enum< E >::Proto EnumToProto(const std::optional< E > value)
Collection of objects used to extend the Constraint Solver library.
inline ::absl::StatusOr< absl::Duration > DecodeGoogleApiProto(const google::protobuf::Duration &proto)
CallbackData(const ModelStorage *storage, const CallbackDataProto &proto)
std::optional< VariableMap< double > > solution
CallbackRegistrationProto Proto() const
MapFilter< Variable > mip_solution_filter
bool add_lazy_constraints
MapFilter< Variable > mip_node_filter
absl::flat_hash_set< CallbackEvent > events
const ModelStorage * storage() const
std::vector< VariableMap< double > > suggested_solutions
CallbackResultProto Proto() const
const ModelStorage * storage() const
std::vector< GeneratedLinearConstraint > new_constraints
static std::optional< absl::string_view > ToOptString(E value)
static absl::Span< const E > AllValues()