Loading [MathJax]/extensions/tex2jax.js
Automatic Differentiation
 
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
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
36inline size_t count_vars_impl(size_t count);
50template <typename VecVar, require_std_vector_vt<is_var, VecVar>*,
51 typename... Pargs>
52inline size_t count_vars_impl(size_t count, VecVar&& x, Pargs&&... args) {
53 return count_vars_impl(count + x.size(), std::forward<Pargs>(args)...);
54}
55
69template <typename VecContainer, require_std_vector_st<is_var, VecContainer>*,
70 require_std_vector_vt<is_container, VecContainer>*, typename... Pargs>
71inline size_t count_vars_impl(size_t count, VecContainer&& x, Pargs&&... args) {
72 for (auto&& x_iter : x) {
73 count = count_vars_impl(count, x_iter);
74 }
75 return count_vars_impl(count, std::forward<Pargs>(args)...);
76}
77
91template <typename EigT, require_eigen_vt<is_var, EigT>*, typename... Pargs>
92inline size_t count_vars_impl(size_t count, EigT&& x, Pargs&&... args) {
93 return count_vars_impl(count + x.size(), std::forward<Pargs>(args)...);
94}
95
107template <typename... Pargs>
108inline size_t count_vars_impl(size_t count, const var& x, Pargs&&... args) {
109 return count_vars_impl(count + 1, std::forward<Pargs>(args)...);
110}
111
126template <typename Arith, require_arithmetic_t<scalar_type_t<Arith>>*,
127 typename... Pargs>
128inline size_t count_vars_impl(size_t count, Arith& x, Pargs&&... args) {
129 return count_vars_impl(count, std::forward<Pargs>(args)...);
130}
131
132inline size_t count_vars_impl(size_t count, std::basic_ostream<char>*&) {
133 return count;
134}
138inline size_t count_vars_impl(size_t count) { return count; }
139
140template <typename... Pargs, typename... Args>
141inline size_t count_vars_impl(std::size_t count,
142 const std::tuple<Pargs...>& arg, Args&&... args) {
143 return count_vars_impl(
145 [count](auto&&... inner_args) {
146 return (count_vars_impl(0, inner_args) + ... + count);
147 },
148 arg),
149 std::forward<Args>(args)...);
150}
151
152} // namespace internal
153
160template <typename... Pargs>
161inline size_t count_vars(Pargs&&... args) {
162 return internal::count_vars_impl(0, std::forward<Pargs>(args)...);
163}
164
165} // namespace math
166} // namespace stan
167
168#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,...
fvar< T > arg(const std::complex< fvar< T > > &z)
Return the phase angle of the complex argument.
Definition arg.hpp:19
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 ...