OR-Tools  9.6
model_parameters_validator.cc
Go to the documentation of this file.
1 // Copyright 2010-2022 Google LLC
2 // Licensed under the Apache License, Version 2.0 (the "License");
3 // you may not use this file except in compliance with the License.
4 // You may obtain a copy of the License at
5 //
6 // http://www.apache.org/licenses/LICENSE-2.0
7 //
8 // Unless required by applicable law or agreed to in writing, software
9 // distributed under the License is distributed on an "AS IS" BASIS,
10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 // See the License for the specific language governing permissions and
12 // limitations under the License.
13 
15 
16 #include "absl/status/status.h"
21 #include "ortools/math_opt/model_parameters.pb.h"
22 #include "ortools/math_opt/sparse_containers.pb.h"
26 
27 namespace operations_research {
28 namespace math_opt {
29 namespace {
30 
31 absl::Status ValidateSolutionHint(const SolutionHintProto& solution_hint,
32  const ModelSummary& model_summary) {
34  MakeView(solution_hint.variable_values()),
35  {.allow_positive_infinity = false, .allow_negative_infinity = false}))
36  << "Invalid solution_hint.variable_values";
38  solution_hint.variable_values().ids(), model_summary.variables,
39  "solution_hint.variable_values ids", "model variable ids"));
40 
42  MakeView(solution_hint.dual_values()),
43  {.allow_positive_infinity = false, .allow_negative_infinity = false}))
44  << "Invalid solution_hint.dual_values";
46  solution_hint.dual_values().ids(), model_summary.linear_constraints,
47  "solution_hint.dual_values ids", "model linear constraint ids"));
48 
49  return absl::OkStatus();
50 }
51 
52 absl::Status ValidateBranchingPriorities(
53  const SparseInt32VectorProto& branching_priorities,
54  const ModelSummary& model_summary) {
55  const auto vector_view = MakeView(branching_priorities);
57  << "Invalid branching_priorities";
58  RETURN_IF_ERROR(CheckIdsSubset(branching_priorities.ids(),
59  model_summary.variables,
60  "branching_priorities ids", "model IDs"));
61 
62  return absl::OkStatus();
63 }
64 
65 } // namespace
66 
67 absl::Status ValidateSparseVectorFilter(const SparseVectorFilterProto& v,
68  const IdNameBiMap& valid_ids) {
71  CheckIdsSubset(v.filtered_ids(), valid_ids, "filtered_ids", "model IDs"));
72  if (!v.filter_by_ids() && !v.filtered_ids().empty()) {
73  return absl::InvalidArgumentError(
74  "Invalid SparseVectorFilterProto.filter_by_id* specification. To "
75  "filter by "
76  "IDs you must set SparseVectorFilterProto.filter_by_ids to 'true'.");
77  }
78 
79  return absl::OkStatus();
80 }
81 
83  const ModelSolveParametersProto& parameters,
84  const ModelSummary& model_summary) {
86  parameters.variable_values_filter(), model_summary.variables))
87  << "invalid variable_values_filter";
89  model_summary.variables))
90  << "invalid reduced_costs_filter";
92  model_summary.linear_constraints))
93  << "invalid dual_values_filter";
94  if (parameters.has_initial_basis()) {
95  RETURN_IF_ERROR(ValidateBasis(parameters.initial_basis(), model_summary,
96  /*check_dual_feasibility=*/false));
97  }
98  for (const SolutionHintProto& solution_hint : parameters.solution_hints()) {
99  RETURN_IF_ERROR(ValidateSolutionHint(solution_hint, model_summary));
100  }
101  RETURN_IF_ERROR(ValidateBranchingPriorities(parameters.branching_priorities(),
102  model_summary));
103  return absl::OkStatus();
104 }
105 
106 } // namespace math_opt
107 } // namespace operations_research
#define RETURN_IF_ERROR(expr)
SatParameters parameters
absl::Status ValidateBasis(const BasisProto &basis, const ModelSummary &model_summary, const bool check_dual_feasibility)
absl::Status CheckIdsRangeAndStrictlyIncreasing(absl::Span< const int64_t > ids)
absl::Status CheckIdsSubset(absl::Span< const int64_t > ids, const IdNameBiMap &universe, std::optional< int64_t > upper_bound)
absl::Status CheckIdsAndValues(const SparseVectorView< T > &vector_view, absl::string_view value_name="values")
absl::Status ValidateSparseVectorFilter(const SparseVectorFilterProto &v, const IdNameBiMap &valid_ids)
SparseVectorView< T > MakeView(absl::Span< const int64_t > ids, const Collection &values)
absl::Status ValidateModelSolveParameters(const ModelSolveParametersProto &parameters, const ModelSummary &model_summary)
Collection of objects used to extend the Constraint Solver library.