1#ifndef FPMAS_UNIFORM_GRAPH_BUILDER_H
2#define FPMAS_UNIFORM_GRAPH_BUILDER_H
12namespace fpmas {
namespace graph {
28 std::function<std::size_t(std::size_t)> index;
45 template<
typename Generator_t,
typename EdgeDist>
47 Generator_t& generator,
48 EdgeDist& distribution) :
52 index([&generator] (std::size_t max) {
56 return index(generator);
73 template<
typename EdgeDist>
100 std::vector<api::graph::DistributedNode<T>*>
build(
112 std::vector<api::graph::DistributedNode<T>*> built_nodes;
114 built_nodes.push_back(node_builder.
buildNode(graph));
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(
120 this->num_edge(), built_nodes.size()-1
123 auto position = std::find(
124 node_buffer.begin(), node_buffer.end(),
127 std::swap(*position, node_buffer.back());
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)
133 graph.
link(node, target_node, layer);
135 std::swap(target_node, node_buffer[node_buffer.size()-2-i]);
156 std::function<std::size_t(std::size_t)> index;
170 template<
typename EdgeDist>
173 EdgeDist& distribution) :
177 index([&generator] (std::size_t max) {
181 return index(generator);
198 template<
typename EdgeDist>
200 EdgeDist& distribution) :
216 std::vector<api::graph::DistributedNode<T>*>
build(
228 std::vector<api::graph::DistributedNode<T>*> built_nodes;
230 built_nodes.push_back(node_builder.
buildNode(graph));
232 typedef std::pair<api::graph::DistributedId, int> LocId;
235 std::vector<LocId> node_ids;
236 for(
auto node : built_nodes)
237 node_ids.push_back({node->getId(), node->location()});
244 for(
auto node : built_nodes) {
245 std::size_t edge_count = std::min(
246 this->num_edge(), node_ids.size()-1
249 auto position = std::find_if(
250 node_ids.begin(), node_ids.end(),
251 [node] (
const LocId&
id) {return id.first == node->getId();}
253 std::swap(*position, node_ids.back());
255 for(std::size_t i = 0; i < edge_count; i++) {
256 auto&
id = node_ids[this->index(node_ids.size()-2-i)];
260 target_node = graph.
getNode(
id.first);
261 }
catch(std::out_of_range&) {
264 graph.
link(node, target_node, layer);
266 std::swap(
id, node_ids[node_ids.size()-2-i]);
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 NodeType * getNode(NodeIdType id)=0
Definition: graph_builder.h:23
virtual std::size_t nodeCount()=0
virtual DistributedNode< T > * buildNode(DistributedGraph< T > &graph)=0
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: 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:639
Definition: communication.h:590
Definition: functional.h:94