52#include <lal/graphs/directed_graph.hpp>
53#include <lal/graphs/undirected_graph.hpp>
91 bool is_directed = std::is_base_of_v<graphs::directed_graph, GRAPH>,
93 std::is_base_of_v<graphs::directed_graph, GRAPH> ||
94 std::is_base_of_v<graphs::undirected_graph, GRAPH>
136 auto [found, new_cur1, new_cur2] =
153 typedef std::pair<node,std::size_t> E_pointer;
176 if (
m_G.get_num_edges() <= 1) {
183 m_cur2 = E_pointer(1,
static_cast<size_t>(-1));
185 const auto [found, new_cur1, new_cur2] =
208 const auto [f2, _, __] =
232 if constexpr (is_directed) {
234 t =
m_G.get_out_neighbours(s)[
m_cur1.second];
236 v =
m_G.get_out_neighbours(u)[
m_cur2.second];
240 t =
m_G.get_neighbours(s)[
m_cur1.second];
242 v =
m_G.get_neighbours(u)[
m_cur2.second];
249 const auto [s,t] = st_uv.first;
250 const auto [u,v] = st_uv.second;
251 return s == u or s == v or t == u or t == v;
260 if constexpr (is_directed) {
262 t =
m_G.get_out_neighbours(s)[p1.second];
264 v =
m_G.get_out_neighbours(u)[p2.second];
268 t =
m_G.get_neighbours(s)[p1.second];
270 v =
m_G.get_neighbours(u)[p2.second];
276 template<
bool isdir = is_directed, std::enable_if_t<isdir,
bool> = true>
277 inline std::tuple<bool, E_pointer, E_pointer>
281 const uint32_t n =
m_G.get_num_nodes();
285 return make_tuple(
false, E_pointer(s,pt), E_pointer(u,pv));
288 if (pt >=
m_G.get_out_degree(s)) {
297 if (pv >=
m_G.get_out_degree(u)) {
302 if (
share_nodes(E_pointer(s,pt), E_pointer(u,pv))) {
306 return make_tuple(
true, E_pointer(s,pt), E_pointer(u,pv));
310 template<
bool isdir = is_directed, std::enable_if_t<not isdir,
bool> = true>
311 inline std::tuple<bool, E_pointer, E_pointer>
316 const uint32_t n =
m_G.get_num_nodes();
320 return std::make_tuple(
false, E_pointer(s,pt), E_pointer(u,pv));
323 if (pt >=
m_G.get_degree(s)) {
332 if (pv >=
m_G.get_degree(u)) {
337 auto Ns =
m_G.get_neighbours(s);
342 auto Nu =
m_G.get_neighbours(u);
343 if (u > Nu[pv] or
share_nodes(E_pointer(s,pt), E_pointer(u,pv))) {
347 return make_tuple(
true, E_pointer(s,pt), E_pointer(u,pv));
Iterator over the set of pairs of independent edges of a graph.
Definition Q_iterator.hpp:98
E_pointer m_cur2
Current pointers to the second edge.
Definition Q_iterator.hpp:163
bool end() const noexcept
Returns true if the end of the iteration was reached.
Definition Q_iterator.hpp:116
void __reset() noexcept
Sets the iterator at the beginning of the set of edges.
Definition Q_iterator.hpp:174
void next() noexcept
Moves the iterator to the next pair, if there is any.
Definition Q_iterator.hpp:124
E_pointer m_cur1
Current pointers to the first edge.
Definition Q_iterator.hpp:161
~Q_iterator()=default
Default destructor.
std::tuple< bool, E_pointer, E_pointer > find_next_pair(node s, std::size_t pt, node u, std::size_t pv) noexcept
Find the next pair in a directed graph.
Definition Q_iterator.hpp:278
edge_pair get_edge_pair() const noexcept
Returns the current edge pair.
Definition Q_iterator.hpp:119
const GRAPH & m_G
Graph we are iterating on.
Definition Q_iterator.hpp:158
bool m_reached_end
Has the end of the iteration been reached?
Definition Q_iterator.hpp:168
static bool share_nodes(const edge_pair &st_uv) noexcept
Returns whether the edges share vertices or not.
Definition Q_iterator.hpp:248
bool m_exists_next
Is there a next pair of independent edges?
Definition Q_iterator.hpp:166
Q_iterator(const GRAPH &g) noexcept
Constructor.
Definition Q_iterator.hpp:106
bool share_nodes(const E_pointer &p1, const E_pointer &p2) const noexcept
Returns whether the edges share vertices or not.
Definition Q_iterator.hpp:256
edge_pair m_cur_pair
Current pair of independent edges.
Definition Q_iterator.hpp:170
edge_pair make_current_pair() const noexcept
Returns the current pair of independent edges.
Definition Q_iterator.hpp:230
void reset() noexcept
Sets the iterator at the beginning of the set of edges.
Definition Q_iterator.hpp:147
Main namespace of the library.
Definition definitions.hpp:48
std::pair< edge, edge > edge_pair
Edge pair type.
Definition definitions.hpp:77
std::pair< node, node > edge
Edge type.
Definition definitions.hpp:75
uint32_t node
Node type.
Definition definitions.hpp:51