fpmas 1.6
graph_builder.h
Go to the documentation of this file.
1#ifndef FPMAS_GRAPH_BUILDER_H
2#define FPMAS_GRAPH_BUILDER_H
3
10#include "ring_graph_builder.h"
12
13namespace fpmas { namespace graph {
14
23 template<typename T>
25 protected:
30 std::size_t local_node_count;
31
32 public:
45 std::size_t node_count,
48 if(comm.getRank() == 0)
50 }
51
55 std::size_t nodeCount() override {
56 return local_node_count;
57 }
58
62 std::size_t localNodeCount() override {
63 return local_node_count;
64 }
65 };
66
74 template<typename T>
76 public:
78
84 this->local_node_count--;
85 return graph.buildNode(T());
86 }
87
93 int location,
95 auto new_node = new fpmas::graph::DistributedNode<int>(id, T());
96 new_node->setLocation(location);
97 return graph.insertDistant(new_node);
98 }
99 };
100
101
106 template<typename T>
108 public api::graph::GraphBuilder<T>,
109 private RandomGraphBuilder {
110 private:
111 std::vector<api::graph::DistributedNode<T>*> base_nodes;
112 /*
113 * Function object that return a random integer between 0 and
114 * the specified argument (included).
115 */
116 std::function<std::size_t(std::size_t)> index;
117
118 public:
133 template<typename Generator_t, typename EdgeDist>
135 Generator_t& generator,
136 EdgeDist& edge_distribution,
137 std::vector<api::graph::DistributedNode<T>*> base_nodes) :
138 RandomGraphBuilder(generator, edge_distribution),
139 base_nodes(base_nodes),
140 index([&generator] (std::size_t max) {
142 0, max
143 );
144 return index(generator);
145 }){
146 }
147
161 std::vector<api::graph::DistributedNode<T>*> build(
162 api::graph::NodeBuilder<T>& node_builder,
164 api::graph::DistributedGraph<T>& graph) override;
165 };
166
167 template<typename T>
168 std::vector<api::graph::DistributedNode<T>*> BipartiteGraphBuilder<T>::build(
169 api::graph::NodeBuilder<T>& node_builder,
172 std::vector<api::graph::DistributedNode<T>*> built_nodes;
173
174 while(node_builder.nodeCount() > 0) {
175 auto* node = node_builder.buildNode(graph);
176 built_nodes.push_back(node);
177 std::size_t out_neighbors_count = std::min(
178 base_nodes.size(),
179 this->num_edge()
180 );
181 for(std::size_t i = 0; i < out_neighbors_count; i++) {
182 auto& target_node = base_nodes[this->index(base_nodes.size()-1-i)];
183 graph.link(node, target_node, layer);
184
185 std::swap(target_node, base_nodes[base_nodes.size()-1-i]);
186 }
187 }
188 return built_nodes;
189 }
190}}
191#endif
Definition: communication.h:251
Definition: distributed_graph.h:169
virtual DistributedEdge< T > * link(DistributedNode< T > *source, DistributedNode< T > *target, LayerId layer_id)=0
virtual DistributedNode< T > * insertDistant(DistributedNode< T > *node)=0
virtual DistributedNode< T > * buildNode(T &&data)=0
Definition: distributed_id.h:89
Definition: graph_builder.h:89
Definition: distributed_node.h:28
Definition: graph_builder.h:54
Definition: graph_builder.h:23
virtual std::size_t nodeCount()=0
virtual DistributedNode< T > * buildNode(DistributedGraph< T > &graph)=0
Definition: graph_builder.h:109
std::vector< api::graph::DistributedNode< T > * > build(api::graph::NodeBuilder< T > &node_builder, api::graph::LayerId layer, api::graph::DistributedGraph< T > &graph) override
Definition: graph_builder.h:168
BipartiteGraphBuilder(Generator_t &generator, EdgeDist &edge_distribution, std::vector< api::graph::DistributedNode< T > * > base_nodes)
Definition: graph_builder.h:134
Definition: graph_builder.h:75
fpmas::api::graph::DistributedNode< int > * buildDistantNode(fpmas::api::graph::DistributedId id, int location, fpmas::api::graph::DistributedGraph< int > &graph) override
Definition: graph_builder.h:91
fpmas::api::graph::DistributedNode< int > * buildNode(fpmas::api::graph::DistributedGraph< int > &graph) override
Definition: graph_builder.h:82
Definition: graph_builder.h:24
std::size_t nodeCount() override
Definition: graph_builder.h:55
std::size_t local_node_count
Definition: graph_builder.h:30
DistributedNodeBuilder(std::size_t node_count, fpmas::api::communication::MpiCommunicator &comm)
Definition: graph_builder.h:44
std::size_t localNodeCount() override
Definition: graph_builder.h:62
Definition: distributed_node.h:25
Definition: random_graph_builder.h:19
Definition: distribution.h:24
int LayerId
Definition: edge.h:13
std::size_t node_count(api::graph::DistributedGraph< T > &graph)
Definition: analysis.h:25
Definition: fpmas.cpp:3