// SPDX-FileCopyrightText: The Eigen Authors
// SPDX-License-Identifier: MPL-2.0

typedef CwiseUnaryOp<internal::scalar_abs_op<Scalar>, const Derived> AbsReturnType;
typedef CwiseUnaryOp<internal::scalar_arg_op<Scalar>, const Derived> ArgReturnType;
typedef CwiseUnaryOp<internal::scalar_carg_op<Scalar>, const Derived> CArgReturnType;
typedef CwiseUnaryOp<internal::scalar_abs2_op<Scalar>, const Derived> Abs2ReturnType;
typedef CwiseUnaryOp<internal::scalar_sqrt_op<Scalar>, const Derived> SqrtReturnType;
typedef CwiseUnaryOp<internal::scalar_cbrt_op<Scalar>, const Derived> CbrtReturnType;
typedef CwiseUnaryOp<internal::scalar_rsqrt_op<Scalar>, const Derived> RsqrtReturnType;
typedef CwiseUnaryOp<internal::scalar_sign_op<Scalar>, const Derived> SignReturnType;
typedef CwiseUnaryOp<internal::scalar_inverse_op<Scalar>, const Derived> InverseReturnType;
typedef CwiseUnaryOp<internal::scalar_boolean_not_op<Scalar>, const Derived> BooleanNotReturnType;
typedef CwiseUnaryOp<internal::scalar_bitwise_not_op<Scalar>, const Derived> BitwiseNotReturnType;

typedef CwiseUnaryOp<internal::scalar_exp_op<Scalar>, const Derived> ExpReturnType;
typedef CwiseUnaryOp<internal::scalar_exp2_op<Scalar>, const Derived> Exp2ReturnType;
typedef CwiseUnaryOp<internal::scalar_expm1_op<Scalar>, const Derived> Expm1ReturnType;
typedef CwiseUnaryOp<internal::scalar_log_op<Scalar>, const Derived> LogReturnType;
typedef CwiseUnaryOp<internal::scalar_log1p_op<Scalar>, const Derived> Log1pReturnType;
typedef CwiseUnaryOp<internal::scalar_log10_op<Scalar>, const Derived> Log10ReturnType;
typedef CwiseUnaryOp<internal::scalar_log2_op<Scalar>, const Derived> Log2ReturnType;
typedef CwiseUnaryOp<internal::scalar_cos_op<Scalar>, const Derived> CosReturnType;
typedef CwiseUnaryOp<internal::scalar_sin_op<Scalar>, const Derived> SinReturnType;
typedef CwiseUnaryOp<internal::scalar_tan_op<Scalar>, const Derived> TanReturnType;
typedef CwiseUnaryOp<internal::scalar_acos_op<Scalar>, const Derived> AcosReturnType;
typedef CwiseUnaryOp<internal::scalar_asin_op<Scalar>, const Derived> AsinReturnType;
typedef CwiseUnaryOp<internal::scalar_atan_op<Scalar>, const Derived> AtanReturnType;
typedef CwiseUnaryOp<internal::scalar_tanh_op<Scalar>, const Derived> TanhReturnType;
typedef CwiseUnaryOp<internal::scalar_logistic_op<Scalar>, const Derived> LogisticReturnType;
typedef CwiseUnaryOp<internal::scalar_sinh_op<Scalar>, const Derived> SinhReturnType;
typedef CwiseUnaryOp<internal::scalar_atanh_op<Scalar>, const Derived> AtanhReturnType;
typedef CwiseUnaryOp<internal::scalar_asinh_op<Scalar>, const Derived> AsinhReturnType;
typedef CwiseUnaryOp<internal::scalar_acosh_op<Scalar>, const Derived> AcoshReturnType;
typedef CwiseUnaryOp<internal::scalar_cosh_op<Scalar>, const Derived> CoshReturnType;
typedef CwiseUnaryOp<internal::scalar_square_op<Scalar>, const Derived> SquareReturnType;
typedef CwiseUnaryOp<internal::scalar_cube_op<Scalar>, const Derived> CubeReturnType;
typedef CwiseUnaryOp<internal::scalar_round_op<Scalar>, const Derived> RoundReturnType;
typedef CwiseUnaryOp<internal::scalar_rint_op<Scalar>, const Derived> RintReturnType;
typedef CwiseUnaryOp<internal::scalar_floor_op<Scalar>, const Derived> FloorReturnType;
typedef CwiseUnaryOp<internal::scalar_ceil_op<Scalar>, const Derived> CeilReturnType;
typedef CwiseUnaryOp<internal::scalar_trunc_op<Scalar>, const Derived> TruncReturnType;
typedef CwiseUnaryOp<internal::scalar_isnan_op<Scalar>, const Derived> IsNaNReturnType;
typedef CwiseUnaryOp<internal::scalar_isinf_op<Scalar>, const Derived> IsInfReturnType;
typedef CwiseUnaryOp<internal::scalar_isfinite_op<Scalar>, const Derived> IsFiniteReturnType;
typedef CwiseUnaryOp<internal::scalar_isfinite_op<Scalar, true>, const Derived> IsFiniteTypedReturnType;

