From 28777203bcf29cc94688d4527c31df854abfdbd0 Mon Sep 17 00:00:00 2001 From: Corentin Le Molgat Date: Mon, 31 Jul 2023 18:12:03 +0200 Subject: [PATCH] Syng google3: use base/types.h --- ortools/constraint_solver/routing_flow.cc | 2 +- .../constraint_solver/routing_index_manager.h | 2 +- .../routing_lp_scheduling.cc | 2 +- .../routing_neighborhoods.cc | 47 ++++---- .../constraint_solver/routing_neighborhoods.h | 21 ++++ ortools/constraint_solver/routing_sat.cc | 2 +- ortools/constraint_solver/routing_search.cc | 109 +++++++++++------- ortools/constraint_solver/routing_search.h | 6 +- ortools/constraint_solver/routing_types.h | 2 +- .../constraint_solver/sched_constraints.cc | 2 +- ortools/constraint_solver/sched_expr.cc | 2 +- ortools/constraint_solver/sched_search.cc | 2 +- ortools/constraint_solver/search.cc | 2 +- ortools/constraint_solver/table.cc | 2 +- ortools/constraint_solver/timetabling.cc | 2 +- ortools/constraint_solver/trace.cc | 2 +- ortools/constraint_solver/utilities.cc | 2 +- ortools/constraint_solver/visitor.cc | 2 +- ortools/sat/samples/assumptions_sample_sat.py | 6 +- 19 files changed, 138 insertions(+), 79 deletions(-) diff --git a/ortools/constraint_solver/routing_flow.cc b/ortools/constraint_solver/routing_flow.cc index bb090f8f5e..294a1a4eda 100644 --- a/ortools/constraint_solver/routing_flow.cc +++ b/ortools/constraint_solver/routing_flow.cc @@ -25,9 +25,9 @@ #include "absl/container/flat_hash_map.h" #include "absl/container/flat_hash_set.h" #include "ortools/base/int_type.h" -#include "ortools/base/integral_types.h" #include "ortools/base/logging.h" #include "ortools/base/map_util.h" +#include "ortools/base/types.h" #include "ortools/constraint_solver/constraint_solver.h" #include "ortools/constraint_solver/routing.h" #include "ortools/constraint_solver/routing_lp_scheduling.h" diff --git a/ortools/constraint_solver/routing_index_manager.h b/ortools/constraint_solver/routing_index_manager.h index e92469898a..30b39598e2 100644 --- a/ortools/constraint_solver/routing_index_manager.h +++ b/ortools/constraint_solver/routing_index_manager.h @@ -17,9 +17,9 @@ #include #include -#include "ortools/base/integral_types.h" #include "ortools/base/logging.h" #include "ortools/base/strong_vector.h" +#include "ortools/base/types.h" #include "ortools/constraint_solver/routing_types.h" namespace operations_research { diff --git a/ortools/constraint_solver/routing_lp_scheduling.cc b/ortools/constraint_solver/routing_lp_scheduling.cc index 0ac443bf09..8adf449dd6 100644 --- a/ortools/constraint_solver/routing_lp_scheduling.cc +++ b/ortools/constraint_solver/routing_lp_scheduling.cc @@ -34,9 +34,9 @@ #include "absl/strings/str_format.h" #include "absl/time/time.h" #include "ortools/base/dump_vars.h" -#include "ortools/base/integral_types.h" #include "ortools/base/logging.h" #include "ortools/base/mathutil.h" +#include "ortools/base/types.h" #include "ortools/constraint_solver/constraint_solver.h" #include "ortools/constraint_solver/routing.h" #include "ortools/constraint_solver/routing_parameters.pb.h" diff --git a/ortools/constraint_solver/routing_neighborhoods.cc b/ortools/constraint_solver/routing_neighborhoods.cc index 34f68c376b..3ed4688ca9 100644 --- a/ortools/constraint_solver/routing_neighborhoods.cc +++ b/ortools/constraint_solver/routing_neighborhoods.cc @@ -19,7 +19,7 @@ #include #include -#include "ortools/base/integral_types.h" +#include "ortools/base/types.h" #include "ortools/constraint_solver/constraint_solver.h" #include "ortools/constraint_solver/constraint_solveri.h" #include "ortools/constraint_solver/routing_types.h" @@ -1041,14 +1041,14 @@ bool RelocateSubtrip::RelocateSubTripFromPickup(const int64_t chain_first_node, return false; } const int pair = pair_of_node_[current]; - if (is_delivery_node_[current] && !opened_pairs_bitset_[pair]) { + if (IsDeliveryNode(current) && !opened_pairs_bitset_[pair]) { rejected_nodes_.push_back(current); } else { subtrip_nodes_.push_back(current); - if (is_pickup_node_[current]) { + if (IsPickupNode(current)) { ++num_opened_pairs; opened_pairs_bitset_[pair] = true; - } else if (is_delivery_node_[current]) { + } else if (IsDeliveryNode(current)) { --num_opened_pairs; opened_pairs_bitset_[pair] = false; } @@ -1089,14 +1089,14 @@ bool RelocateSubtrip::RelocateSubTripFromDelivery( return false; } const int pair = pair_of_node_[current]; - if (is_pickup_node_[current] && !opened_pairs_bitset_[pair]) { + if (IsPickupNode(current) && !opened_pairs_bitset_[pair]) { rejected_nodes_.push_back(current); } else { subtrip_nodes_.push_back(current); - if (is_delivery_node_[current]) { + if (IsDeliveryNode(current)) { ++num_opened_pairs; opened_pairs_bitset_[pair] = true; - } else if (is_pickup_node_[current]) { + } else if (IsPickupNode(current)) { --num_opened_pairs; opened_pairs_bitset_[pair] = false; } @@ -1128,9 +1128,9 @@ bool RelocateSubtrip::RelocateSubTripFromDelivery( bool RelocateSubtrip::MakeNeighbor() { const auto do_move = [this](int64_t node, int64_t insertion_node) { if (IsInactive(node)) return false; - if (is_pickup_node_[node]) { + if (IsPickupNode(node)) { return RelocateSubTripFromPickup(node, insertion_node); - } else if (is_delivery_node_[node]) { + } else if (IsDeliveryNode(node)) { return RelocateSubTripFromDelivery(node, insertion_node); } else { return false; @@ -1188,10 +1188,11 @@ bool ExchangeSubtrip::MakeNeighbor() { const int64_t node = BaseNode(0); const int64_t neighbor = GetNeighborForBaseNode(0); if (IsInactive(neighbor)) return false; - if (is_delivery_node_[node] && is_delivery_node_[Prev(neighbor)]) { + if (IsDeliveryNode(node) && IsDeliveryNode(Prev(neighbor))) { node0 = node; node1 = Prev(neighbor); - } else if (is_pickup_node_[neighbor] && is_pickup_node_[Next(node)]) { + } else if (IsPickupNode(neighbor) && !IsPathEnd(Next(node)) && + IsPickupNode(Next(node))) { node0 = Next(node); node1 = neighbor; } else { @@ -1234,12 +1235,12 @@ bool ExchangeSubtrip::MakeNeighbor() { const bool concatenated01 = last0 == subtrip1_.front(); const bool concatenated10 = last1 == subtrip0_.front(); - if (is_delivery_node_[node0]) std::swap(subtrip1_, rejects0_); + if (IsDeliveryNode(node0)) std::swap(subtrip1_, rejects0_); path0_.insert(path0_.end(), subtrip1_.begin(), subtrip1_.end()); path0_.insert(path0_.end(), rejects0_.begin(), rejects0_.end()); path0_.push_back(last0); - if (is_delivery_node_[node1]) std::swap(subtrip0_, rejects1_); + if (IsDeliveryNode(node1)) std::swap(subtrip0_, rejects1_); path1_.insert(path1_.end(), subtrip0_.begin(), subtrip0_.end()); path1_.insert(path1_.end(), rejects1_.begin(), rejects1_.end()); path1_.push_back(last1); @@ -1266,12 +1267,12 @@ bool ExchangeSubtrip::ExtractChainsAndCheckCanonical( int64_t base_node, std::vector* rejects, std::vector* subtrip) { const bool extracted = - is_pickup_node_[base_node] + IsPickupNode(base_node) ? ExtractChainsFromPickup(base_node, rejects, subtrip) : ExtractChainsFromDelivery(base_node, rejects, subtrip); if (!extracted) return false; // Check canonicality. - return !is_delivery_node_[base_node] || + return !IsDeliveryNode(base_node) || pair_of_node_[subtrip->front()] != pair_of_node_[subtrip->back()] || !rejects->empty(); } @@ -1279,7 +1280,7 @@ bool ExchangeSubtrip::ExtractChainsAndCheckCanonical( bool ExchangeSubtrip::ExtractChainsFromPickup(int64_t base_node, std::vector* rejects, std::vector* subtrip) { - DCHECK(is_pickup_node_[base_node]); + DCHECK(IsPickupNode(base_node)); DCHECK(rejects->empty()); DCHECK(subtrip->empty()); // Iterate from base_node forwards while maintaining the set of opened pairs. @@ -1289,14 +1290,14 @@ bool ExchangeSubtrip::ExtractChainsFromPickup(int64_t base_node, int current = base_node; do { const int pair = pair_of_node_[current]; - if (is_delivery_node_[current] && !opened_pairs_set_[pair]) { + if (IsDeliveryNode(current) && !opened_pairs_set_[pair]) { rejects->push_back(current); } else { subtrip->push_back(current); - if (is_pickup_node_[current]) { + if (IsPickupNode(current)) { ++num_opened_pairs; opened_pairs_set_[pair] = true; - } else if (is_delivery_node_[current]) { + } else if (IsDeliveryNode(current)) { --num_opened_pairs; opened_pairs_set_[pair] = false; } @@ -1309,7 +1310,7 @@ bool ExchangeSubtrip::ExtractChainsFromPickup(int64_t base_node, bool ExchangeSubtrip::ExtractChainsFromDelivery(int64_t base_node, std::vector* rejects, std::vector* subtrip) { - DCHECK(is_delivery_node_[base_node]); + DCHECK(IsDeliveryNode(base_node)); DCHECK(rejects->empty()); DCHECK(subtrip->empty()); // Iterate from base_node backwards while maintaining the set of opened pairs. @@ -1319,14 +1320,14 @@ bool ExchangeSubtrip::ExtractChainsFromDelivery(int64_t base_node, int current = base_node; do { const int pair = pair_of_node_[current]; - if (is_pickup_node_[current] && !opened_pairs_set_[pair]) { + if (IsPickupNode(current) && !opened_pairs_set_[pair]) { rejects->push_back(current); } else { subtrip->push_back(current); - if (is_delivery_node_[current]) { + if (IsDeliveryNode(current)) { ++num_opened_pairs; opened_pairs_set_[pair] = true; - } else if (is_pickup_node_[current]) { + } else if (IsPickupNode(current)) { --num_opened_pairs; opened_pairs_set_[pair] = false; } diff --git a/ortools/constraint_solver/routing_neighborhoods.h b/ortools/constraint_solver/routing_neighborhoods.h index 9c1efee06a..27593dbd65 100644 --- a/ortools/constraint_solver/routing_neighborhoods.h +++ b/ortools/constraint_solver/routing_neighborhoods.h @@ -648,6 +648,17 @@ class RelocateSubtrip : public PathOperator { /// Relocates the subtrip ending at chain_first_node. It must be a delivery. bool RelocateSubTripFromDelivery(int64_t chain_last_node, int64_t insertion_node); + bool IsPickupNode(int64_t node) const { + DCHECK_LT(node, is_pickup_node_.size()); + DCHECK_GE(node, 0); + return is_pickup_node_[node]; + } + bool IsDeliveryNode(int64_t node) const { + DCHECK_LT(node, is_delivery_node_.size()); + DCHECK_GE(node, 0); + return is_delivery_node_[node]; + } + std::vector is_pickup_node_; std::vector is_delivery_node_; std::vector pair_of_node_; @@ -706,6 +717,16 @@ class ExchangeSubtrip : public PathOperator { std::vector* rejects, std::vector* subtrip); void SetPath(const std::vector& path, int path_id); + bool IsPickupNode(int64_t node) const { + DCHECK_LT(node, is_pickup_node_.size()); + DCHECK_GE(node, 0); + return is_pickup_node_[node]; + } + bool IsDeliveryNode(int64_t node) const { + DCHECK_LT(node, is_delivery_node_.size()); + DCHECK_GE(node, 0); + return is_delivery_node_[node]; + } // Precompute some information about nodes. std::vector is_pickup_node_; diff --git a/ortools/constraint_solver/routing_sat.cc b/ortools/constraint_solver/routing_sat.cc index e2993fde4a..f36ddabc3e 100644 --- a/ortools/constraint_solver/routing_sat.cc +++ b/ortools/constraint_solver/routing_sat.cc @@ -23,9 +23,9 @@ #include "absl/container/flat_hash_map.h" #include "absl/time/time.h" -#include "ortools/base/integral_types.h" #include "ortools/base/logging.h" #include "ortools/base/map_util.h" +#include "ortools/base/types.h" #include "ortools/constraint_solver/constraint_solver.h" #include "ortools/constraint_solver/routing.h" #include "ortools/constraint_solver/routing_parameters.pb.h" diff --git a/ortools/constraint_solver/routing_search.cc b/ortools/constraint_solver/routing_search.cc index 6411435540..4068db0342 100644 --- a/ortools/constraint_solver/routing_search.cc +++ b/ortools/constraint_solver/routing_search.cc @@ -44,17 +44,15 @@ #include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" #include "ortools/base/adjustable_priority_queue.h" -#include "ortools/base/integral_types.h" #include "ortools/base/logging.h" #include "ortools/base/macros.h" #include "ortools/base/map_util.h" #include "ortools/base/stl_util.h" +#include "ortools/base/types.h" #include "ortools/constraint_solver/constraint_solver.h" #include "ortools/constraint_solver/constraint_solveri.h" #include "ortools/constraint_solver/routing.h" #include "ortools/constraint_solver/routing_parameters.pb.h" -#include "ortools/constraint_solver/routing_types.h" -#include "ortools/constraint_solver/routing_utils.h" #include "ortools/graph/christofides.h" #include "ortools/util/bitset.h" #include "ortools/util/range_query_function.h" @@ -644,6 +642,7 @@ void CheapestInsertionFilteredHeuristic::AppendInsertionPositionsAfter( std::vector* node_insertions) { DCHECK(node_insertions != nullptr); int64_t insert_after = start; + if (!model()->VehicleVar(node_to_insert)->Contains(vehicle)) return; while (!model()->IsEnd(insert_after)) { const int64_t insert_before = (insert_after == start) ? next_after_start : Value(insert_after); @@ -1008,7 +1007,10 @@ bool GlobalCheapestInsertionFilteredHeuristic:: // Since this vehicle is empty and has the same fixed cost as the // entry_vehicle, it shouldn't be the representative of empty vehicles // for any pickup/delivery in the priority queue. - DCHECK_EQ(num_previous_vehicle_entries, 0); + DCHECK( + num_previous_vehicle_entries == 0 || + model()->GetVehicleClassIndexOfVehicle(compatible_vehicle).value() != + model()->GetVehicleClassIndexOfVehicle(entry_vehicle).value()); return true; } // The previously unused entry_vehicle is now used, so we use the next @@ -1302,7 +1304,10 @@ bool GlobalCheapestInsertionFilteredHeuristic:: // Since this vehicle is empty and has the same fixed cost as the // entry_vehicle, it shouldn't be the representative of empty vehicles // for any node in the priority queue. - DCHECK(no_prior_entries_for_this_vehicle); + DCHECK( + no_prior_entries_for_this_vehicle || + model()->GetVehicleClassIndexOfVehicle(compatible_vehicle).value() != + model()->GetVehicleClassIndexOfVehicle(entry_vehicle).value()); return true; } // The previously unused entry_vehicle is now used, so we use the next @@ -1406,6 +1411,23 @@ void GlobalCheapestInsertionFilteredHeuristic::DetectUsedVehicles( } } +bool GlobalCheapestInsertionFilteredHeuristic::IsCheapestClassRepresentative( + int vehicle) const { + if (VehicleIsEmpty(vehicle)) { + // We only consider the least expensive empty vehicle of each type for + // entries of the same vehicle class. + const int curator_vehicle = + empty_vehicle_type_curator_->GetLowestFixedCostVehicleOfType( + empty_vehicle_type_curator_->Type(vehicle)); + if (curator_vehicle != vehicle && + model()->GetVehicleClassIndexOfVehicle(curator_vehicle).value() == + model()->GetVehicleClassIndexOfVehicle(vehicle).value()) { + return false; + } + } + return true; +} + void GlobalCheapestInsertionFilteredHeuristic::InsertFarthestNodesAsSeeds() { // TODO(user): consider checking search limits. if (gci_params_.farthest_seeds_ratio <= 0) return; @@ -1557,13 +1579,7 @@ void GlobalCheapestInsertionFilteredHeuristic:: std::vector pickup_insertions; std::vector delivery_insertions; for (int vehicle = 0; vehicle < model()->vehicles(); ++vehicle) { - if (VehicleIsEmpty(vehicle) && - empty_vehicle_type_curator_->GetLowestFixedCostVehicleOfType( - empty_vehicle_type_curator_->Type(vehicle)) != vehicle) { - // We only consider the least expensive empty vehicle of each type for - // entries. - continue; - } + if (!IsCheapestClassRepresentative(vehicle)) continue; const int64_t start = model()->Start(vehicle); pickup_insertions.clear(); AppendInsertionPositionsAfter(pickup, start, Value(start), vehicle, @@ -1609,13 +1625,7 @@ void GlobalCheapestInsertionFilteredHeuristic:: continue; } - if (VehicleIsEmpty(vehicle) && - empty_vehicle_type_curator_->GetLowestFixedCostVehicleOfType( - empty_vehicle_type_curator_->Type(vehicle)) != vehicle) { - // We only consider the least expensive empty vehicle of each type for - // entries. - continue; - } + if (!IsCheapestClassRepresentative(vehicle)) continue; int64_t delivery_insert_after = pickup; while (!model()->IsEnd(delivery_insert_after)) { @@ -1771,14 +1781,17 @@ bool GlobalCheapestInsertionFilteredHeuristic::AddPairEntriesWithPickupAfter( node_index_to_neighbors_by_cost_class_->GetNeighborsOfNodeForCostClass( cost_class, insert_after)) { if (StopSearchAndCleanup(priority_queue)) return false; - if (Contains(pickup)) continue; + if (Contains(pickup) || !model()->VehicleVar(pickup)->Contains(vehicle)) { + continue; + } for (const std::pair& index_pairs : model()->GetPickupIndexPairs(pickup)) { if (!pair_indices.contains(index_pairs.first)) continue; const RoutingModel::IndexPair& index_pair = pickup_delivery_pairs[index_pairs.first]; for (const int64_t delivery : index_pair.second) { - if (Contains(delivery)) { + if (Contains(delivery) || + !model()->VehicleVar(delivery)->Contains(vehicle)) { continue; } int64_t delivery_insert_after = pickup; @@ -1816,14 +1829,20 @@ bool GlobalCheapestInsertionFilteredHeuristic::AddPairEntriesWithDeliveryAfter( node_index_to_neighbors_by_cost_class_->GetNeighborsOfNodeForCostClass( cost_class, insert_after)) { if (StopSearchAndCleanup(priority_queue)) return false; - if (Contains(delivery)) continue; + if (Contains(delivery) || + !model()->VehicleVar(delivery)->Contains(vehicle)) { + continue; + } for (const std::pair& index_pairs : model()->GetDeliveryIndexPairs(delivery)) { if (!pair_indices.contains(index_pairs.first)) continue; const RoutingModel::IndexPair& index_pair = pickup_delivery_pairs[index_pairs.first]; for (const int64_t pickup : index_pair.first) { - if (Contains(pickup)) continue; + if (Contains(pickup) || + !model()->VehicleVar(pickup)->Contains(vehicle)) { + continue; + } int64_t pickup_insert_after = model()->Start(vehicle); while (pickup_insert_after != insert_after) { AddPairEntry(pickup, pickup_insert_after, delivery, insert_after, @@ -1983,17 +2002,16 @@ void GlobalCheapestInsertionFilteredHeuristic:: if (!gci_params_.use_neighbors_ratio_for_initialization) { auto vehicles_it = vehicles.begin(); std::vector insertions; + // TODO(user): Ideally we'd want to iterate on vehicle var values: + // std::unique_ptr + // it(model()->VehicleVar(node)->MakeDomainIterator(false)); + // for (const int64_t v : InitAndGetValues(it)) { + // Requires taking vehicles into account. for (int v = 0; v < num_vehicles; v++) { const int vehicle = vehicles.empty() ? v : *vehicles_it++; const int64_t start = model()->Start(vehicle); - if (all_vehicles && VehicleIsEmpty(vehicle) && - empty_vehicle_type_curator_->GetLowestFixedCostVehicleOfType( - empty_vehicle_type_curator_->Type(vehicle)) != vehicle) { - // We only consider the least expensive empty vehicle of each type for - // entries. - continue; - } + if (all_vehicles && !IsCheapestClassRepresentative(vehicle)) continue; insertions.clear(); AppendInsertionPositionsAfter(node, start, Value(start), vehicle, /*ignore_cost=*/true, &insertions); @@ -2026,13 +2044,7 @@ void GlobalCheapestInsertionFilteredHeuristic:: !insert_on_vehicle_for_cost_class(vehicle, cost_class)) { continue; } - if (all_vehicles && VehicleIsEmpty(vehicle) && - empty_vehicle_type_curator_->GetLowestFixedCostVehicleOfType( - empty_vehicle_type_curator_->Type(vehicle)) != vehicle) { - // We only consider the least expensive empty vehicle of each type for - // entries. - continue; - } + if (all_vehicles && !IsCheapestClassRepresentative(vehicle)) continue; AddNodeEntry(node, insert_after, vehicle, all_vehicles, queue); } } @@ -2267,6 +2279,7 @@ void LocalCheapestInsertionFilteredHeuristic::InsertBestPickupThenDelivery( if (StopSearch()) return; for (const NodeInsertion& pickup_insertion : pickup_insertions) { const int vehicle = pickup_insertion.vehicle; + if (!model()->VehicleVar(delivery)->Contains(vehicle)) continue; if (bin_capacities_ && !bin_capacities_->CheckAdditionsFeasibility( {pickup, delivery}, vehicle)) { continue; @@ -2370,10 +2383,16 @@ void LocalCheapestInsertionFilteredHeuristic::InsertBestPairMultitour( }; for (int pickup : index_pair.first) { + const IntVar* pickup_vehicle_var = model()->VehicleVar(pickup); if (StopSearch()) return; for (int delivery : index_pair.second) { + const IntVar* delivery_vehicle_var = model()->VehicleVar(delivery); insertion_container_.Clear(); - for (int vehicle = 0; vehicle < model()->vehicles(); ++vehicle) { + std::unique_ptr pickup_vehicles( + pickup_vehicle_var->MakeDomainIterator(false)); + for (const int vehicle : InitAndGetValues(pickup_vehicles.get())) { + if (vehicle == -1) continue; + if (!delivery_vehicle_var->Contains(vehicle)) continue; if (bin_capacities_ && !bin_capacities_->CheckAdditionsFeasibility( {pickup, delivery}, vehicle)) { continue; @@ -2553,7 +2572,11 @@ LocalCheapestInsertionFilteredHeuristic::ComputeEvaluatorSortedPositions( const int size = model()->Size(); if (node >= size) return {}; std::vector sorted_insertions; - for (int vehicle = 0; vehicle < model()->vehicles(); ++vehicle) { + const IntVar* vehicle_var = model()->VehicleVar(node); + std::unique_ptr node_vehicles( + vehicle_var->MakeDomainIterator(false)); + for (const int vehicle : InitAndGetValues(node_vehicles.get())) { + if (vehicle == -1) continue; if (bin_capacities_ && !bin_capacities_->CheckAdditionFeasibility(node, vehicle)) { continue; @@ -2588,7 +2611,13 @@ LocalCheapestInsertionFilteredHeuristic::ComputeEvaluatorSortedPairPositions( const int size = model()->Size(); DCHECK_LT(pickup, size); DCHECK_LT(delivery, size); - for (int vehicle = 0; vehicle < model()->vehicles(); ++vehicle) { + const IntVar* pickup_vehicle_var = model()->VehicleVar(pickup); + const IntVar* delivery_vehicle_var = model()->VehicleVar(delivery); + std::unique_ptr pickup_vehicles( + pickup_vehicle_var->MakeDomainIterator(false)); + for (const int vehicle : InitAndGetValues(pickup_vehicles.get())) { + if (vehicle == -1) continue; + if (!delivery_vehicle_var->Contains(vehicle)) continue; if (bin_capacities_ && !bin_capacities_->CheckAdditionsFeasibility( {pickup, delivery}, vehicle)) { continue; diff --git a/ortools/constraint_solver/routing_search.h b/ortools/constraint_solver/routing_search.h index ccbfc43150..878be38b48 100644 --- a/ortools/constraint_solver/routing_search.h +++ b/ortools/constraint_solver/routing_search.h @@ -36,10 +36,10 @@ #include "absl/container/flat_hash_set.h" #include "absl/log/check.h" #include "ortools/base/adjustable_priority_queue.h" -#include "ortools/base/integral_types.h" #include "ortools/base/logging.h" #include "ortools/base/macros.h" #include "ortools/base/mathutil.h" +#include "ortools/base/types.h" #include "ortools/constraint_solver/constraint_solver.h" #include "ortools/constraint_solver/constraint_solveri.h" #include "ortools/constraint_solver/routing.h" @@ -610,6 +610,10 @@ class GlobalCheapestInsertionFilteredHeuristic std::vector* unused_vehicles, absl::flat_hash_set* used_vehicles); + /// Returns true of the vehicle's route is not empty or if the vehicle is the + /// representative of its class and type. + bool IsCheapestClassRepresentative(int vehicle) const; + /// Inserts the (farthest_seeds_ratio_ * model()->vehicles()) nodes farthest /// from the start/ends of the available vehicle routes as seeds on their /// closest route. diff --git a/ortools/constraint_solver/routing_types.h b/ortools/constraint_solver/routing_types.h index 4d7412884c..29cc433b6e 100644 --- a/ortools/constraint_solver/routing_types.h +++ b/ortools/constraint_solver/routing_types.h @@ -20,7 +20,7 @@ #include "absl/strings/string_view.h" #include "ortools/base/int_type.h" -#include "ortools/base/integral_types.h" +#include "ortools/base/types.h" namespace operations_research { diff --git a/ortools/constraint_solver/sched_constraints.cc b/ortools/constraint_solver/sched_constraints.cc index e6cc901307..8e4bf45d5e 100644 --- a/ortools/constraint_solver/sched_constraints.cc +++ b/ortools/constraint_solver/sched_constraints.cc @@ -28,9 +28,9 @@ #include #include "absl/strings/str_format.h" -#include "ortools/base/integral_types.h" #include "ortools/base/logging.h" #include "ortools/base/macros.h" +#include "ortools/base/types.h" #include "ortools/constraint_solver/constraint_solver.h" #include "ortools/constraint_solver/constraint_solveri.h" #include "ortools/util/string_array.h" diff --git a/ortools/constraint_solver/sched_expr.cc b/ortools/constraint_solver/sched_expr.cc index 86bfe7bcb4..df50c1d93e 100644 --- a/ortools/constraint_solver/sched_expr.cc +++ b/ortools/constraint_solver/sched_expr.cc @@ -16,9 +16,9 @@ #include #include "absl/strings/str_format.h" -#include "ortools/base/integral_types.h" #include "ortools/base/logging.h" #include "ortools/base/macros.h" +#include "ortools/base/types.h" #include "ortools/constraint_solver/constraint_solver.h" #include "ortools/constraint_solver/constraint_solveri.h" diff --git a/ortools/constraint_solver/sched_search.cc b/ortools/constraint_solver/sched_search.cc index efdce93dfe..3bf7371efb 100644 --- a/ortools/constraint_solver/sched_search.cc +++ b/ortools/constraint_solver/sched_search.cc @@ -19,8 +19,8 @@ #include #include "absl/strings/str_format.h" -#include "ortools/base/integral_types.h" #include "ortools/base/logging.h" +#include "ortools/base/types.h" #include "ortools/constraint_solver/constraint_solver.h" #include "ortools/constraint_solver/constraint_solveri.h" #include "ortools/util/string_array.h" diff --git a/ortools/constraint_solver/search.cc b/ortools/constraint_solver/search.cc index 3febf38ff8..394f413a84 100644 --- a/ortools/constraint_solver/search.cc +++ b/ortools/constraint_solver/search.cc @@ -29,10 +29,10 @@ #include "absl/strings/str_join.h" #include "absl/time/time.h" #include "ortools/base/bitmap.h" -#include "ortools/base/integral_types.h" #include "ortools/base/logging.h" #include "ortools/base/mathutil.h" #include "ortools/base/timer.h" +#include "ortools/base/types.h" #include "ortools/constraint_solver/constraint_solver.h" #include "ortools/constraint_solver/constraint_solveri.h" #include "ortools/constraint_solver/search_limit.pb.h" diff --git a/ortools/constraint_solver/table.cc b/ortools/constraint_solver/table.cc index 6bc2d6cef6..eaffa64339 100644 --- a/ortools/constraint_solver/table.cc +++ b/ortools/constraint_solver/table.cc @@ -25,9 +25,9 @@ #include "absl/strings/str_format.h" #include "absl/strings/str_join.h" #include "ortools/base/commandlineflags.h" -#include "ortools/base/integral_types.h" #include "ortools/base/logging.h" #include "ortools/base/map_util.h" +#include "ortools/base/types.h" #include "ortools/constraint_solver/constraint_solver.h" #include "ortools/constraint_solver/constraint_solveri.h" #include "ortools/util/bitset.h" diff --git a/ortools/constraint_solver/timetabling.cc b/ortools/constraint_solver/timetabling.cc index 4aeeb12f72..e311902a4f 100644 --- a/ortools/constraint_solver/timetabling.cc +++ b/ortools/constraint_solver/timetabling.cc @@ -15,9 +15,9 @@ #include #include "absl/strings/str_format.h" -#include "ortools/base/integral_types.h" #include "ortools/base/logging.h" #include "ortools/base/macros.h" +#include "ortools/base/types.h" #include "ortools/constraint_solver/constraint_solver.h" #include "ortools/constraint_solver/constraint_solveri.h" diff --git a/ortools/constraint_solver/trace.cc b/ortools/constraint_solver/trace.cc index 6ecf78d7a6..8dcddded01 100644 --- a/ortools/constraint_solver/trace.cc +++ b/ortools/constraint_solver/trace.cc @@ -23,9 +23,9 @@ #include "absl/strings/str_format.h" #include "absl/strings/str_join.h" #include "ortools/base/commandlineflags.h" -#include "ortools/base/integral_types.h" #include "ortools/base/logging.h" #include "ortools/base/map_util.h" +#include "ortools/base/types.h" #include "ortools/constraint_solver/constraint_solver.h" #include "ortools/constraint_solver/constraint_solveri.h" diff --git a/ortools/constraint_solver/utilities.cc b/ortools/constraint_solver/utilities.cc index 913ee18fcc..ada2494f57 100644 --- a/ortools/constraint_solver/utilities.cc +++ b/ortools/constraint_solver/utilities.cc @@ -20,9 +20,9 @@ #include "absl/strings/str_format.h" #include "absl/strings/str_join.h" #include "ortools/base/hash.h" -#include "ortools/base/integral_types.h" #include "ortools/base/logging.h" #include "ortools/base/map_util.h" +#include "ortools/base/types.h" #include "ortools/constraint_solver/constraint_solver.h" #include "ortools/constraint_solver/constraint_solveri.h" #include "ortools/util/bitset.h" diff --git a/ortools/constraint_solver/visitor.cc b/ortools/constraint_solver/visitor.cc index 32fd754f5f..ff8d356c8f 100644 --- a/ortools/constraint_solver/visitor.cc +++ b/ortools/constraint_solver/visitor.cc @@ -19,11 +19,11 @@ #include "absl/container/flat_hash_map.h" #include "absl/container/flat_hash_set.h" -#include "ortools/base/integral_types.h" #include "ortools/base/logging.h" #include "ortools/base/macros.h" #include "ortools/base/map_util.h" #include "ortools/base/stl_util.h" +#include "ortools/base/types.h" #include "ortools/constraint_solver/constraint_solver.h" #include "ortools/constraint_solver/constraint_solveri.h" diff --git a/ortools/sat/samples/assumptions_sample_sat.py b/ortools/sat/samples/assumptions_sample_sat.py index 5bbf1c2308..d5cebac8c9 100755 --- a/ortools/sat/samples/assumptions_sample_sat.py +++ b/ortools/sat/samples/assumptions_sample_sat.py @@ -55,7 +55,11 @@ def main(): # Print solution. # [START print_solution] print(f"Status = {solver.StatusName(status)}") - + if status == cp_model.INFEASIBLE: + print( + "SufficientAssumptionsForInfeasibility = " + f"{solver.SufficientAssumptionsForInfeasibility()}" + ) # [END print_solution]