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());
124template<sp_d dt> uvec
sort_rcm(
const csc_form<dt, uword>& csc_mat) {
126 const auto S = csc_mat.n_cols;
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)));
140template<sp_d dt, sp_i it> uvec
sort_rcm(triplet_form<dt, it>& triplet_mat) {
return sort_rcm(csc_form<dt, uword>(triplet_mat)); }
uvec sort_rcm(const std::vector< uvec > &, const uvec &)
Definition sort_rcm.cpp:78
std::vector< T > vector
Definition container.h:53
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