/** \returns an expression of the coefficient-wise absolute value of \c *this
 *
 * Example: \include Cwise_abs.cpp
 * Output: \verbinclude Cwise_abs.out
 *
 * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_abs">Math functions</a>, abs2()
 */
EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE const AbsReturnType abs() const { return AbsReturnType(derived()); }

/** \returns an expression of the coefficient-wise phase angle of \c *this
 *
 * Example: \include Cwise_arg.cpp
 * Output: \verbinclude Cwise_arg.out
 *
 * \sa abs()
 */
EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE const ArgReturnType arg() const { return ArgReturnType(derived()); }

EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE const CArgReturnType carg() const { return CArgReturnType(derived()); }

/** \returns an expression of the coefficient-wise squared absolute value of \c *this
 *
 * Example: \include Cwise_abs2.cpp
 * Output: \verbinclude Cwise_abs2.out
 *
 * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_abs2">Math functions</a>, abs(), square()
 */
EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE const Abs2ReturnType abs2() const { return Abs2ReturnType(derived()); }

/** \returns an expression of the coefficient-wise exponential of *this.
 *
 * This function computes the coefficient-wise exponential. The function MatrixBase::exp() in the
 * unsupported module MatrixFunctions computes the matrix exponential.
 *
 * Example: \include Cwise_exp.cpp
 * Output: \verbinclude Cwise_exp.out
 *
 * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_exp">Math functions</a>, exp2(), pow(), log(), sin(),
 * cos()
 */
EIGEN_DEVICE_FUNC constexpr inline const ExpReturnType exp() const { return ExpReturnType(derived()); }

/** \returns an expression of the coefficient-wise exponential of *this.
 *
 * This function computes the coefficient-wise base2 exponential, i.e. 2^x.
 *
 * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_exp">Math functions</a>, exp(), pow(), log(), sin(),
 * cos()
 */
EIGEN_DEVICE_FUNC constexpr inline const Exp2ReturnType exp2() const { return Exp2ReturnType(derived()); }

/** \returns an expression of the coefficient-wise exponential of *this minus 1.
 *
 * In exact arithmetic, \c x.expm1() is equivalent to \c x.exp() - 1,
 * however, with finite precision, this function is much more accurate when \c x is close to zero.
 *
 * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_expm1">Math functions</a>, exp()
 */
EIGEN_DEVICE_FUNC constexpr inline const Expm1ReturnType expm1() const { return Expm1ReturnType(derived()); }

/** \returns an expression of the coefficient-wise logarithm of *this.
 *
 * This function computes the coefficient-wise logarithm. The function MatrixBase::log() in the
 * unsupported module MatrixFunctions computes the matrix logarithm.
 *
 * Example: \include Cwise_log.cpp
 * Output: \verbinclude Cwise_log.out
 *
 * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_log">Math functions</a>, log()
 */
EIGEN_DEVICE_FUNC constexpr inline const LogReturnType log() const { return LogReturnType(derived()); }

/** \returns an expression of the coefficient-wise logarithm of 1 plus \c *this.
 *
 * In exact arithmetic, \c x.log() is equivalent to \c (x+1).log(),
 * however, with finite precision, this function is much more accurate when \c x is close to zero.
 *
 * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_log1p">Math functions</a>, log()
 */
EIGEN_DEVICE_FUNC constexpr inline const Log1pReturnType log1p() const { return Log1pReturnType(derived()); }

/** \returns an expression of the coefficient-wise base-10 logarithm of *this.
 *
 * This function computes the coefficient-wise base-10 logarithm.
 *
 * Example: \include Cwise_log10.cpp
 * Output: \verbinclude Cwise_log10.out
 *
 * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_log10">Math functions</a>, log()
 */
