Automatic Differentiation
 
Loading...
Searching...
No Matches
as_column_vector_or_scalar.hpp
Go to the documentation of this file.
1#ifndef STAN_MATH_PRIM_FUN_AS_COLUMN_VECTOR_OR_SCALAR_HPP
2#define STAN_MATH_PRIM_FUN_AS_COLUMN_VECTOR_OR_SCALAR_HPP
3
6#include <vector>
7
8namespace stan {
9namespace math {
10namespace internal {
11template <typename T, typename S, typename Enable>
12class empty_broadcast_array;
13}
21template <typename T, require_stan_scalar_t<T>* = nullptr>
22inline T as_column_vector_or_scalar(const T& a) {
23 return a;
24}
25
31template <typename T, typename S>
34
43template <typename T, require_eigen_col_vector_t<T>* = nullptr>
44inline T&& as_column_vector_or_scalar(T&& a) {
45 return std::forward<T>(a);
46}
47
57template <typename T, require_eigen_row_vector_t<T>* = nullptr,
58 require_not_eigen_col_vector_t<T>* = nullptr>
59inline auto as_column_vector_or_scalar(T&& a) {
60 return make_holder([](auto&& x) { return x.transpose(); },
61 std::forward<T>(a));
62}
63
78template <typename T, require_std_vector_t<T>* = nullptr>
79inline auto as_column_vector_or_scalar(T&& a) {
80 using plain_vector = Eigen::Matrix<value_type_t<T>, Eigen::Dynamic, 1>;
81 using optionally_const_vector
82 = std::conditional_t<std::is_const<std::remove_reference_t<T>>::value,
83 const plain_vector, plain_vector>;
84
85 using T_map = Eigen::Map<optionally_const_vector>;
86 return make_holder(
87 [](auto&& x) { return T_map(x.data(), x.size()).array().matrix(); },
88 std::forward<T>(a));
89}
90
91} // namespace math
92} // namespace stan
93
94#endif
auto as_column_vector_or_scalar(T &&a)
as_column_vector_or_scalar of a kernel generator expression.
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 ...