Automatic Differentiation
 
Loading...
Searching...
No Matches
lazy_select_evaluator.hpp
Go to the documentation of this file.
1#ifndef STAN_MATH_PRIM_META_LAZY_SELECT_EVALUATOR_HPP
2#define STAN_MATH_PRIM_META_LAZY_SELECT_EVALUATOR_HPP
3
5
6namespace stan {
7namespace math {
8namespace internal {
9
45template <typename TernaryOp, typename Arg1, typename Arg2, typename Arg3>
47 : Eigen::internal::evaluator_base<
48 Eigen::CwiseTernaryOp<TernaryOp, Arg1, Arg2, Arg3>> {
49 using XprType = Eigen::CwiseTernaryOp<TernaryOp, Arg1, Arg2, Arg3>;
50 using CoeffReturnType = typename XprType::CoeffReturnType;
51 using CondScalar = typename Arg3::Scalar;
52 enum {
54 = static_cast<int>(Eigen::internal::evaluator<Arg1>::CoeffReadCost)
55 + static_cast<int>(Eigen::internal::evaluator<Arg2>::CoeffReadCost)
56 + static_cast<int>(Eigen::internal::evaluator<Arg3>::CoeffReadCost)
57 + static_cast<int>(Eigen::internal::functor_traits<TernaryOp>::Cost),
58
59 Arg1Flags = Eigen::internal::evaluator<Arg1>::Flags,
60 Arg2Flags = Eigen::internal::evaluator<Arg2>::Flags,
61 Arg3Flags = Eigen::internal::evaluator<Arg3>::Flags,
63 = (static_cast<int>(Arg1Flags) & Eigen::RowMajorBit)
64 == (static_cast<int>(Arg2Flags) & Eigen::RowMajorBit)
65 && (static_cast<int>(Arg1Flags) & Eigen::RowMajorBit)
66 == (static_cast<int>(Arg3Flags) & Eigen::RowMajorBit),
67 Flags0 = (static_cast<int>(Arg1Flags) | static_cast<int>(Arg2Flags)
68 | static_cast<int>(Arg3Flags))
69 & (Eigen::HereditaryBits
70 | (static_cast<int>(Arg1Flags) & static_cast<int>(Arg2Flags)
71 & static_cast<int>(Arg3Flags)
72 & (StorageOrdersAgree ? Eigen::LinearAccessBit : 0))),
73 Flags = (Flags0 & ~Eigen::RowMajorBit) | (Arg1Flags & Eigen::RowMajorBit),
75 = std::min({static_cast<int>(Eigen::internal::evaluator<Arg1>::Alignment),
76 static_cast<int>(Eigen::internal::evaluator<Arg2>::Alignment),
77 static_cast<int>(Eigen::internal::evaluator<Arg3>::Alignment)})
78 };
79
80 EIGEN_DEVICE_FUNC explicit lazy_select_evaluator(const XprType& xpr)
81 : m_d(xpr) {}
82
83 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType
84 coeff(Eigen::Index row, Eigen::Index col) const {
85 return m_d.arg3Impl.coeff(row, col) == CondScalar(0)
86 ? m_d.arg2Impl.coeff(row, col)
87 : m_d.arg1Impl.coeff(row, col);
88 }
89
90 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType
91 coeff(Eigen::Index index) const {
92 return m_d.arg3Impl.coeff(index) == CondScalar(0)
93 ? m_d.arg2Impl.coeff(index)
94 : m_d.arg1Impl.coeff(index);
95 }
96
97 protected:
98 struct Data {
99 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit Data(const XprType& xpr)
100 : op(xpr.functor()),
101 arg1Impl(xpr.arg1()),
102 arg2Impl(xpr.arg2()),
103 arg3Impl(xpr.arg3()) {}
104 TernaryOp op;
105 Eigen::internal::evaluator<Arg1> arg1Impl;
106 Eigen::internal::evaluator<Arg2> arg2Impl;
107 Eigen::internal::evaluator<Arg3> arg3Impl;
108 };
109
111};
112
113} // namespace internal
114} // namespace math
115} // namespace stan
116
117#endif
auto col(T_x &&x, size_t j)
Return the specified column of the specified kernel generator expression using start-at-1 indexing.
Definition col.hpp:23
auto row(T_x &&x, size_t j)
Return the specified row of the specified kernel generator expression using start-at-1 indexing.
Definition row.hpp:23
(Expert) Numerical traits for algorithmic differentiation variables.
auto min(T1 x, T2 y)
Returns the minimum coefficient of the two specified scalar arguments.
Definition min.hpp:24
The lgamma implementation in stan-math is based on either the reentrant safe lgamma_r implementation ...
STL namespace.
CoeffReturnType coeff(Eigen::Index row, Eigen::Index col) const
CoeffReturnType coeff(Eigen::Index index) const
typename XprType::CoeffReturnType CoeffReturnType
Eigen::CwiseTernaryOp< TernaryOp, Arg1, Arg2, Arg3 > XprType
Evaluator for .select() expressions that evaluates only the branch chosen by the condition,...