1#ifndef FPMAS_DISTRIBUTED_EDGE_H
2#define FPMAS_DISTRIBUTED_EDGE_H
12namespace fpmas {
namespace graph {
21 public graph::Edge<DistributedId, api::graph::DistributedNode<T>>,
28 std::unique_ptr<api::graph::TemporaryNode<T>> temp_src;
29 std::unique_ptr<api::graph::TemporaryNode<T>> temp_tgt;
52 this->temp_src = std::move(temp_src);
55 std::unique_ptr<api::graph::TemporaryNode<T>>
57 return std::move(temp_src);
66 this->temp_tgt = std::move(temp_tgt);
69 std::unique_ptr<api::graph::TemporaryNode<T>>
71 return std::move(temp_tgt);
83 template<
typename T,
typename PackType>
102 template<
typename _PackType>
104 pack(std::forward<_PackType>(p)), id(id), location(location) {
117 node->setLocation(location);
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());
162 j[
"tgt"] = {{}, edge->getTargetNode()->location()};
163 NodePtrWrapper<T> tgt(edge->getTargetNode());
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>()
189 edge->
setWeight(j.at(
"weight").template get<float>());
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])
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])
212namespace fpmas {
namespace io {
namespace datapack {
234 template<
typename PackType>
235 static std::size_t
size(
const PackType& p,
const EdgePtrWrapper<T>& edge) {
236 return p.template size<DistributedId>() +
237 p.template size<int>() +
238 p.template size<float>() +
239 p.template size<DistributedId>() +
240 p.template size<int>() +
241 p.template size<std::size_t>() +
242 p.template size(NodePtrWrapper<T>(edge->getSourceNode())) +
243 p.template size<DistributedId>() +
244 p.template size<int>() +
245 p.template size<std::size_t>() +
246 p.template size(NodePtrWrapper<T>(edge->getTargetNode()));
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());
261 pack.put(edge->getSourceNode()->getId());
262 pack.put(edge->getSourceNode()->location());
265 std::size_t src_size_offset = pack.writeOffset();
266 pack.seekWrite(src_size_offset + pack.template size<std::size_t>());
269 std::size_t w_cursor = pack.writeOffset();
270 pack.put(NodePtrWrapper<T>(edge->getSourceNode()));
273 std::size_t src_size = pack.writeOffset() - w_cursor;
274 pack.seekWrite(src_size_offset);
279 pack.seekWrite(w_cursor+src_size);
282 pack.put(edge->getTargetNode()->getId());
283 pack.put(edge->getTargetNode()->location());
286 std::size_t tgt_size_offset = pack.writeOffset();
287 pack.seekWrite(tgt_size_offset + pack.template size<std::size_t>());
290 std::size_t w_cursor = pack.writeOffset();
291 pack.put(NodePtrWrapper<T>(edge->getTargetNode()));
294 std::size_t tgt_size = pack.writeOffset() - w_cursor;
295 pack.seekWrite(tgt_size_offset);
300 pack.seekWrite(w_cursor+tgt_size);
310 template<
typename PackType>
314 int i = pack.template get<int>();
317 edge->
setWeight(pack.template get<float>());
319 id = pack.template get<DistributedId>();
320 i = pack.template get<int>();
324 pack.extract(pack.template get<std::size_t>())
328 id = pack.template get<DistributedId>();
329 i = pack.template get<int>();
333 pack.extract(pack.template get<std::size_t>())
342namespace fpmas {
namespace communication {
360 public detail::TypedMpi<fpmas::graph::EdgePtrWrapper<T>, io::datapack::LightObjectPack> {
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: 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: 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