fpmas 1.6
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 std::size_t num_in_edges = 0;
33 std::size_t num_out_edges = 0;
34
35 public:
43 Node(const IdType& id)
44 : id(id), weight(1.f) {}
45
46 Node(const Node&) = delete;
47 Node(Node&&) = delete;
48 Node& operator=(const Node&) = delete;
49 Node& operator=(Node&&) = delete;
50
51 IdType getId() const override {return id;};
52
53 float getWeight() const override {return weight;};
54 void setWeight(float weight) override {this->weight = weight;};
55
56 const std::vector<EdgeType*> getIncomingEdges() const override;
57 const std::vector<EdgeType*> getIncomingEdges(api::graph::LayerId layer) const override;
58 const std::vector<typename EdgeType::NodeType*> inNeighbors() const override;
59 const std::vector<typename EdgeType::NodeType*> inNeighbors(api::graph::LayerId) const override;
60
61 const std::vector<EdgeType*> getOutgoingEdges() const override;
62 const std::vector<EdgeType*> getOutgoingEdges(api::graph::LayerId layer) const override;
63 const std::vector<typename EdgeType::NodeType*> outNeighbors() const override;
64 const std::vector<typename EdgeType::NodeType*> outNeighbors(api::graph::LayerId) const override;
65
66 void linkIn(EdgeType* edge) override;
67 void linkOut(EdgeType* edge) override;
68
69 void unlinkIn(EdgeType* edge) override;
70 void unlinkOut(EdgeType* edge) override;
71
72 virtual ~Node() {}
73 };
74
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);
83 }
84 }
85 return in;
86 }
87
88 template<typename IdType, typename EdgeType>
89 const std::vector<typename Node<IdType, EdgeType>::EdgeType*>
91 return incoming_edges[id];
92 }
93
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);
102 }
103 }
104 return out;
105 }
106
107 template<typename IdType, typename EdgeType>
108 const std::vector<typename Node<IdType, EdgeType>::EdgeType*>
110 return outgoing_edges[id];
111 }
112
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());
120 }
121 return neighbors;
122 }
123
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());
132 }
133 return neighbors;
134 }
135
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());
143 }
144 return neighbors;
145 }
146
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());
155 }
156 return neighbors;
157 }
158
159 template<typename IdType, typename EdgeType>
161 FPMAS_LOGV(
162 -1, "NODE", "%s : Linking in edge %s (%p)",
163 FPMAS_C_STR(id),
164 FPMAS_C_STR(edge->getId()), edge
165 );
166 incoming_edges[edge->getLayer()].emplace_back(edge);
167 ++num_in_edges;
168 }
169
170 template<typename IdType, typename EdgeType>
172 FPMAS_LOGV(
173 -1, "NODE", "%s : Linking out edge %s (%p)",
174 FPMAS_C_STR(id),
175 FPMAS_C_STR(edge->getId()), edge
176 );
177 outgoing_edges[edge->getLayer()].emplace_back(edge);
178 ++num_out_edges;
179 }
180
181 template<typename IdType, typename EdgeType>
183 FPMAS_LOGV(
184 -1, "NODE", "%s : Unlink in edge %s (%p) (from %s)",
185 FPMAS_C_STR(id), FPMAS_C_STR(edge->getId()), edge,
186 FPMAS_C_STR(edge->getSourceNode()->getId())
187 );
188 auto& edges = incoming_edges.find(edge->getLayer())->second;
189 // Removes only first edge matching, assumes no duplicate
190 auto it = std::find(edges.begin(), edges.end(), edge);
191 if(it != edges.end()) {
192 edges.erase(it);
193 --num_in_edges;
194 }
195 }
196
197 template<typename IdType, typename EdgeType>
199 FPMAS_LOGV(
200 -1, "NODE", "%s : Unlink out edge %s (%p) (to %s)",
201 FPMAS_C_STR(id), FPMAS_C_STR(edge->getId()), edge,
202 FPMAS_C_STR(edge->getTargetNode()->getId())
203 );
204 auto& edges = outgoing_edges.find(edge->getLayer())->second;
205 // Removes only first edge matching, assumes no duplicate
206 auto it = std::find(edges.begin(), edges.end(), edge);
207 if(it != edges.end()) {
208 edges.erase(it);
209 --num_out_edges;
210 }
211 }
212}}
213#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: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
Definition: fpmas.cpp:3