Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
graph_util.cpp
Go to the documentation of this file.
3#include <routingkit/sort.h>
5
6#include <assert.h>
7#include <algorithm>
8
9namespace RoutingKit{
10
11unsigned find_arc(const std::vector<unsigned>&first_out, const std::vector<unsigned>&head, unsigned x, unsigned y){
12 unsigned ret = find_arc_or_return_invalid(first_out, head, x, y);
13 assert(ret != invalid_id && "arc does not exist");
14 return ret;
15}
16
17unsigned find_arc_or_return_invalid(const std::vector<unsigned>&first_out, const std::vector<unsigned>&head, unsigned x, unsigned y){
18 assert(x < first_out.size()-1 && "node id out of bounds");
19 assert(y < first_out.size()-1 && "node id out of bounds");
20
21 for(unsigned xy = first_out[x]; xy < first_out[x+1]; ++xy)
22 if(head[xy] == y)
23 return xy;
24 return invalid_id;
25}
26
27unsigned find_arc_given_sorted_head(const std::vector<unsigned>&first_out, const std::vector<unsigned>&head, unsigned x, unsigned y){
28 unsigned ret = find_arc_or_return_invalid_given_sorted_head(first_out, head, x, y);
29 assert(ret != invalid_id && "arc does not exist");
30 return ret;
31}
32
33unsigned find_arc_or_return_invalid_given_sorted_head(const std::vector<unsigned>&first_out, const std::vector<unsigned>&head, unsigned x, unsigned y){
34 assert(x < first_out.size()-1 && "node id out of bounds");
35 assert(y < first_out.size()-1 && "node id out of bounds");
36
37 auto
38 begin = head.begin() + first_out[x],
39 end = head.begin() + first_out[x+1];
40
41 assert(std::is_sorted(begin, end) && "heads are not sorted");
42 auto
43 pos = std::lower_bound(begin, end, y);
44 if(pos == end)
45 return invalid_id;
46 if(*pos != y)
47 return invalid_id;
48 return pos - head.begin();
49}
50
51
52std::vector<unsigned>convert_node_path_to_arc_path(const std::vector<unsigned>&first_out, const std::vector<unsigned>&head, std::vector<unsigned>path){
53 if(!path.empty()){
54 for(unsigned i=0; i<path.size()-1; ++i) {
55 for(unsigned xy=first_out[path[i]]; ; ++xy) {
56 assert(xy<first_out[path[i]+1]);
57 if(head[xy] == path[i+1]) {
58 path[i] = xy;
59 break;
60 }
61 }
62 }
63 path.pop_back();
64 }
65 return path;
66}
67
68
69std::vector<unsigned>convert_arc_path_to_node_path(unsigned source, const std::vector<unsigned>&head, std::vector<unsigned>path){
70 if(!path.empty()){
71 path.resize(path.size()+1);
72 for(unsigned i=path.size()-1; i>1; --i)
73 path[i] = head[path[i-1]];
74 path[0] = source;
75 }
76 return path;
77}
78
79
80
81
83 unsigned a_count,
84 const std::vector<unsigned>&a,
85 unsigned b_count,
86 const std::vector<unsigned>&b
87){
88 auto p = compute_inverse_stable_sort_permutation_using_key(b, b_count, [](unsigned x){return x;});
89 auto q = compute_inverse_stable_sort_permutation_using_key(apply_inverse_permutation(p, std::move(a)), a_count, [](unsigned x){return x;});
90 assert(is_sorted_using_less(a));
92}
93
95 unsigned a_count,
96 const std::vector<unsigned>&a,
97 unsigned b_count,
98 const std::vector<unsigned>&b
99){
100 auto p = compute_stable_sort_permutation_using_key(b, b_count, [](unsigned x){return x;});
101 auto q = compute_stable_sort_permutation_using_key(apply_permutation(p, std::move(a)), a_count, [](unsigned x){return x;});
102 assert(is_sorted_using_less(a));
104}
105
107 unsigned a_count,
108 std::vector<unsigned>&a,
109 unsigned b_count,
110 const std::vector<unsigned>&b
111){
112 auto p = compute_stable_sort_permutation_using_key(b, b_count, [](unsigned x){return x;});
113 a = apply_permutation(p, std::move(a));
114 auto q = compute_stable_sort_permutation_using_key(a, a_count, [](unsigned x){return x;});
115 a = apply_permutation(q, std::move(a));
116 assert(is_sorted_using_less(a));
118}
119
121 unsigned a_count,
122 std::vector<unsigned>&a,
123 unsigned b_count,
124 const std::vector<unsigned>&b
125){
126 auto p = compute_inverse_stable_sort_permutation_using_key(b, b_count, [](unsigned x){return x;});
127 a = apply_inverse_permutation(p, std::move(a));
128 auto q = compute_inverse_stable_sort_permutation_using_key(a, a_count, [](unsigned x){return x;});
129 a = apply_inverse_permutation(q, std::move(a));
130 assert(is_sorted_using_less(a));
132}
133
135 unsigned node_count,
136 std::vector<unsigned>&tail,
137 const std::vector<unsigned>&head
138){
140}
141
143 unsigned node_count,
144 std::vector<unsigned>&tail,
145 const std::vector<unsigned>&head
146){
148}
149
151 unsigned node_count,
152 const std::vector<unsigned>&tail,
153 const std::vector<unsigned>&head
154){
156}
157
159 unsigned node_count,
160 const std::vector<unsigned>&tail,
161 const std::vector<unsigned>&head
162){
164}
165
166} // RoutingKit
167
std::vector< unsigned > tail
unsigned node_count
std::vector< unsigned > compute_stable_sort_permutation_using_key(const std::vector< T > &v, unsigned key_count, const K &get_key)
Definition sort.h:218
std::vector< unsigned > chain_permutation_first_left_then_right(const std::vector< unsigned > &p, const std::vector< unsigned > &q)
Definition permutation.h:32
bool is_sorted_using_less(const std::vector< T > &v)
Definition sort.h:374
std::vector< unsigned > compute_inverse_sort_permutation_first_by_tail_then_by_head(unsigned node_count, const std::vector< unsigned > &tail, const std::vector< unsigned > &head)
unsigned find_arc_given_sorted_head(const std::vector< unsigned > &first_out, const std::vector< unsigned > &head, unsigned x, unsigned y)
std::vector< unsigned > compute_sort_permutation_first_by_tail_then_by_head_and_apply_sort_to_tail(unsigned node_count, std::vector< unsigned > &tail, const std::vector< unsigned > &head)
std::vector< T > apply_permutation(const std::vector< unsigned > &p, const std::vector< T > &v)
Definition permutation.h:48
std::vector< T > apply_inverse_permutation(const std::vector< unsigned > &p, const std::vector< T > &v)
Definition permutation.h:72
unsigned find_arc(const std::vector< unsigned > &first_out, const std::vector< unsigned > &head, unsigned x, unsigned y)
std::vector< unsigned > compute_inverse_sort_permutation_first_by_tail_then_by_head_and_apply_sort_to_tail(unsigned node_count, std::vector< unsigned > &tail, const std::vector< unsigned > &head)
std::vector< unsigned > compute_inverse_sort_permutation_first_by_left_then_by_right(unsigned a_count, const std::vector< unsigned > &a, unsigned b_count, const std::vector< unsigned > &b)
std::vector< unsigned > compute_inverse_stable_sort_permutation_using_key(const std::vector< T > &v, unsigned key_count, const K &get_key)
Definition sort.h:250
std::vector< unsigned > compute_sort_permutation_first_by_tail_then_by_head(unsigned node_count, const std::vector< unsigned > &tail, const std::vector< unsigned > &head)
std::vector< unsigned > compute_sort_permutation_first_by_left_then_by_right(unsigned a_count, const std::vector< unsigned > &a, unsigned b_count, const std::vector< unsigned > &b)
unsigned find_arc_or_return_invalid_given_sorted_head(const std::vector< unsigned > &first_out, const std::vector< unsigned > &head, unsigned x, unsigned y)
std::vector< unsigned > convert_node_path_to_arc_path(const std::vector< unsigned > &first_out, const std::vector< unsigned > &head, std::vector< unsigned >path)
std::vector< unsigned > compute_sort_permutation_first_by_left_then_by_right_and_apply_sort_to_left(unsigned a_count, std::vector< unsigned > &a, unsigned b_count, const std::vector< unsigned > &b)
std::vector< unsigned > convert_arc_path_to_node_path(unsigned source, const std::vector< unsigned > &head, std::vector< unsigned >path)
std::vector< unsigned > compute_inverse_sort_permutation_first_by_left_then_by_right_and_apply_sort_to_left(unsigned a_count, std::vector< unsigned > &a, unsigned b_count, const std::vector< unsigned > &b)
unsigned find_arc_or_return_invalid(const std::vector< unsigned > &first_out, const std::vector< unsigned > &head, unsigned x, unsigned y)