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) {
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());
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 const auto& graph_nodes = graph.
getNodes();
245 for(
auto node : built_nodes) {
247 this->num_edge(), node_ids.size()-1
250 auto position = std::find_if(
251 node_ids.begin(), node_ids.end(),
252 [node] (
const LocId&
id) {return id.first == node->getId();}
254 std::swap(*position, node_ids.back());
257 auto&
id = node_ids[this->index(node_ids.size()-2-i)];
260 auto it = graph_nodes.find(
id.first);
261 if(it != graph_nodes.end()) {
262 target_node = it->second;
266 graph.
link(node, target_node, layer);
268 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 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: 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:634
std::size_t edge_count(api::graph::DistributedGraph< T > &graph)
Definition: analysis.h:41
Definition: communication.h:585
Definition: functional.h:94