OR-Tools  9.3
model_parameters_validator.cc
Go to the documentation of this file.
1// Copyright 2010-2021 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
27namespace operations_research {
28namespace math_opt {
29namespace {
30absl::Status ValidateSolutionHint(const SolutionHintProto& solution_hint,
31 const ModelSummary& model_summary) {
32 const auto vector_view = MakeView(solution_hint.variable_values());
34 vector_view,
35 {.allow_positive_infinity = false, .allow_negative_infinity = false}))
36 << "Invalid solution_hint";
37 RETURN_IF_ERROR(CheckIdsSubset(solution_hint.variable_values().ids(),
38 model_summary.variables, "solution_hint ids",
39 "model IDs"));
40
41 return absl::OkStatus();
42}
43
44absl::Status ValidateBranchingPriorities(
45 const SparseInt32VectorProto& branching_priorities,
46 const ModelSummary& model_summary) {
47 const auto vector_view = MakeView(branching_priorities);
49 << "Invalid branching_priorities";
50 RETURN_IF_ERROR(CheckIdsSubset(branching_priorities.ids(),
51 model_summary.variables,
52 "branching_priorities ids", "model IDs"));
53
54 return absl::OkStatus();
55}
56
57} // namespace
58
59absl::Status ValidateSparseVectorFilter(const SparseVectorFilterProto& v,
60 const IdNameBiMap& valid_ids) {
63 CheckIdsSubset(v.filtered_ids(), valid_ids, "filtered_ids", "model IDs"));
64 if (!v.filter_by_ids() && !v.filtered_ids().empty()) {
65 return absl::InvalidArgumentError(
66 "Invalid SparseVectorFilterProto.filter_by_id* specification. To "
67 "filter by "
68 "IDs you must set SparseVectorFilterProto.filter_by_ids to 'true'.");
69 }
70
71 return absl::OkStatus();
72}
73
75 const ModelSolveParametersProto& parameters,
76 const ModelSummary& model_summary) {
78 parameters.variable_values_filter(), model_summary.variables))
79 << "invalid variable_values_filter";
81 model_summary.variables))
82 << "invalid reduced_costs_filter";
84 model_summary.linear_constraints))
85 << "invalid dual_values_filter";
86 if (parameters.has_initial_basis()) {
87 RETURN_IF_ERROR(ValidateBasis(parameters.initial_basis(), model_summary,
88 /*check_dual_feasibility=*/false));
89 }
90 for (const SolutionHintProto& solution_hint : parameters.solution_hints()) {
91 RETURN_IF_ERROR(ValidateSolutionHint(solution_hint, model_summary));
92 }
93 RETURN_IF_ERROR(ValidateBranchingPriorities(parameters.branching_priorities(),
94 model_summary));
95 return absl::OkStatus();
96}
97
98} // namespace math_opt
99} // 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)
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 ValidateSparseVectorFilter(const SparseVectorFilterProto &v, const IdNameBiMap &valid_ids)
absl::Status CheckIdsSubset(absl::Span< const int64_t > ids, const IdNameBiMap &universe, absl::string_view ids_description, absl::string_view universe_description)
absl::Status ValidateModelSolveParameters(const ModelSolveParametersProto &parameters, const ModelSummary &model_summary)
Collection of objects used to extend the Constraint Solver library.