Automatic Differentiation
 
Loading...
Searching...
No Matches
as_array_or_scalar.hpp
Go to the documentation of this file.
1#ifndef STAN_MATH_PRIM_FUN_AS_ARRAY_OR_SCALAR_HPP
2#define STAN_MATH_PRIM_FUN_AS_ARRAY_OR_SCALAR_HPP
3
6#include <vector>
7
8namespace stan {
9namespace math {
10
18template <typename T, require_stan_scalar_t<T>* = nullptr>
19inline T as_array_or_scalar(T&& v) {
20 return std::forward<T>(v);
21}
22
30template <typename T, require_stan_scalar_t<T>* = nullptr>
31inline T& as_array_or_scalar(T& v) {
32 return v;
33}
34
42template <typename T, require_eigen_array_t<T>* = nullptr>
43inline T as_array_or_scalar(T&& v) {
44 return std::forward<T>(v);
45}
46
54template <typename T, typename = require_eigen_t<T>,
55 require_not_eigen_array_t<T>* = nullptr>
56inline auto as_array_or_scalar(T&& v) {
57 return make_holder([](auto&& x) { return x.array(); }, std::forward<T>(v));
58}
59
73template <typename T, require_std_vector_t<T>* = nullptr,
74 require_not_std_vector_t<value_type_t<T>>* = nullptr>
75inline auto as_array_or_scalar(T&& v) {
76 using arr_t = Eigen::Array<value_type_t<T>, Eigen::Dynamic, 1>;
77 using T_map = Eigen::Map<const arr_t>;
78 return make_holder(
79 [](auto&& x) { return T_map(x.data(), x.size()).matrix().array(); },
80 std::forward<T>(v));
81}
82
90template <typename T, require_std_vector_vt<is_std_vector, T>* = nullptr,
91 require_std_vector_vt<is_stan_scalar, value_type_t<T>>* = nullptr>
92inline auto as_array_or_scalar(T&& v) {
93 Eigen::Array<scalar_type_t<T>, -1, -1> ret(v.size(), v[0].size());
94 for (size_t i = 0; i < v.size(); ++i) {
95 ret.row(i) = Eigen::Map<const Eigen::Array<scalar_type_t<T>, 1, -1>>(
96 v[i].data(), v[i].size());
97 }
98 return ret;
99}
100
101} // namespace math
102} // namespace stan
103
104#endif
T as_array_or_scalar(T &&v)
Returns specified input value.
auto make_holder(F &&func, Args &&... args)
Calls given function with given arguments.
Definition holder.hpp:437
The lgamma implementation in stan-math is based on either the reentrant safe lgamma_r implementation ...