18#include "absl/status/status.h"
19#include "absl/time/time.h"
20#include "google/protobuf/repeated_field.h"
26#include "ortools/math_opt/model_parameters.pb.h"
27#include "ortools/math_opt/sparse_containers.pb.h"
37absl::Status ValidateSolutionHint(
const SolutionHintProto& solution_hint,
40 MakeView(solution_hint.variable_values()),
41 {.allow_positive_infinity = false, .allow_negative_infinity = false}))
42 <<
"Invalid solution_hint.variable_values";
44 solution_hint.variable_values().ids(), model_summary.variables,
45 "solution_hint.variable_values ids",
"model variable ids"));
48 MakeView(solution_hint.dual_values()),
49 {.allow_positive_infinity = false, .allow_negative_infinity = false}))
50 <<
"Invalid solution_hint.dual_values";
52 solution_hint.dual_values().ids(), model_summary.linear_constraints,
53 "solution_hint.dual_values ids",
"model linear constraint ids"));
55 return absl::OkStatus();
58absl::Status ValidateBranchingPriorities(
59 const SparseInt32VectorProto& branching_priorities,
61 const auto vector_view =
MakeView(branching_priorities);
63 <<
"Invalid branching_priorities";
65 model_summary.variables,
66 "branching_priorities ids",
"model IDs"));
68 return absl::OkStatus();
71absl::Status ValidateObjectiveParameters(
72 const ObjectiveParametersProto& parameters) {
73 if (parameters.objective_degradation_absolute_tolerance() < 0) {
75 <<
"ObjectiveParametersProto.objective_degradation_absolute_"
77 << parameters.objective_degradation_absolute_tolerance() <<
" < 0";
80 if (parameters.objective_degradation_relative_tolerance() < 0) {
82 <<
"ObjectiveParametersProto.objective_degradation_relative_"
84 << parameters.objective_degradation_relative_tolerance() <<
" < 0";
90 _ <<
"invalid ObjectiveParametersProto.time_limit");
93 <<
"ObjectiveParametersProto.time_limit = " <<
time_limit
97 return absl::OkStatus();
100absl::Status ValidateLazyLinearConstraints(
101 const google::protobuf::RepeatedField<int64_t>& lazy_linear_constraint_ids,
106 lazy_linear_constraint_ids, model_summary.linear_constraints,
107 "lazy_linear_constraint ids",
"model linear constraint IDs"));
108 return absl::OkStatus();
117 CheckIdsSubset(v.filtered_ids(), valid_ids,
"filtered_ids",
"model IDs"));
118 if (!v.filter_by_ids() && !v.filtered_ids().empty()) {
119 return absl::InvalidArgumentError(
120 "Invalid SparseVectorFilterProto.filter_by_id* specification. To "
122 "IDs you must set SparseVectorFilterProto.filter_by_ids to 'true'.");
125 return absl::OkStatus();
129 const ModelSolveParametersProto& parameters,
132 parameters.variable_values_filter(), model_summary.
variables))
133 <<
"invalid variable_values_filter";
136 <<
"invalid reduced_costs_filter";
139 <<
"invalid dual_values_filter";
140 if (parameters.has_initial_basis()) {
144 for (
const SolutionHintProto& solution_hint : parameters.solution_hints()) {
147 RETURN_IF_ERROR(ValidateBranchingPriorities(parameters.branching_priorities(),
150 ValidateObjectiveParameters(parameters.primary_objective_parameters()))
151 <<
"invalid primary_objective_parameters";
152 for (
const auto& [objective, params] :
153 parameters.auxiliary_objective_parameters()) {
156 <<
"Entry in auxiliary_objective_parameters for unknown "
161 <<
"invalid auxiliary_objective_parameters entry for objective: "
165 parameters.lazy_linear_constraint_ids(), model_summary))
166 <<
"invalid lazy_linear_constraint_ids";
167 return absl::OkStatus();
#define RETURN_IF_ERROR(expr)
bool HasId(int64_t id) const
An object oriented wrapper for quadratic constraints in ModelStorage.
SparseVectorView< T > MakeView(absl::Span< const int64_t > ids, const Collection &values)
absl::Status CheckIdsAndValues(const SparseVectorView< T > &vector_view, absl::string_view value_name="values")
absl::Status CheckIdsSubset(absl::Span< const int64_t > ids, const IdNameBiMap &universe, std::optional< int64_t > upper_bound)
absl::Status ValidateBasis(const BasisProto &basis, const ModelSummary &model_summary, const bool check_dual_feasibility)
absl::Status ValidateSparseVectorFilter(const SparseVectorFilterProto &v, const IdNameBiMap &valid_ids)
absl::Status ValidateModelSolveParameters(const ModelSolveParametersProto ¶meters, const ModelSummary &model_summary)
absl::Status CheckIdsRangeAndStrictlyIncreasing(absl::Span< const int64_t > ids)
In SWIG mode, we don't want anything besides these top-level includes.
inline ::absl::StatusOr< absl::Duration > DecodeGoogleApiProto(const google::protobuf::Duration &proto)
StatusBuilder InvalidArgumentErrorBuilder()
IdNameBiMap linear_constraints
IdNameBiMap auxiliary_objectives
#define OR_ASSIGN_OR_RETURN3(lhs, rexpr, error_expression)