21#include "absl/container/flat_hash_map.h"
22#include "absl/strings/str_cat.h"
23#include "absl/strings/str_format.h"
24#include "absl/time/time.h"
25#include "google/protobuf/descriptor.h"
26#include "google/protobuf/duration.pb.h"
27#include "google/protobuf/message.h"
57IteratedLocalSearchParameters CreateDefaultIteratedLocalSearchParameters() {
58 IteratedLocalSearchParameters ils;
60 RuinRecreateParameters* rr = ils.mutable_ruin_recreate_parameters();
71 rr->set_route_selection_neighbors_ratio(1.0);
72 rr->set_route_selection_min_neighbors(10);
73 rr->set_route_selection_max_neighbors(100);
74 ils.set_improve_perturbed_solution(
true);
76 SimulatedAnnealingParameters* sa =
77 ils.mutable_simulated_annealing_parameters();
79 sa->set_initial_temperature(100.0);
80 sa->set_final_temperature(0.01);
81 sa->set_automatic_temperatures(
false);
88 p.set_use_unfiltered_first_solution_strategy(
false);
89 p.set_savings_neighbors_ratio(1);
90 p.set_savings_max_memory_usage_bytes(6e9);
91 p.set_savings_add_reverse_arcs(
false);
92 p.set_savings_arc_coefficient(1);
93 p.set_cheapest_insertion_farthest_seeds_ratio(0);
94 p.set_cheapest_insertion_first_solution_neighbors_ratio(1);
95 p.set_cheapest_insertion_first_solution_min_neighbors(1);
96 p.set_cheapest_insertion_ls_operator_neighbors_ratio(1);
97 p.set_cheapest_insertion_ls_operator_min_neighbors(1);
98 p.set_cheapest_insertion_first_solution_use_neighbors_ratio_for_initialization(
100 p.set_cheapest_insertion_add_unperformed_entries(
false);
101 p.set_local_cheapest_insertion_pickup_delivery_strategy(
103 p.set_local_cheapest_cost_insertion_pickup_delivery_strategy(
106 p.mutable_local_search_operators();
109 o->set_use_light_relocate_pair(
BOOL_TRUE);
117 o->set_use_relocate_expensive_chain(
BOOL_TRUE);
123 o->set_use_relocate_and_make_active(
BOOL_FALSE);
124 o->set_use_exchange_and_make_active(
BOOL_FALSE);
125 o->set_use_exchange_path_start_ends_and_make_active(
BOOL_FALSE);
127 o->set_use_make_chain_inactive(
BOOL_TRUE);
131 o->set_use_shortest_path_swap_active(
BOOL_TRUE);
132 o->set_use_shortest_path_two_opt(
BOOL_TRUE);
138 o->set_use_global_cheapest_insertion_path_lns(
BOOL_TRUE);
139 o->set_use_local_cheapest_insertion_path_lns(
BOOL_TRUE);
140 o->set_use_relocate_path_global_cheapest_insertion_insert_unperformed(
142 o->set_use_global_cheapest_insertion_expensive_chain_lns(
BOOL_FALSE);
143 o->set_use_local_cheapest_insertion_expensive_chain_lns(
BOOL_FALSE);
144 o->set_use_global_cheapest_insertion_close_nodes_lns(
BOOL_FALSE);
145 o->set_use_local_cheapest_insertion_close_nodes_lns(
BOOL_FALSE);
146 p.set_ls_operator_neighbors_ratio(1);
147 p.set_ls_operator_min_neighbors(1);
148 p.set_use_multi_armed_bandit_concatenate_operators(
false);
149 p.set_multi_armed_bandit_compound_operator_memory_coefficient(0.04);
150 p.set_multi_armed_bandit_compound_operator_exploration_coefficient(1e12);
151 p.set_max_swap_active_chain_size(10);
152 p.set_relocate_expensive_chain_num_arcs_to_consider(4);
153 p.set_heuristic_expensive_chain_lns_num_arcs_to_consider(4);
154 p.set_heuristic_close_nodes_lns_num_nodes(5);
156 p.set_num_max_local_optima_before_metaheuristic_switch(200);
157 p.set_guided_local_search_lambda_coefficient(0.1);
158 p.set_guided_local_search_reset_penalties_on_new_best_solution(
false);
159 p.set_use_depth_first_search(
false);
163 p.mutable_sat_parameters()->set_linearization_level(2);
164 p.mutable_sat_parameters()->set_num_search_workers(1);
165 p.set_report_intermediate_cp_sat_solutions(
false);
166 p.set_fallback_to_cp_sat_size_threshold(20);
168 p.set_mixed_integer_scheduling_solver(
170 p.set_disable_scheduling_beware_this_may_degrade_performance(
false);
171 p.set_optimization_step(0.0);
172 p.set_number_of_solutions_to_collect(1);
175 p.mutable_lns_time_limit()->set_nanos(100000000);
176 p.set_secondary_ls_time_limit_ratio(0);
177 p.set_use_full_propagation(
false);
178 p.set_log_search(
false);
179 p.set_log_cost_scaling_factor(1.0);
180 p.set_log_cost_offset(0.0);
181 p.set_use_iterated_local_search(
false);
182 *p.mutable_iterated_local_search_parameters() =
183 CreateDefaultIteratedLocalSearchParameters();
186 LOG_IF(DFATAL, !error.empty())
187 <<
"The default search parameters aren't valid: " << error;
194 p.set_use_iterated_local_search(
false);
195 *p.mutable_iterated_local_search_parameters() =
196 CreateDefaultIteratedLocalSearchParameters();
198 p.mutable_local_search_operators();
201 o->set_use_light_relocate_pair(
BOOL_TRUE);
209 o->set_use_relocate_expensive_chain(
BOOL_FALSE);
215 o->set_use_relocate_and_make_active(
BOOL_FALSE);
216 o->set_use_exchange_and_make_active(
BOOL_FALSE);
217 o->set_use_exchange_path_start_ends_and_make_active(
BOOL_FALSE);
223 o->set_use_shortest_path_swap_active(
BOOL_FALSE);
230 o->set_use_global_cheapest_insertion_path_lns(
BOOL_FALSE);
231 o->set_use_local_cheapest_insertion_path_lns(
BOOL_FALSE);
232 o->set_use_relocate_path_global_cheapest_insertion_insert_unperformed(
235 LOG_IF(DFATAL, !error.empty())
236 <<
"The default secondary search parameters aren't valid: " << error;
243 static const auto* default_parameters =
245 return *default_parameters;
250 CreateDefaultSecondaryRoutingSearchParameters());
251 return *default_parameters;
255bool IsValidNonNegativeDuration(
const google::protobuf::Duration& d) {
257 return status_or_duration.ok() &&
258 status_or_duration.value() >= absl::ZeroDuration();
263void FindErrorsInIteratedLocalSearchParameters(
265 std::vector<std::string>& errors) {
267 if (!search_parameters.use_iterated_local_search()) {
271 if (!search_parameters.has_iterated_local_search_parameters()) {
273 "use_iterated_local_search is true but "
274 "iterated_local_search_parameters are missing.");
279 search_parameters.iterated_local_search_parameters();
283 StrCat(
"Invalid value for "
284 "iterated_local_search_parameters.perturbation_strategy: ",
285 ils.perturbation_strategy()));
289 if (!ils.has_ruin_recreate_parameters()) {
290 errors.emplace_back(StrCat(
291 "iterated_local_search_parameters.perturbation_strategy is ",
293 " but iterated_local_search_parameters.ruin_recreate_parameters are "
300 if (rr.ruin_strategies().empty()) {
302 StrCat(
"iterated_local_search_parameters.ruin_recreate_parameters."
303 "ruin_strategies is empty"));
306 if (rr.ruin_strategies().size() > 1 &&
308 errors.emplace_back(StrCat(
309 "iterated_local_search_parameters.ruin_recreate_parameters."
310 "ruin_composition_strategy cannot be unset when more than one ruin "
311 "strategy is defined"));
314 for (
const auto& ruin : rr.ruin_strategies()) {
316 ruin.spatially_close_routes().num_ruined_routes() == 0) {
317 errors.emplace_back(StrCat(
318 "iterated_local_search_parameters.ruin_recreate_parameters."
319 "ruin_strategy is set to SpatiallyCloseRoutesRuinStrategy"
320 " but spatially_close_routes.num_ruined_routes is 0 (should be "
321 "strictly positive)"));
323 ruin.random_walk().num_removed_visits() == 0) {
325 StrCat(
"iterated_local_search_parameters.ruin_recreate_parameters."
326 "ruin_strategy is set to RandomWalkRuinStrategy"
327 " but random_walk.num_removed_visits is 0 (should be "
328 "strictly positive)"));
330 if (ruin.sisr().avg_num_removed_visits() == 0) {
332 "iterated_local_search_parameters.ruin_recreate_parameters."
333 "ruin is set to SISRRuinStrategy"
334 " but sisr.avg_num_removed_visits is 0 (should be strictly "
337 if (ruin.sisr().max_removed_sequence_size() == 0) {
339 "iterated_local_search_parameters.ruin_recreate_parameters.ruin "
340 "is set to SISRRuinStrategy but "
341 "sisr.max_removed_sequence_size is 0 (should be strictly "
344 if (ruin.sisr().bypass_factor() < 0 ||
345 ruin.sisr().bypass_factor() > 1) {
346 errors.emplace_back(StrCat(
347 "iterated_local_search_parameters.ruin_recreate_parameters."
348 "ruin is set to SISRRuinStrategy"
349 " but sisr.bypass_factor is not in [0, 1]"));
354 if (
const double ratio = rr.route_selection_neighbors_ratio();
355 std::isnan(ratio) || ratio <= 0 || ratio > 1) {
358 "iterated_local_search_parameters.ruin_recreate_parameters."
359 "route_selection_neighbors_ratio: ",
362 if (rr.route_selection_min_neighbors() == 0) {
364 StrCat(
"iterated_local_search_parameters.ruin_recreate_parameters."
365 "route_selection_min_neighbors must be positive"));
367 if (rr.route_selection_min_neighbors() >
368 rr.route_selection_max_neighbors()) {
370 StrCat(
"iterated_local_search_parameters.ruin_recreate_parameters."
371 "route_selection_min_neighbors cannot be greater than "
372 "iterated_local_search_parameters.ruin_recreate_parameters."
373 "route_selection_max_neighbors"));
378 StrCat(
"Invalid value for "
379 "iterated_local_search_parameters.ruin_recreate_parameters."
380 "recreate_strategy: ",
381 rr.recreate_strategy()));
387 StrCat(
"Invalid value for "
388 "iterated_local_search_parameters.acceptance_strategy: ",
389 ils.acceptance_strategy()));
393 if (!ils.has_simulated_annealing_parameters()) {
395 StrCat(
"iterated_local_search_parameters.acceptance_strategy is ",
398 "iterated_local_search_parameters.simulated_annealing_"
399 "parameters are missing."));
404 ils.simulated_annealing_parameters();
406 if (sa_params.cooling_schedule_strategy() ==
409 StrCat(
"Invalid value for "
410 "iterated_local_search_parameters.simulated_annealing_"
411 "parameters.cooling_schedule_strategy: ",
412 sa_params.cooling_schedule_strategy()));
415 if (!sa_params.automatic_temperatures()) {
416 if (sa_params.initial_temperature() < sa_params.final_temperature()) {
418 "iterated_local_search_parameters.simulated_annealing_parameters."
419 "initial_temperature cannot be lower than "
420 "iterated_local_search_parameters.simulated_annealing_parameters."
421 "final_temperature.");
424 if (sa_params.initial_temperature() < 1e-9) {
426 "iterated_local_search_parameters.simulated_annealing_parameters."
427 "initial_temperature cannot be lower than 1e-9.");
430 if (sa_params.final_temperature() < 1e-9) {
432 "iterated_local_search_parameters.simulated_annealing_parameters."
433 "final_temperature cannot be lower than 1e-9.");
443 const std::vector<std::string> errors =
445 return (errors.empty()) ?
"" : errors[0];
451 std::vector<std::string> errors;
456#if !defined(__ANDROID__) && !defined(__wasm__)
458 using Reflection = google::protobuf::Reflection;
459 using Descriptor = google::protobuf::Descriptor;
460 using FieldDescriptor = google::protobuf::FieldDescriptor;
465 for (
int field_index = 0;
466 field_index < ls_descriptor->field_count(); ++field_index) {
467 const FieldDescriptor* field = ls_descriptor->field(field_index);
468 if (field->type() != FieldDescriptor::TYPE_ENUM ||
471 <<
"In RoutingSearchParameters::LocalSearchNeighborhoodOperators,"
472 <<
" field '" << field->name() <<
"' is not an OptionalBoolean.";
474 const int value = ls_reflection->GetEnum(operators, field)->number();
476 errors.emplace_back(absl::StrFormat(
477 "local_search_neighborhood_operator.%s should be set to "
478 "BOOL_TRUE or BOOL_FALSE instead of %s (value: %d)",
488 std::isnan(ratio) || ratio <= 0 || ratio > 1) {
489 errors.emplace_back(StrCat(
"Invalid savings_neighbors_ratio: ", ratio));
491 if (
const double max_memory =
493 std::isnan(max_memory) || max_memory <= 0 || max_memory > 1e10) {
495 StrCat(
"Invalid savings_max_memory_usage_bytes: ", max_memory));
498 std::isnan(coefficient) || coefficient <= 0 || std::isinf(coefficient)) {
500 StrCat(
"Invalid savings_arc_coefficient: ", coefficient));
502 if (
const double ratio =
504 std::isnan(ratio) || ratio < 0 || ratio > 1) {
506 StrCat(
"Invalid cheapest_insertion_farthest_seeds_ratio: ", ratio));
508 if (
const double ratio =
510 std::isnan(ratio) || ratio <= 0 || ratio > 1) {
511 errors.emplace_back(StrCat(
512 "Invalid cheapest_insertion_first_solution_neighbors_ratio: ", ratio));
514 if (
const int32_t min_neighbors =
518 StrCat(
"Invalid cheapest_insertion_first_solution_min_neighbors: ",
519 min_neighbors,
". Must be greater or equal to 1."));
521 if (
const double ratio =
523 std::isnan(ratio) || ratio <= 0 || ratio > 1) {
524 errors.emplace_back(StrCat(
525 "Invalid cheapest_insertion_ls_operator_neighbors_ratio: ", ratio));
527 if (
const int32_t min_neighbors =
530 errors.emplace_back(StrCat(
531 "Invalid cheapest_insertion_ls_operator_min_neighbors: ", min_neighbors,
532 ". Must be greater or equal to 1."));
535 absl::flat_hash_map<RoutingSearchParameters::InsertionSortingProperty, int>
536 sorting_properties_map;
539 local_cheapest_insertion_sorting_properties)) {
542 StrCat(
"Invalid local cheapest insertion sorting property: ",
546 const int occurrences = sorting_properties_map[property]++;
547 if (occurrences == 2) {
548 errors.emplace_back(StrCat(
549 "Duplicate local cheapest insertion sorting property: ",
556 StrCat(
"SORTING_PROPERTY_RANDOM cannot be used in conjunction "
557 "with other properties."));
562 std::isnan(ratio) || ratio <= 0 || ratio > 1) {
563 errors.emplace_back(StrCat(
"Invalid ls_operator_neighbors_ratio: ", ratio));
565 if (
const int32_t min_neighbors =
569 StrCat(
"Invalid ls_operator_min_neighbors: ", min_neighbors,
570 ". Must be greater or equal to 1."));
572 if (
const int32_t num_arcs =
574 num_arcs < 2 || num_arcs > 1e6) {
575 errors.emplace_back(StrCat(
576 "Invalid relocate_expensive_chain_num_arcs_to_consider: ", num_arcs,
577 ". Must be between 2 and 10^6 (included)."));
579 if (
const int32_t num_arcs =
581 .heuristic_expensive_chain_lns_num_arcs_to_consider();
582 num_arcs < 2 || num_arcs > 1e6) {
584 StrCat(
"Invalid heuristic_expensive_chain_lns_num_arcs_to_consider: ",
585 num_arcs,
". Must be between 2 and 10^6 (included)."));
587 if (
const int32_t num_nodes =
589 num_nodes < 0 || num_nodes > 1e4) {
591 StrCat(
"Invalid heuristic_close_nodes_lns_num_nodes: ", num_nodes,
592 ". Must be between 0 and 10000 (included)."));
594 if (
const double gls_coefficient =
596 std::isnan(gls_coefficient) || gls_coefficient < 0 ||
597 std::isinf(gls_coefficient)) {
598 errors.emplace_back(StrCat(
599 "Invalid guided_local_search_lambda_coefficient: ", gls_coefficient));
602 std::isnan(step) || step < 0.0) {
603 errors.emplace_back(StrCat(
"Invalid optimization_step: ", step));
608 StrCat(
"Invalid number_of_solutions_to_collect: ", num));
610 if (
const int64_t lim = search_parameters.
solution_limit(); lim < 1)
611 errors.emplace_back(StrCat(
"Invalid solution_limit: ", lim));
612 if (!IsValidNonNegativeDuration(search_parameters.
time_limit())) {
614 "Invalid time_limit: " +
617 if (!IsValidNonNegativeDuration(search_parameters.
lns_time_limit())) {
619 "Invalid lns_time_limit: " +
623 std::isnan(ratio) || ratio < 0 || ratio >= 1) {
625 StrCat(
"Invalid secondary_ls_time_limit_ratio: ", ratio));
629 errors.emplace_back(StrCat(
"Invalid first_solution_strategy: ",
638 StrCat(
"local_search_metaheuristics cannot be set if "
639 "local_search_metaheuristic is different from "
640 "UNSET or AUTOMATIC: ",
641 local_search_metaheuristic));
645 StrCat(
"Invalid metaheuristic: ", local_search_metaheuristic));
647 for (
const int metaheuristic :
651 errors.emplace_back(StrCat(
"Invalid metaheuristic: ", metaheuristic));
657 errors.emplace_back(StrCat(
658 "Invalid num_max_local_optima_before_metaheuristic_switch: ",
663 if (scaling_factor == 0 || std::isnan(scaling_factor) ||
664 std::isinf(scaling_factor)) {
666 StrCat(
"Invalid value for log_cost_scaling_factor: ", scaling_factor));
669 if (std::isnan(offset) || std::isinf(offset)) {
670 errors.emplace_back(StrCat(
"Invalid value for log_cost_offset: ", offset));
674 if (continuous_scheduling_solver ==
676 continuous_scheduling_solver ==
679 StrCat(
"Invalid value for continuous_scheduling_solver: ",
681 continuous_scheduling_solver)));
685 mixed_integer_scheduling_solver =
687 mixed_integer_scheduling_solver ==
690 StrCat(
"Invalid value for mixed_integer_scheduling_solver: ",
692 mixed_integer_scheduling_solver)));
696 const double improvement_rate_coefficient =
699 if (std::isnan(improvement_rate_coefficient) ||
700 improvement_rate_coefficient <= 0) {
702 StrCat(
"Invalid value for "
703 "improvement_limit_parameters.improvement_rate_coefficient: ",
704 improvement_rate_coefficient));
707 const int32_t improvement_rate_solutions_distance =
710 if (improvement_rate_solutions_distance <= 0) {
711 errors.emplace_back(StrCat(
713 "improvement_limit_parameters.improvement_rate_solutions_distance: ",
714 improvement_rate_solutions_distance));
718 if (
const double memory_coefficient =
720 .multi_armed_bandit_compound_operator_memory_coefficient();
721 std::isnan(memory_coefficient) || memory_coefficient < 0 ||
722 memory_coefficient > 1) {
724 StrCat(
"Invalid value for "
725 "multi_armed_bandit_compound_operator_memory_coefficient: ",
726 memory_coefficient));
728 if (
const double exploration_coefficient =
730 .multi_armed_bandit_compound_operator_exploration_coefficient();
731 std::isnan(exploration_coefficient) || exploration_coefficient < 0) {
733 StrCat(
"Invalid value for "
734 "multi_armed_bandit_compound_operator_exploration_coefficient: ",
735 exploration_coefficient));
741 (sat_parameters.num_search_workers() > 1 ||
742 sat_parameters.interleave_search())) {
744 "sat_parameters.enumerate_all_solutions cannot be true in parallel"
752 "max_swap_active_chain_size must be greater than 1 if "
753 "local_search_operators.use_swap_active_chain is BOOL_TRUE");
756 FindErrorsInIteratedLocalSearchParameters(search_parameters, errors);
static constexpr Value UNSET
static constexpr Value SIMULATED_ANNEALING
static constexpr Value GREEDY_DESCENT
void set_skip_locally_optimal_paths(bool value)
static constexpr TrailCompression COMPRESS_WITH_ZLIB
void set_compress_trail(::operations_research::ConstraintSolverParameters_TrailCompression value)
static constexpr Value EXPONENTIAL
static constexpr Value UNSET
static constexpr Value UNSET
static constexpr Value LOCAL_CHEAPEST_INSERTION
static constexpr Value AUTOMATIC
static bool Value_IsValid(int value)
static constexpr Value UNSET
static constexpr Value RUIN_AND_RECREATE
void set_reduce_vehicle_cost_model(bool value)
::operations_research::ConstraintSolverParameters *PROTOBUF_NONNULL mutable_solver_parameters()
double improvement_rate_coefficient() const
::int32_t improvement_rate_solutions_distance() const
static const ::google::protobuf::Descriptor *PROTOBUF_NONNULL GetDescriptor()
static const ::google::protobuf::Reflection *PROTOBUF_NONNULL GetReflection()
::operations_research::OptionalBoolean use_swap_active_chain() const
const ::operations_research::RoutingSearchParameters_LocalSearchNeighborhoodOperators & local_search_operators() const
static constexpr SchedulingSolver SCHEDULING_GLOP
void set_first_solution_strategy(::operations_research::FirstSolutionStrategy_Value value)
RoutingSearchParameters_LocalSearchNeighborhoodOperators LocalSearchNeighborhoodOperators
nested types -------------------------------------------------—
const ::operations_research::sat::SatParameters & sat_parameters() const
double savings_max_memory_usage_bytes() const
double savings_arc_coefficient() const
double log_cost_offset() const
::int32_t relocate_expensive_chain_num_arcs_to_consider() const
::operations_research::RoutingSearchParameters_InsertionSortingProperty local_cheapest_insertion_sorting_properties(int index) const
double log_cost_scaling_factor() const
double secondary_ls_time_limit_ratio() const
static constexpr InsertionSortingProperty SORTING_PROPERTY_UNSPECIFIED
::operations_research::LocalSearchMetaheuristic_Value local_search_metaheuristic() const
RoutingSearchParameters_SchedulingSolver SchedulingSolver
const ::google::protobuf::Duration & time_limit() const
::int32_t max_swap_active_chain_size() const
static constexpr PairInsertionStrategy BEST_PICKUP_THEN_BEST_DELIVERY
double cheapest_insertion_farthest_seeds_ratio() const
double savings_neighbors_ratio() const
static constexpr PairInsertionStrategy BEST_PICKUP_DELIVERY_PAIR
::int32_t heuristic_close_nodes_lns_num_nodes() const
::operations_research::LocalSearchMetaheuristic_Value local_search_metaheuristics(int index) const
::operations_research::RoutingSearchParameters_SchedulingSolver mixed_integer_scheduling_solver() const
double cheapest_insertion_first_solution_neighbors_ratio() const
const ::operations_research::RoutingSearchParameters_ImprovementSearchLimitParameters & improvement_limit_parameters() const
static const ::std::string & InsertionSortingProperty_Name(T value)
static constexpr InsertionSortingProperty SORTING_PROPERTY_RANDOM
::int64_t solution_limit() const
::int32_t ls_operator_min_neighbors() const
RoutingSearchParameters_InsertionSortingProperty InsertionSortingProperty
::int32_t cheapest_insertion_ls_operator_min_neighbors() const
::int32_t number_of_solutions_to_collect() const
static constexpr SchedulingSolver SCHEDULING_UNSET
::operations_research::RoutingSearchParameters_SchedulingSolver continuous_scheduling_solver() const
bool has_improvement_limit_parameters() const
.operations_research.RoutingSearchParameters.ImprovementSearchLimitParameters improvement_limit_param...
::int32_t num_max_local_optima_before_metaheuristic_switch() const
double guided_local_search_lambda_coefficient() const
double optimization_step() const
::int32_t cheapest_insertion_first_solution_min_neighbors() const
double cheapest_insertion_ls_operator_neighbors_ratio() const
double ls_operator_neighbors_ratio() const
static constexpr SchedulingSolver SCHEDULING_CP_SAT
::operations_research::FirstSolutionStrategy_Value first_solution_strategy() const
const ::google::protobuf::Duration & lns_time_limit() const
static const ::std::string & SchedulingSolver_Name(T value)
static constexpr Value UNSET
static ConstraintSolverParameters DefaultSolverParameters()
--— ConstraintSolverParameters --—
bool enumerate_all_solutions() const
In SWIG mode, we don't want anything besides these top-level includes.
bool OptionalBoolean_IsValid(int value)
std::string ProtobufShortDebugString(const P &message)
const ::google::protobuf::EnumDescriptor *PROTOBUF_NONNULL OptionalBoolean_descriptor()
RoutingModelParameters DefaultRoutingModelParameters()
RoutingSearchParameters DefaultSecondaryRoutingSearchParameters()
const ::std::string & OptionalBoolean_Name(T value)
std::vector< std::string > FindErrorsInRoutingSearchParameters(const RoutingSearchParameters &search_parameters)
RoutingSearchParameters DefaultRoutingSearchParameters()
static
std::string FindErrorInRoutingSearchParameters(const RoutingSearchParameters &search_parameters)
inline ::absl::StatusOr< absl::Duration > DecodeGoogleApiProto(const google::protobuf::Duration &proto)
#define REPEATED_ENUM_ADAPTER(var, field)
static const int64_t kint64max