Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
id_mapper.cpp
Go to the documentation of this file.
2
4#include "bit_select.h"
5
6namespace RoutingKit{
7
8namespace{
9 const int select_bits = 8;
10
11}
12
13LocalIDMapper::LocalIDMapper(uint64_t bit_count, const uint64_t*bits):
14 bits_(bits),
15 bit_count_(bit_count),
16 rank_((bit_count_+511)/512 + 1){
17
18 uint64_t i = 0;
19 uint64_t s = 0;
20
21 for(uint64_t j = 0; j<rank_.size()-1; ++j){
22 rank_[j] = s;
23 uint64_t
24 s0 = __builtin_popcountll(bits_[i+0]),
25 s1 = __builtin_popcountll(bits_[i+1]),
26 s2 = __builtin_popcountll(bits_[i+2]),
27 s3 = __builtin_popcountll(bits_[i+3]),
28 s4 = __builtin_popcountll(bits_[i+4]),
29 s5 = __builtin_popcountll(bits_[i+5]),
30 s6 = __builtin_popcountll(bits_[i+6]),
31 s7 = __builtin_popcountll(bits_[i+7]);
32
33 i += 8;
34
35 s0 += s4; s1 += s5; s2 += s6; s3 += s7;
36
37 s0 += s2; s1 += s3;
38
39 s0 += s1;
40
41 s += s0;
42
43 }
44 rank_.back() = s;
45}
46
47IDMapper::IDMapper(uint64_t bit_count, const uint64_t*bits):
48 LocalIDMapper(bit_count, bits){
49 uint32_t select_query = 0, select_value = 0;
50 select_.resize((local_id_count() + ((1<<select_bits)-1)) / (1<<select_bits));
51 for(uint64_t block=0; block < rank_.size()-1; ++block){
52 while(rank_[block] <= select_value && select_value < rank_[block+1]){
53 select_[select_query] = block;
54 ++select_query;
55 select_value = select_query << select_bits;
56 }
57 }
58}
59
60uint64_t LocalIDMapper::to_local(uint64_t global_id, uint64_t invalid) const {
61 if(global_id >= global_id_count())
62 return invalid;
63
64 uint8_t uint64_offset = global_id % 64;
65 uint64_t uint64_index = global_id / 64;
66
67
68 if(__builtin_expect((bits_[uint64_index] & (1ull<<uint64_offset))==0, true)){
69 return invalid;
70 }
71
72 uint64_t uint512_index = global_id / 512;
73
74 uint64_t local_id = rank_[uint512_index];
75
76 for(uint64_t i=uint512_index*8; i<uint64_index; ++i)
77 local_id += __builtin_popcountll(bits_[i]);
78
79 local_id += __builtin_popcountll(bits_[uint64_index] & ((1ull<<uint64_offset)-1));
80
81 assert(local_id < local_id_count());
82
83 return local_id;
84}
85
86uint64_t LocalIDMapper::to_local(uint64_t global_id) const {
87 assert(global_id < global_id_count() && "global id is out of bounds");
88
89 uint8_t uint64_offset = global_id % 64;
90 uint64_t uint64_index = global_id / 64;
91
92 assert((bits_[uint64_index] & (1ull<<uint64_offset))!=0 && "global id is not mapped");
93
94 uint64_t uint512_index = global_id / 512;
95
96 uint64_t local_id = rank_[uint512_index];
97
98 for(uint64_t i=uint512_index*8; i<uint64_index; ++i)
99 local_id += __builtin_popcountll(bits_[i]);
100
101 local_id += __builtin_popcountll(bits_[uint64_index] & ((1ull<<uint64_offset)-1));
102
103 assert(local_id < local_id_count());
104
105 return local_id;
106}
107
108uint64_t IDMapper::to_global(uint64_t local_id) const {
109 assert(local_id < local_id_count());
110
111 uint64_t start_uint512 = select_[local_id >> select_bits];
112
113 assert(rank_[start_uint512] <= local_id);
114
115 uint64_t global_id = bit_select(
116 (bit_count_+511)/512-start_uint512,
117 rank_.data() + start_uint512,
118 bits_ + 8*start_uint512,
119 local_id
120 ) + 512*start_uint512;
121
122 assert(is_global_id_mapped(global_id));
123 assert(to_local(global_id) == local_id);
124
125 return global_id;
126}
127
128} // RoutingKit
129
std::vector< uint64_t > select_
Definition id_mapper.h:60
uint64_t to_global(uint64_t local_id) const
const uint64_t * bits_
Definition id_mapper.h:43
uint64_t global_id_count() const
Definition id_mapper.h:22
uint64_t local_id_count() const
Definition id_mapper.h:26
uint64_t to_local(uint64_t global_id) const
Definition id_mapper.cpp:86
std::vector< uint64_t > rank_
Definition id_mapper.h:45
bool is_global_id_mapped(uint64_t global_id) const
Definition id_mapper.h:33
uint64_t bit_select(uint64_t uint512_count, const uint64_t *uint512_rank, const uint64_t *data, uint64_t n)