// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_elem //! @{ // // real template arma_warn_unused arma_inline typename enable_if2< (is_arma_type::value && is_cx::no), const T1& >::result real(const T1& X) { arma_extra_debug_sigprint(); return X; } template arma_warn_unused arma_inline const T1& real(const BaseCube& X) { arma_extra_debug_sigprint(); return X.get_ref(); } template arma_warn_unused arma_inline const T1& real(const SpBase& A) { arma_extra_debug_sigprint(); return A.get_ref(); } template arma_warn_unused inline typename enable_if2< (is_arma_type::value && is_cx::yes), const mtOp >::result real(const T1& X) { arma_extra_debug_sigprint(); return mtOp( X ); } template arma_warn_unused inline const mtOpCube real(const BaseCube, T1>& X) { arma_extra_debug_sigprint(); return mtOpCube( X.get_ref() ); } template arma_warn_unused arma_inline const mtSpOp real(const SpBase,T1>& A) { arma_extra_debug_sigprint(); return mtSpOp(A.get_ref()); } // // imag template arma_warn_unused inline const Gen< Mat, gen_zeros > imag(const Base& X) { arma_extra_debug_sigprint(); const Proxy A(X.get_ref()); return Gen< Mat, gen_zeros>(A.get_n_rows(), A.get_n_cols()); } template arma_warn_unused inline const GenCube imag(const BaseCube& X) { arma_extra_debug_sigprint(); const ProxyCube A(X.get_ref()); return GenCube(A.get_n_rows(), A.get_n_cols(), A.get_n_slices()); } template arma_warn_unused inline SpMat imag(const SpBase& A) { arma_extra_debug_sigprint(); const SpProxy P(A.get_ref()); return SpMat(P.get_n_rows(), P.get_n_cols()); } template arma_warn_unused inline typename enable_if2< (is_arma_type::value && is_cx::yes), const mtOp >::result imag(const T1& X) { arma_extra_debug_sigprint(); return mtOp( X ); } template arma_warn_unused inline const mtOpCube imag(const BaseCube,T1>& X) { arma_extra_debug_sigprint(); return mtOpCube( X.get_ref() ); } template arma_warn_unused arma_inline const mtSpOp imag(const SpBase,T1>& A) { arma_extra_debug_sigprint(); return mtSpOp(A.get_ref()); } // // log template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result log(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube log(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // // log2 template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result log2(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube log2(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // // log10 template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result log10(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube log10(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // // log1p template arma_warn_unused arma_inline typename enable_if2< (is_arma_type::value && is_cx::no), const eOp >::result log1p(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline typename enable_if2< is_cx::no, const eOpCube >::result log1p(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // // exp template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result exp(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube exp(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // exp2 template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result exp2(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube exp2(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // exp10 template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result exp10(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube exp10(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // expm1 template arma_warn_unused arma_inline typename enable_if2< (is_arma_type::value && is_cx::no), const eOp >::result expm1(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline typename enable_if2< is_cx::no, const eOpCube >::result expm1(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // // abs template arma_warn_unused arma_inline typename enable_if2< (is_arma_type::value && is_cx::no), const eOp >::result abs(const T1& X) { arma_extra_debug_sigprint(); return eOp(X); } template arma_warn_unused arma_inline const eOpCube abs(const BaseCube& X, const typename arma_not_cx::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return eOpCube(X.get_ref()); } template arma_warn_unused inline typename enable_if2< (is_arma_type::value && is_cx::yes), const mtOp >::result abs(const T1& X) { arma_extra_debug_sigprint(); return mtOp(X); } template arma_warn_unused inline const mtOpCube abs(const BaseCube< std::complex,T1>& X, const typename arma_cx_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return mtOpCube( X.get_ref() ); } template arma_warn_unused arma_inline const SpOp abs(const SpBase& X, const typename arma_not_cx::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return SpOp(X.get_ref()); } template arma_warn_unused arma_inline const mtSpOp abs(const SpBase< std::complex, T1>& X, const typename arma_cx_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return mtSpOp(X.get_ref()); } // // arg template arma_warn_unused arma_inline typename enable_if2< (is_arma_type::value && is_cx::no), const eOp >::result arg(const T1& X) { arma_extra_debug_sigprint(); return eOp(X); } template arma_warn_unused arma_inline const eOpCube arg(const BaseCube& X, const typename arma_not_cx::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return eOpCube(X.get_ref()); } template arma_warn_unused inline typename enable_if2< (is_arma_type::value && is_cx::yes), const mtOp >::result arg(const T1& X) { arma_extra_debug_sigprint(); return mtOp(X); } template arma_warn_unused inline const mtOpCube arg(const BaseCube< std::complex,T1>& X, const typename arma_cx_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return mtOpCube( X.get_ref() ); } template arma_warn_unused arma_inline const SpOp arg(const SpBase& X, const typename arma_not_cx::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return SpOp(X.get_ref()); } template arma_warn_unused arma_inline const mtSpOp arg(const SpBase< std::complex, T1>& X, const typename arma_cx_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return mtSpOp(X.get_ref()); } // // square template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result square(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube square(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } template arma_warn_unused arma_inline const SpOp square(const SpBase& A) { arma_extra_debug_sigprint(); return SpOp(A.get_ref()); } // // sqrt template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result sqrt(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube sqrt(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } template arma_warn_unused arma_inline const SpOp sqrt(const SpBase& A) { arma_extra_debug_sigprint(); return SpOp(A.get_ref()); } // // conj template arma_warn_unused arma_inline const T1& conj(const Base& A) { arma_extra_debug_sigprint(); return A.get_ref(); } template arma_warn_unused arma_inline const T1& conj(const BaseCube& A) { arma_extra_debug_sigprint(); return A.get_ref(); } template arma_warn_unused arma_inline const T1& conj(const SpBase& A) { arma_extra_debug_sigprint(); return A.get_ref(); } template arma_warn_unused arma_inline const eOp conj(const Base,T1>& A) { arma_extra_debug_sigprint(); return eOp(A.get_ref()); } template arma_warn_unused arma_inline const eOpCube conj(const BaseCube,T1>& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } template arma_warn_unused arma_inline const SpOp conj(const SpBase,T1>& A) { arma_extra_debug_sigprint(); return SpOp(A.get_ref()); } // pow template arma_warn_unused arma_inline const eOp pow(const Base& A, const typename T1::elem_type exponent) { arma_extra_debug_sigprint(); return eOp(A.get_ref(), exponent); } template arma_warn_unused arma_inline const eOpCube pow(const BaseCube& A, const typename T1::elem_type exponent) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref(), exponent); } // pow, specialised handling (non-complex exponent for complex matrices) template arma_warn_unused arma_inline const eOp pow(const Base& A, const typename T1::elem_type::value_type exponent) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; return eOp(A.get_ref(), eT(exponent)); } template arma_warn_unused arma_inline const eOpCube pow(const BaseCube& A, const typename T1::elem_type::value_type exponent) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; return eOpCube(A.get_ref(), eT(exponent)); } // // floor template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result floor(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube floor(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } template arma_warn_unused arma_inline const SpOp floor(const SpBase& X) { arma_extra_debug_sigprint(); return SpOp(X.get_ref()); } // // ceil template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result ceil(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube ceil(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } template arma_warn_unused arma_inline const SpOp ceil(const SpBase& X) { arma_extra_debug_sigprint(); return SpOp(X.get_ref()); } // // round template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result round(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube round(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } template arma_warn_unused arma_inline const SpOp round(const SpBase& X) { arma_extra_debug_sigprint(); return SpOp(X.get_ref()); } // // trunc template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result trunc(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube trunc(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } template arma_warn_unused arma_inline const SpOp trunc(const SpBase& X) { arma_extra_debug_sigprint(); return SpOp(X.get_ref()); } // // sign template arma_warn_unused arma_inline typename arma_scalar_only::result sign(const eT x) { arma_extra_debug_sigprint(); return arma_sign(x); } template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result sign(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube sign(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } template arma_warn_unused arma_inline const SpOp sign(const SpBase& X) { arma_extra_debug_sigprint(); return SpOp(X.get_ref()); } // // erf template arma_warn_unused arma_inline typename enable_if2< (is_arma_type::value && is_cx::no), const eOp >::result erf(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline typename enable_if2< is_cx::no, const eOpCube >::result erf(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // // erfc template arma_warn_unused arma_inline typename enable_if2< (is_arma_type::value && is_cx::no), const eOp >::result erfc(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline typename enable_if2< is_cx::no, const eOpCube >::result erfc(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // // lgamma template arma_warn_unused arma_inline typename enable_if2< (is_arma_type::value && is_cx::no), const eOp >::result lgamma(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline typename enable_if2< is_cx::no, const eOpCube >::result lgamma(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // // tgamma template arma_warn_unused arma_inline typename enable_if2< (is_arma_type::value && is_cx::no), const eOp >::result tgamma(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline typename enable_if2< is_cx::no, const eOpCube >::result tgamma(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // the functions below are currently unused; reserved for potential future use template void exp_approx(const T1&) { arma_stop_logic_error("unimplemented"); } template void log_approx(const T1&) { arma_stop_logic_error("unimplemented"); } template void approx_exp(const T1&) { arma_stop_logic_error("unimplemented"); } template void approx_log(const T1&) { arma_stop_logic_error("unimplemented"); } //! @}