fpmas 1.6
uniform_graph_builder.h
Go to the documentation of this file.
1#ifndef FPMAS_UNIFORM_GRAPH_BUILDER_H
2#define FPMAS_UNIFORM_GRAPH_BUILDER_H
3
11
12namespace fpmas { namespace graph {
18 // TODO 2.0: remove or rename this, use Distributed instead
19 template<typename T>
22 private RandomGraphBuilder {
23 private:
24 /*
25 * Function object that return a random integer between 0 and
26 * the specified argument (included).
27 */
28 std::function<std::size_t(std::size_t)> index;
29
30 public:
44 // TODO 2.0: Remove this constructor
45 template<typename Generator_t, typename EdgeDist>
47 Generator_t& generator,
48 EdgeDist& distribution) :
49 RandomGraphBuilder(generator, distribution),
50 // A lambda function is used to "catch" generator, without
51 // requiring class level template parameters.
52 index([&generator] (std::size_t max) {
54 0, max
55 );
56 return index(generator);
57 }) {
58 }
59
73 template<typename EdgeDist>
74 UniformGraphBuilder(EdgeDist& distribution)
75 : UniformGraphBuilder(RandomGraphBuilder::rd, distribution) {
76 }
77
100 std::vector<api::graph::DistributedNode<T>*> build(
101 api::graph::NodeBuilder<T>& node_builder,
103 api::graph::DistributedGraph<T>& graph) override;
104 };
105
106 template<typename T>
107 std::vector<api::graph::DistributedNode<T>*> UniformGraphBuilder<T>
109 api::graph::NodeBuilder<T>& node_builder,
112 std::vector<api::graph::DistributedNode<T>*> built_nodes;
113 while(node_builder.nodeCount() != 0)
114 built_nodes.push_back(node_builder.buildNode(graph));
115
116 std::vector<api::graph::DistributedNode<T>*> node_buffer = built_nodes;
117 for(auto node : built_nodes) {
118 std::size_t edge_count = std::min(
119 // Random edge count
120 this->num_edge(), built_nodes.size()-1
121 );
122
123 auto position = std::find(
124 node_buffer.begin(), node_buffer.end(),
125 node
126 );
127 std::swap(*position, node_buffer.back());
128
129 for(std::size_t i = 0; i < edge_count; i++) {
130 auto& target_node = node_buffer[
131 this->index(node_buffer.size()-2-i) // random index
132 ];
133 graph.link(node, target_node, layer);
134
135 std::swap(target_node, node_buffer[node_buffer.size()-2-i]);
136 }
137 }
138 return built_nodes;
139 }
140
147 template<typename T>
150 private RandomGraphBuilder {
151 private:
152 /*
153 * Function object that return a random integer between 0 and
154 * the specified argument (included).
155 */
156 std::function<std::size_t(std::size_t)> index;
157 public:
158
170 template<typename EdgeDist>
173 EdgeDist& distribution) :
174 RandomGraphBuilder(generator, distribution),
175 // A lambda function is used to "catch" generator, without
176 // requiring class level template parameters.
177 index([&generator] (std::size_t max) {
179 0, max
180 );
181 return index(generator);
182 }) {
183 }
184
198 template<typename EdgeDist>
200 EdgeDist& distribution) :
202 }
203
216 std::vector<api::graph::DistributedNode<T>*> build(
219 api::graph::DistributedGraph<T>& graph) override;
220 };
221
222 template<typename T>
223 std::vector<api::graph::DistributedNode<T>*> DistributedUniformGraphBuilder<T>
228 std::vector<api::graph::DistributedNode<T>*> built_nodes;
229 while(node_builder.localNodeCount() != 0)
230 built_nodes.push_back(node_builder.buildNode(graph));
231
232 typedef std::pair<api::graph::DistributedId, int> LocId;
234 id_mpi(graph.getMpiCommunicator());
235 std::vector<LocId> node_ids;
236 for(auto node : built_nodes)
237 node_ids.push_back({node->getId(), node->location()});
238
240 id_mpi, node_ids, fpmas::utils::Concat()
241 );
242
243
244 const auto& graph_nodes = graph.getNodes();
245 for(auto node : built_nodes) {
246 std::size_t edge_count = std::min(
247 this->num_edge(), node_ids.size()-1
248 );
249
250 auto position = std::find_if(
251 node_ids.begin(), node_ids.end(),
252 [node] (const LocId& id) {return id.first == node->getId();}
253 );
254 std::swap(*position, node_ids.back());
255
256 for(std::size_t i = 0; i < edge_count; i++) {
257 auto& id = node_ids[this->index(node_ids.size()-2-i)];
258
260 auto it = graph_nodes.find(id.first);
261 if(it != graph_nodes.end()) {
262 target_node = it->second;
263 } else {
264 target_node = node_builder.buildDistantNode(id.first, id.second, graph);
265 }
266 graph.link(node, target_node, layer);
267
268 std::swap(id, node_ids[node_ids.size()-2-i]);
269 }
270 }
271
272 // Commits new links
273 graph.synchronizationMode().getSyncLinker().synchronize();
274
275 return built_nodes;
276 }
277}}
278#endif
Definition: graph_builder.h:154
Definition: distributed_graph.h:169
virtual api::communication::MpiCommunicator & getMpiCommunicator()=0
virtual synchro::SyncMode< T > & synchronizationMode()=0
virtual DistributedEdge< T > * link(DistributedNode< T > *source, DistributedNode< T > *target, LayerId layer_id)=0
Definition: graph_builder.h:89
virtual std::size_t localNodeCount()=0
virtual DistributedNode< T > * buildDistantNode(DistributedId id, int location, DistributedGraph< T > &graph)=0
Definition: distributed_node.h:28
Definition: graph_builder.h:54
virtual const NodeMap & getNodes() const =0
Definition: graph_builder.h:23
virtual std::size_t nodeCount()=0
virtual DistributedNode< T > * buildNode(DistributedGraph< T > &graph)=0
Definition: uniform_graph_builder.h:150
std::vector< api::graph::DistributedNode< T > * > build(api::graph::DistributedNodeBuilder< T > &node_builder, api::graph::LayerId layer, api::graph::DistributedGraph< T > &graph) override
Definition: uniform_graph_builder.h:224
DistributedUniformGraphBuilder(EdgeDist &distribution)
Definition: uniform_graph_builder.h:199
DistributedUniformGraphBuilder(random::DistributedGenerator<> &generator, EdgeDist &distribution)
Definition: uniform_graph_builder.h:171
Definition: random_graph_builder.h:19
static random::mt19937_64 rd
Definition: random_graph_builder.h:59
static random::DistributedGenerator distributed_rd
Definition: random_graph_builder.h:52
Definition: uniform_graph_builder.h:22
UniformGraphBuilder(EdgeDist &distribution)
Definition: uniform_graph_builder.h:74
std::vector< api::graph::DistributedNode< T > * > build(api::graph::NodeBuilder< T > &node_builder, api::graph::LayerId layer, api::graph::DistributedGraph< T > &graph) override
Definition: uniform_graph_builder.h:108
UniformGraphBuilder(Generator_t &generator, EdgeDist &distribution)
Definition: uniform_graph_builder.h:46
Definition: generator.h:322
Definition: distribution.h:24
int LayerId
Definition: edge.h:13
T all_reduce(api::communication::TypedMpi< T > &mpi, const T &data, BinaryOp binary_op=BinaryOp())
Definition: communication.h:634
std::size_t edge_count(api::graph::DistributedGraph< T > &graph)
Definition: analysis.h:41
Definition: fpmas.cpp:3
Definition: communication.h:585
Definition: functional.h:94