EIGEN_DEVICE_FUNC constexpr inline const Log10ReturnType log10() const { return Log10ReturnType(derived()); }

/** \returns an expression of the coefficient-wise base-2 logarithm of *this.
 *
 * This function computes the coefficient-wise base-2 logarithm.
 *
 */
EIGEN_DEVICE_FUNC constexpr inline const Log2ReturnType log2() const { return Log2ReturnType(derived()); }

/** \returns an expression of the coefficient-wise square root of *this.
 *
 * This function computes the coefficient-wise square root. The function MatrixBase::sqrt() in the
 * unsupported module MatrixFunctions computes the matrix square root.
 *
 * Example: \include Cwise_sqrt.cpp
 * Output: \verbinclude Cwise_sqrt.out
 *
 * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_sqrt">Math functions</a>, pow(), square(), cbrt()
 */
EIGEN_DEVICE_FUNC constexpr inline const SqrtReturnType sqrt() const { return SqrtReturnType(derived()); }

/** \returns an expression of the coefficient-wise cube root of *this.
 *
 * This function computes the coefficient-wise cube root.
 *
 * Example: \include Cwise_cbrt.cpp
 * Output: \verbinclude Cwise_cbrt.out
 *
 * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_cbrt">Math functions</a>, sqrt(), pow(), square()
 */
EIGEN_DEVICE_FUNC constexpr inline const CbrtReturnType cbrt() const { return CbrtReturnType(derived()); }

/** \returns an expression of the coefficient-wise inverse square root of *this.
 *
 * This function computes the coefficient-wise inverse square root.
 *
 * Example: \include Cwise_sqrt.cpp
 * Output: \verbinclude Cwise_sqrt.out
 *
 * \sa pow(), square()
 */
EIGEN_DEVICE_FUNC constexpr inline const RsqrtReturnType rsqrt() const { return RsqrtReturnType(derived()); }

/** \returns an expression of the coefficient-wise signum of *this.
 *
 * This function computes the coefficient-wise signum.
 *
 * Example: \include Cwise_sign.cpp
 * Output: \verbinclude Cwise_sign.out
 *
 * \sa pow(), square()
 */
EIGEN_DEVICE_FUNC constexpr inline const SignReturnType sign() const { return SignReturnType(derived()); }

/** \returns an expression of the coefficient-wise cosine of *this.
 *
 * This function computes the coefficient-wise cosine. The function MatrixBase::cos() in the
 * unsupported module MatrixFunctions computes the matrix cosine.
 *
 * Example: \include Cwise_cos.cpp
 * Output: \verbinclude Cwise_cos.out
 *
 * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_cos">Math functions</a>, sin(), acos()
 */
EIGEN_DEVICE_FUNC constexpr inline const CosReturnType cos() const { return CosReturnType(derived()); }

/** \returns an expression of the coefficient-wise sine of *this.
 *
 * This function computes the coefficient-wise sine. The function MatrixBase::sin() in the
 * unsupported module MatrixFunctions computes the matrix sine.
 *
 * Example: \include Cwise_sin.cpp
 * Output: \verbinclude Cwise_sin.out
 *
 * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_sin">Math functions</a>, cos(), asin()
 */
EIGEN_DEVICE_FUNC constexpr inline const SinReturnType sin() const { return SinReturnType(derived()); }

/** \returns an expression of the coefficient-wise tan of *this.
 *
 * Example: \include Cwise_tan.cpp
 * Output: \verbinclude Cwise_tan.out
 *
 * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_tan">Math functions</a>, cos(), sin()
 */
EIGEN_DEVICE_FUNC constexpr inline const TanReturnType tan() const { return TanReturnType(derived()); }

/** \returns an expression of the coefficient-wise arc tan of *this.
 *
 * Example: \include Cwise_atan.cpp
 * Output: \verbinclude Cwise_atan.out
 *
 * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_atan">Math functions</a>, tan(), asin(), acos()
 */
EIGEN_DEVICE_FUNC constexpr inline const AtanReturnType atan() const { return AtanReturnType(derived()); }

/** \returns an expression of the coefficient-wise arc cosine of *this.
 *
 * Example: \include Cwise_acos.cpp
 * Output: \verbinclude Cwise_acos.out
 *
 * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_acos">Math functions</a>, cos(), asin()
 */
EIGEN_DEVICE_FUNC constexpr inline const AcosReturnType acos() const { return AcosReturnType(derived()); }

