Google OR-Tools: ortools/constraint_solver/routing_filter_committables.h Source File
14#ifndef ORTOOLS_CONSTRAINT_SOLVER_ROUTING_FILTER_COMMITTABLES_H_
15#define ORTOOLS_CONSTRAINT_SOLVER_ROUTING_FILTER_COMMITTABLES_H_
24#include "absl/types/span.h"
38 const T& Get() const { return current_; }
41 void Set(const T& value) { current_ = value; }
48 void Revert() { current_ = committed_; }
50 void Commit() { committed_ = current_; }
54 T committed_;
62 : elements_(num_elements, {value, value}), changed_(num_elements) {}
65 size_t Size() const { return elements_.size(); }
70 T Get(size_t index) const {
71 DCHECK_LT(index, elements_.size());
84 void Set(size_t index, const T& value) {
86 DCHECK_LT(index, elements_.size());
93 for (const size_t index : changed_.PositionsSetAtLeastOnce()) {
94 elements_[index].current = elements_[index].committed;
101 for (const size_t index : changed_.PositionsSetAtLeastOnce()) {
102 elements_[index].committed = elements_[index].current;
121 bool HasChanged(size_t index) const { return changed_[index]; }
139 std::vector<VersionedElement> elements_;
160 std::vector<T>& temp_container) {
162 const int num_ranges = ranges.Size();
163 for (int i = 0; i < num_ranges; ++i) {
164 const size_t new_begin = temp_container.size();
166 temp_container.insert(temp_container.end(), mutable_input.begin() + begin,
167 mutable_input.begin() + end);
168 ranges.Set(i, {.begin = new_begin, .end = temp_container.size()});
212 : range_of_path_(num_paths, {.begin = 0, .end = 0}),
214 vehicle_breaks_(num_paths),
215 committed_vehicle_breaks_(num_paths),
216 max_num_committed_elements_(16 * num_nodes),
218 nodes_.reserve(max_num_committed_elements_);
219 transit_.reserve(max_num_committed_elements_);
220 travel_.reserve(max_num_committed_elements_);
221 travel_sum_.reserve(max_num_committed_elements_);
261 DCHECK(!other.IsEmpty());
266 void Add(const Interval& other) { *this = *this + other; }
271 DCHECK(!other.IsEmpty());
296 void PushNode(int node) { nodes_.push_back(node); }
301 DCHECK_LT(path, range_of_path_.Size());
302 DCHECK(!range_of_path_.HasChanged(path));
304 {.begin = num_elements_.Get(), .end = nodes_.size()});
308 travel_.resize(nodes_.size(), 0);
309 travel_sum_.resize(nodes_.size(), 0);
331 nodes_.resize(num_elements_.Get());
332 transit_.resize(num_elements_.Get());
333 travel_.resize(num_elements_.Get());
334 travel_sum_.resize(num_elements_.Get());
343 for (const int path : range_of_path_.ChangedIndices()) {
344 committed_vehicle_breaks_[path] = vehicle_breaks_[path];
350 if (num_elements_.Get() <= max_num_committed_elements_) return;
362 const auto [begin, end] = range_of_path_.GetCommitted(path);
363 return absl::MakeConstSpan(nodes_.data() + begin, nodes_.data() + end);
367 absl::Span<const int> Nodes(int path) const {
368 const auto [begin, end] = range_of_path_.Get(path);
369 return absl::MakeConstSpan(nodes_.data() + begin, nodes_.data() + end);
373 absl::Span<const Interval> Transits(int path) const {
374 auto [begin, end] = range_of_path_.Get(path);
378 return absl::MakeConstSpan(transit_.data() + begin, transit_.data() + end);
383 auto [begin, end] = range_of_path_.Get(path);
387 return absl::MakeSpan(transit_.data() + begin, transit_.data() + end);
392 auto [begin, end] = range_of_path_.GetCommitted(path);
394 return absl::MakeConstSpan(travel_.data() + begin, travel_.data() + end);
398 absl::Span<const int64_t> Travels(int path) const {
399 auto [begin, end] = range_of_path_.Get(path);
401 return absl::MakeConstSpan(travel_.data() + begin, travel_.data() + end);
406 auto [begin, end] = range_of_path_.Get(path);
408 return absl::MakeSpan(travel_.data() + begin, travel_.data() + end);
412 absl::Span<const int64_t> TravelSums(int path) const {
413 const auto [begin, end] = range_of_path_.Get(path);
414 return absl::MakeConstSpan(travel_sum_.data() + begin,
415 travel_sum_.data() + end);
420 const auto [begin, end] = range_of_path_.Get(path);
421 return absl::MakeSpan(travel_sum_.data() + begin, travel_sum_.data() + end);
425 absl::Span<const Interval> Cumuls(int path) const {
426 const auto [begin, end] = range_of_path_.Get(path);
427 return absl::MakeConstSpan(cumul_.data() + begin, cumul_.data() + end);
432 const auto [begin, end] = range_of_path_.Get(path);
433 return absl::MakeSpan(cumul_.data() + begin, cumul_.data() + end);
437 Interval Span(int path) const { return span_.Get(path); }
448 absl::Span<const VehicleBreak> VehicleBreaks(int path) const {
449 return absl::MakeConstSpan(range_of_path_.HasChanged(path)
462 int NumNodes(int path) const { return range_of_path_.Get(path).Size(); }
487 std::vector<Interval> transit_;
488 std::vector<int64_t> travel_;
489 std::vector<int64_t> travel_sum_;
490 std::vector<Interval> cumul_;
492 std::vector<int> temp_ints_;
493 std::vector<Interval> temp_intervals_;
494 std::vector<int64_t> temp_int64s_;
502 std::vector<std::vector<VehicleBreak>> vehicle_breaks_;
503 std::vector<std::vector<VehicleBreak>> committed_vehicle_breaks_;
517 : range_of_path_(num_paths, {.begin = 0, .end = 0}),
518 max_num_committed_elements_(16 * num_nodes),
520 pre_visit_.reserve(max_num_committed_elements_);
529 DCHECK_LT(path, range_of_path_.Size());
530 DCHECK(!range_of_path_.HasChanged(path));
531 size_t num_current_elements = num_elements_.Get();
532 range_of_path_.Set(path, {.begin = num_current_elements,
533 .end = num_current_elements + new_num_nodes});
536 num_current_elements += new_num_nodes;
537 pre_visit_.resize(num_current_elements, 0);
538 post_visit_.resize(num_current_elements, 0);
567 if (num_elements_.Get() <= max_num_committed_elements_) return;
576 auto [begin, end] = range_of_path_.GetCommitted(path);
577 return absl::MakeConstSpan(pre_visit_.data() + begin,
578 pre_visit_.data() + end);
582 absl::Span<const int64_t> PreVisits(int path) const {
583 auto [begin, end] = range_of_path_.Get(path);
584 return absl::MakeConstSpan(pre_visit_.data() + begin,
585 pre_visit_.data() + end);
590 auto [begin, end] = range_of_path_.Get(path);
591 return absl::MakeSpan(pre_visit_.data() + begin, pre_visit_.data() + end);
597 auto [begin, end] = range_of_path_.GetCommitted(path);
598 return absl::MakeConstSpan(post_visit_.data() + begin,
599 post_visit_.data() + end);
603 absl::Span<const int64_t> PostVisits(int path) const {
604 const auto [begin, end] = range_of_path_.Get(path);
605 return absl::MakeConstSpan(post_visit_.data() + begin,
606 post_visit_.data() + end);
611 const auto [begin, end] = range_of_path_.Get(path);
612 return absl::MakeSpan(post_visit_.data() + begin, post_visit_.data() + end);
616 int NumNodes(int path) const { return range_of_path_.Get(path).Size(); }
628 std::vector<int64_t> pre_visit_;
629 std::vector<int64_t> post_visit_;
631 std::vector<int64_t> temp_int64s_;
void Revert()
Definition routing_filter_committables.h:92
bool HasChanged(size_t index) const
Definition routing_filter_committables.h:121
CommittableArray(size_t num_elements, const T &value)
Definition routing_filter_committables.h:61
T Get(size_t index) const
Definition routing_filter_committables.h:70
void Set(size_t index, const T &value)
Definition routing_filter_committables.h:84
void SetAllAndCommit(const T &value)
Definition routing_filter_committables.h:108
void Commit()
Definition routing_filter_committables.h:100
T & GetMutable(size_t index)
Definition routing_filter_committables.h:77
T GetCommitted(size_t index) const
Definition routing_filter_committables.h:114
const std::vector< size_t > & ChangedIndices() const
Definition routing_filter_committables.h:125
size_t Size() const
Definition routing_filter_committables.h:65
const T & GetCommitted() const
Definition routing_filter_committables.h:39
const T & Get() const
Definition routing_filter_committables.h:38
void SetAndCommit(const T &value)
Definition routing_filter_committables.h:43
void Set(const T &value)
Definition routing_filter_committables.h:41
void Commit()
Definition routing_filter_committables.h:50
void Revert()
Definition routing_filter_committables.h:48
CommittableValue(const T &value)
Definition routing_filter_committables.h:35
absl::Span< const int64_t > CommittedTravels(int path) const
Definition routing_filter_committables.h:391
void Reset()
Definition routing_filter_committables.h:316
absl::Span< Interval > MutableCumuls(int path)
Definition routing_filter_committables.h:431
int NumNodes(int path) const
Definition routing_filter_committables.h:462
absl::Span< const int64_t > Travels(int path) const
Definition routing_filter_committables.h:398
absl::Span< const Interval > Cumuls(int path) const
Definition routing_filter_committables.h:425
absl::Span< const size_t > ChangedPaths() const
Definition routing_filter_committables.h:464
DimensionValues(int num_paths, int num_nodes)
Definition routing_filter_committables.h:211
absl::Span< const VehicleBreak > VehicleBreaks(int path) const
Definition routing_filter_committables.h:448
void MakePathFromNewNodes(int path)
Definition routing_filter_committables.h:299
void Revert()
Definition routing_filter_committables.h:328
absl::Span< const Interval > Transits(int path) const
Definition routing_filter_committables.h:373
void Commit()
Definition routing_filter_committables.h:342
absl::Span< const int > Nodes(int path) const
Definition routing_filter_committables.h:367
absl::Span< Interval > MutableTransits(int path)
Definition routing_filter_committables.h:382
Interval & MutableSpan(int path)
Definition routing_filter_committables.h:441
absl::Span< int64_t > MutableTravelSums(int path)
Definition routing_filter_committables.h:419
absl::Span< int64_t > MutableTravels(int path)
Definition routing_filter_committables.h:405
bool PathHasChanged(int path) const
Definition routing_filter_committables.h:468
std::vector< VehicleBreak > & MutableVehicleBreaks(int path)
Definition routing_filter_committables.h:456
Interval Span(int path) const
Definition routing_filter_committables.h:437
void PushNode(int node)
Definition routing_filter_committables.h:296
absl::Span< const int > CommittedNodes(int path) const
Definition routing_filter_committables.h:361
absl::Span< const int64_t > TravelSums(int path) const
Definition routing_filter_committables.h:412
void Reset()
Definition routing_filter_committables.h:543
absl::Span< const int64_t > PostVisits(int path) const
Definition routing_filter_committables.h:603
absl::Span< const int64_t > CommittedPostVisits(int path) const
Definition routing_filter_committables.h:596
void Revert()
Definition routing_filter_committables.h:551
PrePostVisitValues(int num_paths, int num_nodes)
Definition routing_filter_committables.h:516
absl::Span< int64_t > MutablePostVisits(int path)
Definition routing_filter_committables.h:610
absl::Span< const size_t > ChangedPaths() const
Definition routing_filter_committables.h:618
bool PathHasChanged(int path) const
Definition routing_filter_committables.h:622
DimensionValues::Interval Interval
Definition routing_filter_committables.h:524
int NumNodes(int path) const
Definition routing_filter_committables.h:616
void ChangePathSize(int path, int new_num_nodes)
Definition routing_filter_committables.h:527
absl::Span< int64_t > MutablePreVisits(int path)
Definition routing_filter_committables.h:589
void Commit()
Definition routing_filter_committables.h:561
absl::Span< const int64_t > CommittedPreVisits(int path) const
Definition routing_filter_committables.h:575
absl::Span< const int64_t > PreVisits(int path) const
Definition routing_filter_committables.h:582
int64_t CapAdd(int64_t x, int64_t y)
int64_t CapSub(int64_t x, int64_t y)
ClosedInterval::Iterator end(ClosedInterval interval)
bool PropagateTransitAndSpan(int path, DimensionValues &dimension_values)
void DefragmentRanges(std::vector< T > &mutable_input, CommittableArray< IndexRange > &ranges, std::vector< T > &temp_container)
Definition routing_filter_committables.h:158
ClosedInterval::Iterator begin(ClosedInterval interval)
int64_t min
Definition routing_filter_committables.h:226
static Interval AllIntegers()
Definition routing_filter_committables.h:278
Interval operator+(const Interval &other) const
Definition routing_filter_committables.h:259
bool IncreaseMin(int64_t lower_bound)
Definition routing_filter_committables.h:240
int64_t max
Definition routing_filter_committables.h:227
void Subtract(const Interval &other)
Definition routing_filter_committables.h:276
void Add(const Interval &other)
Definition routing_filter_committables.h:266
bool DecreaseMax(int64_t upper_bound)
Definition routing_filter_committables.h:246
bool operator==(const Interval &other) const
Definition routing_filter_committables.h:233
Interval operator-(const Interval &other) const
Definition routing_filter_committables.h:269
bool operator!=(const Interval &other) const
Definition routing_filter_committables.h:229
bool IntersectWith(const Interval &other)
Definition routing_filter_committables.h:252
bool IsEmpty() const
Definition routing_filter_committables.h:237
bool operator==(const VehicleBreak &other) const
Definition routing_filter_committables.h:289
Interval start
Definition routing_filter_committables.h:285
Interval is_performed
Definition routing_filter_committables.h:288
Interval duration
Definition routing_filter_committables.h:287
Interval end
Definition routing_filter_committables.h:286
bool operator==(const IndexRange &other) const
Definition routing_filter_committables.h:148
IndexRange(Index start, Index end)
size_t begin
Definition routing_filter_committables.h:145
size_t end
Definition routing_filter_committables.h:146
int Size() const
Definition routing_filter_committables.h:147