1#ifndef FPMAS_CLUSTERED_GRAPH_BUILDER_H
2#define FPMAS_CLUSTERED_GRAPH_BUILDER_H
16namespace fpmas {
namespace graph {
47 return std::pow(p2.
y - p1.
y, 2) + std::pow(p2.
x - p1.
x, 2);
157 std::function<double()> x;
161 std::function<double()> y;
187 template<
typename Generator_t,
typename EdgeDist,
typename X_Dist,
typename Y_Dist>
189 Generator_t& generator,
190 EdgeDist& edge_distribution,
191 X_Dist& x_distribution,
192 Y_Dist& y_distribution
198 x([&generator, &x_distribution] () {
199 return x_distribution(generator);
201 y([&generator, &y_distribution] () {
202 return y_distribution(generator);
226 template<
typename EdgeDist,
typename X_Dist,
typename Y_Dist>
228 EdgeDist& edge_distribution,
229 X_Dist& x_distribution,
230 Y_Dist& y_distribution
233 x_distribution, y_distribution) {
252 template<
typename Generator_t,
typename Distribution_t>
254 Generator_t& generator,
255 Distribution_t& edge_distribution
258 generator, edge_distribution,
259 default_xy_dist, default_xy_dist) {
280 std::vector<api::graph::DistributedNode<T>*>
build(
288 ClusteredGraphBuilder<T>::default_xy_dist {0, 1000};
293 std::vector<api::graph::DistributedNode<T>*> raw_built_nodes;
294 std::vector<detail::LocalizedNode<T>> built_nodes;
296 auto* node = node_builder.
buildNode(graph);
297 built_nodes.push_back({
298 {this->x(), this->y()},
301 raw_built_nodes.push_back(node);
304 for(
auto& node : built_nodes) {
306 this->num_edge(), built_nodes.size()-1
310 std::list<detail::LocalizedNode<T>> nearest_nodes;
313 auto local_node = built_nodes[i];
314 if(local_node.node != node.node) {
315 auto it = nearest_nodes.begin();
316 while(it != nearest_nodes.end() && comp((*it).p, local_node.p))
318 nearest_nodes.insert(it, local_node);
323 for(std::size_t j = i; j < built_nodes.size(); j++) {
324 auto local_node = built_nodes[j];
325 if(local_node.node != node.node) {
326 auto it = nearest_nodes.begin();
327 while(it != nearest_nodes.end() && comp((*it).p, local_node.p))
329 if(it != nearest_nodes.end()) {
330 nearest_nodes.insert(it, local_node);
331 nearest_nodes.pop_back();
336 for(
auto nearest_node : nearest_nodes)
337 graph.
link(node.node, nearest_node.node, layer);
339 return raw_built_nodes;
356 std::function<double()> x;
360 std::function<double()> y;
393 template<
typename EdgeDist,
typename X_Dist,
typename Y_Dist>
396 EdgeDist& edge_distribution,
397 X_Dist& x_distribution,
398 Y_Dist& y_distribution
401 x([&generator, &x_distribution] () {
return x_distribution(generator);}),
402 y([&generator, &y_distribution] () {
return y_distribution(generator);}),
403 x0(x_distribution.min()), y0(y_distribution.min()),
404 X(x_distribution.max()-x0), Y(y_distribution.max()-y0) {
424 template<
typename EdgeDist,
typename X_Dist,
typename Y_Dist>
426 EdgeDist& edge_distribution,
427 X_Dist& x_distribution,
428 Y_Dist& y_distribution
432 x_distribution, y_distribution) {
450 template<
typename EdgeDist>
453 EdgeDist& edge_distribution
456 generator, edge_distribution,
457 default_xy_dist, default_xy_dist){
472 template<
typename EdgeDist>
474 EdgeDist& edge_distribution
478 default_xy_dist, default_xy_dist){
492 std::vector<api::graph::DistributedNode<T>*>
build(
500 DistributedClusteredGraphBuilder<T>::default_xy_dist {0, 1000};
511 std::vector<detail::LocalizedNode<T>> local_built_nodes;
513 auto* node = node_builder.
buildNode(graph);
514 double x = this->x();
515 double y = this->y();
516 local_built_nodes.push_back({
522 partition[node->getId()] = process_mapping.
process({
523 (int) x - (
int) x0, (int) y - (
int) y0
527 std::vector<detail::LocalizedNodeView<T>> all_built_nodes;
528 for(
auto node : local_built_nodes)
529 all_built_nodes.push_back({
530 node.p, node.node->getId(), partition[node.node->getId()]
542 local_built_nodes.clear();
543 std::vector<api::graph::DistributedNode<T>*> raw_built_nodes;
546 for(
auto& item : all_built_nodes) {
547 auto it = local_nodes.find(item.node_id);
548 if(it != local_nodes.end()) {
549 local_built_nodes.push_back({item.p, it->second});
550 raw_built_nodes.push_back(it->second);
555 const auto& graph_nodes = graph.
getNodes();
556 for(
auto& node : local_built_nodes) {
558 this->num_edge(), all_built_nodes.size()-1
561 std::list<detail::LocalizedNodeView<T>> nearest_nodes;
564 auto local_node = all_built_nodes[i];
565 if(local_node.node_id != node.node->getId()) {
566 auto it = nearest_nodes.begin();
567 while(it != nearest_nodes.end() && comp((*it).p, local_node.p))
569 nearest_nodes.insert(it, local_node);
574 for(std::size_t j = i; j < all_built_nodes.size(); j++) {
575 auto local_node = all_built_nodes[j];
576 if(local_node.node_id != node.node->getId()) {
577 auto it = nearest_nodes.begin();
578 while(it != nearest_nodes.end() && comp((*it).p, local_node.p))
580 if(it != nearest_nodes.end()) {
581 nearest_nodes.insert(it, local_node);
582 nearest_nodes.pop_back();
587 for(
auto nearest_node : nearest_nodes) {
589 auto it = graph_nodes.find(nearest_node.node_id);
590 if(it != graph_nodes.end()) {
591 target_node = it->second;
594 nearest_node.node_id, nearest_node.location, graph
597 graph.
link(node.node, target_node, layer);
604 return raw_built_nodes;
613 struct adl_serializer<
fpmas::graph::detail::LocalizedNodeView<T>> {
622 template<
typename JsonType>
636 template<
typename JsonType>
640 j.at(0).at(0).template get<double>(),
641 j.at(0).at(1).template get<double>()
643 j[1].template get<fpmas::api::graph::DistributedId>(),
644 j.at(2).template get<int>()
650namespace fpmas {
namespace io {
namespace datapack {
693 double x = pack.
get<
double>();
694 double y = pack.
get<
double>();
696 int location = pack.
get<
int>();
697 return {{x, y}, id, location};
Definition: graph_builder.h:154
Definition: distributed_graph.h:169
virtual api::communication::MpiCommunicator & getMpiCommunicator()=0
virtual void distribute(PartitionMap partition)=0
virtual synchro::SyncMode< T > & synchronizationMode()=0
virtual DistributedEdge< T > * link(DistributedNode< T > *source, DistributedNode< T > *target, LayerId layer_id)=0
virtual LocationManager< T > & getLocationManager()=0
Definition: distributed_id.h:89
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: clustered_graph_builder.h:152
ClusteredGraphBuilder(Generator_t &generator, Distribution_t &edge_distribution)
Definition: clustered_graph_builder.h:253
ClusteredGraphBuilder(EdgeDist &edge_distribution, X_Dist &x_distribution, Y_Dist &y_distribution)
Definition: clustered_graph_builder.h:227
ClusteredGraphBuilder(Generator_t &generator, EdgeDist &edge_distribution, X_Dist &x_distribution, Y_Dist &y_distribution)
Definition: clustered_graph_builder.h:188
std::vector< api::graph::DistributedNode< T > * > build(api::graph::NodeBuilder< T > &node_builder, api::graph::LayerId layer, api::graph::DistributedGraph< T > &graph) override
Definition: clustered_graph_builder.h:292
Definition: clustered_graph_builder.h:351
DistributedClusteredGraphBuilder(EdgeDist &edge_distribution, X_Dist &x_distribution, Y_Dist &y_distribution)
Definition: clustered_graph_builder.h:425
DistributedClusteredGraphBuilder(random::DistributedGenerator<> &generator, EdgeDist &edge_distribution, X_Dist &x_distribution, Y_Dist &y_distribution)
Definition: clustered_graph_builder.h:394
std::vector< api::graph::DistributedNode< T > * > build(api::graph::DistributedNodeBuilder< T > &node_builder, api::graph::LayerId layer, api::graph::DistributedGraph< T > &graph) override
Definition: clustered_graph_builder.h:504
DistributedClusteredGraphBuilder(EdgeDist &edge_distribution)
Definition: clustered_graph_builder.h:473
DistributedClusteredGraphBuilder(random::DistributedGenerator<> &generator, EdgeDist &edge_distribution)
Definition: clustered_graph_builder.h:451
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: clustered_graph_builder.h:118
bool operator()(const Point &p1, const Point &p2)
Definition: clustered_graph_builder.h:138
DistanceComparator(Point &p)
Definition: clustered_graph_builder.h:127
Definition: datapack.h:301
std::size_t size() const
Definition: datapack.h:367
void put(const T &item)
Definition: datapack.h:447
T get() const
Definition: datapack.h:459
Definition: grid_load_balancing.h:287
int process(DiscretePoint point) const override
Definition: grid_load_balancing.cpp:205
Definition: generator.h:322
Definition: distribution.h:24
std::unordered_map< DistributedId, int, api::graph::IdHash< DistributedId > > PartitionMap
Definition: load_balancing.h:19
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: clustered_graph_builder.h:83
int location
Definition: clustered_graph_builder.h:95
LocalizedNodeView(Point p, fpmas::api::graph::DistributedId node_id, int location)
Definition: clustered_graph_builder.h:105
Point p
Definition: clustered_graph_builder.h:87
fpmas::api::graph::DistributedId node_id
Definition: clustered_graph_builder.h:91
Definition: clustered_graph_builder.h:55
api::graph::DistributedNode< T > * node
Definition: clustered_graph_builder.h:63
LocalizedNode(Point p, api::graph::DistributedNode< T > *node)
Definition: clustered_graph_builder.h:71
Point p
Definition: clustered_graph_builder.h:59
Definition: clustered_graph_builder.h:21
static double distance(const Point &p1, const Point &p2)
Definition: clustered_graph_builder.h:46
double x
Definition: clustered_graph_builder.h:25
double y
Definition: clustered_graph_builder.h:29
Point(double x, double y)
Definition: clustered_graph_builder.h:37
static graph::detail::LocalizedNodeView< T > from_datapack(const ObjectPack &pack)
Definition: clustered_graph_builder.h:691
static std::size_t size(const ObjectPack &p, const graph::detail::LocalizedNodeView< T > &)
Definition: clustered_graph_builder.h:665
static void to_datapack(ObjectPack &pack, const graph::detail::LocalizedNodeView< T > &node)
Definition: clustered_graph_builder.h:676
Definition: datapack.h:55
Definition: functional.h:94
static void to_json(JsonType &j, const fpmas::graph::detail::LocalizedNodeView< T > &node)
Definition: clustered_graph_builder.h:623
static fpmas::graph::detail::LocalizedNodeView< T > from_json(const JsonType &j)
Definition: clustered_graph_builder.h:637