fpmas 1.6
distributed_edge.h
Go to the documentation of this file.
1#ifndef FPMAS_DISTRIBUTED_EDGE_H
2#define FPMAS_DISTRIBUTED_EDGE_H
3
8#include "fpmas/graph/edge.h"
11
12namespace fpmas { namespace graph {
13
15
19 template<typename T>
21 public graph::Edge<DistributedId, api::graph::DistributedNode<T>>,
25
26 private:
28 std::unique_ptr<api::graph::TemporaryNode<T>> temp_src;
29 std::unique_ptr<api::graph::TemporaryNode<T>> temp_tgt;
30
31 public:
33
41 : EdgeBase(id, layer) {}
42
43 api::graph::LocationState state() const override {return _state;}
44 void setState(api::graph::LocationState state) override {this->_state = state;}
45
50 std::unique_ptr<api::graph::TemporaryNode<T>> temp_src
51 ) override {
52 this->temp_src = std::move(temp_src);
53 }
54
55 std::unique_ptr<api::graph::TemporaryNode<T>>
56 getTempSourceNode() override {
57 return std::move(temp_src);
58 }
59
64 std::unique_ptr<api::graph::TemporaryNode<T>> temp_tgt
65 ) override {
66 this->temp_tgt = std::move(temp_tgt);
67 }
68
69 std::unique_ptr<api::graph::TemporaryNode<T>>
70 getTempTargetNode() override {
71 return std::move(temp_tgt);
72 }
73
74 };
75
76
83 template<typename T, typename PackType>
85 private:
86 PackType pack;
88 int location;
89
90 public:
102 template<typename _PackType>
103 TemporaryNode(DistributedId id, int location, _PackType&& p) :
104 pack(std::forward<_PackType>(p)), id(id), location(location) {
105 }
106
107 DistributedId getId() const override {
108 return id;
109 }
110
111 int getLocation() const override {
112 return location;
113 }
114
116 NodePtrWrapper<T> node = pack.template get<NodePtrWrapper<T>>();
117 node->setLocation(location);
118 return node;
119 }
120 };
121
125 template<typename T>
127}}
128
129namespace nlohmann {
131
137 template<typename T>
138 struct adl_serializer<EdgePtrWrapper<T>> {
154 template<typename JsonType>
155 static void to_json(JsonType& j, const EdgePtrWrapper<T>& edge) {
156 j["id"] = edge->getId();
157 j["layer"] = edge->getLayer();
158 j["weight"] = edge->getWeight();
159 j["src"] = {{}, edge->getSourceNode()->location()};
160 NodePtrWrapper<T> src(edge->getSourceNode());
161 j["src"][0] = src;
162 j["tgt"] = {{}, edge->getTargetNode()->location()};
163 NodePtrWrapper<T> tgt(edge->getTargetNode());
164 j["tgt"][0] = tgt;
165 }
166
182 template<typename JsonType>
183 static void from_json(const JsonType& j, EdgePtrWrapper<T>& edge_ptr) {
186 j.at("id").template get<DistributedId>(),
187 j.at("layer").template get<typename fpmas::graph::LayerId>()
188 };
189 edge->setWeight(j.at("weight").template get<float>());
190
193 j.at("src")[0].at("id").template get<DistributedId>(),
194 j.at("src")[1].template get<int>(),
195 std::move(j.at("src")[0])
196 )
197 ));
198
201 j.at("tgt")[0].at("id").template get<DistributedId>(),
202 j.at("tgt")[1].template get<int>(),
203 std::move(j.at("tgt")[0])
204 )
205 ));
206
207 edge_ptr = {edge};
208 }
209 };
210}
211
212namespace fpmas { namespace io { namespace datapack {
214
229 template<typename T>
234 template<typename PackType>
235 static std::size_t size(const PackType& p, const EdgePtrWrapper<T>& edge) {
236 return p.template size<DistributedId>() + // edge id
237 p.template size<int>() + // layer
238 p.template size<float>() + // edge weight
239 p.template size<DistributedId>() + // src id
240 p.template size<int>() + // src location
241 p.template size<std::size_t>() + // src pack size
242 p.template size(NodePtrWrapper<T>(edge->getSourceNode())) + // src pack
243 p.template size<DistributedId>() + // tgt id
244 p.template size<int>() + // tgt location
245 p.template size<std::size_t>() + // tgt pack size
246 p.template size(NodePtrWrapper<T>(edge->getTargetNode())); // tgt pack
247 }
248
255 template<typename PackType>
256 static void to_datapack(PackType& pack, const EdgePtrWrapper<T>& edge) {
257 pack.put(edge->getId());
258 pack.put(edge->getLayer());
259 pack.put(edge->getWeight());
260
261 pack.put(edge->getSourceNode()->getId());
262 pack.put(edge->getSourceNode()->location());
263 {
264 // Skip src pack size
265 std::size_t src_size_offset = pack.writeOffset();
266 pack.seekWrite(src_size_offset + pack.template size<std::size_t>());
267
268 // Serializes src into pack
269 std::size_t w_cursor = pack.writeOffset();
270 pack.put(NodePtrWrapper<T>(edge->getSourceNode()));
271
272 // Computes src pack size
273 std::size_t src_size = pack.writeOffset() - w_cursor;
274 pack.seekWrite(src_size_offset);
275 // Writes src pack size
276 pack.put(src_size);
277
278 // Go back at the end of src pack
279 pack.seekWrite(w_cursor+src_size);
280 }
281
282 pack.put(edge->getTargetNode()->getId());
283 pack.put(edge->getTargetNode()->location());
284 {
285 // Skip tgt pack size
286 std::size_t tgt_size_offset = pack.writeOffset();
287 pack.seekWrite(tgt_size_offset + pack.template size<std::size_t>());
288
289 // Serializes tgt into pack
290 std::size_t w_cursor = pack.writeOffset();
291 pack.put(NodePtrWrapper<T>(edge->getTargetNode()));
292
293 // Computes tgt pack size
294 std::size_t tgt_size = pack.writeOffset() - w_cursor;
295 pack.seekWrite(tgt_size_offset);
296 // Writes tgt pack size
297 pack.put(tgt_size);
298
299 // Go back at the end of tgt pack
300 pack.seekWrite(w_cursor+tgt_size);
301 }
302 }
303
310 template<typename PackType>
311 static EdgePtrWrapper<T> from_datapack(const PackType& pack) {
312 // Call order guaranteed, DO NOT CALL gets FROM THE CONSTRUCTORS
313 DistributedId id = pack.template get<DistributedId>();
314 int i = pack.template get<int>();
317 edge->setWeight(pack.template get<float>());
318
319 id = pack.template get<DistributedId>();
320 i = pack.template get<int>();
323 id, i,
324 pack.extract(pack.template get<std::size_t>())
325 )
326 ));
327
328 id = pack.template get<DistributedId>();
329 i = pack.template get<int>();
332 id, i,
333 pack.extract(pack.template get<std::size_t>())
334 )
335 ));
336
337 return {edge};
338 }
339 };
340}}}
341
342namespace fpmas { namespace communication {
343
358 template<typename T>
360 public detail::TypedMpi<fpmas::graph::EdgePtrWrapper<T>, io::datapack::LightObjectPack> {
362 };
363}}
364#endif
Definition: distributed_edge.h:91
virtual void setTempTargetNode(std::unique_ptr< api::graph::TemporaryNode< T > > temp_tgt)=0
virtual void setTempSourceNode(std::unique_ptr< api::graph::TemporaryNode< T > > temp_src)=0
Definition: distributed_id.h:89
Definition: distributed_node.h:28
virtual void setWeight(float weight)=0
_IdType IdType
Definition: edge.h:26
Definition: distributed_edge.h:47
Definition: ptr_wrapper.h:21
Definition: communication.h:337
TypedMpi(api::communication::MpiCommunicator &comm)
Definition: communication.h:359
Definition: distributed_edge.h:22
void setTempTargetNode(std::unique_ptr< api::graph::TemporaryNode< T > > temp_tgt) override
Definition: distributed_edge.h:63
std::unique_ptr< api::graph::TemporaryNode< T > > getTempTargetNode() override
Definition: distributed_edge.h:70
std::unique_ptr< api::graph::TemporaryNode< T > > getTempSourceNode() override
Definition: distributed_edge.h:56
void setState(api::graph::LocationState state) override
Definition: distributed_edge.h:44
api::graph::LocationState state() const override
Definition: distributed_edge.h:43
void setTempSourceNode(std::unique_ptr< api::graph::TemporaryNode< T > > temp_src) override
Definition: distributed_edge.h:49
DistributedEdge(DistributedId id, LayerId layer)
Definition: distributed_edge.h:40
Definition: edge.h:16
Definition: distributed_edge.h:84
DistributedId getId() const override
Definition: distributed_edge.h:107
int getLocation() const override
Definition: distributed_edge.h:111
api::graph::DistributedNode< T > * build() override
Definition: distributed_edge.h:115
TemporaryNode(DistributedId id, int location, _PackType &&p)
Definition: distributed_edge.h:103
Definition: datapack.h:301
LocationState
Definition: location_state.h:15
@ LOCAL
Definition: location_state.h:21
int LayerId
Definition: edge.h:13
api::utils::PtrWrapper< api::graph::DistributedEdge< T > > EdgePtrWrapper
Definition: distributed_edge.h:126
Definition: fpmas.cpp:3
Definition: communication.h:585
static EdgePtrWrapper< T > from_datapack(const PackType &pack)
Definition: distributed_edge.h:311
static std::size_t size(const PackType &p, const EdgePtrWrapper< T > &edge)
Definition: distributed_edge.h:235
static void to_datapack(PackType &pack, const EdgePtrWrapper< T > &edge)
Definition: distributed_edge.h:256
Definition: datapack.h:55
static void to_json(JsonType &j, const EdgePtrWrapper< T > &edge)
Definition: distributed_edge.h:155
static void from_json(const JsonType &j, EdgePtrWrapper< T > &edge_ptr)
Definition: distributed_edge.h:183