103 lines
3.7 KiB
C++
103 lines
3.7 KiB
C++
// Copyright 2010-2021 Google LLC
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#include "ortools/sat/parameters_validation.h"
|
|
|
|
#include <string>
|
|
|
|
#include "absl/strings/str_cat.h"
|
|
#include "ortools/sat/sat_parameters.pb.h"
|
|
|
|
namespace operations_research {
|
|
namespace sat {
|
|
|
|
#define TEST_IN_RANGE(name, min, max) \
|
|
if (params.name() < min || params.name() > max) { \
|
|
return absl::StrCat("parameter '", #name, "' should be in [", min, ",", \
|
|
max, "]. Current value is ", params.name()); \
|
|
}
|
|
|
|
#define TEST_NOT_NAN(name) \
|
|
if (std::isnan(params.name())) { \
|
|
return absl::StrCat("parameter '", #name, "' is NaN"); \
|
|
}
|
|
|
|
std::string ValidateParameters(const SatParameters& params) {
|
|
if (params.max_time_in_seconds() < 0) {
|
|
return "Parameters max_time_in_seconds should be non-negative";
|
|
}
|
|
|
|
// Test that all floating point parameters are not NaN.
|
|
TEST_NOT_NAN(random_polarity_ratio);
|
|
TEST_NOT_NAN(random_branches_ratio);
|
|
TEST_NOT_NAN(initial_variables_activity);
|
|
TEST_NOT_NAN(clause_cleanup_ratio);
|
|
TEST_NOT_NAN(pb_cleanup_ratio);
|
|
TEST_NOT_NAN(variable_activity_decay);
|
|
TEST_NOT_NAN(max_variable_activity_value);
|
|
TEST_NOT_NAN(glucose_max_decay);
|
|
TEST_NOT_NAN(glucose_decay_increment);
|
|
TEST_NOT_NAN(clause_activity_decay);
|
|
TEST_NOT_NAN(max_clause_activity_value);
|
|
TEST_NOT_NAN(restart_dl_average_ratio);
|
|
TEST_NOT_NAN(restart_lbd_average_ratio);
|
|
TEST_NOT_NAN(blocking_restart_multiplier);
|
|
TEST_NOT_NAN(strategy_change_increase_ratio);
|
|
TEST_NOT_NAN(max_time_in_seconds);
|
|
TEST_NOT_NAN(max_deterministic_time);
|
|
TEST_NOT_NAN(absolute_gap_limit);
|
|
TEST_NOT_NAN(relative_gap_limit);
|
|
TEST_NOT_NAN(log_frequency_in_seconds);
|
|
TEST_NOT_NAN(presolve_probing_deterministic_time_limit);
|
|
TEST_NOT_NAN(merge_no_overlap_work_limit);
|
|
TEST_NOT_NAN(merge_at_most_one_work_limit);
|
|
TEST_NOT_NAN(min_orthogonality_for_lp_constraints);
|
|
TEST_NOT_NAN(cut_max_active_count_value);
|
|
TEST_NOT_NAN(cut_active_count_decay);
|
|
TEST_NOT_NAN(shaving_search_deterministic_time);
|
|
TEST_NOT_NAN(mip_max_bound);
|
|
TEST_NOT_NAN(mip_var_scaling);
|
|
TEST_NOT_NAN(mip_wanted_precision);
|
|
TEST_NOT_NAN(mip_check_precision);
|
|
TEST_NOT_NAN(mip_max_valid_magnitude);
|
|
|
|
// TODO(user): Consider using annotations directly in the proto for these
|
|
// validation. It is however not open sourced.
|
|
TEST_IN_RANGE(mip_max_activity_exponent, 1, 62);
|
|
TEST_IN_RANGE(mip_max_bound, 0, 1e17);
|
|
TEST_IN_RANGE(solution_pool_size, 0, std::numeric_limits<int32_t>::max());
|
|
|
|
if (params.enumerate_all_solutions() && params.num_search_workers() > 1) {
|
|
return "Enumerating all solutions does not work in parallel";
|
|
}
|
|
|
|
if (params.enumerate_all_solutions() && params.interleave_search()) {
|
|
return "Enumerating all solutions does not work with interleaved search";
|
|
}
|
|
|
|
if (params.num_workers() < 0) {
|
|
return "Parameters num_workers must be non-negative";
|
|
}
|
|
if (params.num_search_workers() < 0) {
|
|
return "Parameters num_search_workers must be non-negative";
|
|
}
|
|
|
|
return "";
|
|
}
|
|
|
|
#undef TEST_IN_RANGE
|
|
#undef TEST_NOT_NAN
|
|
|
|
} // namespace sat
|
|
} // namespace operations_research
|