/** \returns an expression of the coefficient-wise arc sine of *this.
 *
 * Example: \include Cwise_asin.cpp
 * Output: \verbinclude Cwise_asin.out
 *
 * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_asin">Math functions</a>, sin(), acos()
 */
EIGEN_DEVICE_FUNC constexpr inline const AsinReturnType asin() const { return AsinReturnType(derived()); }

/** \returns an expression of the coefficient-wise hyperbolic tan of *this.
 *
 * Example: \include Cwise_tanh.cpp
 * Output: \verbinclude Cwise_tanh.out
 *
 * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_tanh">Math functions</a>, tan(), sinh(), cosh()
 */
EIGEN_DEVICE_FUNC constexpr inline const TanhReturnType tanh() const { return TanhReturnType(derived()); }

/** \returns an expression of the coefficient-wise hyperbolic sin of *this.
 *
 * Example: \include Cwise_sinh.cpp
 * Output: \verbinclude Cwise_sinh.out
 *
 * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_sinh">Math functions</a>, sin(), tanh(), cosh()
 */
EIGEN_DEVICE_FUNC constexpr inline const SinhReturnType sinh() const { return SinhReturnType(derived()); }

/** \returns an expression of the coefficient-wise hyperbolic cos of *this.
 *
 * Example: \include Cwise_cosh.cpp
 * Output: \verbinclude Cwise_cosh.out
 *
 * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_cosh">Math functions</a>, tanh(), sinh(), cosh()
 */
EIGEN_DEVICE_FUNC constexpr inline const CoshReturnType cosh() const { return CoshReturnType(derived()); }

/** \returns an expression of the coefficient-wise inverse hyperbolic tan of *this.
 *
 * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_atanh">Math functions</a>, atanh(), asinh(), acosh()
 */
EIGEN_DEVICE_FUNC constexpr inline const AtanhReturnType atanh() const { return AtanhReturnType(derived()); }

/** \returns an expression of the coefficient-wise inverse hyperbolic sin of *this.
 *
 * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_asinh">Math functions</a>, atanh(), asinh(), acosh()
 */
EIGEN_DEVICE_FUNC constexpr inline const AsinhReturnType asinh() const { return AsinhReturnType(derived()); }

/** \returns an expression of the coefficient-wise inverse hyperbolic cos of *this.
 *
 * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_acosh">Math functions</a>, atanh(), asinh(), acosh()
 */
EIGEN_DEVICE_FUNC constexpr inline const AcoshReturnType acosh() const { return AcoshReturnType(derived()); }

/** \returns an expression of the coefficient-wise logistic of *this.
 */
EIGEN_DEVICE_FUNC constexpr inline const LogisticReturnType logistic() const { return LogisticReturnType(derived()); }

/** \returns an expression of the coefficient-wise inverse of *this.
 *
 * Example: \include Cwise_inverse.cpp
 * Output: \verbinclude Cwise_inverse.out
 *
 * \sa operator/(), operator*()
 */
EIGEN_DEVICE_FUNC constexpr inline const InverseReturnType inverse() const { return InverseReturnType(derived()); }

/** \returns an expression of the coefficient-wise square of *this.
 *
 * Example: \include Cwise_square.cpp
 * Output: \verbinclude Cwise_square.out
 *
 * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_squareE">Math functions</a>, abs2(), cube(), pow()
 */
EIGEN_DEVICE_FUNC constexpr inline const SquareReturnType square() const { return SquareReturnType(derived()); }

/** \returns an expression of the coefficient-wise cube of *this.
 *
 * Example: \include Cwise_cube.cpp
 * Output: \verbinclude Cwise_cube.out
 *
 * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_cube">Math functions</a>, square(), pow()
 */
EIGEN_DEVICE_FUNC constexpr inline const CubeReturnType cube() const { return CubeReturnType(derived()); }

/** \returns an expression of the coefficient-wise rint of *this.
 *
 * Example: \include Cwise_rint.cpp
 * Output: \verbinclude Cwise_rint.out
 *
 * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_rint">Math functions</a>, ceil(), floor()
 */
EIGEN_DEVICE_FUNC constexpr inline const RintReturnType rint() const { return RintReturnType(derived()); }

/** \returns an expression of the coefficient-wise round of *this.
 *
 * Example: \include Cwise_round.cpp
 * Output: \verbinclude Cwise_round.out
 *
 * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_round">Math functions</a>, ceil(), floor()
 */
