fpmas 1.5
node.h
Go to the documentation of this file.
1#ifndef FPMAS_NODE_H
2#define FPMAS_NODE_H
3
8#include <unordered_map>
9#include <algorithm>
10
11#include "fpmas/utils/log.h"
12#include "fpmas/utils/macros.h"
15
16namespace fpmas { namespace graph {
17
21 template<typename _IdType, typename _EdgeType>
22 class Node : public virtual api::graph::Node<_IdType, _EdgeType> {
23 public:
26
27 private:
28 IdType id;
29 float weight;
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
33 public:
41 Node(const IdType& id)
42 : id(id), weight(1.f) {}
43
44 Node(const Node&) = delete;
45 Node(Node&&) = delete;
46 Node& operator=(const Node&) = delete;
47 Node& operator=(Node&&) = delete;
48
49 IdType getId() const override {return id;};
50
51 float getWeight() const override {return weight;};
52 void setWeight(float weight) override {this->weight = weight;};
53
54 const std::vector<EdgeType*> getIncomingEdges() const override;
55 const std::vector<EdgeType*> getIncomingEdges(api::graph::LayerId layer) const override;
56 const std::vector<typename EdgeType::NodeType*> inNeighbors() const override;
57 const std::vector<typename EdgeType::NodeType*> inNeighbors(api::graph::LayerId) const override;
58
59 const std::vector<EdgeType*> getOutgoingEdges() const override;
60 const std::vector<EdgeType*> getOutgoingEdges(api::graph::LayerId layer) const override;
61 const std::vector<typename EdgeType::NodeType*> outNeighbors() const override;
62 const std::vector<typename EdgeType::NodeType*> outNeighbors(api::graph::LayerId) const override;
63
64 void linkIn(EdgeType* edge) override;
65 void linkOut(EdgeType* edge) override;
66
67 void unlinkIn(EdgeType* edge) override;
68 void unlinkOut(EdgeType* edge) override;
69
70 virtual ~Node() {}
71 };
72
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) {
79 in.push_back(edge);
80 }
81 }
82 return in;
83 }
84
85 template<typename IdType, typename EdgeType>
86 const std::vector<typename Node<IdType, EdgeType>::EdgeType*>
88 return incoming_edges[id];
89 }
90
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) {
97 out.push_back(edge);
98 }
99 }
100 return out;
101 }
102
103 template<typename IdType, typename EdgeType>
104 const std::vector<typename Node<IdType, EdgeType>::EdgeType*>
106 return outgoing_edges[id];
107 }
108
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());
115 }
116 return neighbors;
117 }
118
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());
125 }
126 return neighbors;
127 }
128
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());
135 }
136 return neighbors;
137 }
138
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());
145 }
146 return neighbors;
147 }
148
149 template<typename IdType, typename EdgeType>
151 FPMAS_LOGV(
152 -1, "NODE", "%s : Linking in edge %s (%p)",
153 FPMAS_C_STR(id),
154 FPMAS_C_STR(edge->getId()), edge
155 );
156 incoming_edges[edge->getLayer()].push_back(edge);
157 }
158
159 template<typename IdType, typename EdgeType>
161 FPMAS_LOGV(
162 -1, "NODE", "%s : Linking out edge %s (%p)",
163 FPMAS_C_STR(id),
164 FPMAS_C_STR(edge->getId()), edge
165 );
166 outgoing_edges[edge->getLayer()].push_back(edge);
167 }
168
169 template<typename IdType, typename EdgeType>
171 FPMAS_LOGV(
172 -1, "NODE", "%s : Unlink in edge %s (%p) (from %s)",
173 FPMAS_C_STR(id), FPMAS_C_STR(edge->getId()), edge,
174 FPMAS_C_STR(edge->getSourceNode()->getId())
175 );
176 auto& edges = incoming_edges.at(edge->getLayer());
177 edges.erase(std::remove(edges.begin(), edges.end(), edge));
178 }
179
180 template<typename IdType, typename EdgeType>
182 FPMAS_LOGV(
183 -1, "NODE", "%s : Unlink out edge %s (%p) (to %s)",
184 FPMAS_C_STR(id), FPMAS_C_STR(edge->getId()), edge,
185 FPMAS_C_STR(edge->getTargetNode()->getId())
186 );
187 auto& edges = outgoing_edges.at(edge->getLayer());
188 edges.erase(std::remove(edges.begin(), edges.end(), edge));
189 }
190}}
191#endif
Definition: node.h:17
_EdgeType EdgeType
Definition: node.h:26
_IdType IdType
Definition: node.h:22
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
Definition: fpmas.cpp:3