30const double MIN_DIFF_LENGTH = 0.1e-6;
31const double MIN_INTERNAL_FOR_NODE = 0.01;
32const double MIN_POTENTIAL_LANE_CHANGE_LEN = 3.0;
35 return std::fabs(s1 - s2) < MIN_DIFF_LENGTH;
38void MergeBlockRange(
const TopoNode*
topo_node,
39 const std::vector<NodeSRange>& origin_range,
40 std::vector<NodeSRange>* block_range) {
41 std::vector<NodeSRange> sorted_origin_range;
42 sorted_origin_range.insert(sorted_origin_range.end(), origin_range.begin(),
44 sort(sorted_origin_range.begin(), sorted_origin_range.end());
46 int total_size =
static_cast<int>(sorted_origin_range.size());
47 while (cur_index < total_size) {
48 NodeSRange range(sorted_origin_range[cur_index]);
50 while (cur_index < total_size &&
51 range.MergeRangeOverlap(sorted_origin_range[cur_index])) {
60 block_range->push_back(std::move(range));
64void GetSortedValidRange(
const TopoNode*
topo_node,
65 const std::vector<NodeSRange>& origin_range,
66 std::vector<NodeSRange>* valid_range) {
67 std::vector<NodeSRange> block_range;
68 MergeBlockRange(
topo_node, origin_range, &block_range);
71 std::vector<double> all_value;
72 all_value.push_back(start_s);
73 for (
const auto& range : block_range) {
74 all_value.push_back(range.StartS());
75 all_value.push_back(range.EndS());
77 all_value.push_back(end_s);
78 for (
size_t i = 0; i < all_value.size(); i += 2) {
79 NodeSRange new_range(all_value[i], all_value[i + 1]);
80 valid_range->push_back(std::move(new_range));
84bool IsReachable(
const TopoNode* from_node,
const TopoNode* to_node) {
85 double start_s = to_node->StartS() / to_node->Length() * from_node->Length();
86 start_s = std::max(start_s, from_node->StartS());
87 double end_s = to_node->EndS() / to_node->Length() * from_node->Length();
88 end_s = std::min(end_s, from_node->EndS());
89 return (end_s - start_s > MIN_POTENTIAL_LANE_CHANGE_LEN);
95 const std::unordered_map<
const TopoNode*, std::vector<NodeSRange>>&
97 std::vector<NodeSRange> valid_range;
98 for (
const auto& map_iter : black_map) {
100 GetSortedValidRange(map_iter.first, map_iter.second, &valid_range);
101 InitSubNodeByValidRange(map_iter.first, valid_range);
104 for (
const auto& map_iter : black_map) {
105 InitSubEdge(map_iter.first);
108 for (
const auto& map_iter : black_map) {
109 AddPotentialEdge(map_iter.first);
117 std::unordered_set<const TopoEdge*>*
const sub_edges)
const {
118 const auto* from_node = edge->
FromNode();
119 const auto* to_node = edge->
ToNode();
120 std::unordered_set<TopoNode*> sub_nodes;
121 if (from_node->IsSubNode() || to_node->IsSubNode() ||
122 !GetSubNodes(to_node, &sub_nodes)) {
123 sub_edges->insert(edge);
126 for (
const auto* sub_node : sub_nodes) {
127 for (
const auto* in_edge : sub_node->InFromAllEdge()) {
128 if (in_edge->FromNode() == from_node) {
129 sub_edges->insert(in_edge);
137 std::unordered_set<const TopoEdge*>*
const sub_edges)
const {
138 const auto* from_node = edge->
FromNode();
139 const auto* to_node = edge->
ToNode();
140 std::unordered_set<TopoNode*> sub_nodes;
141 if (from_node->IsSubNode() || to_node->IsSubNode() ||
142 !GetSubNodes(from_node, &sub_nodes)) {
143 sub_edges->insert(edge);
146 for (
const auto* sub_node : sub_nodes) {
147 for (
const auto* out_edge : sub_node->OutToAllEdge()) {
148 if (out_edge->ToNode() == to_node) {
149 sub_edges->insert(out_edge);
157 const auto& map_iter = sub_node_range_sorted_map_.find(
topo_node);
158 if (map_iter == sub_node_range_sorted_map_.end()) {
161 const auto& sorted_vec = map_iter->second;
167 return sorted_vec[index].GetTopoNode();
170void SubTopoGraph::InitSubNodeByValidRange(
174 auto& sub_node_vec = sub_node_range_sorted_map_[
topo_node];
175 auto& sub_node_set = sub_node_map_[
topo_node];
177 std::vector<TopoNode*> sub_node_sorted_vec;
178 for (
const auto& range : valid_range) {
179 if (range.Length() < MIN_INTERNAL_FOR_NODE) {
182 std::shared_ptr<TopoNode> sub_topo_node_ptr;
183 sub_topo_node_ptr.reset(
new TopoNode(
topo_node, range));
184 sub_node_vec.emplace_back(sub_topo_node_ptr.get(), range);
185 sub_node_set.insert(sub_topo_node_ptr.get());
186 sub_node_sorted_vec.push_back(sub_topo_node_ptr.get());
187 topo_nodes_.push_back(std::move(sub_topo_node_ptr));
190 for (
size_t i = 1; i < sub_node_sorted_vec.size(); ++i) {
191 auto* pre_node = sub_node_sorted_vec[i - 1];
192 auto* next_node = sub_node_sorted_vec[i];
195 edge.set_from_lane_id(
topo_node->LaneId());
196 edge.set_to_lane_id(
topo_node->LaneId());
199 std::shared_ptr<TopoEdge> topo_edge_ptr;
200 topo_edge_ptr.reset(
new TopoEdge(edge, pre_node, next_node));
201 pre_node->AddOutEdge(topo_edge_ptr.get());
202 next_node->AddInEdge(topo_edge_ptr.get());
203 topo_edges_.push_back(std::move(topo_edge_ptr));
208void SubTopoGraph::InitSubEdge(
const TopoNode*
topo_node) {
209 std::unordered_set<TopoNode*> sub_nodes;
210 if (!GetSubNodes(
topo_node, &sub_nodes)) {
214 for (
auto* sub_node : sub_nodes) {
215 InitInSubNodeSubEdge(sub_node,
topo_node->InFromAllEdge());
216 InitOutSubNodeSubEdge(sub_node,
topo_node->OutToAllEdge());
220void SubTopoGraph::InitInSubNodeSubEdge(
221 TopoNode*
const sub_node,
222 const std::unordered_set<const TopoEdge*> origin_edge) {
223 std::unordered_set<TopoNode*> other_sub_nodes;
224 for (
const auto* in_edge : origin_edge) {
225 if (GetSubNodes(in_edge->FromNode(), &other_sub_nodes)) {
226 for (
auto* sub_from_node : other_sub_nodes) {
227 if (!sub_from_node->IsOverlapEnough(sub_node, in_edge)) {
230 std::shared_ptr<TopoEdge> topo_edge_ptr;
232 new TopoEdge(in_edge->PbEdge(), sub_from_node, sub_node));
233 sub_node->AddInEdge(topo_edge_ptr.get());
234 sub_from_node->AddOutEdge(topo_edge_ptr.get());
235 topo_edges_.push_back(std::move(topo_edge_ptr));
237 }
else if (in_edge->FromNode()->IsOverlapEnough(sub_node, in_edge)) {
238 std::shared_ptr<TopoEdge> topo_edge_ptr;
240 new TopoEdge(in_edge->PbEdge(), in_edge->FromNode(), sub_node));
241 sub_node->AddInEdge(topo_edge_ptr.get());
242 topo_edges_.push_back(std::move(topo_edge_ptr));
247void SubTopoGraph::InitOutSubNodeSubEdge(
248 TopoNode*
const sub_node,
249 const std::unordered_set<const TopoEdge*> origin_edge) {
250 std::unordered_set<TopoNode*> other_sub_nodes;
251 for (
const auto* out_edge : origin_edge) {
252 if (GetSubNodes(out_edge->ToNode(), &other_sub_nodes)) {
253 for (
auto* sub_to_node : other_sub_nodes) {
254 if (!sub_node->IsOverlapEnough(sub_to_node, out_edge)) {
257 std::shared_ptr<TopoEdge> topo_edge_ptr;
259 new TopoEdge(out_edge->PbEdge(), sub_node, sub_to_node));
260 sub_node->AddOutEdge(topo_edge_ptr.get());
261 sub_to_node->AddInEdge(topo_edge_ptr.get());
262 topo_edges_.push_back(std::move(topo_edge_ptr));
264 }
else if (sub_node->IsOverlapEnough(out_edge->ToNode(), out_edge)) {
265 std::shared_ptr<TopoEdge> topo_edge_ptr;
267 new TopoEdge(out_edge->PbEdge(), sub_node, out_edge->ToNode()));
268 sub_node->AddOutEdge(topo_edge_ptr.get());
269 topo_edges_.push_back(std::move(topo_edge_ptr));
274bool SubTopoGraph::GetSubNodes(
275 const TopoNode* node,
276 std::unordered_set<TopoNode*>*
const sub_nodes)
const {
277 const auto& iter = sub_node_map_.find(node);
278 if (iter == sub_node_map_.end()) {
282 sub_nodes->insert(iter->second.begin(), iter->second.end());
286void SubTopoGraph::AddPotentialEdge(
const TopoNode*
topo_node) {
287 std::unordered_set<TopoNode*> sub_nodes;
288 if (!GetSubNodes(
topo_node, &sub_nodes)) {
291 for (
auto* sub_node : sub_nodes) {
292 AddPotentialInEdge(sub_node,
topo_node->InFromLeftOrRightEdge());
293 AddPotentialOutEdge(sub_node,
topo_node->OutToLeftOrRightEdge());
297void SubTopoGraph::AddPotentialInEdge(
298 TopoNode*
const sub_node,
299 const std::unordered_set<const TopoEdge*> origin_edge) {
300 std::unordered_set<TopoNode*> other_sub_nodes;
301 for (
const auto* in_edge : origin_edge) {
302 if (GetSubNodes(in_edge->FromNode(), &other_sub_nodes)) {
303 for (
auto* sub_from_node : other_sub_nodes) {
304 if (sub_node->GetInEdgeFrom(sub_from_node) !=
nullptr) {
307 if (!IsReachable(sub_from_node, sub_node)) {
310 std::shared_ptr<TopoEdge> topo_edge_ptr;
312 new TopoEdge(in_edge->PbEdge(), sub_from_node, sub_node));
313 sub_node->AddInEdge(topo_edge_ptr.get());
314 sub_from_node->AddOutEdge(topo_edge_ptr.get());
315 topo_edges_.push_back(std::move(topo_edge_ptr));
318 if (sub_node->GetInEdgeFrom(in_edge->FromNode()) !=
nullptr) {
321 std::shared_ptr<TopoEdge> topo_edge_ptr;
323 new TopoEdge(in_edge->PbEdge(), in_edge->FromNode(), sub_node));
324 sub_node->AddInEdge(topo_edge_ptr.get());
325 topo_edges_.push_back(std::move(topo_edge_ptr));
330void SubTopoGraph::AddPotentialOutEdge(
331 TopoNode*
const sub_node,
332 const std::unordered_set<const TopoEdge*> origin_edge) {
333 std::unordered_set<TopoNode*> other_sub_nodes;
334 for (
const auto* out_edge : origin_edge) {
335 if (GetSubNodes(out_edge->ToNode(), &other_sub_nodes)) {
336 for (
auto* sub_to_node : other_sub_nodes) {
337 if (sub_node->GetOutEdgeTo(sub_to_node) !=
nullptr) {
340 if (!IsReachable(sub_node, sub_to_node)) {
343 std::shared_ptr<TopoEdge> topo_edge_ptr;
345 new TopoEdge(out_edge->PbEdge(), sub_node, sub_to_node));
346 sub_node->AddOutEdge(topo_edge_ptr.get());
347 sub_to_node->AddInEdge(topo_edge_ptr.get());
348 topo_edges_.push_back(std::move(topo_edge_ptr));
351 if (sub_node->GetOutEdgeTo(out_edge->ToNode()) !=
nullptr) {
354 std::shared_ptr<TopoEdge> topo_edge_ptr;
356 new TopoEdge(out_edge->PbEdge(), sub_node, out_edge->ToNode()));
357 sub_node->AddOutEdge(topo_edge_ptr.get());
358 topo_edges_.push_back(std::move(topo_edge_ptr));
const TopoNode * topo_node
void GetSubInEdgesIntoSubGraph(const TopoEdge *edge, std::unordered_set< const TopoEdge * > *const sub_edges) const
const TopoNode * GetSubNodeWithS(const TopoNode *topo_node, double s) const
SubTopoGraph(const std::unordered_map< const TopoNode *, std::vector< NodeSRange > > &black_map)
void GetSubOutEdgesIntoSubGraph(const TopoEdge *edge, std::unordered_set< const TopoEdge * > *const sub_edges) const
const TopoNode * ToNode() const
const TopoNode * FromNode() const
bool IsCloseEnough(double value_1, double value_2)
int BinarySearchForStartS(const std::vector< T > &sorted_vec, double value_s)