EIGEN_DEVICE_FUNC constexpr inline const RoundReturnType round() const { return RoundReturnType(derived()); }

/** \returns an expression of the coefficient-wise floor of *this.
 *
 * Example: \include Cwise_floor.cpp
 * Output: \verbinclude Cwise_floor.out
 *
 * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_floor">Math functions</a>, ceil(), round()
 */
EIGEN_DEVICE_FUNC constexpr inline const FloorReturnType floor() const { return FloorReturnType(derived()); }

/** \returns an expression of the coefficient-wise ceil of *this.
 *
 * Example: \include Cwise_ceil.cpp
 * Output: \verbinclude Cwise_ceil.out
 *
 * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_ceil">Math functions</a>, floor(), round()
 */
EIGEN_DEVICE_FUNC constexpr inline const CeilReturnType ceil() const { return CeilReturnType(derived()); }

/** \returns an expression of the coefficient-wise truncation of *this.
 *
 * Example: \include Cwise_trunc.cpp
 * Output: \verbinclude Cwise_trunc.out
 *
 * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_trunc">Math functions</a>, floor(), round()
 */
EIGEN_DEVICE_FUNC constexpr inline const TruncReturnType trunc() const { return TruncReturnType(derived()); }

template <int N>
struct ShiftRightXpr {
  typedef CwiseUnaryOp<internal::scalar_shift_right_op<Scalar, N>, const Derived> Type;
};

/** \returns an expression of \c *this with the \a Scalar type arithmetically
 * shifted right by \a N bit positions.
 *
 * The template parameter \a N specifies the number of bit positions to shift.
 *
 * \sa shiftLeft()
 */
template <int N>
EIGEN_DEVICE_FUNC constexpr typename ShiftRightXpr<N>::Type shiftRight() const {
  return typename ShiftRightXpr<N>::Type(derived());
}

template <int N>
struct ShiftLeftXpr {
  typedef CwiseUnaryOp<internal::scalar_shift_left_op<Scalar, N>, const Derived> Type;
};

/** \returns an expression of \c *this with the \a Scalar type logically
 * shifted left by \a N bit positions.
 *
 * The template parameter \a N specifies the number of bit positions to shift.
 *
 * \sa shiftRight()
 */
template <int N>
EIGEN_DEVICE_FUNC constexpr typename ShiftLeftXpr<N>::Type shiftLeft() const {
  return typename ShiftLeftXpr<N>::Type(derived());
}

/** \returns an expression of the coefficient-wise isnan of *this.
 *
 * Example: \include Cwise_isNaN.cpp
 * Output: \verbinclude Cwise_isNaN.out
 *
 * \sa isfinite(), isinf()
 */
EIGEN_DEVICE_FUNC constexpr inline const IsNaNReturnType isNaN() const { return IsNaNReturnType(derived()); }

/** \returns an expression of the coefficient-wise isinf of *this.
 *
 * Example: \include Cwise_isInf.cpp
 * Output: \verbinclude Cwise_isInf.out
 *
 * \sa isnan(), isfinite()
 */
EIGEN_DEVICE_FUNC constexpr inline const IsInfReturnType isInf() const { return IsInfReturnType(derived()); }

/** \returns an expression of the coefficient-wise isfinite of *this.
 *
 * Example: \include Cwise_isFinite.cpp
 * Output: \verbinclude Cwise_isFinite.out
 *
 * \sa isnan(), isinf()
 */
EIGEN_DEVICE_FUNC constexpr inline const IsFiniteReturnType isFinite() const { return IsFiniteReturnType(derived()); }
EIGEN_DEVICE_FUNC constexpr inline const IsFiniteTypedReturnType isFiniteTyped() const {
  return IsFiniteTypedReturnType(derived());
}

/** \returns an expression of the coefficient-wise ! operator of *this
 *
 * Example: \include Cwise_boolean_not.cpp
 * Output: \verbinclude Cwise_boolean_not.out
 *
 * \sa operator!=()
 */
EIGEN_DEVICE_FUNC constexpr inline const BooleanNotReturnType operator!() const {
  return BooleanNotReturnType(derived());
}

/** \returns an expression of the bitwise ~ operator of *this
 */
EIGEN_DEVICE_FUNC constexpr inline const BitwiseNotReturnType operator~() const {
  return BitwiseNotReturnType(derived());
}

// --- SpecialFunctions module ---

