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;
42 : id(id), weight(1.f) {}
46 Node& operator=(
const Node&) =
delete;
52 void setWeight(
float weight)
override {this->weight = weight;};
56 const std::vector<typename EdgeType::NodeType*>
inNeighbors()
const override;
61 const std::vector<typename EdgeType::NodeType*>
outNeighbors()
const override;
73 template<
typename IdType,
typename EdgeType>
74 const std::vector<typename Node<IdType, EdgeType>::EdgeType*>
76 std::vector<EdgeType*> in;
77 for(
auto layer : this->incoming_edges) {
78 for(
auto* edge : layer.second) {
85 template<
typename IdType,
typename EdgeType>
86 const std::vector<typename Node<IdType, EdgeType>::EdgeType*>
88 return incoming_edges[id];
91 template<
typename IdType,
typename EdgeType>
92 const std::vector<typename Node<IdType, EdgeType>::EdgeType*>
94 std::vector<EdgeType*> out;
95 for(
auto layer : this->outgoing_edges) {
96 for(
auto* edge : layer.second) {
103 template<
typename IdType,
typename EdgeType>
104 const std::vector<typename Node<IdType, EdgeType>::EdgeType*>
106 return outgoing_edges[id];
109 template<
typename IdType,
typename EdgeType>
110 const std::vector<typename Node<IdType, EdgeType>::EdgeType::NodeType*>
112 std::vector<typename EdgeType::NodeType*> neighbors;
113 for(
auto edge : this->getIncomingEdges()) {
114 neighbors.push_back(edge->getSourceNode());
119 template<
typename IdType,
typename EdgeType>
120 const std::vector<typename Node<IdType, EdgeType>::EdgeType::NodeType*>
122 std::vector<typename EdgeType::NodeType*> neighbors;
123 for(
auto edge : this->getIncomingEdges(layer)) {
124 neighbors.push_back(edge->getSourceNode());
129 template<
typename IdType,
typename EdgeType>
130 const std::vector<typename Node<IdType, EdgeType>::EdgeType::NodeType*>
132 std::vector<typename EdgeType::NodeType*> neighbors;
133 for(
auto edge : this->getOutgoingEdges()) {
134 neighbors.push_back(edge->getTargetNode());
139 template<
typename IdType,
typename EdgeType>
140 const std::vector<typename Node<IdType, EdgeType>::EdgeType::NodeType*>
142 std::vector<typename EdgeType::NodeType*> neighbors;
143 for(
auto edge : this->getOutgoingEdges(layer)) {
144 neighbors.push_back(edge->getTargetNode());
149 template<
typename IdType,
typename EdgeType>
152 -1,
"NODE",
"%s : Linking in edge %s (%p)",
156 incoming_edges[edge->getLayer()].push_back(edge);
159 template<
typename IdType,
typename EdgeType>
162 -1,
"NODE",
"%s : Linking out edge %s (%p)",
166 outgoing_edges[edge->getLayer()].push_back(edge);
169 template<
typename IdType,
typename EdgeType>
172 -1,
"NODE",
"%s : Unlink in edge %s (%p) (from %s)",
176 auto& edges = incoming_edges.at(edge->getLayer());
177 edges.erase(std::remove(edges.begin(), edges.end(), edge));
180 template<
typename IdType,
typename EdgeType>
183 -1,
"NODE",
"%s : Unlink out edge %s (%p) (to %s)",
187 auto& edges = outgoing_edges.at(edge->getLayer());
188 edges.erase(std::remove(edges.begin(), edges.end(), edge));
_EdgeType EdgeType
Definition: node.h:26
_IdType IdType
Definition: node.h:22
void setWeight(float weight) override
Definition: node.h:52
float getWeight() const override
Definition: node.h:51
const std::vector< typename EdgeType::NodeType * > inNeighbors() const override
Definition: node.h:111
const std::vector< typename EdgeType::NodeType * > outNeighbors() const override
Definition: node.h:131
const std::vector< EdgeType * > getIncomingEdges() const override
Definition: node.h:75
void unlinkIn(EdgeType *edge) override
Definition: node.h:170
Node(const IdType &id)
Definition: node.h:41
void unlinkOut(EdgeType *edge) override
Definition: node.h:181
void linkOut(EdgeType *edge) override
Definition: node.h:160
const std::vector< EdgeType * > getOutgoingEdges() const override
Definition: node.h:93
IdType getId() const override
Definition: node.h:49
void linkIn(EdgeType *edge) override
Definition: node.h:150
#define FPMAS_C_STR(arg)
Definition: macros.h:24
int LayerId
Definition: edge.h:13