Chris@49: // Copyright (C) 2010-2013 NICTA (www.nicta.com.au) Chris@49: // Copyright (C) 2010-2013 Conrad Sanderson Chris@49: // Chris@49: // This Source Code Form is subject to the terms of the Mozilla Public Chris@49: // License, v. 2.0. If a copy of the MPL was not distributed with this Chris@49: // file, You can obtain one at http://mozilla.org/MPL/2.0/. Chris@49: Chris@49: Chris@49: //! \addtogroup eop_core Chris@49: //! @{ Chris@49: Chris@49: Chris@49: #undef arma_applier_1u Chris@49: #undef arma_applier_1a Chris@49: #undef arma_applier_2 Chris@49: #undef arma_applier_3 Chris@49: #undef operatorA Chris@49: Chris@49: #define arma_applier_1u(operatorA) \ Chris@49: {\ Chris@49: uword i,j;\ Chris@49: \ Chris@49: for(i=0, j=1; j::process(tmp_i, k);\ Chris@49: tmp_j = eop_core::process(tmp_j, k);\ Chris@49: \ Chris@49: out_mem[i] operatorA tmp_i;\ Chris@49: out_mem[j] operatorA tmp_j;\ Chris@49: }\ Chris@49: \ Chris@49: if(i < n_elem)\ Chris@49: {\ Chris@49: out_mem[i] operatorA eop_core::process(P[i], k);\ Chris@49: }\ Chris@49: } Chris@49: Chris@49: Chris@49: #define arma_applier_1a(operatorA) \ Chris@49: {\ Chris@49: uword i,j;\ Chris@49: \ Chris@49: for(i=0, j=1; j::process(tmp_i, k);\ Chris@49: tmp_j = eop_core::process(tmp_j, k);\ Chris@49: \ Chris@49: out_mem[i] operatorA tmp_i;\ Chris@49: out_mem[j] operatorA tmp_j;\ Chris@49: }\ Chris@49: \ Chris@49: if(i < n_elem)\ Chris@49: {\ Chris@49: out_mem[i] operatorA eop_core::process(P.at_alt(i), k);\ Chris@49: }\ Chris@49: } Chris@49: Chris@49: Chris@49: #define arma_applier_2(operatorA) \ Chris@49: {\ Chris@49: if(n_rows != 1)\ Chris@49: {\ Chris@49: for(uword col=0; col::process(tmp_i, k);\ Chris@49: tmp_j = eop_core::process(tmp_j, k);\ Chris@49: \ Chris@49: *out_mem operatorA tmp_i; out_mem++;\ Chris@49: *out_mem operatorA tmp_j; out_mem++;\ Chris@49: }\ Chris@49: \ Chris@49: if(i < n_rows)\ Chris@49: {\ Chris@49: *out_mem operatorA eop_core::process(P.at(i,col), k); out_mem++;\ Chris@49: }\ Chris@49: }\ Chris@49: }\ Chris@49: else\ Chris@49: {\ Chris@49: for(uword count=0; count < n_cols; ++count)\ Chris@49: {\ Chris@49: out_mem[count] operatorA eop_core::process(P.at(0,count), k);\ Chris@49: }\ Chris@49: }\ Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: #define arma_applier_3(operatorA) \ Chris@49: {\ Chris@49: for(uword slice=0; slice::process(tmp_i, k);\ Chris@49: tmp_j = eop_core::process(tmp_j, k);\ Chris@49: \ Chris@49: *out_mem operatorA tmp_i; out_mem++; \ Chris@49: *out_mem operatorA tmp_j; out_mem++; \ Chris@49: }\ Chris@49: \ Chris@49: if(i < n_rows)\ Chris@49: {\ Chris@49: *out_mem operatorA eop_core::process(P.at(i,col,slice), k); out_mem++; \ Chris@49: }\ Chris@49: }\ Chris@49: }\ Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: // Chris@49: // matrices Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: arma_hot Chris@49: inline Chris@49: void Chris@49: eop_core::apply(Mat& out, const eOp& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: typedef typename T1::elem_type eT; Chris@49: Chris@49: // NOTE: we're assuming that the matrix has already been set to the correct size and there is no aliasing; Chris@49: // size setting and alias checking is done by either the Mat contructor or operator=() Chris@49: Chris@49: const eT k = x.aux; Chris@49: eT* out_mem = out.memptr(); Chris@49: Chris@49: if(Proxy::prefer_at_accessor == false) Chris@49: { Chris@49: const uword n_elem = (Proxy::is_fixed) ? x.get_n_elem() : out.n_elem; Chris@49: Chris@49: //if(memory::is_aligned(out_mem)) Chris@49: if( memory::is_aligned(out_mem) && ((Proxy::is_fixed) ? (x.get_n_elem() >= 32) : true) ) Chris@49: { Chris@49: memory::mark_as_aligned(out_mem); Chris@49: Chris@49: if(x.P.is_aligned()) Chris@49: { Chris@49: typename Proxy::aligned_ea_type P = x.P.get_aligned_ea(); Chris@49: Chris@49: arma_applier_1a(=); Chris@49: } Chris@49: else Chris@49: { Chris@49: typename Proxy::ea_type P = x.P.get_ea(); Chris@49: Chris@49: arma_applier_1u(=); Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: typename Proxy::ea_type P = x.P.get_ea(); Chris@49: Chris@49: arma_applier_1u(=); Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: const uword n_rows = x.get_n_rows(); Chris@49: const uword n_cols = x.get_n_cols(); Chris@49: Chris@49: const Proxy& P = x.P; Chris@49: Chris@49: arma_applier_2(=); Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: arma_hot Chris@49: inline Chris@49: void Chris@49: eop_core::apply_inplace_plus(Mat& out, const eOp& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: typedef typename T1::elem_type eT; Chris@49: Chris@49: const uword n_rows = x.get_n_rows(); Chris@49: const uword n_cols = x.get_n_cols(); Chris@49: Chris@49: arma_debug_assert_same_size(out.n_rows, out.n_cols, n_rows, n_cols, "addition"); Chris@49: Chris@49: const eT k = x.aux; Chris@49: eT* out_mem = out.memptr(); Chris@49: Chris@49: if(Proxy::prefer_at_accessor == false) Chris@49: { Chris@49: const uword n_elem = (Proxy::is_fixed) ? x.get_n_elem() : out.n_elem; Chris@49: Chris@49: if(memory::is_aligned(out_mem)) Chris@49: { Chris@49: memory::mark_as_aligned(out_mem); Chris@49: Chris@49: if(x.P.is_aligned()) Chris@49: { Chris@49: typename Proxy::aligned_ea_type P = x.P.get_aligned_ea(); Chris@49: Chris@49: arma_applier_1a(+=); Chris@49: } Chris@49: else Chris@49: { Chris@49: typename Proxy::ea_type P = x.P.get_ea(); Chris@49: Chris@49: arma_applier_1u(+=); Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: typename Proxy::ea_type P = x.P.get_ea(); Chris@49: Chris@49: arma_applier_1u(+=); Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: const Proxy& P = x.P; Chris@49: Chris@49: arma_applier_2(+=); Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: arma_hot Chris@49: inline Chris@49: void Chris@49: eop_core::apply_inplace_minus(Mat& out, const eOp& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: typedef typename T1::elem_type eT; Chris@49: Chris@49: const uword n_rows = x.get_n_rows(); Chris@49: const uword n_cols = x.get_n_cols(); Chris@49: Chris@49: arma_debug_assert_same_size(out.n_rows, out.n_cols, n_rows, n_cols, "subtraction"); Chris@49: Chris@49: const eT k = x.aux; Chris@49: eT* out_mem = out.memptr(); Chris@49: Chris@49: if(Proxy::prefer_at_accessor == false) Chris@49: { Chris@49: const uword n_elem = (Proxy::is_fixed) ? x.get_n_elem() : out.n_elem; Chris@49: Chris@49: if(memory::is_aligned(out_mem)) Chris@49: { Chris@49: memory::mark_as_aligned(out_mem); Chris@49: Chris@49: if(x.P.is_aligned()) Chris@49: { Chris@49: typename Proxy::aligned_ea_type P = x.P.get_aligned_ea(); Chris@49: Chris@49: arma_applier_1a(-=); Chris@49: } Chris@49: else Chris@49: { Chris@49: typename Proxy::ea_type P = x.P.get_ea(); Chris@49: Chris@49: arma_applier_1u(-=); Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: typename Proxy::ea_type P = x.P.get_ea(); Chris@49: Chris@49: arma_applier_1u(-=); Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: const Proxy& P = x.P; Chris@49: Chris@49: arma_applier_2(-=); Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: arma_hot Chris@49: inline Chris@49: void Chris@49: eop_core::apply_inplace_schur(Mat& out, const eOp& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: typedef typename T1::elem_type eT; Chris@49: Chris@49: const uword n_rows = x.get_n_rows(); Chris@49: const uword n_cols = x.get_n_cols(); Chris@49: Chris@49: arma_debug_assert_same_size(out.n_rows, out.n_cols, n_rows, n_cols, "element-wise multiplication"); Chris@49: Chris@49: const eT k = x.aux; Chris@49: eT* out_mem = out.memptr(); Chris@49: Chris@49: if(Proxy::prefer_at_accessor == false) Chris@49: { Chris@49: const uword n_elem = (Proxy::is_fixed) ? x.get_n_elem() : out.n_elem; Chris@49: Chris@49: if(memory::is_aligned(out_mem)) Chris@49: { Chris@49: memory::mark_as_aligned(out_mem); Chris@49: Chris@49: if(x.P.is_aligned()) Chris@49: { Chris@49: typename Proxy::aligned_ea_type P = x.P.get_aligned_ea(); Chris@49: Chris@49: arma_applier_1a(*=); Chris@49: } Chris@49: else Chris@49: { Chris@49: typename Proxy::ea_type P = x.P.get_ea(); Chris@49: Chris@49: arma_applier_1u(*=); Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: typename Proxy::ea_type P = x.P.get_ea(); Chris@49: Chris@49: arma_applier_1u(*=); Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: const Proxy& P = x.P; Chris@49: Chris@49: arma_applier_2(*=); Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: arma_hot Chris@49: inline Chris@49: void Chris@49: eop_core::apply_inplace_div(Mat& out, const eOp& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: typedef typename T1::elem_type eT; Chris@49: Chris@49: const uword n_rows = x.get_n_rows(); Chris@49: const uword n_cols = x.get_n_cols(); Chris@49: Chris@49: arma_debug_assert_same_size(out.n_rows, out.n_cols, n_rows, n_cols, "element-wise division"); Chris@49: Chris@49: const eT k = x.aux; Chris@49: eT* out_mem = out.memptr(); Chris@49: Chris@49: if(Proxy::prefer_at_accessor == false) Chris@49: { Chris@49: const uword n_elem = (Proxy::is_fixed) ? x.get_n_elem() : out.n_elem; Chris@49: Chris@49: if(memory::is_aligned(out_mem)) Chris@49: { Chris@49: memory::mark_as_aligned(out_mem); Chris@49: Chris@49: if(x.P.is_aligned()) Chris@49: { Chris@49: typename Proxy::aligned_ea_type P = x.P.get_aligned_ea(); Chris@49: Chris@49: arma_applier_1a(/=); Chris@49: } Chris@49: else Chris@49: { Chris@49: typename Proxy::ea_type P = x.P.get_ea(); Chris@49: Chris@49: arma_applier_1u(/=); Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: typename Proxy::ea_type P = x.P.get_ea(); Chris@49: Chris@49: arma_applier_1u(/=); Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: const Proxy& P = x.P; Chris@49: Chris@49: arma_applier_2(/=); Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: // Chris@49: // cubes Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: arma_hot Chris@49: inline Chris@49: void Chris@49: eop_core::apply(Cube& out, const eOpCube& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: typedef typename T1::elem_type eT; Chris@49: Chris@49: // NOTE: we're assuming that the matrix has already been set to the correct size and there is no aliasing; Chris@49: // size setting and alias checking is done by either the Mat contructor or operator=() Chris@49: Chris@49: const eT k = x.aux; Chris@49: eT* out_mem = out.memptr(); Chris@49: Chris@49: if(ProxyCube::prefer_at_accessor == false) Chris@49: { Chris@49: const uword n_elem = out.n_elem; Chris@49: Chris@49: if(memory::is_aligned(out_mem)) Chris@49: { Chris@49: memory::mark_as_aligned(out_mem); Chris@49: Chris@49: if(x.P.is_aligned()) Chris@49: { Chris@49: typename ProxyCube::aligned_ea_type P = x.P.get_aligned_ea(); Chris@49: Chris@49: arma_applier_1a(=); Chris@49: } Chris@49: else Chris@49: { Chris@49: typename ProxyCube::ea_type P = x.P.get_ea(); Chris@49: Chris@49: arma_applier_1u(=); Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: typename ProxyCube::ea_type P = x.P.get_ea(); Chris@49: Chris@49: arma_applier_1u(=); Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: const uword n_rows = x.get_n_rows(); Chris@49: const uword n_cols = x.get_n_cols(); Chris@49: const uword n_slices = x.get_n_slices(); Chris@49: Chris@49: const ProxyCube& P = x.P; Chris@49: Chris@49: arma_applier_3(=); Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: arma_hot Chris@49: inline Chris@49: void Chris@49: eop_core::apply_inplace_plus(Cube& out, const eOpCube& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: typedef typename T1::elem_type eT; Chris@49: Chris@49: const uword n_rows = x.get_n_rows(); Chris@49: const uword n_cols = x.get_n_cols(); Chris@49: const uword n_slices = x.get_n_slices(); Chris@49: Chris@49: arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, "addition"); Chris@49: Chris@49: const eT k = x.aux; Chris@49: eT* out_mem = out.memptr(); Chris@49: Chris@49: if(ProxyCube::prefer_at_accessor == false) Chris@49: { Chris@49: const uword n_elem = out.n_elem; Chris@49: Chris@49: if(memory::is_aligned(out_mem)) Chris@49: { Chris@49: memory::mark_as_aligned(out_mem); Chris@49: Chris@49: if(x.P.is_aligned()) Chris@49: { Chris@49: typename ProxyCube::aligned_ea_type P = x.P.get_aligned_ea(); Chris@49: Chris@49: arma_applier_1a(+=); Chris@49: } Chris@49: else Chris@49: { Chris@49: typename ProxyCube::ea_type P = x.P.get_ea(); Chris@49: Chris@49: arma_applier_1u(+=); Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: typename ProxyCube::ea_type P = x.P.get_ea(); Chris@49: Chris@49: arma_applier_1u(+=); Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: const ProxyCube& P = x.P; Chris@49: Chris@49: arma_applier_3(+=); Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: arma_hot Chris@49: inline Chris@49: void Chris@49: eop_core::apply_inplace_minus(Cube& out, const eOpCube& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: typedef typename T1::elem_type eT; Chris@49: Chris@49: const uword n_rows = x.get_n_rows(); Chris@49: const uword n_cols = x.get_n_cols(); Chris@49: const uword n_slices = x.get_n_slices(); Chris@49: Chris@49: arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, "subtraction"); Chris@49: Chris@49: const eT k = x.aux; Chris@49: eT* out_mem = out.memptr(); Chris@49: Chris@49: if(ProxyCube::prefer_at_accessor == false) Chris@49: { Chris@49: const uword n_elem = out.n_elem; Chris@49: Chris@49: if(memory::is_aligned(out_mem)) Chris@49: { Chris@49: memory::mark_as_aligned(out_mem); Chris@49: Chris@49: if(x.P.is_aligned()) Chris@49: { Chris@49: typename ProxyCube::aligned_ea_type P = x.P.get_aligned_ea(); Chris@49: Chris@49: arma_applier_1a(-=); Chris@49: } Chris@49: else Chris@49: { Chris@49: typename ProxyCube::ea_type P = x.P.get_ea(); Chris@49: Chris@49: arma_applier_1u(-=); Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: typename ProxyCube::ea_type P = x.P.get_ea(); Chris@49: Chris@49: arma_applier_1u(-=); Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: const ProxyCube& P = x.P; Chris@49: Chris@49: arma_applier_3(-=); Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: arma_hot Chris@49: inline Chris@49: void Chris@49: eop_core::apply_inplace_schur(Cube& out, const eOpCube& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: typedef typename T1::elem_type eT; Chris@49: Chris@49: const uword n_rows = x.get_n_rows(); Chris@49: const uword n_cols = x.get_n_cols(); Chris@49: const uword n_slices = x.get_n_slices(); Chris@49: Chris@49: arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, "element-wise multiplication"); Chris@49: Chris@49: const eT k = x.aux; Chris@49: eT* out_mem = out.memptr(); Chris@49: Chris@49: if(ProxyCube::prefer_at_accessor == false) Chris@49: { Chris@49: const uword n_elem = out.n_elem; Chris@49: Chris@49: if(memory::is_aligned(out_mem)) Chris@49: { Chris@49: memory::mark_as_aligned(out_mem); Chris@49: Chris@49: if(x.P.is_aligned()) Chris@49: { Chris@49: typename ProxyCube::aligned_ea_type P = x.P.get_aligned_ea(); Chris@49: Chris@49: arma_applier_1a(*=); Chris@49: } Chris@49: else Chris@49: { Chris@49: typename ProxyCube::ea_type P = x.P.get_ea(); Chris@49: Chris@49: arma_applier_1u(*=); Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: typename ProxyCube::ea_type P = x.P.get_ea(); Chris@49: Chris@49: arma_applier_1u(*=); Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: const ProxyCube& P = x.P; Chris@49: Chris@49: arma_applier_3(*=); Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: arma_hot Chris@49: inline Chris@49: void Chris@49: eop_core::apply_inplace_div(Cube& out, const eOpCube& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: typedef typename T1::elem_type eT; Chris@49: Chris@49: const uword n_rows = x.get_n_rows(); Chris@49: const uword n_cols = x.get_n_cols(); Chris@49: const uword n_slices = x.get_n_slices(); Chris@49: Chris@49: arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, "element-wise division"); Chris@49: Chris@49: const eT k = x.aux; Chris@49: eT* out_mem = out.memptr(); Chris@49: Chris@49: if(ProxyCube::prefer_at_accessor == false) Chris@49: { Chris@49: const uword n_elem = out.n_elem; Chris@49: Chris@49: if(memory::is_aligned(out_mem)) Chris@49: { Chris@49: memory::mark_as_aligned(out_mem); Chris@49: Chris@49: if(x.P.is_aligned()) Chris@49: { Chris@49: typename ProxyCube::aligned_ea_type P = x.P.get_aligned_ea(); Chris@49: Chris@49: arma_applier_1a(/=); Chris@49: } Chris@49: else Chris@49: { Chris@49: typename ProxyCube::ea_type P = x.P.get_ea(); Chris@49: Chris@49: arma_applier_1u(/=); Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: typename ProxyCube::ea_type P = x.P.get_ea(); Chris@49: Chris@49: arma_applier_1u(/=); Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: const ProxyCube& P = x.P; Chris@49: Chris@49: arma_applier_3(/=); Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: // Chris@49: // common Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: arma_hot Chris@49: arma_pure Chris@49: arma_inline Chris@49: eT Chris@49: eop_core::process(const eT, const eT) Chris@49: { Chris@49: arma_stop("eop_core::process(): unhandled eop_type"); Chris@49: return eT(0); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template<> template arma_hot arma_const arma_inline eT Chris@49: eop_core::process(const eT val, const eT k) { return val + k; } Chris@49: Chris@49: template<> template arma_hot arma_const arma_inline eT Chris@49: eop_core::process(const eT val, const eT k) { return k - val; } Chris@49: Chris@49: template<> template arma_hot arma_const arma_inline eT Chris@49: eop_core::process(const eT val, const eT k) { return val - k; } Chris@49: Chris@49: template<> template arma_hot arma_const arma_inline eT Chris@49: eop_core::process(const eT val, const eT k) { return val * k; } Chris@49: Chris@49: template<> template arma_hot arma_const arma_inline eT Chris@49: eop_core::process(const eT val, const eT k) { return k / val; } Chris@49: Chris@49: template<> template arma_hot arma_const arma_inline eT Chris@49: eop_core::process(const eT val, const eT k) { return val / k; } Chris@49: Chris@49: template<> template arma_hot arma_const arma_inline eT Chris@49: eop_core::process(const eT val, const eT ) { return val*val; } Chris@49: Chris@49: template<> template arma_hot arma_const arma_inline eT Chris@49: eop_core::process(const eT val, const eT ) { return eop_aux::neg(val); } Chris@49: Chris@49: template<> template arma_hot arma_pure arma_inline eT Chris@49: eop_core::process(const eT val, const eT ) { return eop_aux::sqrt(val); } Chris@49: Chris@49: template<> template arma_hot arma_pure arma_inline eT Chris@49: eop_core::process(const eT val, const eT ) { return eop_aux::log(val); } Chris@49: Chris@49: template<> template arma_hot arma_pure arma_inline eT Chris@49: eop_core::process(const eT val, const eT ) { return eop_aux::log2(val); } Chris@49: Chris@49: template<> template arma_hot arma_pure arma_inline eT Chris@49: eop_core::process(const eT val, const eT ) { return eop_aux::log10(val); } Chris@49: Chris@49: template<> template arma_hot arma_pure arma_inline eT Chris@49: eop_core::process(const eT val, const eT ) { return arma::trunc_log(val); } Chris@49: Chris@49: template<> template arma_hot arma_pure arma_inline eT Chris@49: eop_core::process(const eT val, const eT ) { return eop_aux::exp(val); } Chris@49: Chris@49: template<> template arma_hot arma_pure arma_inline eT Chris@49: eop_core::process(const eT val, const eT ) { return eop_aux::exp2(val); } Chris@49: Chris@49: template<> template arma_hot arma_pure arma_inline eT Chris@49: eop_core::process(const eT val, const eT ) { return eop_aux::exp10(val); } Chris@49: Chris@49: template<> template arma_hot arma_pure arma_inline eT Chris@49: eop_core::process(const eT val, const eT ) { return arma::trunc_exp(val); } Chris@49: Chris@49: template<> template arma_hot arma_pure arma_inline eT Chris@49: eop_core::process(const eT val, const eT ) { return eop_aux::cos(val); } Chris@49: Chris@49: template<> template arma_hot arma_pure arma_inline eT Chris@49: eop_core::process(const eT val, const eT ) { return eop_aux::sin(val); } Chris@49: Chris@49: template<> template arma_hot arma_pure arma_inline eT Chris@49: eop_core::process(const eT val, const eT ) { return eop_aux::tan(val); } Chris@49: Chris@49: template<> template arma_hot arma_pure arma_inline eT Chris@49: eop_core::process(const eT val, const eT ) { return eop_aux::acos(val); } Chris@49: Chris@49: template<> template arma_hot arma_pure arma_inline eT Chris@49: eop_core::process(const eT val, const eT ) { return eop_aux::asin(val); } Chris@49: Chris@49: template<> template arma_hot arma_pure arma_inline eT Chris@49: eop_core::process(const eT val, const eT ) { return eop_aux::atan(val); } Chris@49: Chris@49: template<> template arma_hot arma_pure arma_inline eT Chris@49: eop_core::process(const eT val, const eT ) { return eop_aux::cosh(val); } Chris@49: Chris@49: template<> template arma_hot arma_pure arma_inline eT Chris@49: eop_core::process(const eT val, const eT ) { return eop_aux::sinh(val); } Chris@49: Chris@49: template<> template arma_hot arma_pure arma_inline eT Chris@49: eop_core::process(const eT val, const eT ) { return eop_aux::tanh(val); } Chris@49: Chris@49: template<> template arma_hot arma_pure arma_inline eT Chris@49: eop_core::process(const eT val, const eT ) { return eop_aux::acosh(val); } Chris@49: Chris@49: template<> template arma_hot arma_pure arma_inline eT Chris@49: eop_core::process(const eT val, const eT ) { return eop_aux::asinh(val); } Chris@49: Chris@49: template<> template arma_hot arma_pure arma_inline eT Chris@49: eop_core::process(const eT val, const eT ) { return eop_aux::atanh(val); } Chris@49: Chris@49: template<> template arma_hot arma_pure arma_inline eT Chris@49: eop_core::process(const eT val, const eT ) { return eop_aux::direct_eps(val); } Chris@49: Chris@49: template<> template arma_hot arma_pure arma_inline eT Chris@49: eop_core::process(const eT val, const eT ) { return eop_aux::arma_abs(val); } Chris@49: Chris@49: template<> template arma_hot arma_pure arma_inline eT Chris@49: eop_core::process(const eT val, const eT ) { return eop_aux::conj(val); } Chris@49: Chris@49: template<> template arma_hot arma_pure arma_inline eT Chris@49: eop_core::process(const eT val, const eT k) { return eop_aux::pow(val, k); } Chris@49: Chris@49: template<> template arma_hot arma_pure arma_inline eT Chris@49: eop_core::process(const eT val, const eT ) { return eop_aux::floor(val); } Chris@49: Chris@49: template<> template arma_hot arma_pure arma_inline eT Chris@49: eop_core::process(const eT val, const eT ) { return eop_aux::ceil(val); } Chris@49: Chris@49: template<> template arma_hot arma_pure arma_inline eT Chris@49: eop_core::process(const eT val, const eT ) { return eop_aux::round(val); } Chris@49: Chris@49: Chris@49: #undef arma_applier_1u Chris@49: #undef arma_applier_1a Chris@49: #undef arma_applier_2 Chris@49: #undef arma_applier_3 Chris@49: Chris@49: Chris@49: Chris@49: //! @}