1#ifndef FPMAS_SMALL_WORLD_GRAPH_BUILDER_H
2#define FPMAS_SMALL_WORLD_GRAPH_BUILDER_H
17namespace fpmas {
namespace graph {
95 : p(p), ring_graph_builder(k/2,
CYCLE) {
98 std::vector<api::graph::DistributedNode<T>*>
build(
109 std::vector<api::graph::DistributedNode<T>*> local_nodes
110 = ring_graph_builder.build(node_builder, layer, graph);
111 const auto& graph_nodes = graph.
getNodes();
112 std::vector<DistributedId> local_ids(local_nodes.size());
113 for(std::size_t i = 0; i < local_ids.size(); i++)
114 local_ids[i] = local_nodes[i]->getId();
117 std::vector<api::graph::DistributedEdge<T>*> pre_in_edges_to_rewire;
118 std::vector<api::graph::DistributedEdge<T>*> out_edges_to_rewire;
121 for(
auto node : local_nodes)
122 for(
auto edge : node->getOutgoingEdges(layer))
125 out_edges_to_rewire.push_back(edge);
127 pre_in_edges_to_rewire.push_back(edge);
129 std::unordered_map<int, std::vector<DistributedId>> in_edges_rewiring_requests;
132 std::vector<std::pair<DistributedId, int>> random_nodes(out_edges_to_rewire.size());
134 auto it = random_nodes.begin();
135 std::vector<std::vector<DistributedId>> random_choices =
139 out_edges_to_rewire.size());
140 for(std::size_t i = 0; i < random_choices.size(); i++)
141 for(
auto& item : random_choices[i])
145 for(std::size_t i = 0; i < out_edges_to_rewire.size(); i++) {
146 if(random_nodes[i].first != out_edges_to_rewire[i]->getSourceNode()->getId()) {
147 assert(out_edges_to_rewire[i]->getSourceNode()->state()
149 auto current_source_out_edges =
150 out_edges_to_rewire[i]->getSourceNode()->getOutgoingEdges(layer);
154 current_source_out_edges.begin(), current_source_out_edges.end(),
156 return edge->getTargetNode()->getId() == random_nodes[i].first;
157 }) == current_source_out_edges.end()) {
159 auto existing_node = graph_nodes.find(random_nodes[i].first);
160 if(existing_node != graph_nodes.end()) {
161 new_target = existing_node->second;
164 random_nodes[i].first, random_nodes[i].second,
169 graph.
link(out_edges_to_rewire[i]->getSourceNode(), new_target, layer);
170 graph.
unlink(out_edges_to_rewire[i]);
174 out_edges_to_rewire.clear();
178 std::vector<api::graph::DistributedEdge<T>*> in_edges_to_rewire;
179 for(
auto edge : pre_in_edges_to_rewire)
181 in_edges_rewiring_requests[edge->getTargetNode()->location()]
182 .push_back(edge->getId());
184 in_edges_to_rewire.push_back(edge);
186 pre_in_edges_to_rewire.clear();
190 in_edges_rewiring_requests = id_mpi.
allToAll(in_edges_rewiring_requests);
191 for(
auto item : in_edges_rewiring_requests)
192 for(
auto edge_id : item.second)
193 in_edges_to_rewire.push_back(graph.
getEdge(edge_id));
195 in_edges_rewiring_requests.clear();
198 std::vector<std::pair<DistributedId, int>> random_nodes(in_edges_to_rewire.size());
200 auto it = random_nodes.begin();
201 std::vector<std::vector<DistributedId>> random_choices =
205 in_edges_to_rewire.size());
206 for(std::size_t i = 0; i < random_choices.size(); i++)
207 for(
auto& item : random_choices[i])
211 for(std::size_t i = 0; i < in_edges_to_rewire.size(); i++) {
212 if(random_nodes[i].first != in_edges_to_rewire[i]->getTargetNode()->getId()) {
213 assert(in_edges_to_rewire[i]->getTargetNode()->state()
215 auto current_target_in_edges =
216 in_edges_to_rewire[i]->getTargetNode()->getIncomingEdges(layer);
220 current_target_in_edges.begin(), current_target_in_edges.end(),
222 return edge->getSourceNode()->getId() == random_nodes[i].first;
223 }) == current_target_in_edges.end()) {
225 auto existing_node = graph_nodes.find(random_nodes[i].first);
226 if(existing_node != graph_nodes.end()) {
227 new_source = existing_node->second;
230 random_nodes[i].first, random_nodes[i].second,
235 graph.
link(new_source, in_edges_to_rewire[i]->getTargetNode(), layer);
236 graph.
unlink(in_edges_to_rewire[i]);
Definition: distributed_edge.h:91
Definition: graph_builder.h:154
Definition: distributed_graph.h:169
virtual api::communication::MpiCommunicator & getMpiCommunicator()=0
virtual DistributedEdge< T > * link(DistributedNode< T > *source, DistributedNode< T > *target, LayerId layer_id)=0
virtual void synchronize()=0
virtual void unlink(DistributedEdge< T > *edge)=0
Definition: graph_builder.h:89
virtual DistributedNode< T > * buildDistantNode(DistributedId id, int location, DistributedGraph< T > &graph)=0
Definition: distributed_node.h:28
virtual const NodeMap & getNodes() const =0
virtual EdgeType * getEdge(EdgeIdType id)=0
std::unordered_map< int, T > allToAll(std::unordered_map< int, T > export_map) override
Definition: communication.h:446
static random::DistributedGenerator distributed_rd
Definition: random_graph_builder.h:52
Definition: ring_graph_builder.h:55
Definition: small_world_graph_builder.h:60
SmallWorldGraphBuilder(float p, std::size_t k)
Definition: small_world_graph_builder.h:92
std::vector< api::graph::DistributedNode< T > * > build(api::graph::DistributedNodeBuilder< T > &node_builder, api::graph::LayerId layer, api::graph::DistributedGraph< T > &graph) override
Definition: small_world_graph_builder.h:105
Definition: distribution.h:24
@ LOCAL
Definition: location_state.h:21
int LayerId
Definition: edge.h:13
@ CYCLE
Definition: ring_graph_builder.h:27
std::vector< std::vector< T > > distributed_choices(api::communication::MpiCommunicator &comm, const std::vector< T > &local_items, std::size_t n)
Definition: random.h:112
Definition: communication.h:585