71(
const tree_t& t, std::array<bool, graphs::__tree_type_size>& tree_types)
82 const auto unset_type =
84 tree_types[
static_cast<std::size_t
>(tt)] =
false;
88 tree_types[
static_cast<std::size_t
>(tt)] =
true;
93 const auto get_only_neighbour =
95 if constexpr (std::is_base_of_v<graphs::free_tree, tree_t>) {
96 return t.get_neighbors(u)[0];
99 return (t.get_out_degree(u) == 0 ?
100 t.get_in_neighbors(u)[0] :
101 t.get_out_neighbors(u)[0]
109 const uint64_t n = t.get_num_nodes();
141 uint64_t n_deg_eq_1 = 0;
142 uint64_t n_deg_eq_2 = 0;
143 uint64_t n_deg_ge_2 = 0;
144 uint64_t n_deg_ge_3 = 0;
150 for (
node u = 0; u < n; ++u) {
152 const int64_t du =
static_cast<int64_t
>(t.get_degree(u));
153 deg_internal[u] += (du > 1)*du;
155 n_deg_eq_1 += du == 1;
156 n_deg_eq_2 += du == 2;
157 n_deg_ge_2 += du > 1;
158 n_deg_ge_3 += du > 2;
162 deg_internal[ get_only_neighbour(u) ] -= (du == 1);
165 bool is_linear =
false;
166 bool is_star =
false;
167 bool is_quasistar =
false;
168 bool is_bistar =
false;
169 bool is_caterpillar =
false;
170 bool is_spider =
false;
171 bool is_two_linear =
false;
174 if (n_deg_eq_1 == 2) {
178 assert(n_deg_ge_2 == n - 2);
181 is_caterpillar =
true;
185 if (n_deg_ge_2 == 2 and n - n_deg_ge_2 == n_deg_eq_1) {
187 is_caterpillar =
true;
188 is_two_linear =
true;
192 if (n - n_deg_ge_2 == n_deg_eq_1 and
194 (n_deg_eq_2 == 2 and n_deg_ge_3 == 0) or
195 (n_deg_ge_3 == 1 and n_deg_eq_2 == 1)
201 is_caterpillar =
true;
203 is_two_linear =
false;
207 if (n_deg_ge_2 == 1 and n_deg_eq_1 == n - 1) {
211 is_caterpillar =
true;
216 if (n_deg_ge_3 == 1 and n_deg_eq_1 + n_deg_eq_2 == n - 1) {
221 if (n_deg_ge_3 == 2 and n_deg_eq_1 + n_deg_eq_2 == n - 2) {
222 is_two_linear =
true;
225 if (not is_caterpillar) {
233 for (
node u = 0; u < n and n1 <= 2; ++u) {
234 n1 += deg_internal[u] == 1;
236 is_caterpillar = n1 == 2 or n1 == 0;
void classify_tree(const tree_t &t, std::array< bool, graphs::__tree_type_size > &tree_types) noexcept
Classify a tree into one of the types graphs::tree_type.
Definition tree_classification.hpp:71