46uvec
sort_rcm(
const std::vector<uvec>&,
const uvec&);
48template<
typename eT> uvec
sort_rcm(
const SpMat<eT>& MEAT) {
49 suanpan_assert([&] {
if(!MEAT.is_square())
throw logic_error(
"can only be applied to square matrix"); });
58 uvec
E(
S, fill::none);
59 suanpan_for(0llu,
S, [&](
const uword I) {
E(I) = MEAT.col(I).n_nonzero; });
61 std::vector<uvec>
A(
S);
65 for(
auto L = MEAT.begin_col(
K); L != MEAT.end_col(
K); ++L) IDX(J++) = L.row();
66 A[
K] = IDX(sort_index(
E(IDX)));
70 uvec
G = sort_index(
E);
73 std::vector<bool>
M(
S,
false);
75 uvec R(
S, fill::zeros);
84 uword IDXA = 0, IDXB =
S - 1, IDXC =
S - 1;
97 while(IDXA <
S &&
M[
G(IDXA)]) ++IDXA;
111 for(
const auto& IDX :
A[R(IDXB--)])
if(!
M[IDX])
M[R(IDXC--) = IDX] =
true;
114 suanpan_debug(
"RCM algorithm takes {:.5E} seconds.\n", TM.toc());
119template<
typename eT> uvec
sort_rcm(
const Mat<eT>& MEAT) {
return sort_rcm(SpMat<eT>(MEAT)); }
126 uvec
E(
S, fill::none);
128 std::vector<uvec>
A(
S);
130 const uvec IDX(csc_mat.
row_mem() + csc_mat.
col(I),
E(I));
131 A[I] = IDX(sort_index(
E(IDX)));
uvec sort_rcm(const std::vector< uvec > &, const uvec &)
Definition: sort_rcm.cpp:20
#define suanpan_debug(...)
Definition: suanPan.h:295
void suanpan_assert(const std::function< void()> &F)
Definition: suanPan.h:284
void suanpan_for(const IT start, const IT end, F &&FN)
Definition: utility.h:27