Loading [MathJax]/extensions/TeX/AMSmath.js
Automatic Differentiation
 
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
Loading...
Searching...
No Matches
ordered_constrain.hpp
Go to the documentation of this file.
1#ifndef STAN_MATH_PRIM_CONSTRAINT_ORDERED_CONSTRAIN_HPP
2#define STAN_MATH_PRIM_CONSTRAINT_ORDERED_CONSTRAIN_HPP
3
9#include <cmath>
10
11namespace stan {
12namespace math {
13
24template <typename EigVec, require_eigen_col_vector_t<EigVec>* = nullptr,
25 require_not_st_var<EigVec>* = nullptr>
26inline plain_type_t<EigVec> ordered_constrain(const EigVec& x) {
27 using std::exp;
28 Eigen::Index k = x.size();
30 const auto& x_ref = to_ref(x);
31 if (unlikely(k == 0)) {
32 return y;
33 }
34 y[0] = x_ref[0];
35 for (Eigen::Index i = 1; i < k; ++i) {
36 y.coeffRef(i) = y.coeff(i - 1) + exp(x_ref.coeff(i));
37 }
38 return y;
39}
40
55template <typename EigVec, typename Lp,
58inline auto ordered_constrain(const EigVec& x, Lp& lp) {
59 const auto& x_ref = to_ref(x);
60 if (likely(x.size() > 1)) {
61 lp += sum(x_ref.tail(x.size() - 1));
62 }
63 return ordered_constrain(x_ref);
64}
65
78template <typename T, require_std_vector_t<T>* = nullptr>
79inline auto ordered_constrain(const T& x) {
81 x, [](auto&& v) { return ordered_constrain(v); });
82}
83
99template <typename T, typename Lp, require_std_vector_t<T>* = nullptr,
100 require_convertible_t<return_type_t<T>, Lp>* = nullptr>
101inline auto ordered_constrain(const T& x, Lp& lp) {
103 x, [&lp](auto&& v) { return ordered_constrain(v, lp); });
104}
105
126template <bool Jacobian, typename T, typename Lp,
128inline auto ordered_constrain(const T& x, Lp& lp) {
129 if constexpr (Jacobian) {
130 return ordered_constrain(x, lp);
131 } else {
132 return ordered_constrain(x);
133 }
134}
135
136} // namespace math
137} // namespace stan
138
139#endif
#define likely(x)
#define unlikely(x)
require_t< std::is_convertible< std::decay_t< T >, std::decay_t< S > > > require_convertible_t
Require types T and S satisfies std::is_convertible.
require_t< is_eigen_col_vector< std::decay_t< T > > > require_eigen_col_vector_t
Require type satisfies is_eigen_col_vector.
Definition is_vector.hpp:98
ref_type_t< T && > to_ref(T &&a)
This evaluates expensive Eigen expressions.
Definition to_ref.hpp:17
auto sum(const std::vector< T > &m)
Return the sum of the entries of the specified standard vector.
Definition sum.hpp:23
plain_type_t< EigVec > ordered_constrain(const EigVec &x)
Return an increasing ordered vector derived from the specified free vector.
fvar< T > exp(const fvar< T > &x)
Definition exp.hpp:15
typename plain_type< T >::type plain_type_t
The lgamma implementation in stan-math is based on either the reentrant safe lgamma_r implementation ...