7#include <kernel/adjacency/cuthill_mckee.hpp>
8#include <kernel/adjacency/graph.hpp>
21 std::vector<Index> layers;
22 return compute(layers, graph, reverse, r_type, s_type);
26 std::vector<Index>& layers,
32 layers.reserve(graph.get_num_nodes_domain() +
Index(1));
35 Index num_nodes = graph.get_num_nodes_domain();
42 std::vector<bool> node_mask(num_nodes,
false);
45 std::vector<Index> node_degree(num_nodes);
46 for(
Index j(0); j < num_nodes; ++j)
48 node_degree[j] = graph.
degree(j);
57 layers.push_back(lvl1);
63 while(lvl2 < num_nodes)
66 Index root = num_nodes + 1;
74 for(
Index j(0); j < num_nodes; ++j)
88 Index min = num_nodes + 1;
89 for(
Index j(0); j < num_nodes; ++j)
91 if((node_degree[j] < min) && !node_mask[j])
104 for(
Index j(0); j < num_nodes; ++j)
106 if((node_degree[j] > max) && !node_mask[j])
109 max = node_degree[j];
117 XABORTM(
"Invalid RootType::type parameter!");
121 XASSERTM(root < num_nodes,
"No root node found!");
129 const Index lvl_root = lvl1;
130 permutation[lvl1 - 1] = root;
134 const Index lay_root_pos =
Index(layers.size());
135 layers.push_back(lvl1);
138 while(lvl2 < num_nodes)
141 for(
Index i(lvl1 - 1); i < lvl2 ; ++i)
144 Index n = permutation[i];
147 for(
Index j(domain_ptr[n]); j < domain_ptr[n+1] ; ++j)
150 Index k = image_idx[j];
156 permutation[lvl3 - 1] = k;
184 for(
Index i(lvl2); i < lvl3; ++i)
186 Index x = node_degree[permutation[i]];
187 Index y = permutation[i];
189 for(; (k > lvl2) && (x > node_degree[permutation[k-1]]); --k)
191 permutation[k] = permutation[k-1];
207 for(
Index i(lvl2); i < lvl3; ++i)
209 Index x = node_degree[permutation[i]];
210 Index y = permutation[i];
212 for(; (k > lvl2) && (x < node_degree[permutation[k-1]]); --k)
214 permutation[k] = permutation[k-1];
222 XABORTM(
"Invalid run_type parameter!");
226 layers.push_back(lvl3);
237 for(
Index ind(lvl_root - 1), jnd(lvl2 - 1); ind < jnd; ++ind, --jnd)
239 std::swap(permutation[ind], permutation[jnd]);
243 const Index lay_back =
Index(layers.size()) - 1u;
244 for(
Index k(lay_back); k >= lay_root_pos; --k)
247 layers.at(k) -= layers.at(k-1u);
249 for(
Index k(lay_root_pos), l(lay_back); k < l; ++k, --l)
252 std::swap(layers.at(k), layers.at(l));
254 for(
Index k(lay_root_pos); k <= lay_back; ++k)
257 layers.at(k) += layers.at(k-1u);
264 layers.push_back(num_nodes);
#define XABORTM(msg)
Abortion macro definition with custom message.
#define XASSERTM(expr, msg)
Assertion macro definition with custom message.
RootType
Root type enumeration.
@ minimum_degree
Minimum-degree root.
@ maximum_degree
Maximum-degree root.
static Permutation compute(std::vector< Index > &layers, const Graph &graph, bool reverse=false, CuthillMcKee::RootType r_type=RootType::standard, CuthillMcKee::SortType t_type=SortType::standard)
Cuthill-McKee permutation computation function.
SortType
Sort type enumeration.
@ standard
Default sorting type.
Adjacency Graph implementation.
Index * get_domain_ptr()
Returns the domain pointer array.
Index * get_image_idx()
Returns the image node index array.
Index degree(Index domain_node) const
Returns the degree of a domain node.
Index * get_perm_pos()
returns the permute-position array
void calc_swap_from_perm()
Computes the swap-position vector from the permutation-position vector.
std::uint64_t Index
Index data type.