From e21e38de64b238a645cd23f2d29ceeb41d15f57e Mon Sep 17 00:00:00 2001 From: conrad Date: Tue, 31 May 2022 14:42:41 +1000 Subject: [PATCH] refactor to reuse code --- include/armadillo_bits/fn_norm.hpp | 25 +++------------------- include/armadillo_bits/spop_norm_bones.hpp | 2 ++ include/armadillo_bits/spop_norm_meat.hpp | 22 +++++++++++++++++++ 3 files changed, 27 insertions(+), 22 deletions(-) diff --git a/include/armadillo_bits/fn_norm.hpp b/include/armadillo_bits/fn_norm.hpp index 5bbfac96..3dbcdb0f 100644 --- a/include/armadillo_bits/fn_norm.hpp +++ b/include/armadillo_bits/fn_norm.hpp @@ -193,18 +193,9 @@ norm { const SpMat& m = sv.m; const uword col = sv.aux_col1; + const eT* mem = &(m.values[ m.col_ptrs[col] ]); - // create a fake dense vector to allow reuse of code for dense vectors - Col fake_vector( access::rwp(&(m.values[ m.col_ptrs[col] ])), sv.n_nonzero, false ); - - const Proxy< Col > P_fake_vector(fake_vector); - - if(k == uword(1)) { return op_norm::vec_norm_1(P_fake_vector); } - if(k == uword(2)) { return op_norm::vec_norm_2(P_fake_vector); } - - arma_debug_check( (k == 0), "norm(): k must be greater than zero" ); - - return op_norm::vec_norm_k(P_fake_vector, int(k)); + return spop_norm::vec_norm_k(mem, sv.n_nonzero, k); } } @@ -217,17 +208,7 @@ norm if(is_vec) { - // create a fake dense vector to allow reuse of code for dense vectors - Col fake_vector( access::rwp(X.values), X.n_nonzero, false ); - - const Proxy< Col > P_fake_vector(fake_vector); - - if(k == uword(1)) { return op_norm::vec_norm_1(P_fake_vector); } - if(k == uword(2)) { return op_norm::vec_norm_2(P_fake_vector); } - - arma_debug_check( (k == 0), "norm(): k must be greater than zero" ); - - return op_norm::vec_norm_k(P_fake_vector, int(k)); + return spop_norm::vec_norm_k(X.values, X.n_nonzero, k); } else { diff --git a/include/armadillo_bits/spop_norm_bones.hpp b/include/armadillo_bits/spop_norm_bones.hpp index d9464e04..1d944518 100644 --- a/include/armadillo_bits/spop_norm_bones.hpp +++ b/include/armadillo_bits/spop_norm_bones.hpp @@ -31,6 +31,8 @@ class spop_norm template inline static typename get_pod_type::result mat_norm_2(const SpMat& X, const typename arma_cx_only::result* junk = nullptr); template inline static typename get_pod_type::result mat_norm_inf(const SpMat& X); + + template inline static typename get_pod_type::result vec_norm_k(const eT* mem, const uword N, const uword k); }; diff --git a/include/armadillo_bits/spop_norm_meat.hpp b/include/armadillo_bits/spop_norm_meat.hpp index f4b93942..6746319f 100644 --- a/include/armadillo_bits/spop_norm_meat.hpp +++ b/include/armadillo_bits/spop_norm_meat.hpp @@ -104,4 +104,26 @@ spop_norm::mat_norm_inf(const SpMat& X) +template +inline +typename get_pod_type::result +spop_norm::vec_norm_k(const eT* mem, const uword N, const uword k) + { + arma_extra_debug_sigprint(); + + arma_debug_check( (k == 0), "norm(): k must be greater than zero" ); + + // create a fake dense vector to allow reuse of code for dense vectors + Col fake_vector( access::rwp(mem), N, false ); + + const Proxy< Col > P_fake_vector(fake_vector); + + if(k == uword(1)) { return op_norm::vec_norm_1(P_fake_vector); } + if(k == uword(2)) { return op_norm::vec_norm_2(P_fake_vector); } + + return op_norm::vec_norm_k(P_fake_vector, int(k)); + } + + + //! @}