3#include <unordered_map>
16template<
typename N,util::HashFunction<N> Hash=std::hash<N>, fishnet::util::BiPredicate<N> Equal = std::equal_to<N>>
17class AbstractConnectedComponents:
public SearchResult<AbstractConnectedComponents<N,Hash,Equal>,N,Hash,Equal> {
20 int openClosedCounter;
22 virtual void onComponentClose(
size_t component_index)
noexcept = 0;
24 virtual void onComponentOpen(
size_t component_index)
noexcept = 0;
26 virtual void onNodeOpen(
const N & node,
size_t component_index)
noexcept = 0;
28 virtual void onEdgeOpen(
const N & from,
const N & to,
size_t component_index)
noexcept = 0;
30 AbstractConnectedComponents():
SearchResult<AbstractConnectedComponents<N,Hash,Equal>,N,Hash,Equal>(){
32 this->openClosedCounter = 0;
35 void onOpen(
const N & node)
noexcept {
37 if(this->openClosedCounter == 0) {
38 this->onComponentOpen(this->index);
40 this->openClosedCounter++;
41 onNodeOpen(node, this->index);
44 void onClose(
const N & node)
noexcept {
45 this->openClosedCounter--;
47 if(this->openClosedCounter <= 0) {
48 onComponentClose(this->index);
53 void onEdge(
const N & from,
const N & to)
noexcept {
54 onEdgeOpen(from,to,this->index);
57 bool stop() const noexcept{
61 virtual ~AbstractConnectedComponents() =
default;
71template<
typename N,util::HashFunction<N> Hash=std::hash<N>, fishnet::util::BiPredicate<N> Equal = std::equal_to<N>>
78 this->components.push_back(std::vector<N>());
85 void onNodeOpen(
const N & node,
size_t component_index)
noexcept override {
86 this->components[component_index].push_back(node);
89 void onEdgeOpen([[maybe_unused]]
const N & from, [[maybe_unused]]
const N & to, [[maybe_unused]]
size_t component_index)
noexcept override {
96 this->components = std::vector<std::vector<N>>();
99 std::vector<std::vector<N>>
get() const noexcept{
108 std::unordered_map<size_t,std::vector<N>>
getAsMap() &
noexcept {
109 std::unordered_map<size_t,std::vector<N>> map;
110 size_t component_number = 0;
112 map.try_emplace(component_number,component);
122 std::unordered_map<size_t,std::vector<N>>
getAsMap() &&
noexcept {
123 std::unordered_map<size_t,std::vector<N>> map;
124 size_t component_number = 0;
126 map.try_emplace(component_number,std::move(component));
137 std::unordered_map<N,int,Hash,Equal>
nodeMap() const noexcept {
138 std::unordered_map<N,int,Hash,Equal> map;
139 for(
size_t component_number=0; component_number <
components.size(); component_number++) {
140 for(
auto & node :
components[component_number]) {
141 map.try_emplace(node,component_number);
157template<
typename N, util::HashFunction<N> Hash= std::hash<N>,fishnet::util::BiPredicate<N> Equal = std::equal_to<N>>
161 using QueuePtr = std::shared_ptr<fishnet::util::BlockingQueue<std::pair<int,std::vector<N>>>>;
166 this->queue->put(std::make_pair(component_index,this->
components.back()));
175class Subgraphs:
public __impl::AbstractConnectedComponents<typename G::node_type,typename G::adj_container_type::hash_function,typename G::adj_container_type::equality_predicate>{
177 std::vector<G> subgraphs;
179 using Base =__impl::AbstractConnectedComponents<typename G::node_type,typename G::adj_container_type::hash_function,typename G::adj_container_type::equality_predicate>;
180 using N =
typename G::node_type;
183 this->subgraphs.push_back(graphProducer());
190 void onNodeOpen(
const N & node,
size_t component_index)
noexcept override {
191 this->subgraphs[component_index].addNode(node);
194 void onEdgeOpen(
const N & from,
const N & to,
size_t component_index)
noexcept override {
195 this->subgraphs[component_index].addEdge(from,to);
199 Subgraphs()
requires std::is_default_constructible_v<G>:Base(),graphProducer([](){
return G();}){}
203 std::vector<G>
get() const noexcept{
204 return this->subgraphs;
Concurrent specialization for computing connected components.
Definition ConnectedComponents.hpp:159
~ConcurrentConnectedComponents()=default
void onComponentClose(size_t component_index) noexcept override
Definition ConnectedComponents.hpp:165
ConcurrentConnectedComponents(QueuePtr q)
Definition ConnectedComponents.hpp:169
Search Result for Connected Components.
Definition ConnectedComponents.hpp:73
void onNodeOpen(const N &node, size_t component_index) noexcept override
Definition ConnectedComponents.hpp:85
std::vector< std::vector< N > > components
Definition ConnectedComponents.hpp:75
std::unordered_map< size_t, std::vector< N > > getAsMap() &&noexcept
Get connected components as a Map: ID -> std::vector<N>
Definition ConnectedComponents.hpp:122
void onComponentClose(size_t component_index) noexcept override
Definition ConnectedComponents.hpp:81
N node_type
Definition ConnectedComponents.hpp:94
std::unordered_map< N, int, Hash, Equal > nodeMap() const noexcept
Get connected components as a Map: Node -> component-id.
Definition ConnectedComponents.hpp:137
void onEdgeOpen(const N &from, const N &to, size_t component_index) noexcept override
Definition ConnectedComponents.hpp:89
ConnectedComponents()
Definition ConnectedComponents.hpp:95
std::unordered_map< size_t, std::vector< N > > getAsMap() &noexcept
Get connected components as a Map: ID -> std::vector<N>
Definition ConnectedComponents.hpp:108
std::vector< std::vector< N > > get() const noexcept
Definition ConnectedComponents.hpp:99
void onComponentOpen(size_t component_index) noexcept override
Definition ConnectedComponents.hpp:77
~ConnectedComponents()=default
void onOpen(const N &node)
Definition SearchResult.hpp:26
SearchResult()
Definition SearchResult.hpp:22
bool stop() const
Definition SearchResult.hpp:38
void onEdge(const N &from, const N &to)
Definition SearchResult.hpp:34
void onClose(const N &node)
Definition SearchResult.hpp:30
Definition ConnectedComponents.hpp:175
void onComponentOpen(size_t component_index) noexcept override
Definition ConnectedComponents.hpp:182
void onNodeOpen(const N &node, size_t component_index) noexcept override
Definition ConnectedComponents.hpp:190
Subgraphs()
Definition ConnectedComponents.hpp:199
Subgraphs(fishnet::util::Producer< G > auto emptyGraphProducer)
Definition ConnectedComponents.hpp:201
void onEdgeOpen(const N &from, const N &to, size_t component_index) noexcept override
Definition ConnectedComponents.hpp:194
std::vector< G > get() const noexcept
Definition ConnectedComponents.hpp:203
void onComponentClose(size_t component_index) noexcept override
Definition ConnectedComponents.hpp:186
Definition FunctionalConcepts.hpp:48
Definition AdjacencyContainer.hpp:4
std::function< T()> Producer_t
Definition FunctionalConcepts.hpp:51