Uniformly random generation of unlabelled free trees.
More...
#include <rand_ulab_free_trees.hpp>
|
void | init (uint32_t seed=0) noexcept |
| Sets the size of the unlabelled trees to generate.
|
|
void | clear () noexcept |
| Clears the memory occupied.
|
|
std::pair< uint32_t, uint32_t > | ranrut (uint32_t n, uint32_t lr, uint32_t nt) noexcept |
| Generates uniformly at random a rooted unlabelled tree of n nodes.
|
|
void | init_rn () noexcept |
| Initialiases m_rn with 31 values from the OEIS (see [33]).
|
|
const numeric::integer & | get_rn (uint32_t n) noexcept |
| Computes all the values \(t_i\) for \(i \in [1,n]\).
|
|
std::pair< uint32_t, uint32_t > | choose_jd_from_T (uint32_t n) noexcept |
| Chooses uniformly at random a pair \((j,d)\), according to some probability.
|
|
|
const uint32_t | m_n |
| Number of nodes of the tree.
|
|
std::mt19937 | m_gen |
| Random number generator.
|
|
std::uniform_real_distribution< double > | m_unif |
| Distribution of the numbers.
|
|
std::vector< numeric::integer > | m_rn |
| The number of unlabelled rooted trees.
|
|
internal::data_array< uint32_t > | m_head_vector |
| The head vector of the tree under construction.
|
|
|
uint32_t | forest (uint32_t m, uint32_t q, uint32_t nt) noexcept |
| Generates uniformly at random a forest of m nodes.
|
|
void | bicenter (uint32_t n) noexcept |
| Generates a tree of n nodes with two centroids.
|
|
const numeric::integer & | get_alpha_mq (const uint32_t m, const uint32_t q) noexcept |
| Computes and return the value \(\alpha(m,q)\).
|
|
void | init_fn () noexcept |
| Initialiases m_fn with 31 values from the OEIS (see [32]).
|
|
const numeric::integer & | get_fn (const uint32_t n) noexcept |
| Computes and returns the value \(f_n\).
|
|
std::pair< uint32_t, uint32_t > | choose_jd_from_alpha (const uint32_t m, const uint32_t q) noexcept |
| Chooses uniformly at random a pair \((j,d)\), according to some probability.
|
|
Uniformly random generation of unlabelled free trees.
Users should refrain from using this class. The generation of random labelled trees should be done using the wrapper class rand_ulab_free_trees. This class, however, contains the actual code to generate labelled rooted trees uniformly at random.
Every call to get_tree generates uniformly at random an unlabelled free tree using the algorithm described in [34]. This algorithm relies on the ranrut procedure (see [27], chapter 29) and runs in about the same time. The implementation of Wilf's paper (see [34]) in functions get_tree, forest, and bicenter includes the correction pointed out in [26] (page 38).
◆ _rand_ulab_free_trees() [1/3]
lal::generate::_rand_ulab_free_trees::_rand_ulab_free_trees |
( |
uint32_t | n, |
|
|
uint32_t | seed = 0 ) |
|
noexcept |
Constructor with size of tree and seed for the random number generator.
In case the seed given is '0', a random seed will be generated.
- Parameters
-
n | Number of nodes. |
seed | The seed used for the random generator. |
◆ _rand_ulab_free_trees() [2/3]
Copy constructor.
- Parameters
-
Gen | Random unlabelled free tree generator. |
◆ _rand_ulab_free_trees() [3/3]
Move constructor.
- Parameters
-
Gen | Random unlabelled free tree generator. |
◆ choose_jd_from_alpha()
std::pair< uint32_t, uint32_t > lal::generate::_rand_ulab_free_trees::choose_jd_from_alpha |
( |
const uint32_t | m, |
|
|
const uint32_t | q ) |
|
privatenoexcept |
Chooses uniformly at random a pair \((j,d)\), according to some probability.
Probability of choosing \((j,d)\) is: \(\frac{d \cdot \alpha_{m - jd, q} \cdot t_d}{m\alpha_{m, q}}\). Here, q is fixed to \((n - 1)/2\) where n is m_n.
- Parameters
-
m | Amount of nodes. |
q | Maximum amount of nodes per connected component. |
- Returns
- A pair of integers \((j,d)\) such that \(j \ge 1\), \(jd \le n\) and \(j \ge 1\), \(jd \le n\).
◆ choose_jd_from_T()
std::pair< uint32_t, uint32_t > lal::generate::_rand_ulab_rooted_trees::choose_jd_from_T |
( |
uint32_t | n | ) |
|
|
protectednoexceptinherited |
Chooses uniformly at random a pair \((j,d)\), according to some probability.
Probability of choosing \((j,d)\) is: \(\frac{d \cdot t_{k - jd} \cdot t_d}{(k - 1)t_k}\).
- Parameters
-
- Returns
- A pair of integers \((j,d)\) such that \(j \ge 1\), \(jd \le n\) and \(j \ge 1\), \(jd \le n\).
◆ clear()
void lal::generate::_rand_ulab_free_trees::clear |
( |
| ) |
|
|
protectednoexcept |
Clears the memory occupied.
In order to save computation time, this class has been designed to reuse memory when generating trees. For example, since it needs the values of well-known integer sequences (see attributes m_rn and m_alpha) that are costly to compute every time they are needed, they are stored in memory and reused over time.
So, if the user wants to generate trees of 1000 nodes there will be too much memory occupied (and unused) if then this class is used to generate trees of 10 nodes. In cases like this it is recommended to clear the memory occupied.
- Postcondition
- After calling this method, the contents of the attributes m_rn, m_fn and m_alpha are cleared. Attributes m_rn and m_fn are then assigned the same 31 values that they are assigned when creating an object of this class.
◆ forest()
uint32_t lal::generate::_rand_ulab_free_trees::forest |
( |
uint32_t | m, |
|
|
uint32_t | q, |
|
|
uint32_t | nt ) |
|
privatenoexcept |
Generates uniformly at random a forest of m nodes.
Makes a random forest of m nodes and stores it in m_head_vector. Each tree in the forest has at most q nodes.
- Parameters
-
m | Integer \(m \ge 0\). |
q | Integer \(0 \le q \le m\). |
nt | Index to m_head_vector indicating where to store the next tree. |
- Returns
- The position where to store the following trees/forests in m_head_vector.
◆ get_alpha_mq()
const numeric::integer & lal::generate::_rand_ulab_free_trees::get_alpha_mq |
( |
const uint32_t | m, |
|
|
const uint32_t | q ) |
|
privatenoexcept |
Computes and return the value \(\alpha(m,q)\).
Stores the calculated value in m_alpha. In case the value has already been calculated, this method does nothing. See [34] for details on \(\alpha(m,q)\).
- Parameters
-
m | Number of nodes of the forest. |
q | Maximum number of nodes of each connected component of the forest. |
- Returns
- \(\alpha(m,q)\)
◆ get_fn()
const numeric::integer & lal::generate::_rand_ulab_free_trees::get_fn |
( |
const uint32_t | n | ) |
|
|
privatenoexcept |
Computes and returns the value \(f_n\).
The value \(f_n\) is the number of unlabelled free trees on \(n\) nodes. The method implements Otter's formula (see [28]).
- Parameters
-
n | Number of nodes of the tree. |
- Returns
- \(f_n\).
◆ get_rn()
const numeric::integer & lal::generate::_rand_ulab_rooted_trees::get_rn |
( |
uint32_t | n | ) |
|
|
protectednoexceptinherited |
Computes all the values \(t_i\) for \(i \in [1,n]\).
Here \(n\) is m_n. In case these values have already been calculated, this method does nothing.
◆ get_tree()
Generates uniformly at random a free unlabelled tree.
Includes the correction in Wilf's paper (see [34]), as pointed out in [26].
- Returns
- An unlabelled free tree.
◆ init()
void lal::generate::_rand_ulab_free_trees::init |
( |
uint32_t | seed = 0 | ) |
|
|
protectedvirtualnoexcept |
Sets the size of the unlabelled trees to generate.
Initialises m_rn with 31 values extracted from [33]. It also initialises m_fn with 31 values extracted from [32].
Initialises the random number generator with seed. When seed is 0, a random seed is used.
- Parameters
-
seed | Integer value used to seed the random number generator. |
Reimplemented from lal::generate::_rand_ulab_rooted_trees.
◆ ranrut()
std::pair< uint32_t, uint32_t > lal::generate::_rand_ulab_rooted_trees::ranrut |
( |
uint32_t | n, |
|
|
uint32_t | lr, |
|
|
uint32_t | nt ) |
|
protectednoexceptinherited |
Generates uniformly at random a rooted unlabelled tree of n nodes.
The first call to this method should have lr = m_n + 1.
- Parameters
-
n | Number of nodes of the rooted tree to generate. |
lr | Pointer to the root of the last tree added. m_head_vector[lr] is the node that the root points to. |
nt | Index to m_head_vector where we have to place the new tree. |
- Returns
- Two indices: the index of the root of the last tree generated and where to store the next tree in m_head_vector.
◆ m_alpha
std::map<std::pair<uint32_t, uint32_t>, numeric::integer> lal::generate::_rand_ulab_free_trees::m_alpha |
|
private |
Values \(\alpha_{m,q}\).
\(\alpha_{m,q}\) is he number of rooted forests of \(m\) nodes whose trees have at most \(q\) nodes each. See [34].
Since \(m\) and \(q\) are usually calculated as \(m=n-1\) and \(q=(n - 1)/2\) there is only one value of \(q\) for each \(n\), so we do not need a matrix.
◆ m_fn
The number of free unlabelled trees.
Contains \(f_n\) for \(n\ge 0\).
◆ m_head_vector
internal::data_array<uint32_t> lal::generate::_rand_ulab_rooted_trees::m_head_vector |
|
protectedinherited |
The head vector of the tree under construction.
This list has n values for m_n nodes. The first position contains the root vertex.
Do not use its actual type (lal::head_vector) in an attempt to make memory usage a bit more efficient.
◆ m_rn
The number of unlabelled rooted trees.
Contains \(r_n\) for \(n\ge 0\).
The documentation for this class was generated from the following file: