rework sparse vecnorm() to use mtSpToDOp

This commit is contained in:
conrad
2024-06-07 23:02:38 +10:00
parent aa28f54c0b
commit 7c8c10ea20
4 changed files with 24 additions and 32 deletions
+2 -2
View File
@@ -323,6 +323,7 @@ namespace arma
#include "armadillo_bits/op_sp_mean_bones.hpp"
#include "armadillo_bits/op_sp_var_bones.hpp"
#include "armadillo_bits/op_sp_stddev_bones.hpp"
#include "armadillo_bits/op_sp_vecnorm_bones.hpp"
#include "armadillo_bits/op_powmat_bones.hpp"
#include "armadillo_bits/op_rank_bones.hpp"
#include "armadillo_bits/op_row_as_mat_bones.hpp"
@@ -370,7 +371,6 @@ namespace arma
#include "armadillo_bits/spop_repmat_bones.hpp"
#include "armadillo_bits/spop_vectorise_bones.hpp"
#include "armadillo_bits/spop_norm_bones.hpp"
#include "armadillo_bits/spop_vecnorm_bones.hpp"
#include "armadillo_bits/spop_shift_bones.hpp"
#include "armadillo_bits/spglue_plus_bones.hpp"
@@ -773,6 +773,7 @@ namespace arma
#include "armadillo_bits/op_sp_mean_meat.hpp"
#include "armadillo_bits/op_sp_var_meat.hpp"
#include "armadillo_bits/op_sp_stddev_meat.hpp"
#include "armadillo_bits/op_sp_vecnorm_meat.hpp"
#include "armadillo_bits/op_powmat_meat.hpp"
#include "armadillo_bits/op_rank_meat.hpp"
#include "armadillo_bits/op_row_as_mat_meat.hpp"
@@ -820,7 +821,6 @@ namespace arma
#include "armadillo_bits/spop_repmat_meat.hpp"
#include "armadillo_bits/spop_vectorise_meat.hpp"
#include "armadillo_bits/spop_norm_meat.hpp"
#include "armadillo_bits/spop_vecnorm_meat.hpp"
#include "armadillo_bits/spop_shift_meat.hpp"
#include "armadillo_bits/spglue_plus_meat.hpp"
+8 -8
View File
@@ -249,7 +249,7 @@ typename
enable_if2
<
is_arma_sparse_type<T1>::value && resolves_to_sparse_vector<T1>::no,
const mtSpOp<typename T1::pod_type, T1, spop_vecnorm>
const mtSpToDOp<typename T1::pod_type, T1, op_sp_vecnorm>
>::result
vecnorm
(
@@ -265,7 +265,7 @@ vecnorm
const uword dim = 0;
return mtSpOp<typename T1::pod_type, T1, spop_vecnorm>(X, k, dim);
return mtSpToDOp<typename T1::pod_type, T1, op_sp_vecnorm>(X, k, dim);
}
@@ -273,7 +273,7 @@ vecnorm
template<typename T1>
arma_warn_unused
inline
const mtSpOp<typename T1::pod_type, T1, spop_vecnorm>
const mtSpToDOp<typename T1::pod_type, T1, op_sp_vecnorm>
vecnorm
(
const SpBase<typename T1::elem_type,T1>& X,
@@ -285,7 +285,7 @@ vecnorm
arma_debug_sigprint();
arma_ignore(junk);
return mtSpOp<typename T1::pod_type, T1, spop_vecnorm>(X.get_ref(), k, dim);
return mtSpToDOp<typename T1::pod_type, T1, op_sp_vecnorm>(X.get_ref(), k, dim);
}
@@ -327,7 +327,7 @@ typename
enable_if2
<
is_arma_sparse_type<T1>::value && resolves_to_sparse_vector<T1>::no,
const mtSpOp<typename T1::pod_type, T1, spop_vecnorm_ext>
const mtSpToDOp<typename T1::pod_type, T1, op_sp_vecnorm_ext>
>::result
vecnorm
(
@@ -350,7 +350,7 @@ vecnorm
const uword dim = 0;
return mtSpOp<typename T1::pod_type, T1, spop_vecnorm_ext>(X, method_id, dim);
return mtSpToDOp<typename T1::pod_type, T1, op_sp_vecnorm_ext>(X, method_id, dim);
}
@@ -358,7 +358,7 @@ vecnorm
template<typename T1>
arma_warn_unused
inline
const mtSpOp<typename T1::pod_type, T1, spop_vecnorm_ext>
const mtSpToDOp<typename T1::pod_type, T1, op_sp_vecnorm_ext>
vecnorm
(
const SpBase<typename T1::elem_type,T1>& X,
@@ -377,7 +377,7 @@ vecnorm
if( (sig == 'i') || (sig == 'I') || (sig == '+') ) { method_id = 1; }
if( (sig == '-') ) { method_id = 2; }
return mtSpOp<typename T1::pod_type, T1, spop_vecnorm_ext>(X.get_ref(), method_id, dim);
return mtSpToDOp<typename T1::pod_type, T1, op_sp_vecnorm_ext>(X.get_ref(), method_id, dim);
}
@@ -16,17 +16,17 @@
// ------------------------------------------------------------------------
//! \addtogroup spop_vecnorm
//! \addtogroup op_sp_vecnorm
//! @{
class spop_vecnorm
class op_sp_vecnorm
: public traits_op_xvec
{
public:
template<typename T1>
inline static void apply(SpMat<typename T1::pod_type>& out, const mtSpOp<typename T1::pod_type,T1,spop_vecnorm>& expr);
inline static void apply(Mat<typename T1::pod_type>& out, const mtSpToDOp<typename T1::pod_type,T1,op_sp_vecnorm>& expr);
template<typename eT>
inline static void apply_direct(Mat< typename get_pod_type<eT>::result >& out, const SpMat<eT>& X, const uword k);
@@ -36,13 +36,13 @@ class spop_vecnorm
//
class spop_vecnorm_ext
class op_sp_vecnorm_ext
: public traits_op_xvec
{
public:
template<typename T1>
inline static void apply(SpMat<typename T1::pod_type>& out, const mtSpOp<typename T1::pod_type,T1,spop_vecnorm_ext>& expr);
inline static void apply(Mat<typename T1::pod_type>& out, const mtSpToDOp<typename T1::pod_type,T1,op_sp_vecnorm_ext>& expr);
template<typename eT>
inline static void apply_direct(Mat< typename get_pod_type<eT>::result >& out, const SpMat<eT>& X, const uword method_id);
@@ -16,7 +16,7 @@
// ------------------------------------------------------------------------
//! \addtogroup spop_vecnorm
//! \addtogroup op_sp_vecnorm
//! @{
@@ -24,7 +24,7 @@
template<typename T1>
inline
void
spop_vecnorm::apply(SpMat<typename T1::pod_type>& out, const mtSpOp<typename T1::pod_type,T1,spop_vecnorm>& expr)
op_sp_vecnorm::apply(Mat<typename T1::pod_type>& out, const mtSpToDOp<typename T1::pod_type,T1,op_sp_vecnorm>& expr)
{
arma_debug_sigprint();
@@ -44,11 +44,7 @@ spop_vecnorm::apply(SpMat<typename T1::pod_type>& out, const mtSpOp<typename T1:
if(dim == 0)
{
Mat<T> tmp;
spop_vecnorm::apply_direct(tmp, X, k);
out = tmp;
op_sp_vecnorm::apply_direct(out, X, k);
}
else
if(dim == 1)
@@ -58,7 +54,7 @@ spop_vecnorm::apply(SpMat<typename T1::pod_type>& out, const mtSpOp<typename T1:
spop_strans::apply_noalias(Xt, X);
spop_vecnorm::apply_direct(tmp, Xt, k);
op_sp_vecnorm::apply_direct(tmp, Xt, k);
out = tmp.t();
}
@@ -69,7 +65,7 @@ spop_vecnorm::apply(SpMat<typename T1::pod_type>& out, const mtSpOp<typename T1:
template<typename eT>
inline
void
spop_vecnorm::apply_direct(Mat< typename get_pod_type<eT>::result >& out, const SpMat<eT>& X, const uword k)
op_sp_vecnorm::apply_direct(Mat< typename get_pod_type<eT>::result >& out, const SpMat<eT>& X, const uword k)
{
arma_debug_sigprint();
@@ -114,7 +110,7 @@ spop_vecnorm::apply_direct(Mat< typename get_pod_type<eT>::result >& out, const
template<typename T1>
inline
void
spop_vecnorm_ext::apply(SpMat<typename T1::pod_type>& out, const mtSpOp<typename T1::pod_type,T1,spop_vecnorm_ext>& expr)
op_sp_vecnorm_ext::apply(Mat<typename T1::pod_type>& out, const mtSpToDOp<typename T1::pod_type,T1,op_sp_vecnorm_ext>& expr)
{
arma_debug_sigprint();
@@ -134,11 +130,7 @@ spop_vecnorm_ext::apply(SpMat<typename T1::pod_type>& out, const mtSpOp<typename
if(dim == 0)
{
Mat<T> tmp;
spop_vecnorm_ext::apply_direct(tmp, X, method_id);
out = tmp;
op_sp_vecnorm_ext::apply_direct(out, X, method_id);
}
else
if(dim == 1)
@@ -148,7 +140,7 @@ spop_vecnorm_ext::apply(SpMat<typename T1::pod_type>& out, const mtSpOp<typename
spop_strans::apply_noalias(Xt, X);
spop_vecnorm_ext::apply_direct(tmp, Xt, method_id);
op_sp_vecnorm_ext::apply_direct(tmp, Xt, method_id);
out = tmp.t();
}
@@ -159,7 +151,7 @@ spop_vecnorm_ext::apply(SpMat<typename T1::pod_type>& out, const mtSpOp<typename
template<typename eT>
inline
void
spop_vecnorm_ext::apply_direct(Mat< typename get_pod_type<eT>::result >& out, const SpMat<eT>& X, const uword method_id)
op_sp_vecnorm_ext::apply_direct(Mat< typename get_pod_type<eT>::result >& out, const SpMat<eT>& X, const uword method_id)
{
arma_debug_sigprint();