Reverted connection of forward and backward nodes in one SCC
This commit is contained in:
parent
5e2e1d4c96
commit
e4b58c1258
@ -73,8 +73,9 @@ class Extractor
|
|||||||
void WriteProfileProperties(const std::string &output_path,
|
void WriteProfileProperties(const std::string &output_path,
|
||||||
const ProfileProperties &properties) const;
|
const ProfileProperties &properties) const;
|
||||||
void FindComponents(unsigned max_edge_id,
|
void FindComponents(unsigned max_edge_id,
|
||||||
const util::DeallocatingVector<EdgeBasedEdge> &edges,
|
const util::DeallocatingVector<EdgeBasedEdge> &input_edge_list,
|
||||||
EdgeBasedNodeDataContainer &nodes) const;
|
const std::vector<EdgeBasedNodeSegment> &input_node_segments,
|
||||||
|
EdgeBasedNodeDataContainer &nodes_container) const;
|
||||||
void BuildRTree(std::vector<EdgeBasedNodeSegment> edge_based_node_segments,
|
void BuildRTree(std::vector<EdgeBasedNodeSegment> edge_based_node_segments,
|
||||||
std::vector<bool> node_is_startpoint,
|
std::vector<bool> node_is_startpoint,
|
||||||
const std::vector<util::Coordinate> &coordinates);
|
const std::vector<util::Coordinate> &coordinates);
|
||||||
|
@ -165,7 +165,8 @@ int Extractor::run(ScriptingEnvironment &scripting_environment)
|
|||||||
util::Log() << "Done writing. (" << TIMER_SEC(timer_write_node_weights) << ")";
|
util::Log() << "Done writing. (" << TIMER_SEC(timer_write_node_weights) << ")";
|
||||||
|
|
||||||
util::Log() << "Computing strictly connected components ...";
|
util::Log() << "Computing strictly connected components ...";
|
||||||
FindComponents(max_edge_id, edge_based_edge_list, edge_based_nodes_container);
|
FindComponents(
|
||||||
|
max_edge_id, edge_based_edge_list, edge_based_node_segments, edge_based_nodes_container);
|
||||||
|
|
||||||
util::Log() << "Building r-tree ...";
|
util::Log() << "Building r-tree ...";
|
||||||
TIMER_START(rtree);
|
TIMER_START(rtree);
|
||||||
@ -338,7 +339,8 @@ void Extractor::WriteProfileProperties(const std::string &output_path,
|
|||||||
|
|
||||||
void Extractor::FindComponents(unsigned max_edge_id,
|
void Extractor::FindComponents(unsigned max_edge_id,
|
||||||
const util::DeallocatingVector<EdgeBasedEdge> &input_edge_list,
|
const util::DeallocatingVector<EdgeBasedEdge> &input_edge_list,
|
||||||
EdgeBasedNodeDataContainer &input_nodes) const
|
const std::vector<EdgeBasedNodeSegment> &input_node_segments,
|
||||||
|
EdgeBasedNodeDataContainer &nodes_container) const
|
||||||
{
|
{
|
||||||
using InputEdge = util::static_graph_details::SortableEdgeWithData<void>;
|
using InputEdge = util::static_graph_details::SortableEdgeWithData<void>;
|
||||||
using UncontractedGraph = util::StaticGraph<void>;
|
using UncontractedGraph = util::StaticGraph<void>;
|
||||||
@ -362,6 +364,19 @@ void Extractor::FindComponents(unsigned max_edge_id,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Connect forward and backward nodes of each edge to enforce
|
||||||
|
// forward and backward edge-based nodes be in one strongly-connected component
|
||||||
|
for (const auto &segment : input_node_segments)
|
||||||
|
{
|
||||||
|
if (segment.reverse_segment_id.enabled)
|
||||||
|
{
|
||||||
|
BOOST_ASSERT(segment.forward_segment_id.id <= max_edge_id);
|
||||||
|
BOOST_ASSERT(segment.reverse_segment_id.id <= max_edge_id);
|
||||||
|
edges.push_back({segment.forward_segment_id.id, segment.reverse_segment_id.id});
|
||||||
|
edges.push_back({segment.reverse_segment_id.id, segment.forward_segment_id.id});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
tbb::parallel_sort(edges.begin(), edges.end());
|
tbb::parallel_sort(edges.begin(), edges.end());
|
||||||
edges.erase(std::unique(edges.begin(), edges.end()), edges.end());
|
edges.erase(std::unique(edges.begin(), edges.end()), edges.end());
|
||||||
|
|
||||||
@ -375,7 +390,7 @@ void Extractor::FindComponents(unsigned max_edge_id,
|
|||||||
const auto forward_component = component_search.GetComponentID(node_id);
|
const auto forward_component = component_search.GetComponentID(node_id);
|
||||||
const auto component_size = component_search.GetComponentSize(forward_component);
|
const auto component_size = component_search.GetComponentSize(forward_component);
|
||||||
const auto is_tiny = component_size < config.small_component_size;
|
const auto is_tiny = component_size < config.small_component_size;
|
||||||
input_nodes.SetComponentID(node_id, {1 + forward_component, is_tiny});
|
nodes_container.SetComponentID(node_id, {1 + forward_component, is_tiny});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user