From eda5bc26f44ee9a6f83dcf8c91f17296d7fc509d Mon Sep 17 00:00:00 2001 From: Nao Pross Date: Mon, 12 Feb 2024 14:52:43 +0100 Subject: Move into version control --- src/armadillo/include/armadillo_bits/eop_aux.hpp | 191 +++++++++++++++++++++++ 1 file changed, 191 insertions(+) create mode 100644 src/armadillo/include/armadillo_bits/eop_aux.hpp (limited to 'src/armadillo/include/armadillo_bits/eop_aux.hpp') diff --git a/src/armadillo/include/armadillo_bits/eop_aux.hpp b/src/armadillo/include/armadillo_bits/eop_aux.hpp new file mode 100644 index 0000000..2b66ef2 --- /dev/null +++ b/src/armadillo/include/armadillo_bits/eop_aux.hpp @@ -0,0 +1,191 @@ +// 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 eop_aux +//! @{ + + + +//! use of the SFINAE approach to work around compiler limitations +//! http://en.wikipedia.org/wiki/SFINAE + +class eop_aux + { + public: + + template arma_inline static typename arma_integral_only::result acos (const eT x) { return eT( std::acos(double(x)) ); } + template arma_inline static typename arma_integral_only::result asin (const eT x) { return eT( std::asin(double(x)) ); } + template arma_inline static typename arma_integral_only::result atan (const eT x) { return eT( std::atan(double(x)) ); } + + template arma_inline static typename arma_real_only::result acos (const eT x) { return std::acos(x); } + template arma_inline static typename arma_real_only::result asin (const eT x) { return std::asin(x); } + template arma_inline static typename arma_real_only::result atan (const eT x) { return std::atan(x); } + + template arma_inline static typename arma_cx_only::result acos (const eT x) { return std::acos(x); } + template arma_inline static typename arma_cx_only::result asin (const eT x) { return std::asin(x); } + template arma_inline static typename arma_cx_only::result atan (const eT x) { return std::atan(x); } + + template arma_inline static typename arma_integral_only::result acosh (const eT x) { return eT( std::acosh(double(x)) ); } + template arma_inline static typename arma_integral_only::result asinh (const eT x) { return eT( std::asinh(double(x)) ); } + template arma_inline static typename arma_integral_only::result atanh (const eT x) { return eT( std::atanh(double(x)) ); } + + template arma_inline static typename arma_real_or_cx_only::result acosh (const eT x) { return std::acosh(x); } + template arma_inline static typename arma_real_or_cx_only::result asinh (const eT x) { return std::asinh(x); } + template arma_inline static typename arma_real_or_cx_only::result atanh (const eT x) { return std::atanh(x); } + + template arma_inline static typename arma_not_cx::result conj(const eT x) { return x; } + template arma_inline static std::complex conj(const std::complex& x) { return std::conj(x); } + + template arma_inline static typename arma_integral_only::result sqrt (const eT x) { return eT( std::sqrt (double(x)) ); } + template arma_inline static typename arma_integral_only::result log10 (const eT x) { return eT( std::log10(double(x)) ); } + template arma_inline static typename arma_integral_only::result log (const eT x) { return eT( std::log (double(x)) ); } + template arma_inline static typename arma_integral_only::result exp (const eT x) { return eT( std::exp (double(x)) ); } + template arma_inline static typename arma_integral_only::result cos (const eT x) { return eT( std::cos (double(x)) ); } + template arma_inline static typename arma_integral_only::result sin (const eT x) { return eT( std::sin (double(x)) ); } + template arma_inline static typename arma_integral_only::result tan (const eT x) { return eT( std::tan (double(x)) ); } + template arma_inline static typename arma_integral_only::result cosh (const eT x) { return eT( std::cosh (double(x)) ); } + template arma_inline static typename arma_integral_only::result sinh (const eT x) { return eT( std::sinh (double(x)) ); } + template arma_inline static typename arma_integral_only::result tanh (const eT x) { return eT( std::tanh (double(x)) ); } + + template arma_inline static typename arma_real_or_cx_only::result sqrt (const eT x) { return std::sqrt (x); } + template arma_inline static typename arma_real_or_cx_only::result log10 (const eT x) { return std::log10(x); } + template arma_inline static typename arma_real_or_cx_only::result log (const eT x) { return std::log (x); } + template arma_inline static typename arma_real_or_cx_only::result exp (const eT x) { return std::exp (x); } + template arma_inline static typename arma_real_or_cx_only::result cos (const eT x) { return std::cos (x); } + template arma_inline static typename arma_real_or_cx_only::result sin (const eT x) { return std::sin (x); } + template arma_inline static typename arma_real_or_cx_only::result tan (const eT x) { return std::tan (x); } + template arma_inline static typename arma_real_or_cx_only::result cosh (const eT x) { return std::cosh (x); } + template arma_inline static typename arma_real_or_cx_only::result sinh (const eT x) { return std::sinh (x); } + template arma_inline static typename arma_real_or_cx_only::result tanh (const eT x) { return std::tanh (x); } + + template arma_inline static typename arma_unsigned_integral_only::result neg (const eT x) { return x; } + template arma_inline static typename arma_signed_only::result neg (const eT x) { return -x; } + + template arma_inline static typename arma_integral_only::result floor (const eT x) { return x; } + template arma_inline static typename arma_real_only::result floor (const eT x) { return std::floor(x); } + template arma_inline static typename arma_cx_only::result floor (const eT& x) { return eT( std::floor(x.real()), std::floor(x.imag()) ); } + + template arma_inline static typename arma_integral_only::result ceil (const eT x) { return x; } + template arma_inline static typename arma_real_only::result ceil (const eT x) { return std::ceil(x); } + template arma_inline static typename arma_cx_only::result ceil (const eT& x) { return eT( std::ceil(x.real()), std::ceil(x.imag()) ); } + + template arma_inline static typename arma_integral_only::result round (const eT x) { return x; } + template arma_inline static typename arma_real_only::result round (const eT x) { return std::round(x); } + template arma_inline static typename arma_cx_only::result round (const eT& x) { return eT( std::round(x.real()), std::round(x.imag()) ); } + + template arma_inline static typename arma_integral_only::result trunc (const eT x) { return x; } + template arma_inline static typename arma_real_only::result trunc (const eT x) { return std::trunc(x); } + template arma_inline static typename arma_cx_only::result trunc (const eT& x) { return eT( std::trunc(x.real()), std::trunc(x.imag()) ); } + + template arma_inline static typename arma_integral_only::result log2 (const eT x) { return eT( std::log2(double(x)) ); } + template arma_inline static typename arma_real_only::result log2 (const eT x) { return std::log2(x); } + template arma_inline static typename arma_cx_only::result log2 (const eT& x) { typedef typename get_pod_type::result T; return std::log(x) / T(0.69314718055994530942); } + + template arma_inline static typename arma_integral_only::result log1p (const eT x) { return eT( std::log1p(double(x)) ); } + template arma_inline static typename arma_real_only::result log1p (const eT x) { return std::log1p(x); } + template arma_inline static typename arma_cx_only::result log1p (const eT& x) { arma_ignore(x); return eT(0); } + + template arma_inline static typename arma_integral_only::result exp2 (const eT x) { return eT( std::exp2(double(x)) ); } + template arma_inline static typename arma_real_only::result exp2 (const eT x) { return std::exp2(x); } + template arma_inline static typename arma_cx_only::result exp2 (const eT& x) { typedef typename get_pod_type::result T; return std::pow( T(2), x); } + + template arma_inline static typename arma_integral_only::result exp10 (const eT x) { return eT( std::pow(double(10), double(x)) ); } + template arma_inline static typename arma_real_or_cx_only::result exp10 (const eT x) { typedef typename get_pod_type::result T; return std::pow( T(10), x); } + + template arma_inline static typename arma_integral_only::result expm1 (const eT x) { return eT( std::expm1(double(x)) ); } + template arma_inline static typename arma_real_only::result expm1 (const eT x) { return std::expm1(x); } + template arma_inline static typename arma_cx_only::result expm1 (const eT& x) { arma_ignore(x); return eT(0); } + + template arma_inline static typename arma_unsigned_integral_only::result arma_abs (const eT x) { return x; } + template arma_inline static typename arma_signed_integral_only::result arma_abs (const eT x) { return std::abs(x); } + template arma_inline static typename arma_real_only::result arma_abs (const eT x) { return std::abs(x); } + template arma_inline static typename arma_real_only< T>::result arma_abs (const std::complex& x) { return std::abs(x); } + + template arma_inline static typename arma_integral_only::result erf (const eT x) { return eT( std::erf(double(x)) ); } + template arma_inline static typename arma_real_only::result erf (const eT x) { return std::erf(x); } + template arma_inline static typename arma_cx_only::result erf (const eT& x) { arma_ignore(x); return eT(0); } + + template arma_inline static typename arma_integral_only::result erfc (const eT x) { return eT( std::erfc(double(x)) ); } + template arma_inline static typename arma_real_only::result erfc (const eT x) { return std::erfc(x); } + template arma_inline static typename arma_cx_only::result erfc (const eT& x) { arma_ignore(x); return eT(0); } + + template arma_inline static typename arma_integral_only::result lgamma (const eT x) { return eT( std::lgamma(double(x)) ); } + template arma_inline static typename arma_real_only::result lgamma (const eT x) { return std::lgamma(x); } + template arma_inline static typename arma_cx_only::result lgamma (const eT& x) { arma_ignore(x); return eT(0); } + + template arma_inline static typename arma_integral_only::result tgamma (const eT x) { return eT( std::tgamma(double(x)) ); } + template arma_inline static typename arma_real_only::result tgamma (const eT x) { return std::tgamma(x); } + template arma_inline static typename arma_cx_only::result tgamma (const eT& x) { arma_ignore(x); return eT(0); } + + template arma_inline static typename arma_integral_only::result pow (const T1 base, const T2 exponent) { return T1( std::pow( double(base), double(exponent) ) ); } + template arma_inline static typename arma_real_or_cx_only::result pow (const T1 base, const T2 exponent) { return T1( std::pow( base, exponent ) ); } + + + template + arma_inline + static + typename arma_integral_only::result + direct_eps(const eT) + { + return eT(0); + } + + + template + inline + static + typename arma_real_only::result + direct_eps(const eT x) + { + //arma_extra_debug_sigprint(); + + // acording to IEEE Standard for Floating-Point Arithmetic (IEEE 754) + // the mantissa length for double is 53 bits = std::numeric_limits::digits + // the mantissa length for float is 24 bits = std::numeric_limits::digits + + //return std::pow( std::numeric_limits::radix, (std::floor(std::log10(std::abs(x))/std::log10(std::numeric_limits::radix))-(std::numeric_limits::digits-1)) ); + + const eT radix_eT = eT(std::numeric_limits::radix); + const eT digits_m1_eT = eT(std::numeric_limits::digits - 1); + + // return std::pow( radix_eT, eT(std::floor(std::log10(std::abs(x))/std::log10(radix_eT)) - digits_m1_eT) ); + return eop_aux::pow( radix_eT, eT(std::floor(std::log10(std::abs(x))/std::log10(radix_eT)) - digits_m1_eT) ); + } + + + template + inline + static + typename arma_real_only::result + direct_eps(const std::complex& x) + { + //arma_extra_debug_sigprint(); + + //return std::pow( std::numeric_limits::radix, (std::floor(std::log10(std::abs(x))/std::log10(std::numeric_limits::radix))-(std::numeric_limits::digits-1)) ); + + const T radix_T = T(std::numeric_limits::radix); + const T digits_m1_T = T(std::numeric_limits::digits - 1); + + return std::pow( radix_T, T(std::floor(std::log10(std::abs(x))/std::log10(radix_T)) - digits_m1_T) ); + } + }; + + + +//! @} + -- cgit v1.2.1