typedef CwiseUnaryOp<internal::scalar_lgamma_op<Scalar>, const Derived> LgammaReturnType;
typedef CwiseUnaryOp<internal::scalar_digamma_op<Scalar>, const Derived> DigammaReturnType;
typedef CwiseUnaryOp<internal::scalar_erf_op<Scalar>, const Derived> ErfReturnType;
typedef CwiseUnaryOp<internal::scalar_erfc_op<Scalar>, const Derived> ErfcReturnType;
typedef CwiseUnaryOp<internal::scalar_ndtri_op<Scalar>, const Derived> NdtriReturnType;

/** \returns an expression of the coefficient-wise ln(|gamma(*this)|).
 *
 * \specialfunctions_module
 *
 * \note This function supports only float and double scalar types. To support other scalar types,
 * the user has to provide implementations of lgamma(T) for any scalar type T to be supported.
 *
 * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_lgamma">Math functions</a>, digamma()
 */
EIGEN_DEVICE_FUNC constexpr inline const LgammaReturnType lgamma() const { return LgammaReturnType(derived()); }

/** \returns an expression of the coefficient-wise digamma (psi, derivative of lgamma).
 *
 * \specialfunctions_module
 *
 * \note This function supports only float and double scalar types. To support other scalar types,
 * the user has to provide implementations of digamma(T) for any scalar
 * type T to be supported.
 *
 * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_digamma">Math functions</a>, Eigen::digamma(),
 * Eigen::polygamma(), lgamma()
 */
EIGEN_DEVICE_FUNC constexpr inline const DigammaReturnType digamma() const { return DigammaReturnType(derived()); }

/** \returns an expression of the coefficient-wise Gauss error
 * function of *this.
 *
 * \specialfunctions_module
 *
 * \note This function supports only float and double scalar types. To support other scalar types,
 * the user has to provide implementations of erf(T) for any scalar type T to be supported.
 *
 * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_erf">Math functions</a>, erfc()
 */
EIGEN_DEVICE_FUNC constexpr inline const ErfReturnType erf() const { return ErfReturnType(derived()); }

/** \returns an expression of the coefficient-wise Complementary error
 * function of *this.
 *
 * \specialfunctions_module
 *
 * \note This function supports only float and double scalar types. To support other scalar types,
 * the user has to provide implementations of erfc(T) for any scalar type T to be supported.
 *
 * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_erfc">Math functions</a>, erf()
 */
EIGEN_DEVICE_FUNC constexpr inline const ErfcReturnType erfc() const { return ErfcReturnType(derived()); }

/** \returns an expression of the coefficient-wise inverse of the CDF of the Normal distribution function
 * function of *this.
 *
 * \specialfunctions_module
 *
 * In other words, considering `x = ndtri(y)`, it returns the argument, x, for which the area under the
 * Gaussian probability density function (integrated from minus infinity to x) is equal to y.
 *
 * \note This function supports only float and double scalar types. To support other scalar types,
 * the user has to provide implementations of ndtri(T) for any scalar type T to be supported.
 *
 * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_ndtri">Math functions</a>
 */
EIGEN_DEVICE_FUNC constexpr inline const NdtriReturnType ndtri() const { return NdtriReturnType(derived()); }

template <typename ScalarExponent>
using UnaryPowReturnType =
    std::enable_if_t<internal::is_arithmetic<typename NumTraits<ScalarExponent>::Real>::value,
                     CwiseUnaryOp<internal::scalar_unary_pow_op<Scalar, ScalarExponent>, const Derived>>;

/** \returns an expression of the coefficients of \c *this raised to the constant power \a exponent
 *
 * \tparam ScalarExponent is the scalar type of \a exponent. It must be compatible with the scalar type
 *         of the given expression.
 * \param exponent the scalar exponent value.
 *
 * This function computes the coefficient-wise power. The function MatrixBase::pow() in the
 * unsupported module MatrixFunctions computes the matrix power.
 *
 * Example: \include Cwise_pow.cpp
 * Output: \verbinclude Cwise_pow.out
 *
 * \sa ArrayBase::pow(ArrayBase), square(), cube(), exp(), log()
 */
template <typename ScalarExponent>
EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE const UnaryPowReturnType<ScalarExponent> pow(
    const ScalarExponent& exponent) const {
  return UnaryPowReturnType<ScalarExponent>(derived(), internal::scalar_unary_pow_op<Scalar, ScalarExponent>(exponent));
}
