Algorithms Library Toolkit
A toolkit for algorithms, especially for algorithms on formal languages
MixedMultiGraph.hpp
Go to the documentation of this file.
1
6// Copyright (c) 2017 Czech Technical University in Prague | Faculty of Information Technology. All rights reserved.
7
8#pragma once
9
10#include <alib/map>
11#include <alib/tuple>
12#include <alib/set>
13#include <alib/vector>
14#include <functional>
15#include <alib/pair>
16#include <object/Object.h>
17#include <core/normalize.hpp>
18
19#include <common/Normalize.hpp>
22
23namespace graph {
24
25template<typename TNode, typename TEdge>
26class MixedMultiGraph : public GraphInterface<TNode, TEdge> {
27// ---------------------------------------------------------------------------------------------------------------------
28 public:
29 using node_type = TNode;
30 using edge_type = TEdge;
31
32// ---------------------------------------------------------------------------------------------------------------------
33
34 protected:
35 // Container for edge
37
38 // Two containers for arc
41
42// ---------------------------------------------------------------------------------------------------------------------
43// =====================================================================================================================
44// Constructor, Destructor, Operators
45 public:
46
47// ---------------------------------------------------------------------------------------------------------------------
48
50 ext::map<TNode, std::multimap<TNode, TEdge>> &&getAdjacencyList() &&;
51
52 const ext::map<TNode, std::multimap<TNode, TEdge>> &getSuccessorList() const &;
53 ext::map<TNode, std::multimap<TNode, TEdge>> &&getSuccessorList() &&;
54
55 const ext::map<TNode, std::multimap<TNode, TEdge>> &getPredecessorList() const &;
56 ext::map<TNode, std::multimap<TNode, TEdge>> &&getPredecessorList() &&;
57
58// ---------------------------------------------------------------------------------------------------------------------
59
60// =====================================================================================================================
61// GraphBase interface
62 public:
63 auto operator <=> (const MixedMultiGraph &other) const {
64 return std::tie(m_adjacency_list, m_succ_list, m_pred_list) <=> std::tie(other.getAdjacencyList(), other.getSuccessorList(), other.getPredecessorList());
65 }
66
67 bool operator == (const MixedMultiGraph &other) const {
69 }
70
71 void operator>>(ext::ostream &ostream) const override;
72
73// =====================================================================================================================
74// Graph interface
75
76 public:
77 void addNode(const TNode &n);
78 void addNode(TNode &&n);
79 template<typename ... Params>
80 void addNode(Params &&... params);
81
82// ---------------------------------------------------------------------------------------------------------------------
83
84 bool addEdge(const TEdge &e);
85 bool addEdge(TEdge &&e);
86 template<typename ... Params>
87 bool addEdge(Params &&... params);
88
89 bool addArc(const TEdge &e);
90 bool addArc(TEdge &&e);
91 template<typename ... Params>
92 bool addArc(Params &&... params);
93
94// ---------------------------------------------------------------------------------------------------------------------
95
96// =====================================================================================================================
97// GraphInterface interface
98
99 size_t nodeCount() const override;
100 size_t edgeCount() const override;
101
102// ---------------------------------------------------------------------------------------------------------------------
103
104 ext::set<TNode> getNodes() const override;
105 ext::vector<TEdge> getEdges() const override;
106
107// ---------------------------------------------------------------------------------------------------------------------
108
109 ext::set<TNode> successors(const TNode &n) const override;
110 ext::vector<TEdge> successorEdges(const TNode &n) const override;
111 ext::set<TNode> predecessors(const TNode &n) const override;
112 ext::vector<TEdge> predecessorEdges(const TNode &n) const override;
113
114// ---------------------------------------------------------------------------------------------------------------------
115
116 std::string name() const override;
117
118// ---------------------------------------------------------------------------------------------------------------------
119
120};
121
122// =====================================================================================================================
123
124template<typename TNode, typename TEdge>
126 return m_adjacency_list;
127}
128
129template<typename TNode, typename TEdge>
131 return std::move(m_adjacency_list);
132}
133
134template<typename TNode, typename TEdge>
136 return m_succ_list;
137}
138
139template<typename TNode, typename TEdge>
141 return std::move(m_succ_list);
142}
143
144template<typename TNode, typename TEdge>
146 return m_pred_list;
147}
148
149template<typename TNode, typename TEdge>
151 return std::move(m_pred_list);
152}
153
154// ---------------------------------------------------------------------------------------------------------------------
155
156template<typename TNode, typename TEdge>
158 m_adjacency_list[n];
159 m_succ_list[n];
160 m_pred_list[n];
161}
162
163template<typename TNode, typename TEdge>
165 m_adjacency_list[n];
166 m_succ_list[n];
167 m_pred_list[std::forward<TNode>(n)];
168}
169
170template<typename TNode, typename TEdge>
171template<typename... Params>
172void MixedMultiGraph<TNode, TEdge>::addNode(Params &&... params) {
173 addNode(TNode(std::forward<Params>(params) ...));
174}
175
176// ---------------------------------------------------------------------------------------------------------------------
177
178template<typename TNode, typename TEdge>
180 addNode(e.first); // because of consistency
181 addNode(e.second); // because of consistency
182 m_adjacency_list[e.first].insert(ext::make_pair(e.second, e));
183 m_adjacency_list[e.second].insert(ext::make_pair(e.first, e));
184
185 return true;
186}
187
188template<typename TNode, typename TEdge>
190 addNode(e.first); // because of consistency
191 addNode(e.second); // because of consistency
192 m_adjacency_list[e.first].insert(ext::make_pair(e.second, e));
193 m_adjacency_list[e.second].insert(ext::make_pair(e.first, std::forward<TEdge>(e)));
194
195 return true;
196}
197
198template<typename TNode, typename TEdge>
199template<typename... Params>
200bool MixedMultiGraph<TNode, TEdge>::addEdge(Params &&... params) {
201 return addEdge(TEdge(std::forward<Params>(params) ...));
202}
203
204template<typename TNode, typename TEdge>
206 addNode(e.first); // because of consistency
207 addNode(e.second); // because of consistency
208 m_succ_list[e.first].insert(ext::make_pair(e.second, e));
209 m_pred_list[e.second].insert(ext::make_pair(e.first, e));
210
211 return true;
212}
213
214template<typename TNode, typename TEdge>
216 addNode(e.first); // because of consistency
217 addNode(e.second); // because of consistency
218 m_succ_list[e.first].insert(ext::make_pair(e.second, e));
219 m_pred_list[e.second].insert(ext::make_pair(e.first, std::forward<TEdge>(e)));
220
221 return true;
222}
223
224template<typename TNode, typename TEdge>
225template<typename... Params>
226bool MixedMultiGraph<TNode, TEdge>::addArc(Params &&... params) {
227 return addArc(TEdge(std::forward<Params>(params)...));
228}
229
230// ---------------------------------------------------------------------------------------------------------------------
231
232template<typename TNode, typename TEdge>
234 return m_adjacency_list.size();
235}
236template<typename TNode, typename TEdge>
238 size_t cnt = 0;
239
240 for (const auto &i: m_adjacency_list) {
241 cnt += i.second.size();
242 }
243
244 cnt /= 2;
245
246 for (const auto &i: m_succ_list) {
247 cnt += i.second.size();
248 }
249
250 return cnt;
251}
252
253// ---------------------------------------------------------------------------------------------------------------------
254
255template<typename TNode, typename TEdge>
257 ext::set<TNode> set;
258
259 for (const auto &i: m_adjacency_list) {
260 set.insert(i.first);
261 }
262
263 return set;
264}
265
266template<typename TNode, typename TEdge>
269
270 for (const auto &i: m_adjacency_list) {
271 for (const auto &j : i.second) {
272 vec.push_back(j.second);
273 }
274 }
275
276 for (const auto &i: m_succ_list) {
277 for (const auto &j : i.second) {
278 vec.push_back(j.second);
279 }
280 }
281
282 return vec;
283}
284
285// ---------------------------------------------------------------------------------------------------------------------
286
287template<typename TNode, typename TEdge>
289 ext::set<TNode> set;
290
291 if (m_adjacency_list.count(n) == 0) {
292 return set;
293 }
294
295 for (const auto &i: m_adjacency_list.at(n)) {
296 set.insert(i.first);
297 }
298
299 for (const auto &i: m_succ_list.at(n)) {
300 set.insert(i.first);
301 }
302
303 return set;
304}
305
306template<typename TNode, typename TEdge>
309
310 if (m_succ_list.count(n) == 0) {
311 return vec;
312 }
313
314 for (const auto &i: m_adjacency_list.at(n)) {
315 vec.push_back(i.second);
316 }
317
318 for (const auto &i: m_succ_list.at(n)) {
319 vec.push_back(i.second);
320 }
321
322 return vec;
323}
324
325template<typename TNode, typename TEdge>
327 ext::set<TNode> set;
328
329 if (m_pred_list.count(n) == 0) {
330 return set;
331 }
332
333 for (const auto &i: m_adjacency_list.at(n)) {
334 set.insert(i.first);
335 }
336
337 for (const auto &i: m_pred_list.at(n)) {
338 set.insert(i.first);
339 }
340
341 return set;
342}
343
344template<typename TNode, typename TEdge>
347
348 if (m_pred_list.count(n) == 0) {
349 return vec;
350 }
351
352 for (const auto &i: m_adjacency_list.at(n)) {
353 vec.push_back(i.second);
354 }
355
356 for (const auto &i: m_pred_list.at(n)) {
357 vec.push_back(i.second);
358 }
359
360 return vec;
361}
362
363// ---------------------------------------------------------------------------------------------------------------------
364
365template<typename TNode, typename TEdge>
367 return "MixedMultiGraph";
368}
369
370// ---------------------------------------------------------------------------------------------------------------------
371
372template<typename TNode, typename TEdge>
374 ostream << "(" << name() << " ";
375 for (const auto &i : m_adjacency_list) {
376 ostream << i.first << " <-->" << std::endl;
377
378 for (const auto &j : i.second) {
379 ostream << "\t\t" << j.first << " " << j.second << std::endl;
380 }
381
382 ostream << i.first << " -->" << std::endl;
383 for (const auto &j : m_succ_list.at(i.first)) {
384 ostream << "\t\t" << j.first << " " << j.second << std::endl;
385 }
386 }
387 ostream << ")";
388}
389
390// ---------------------------------------------------------------------------------------------------------------------
391
392} // namespace graph
393
394// =====================================================================================================================
395
396namespace core {
397
404template<typename TNode, typename TEdge>
405struct normalize < graph::MixedMultiGraph < TNode, TEdge > > {
408
409 // Create edges
410 for (auto &&i: ext::make_mover(std::move(value).getAdjacencyList())) {
412 for (auto &&j: i.second) {
415
416 graph.addNode(first);
417 graph.addNode(second);
418 graph.addEdge(edge);
419 }
420 }
421
422 // Create successor
423 for (auto &&i: ext::make_mover(std::move(value).getSuccessorList())) {
425 for (auto &&j: i.second) {
428
429 graph.addNode(first);
430 graph.addNode(second);
431 graph.addEdge(edge);
432 }
433 }
434
435 // Create predecessors
436 for (auto &&i: ext::make_mover(std::move(value).getPredecessorList())) {
438 for (auto &&j: i.second) {
441
442 graph.addNode(first);
443 graph.addNode(second);
444 graph.addEdge(edge);
445 }
446 }
447
448 return graph;
449 }
450};
451
452}
453
454// =====================================================================================================================
Class extending the map class from the standard library. Original reason is to allow printing of the ...
Definition: map.hpp:48
Definition: ostream.h:14
Class extending the pair class from the standard library. Original reason is to allow printing of the...
Definition: pair.hpp:43
Definition: set.hpp:44
Class extending the vector class from the standard library. Original reason is to allow printing of t...
Definition: vector.hpp:45
Definition: GraphInterface.hpp:19
TEdge edge_type
Definition: GraphInterface.hpp:23
TNode node_type
Definition: GraphInterface.hpp:22
static DefaultNodeType normalizeNode(TNode &&node)
Definition: Normalize.hpp:47
static DefaultEdgeType normalizeEdge(TEdge &&edge)
Definition: Normalize.hpp:52
Definition: MixedMultiGraph.hpp:26
ext::map< TNode, std::multimap< TNode, TEdge > > m_succ_list
Definition: MixedMultiGraph.hpp:39
bool operator==(const MixedMultiGraph &other) const
Definition: MixedMultiGraph.hpp:67
size_t nodeCount() const override
Definition: MixedMultiGraph.hpp:233
ext::vector< TEdge > successorEdges(const TNode &n) const override
Definition: MixedMultiGraph.hpp:307
const ext::map< TNode, std::multimap< TNode, TEdge > > & getAdjacencyList() const &
Definition: MixedMultiGraph.hpp:125
bool addEdge(TEdge &&e)
Definition: MixedMultiGraph.hpp:189
bool addArc(Params &&... params)
Definition: MixedMultiGraph.hpp:226
ext::set< TNode > getNodes() const override
Definition: MixedMultiGraph.hpp:256
size_t edgeCount() const override
Definition: MixedMultiGraph.hpp:237
ext::set< TNode > successors(const TNode &n) const override
Definition: MixedMultiGraph.hpp:288
bool addEdge(Params &&... params)
Definition: MixedMultiGraph.hpp:200
void addNode(Params &&... params)
Definition: MixedMultiGraph.hpp:172
ext::set< TNode > predecessors(const TNode &n) const override
Definition: MixedMultiGraph.hpp:326
ext::vector< TEdge > predecessorEdges(const TNode &n) const override
Definition: MixedMultiGraph.hpp:345
std::string name() const override
Definition: MixedMultiGraph.hpp:366
bool addArc(TEdge &&e)
Definition: MixedMultiGraph.hpp:215
const ext::map< TNode, std::multimap< TNode, TEdge > > & getSuccessorList() const &
Definition: MixedMultiGraph.hpp:135
void addNode(TNode &&n)
Definition: MixedMultiGraph.hpp:164
ext::vector< TEdge > getEdges() const override
Definition: MixedMultiGraph.hpp:267
bool addEdge(const TEdge &e)
Definition: MixedMultiGraph.hpp:179
void addNode(const TNode &n)
Definition: MixedMultiGraph.hpp:157
const ext::map< TNode, std::multimap< TNode, TEdge > > & getPredecessorList() const &
Definition: MixedMultiGraph.hpp:145
void operator>>(ext::ostream &ostream) const override
Definition: MixedMultiGraph.hpp:373
ext::map< TNode, std::multimap< TNode, TEdge > > m_adjacency_list
Definition: MixedMultiGraph.hpp:36
bool addArc(const TEdge &e)
Definition: MixedMultiGraph.hpp:205
ext::map< TNode, std::multimap< TNode, TEdge > > m_pred_list
Definition: MixedMultiGraph.hpp:40
Definition: Object.h:16
p second
Definition: ToRegExpAlgebraic.h:126
int i
Definition: AllEpsilonClosure.h:118
Definition: normalize.hpp:10
Definition: CapacityEdge.hpp:18
Definition: sigHandler.cpp:20
constexpr tuple< Elements &... > tie(Elements &... args) noexcept
Helper of extended tuple of references construction. The tuple is constructed to reffer to values in ...
Definition: tuple.hpp:218
reference_mover< T > make_mover(T &param)
Move adaptor construction function specialized to lvalue reference parameter.
Definition: iterator.hpp:468
constexpr auto make_pair(T1 &&x, T2 &&y)
Definition: pair.hpp:79
Definition: ReconstructPath.hpp:14
Definition: FordFulkerson.hpp:16
static graph::MixedMultiGraph eval(graph::MixedMultiGraph< TNode, TEdge > &&value)
Definition: MixedMultiGraph.hpp:406
Definition: normalize.hpp:13