18#include <initializer_list>
22#include "absl/algorithm/container.h"
23#include "absl/log/check.h"
24#include "absl/status/status.h"
25#include "absl/status/statusor.h"
26#include "absl/time/time.h"
27#include "google/protobuf/repeated_field.h"
35#include "ortools/math_opt/model_parameters.pb.h"
36#include "ortools/math_opt/solution.pb.h"
37#include "ortools/math_opt/sparse_containers.pb.h"
44using ::google::protobuf::RepeatedField;
56 std::initializer_list<Variable> variables) {
61 const ModelStorage*
const expected_storage)
const {
64 <<
"invalid hint in solution_hints";
68 <<
"invalid initial_basis";
71 <<
"invalid variable_values_filter";
73 <<
"invalid dual_values_filter";
76 <<
"invalid quadratic_dual_values_filter";
78 <<
"invalid reduced_costs_filter";
83 <<
"invalid variable " << var <<
" in branching_priorities";
89 <<
"invalid objective " << objective <<
" in objective_parameters";
94 lazy_linear_constraint.storage(),
96 <<
"invalid LinearConstraint " << lazy_linear_constraint
97 <<
" in lazy_linear_constraints";
99 return absl::OkStatus();
103 const ModelStorage* expected_storage)
const {
108 <<
"invalid variable " << v <<
" in variable_values";
114 <<
"invalid constraint " <<
c <<
" in dual_values";
116 return absl::OkStatus();
120 SolutionHintProto hint;
126absl::StatusOr<ModelSolveParameters::SolutionHint>
128 const Model& model,
const SolutionHintProto& hint_proto) {
132 _ <<
"failed to parse SolutionHintProto.variable_values");
135 model.
storage(), hint_proto.dual_values()),
136 _ <<
"failed to parse SolutionHintProto.dual_values");
143absl::StatusOr<ObjectiveParametersProto>
145 ObjectiveParametersProto params;
147 params.set_objective_degradation_absolute_tolerance(
151 params.set_objective_degradation_relative_tolerance(
161absl::StatusOr<ModelSolveParameters::ObjectiveParameters>
163 const ObjectiveParametersProto& proto) {
165 if (proto.has_objective_degradation_absolute_tolerance()) {
167 proto.objective_degradation_absolute_tolerance();
169 if (proto.has_objective_degradation_relative_tolerance()) {
171 proto.objective_degradation_relative_tolerance();
173 if (proto.has_time_limit()) {
176 _ <<
"invalid time_limit");
185 ModelSolveParametersProto ret;
188 *ret.mutable_quadratic_dual_values_filter() =
197 *ret.add_solution_hints() = solution_hint.Proto();
200 RepeatedField<int64_t>& variable_ids =
201 *ret.mutable_branching_priorities()->mutable_ids();
202 RepeatedField<int32_t>& variable_values =
203 *ret.mutable_branching_priorities()->mutable_values();
207 variable_ids.Add(key.id());
212 if (objective.id().has_value()) {
214 ((*ret.mutable_auxiliary_objective_parameters())[*objective.id()]),
216 _ <<
"invalid parameters for objective " << *objective.id());
220 _ <<
"invalid parameters for primary objective");
224 RepeatedField<int64_t>& lazy_linear_constraint_ids =
225 *ret.mutable_lazy_linear_constraint_ids();
226 lazy_linear_constraint_ids.Reserve(
230 lazy_linear_constraint_ids.Add(lazy_linear_constraint.id());
232 absl::c_sort(lazy_linear_constraint_ids);
238 const Model& model,
const ModelSolveParametersProto& proto) {
243 _ <<
"invalid variable_values_filter");
247 _ <<
"invalid dual_values_filter");
250 model, proto.quadratic_dual_values_filter()),
251 _ <<
"invalid quadratic_dual_values_filter");
255 _ <<
"invalid reduced_costs_filter");
256 if (proto.has_initial_basis()) {
260 _ <<
"invalid initial_basis");
262 for (
int i = 0; i < proto.solution_hints_size(); ++i) {
266 _ <<
"invalid solution_hints[" << i <<
"]");
272 _ <<
"invalid branching_priorities");
273 if (proto.has_primary_objective_parameters()) {
275 auto primary_objective_params,
277 _ <<
"invalid primary_objective_parameters");
280 std::move(primary_objective_params));
282 for (
const auto& [
id, aux_obj_params_proto] :
283 proto.auxiliary_objective_parameters()) {
286 <<
"invalid auxiliary_objective_parameters with id: " <<
id
287 <<
", objective not in the model";
292 _ <<
"invalid auxiliary_objective_parameters with id: " <<
id);
295 std::move(aux_obj_params));
297 for (int64_t lin_con : proto.lazy_linear_constraint_ids()) {
300 <<
"invalid lazy_linear_constraint with id: " << lin_con
301 <<
", constraint not in the model";
#define RETURN_IF_ERROR(expr)
bool has_auxiliary_objective(int64_t id) const
Returns true if this id has been created and not yet deleted.
const ModelStorage * storage() const
bool has_linear_constraint(int64_t id) const
Returns true if this id has been created and not yet deleted.
LinearConstraint linear_constraint(int64_t id) const
Will CHECK if has_linear_constraint(id) is false.
static Objective Primary(const ModelStorage *storage)
Returns an object that refers to the primary objective of the model.
static Objective Auxiliary(const ModelStorage *storage, AuxiliaryObjectiveId id)
Returns an object that refers to an auxiliary objective of the model.
absl::Status CheckModelStorage(const ModelStorage *const storage, const ModelStorage *const expected_storage)
An object oriented wrapper for quadratic constraints in ModelStorage.
absl::flat_hash_map< Variable, V > VariableMap
MapFilter< KeyType > MakeSkipAllFilter()
absl::flat_hash_map< LinearConstraint, V > LinearConstraintMap
SparseDoubleVectorProto LinearConstraintValuesToProto(const LinearConstraintMap< double > &linear_constraint_values)
Returns the proto equivalent of linear_constraint_values.
absl::StatusOr< LinearConstraintMap< double > > LinearConstraintValuesFromProto(const ModelStorage *const model, const SparseDoubleVectorProto &lin_cons_proto)
absl::StatusOr< VariableMap< double > > VariableValuesFromProto(const ModelStorage *const model, const SparseDoubleVectorProto &vars_proto)
absl::StatusOr< MapFilter< LinearConstraint > > LinearConstraintFilterFromProto(const Model &model, const SparseVectorFilterProto &proto)
SparseDoubleVectorProto VariableValuesToProto(const VariableMap< double > &variable_values)
Returns the proto equivalent of variable_values.
absl::StatusOr< MapFilter< QuadraticConstraint > > QuadraticConstraintFilterFromProto(const Model &model, const SparseVectorFilterProto &proto)
std::vector< typename Map::key_type > SortedKeys(const Map &map)
absl::StatusOr< MapFilter< Variable > > VariableFilterFromProto(const Model &model, const SparseVectorFilterProto &proto)
In SWIG mode, we don't want anything besides these top-level includes.
inline ::absl::StatusOr< absl::Duration > DecodeGoogleApiProto(const google::protobuf::Duration &proto)
inline ::absl::StatusOr< google::protobuf::Duration > EncodeGoogleApiProto(absl::Duration d)
StatusBuilder InvalidArgumentErrorBuilder()
static absl::StatusOr< Basis > FromProto(const ModelStorage *model, const BasisProto &basis_proto)
Parameters for an individual objective in a multi-objective model.
std::optional< double > objective_degradation_relative_tolerance
absl::Duration time_limit
static absl::StatusOr< ObjectiveParameters > FromProto(const ObjectiveParametersProto &proto)
std::optional< double > objective_degradation_absolute_tolerance
absl::StatusOr< ObjectiveParametersProto > Proto() const
Returns the proto equivalent of this object.
static absl::StatusOr< SolutionHint > FromProto(const Model &model, const SolutionHintProto &hint_proto)
LinearConstraintMap< double > dual_values
absl::Status CheckModelStorage(const ModelStorage *expected_storage) const
SolutionHintProto Proto() const
VariableMap< double > variable_values
absl::Status CheckModelStorage(const ModelStorage *expected_storage) const
MapFilter< QuadraticConstraint > quadratic_dual_values_filter
MapFilter< LinearConstraint > dual_values_filter
The filter that is applied to dual_values of DualSolution and DualRay.
MapFilter< Variable > variable_values_filter
ObjectiveMap< ObjectiveParameters > objective_parameters
Parameters for individual objectives in a multi-objective model.
std::optional< Basis > initial_basis
static ModelSolveParameters OnlySomePrimalVariables(const Collection &variables)
VariableMap< int32_t > branching_priorities
static ModelSolveParameters OnlyPrimalVariables()
absl::StatusOr< ModelSolveParametersProto > Proto() const
MapFilter< Variable > reduced_costs_filter
The filter that is applied to reduced_costs of DualSolution and DualRay.
static absl::StatusOr< ModelSolveParameters > FromProto(const Model &model, const ModelSolveParametersProto &proto)
absl::flat_hash_set< LinearConstraint > lazy_linear_constraints
std::vector< SolutionHint > solution_hints
#define OR_ASSIGN_OR_RETURN3(lhs, rexpr, error_expression)