fpmas 1.5
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"
11
12namespace fpmas { namespace graph {
13
22 template<typename T>
24 protected:
29 std::size_t local_node_count;
30
31 public:
44 std::size_t node_count,
46 local_node_count = node_count / comm.getSize();
47 if(comm.getRank() == 0)
48 local_node_count += node_count % comm.getSize();
49 }
50
54 std::size_t nodeCount() override {
55 return local_node_count;
56 }
57
61 std::size_t localNodeCount() override {
62 return local_node_count;
63 }
64 };
65
66
67
72 template<typename T>
75 private RandomGraphBuilder {
76 private:
77 std::vector<api::graph::DistributedNode<T>*> base_nodes;
78 /*
79 * Function object that return a random integer between 0 and
80 * the specified argument (included).
81 */
82 std::function<std::size_t(std::size_t)> index;
83
84 public:
99 template<typename Generator_t, typename EdgeDist>
101 Generator_t& generator,
102 EdgeDist& edge_distribution,
103 std::vector<api::graph::DistributedNode<T>*> base_nodes) :
104 RandomGraphBuilder(generator, edge_distribution),
105 base_nodes(base_nodes),
106 index([&generator] (std::size_t max) {
108 0, max
109 );
110 return index(generator);
111 }){
112 }
113
127 std::vector<api::graph::DistributedNode<T>*> build(
128 api::graph::NodeBuilder<T>& node_builder,
130 api::graph::DistributedGraph<T>& graph) override;
131 };
132
133 template<typename T>
134 std::vector<api::graph::DistributedNode<T>*> BipartiteGraphBuilder<T>::build(
135 api::graph::NodeBuilder<T>& node_builder,
138 std::vector<api::graph::DistributedNode<T>*> built_nodes;
139
140 while(node_builder.nodeCount() > 0) {
141 auto* node = node_builder.buildNode(graph);
142 built_nodes.push_back(node);
143 std::size_t out_neighbors_count = std::min(
144 base_nodes.size(),
145 this->num_edge()
146 );
147 for(std::size_t i = 0; i < out_neighbors_count; i++) {
148 auto& target_node = base_nodes[this->index(base_nodes.size()-1-i)];
149 graph.link(node, target_node, layer);
150
151 std::swap(target_node, base_nodes[base_nodes.size()-1-i]);
152 }
153 }
154 return built_nodes;
155 }
156}}
157#endif
Definition: communication.h:251
Definition: distributed_graph.h:169
virtual DistributedEdge< T > * link(DistributedNode< T > *source, DistributedNode< T > *target, LayerId layer_id)=0
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:75
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:134
BipartiteGraphBuilder(Generator_t &generator, EdgeDist &edge_distribution, std::vector< api::graph::DistributedNode< T > * > base_nodes)
Definition: graph_builder.h:100
Definition: graph_builder.h:23
std::size_t nodeCount() override
Definition: graph_builder.h:54
std::size_t local_node_count
Definition: graph_builder.h:29
DistributedNodeBuilder(std::size_t node_count, fpmas::api::communication::MpiCommunicator &comm)
Definition: graph_builder.h:43
std::size_t localNodeCount() override
Definition: graph_builder.h:61
Definition: random_graph_builder.h:19
Definition: distribution.h:24
int LayerId
Definition: edge.h:13
Definition: fpmas.cpp:3