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) {
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();
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.
bool has_linear_constraint(int64_t id) const
Returns true if this id has been created and not yet deleted.
ModelStorageCPtr storage() const
LinearConstraint linear_constraint(int64_t id) const
Will CHECK if has_linear_constraint(id) is false.
static Objective Primary(ModelStorageCPtr storage)
Returns an object that refers to the primary objective of the model.
static Objective Auxiliary(ModelStorageCPtr storage, AuxiliaryObjectiveId id)
Returns an object that refers to an auxiliary objective of the model.
absl::Status CheckModelStorage(const NullableModelStorageCPtr storage, const ModelStorageCPtr expected_storage)
An object oriented wrapper for quadratic constraints in ModelStorage.
absl::flat_hash_map< Variable, V > VariableMap
absl::Nonnull< const ModelStorage * > ModelStorageCPtr
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.
ElementId< ElementType::kAuxiliaryObjective > AuxiliaryObjectiveId
absl::StatusOr< LinearConstraintMap< double > > LinearConstraintValuesFromProto(const ModelStorageCPtr model, const SparseDoubleVectorProto &lin_cons_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)
absl::StatusOr< VariableMap< double > > VariableValuesFromProto(const ModelStorageCPtr model, const SparseDoubleVectorProto &vars_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(ModelStorageCPtr 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(ModelStorageCPtr expected_storage) const
SolutionHintProto Proto() const
VariableMap< double > variable_values
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
absl::Status CheckModelStorage(ModelStorageCPtr expected_storage) 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)