Automatic Differentiation
 
Loading...
Searching...
No Matches
pow.hpp
Go to the documentation of this file.
1#ifndef STAN_MATH_FWD_FUN_POW_HPP
2#define STAN_MATH_FWD_FUN_POW_HPP
3
13#include <cmath>
14#include <complex>
15#include <type_traits>
16
17namespace stan {
18namespace math {
19/*
20 *
21 * @tparam T1 Either an `fvar`, `arithmetic`, or `complex` type with an inner
22 * `fvar` or `arithmetic` type.
23 * @tparam T2 Either a `fvar`, `arithmetic`, or `complex` type with an inner
24 * `fvar` or `arithmetic` type.
25 * @param x1 Base variable.
26 * @param x2 Exponent variable.
27 * @return Base raised to the exponent.
28 */
29template <typename T1, typename T2,
30 require_any_fvar_t<base_type_t<T1>, base_type_t<T2>>* = nullptr,
31 require_all_stan_scalar_t<T1, T2>* = nullptr>
32inline auto pow(const T1& x1, const T2& x2) {
34 return internal::complex_pow(x1, x2);
35 } else if constexpr (is_fvar<T1>::value && is_fvar<T2>::value) {
36 auto pow_x1_x2(stan::math::pow(x1.val_, x2.val_));
37 return T1(pow_x1_x2,
38 (x2.d_ * stan::math::log(x1.val_) + x2.val_ * x1.d_ / x1.val_)
39 * pow_x1_x2);
40 } else if constexpr (is_fvar<T2>::value) {
41 auto u = stan::math::pow(x1, x2.val_);
42 return T2(u, x2.d_ * stan::math::log(x1) * u);
43 } else {
44 if (x2 == -2) {
45 return stan::math::inv_square(x1);
46 } else if (x2 == -1) {
47 return stan::math::inv(x1);
48 } else if (x2 == -0.5) {
49 return stan::math::inv_sqrt(x1);
50 } else if (x2 == 0.5) {
51 return stan::math::sqrt(x1);
52 } else if (x2 == 1.0) {
53 return x1;
54 } else if (x2 == 2.0) {
55 return stan::math::square(x1);
56 }
57 return T1(stan::math::pow(x1.val_, x2),
58 x1.d_ * x2 * stan::math::pow(x1.val_, x2 - 1));
59 }
60}
61
73template <typename T1, typename T2, require_any_container_t<T1, T2>* = nullptr,
74 require_all_not_matrix_st<is_var, T1, T2>* = nullptr,
75 require_any_fvar_t<base_type_t<T1>, base_type_t<T2>>* = nullptr>
76inline auto pow(const T1& a, const T2& b) {
78 a, b, [](const auto& c, const auto& d) { return stan::math::pow(c, d); });
79}
80
81} // namespace math
82} // namespace stan
83#endif
complex_return_t< U, V > complex_pow(const U &x, const V &y)
Return the first argument raised to the power of the second argument.
Definition pow.hpp:27
fvar< T > inv_square(const fvar< T > &x)
auto pow(const T1 &x1, const T2 &x2)
Definition pow.hpp:32
fvar< T > log(const fvar< T > &x)
Definition log.hpp:18
fvar< T > sqrt(const fvar< T > &x)
Definition sqrt.hpp:18
auto apply_scalar_binary(const T1 &x, const T2 &y, const F &f)
Base template function for vectorization of binary scalar functions defined by applying a functor to ...
fvar< T > inv_sqrt(const fvar< T > &x)
Definition inv_sqrt.hpp:14
fvar< T > inv(const fvar< T > &x)
Definition inv.hpp:13
fvar< T > square(const fvar< T > &x)
Definition square.hpp:12
The lgamma implementation in stan-math is based on either the reentrant safe lgamma_r implementation ...
If T is a complex type (that is, an instance of std::complex) or a cv-qualified version thereof,...
Defines a static member function type which is defined to be false as the primitive scalar types cann...
Definition is_fvar.hpp:15