Automatic Differentiation
 
Loading...
Searching...
No Matches
save_varis.hpp
Go to the documentation of this file.
1#ifndef STAN_MATH_REV_CORE_SAVE_VARIS_HPP
2#define STAN_MATH_REV_CORE_SAVE_VARIS_HPP
3
9
10#include <utility>
11#include <vector>
12
13namespace stan {
14namespace math {
15
16template <typename... Pargs>
17inline vari** save_varis(vari** dest, const var& x, Pargs&&... args);
18
19template <typename VarVec, require_std_vector_vt<is_var, VarVec>* = nullptr,
20 typename... Pargs>
21inline vari** save_varis(vari** dest, VarVec&& x, Pargs&&... args);
22
23template <typename VecContainer,
24 require_std_vector_st<is_var, VecContainer>* = nullptr,
25 require_std_vector_vt<is_container, VecContainer>* = nullptr,
26 typename... Pargs>
27inline vari** save_varis(vari** dest, VecContainer&& x, Pargs&&... args);
28
29template <typename EigT, require_eigen_vt<is_var, EigT>* = nullptr,
30 typename... Pargs>
31inline vari** save_varis(vari** dest, EigT&& x, Pargs&&... args);
32
33template <typename Arith, require_st_arithmetic<Arith>* = nullptr,
34 typename... Pargs>
35inline vari** save_varis(vari** dest, Arith&& x, Pargs&&... args);
36
37template <typename Tuple, require_tuple_t<Tuple>* = nullptr, typename... Pargs>
38inline vari** save_varis(vari** dest, Tuple&& x, Pargs&&... args);
39
40inline vari** save_varis(vari** dest);
41
54template <typename... Pargs>
55inline vari** save_varis(vari** dest, const var& x, Pargs&&... args) {
56 *dest = x.vi_;
57 return save_varis(dest + 1, std::forward<Pargs>(args)...);
58}
59
73template <typename VarVec, require_std_vector_vt<is_var, VarVec>*,
74 typename... Pargs>
75inline vari** save_varis(vari** dest, VarVec&& x, Pargs&&... args) {
76 for (int i = 0; i < x.size(); ++i) {
77 dest[i] = x[i].vi_;
78 }
79 return save_varis(dest + x.size(), std::forward<Pargs>(args)...);
80}
81
95template <typename VecContainer, require_std_vector_st<is_var, VecContainer>*,
96 require_std_vector_vt<is_container, VecContainer>*, typename... Pargs>
97inline vari** save_varis(vari** dest, VecContainer&& x, Pargs&&... args) {
98 for (size_t i = 0; i < x.size(); ++i) {
99 dest = save_varis(dest, x[i]);
100 }
101 return save_varis(dest, std::forward<Pargs>(args)...);
102}
103
117template <typename EigT, require_eigen_vt<is_var, EigT>*, typename... Pargs>
118inline vari** save_varis(vari** dest, EigT&& x, Pargs&&... args) {
119 for (int i = 0; i < x.size(); ++i) {
120 dest[i] = x.coeff(i).vi_;
121 }
122 return save_varis(dest + x.size(), std::forward<Pargs>(args)...);
123}
124
138template <typename Arith, require_st_arithmetic<Arith>*, typename... Pargs>
139inline vari** save_varis(vari** dest, Arith&& x, Pargs&&... args) {
140 return save_varis(dest, std::forward<Pargs>(args)...);
141}
142
154template <typename Tuple, require_tuple_t<Tuple>*, typename... Pargs>
155inline vari** save_varis(vari** dest, Tuple&& x, Pargs&&... args) {
156 dest = stan::math::apply(
157 [dest](auto&&... tuple_args) { return save_varis(dest, tuple_args...); },
158 std::forward<Tuple>(x));
159 return save_varis(dest, std::forward<Pargs>(args)...);
160}
161
167inline vari** save_varis(vari** dest) { return dest; }
168
169} // namespace math
170} // namespace stan
171
172#endif
vari_value< double > vari
Definition vari.hpp:197
vari ** save_varis(vari **dest, const var &x, Pargs &&... args)
Save the vari pointer in x into the memory pointed to by dest, increment the dest storage pointer,...
var_value< double > var
Definition var.hpp:1187
constexpr decltype(auto) apply(F &&f, Tuple &&t, PreArgs &&... pre_args)
Definition apply.hpp:51
The lgamma implementation in stan-math is based on either the reentrant safe lgamma_r implementation ...