22#include "absl/container/flat_hash_set.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"
28#include "ortools/math_opt/callback.pb.h"
34#include "ortools/math_opt/solution.pb.h"
35#include "ortools/math_opt/sparse_containers.pb.h"
36#include "absl/status/status.h"
43std::vector<std::pair<VariableId, double>> SortedVariableValues(
44 const VariableMap<double>& var_map) {
45 std::vector<std::pair<VariableId, double>> result(var_map.raw_map().begin(),
46 var_map.raw_map().end());
47 std::sort(result.begin(), result.end());
57template <
typename Container>
59 const Container& model_items,
60 const ModelStorage*
const init_model =
nullptr) {
61 const ModelStorage* result = init_model;
62 for (
const auto& item : model_items) {
63 const ModelStorage*
const storage = item.storage();
64 if (storage !=
nullptr) {
65 if (result ==
nullptr) {
87 return "mip_solution";
102 return absl::MakeConstSpan(kCallbackEventValues);
106 const CallbackDataProto&
proto)
110 presolve_stats(
proto.presolve_stats()),
111 simplex_stats(
proto.simplex_stats()),
112 barrier_stats(
proto.barrier_stats()),
113 mip_stats(
proto.mip_stats()) {
115 if (
proto.has_primal_solution_vector()) {
117 storage,
MakeView(
proto.primal_solution_vector()).as_map<VariableId>());
133 CallbackRegistrationProto result;
135 result.add_request_registration(
EnumToProto(event));
137 std::sort(result.mutable_request_registration()->begin(),
138 result.mutable_request_registration()->end());
155 CallbackResultProto result;
158 SparseDoubleVectorProto* solution_vector = result.add_suggested_solutions();
159 for (
const auto& [typed_id,
value] : SortedVariableValues(solution)) {
160 solution_vector->add_ids(typed_id.value());
161 solution_vector->add_values(
value);
165 CallbackResultProto::GeneratedLinearConstraint* constraint_proto =
167 constraint_proto->set_is_lazy(constraint.is_lazy);
168 constraint_proto->set_lower_bound(
169 constraint.linear_constraint.lower_bound_minus_offset());
170 constraint_proto->set_upper_bound(
171 constraint.linear_constraint.upper_bound_minus_offset());
172 for (
const auto& [typed_id,
value] : SortedVariableValues(
173 constraint.linear_constraint.expression.terms())) {
174 constraint_proto->mutable_linear_expression()->add_ids(typed_id.value());
175 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()