50#include <lal/iterators/E_iterator.hpp>
51#include <lal/linear_arrangement.hpp>
52#include <lal/properties/branchless_path.hpp>
89template <level_signature_type t>
111 void init(
const std::size_t n)
noexcept {
116 template <
typename T>
117 [[nodiscard]] int64_t
operator[] (
const T i)
const noexcept {
119 static_assert(std::is_same_v<T, position_t>);
122 static_assert(std::is_same_v<T, node_t>);
127 template <
typename T>
130 static_assert(std::is_same_v<T, position_t>);
133 static_assert(std::is_same_v<T, node_t>);
148 template <level_signature_type st = t>
150 static_assert(st == t);
151 for (std::size_t i = 0; i <
m_data.
size(); ++i) {
167 std::enable_if_t<st == level_signature_type::per_vertex, bool> =
true
182 std::enable_if_t<st == level_signature_type::per_vertex, bool> =
true
198 std::enable_if_t<st == level_signature_type::per_position, bool> =
true
213 std::enable_if_t<st == level_signature_type::per_position, bool> =
true
228 for (
position p = 0ull; p < n/2; ++p) {
277template <level_signature_type t,
class graph_t>
292 l = (arr.size() == 0 ? levels[position_t{*u}] : levels[position_t{arr[u]}]);
294 return static_cast<uint64_t
>( std::abs(l) ) != g.get_degree(*u);
306template <level_signature_type t,
class graph_t>
316 while (not it.
end()) {
318 const position_t pu = (arr.size() == 0 ? *u : arr[u]);
319 const position_t pv = (arr.size() == 0 ? *v : arr[v]);
351template <level_signature_type t,
class graph_t>
356 const auto n = g.get_num_nodes();
359 for (
node_t u = 0ull; u < n; ++u) { L[u] = 0; }
362 for (
position_t p = 0ull; p < n; ++p) { L[p] = 0; }
375template <
class level_signature_t>
379 level_signature_t L2 = L;
A class that implements level signatures of an array.
Definition level_signature.hpp:90
void set_position_level(const position p, const int64_t l) noexcept
Sets the level value of a position.
Definition level_signature.hpp:215
array< int64_t > m_data
The signature of level values.
Definition level_signature.hpp:246
int64_t get_position_level(const position p) const noexcept
Gets the level value of a position.
Definition level_signature.hpp:200
void init(const std::size_t n) noexcept
Initializes this level signature.
Definition level_signature.hpp:111
int64_t get_vertex_level(const node u) const noexcept
Gets the level value of a vertex.
Definition level_signature.hpp:169
int64_t operator[](const T i) const noexcept
Access position 'i'.
Definition level_signature.hpp:117
void mirror() noexcept
Mirrors this level signature.
Definition level_signature.hpp:225
bool operator==(const level_signature< st > &L) const noexcept
Equality test.
Definition level_signature.hpp:149
void set_vertex_level(const node u, const int64_t l) noexcept
Sets the level value of a vertex.
Definition level_signature.hpp:184
level_signature() noexcept=default
Default constructor.
Iterator over the set of edges of a graph.
Definition E_iterator.hpp:97
edge_t yield_edge_t() noexcept
Returns the current edge and advances the iterator.
Definition E_iterator.hpp:133
bool end() const noexcept
Returns true if the end of the iteration was reached.
Definition E_iterator.hpp:117
Linear arrangement of vertices.
Definition linear_arrangement.hpp:103
level_signature< level_signature_type::per_position > level_signature_per_position
A useful typedef for level signatures per position.
Definition level_signature.hpp:265
constexpr bool is_per_position(const level_signature_type &t) noexcept
Returns true if the template parameter is lal::detail::level_signature_type::per_position.
Definition level_signature.hpp:256
bool is_thistle_vertex(const graph_t &g, const level_signature< t > &levels, const node_t u, const linear_arrangement &arr={}) noexcept
Returns whether or not the input vertex is a thistle vertex.
Definition level_signature.hpp:279
level_signature_type
Types of level signature.
Definition level_signature.hpp:58
@ per_vertex
Given per vertex.
@ per_position
Given per position.
constexpr bool is_per_vertex(const level_signature_type &t) noexcept
Returns true if the template parameter is lal::detail::level_signature_type::per_vertex.
Definition level_signature.hpp:250
void calculate_level_signature(const graph_t &g, const linear_arrangement &arr, level_signature< t > &L) noexcept
Calculates the level signature of an arrangement of a graph.
Definition level_signature.hpp:308
level_signature_t mirror_level_signature(const level_signature_t &L) noexcept
Mirrors a level signature.
Definition level_signature.hpp:376
level_signature< level_signature_type::per_vertex > level_signature_per_vertex
A useful typedef for level signatures per vertex.
Definition level_signature.hpp:263
Main namespace of the library.
Definition basic_types.hpp:48
uint64_t position
Node's position type.
Definition basic_types.hpp:53
uint64_t node
Node type. See Node / Vertex page for further details.
Definition basic_types.hpp:51
Wrapper of a C array for automatic deallocation of memory.
Definition array.hpp:59
std::size_t size() const noexcept
Size of the array.
Definition array.hpp:215
void resize(const std::size_t new_size) noexcept
Resize the array.
Definition array.hpp:187
T * m_data
Pointer to the memory allocated by this array.
Definition array.hpp:318
Typesafe node type.
Definition basic_types.hpp:70
Typesafe position type.
Definition basic_types.hpp:244