25 #include "absl/memory/memory.h" 26 #include "absl/status/status.h" 27 #include "absl/status/statusor.h" 28 #include "absl/types/span.h" 29 #include "ortools/math_opt/callback.pb.h" 32 #include "ortools/math_opt/model.pb.h" 33 #include "ortools/math_opt/model_parameters.pb.h" 34 #include "ortools/math_opt/model_update.pb.h" 35 #include "ortools/math_opt/parameters.pb.h" 36 #include "ortools/math_opt/result.pb.h" 49 template <
typename IdNameContainer>
50 void UpdateIdNameMap(
const absl::Span<const int64_t> deleted_ids,
51 const IdNameContainer& container, IdNameBiMap& bimap) {
52 for (
const int64_t deleted_id : deleted_ids) {
53 bimap.Erase(deleted_id);
55 for (
int i = 0; i < container.ids_size(); ++i) {
57 if (!container.names().empty()) {
58 name = container.names(i);
60 bimap.Insert(container.ids(i), std::move(
name));
64 ModelSummary MakeSummary(
const ModelProto&
model) {
66 UpdateIdNameMap<VariablesProto>({},
model.variables(), summary.variables);
67 UpdateIdNameMap<LinearConstraintsProto>({},
model.linear_constraints(),
68 summary.linear_constraints);
72 void UpdateSummaryFromModelUpdate(
const ModelUpdateProto& model_update,
73 ModelSummary& summary) {
74 UpdateIdNameMap<VariablesProto>(model_update.deleted_variable_ids(),
75 model_update.new_variables(),
77 UpdateIdNameMap<LinearConstraintsProto>(
78 model_update.deleted_linear_constraint_ids(),
79 model_update.new_linear_constraints(), summary.linear_constraints);
84 absl::Status ToInternalError(
const absl::Status original) {
89 return absl::InternalError(original.message());
95 ModelSummary model_summary)
96 : underlying_solver_(std::move(underlying_solver)),
97 model_summary_(std::move(model_summary)) {
98 CHECK(underlying_solver_ !=
nullptr);
101 absl::StatusOr<std::unique_ptr<Solver>> Solver::New(
102 const SolverType solver_type,
const ModelProto&
model,
103 const SolverInitializerProto& initializer) {
106 auto underlying_solver,
107 AllSolversRegistry::Instance()->Create(solver_type,
model, initializer));
108 auto result = absl::WrapUnique(
109 new Solver(std::move(underlying_solver), MakeSummary(
model)));
115 const ModelSolveParametersProto& model_parameters,
116 const CallbackRegistrationProto& callback_registration,
125 <<
"invalid model_parameters";
128 if (user_cb !=
nullptr) {
131 cb = [&](
const CallbackDataProto& callback_data)
132 -> absl::StatusOr<CallbackResultProto> {
134 callback_data, callback_registration, model_summary_));
135 auto callback_result = user_cb(callback_data);
138 callback_registration, model_summary_));
139 return callback_result;
144 underlying_solver_->Solve(
parameters, model_parameters,
145 callback_registration, cb));
156 absl::StatusOr<bool> Solver::Update(
const ModelUpdateProto& model_update) {
158 if (!underlying_solver_->CanUpdate(model_update)) {
161 UpdateSummaryFromModelUpdate(model_update, model_summary_);
absl::Status ValidateCallbackRegistration(const CallbackRegistrationProto &callback_registration, const ModelSummary &model_summary)
Solver(const std::string &name)
Solver API.
absl::Status ValidateCallbackDataProto(const CallbackDataProto &cb_data, const CallbackRegistrationProto &callback_registration, const ModelSummary &model_summary)
absl::Status ValidateModelSolveParameters(const ModelSolveParametersProto ¶meters, const ModelSummary &model_summary)
ConstraintSolverParameters parameters() const
Stored Parameters.
absl::Status ValidateModelUpdateAndSummary(const ModelUpdateProto &model_update, const ModelSummary &model_summary, const bool check_names)
Solver(const Solver &)=delete
absl::Status ValidateResult(const SolveResultProto &result, const ModelSolveParametersProto ¶meters, const ModelSummary &model_summary)
std::function< CallbackResultProto(const CallbackDataProto &)> Callback
absl::Status ValidateSolverParameters(const SolveParametersProto ¶meters)
std::function< absl::StatusOr< CallbackResultProto >(const CallbackDataProto &)> Callback
absl::Status ValidateCallbackResultProto(const CallbackResultProto &callback_result, const CallbackEventProto callback_event, const CallbackRegistrationProto &callback_registration, const ModelSummary &model_summary)
absl::Status ValidateModel(const ModelProto &model, const bool check_names)
Collection of objects used to extend the Constraint Solver library.
#define RETURN_IF_ERROR(expr)
bool Solve(DecisionBuilder *const db, const std::vector< SearchMonitor * > &monitors)
#define ASSIGN_OR_RETURN(lhs, rexpr)