8#include <unordered_map>
11#include "fpmas/utils/log.h"
16namespace fpmas {
namespace graph {
21 template<
typename _IdType,
typename _EdgeType>
30 mutable std::unordered_map<api::graph::LayerId, std::vector<EdgeType*>> incoming_edges;
31 mutable std::unordered_map<api::graph::LayerId, std::vector<EdgeType*>> outgoing_edges;
32 std::size_t num_in_edges = 0;
33 std::size_t num_out_edges = 0;
44 : id(id), weight(1.f) {}
48 Node& operator=(
const Node&) =
delete;
54 void setWeight(
float weight)
override {this->weight = weight;};
58 const std::vector<typename EdgeType::NodeType*>
inNeighbors()
const override;
63 const std::vector<typename EdgeType::NodeType*>
outNeighbors()
const override;
75 template<
typename IdType,
typename EdgeType>
76 const std::vector<typename Node<IdType, EdgeType>::EdgeType*>
78 std::vector<EdgeType*> in;
79 in.reserve(num_in_edges);
80 for(
auto layer : this->incoming_edges) {
81 for(
auto* edge : layer.second) {
82 in.emplace_back(edge);
88 template<
typename IdType,
typename EdgeType>
89 const std::vector<typename Node<IdType, EdgeType>::EdgeType*>
91 return incoming_edges[id];
94 template<
typename IdType,
typename EdgeType>
95 const std::vector<typename Node<IdType, EdgeType>::EdgeType*>
97 std::vector<EdgeType*> out;
98 out.reserve(num_out_edges);
99 for(
auto layer : this->outgoing_edges) {
100 for(
auto* edge : layer.second) {
101 out.emplace_back(edge);
107 template<
typename IdType,
typename EdgeType>
108 const std::vector<typename Node<IdType, EdgeType>::EdgeType*>
110 return outgoing_edges[id];
113 template<
typename IdType,
typename EdgeType>
114 const std::vector<typename Node<IdType, EdgeType>::EdgeType::NodeType*>
116 std::vector<typename EdgeType::NodeType*> neighbors;
117 neighbors.reserve(num_in_edges);
118 for(
auto edge : this->getIncomingEdges()) {
119 neighbors.emplace_back(edge->getSourceNode());
124 template<
typename IdType,
typename EdgeType>
125 const std::vector<typename Node<IdType, EdgeType>::EdgeType::NodeType*>
127 std::vector<typename EdgeType::NodeType*> neighbors;
128 auto edges = this->getIncomingEdges(layer);
129 neighbors.reserve(edges.size());
130 for(
auto edge : edges) {
131 neighbors.emplace_back(edge->getSourceNode());
136 template<
typename IdType,
typename EdgeType>
137 const std::vector<typename Node<IdType, EdgeType>::EdgeType::NodeType*>
139 std::vector<typename EdgeType::NodeType*> neighbors;
140 neighbors.reserve(num_out_edges);
141 for(
auto& edge : this->getOutgoingEdges()) {
142 neighbors.emplace_back(edge->getTargetNode());
147 template<
typename IdType,
typename EdgeType>
148 const std::vector<typename Node<IdType, EdgeType>::EdgeType::NodeType*>
150 std::vector<typename EdgeType::NodeType*> neighbors;
151 auto edges = this->getOutgoingEdges(layer);
152 neighbors.reserve(edges.size());
153 for(
auto edge : edges) {
154 neighbors.emplace_back(edge->getTargetNode());
159 template<
typename IdType,
typename EdgeType>
162 -1,
"NODE",
"%s : Linking in edge %s (%p)",
166 incoming_edges[edge->getLayer()].emplace_back(edge);
170 template<
typename IdType,
typename EdgeType>
173 -1,
"NODE",
"%s : Linking out edge %s (%p)",
177 outgoing_edges[edge->getLayer()].emplace_back(edge);
181 template<
typename IdType,
typename EdgeType>
184 -1,
"NODE",
"%s : Unlink in edge %s (%p) (from %s)",
188 auto& edges = incoming_edges.find(edge->getLayer())->second;
190 auto it = std::find(edges.begin(), edges.end(), edge);
191 if(it != edges.end()) {
197 template<
typename IdType,
typename EdgeType>
200 -1,
"NODE",
"%s : Unlink out edge %s (%p) (to %s)",
204 auto& edges = outgoing_edges.find(edge->getLayer())->second;
206 auto it = std::find(edges.begin(), edges.end(), edge);
207 if(it != edges.end()) {
_EdgeType EdgeType
Definition: node.h:26
_IdType IdType
Definition: node.h:22
void setWeight(float weight) override
Definition: node.h:54
float getWeight() const override
Definition: node.h:53
const std::vector< typename EdgeType::NodeType * > inNeighbors() const override
Definition: node.h:115
const std::vector< typename EdgeType::NodeType * > outNeighbors() const override
Definition: node.h:138
const std::vector< EdgeType * > getIncomingEdges() const override
Definition: node.h:77
void unlinkIn(EdgeType *edge) override
Definition: node.h:182
Node(const IdType &id)
Definition: node.h:43
void unlinkOut(EdgeType *edge) override
Definition: node.h:198
void linkOut(EdgeType *edge) override
Definition: node.h:171
const std::vector< EdgeType * > getOutgoingEdges() const override
Definition: node.h:96
IdType getId() const override
Definition: node.h:51
void linkIn(EdgeType *edge) override
Definition: node.h:160
#define FPMAS_C_STR(arg)
Definition: macros.h:24
int LayerId
Definition: edge.h:13