47uvec
sort_rcm(
const std::vector<uvec>&,
const uvec&);
51template<sp_d eT> uvec
sort_rcm(
const SpMat<eT>& MEAT) {
52 suanpan_assert([&] {
if(!MEAT.is_square())
throw logic_error(
"can only be applied to square matrix"); });
61 uvec
E(
S, fill::none);
64 std::vector<uvec>
A(
S);
68 for(
auto L = MEAT.begin_col(
K); L != MEAT.end_col(
K); ++L) IDX(J++) = L.row();
69 A[
K] = IDX(sort_index(
E(IDX)));
73 uvec G = sort_index(
E);
76 std::vector<bool>
M(
S,
false);
78 uvec R(
S, fill::zeros);
87 uword IDXA = 0, IDXB =
S - 1, IDXC =
S - 1;
100 while(IDXA <
S &&
M[G(IDXA)]) ++IDXA;
114 for(
const auto& IDX :
A[R(IDXB--)])
if(!
M[IDX])
M[R(IDXC--) = IDX] =
true;
117 suanpan_debug(
"RCM algorithm takes {:.5E} seconds.\n", TM.toc());
129 uvec
E(
S, fill::none);
131 std::vector<uvec>
A(
S);
133 const uvec IDX(csc_mat.
row_mem() + csc_mat.
col(I),
E(I));
134 A[I] = IDX(sort_index(
E(IDX)));
uvec sort_rcm(const std::vector< uvec > &, const uvec &)
Definition: sort_rcm.cpp:78
std::vector< T > vector
Definition: container.h:53
std::unordered_set< T > unordered_set
Definition: container.h:55
void for_each(const IT start, const IT end, F &&FN)
Definition: utility.h:28
#define suanpan_debug(...)
Definition: suanPan.h:307
void suanpan_assert(const std::function< void()> &F)
Definition: suanPan.h:296