LAL: Linear Arrangement Library 24.10.00
A library focused on algorithms on linear arrangements of graphs.
|
Exhaustive enumeration of unlabelled free trees. More...
#include <all_ulab_free_trees.hpp>
Public Member Functions | |
all_ulab_free_trees () noexcept | |
Empty constructor. | |
all_ulab_free_trees (const uint64_t n) noexcept | |
Constructor with number of nodes. | |
all_ulab_free_trees (const all_ulab_free_trees &Gen) noexcept=default | |
Copy constructor. | |
all_ulab_free_trees (all_ulab_free_trees &&Gen) noexcept=default | |
Move constructor. | |
~all_ulab_free_trees () noexcept=default | |
Default destructor. | |
all_ulab_free_trees & | operator= (const all_ulab_free_trees &g) noexcept=default |
Copy assignment operator. | |
all_ulab_free_trees & | operator= (all_ulab_free_trees &&g) noexcept=default |
Move assignment operator. | |
void | init (const uint64_t n) noexcept |
Initializes the generator with a given number of vertices. | |
void | clear () noexcept |
Clears the memory used. | |
bool | end () const noexcept |
Returns true if the end of the iteration was reached. | |
void | next () noexcept |
Generates next tree. | |
void | reset () noexcept |
Sets the generator to its initial state. | |
graphs::free_tree | yield_tree () noexcept |
Yields a tree, advancing the generator if necessary. | |
graphs::free_tree | get_tree () noexcept |
Retrieve the generated tree. | |
void | activate_all_postprocessing_actions () noexcept |
Activates all postprocessing actions. | |
void | deactivate_all_postprocessing_actions () noexcept |
Deactivates all postprocessing actions. | |
void | set_normalize_tree (const bool v) noexcept |
Should trees be normalized? | |
void | set_calculate_size_subtrees (const bool v) noexcept |
Should the size of the subtrees be calculated? | |
void | set_calculate_tree_type (const bool v) noexcept |
Should the tree be classified into types? | |
Protected Member Functions | |
graphs::free_tree | __get_tree () noexcept |
Constructs the current tree. | |
void | __reset () noexcept |
Sets the generator to its initial state. | |
Private Attributes | |
detail::array< uint64_t > | m_L |
Canonical level sequence of the tree. | |
detail::array< uint64_t > | m_W |
\(W_i\) is the subscript of the level number in \(L\) corresponding to the parent of the node corresponding to \(l_i\). | |
uint64_t | m_p |
Largest integer such that \(l_p \neq 2\). | |
uint64_t | m_q |
Largest integer such that \(q < p, \; l_q = l_p - 1\). | |
uint64_t | m_h1 |
Maximum level number in the first principal subsequence. | |
uint64_t | m_h2 |
Maximum level number in the second principal subsequence. | |
uint64_t | m_c |
An index to the first element of \(L_2\). | |
uint64_t | m_r |
Exactly \(m - 1\). | |
bool | m_is_last = false |
Was the last tree generated? | |
bool | m_first_it = true |
First time calling next(). | |
bool | m_reached_end = false |
Has the end of the generation been reached? | |
Static Private Attributes | |
static constexpr bool | is_free |
Helpful Boolean value to compact 'if constexpr' expressions. | |
Exhaustive enumeration of unlabelled free trees.
Generates all the unlabelled free trees of a given number of nodes. The algorithm implemented can be found in [49]. The definition of the public and private members of this class follow the notation in this work.
In order to use this class, users must provide the size \(n\) of the tree (number of nodes) in the constructor. Trees are generated internally, i.e., trees are encoded in the internal state of the generator. Said state is updated using method next(), which updates it to encode the next tree in the generation. In order to retrieve the tree, use method get_tree(). Upon initialisation, the generator encodes the first tree, which has to be retrieved using method get_tree().
All the unlabelled free trees will have been generated when method end() returns true. At this point, method get_tree() will always construct the last tree in the enumeration, whichever tree it is. In order to restart the generation of these trees, call method reset(). It is allowed to call this method at any time.
A possible usage of this class is the following:
Alternatively, this class can be used in a for loop:
Equivalently,
|
inlinenoexcept |
Constructor with number of nodes.
n | Number of nodes. |
|
defaultnoexcept |
Copy constructor.
Gen | Exhaustive unlabelled free tree generator. |
|
defaultnoexcept |
Move constructor.
Gen | Exhaustive unlabelled free tree generator. |
|
nodiscardprotectedvirtualnoexcept |
Constructs the current tree.
Implements lal::generate::_tree_generator< graphs::free_tree >.
|
inlinenoexceptinherited |
Activates all postprocessing actions.
The full list of postprocessing actions can be found in the documentation of this class.
|
inlinenoexcept |
|
inlinenoexceptinherited |
Deactivates all postprocessing actions.
The full list of postprocessing actions can be found in the documentation of this class.
|
inlinenodiscardnoexceptinherited |
Retrieve the generated tree.
This function first calls __get_tree and then modifies the generated tree according to the values:
|
inlinenoexcept |
Initializes the generator with a given number of vertices.
n | Number of vertices. |
|
noexcept |
Generates next tree.
Modifies the internal state so that the next tree can be retrieved using method get_tree.
|
inlinenoexceptinherited |
Should the size of the subtrees be calculated?
v | Boolean value. |
|
inlinenoexceptinherited |
Should the tree be classified into types?
See lal::graphs::tree_type for details on the classification.
v | Boolean value. |
|
inlinenoexceptinherited |
Should trees be normalized?
v | Boolean value. |
|
inlinenodiscardvirtualnoexcept |
Yields a tree, advancing the generator if necessary.
In case the class that inherits from this one is exhaustive then this function also moves the generator forward with its appropriate method. If the class is random, then it just calls get_tree().
Implements lal::generate::_tree_generator< graphs::free_tree >.
|
private |
An index to the first element of \(L_2\).
\(L_2\) is the second principal subsequence of \(L\).
|
private |
Exactly \(m - 1\).
Read the paper: page 542, first paragraph.