23 #include "absl/container/flat_hash_set.h"
24 #include "absl/status/status.h"
25 #include "absl/status/statusor.h"
26 #include "absl/time/time.h"
28 #include "ortools/math_opt/callback.pb.h"
33 #include "ortools/math_opt/solution.pb.h"
34 #include "ortools/math_opt/sparse_containers.pb.h"
36 #include "absl/status/status.h"
43 std::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());
57 template <
typename Container>
59 IndexedModel*
const init_model =
nullptr) {
60 IndexedModel* result = init_model;
61 for (
const auto& item : model_items) {
62 IndexedModel*
const model = item.model();
63 if (
model !=
nullptr) {
64 if (result ==
nullptr) {
77 : event(
proto.event()),
78 messages(
proto.messages().begin(),
proto.messages().end()),
79 presolve_stats(
proto.presolve_stats()),
80 simplex_stats(
proto.simplex_stats()),
81 barrier_stats(
proto.barrier_stats()),
82 mip_stats(
proto.mip_stats()) {
83 if (
proto.has_primal_solution()) {
86 .as_map<VariableId>());
102 CallbackRegistrationProto result;
103 for (
const CallbackEventProto event :
events) {
104 result.add_request_registration(event);
106 std::sort(result.mutable_request_registration()->begin(),
107 result.mutable_request_registration()->end());
124 CallbackResultProto result;
127 PrimalSolutionProto* solution_proto = result.add_suggested_solution();
128 for (
const auto& [typed_id,
value] : SortedVariableValues(solution)) {
129 solution_proto->mutable_variable_values()->add_ids(typed_id.value());
130 solution_proto->mutable_variable_values()->add_values(
value);
134 CallbackResultProto::GeneratedLinearConstraint* constraint_proto =
136 constraint_proto->set_is_lazy(constraint.is_lazy);
137 constraint_proto->set_lower_bound(
138 constraint.linear_constraint.lower_bound_minus_offset());
139 constraint_proto->set_upper_bound(
140 constraint.linear_constraint.upper_bound_minus_offset());
141 for (
const auto& [typed_id,
value] : SortedVariableValues(
142 constraint.linear_constraint.expression.terms())) {
143 constraint_proto->mutable_linear_expression()->add_ids(typed_id.value());
144 constraint_proto->mutable_linear_expression()->add_values(
value);
#define CHECK_EQ(val1, val2)
constexpr absl::string_view kObjectsFromOtherIndexedModel
IndexedModel * ConsistentModel(std::initializer_list< IndexedModel * > models)
SparseVectorView< T > MakeView(absl::Span< const int64_t > ids, const Collection &values)
Collection of objects used to extend the Constraint Solver library.
inline ::absl::StatusOr< absl::Duration > DecodeGoogleApiProto(const google::protobuf::Duration &proto)
absl::optional< VariableMap< double > > solution
CallbackRegistrationProto Proto() const
MapFilter< Variable > mip_solution_filter
IndexedModel * model() const
absl::flat_hash_set< CallbackEventProto > events
bool add_lazy_constraints
MapFilter< Variable > mip_node_filter
IndexedModel * model() const
std::vector< VariableMap< double > > suggested_solutions
CallbackResultProto Proto() const
std::vector< GeneratedLinearConstraint > new_constraints