20#include "absl/status/status.h"
21#include "absl/status/statusor.h"
22#include "absl/strings/string_view.h"
23#include "absl/time/time.h"
24#include "absl/types/span.h"
50 return "mip_solution";
65 return absl::MakeConstSpan(kCallbackEventValues);
87 CHECK_OK(maybe_time.status());
94 for (
const auto& [v, _] :
solution.value()) {
96 v.storage(), expected_storage))
97 <<
"invalid variable " << v <<
" in solution";
100 return absl::OkStatus();
116 _ <<
"failed to encode runtime");
128 const std::optional<CallbackEvent>
event =
EnumFromProto(event_proto);
129 if (event == std::nullopt) {
131 <<
"value CallbackRegistrationProto.request_registration[" << e
132 <<
"] is CALLBACK_EVENT_UNSPECIFIED";
134 if (!result.
events.insert(event.value()).second) {
137 <<
" is repeated at "
138 "CallbackRegistrationProto.request_registration["
146 _ <<
"invalid CallbackRegistrationProto.mip_solution_filter");
150 _ <<
"invalid CallbackRegistrationProto.mip_node_filter");
161 <<
"invalid mip_node_filter";
163 <<
"invalid mip_solution_filter";
164 return absl::OkStatus();
190 result_proto.
cuts(
c);
195 _ <<
"invalid CallbackResultProto.cuts[" <<
c <<
"].linear_expression");
197 for (
const auto [v, coeff] : coefficients) {
198 expression += coeff * v;
202 std::move(expression),
205 .is_lazy = constraint_proto.
is_lazy(),
216 _ <<
"invalid CallbackResultProto.suggested_solutions[" << s <<
"]");
229 <<
"invalid new_constraints";
232 for (
const auto& [v, _] :
solution) {
234 v.storage(), expected_storage))
235 <<
"invalid variable " << v <<
" in suggested_solutions";
238 return absl::OkStatus();
252 constraint.linear_constraint.lower_bound_minus_offset());
254 constraint.linear_constraint.upper_bound_minus_offset());
#define RETURN_IF_ERROR(expr)
void set_event(::operations_research::math_opt::CallbackEventProto value)
::operations_research::math_opt::CallbackDataProto_BarrierStats *PROTOBUF_NONNULL mutable_barrier_stats()
::operations_research::math_opt::CallbackEventProto event() const
bool has_primal_solution_vector() const
::operations_research::math_opt::CallbackDataProto_MipStats *PROTOBUF_NONNULL mutable_mip_stats()
::operations_research::math_opt::SparseDoubleVectorProto *PROTOBUF_NONNULL mutable_primal_solution_vector()
::operations_research::math_opt::CallbackDataProto_PresolveStats *PROTOBUF_NONNULL mutable_presolve_stats()
const ::google::protobuf::Duration & runtime() const
::operations_research::math_opt::CallbackDataProto_SimplexStats *PROTOBUF_NONNULL mutable_simplex_stats()
const ::operations_research::math_opt::SparseDoubleVectorProto & primal_solution_vector() const
::google::protobuf::Duration *PROTOBUF_NONNULL mutable_runtime()
::operations_research::math_opt::SparseVectorFilterProto *PROTOBUF_NONNULL mutable_mip_node_filter()
::operations_research::math_opt::SparseVectorFilterProto *PROTOBUF_NONNULL mutable_mip_solution_filter()
void set_add_lazy_constraints(bool value)
const ::operations_research::math_opt::SparseVectorFilterProto & mip_solution_filter() const
::google::protobuf::RepeatedField< int > *PROTOBUF_NONNULL mutable_request_registration()
void add_request_registration(::operations_research::math_opt::CallbackEventProto value)
bool add_lazy_constraints() const
::operations_research::math_opt::CallbackEventProto request_registration(int index) const
const ::operations_research::math_opt::SparseVectorFilterProto & mip_node_filter() const
void set_add_cuts(bool value)
int request_registration_size() const
double lower_bound() const
double upper_bound() const
void set_is_lazy(bool value)
void set_upper_bound(double value)
::operations_research::math_opt::SparseDoubleVectorProto *PROTOBUF_NONNULL mutable_linear_expression()
void set_lower_bound(double value)
const ::operations_research::math_opt::SparseDoubleVectorProto & linear_expression() const
const ::operations_research::math_opt::SparseDoubleVectorProto & suggested_solutions(int index) const
const ::operations_research::math_opt::CallbackResultProto_GeneratedLinearConstraint & cuts(int index) const
int suggested_solutions_size() const
CallbackResultProto_GeneratedLinearConstraint GeneratedLinearConstraint
::operations_research::math_opt::SparseDoubleVectorProto *PROTOBUF_NONNULL add_suggested_solutions()
void set_terminate(bool value)
::operations_research::math_opt::CallbackResultProto_GeneratedLinearConstraint *PROTOBUF_NONNULL add_cuts()
ModelStorageCPtr storage() const
absl::Status CheckModelStorage(const NullableModelStorageCPtr storage, const ModelStorageCPtr expected_storage)
const ModelStorage *absl_nonnull ModelStorageCPtr
absl::flat_hash_map< Variable, V > VariableMap
std::optional< typename EnumProto< P >::Cpp > EnumFromProto(P proto_value)
SparseDoubleVectorProto VariableValuesToProto(const VariableMap< double > &variable_values)
Enum< E >::Proto EnumToProto(std::optional< E > value)
absl::StatusOr< VariableMap< double > > VariableValuesFromProto(const ModelStorageCPtr model, const SparseDoubleVectorProto &vars_proto)
absl::StatusOr< MapFilter< Variable > > VariableFilterFromProto(const Model &model, const SparseVectorFilterProto &proto)
Select next search node to expand Select next item_i to add this new search node to the search Generate a new search node where item_i is not in the knapsack Check validity of this new partial solution(using propagators) - If valid
inline ::absl::StatusOr< absl::Duration > DecodeGoogleApiProto(const google::protobuf::Duration &proto)
inline ::absl::StatusOr< google::protobuf::Duration > EncodeGoogleApiProto(absl::Duration d)
StatusBuilder InvalidArgumentErrorBuilder()
CallbackDataProto::PresolveStats presolve_stats
absl::Status CheckModelStorage(ModelStorageCPtr expected_storage) const
CallbackDataProto::SimplexStats simplex_stats
CallbackDataProto::BarrierStats barrier_stats
std::optional< VariableMap< double > > solution
CallbackDataProto::MipStats mip_stats
absl::StatusOr< CallbackDataProto > Proto() const
CallbackData(CallbackEvent event, absl::Duration runtime)
absl::flat_hash_set< CallbackEvent > events
static absl::StatusOr< CallbackRegistration > FromProto(const Model &model, const CallbackRegistrationProto ®istration_proto)
MapFilter< Variable > mip_node_filter
bool add_lazy_constraints
absl::Status CheckModelStorage(ModelStorageCPtr expected_storage) const
MapFilter< Variable > mip_solution_filter
CallbackRegistrationProto Proto() const
std::vector< GeneratedLinearConstraint > new_constraints
CallbackResultProto Proto() const
static absl::StatusOr< CallbackResult > FromProto(const Model &model, const CallbackResultProto &result_proto)
std::vector< VariableMap< double > > suggested_solutions
absl::Status CheckModelStorage(ModelStorageCPtr expected_storage) const
static absl::Span< const E > AllValues()
static std::optional< absl::string_view > ToOptString(E value)
#define OR_ASSIGN_OR_RETURN3(lhs, rexpr, error_expression)