diff --git a/include/armadillo_bits/op_sum_bones.hpp b/include/armadillo_bits/op_sum_bones.hpp index 5a1a0e34..209248bb 100644 --- a/include/armadillo_bits/op_sum_bones.hpp +++ b/include/armadillo_bits/op_sum_bones.hpp @@ -34,9 +34,21 @@ struct op_sum template inline static void apply(Mat& out, const Op< eOp, op_sum >& in); + template + inline static void apply(Mat_noalias& out, const Op< T1, op_sum >& in); + + template + inline static void apply(Mat_noalias& out, const Op< eOp, op_sum >& in); + + template + inline static void apply(Mat_noalias& out, const Op< eOp, op_sum >& in); + template inline static void apply_generic(Mat& out, const Op& in); + template + inline static void apply_generic(Mat_noalias& out, const Op& in); + template inline static void apply_mat_noalias(Mat& out, const Mat& X, const uword dim); diff --git a/include/armadillo_bits/op_sum_meat.hpp b/include/armadillo_bits/op_sum_meat.hpp index eb6fcebd..91a4c9aa 100644 --- a/include/armadillo_bits/op_sum_meat.hpp +++ b/include/armadillo_bits/op_sum_meat.hpp @@ -158,6 +158,106 @@ op_sum::apply_generic(Mat& out, const Op& in) +template +inline +void +op_sum::apply(Mat_noalias& out, const Op& in) + { + arma_debug_sigprint(); + + op_sum::apply_generic(out, in); + } + + + +template +inline +void +op_sum::apply(Mat_noalias& out, const Op< eOp, op_sum >& in) + { + arma_debug_sigprint(); + + typedef eOp inner_expr_type; + + typedef typename inner_expr_type::proxy_type::stored_type inner_expr_P_stored_type; + + if(is_Mat::value) + { + const uword dim = in.aux_uword_a; + + arma_conform_check( (dim > 1), "sum(): parameter 'dim' must be 0 or 1" ); + + const quasi_unwrap U(in.m.P.Q); + + op_sum::apply_mat_square_noalias(out, U.M, dim); + + return; + } + + op_sum::apply_generic(out, in); + } + + + +template +inline +void +op_sum::apply(Mat_noalias& out, const Op< eOp, op_sum >& in) + { + arma_debug_sigprint(); + + typedef typename T1::elem_type eT; + + if(arma_config::optimise_powexpr && (in.m.aux == eT(2))) + { + typedef Op< eOp, op_sum > modified_whole_expr_type; + + op_sum::apply(out, reinterpret_cast(in) ); + + return; + } + + if(arma_config::optimise_powexpr && (in.m.aux == eT(0.5)) && is_real_or_cx::value) + { + typedef Op< eOp, op_sum > modified_whole_expr_type; + + op_sum::apply(out, reinterpret_cast(in) ); + + return; + } + + op_sum::apply_generic(out, in); + } + + + +template +inline +void +op_sum::apply_generic(Mat_noalias& out, const Op& in) + { + arma_debug_sigprint(); + + const uword dim = in.aux_uword_a; + + arma_conform_check( (dim > 1), "sum(): parameter 'dim' must be 0 or 1" ); + + if((quasi_unwrap::has_orig_mem) || (is_Mat::stored_type>::value) || (arma_config::openmp && Proxy::use_mp)) + { + const quasi_unwrap U(in.m); + + op_sum::apply_mat_noalias(out, U.M, dim); + } + else + { + const Proxy P(in.m); + + op_sum::apply_proxy_noalias(out, P, dim); + } + } + + + template inline void diff --git a/include/armadillo_bits/op_vectorise_bones.hpp b/include/armadillo_bits/op_vectorise_bones.hpp index 52485de3..eabe2eed 100644 --- a/include/armadillo_bits/op_vectorise_bones.hpp +++ b/include/armadillo_bits/op_vectorise_bones.hpp @@ -29,6 +29,10 @@ struct op_vectorise_col template inline static void apply_direct(Mat& out, const T1& expr); + template inline static void apply(Mat_noalias& out, const Op& in); + + template inline static void apply_direct(Mat_noalias& out, const T1& expr); + template inline static void apply_subview(Mat& out, const subview& sv); template inline static void apply_proxy(Mat& out, const Proxy& P); diff --git a/include/armadillo_bits/op_vectorise_meat.hpp b/include/armadillo_bits/op_vectorise_meat.hpp index 5b148794..724ce50c 100644 --- a/include/armadillo_bits/op_vectorise_meat.hpp +++ b/include/armadillo_bits/op_vectorise_meat.hpp @@ -118,6 +118,52 @@ op_vectorise_col::apply_direct(Mat& out, const T1& expr) +template +inline +void +op_vectorise_col::apply(Mat_noalias& out, const Op& in) + { + arma_debug_sigprint(); + + op_vectorise_col::apply_direct(out, in.m); + } + + + +template +inline +void +op_vectorise_col::apply_direct(Mat_noalias& out, const T1& expr) + { + arma_debug_sigprint(); + + typedef typename T1::elem_type eT; + + if(is_subview::value) + { + const subview& sv = reinterpret_cast< const subview& >(expr); + + op_vectorise_col::apply_subview(out, sv); + } + else + if( (quasi_unwrap::has_orig_mem) || (is_Mat::stored_type>::value) || (arma_config::openmp && Proxy::use_mp) ) + { + const quasi_unwrap U(expr); + + out.set_size(U.M.n_elem, 1); + + arrayops::copy(out.memptr(), U.M.memptr(), U.M.n_elem); + } + else + { + const Proxy P(expr); + + op_vectorise_col::apply_proxy(out, P); + } + } + + + template inline void