// 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_debug_sigprint(); return X; } template arma_warn_unused arma_inline const T1& real(const BaseCube& X) { arma_debug_sigprint(); return X.get_ref(); } template arma_warn_unused arma_inline typename enable_if2< (is_arma_sparse_type::value && is_cx::no), const T1& >::result real(const T1& X) { arma_debug_sigprint(); return X; } template arma_warn_unused inline typename enable_if2< (is_arma_type::value && is_cx::yes), const mtOp >::result real(const T1& X) { arma_debug_sigprint(); return mtOp( X ); } template arma_warn_unused inline const mtOpCube real(const BaseCube, T1>& X) { arma_debug_sigprint(); return mtOpCube( X.get_ref() ); } template arma_warn_unused arma_inline typename enable_if2< (is_arma_sparse_type::value && is_cx::yes), const mtSpOp >::result real(const T1& X) { arma_debug_sigprint(); return mtSpOp(X); } // // imag template arma_warn_unused inline typename enable_if2< is_arma_type::value, const mtOp >::result imag(const T1& X) { arma_debug_sigprint(); return mtOp( X ); } template arma_warn_unused inline const mtOpCube imag(const BaseCube& X) { arma_debug_sigprint(); return mtOpCube( X.get_ref() ); } template arma_warn_unused arma_inline typename enable_if2< is_arma_sparse_type::value, const mtSpOp >::result imag(const T1& X) { arma_debug_sigprint(); return mtSpOp(X); } // // log template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result log(const T1& A) { arma_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube log(const BaseCube& A) { arma_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_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube log2(const BaseCube& A) { arma_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_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube log10(const BaseCube& A) { arma_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_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_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_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube exp(const BaseCube& A) { arma_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_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube exp2(const BaseCube& A) { arma_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_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube exp10(const BaseCube& A) { arma_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_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_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_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_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_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_debug_sigprint(); arma_ignore(junk); return mtOpCube( X.get_ref() ); } template arma_warn_unused arma_inline typename enable_if2< (is_arma_sparse_type::value && is_cx::no), const SpOp >::result abs(const T1& X) { arma_debug_sigprint(); return SpOp(X); } template arma_warn_unused arma_inline typename enable_if2< (is_arma_sparse_type::value && is_cx::yes), const mtSpOp >::result abs(const T1& X) { arma_debug_sigprint(); return mtSpOp(X); } // // 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_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_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_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_debug_sigprint(); arma_ignore(junk); return mtOpCube( X.get_ref() ); } template arma_warn_unused arma_inline typename enable_if2< (is_arma_sparse_type::value && is_cx::no), const SpOp >::result arg(const T1& X) { arma_debug_sigprint(); return SpOp(X); } template arma_warn_unused arma_inline typename enable_if2< (is_arma_sparse_type::value && is_cx::yes), const mtSpOp >::result arg(const T1& X) { arma_debug_sigprint(); return mtSpOp(X); } template arma_warn_unused inline typename enable_if2< is_arma_type::value, const mtOp >::result replace(const T1& X, typename T1::elem_type old_val, typename T1::elem_type new_val) { arma_debug_sigprint(); return mtOp(mtOp_dual_aux_indicator(), X, old_val, new_val); } template arma_warn_unused inline const mtOpCube replace(const BaseCube& X, typename T1::elem_type old_val, typename T1::elem_type new_val) { arma_debug_sigprint(); return mtOpCube(mtOpCube_dual_aux_indicator(), X.get_ref(), old_val, new_val); } template arma_warn_unused inline typename enable_if2< is_arma_sparse_type::value, const mtSpOp >::result replace(const T1& X, typename T1::elem_type old_val, typename T1::elem_type new_val) { arma_debug_sigprint(); return mtSpOp(mtSpOp_dual_aux_indicator(), X, old_val, new_val); } // // square template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result square(const T1& A) { arma_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube square(const BaseCube& A) { arma_debug_sigprint(); return eOpCube(A.get_ref()); } template arma_warn_unused arma_inline typename enable_if2< is_arma_sparse_type::value, const SpOp >::result square(const T1& X) { arma_debug_sigprint(); return SpOp(X); } // // sqrt template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result sqrt(const T1& A) { arma_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube sqrt(const BaseCube& A) { arma_debug_sigprint(); return eOpCube(A.get_ref()); } template arma_warn_unused arma_inline typename enable_if2< is_arma_sparse_type::value, const SpOp >::result sqrt(const T1& X) { arma_debug_sigprint(); return SpOp(X); } // // cbrt template arma_warn_unused arma_inline typename enable_if2< (is_arma_type::value && is_cx::no), const eOp >::result cbrt(const T1& A) { arma_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline typename enable_if2< is_cx::no, const eOpCube >::result cbrt(const BaseCube& A) { arma_debug_sigprint(); return eOpCube(A.get_ref()); } template arma_warn_unused arma_inline typename enable_if2< (is_arma_sparse_type::value && is_cx::no), const SpOp >::result cbrt(const T1& X) { arma_debug_sigprint(); return SpOp(X); } // // conj template arma_warn_unused arma_inline typename enable_if2< (is_arma_type::value && is_cx::no), const T1& >::result conj(const T1& X) { arma_debug_sigprint(); return X; } template arma_warn_unused arma_inline const T1& conj(const BaseCube& A) { arma_debug_sigprint(); return A.get_ref(); } template arma_warn_unused arma_inline typename enable_if2< (is_arma_sparse_type::value && is_cx::no), const T1& >::result conj(const T1& X) { arma_debug_sigprint(); return X; } template arma_warn_unused arma_inline typename enable_if2< (is_arma_type::value && is_cx::yes), const eOp >::result conj(const T1& A) { arma_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube conj(const BaseCube,T1>& A) { arma_debug_sigprint(); return eOpCube(A.get_ref()); } template arma_warn_unused arma_inline typename enable_if2< (is_arma_sparse_type::value && is_cx::yes), const SpOp >::result conj(const T1& X) { arma_debug_sigprint(); return SpOp(X); } // pow template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result pow(const T1& A, const typename T1::elem_type exponent) { arma_debug_sigprint(); return eOp(A, exponent); } template arma_warn_unused arma_inline const eOpCube pow(const BaseCube& A, const typename T1::elem_type exponent) { arma_debug_sigprint(); return eOpCube(A.get_ref(), exponent); } // pow, specialised handling (non-complex exponent for complex matrices) template arma_warn_unused arma_inline typename enable_if2< (is_arma_type::value && is_cx::yes), const eOp >::result pow(const T1& A, const typename T1::elem_type::value_type exponent) { arma_debug_sigprint(); typedef typename T1::elem_type eT; return eOp(A, eT(exponent)); } template arma_warn_unused arma_inline const eOpCube pow(const BaseCube,T1>& A, const typename T1::elem_type::value_type exponent) { arma_debug_sigprint(); typedef std::complex 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_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube floor(const BaseCube& A) { arma_debug_sigprint(); return eOpCube(A.get_ref()); } template arma_warn_unused arma_inline typename enable_if2< is_arma_sparse_type::value, const SpOp >::result floor(const T1& X) { arma_debug_sigprint(); return SpOp(X); } // // ceil template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result ceil(const T1& A) { arma_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube ceil(const BaseCube& A) { arma_debug_sigprint(); return eOpCube(A.get_ref()); } template arma_warn_unused arma_inline typename enable_if2< is_arma_sparse_type::value, const SpOp >::result ceil(const T1& X) { arma_debug_sigprint(); return SpOp(X); } // // round template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result round(const T1& A) { arma_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube round(const BaseCube& A) { arma_debug_sigprint(); return eOpCube(A.get_ref()); } template arma_warn_unused arma_inline typename enable_if2< is_arma_sparse_type::value, const SpOp >::result round(const T1& X) { arma_debug_sigprint(); return SpOp(X); } // // trunc template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result trunc(const T1& A) { arma_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube trunc(const BaseCube& A) { arma_debug_sigprint(); return eOpCube(A.get_ref()); } template arma_warn_unused arma_inline typename enable_if2< is_arma_sparse_type::value, const SpOp >::result trunc(const T1& X) { arma_debug_sigprint(); return SpOp(X); } // // sign template arma_warn_unused arma_inline typename arma_scalar_only::result sign(const eT x) { arma_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_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube sign(const BaseCube& A) { arma_debug_sigprint(); return eOpCube(A.get_ref()); } template arma_warn_unused arma_inline typename enable_if2< is_arma_sparse_type::value, const SpOp >::result sign(const T1& X) { arma_debug_sigprint(); return SpOp(X); } // // 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_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_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_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_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_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_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_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_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"); } //! @}