cart-elc

Source code for CART-ELC
git clone git://git.laack.co/cart-elc.git
Log | Files | Refs | README | LICENSE

SpecialFunctionsArrayAPI.h (7694B)


      1 // This file is part of Eigen, a lightweight C++ template library
      2 // for linear algebra.
      3 //
      4 // Copyright (C) 2016 Gael Guennebaud <gael.guennebaud@inria.fr>
      5 //
      6 // This Source Code Form is subject to the terms of the Mozilla
      7 // Public License v. 2.0. If a copy of the MPL was not distributed
      8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
      9 
     10 
     11 #ifndef EIGEN_SPECIALFUNCTIONS_ARRAYAPI_H
     12 #define EIGEN_SPECIALFUNCTIONS_ARRAYAPI_H
     13 
     14 namespace Eigen {
     15 
     16 /** \cpp11 \returns an expression of the coefficient-wise igamma(\a a, \a x) to the given arrays.
     17   *
     18   * This function computes the coefficient-wise incomplete gamma function.
     19   *
     20   * \note This function supports only float and double scalar types in c++11 mode. To support other scalar types,
     21   * or float/double in non c++11 mode, the user has to provide implementations of igammac(T,T) for any scalar
     22   * type T to be supported.
     23   *
     24   * \sa Eigen::igammac(), Eigen::lgamma()
     25   */
     26 template<typename Derived,typename ExponentDerived>
     27 EIGEN_STRONG_INLINE const Eigen::CwiseBinaryOp<Eigen::internal::scalar_igamma_op<typename Derived::Scalar>, const Derived, const ExponentDerived>
     28 igamma(const Eigen::ArrayBase<Derived>& a, const Eigen::ArrayBase<ExponentDerived>& x)
     29 {
     30   return Eigen::CwiseBinaryOp<Eigen::internal::scalar_igamma_op<typename Derived::Scalar>, const Derived, const ExponentDerived>(
     31     a.derived(),
     32     x.derived()
     33   );
     34 }
     35 
     36 /** \cpp11 \returns an expression of the coefficient-wise igamma_der_a(\a a, \a x) to the given arrays.
     37   *
     38   * This function computes the coefficient-wise derivative of the incomplete
     39   * gamma function with respect to the parameter a.
     40   *
     41   * \note This function supports only float and double scalar types in c++11
     42   * mode. To support other scalar types,
     43   * or float/double in non c++11 mode, the user has to provide implementations
     44   * of igamma_der_a(T,T) for any scalar
     45   * type T to be supported.
     46   *
     47   * \sa Eigen::igamma(), Eigen::lgamma()
     48   */
     49 template <typename Derived, typename ExponentDerived>
     50 EIGEN_STRONG_INLINE const Eigen::CwiseBinaryOp<Eigen::internal::scalar_igamma_der_a_op<typename Derived::Scalar>, const Derived, const ExponentDerived>
     51 igamma_der_a(const Eigen::ArrayBase<Derived>& a, const Eigen::ArrayBase<ExponentDerived>& x) {
     52   return Eigen::CwiseBinaryOp<Eigen::internal::scalar_igamma_der_a_op<typename Derived::Scalar>, const Derived, const ExponentDerived>(
     53     a.derived(),
     54     x.derived());
     55 }
     56 
     57 /** \cpp11 \returns an expression of the coefficient-wise gamma_sample_der_alpha(\a alpha, \a sample) to the given arrays.
     58   *
     59   * This function computes the coefficient-wise derivative of the sample
     60   * of a Gamma(alpha, 1) random variable with respect to the parameter alpha.
     61   *
     62   * \note This function supports only float and double scalar types in c++11
     63   * mode. To support other scalar types,
     64   * or float/double in non c++11 mode, the user has to provide implementations
     65   * of gamma_sample_der_alpha(T,T) for any scalar
     66   * type T to be supported.
     67   *
     68   * \sa Eigen::igamma(), Eigen::lgamma()
     69   */
     70 template <typename AlphaDerived, typename SampleDerived>
     71 EIGEN_STRONG_INLINE const Eigen::CwiseBinaryOp<Eigen::internal::scalar_gamma_sample_der_alpha_op<typename AlphaDerived::Scalar>, const AlphaDerived, const SampleDerived>
     72 gamma_sample_der_alpha(const Eigen::ArrayBase<AlphaDerived>& alpha, const Eigen::ArrayBase<SampleDerived>& sample) {
     73   return Eigen::CwiseBinaryOp<Eigen::internal::scalar_gamma_sample_der_alpha_op<typename AlphaDerived::Scalar>, const AlphaDerived, const SampleDerived>(
     74       alpha.derived(),
     75       sample.derived());
     76 }
     77 
     78 /** \cpp11 \returns an expression of the coefficient-wise igammac(\a a, \a x) to the given arrays.
     79   *
     80   * This function computes the coefficient-wise complementary incomplete gamma function.
     81   *
     82   * \note This function supports only float and double scalar types in c++11 mode. To support other scalar types,
     83   * or float/double in non c++11 mode, the user has to provide implementations of igammac(T,T) for any scalar
     84   * type T to be supported.
     85   *
     86   * \sa Eigen::igamma(), Eigen::lgamma()
     87   */
     88 template<typename Derived,typename ExponentDerived>
     89 EIGEN_STRONG_INLINE const Eigen::CwiseBinaryOp<Eigen::internal::scalar_igammac_op<typename Derived::Scalar>, const Derived, const ExponentDerived>
     90 igammac(const Eigen::ArrayBase<Derived>& a, const Eigen::ArrayBase<ExponentDerived>& x)
     91 {
     92   return Eigen::CwiseBinaryOp<Eigen::internal::scalar_igammac_op<typename Derived::Scalar>, const Derived, const ExponentDerived>(
     93     a.derived(),
     94     x.derived()
     95   );
     96 }
     97 
     98 /** \cpp11 \returns an expression of the coefficient-wise polygamma(\a n, \a x) to the given arrays.
     99   *
    100   * It returns the \a n -th derivative of the digamma(psi) evaluated at \c x.
    101   *
    102   * \note This function supports only float and double scalar types in c++11 mode. To support other scalar types,
    103   * or float/double in non c++11 mode, the user has to provide implementations of polygamma(T,T) for any scalar
    104   * type T to be supported.
    105   *
    106   * \sa Eigen::digamma()
    107   */
    108 // * \warning Be careful with the order of the parameters: x.polygamma(n) is equivalent to polygamma(n,x)
    109 // * \sa ArrayBase::polygamma()
    110 template<typename DerivedN,typename DerivedX>
    111 EIGEN_STRONG_INLINE const Eigen::CwiseBinaryOp<Eigen::internal::scalar_polygamma_op<typename DerivedX::Scalar>, const DerivedN, const DerivedX>
    112 polygamma(const Eigen::ArrayBase<DerivedN>& n, const Eigen::ArrayBase<DerivedX>& x)
    113 {
    114   return Eigen::CwiseBinaryOp<Eigen::internal::scalar_polygamma_op<typename DerivedX::Scalar>, const DerivedN, const DerivedX>(
    115     n.derived(),
    116     x.derived()
    117   );
    118 }
    119 
    120 /** \cpp11 \returns an expression of the coefficient-wise betainc(\a x, \a a, \a b) to the given arrays.
    121   *
    122   * This function computes the regularized incomplete beta function (integral).
    123   *
    124   * \note This function supports only float and double scalar types in c++11 mode. To support other scalar types,
    125   * or float/double in non c++11 mode, the user has to provide implementations of betainc(T,T,T) for any scalar
    126   * type T to be supported.
    127   *
    128   * \sa Eigen::betainc(), Eigen::lgamma()
    129   */
    130 template<typename ArgADerived, typename ArgBDerived, typename ArgXDerived>
    131 EIGEN_STRONG_INLINE const Eigen::CwiseTernaryOp<Eigen::internal::scalar_betainc_op<typename ArgXDerived::Scalar>, const ArgADerived, const ArgBDerived, const ArgXDerived>
    132 betainc(const Eigen::ArrayBase<ArgADerived>& a, const Eigen::ArrayBase<ArgBDerived>& b, const Eigen::ArrayBase<ArgXDerived>& x)
    133 {
    134   return Eigen::CwiseTernaryOp<Eigen::internal::scalar_betainc_op<typename ArgXDerived::Scalar>, const ArgADerived, const ArgBDerived, const ArgXDerived>(
    135     a.derived(),
    136     b.derived(),
    137     x.derived()
    138   );
    139 }
    140 
    141 
    142 /** \returns an expression of the coefficient-wise zeta(\a x, \a q) to the given arrays.
    143   *
    144   * It returns the Riemann zeta function of two arguments \a x and \a q:
    145   *
    146   * \param x is the exponent, it must be > 1
    147   * \param q is the shift, it must be > 0
    148   *
    149   * \note This function supports only float and double scalar types. To support other scalar types, the user has
    150   * to provide implementations of zeta(T,T) for any scalar type T to be supported.
    151   *
    152   * \sa ArrayBase::zeta()
    153   */
    154 template<typename DerivedX,typename DerivedQ>
    155 EIGEN_STRONG_INLINE const Eigen::CwiseBinaryOp<Eigen::internal::scalar_zeta_op<typename DerivedX::Scalar>, const DerivedX, const DerivedQ>
    156 zeta(const Eigen::ArrayBase<DerivedX>& x, const Eigen::ArrayBase<DerivedQ>& q)
    157 {
    158   return Eigen::CwiseBinaryOp<Eigen::internal::scalar_zeta_op<typename DerivedX::Scalar>, const DerivedX, const DerivedQ>(
    159     x.derived(),
    160     q.derived()
    161   );
    162 }
    163 
    164 
    165 } // end namespace Eigen
    166 
    167 #endif // EIGEN_SPECIALFUNCTIONS_ARRAYAPI_H