From 4e2f157604599f2f53ef5d085fb2e86e7b679332 Mon Sep 17 00:00:00 2001 From: conrad Date: Fri, 24 Jan 2025 10:56:07 +1000 Subject: [PATCH] reinterpret pow(x,2) as square(x) --- include/armadillo_bits/fn_accu.hpp | 39 +++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/include/armadillo_bits/fn_accu.hpp b/include/armadillo_bits/fn_accu.hpp index 347e9372..0c1af010 100644 --- a/include/armadillo_bits/fn_accu.hpp +++ b/include/armadillo_bits/fn_accu.hpp @@ -891,7 +891,44 @@ accu(const BaseCube& X) -// TODO: accu(const eOpCube& expr) +template +arma_warn_unused +inline +typename T1::elem_type +accu(const eOpCube& expr) + { + arma_debug_sigprint(); + + typedef eOpCube expr_type; + + typedef typename T1::elem_type eT; + + if(expr.aux == eT(2)) + { + typedef typename ProxyCube::stored_type expr_P_stored_type; + + if(is_Cube::value) + { + const unwrap_cube U(expr.P.Q); + + const eT* X_mem = U.M.memptr(); + + return op_dot::direct_dot(U.M.n_elem, X_mem, X_mem); + } + else + { + typedef eOpCube modified_expr_type; + + const ProxyCube P( reinterpret_cast< const modified_expr_type& >(expr) ); + + return (ProxyCube::use_at) ? accu_cube_proxy_at(P) : accu_cube_proxy_linear(P); + } + } + + const ProxyCube P(expr); + + return (ProxyCube::use_at) ? accu_cube_proxy_at(P) : accu_cube_proxy_linear(P); + }