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.