Automatic Differentiation
 
Loading...
Searching...
No Matches
count_vars.hpp
Go to the documentation of this file.
1#ifndef STAN_MATH_REV_CORE_COUNT_VARS_HPP
2#define STAN_MATH_REV_CORE_COUNT_VARS_HPP
3
7
8#include <utility>
9#include <vector>
10
11namespace stan {
12namespace math {
13
14namespace internal {
15template <typename VecVar, require_std_vector_vt<is_var, VecVar>* = nullptr,
16 typename... Pargs>
17inline size_t count_vars_impl(size_t count, VecVar&& x, Pargs&&... args);
18
19template <typename VecContainer,
20 require_std_vector_st<is_var, VecContainer>* = nullptr,
21 require_std_vector_vt<is_container, VecContainer>* = nullptr,
22 typename... Pargs>
23inline size_t count_vars_impl(size_t count, VecContainer&& x, Pargs&&... args);
24
25template <typename EigT, require_eigen_vt<is_var, EigT>* = nullptr,
26 typename... Pargs>
27inline size_t count_vars_impl(size_t count, EigT&& x, Pargs&&... args);
28
29template <typename... Pargs>
30inline size_t count_vars_impl(size_t count, const var& x, Pargs&&... args);
31
32template <typename Arith, require_arithmetic_t<scalar_type_t<Arith>>* = nullptr,
33 typename... Pargs>
34inline size_t count_vars_impl(size_t count, Arith& x, Pargs&&... args);
35
36template <typename Tuple, require_tuple_t<Tuple>* = nullptr, typename... Pargs>
37inline size_t count_vars_impl(size_t count, Tuple&& x, Pargs&&... args);
38
39inline size_t count_vars_impl(size_t count);
53template <typename VecVar, require_std_vector_vt<is_var, VecVar>*,
54 typename... Pargs>
55inline size_t count_vars_impl(size_t count, VecVar&& x, Pargs&&... args) {
56 return count_vars_impl(count + x.size(), std::forward<Pargs>(args)...);
57}
58
72template <typename VecContainer, require_std_vector_st<is_var, VecContainer>*,
73 require_std_vector_vt<is_container, VecContainer>*, typename... Pargs>
74inline size_t count_vars_impl(size_t count, VecContainer&& x, Pargs&&... args) {
75 for (auto&& x_iter : x) {
76 count = count_vars_impl(count, x_iter);
77 }
78 return count_vars_impl(count, std::forward<Pargs>(args)...);
79}
80
94template <typename EigT, require_eigen_vt<is_var, EigT>*, typename... Pargs>
95inline size_t count_vars_impl(size_t count, EigT&& x, Pargs&&... args) {
96 return count_vars_impl(count + x.size(), std::forward<Pargs>(args)...);
97}
98
110template <typename... Pargs>
111inline size_t count_vars_impl(size_t count, const var& x, Pargs&&... args) {
112 return count_vars_impl(count + 1, std::forward<Pargs>(args)...);
113}
114
129template <typename Arith, require_arithmetic_t<scalar_type_t<Arith>>*,
130 typename... Pargs>
131inline size_t count_vars_impl(size_t count, Arith& x, Pargs&&... args) {
132 return count_vars_impl(count, std::forward<Pargs>(args)...);
133}
134
135inline size_t count_vars_impl(size_t count, std::basic_ostream<char>*&) {
136 return count;
137}
138
150template <typename Tuple, require_tuple_t<Tuple>*, typename... Pargs>
151inline size_t count_vars_impl(size_t count, Tuple&& x, Pargs&&... args) {
152 count = stan::math::apply(
153 [count](auto&&... tuple_args) {
154 return count_vars_impl(count, tuple_args...);
155 },
156 std::forward<Tuple>(x));
157 return count_vars_impl(count, std::forward<Pargs>(args)...);
158}
159
163inline size_t count_vars_impl(size_t count) { return count; }
164
165} // namespace internal
166
173template <typename... Pargs>
174inline size_t count_vars(Pargs&&... args) {
175 return internal::count_vars_impl(0, std::forward<Pargs>(args)...);
176}
177
178} // namespace math
179} // namespace stan
180
181#endif
size_t count_vars_impl(size_t count, VecVar &&x, Pargs &&... args)
Count the number of vars in x (a std::vector of vars), add it to the running total,...
size_t count_vars(Pargs &&... args)
Count the number of vars in the input argument list.
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 ...