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),
74 Alignment = Eigen::internal::plain_enum_min(
75 Eigen::internal::plain_enum_min(
76 Eigen::internal::evaluator<Arg1>::Alignment,
77 Eigen::internal::evaluator<Arg2>::Alignment),
78 Eigen::internal::evaluator<Arg3>::Alignment)
79 };
80
81 EIGEN_DEVICE_FUNC explicit lazy_select_evaluator(const XprType& xpr)
82 : m_d(xpr) {}
83
84 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType
85 coeff(Eigen::Index row, Eigen::Index col) const {
86 return m_d.arg3Impl.coeff(row, col) == CondScalar(0)
87 ? m_d.arg2Impl.coeff(row, col)
88 : m_d.arg1Impl.coeff(row, col);
89 }
90
91 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType
92 coeff(Eigen::Index index) const {
93 return m_d.arg3Impl.coeff(index) == CondScalar(0)
94 ? m_d.arg2Impl.coeff(index)
95 : m_d.arg1Impl.coeff(index);
96 }
97
98 protected:
99 struct Data {
100 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit Data(const XprType& xpr)
101 : op(xpr.functor()),
102 arg1Impl(xpr.arg1()),
103 arg2Impl(xpr.arg2()),
104 arg3Impl(xpr.arg3()) {}
105 TernaryOp op;
106 Eigen::internal::evaluator<Arg1> arg1Impl;
107 Eigen::internal::evaluator<Arg2> arg2Impl;
108 Eigen::internal::evaluator<Arg3> arg3Impl;
109 };
110
112};
113
114} // namespace internal
115} // namespace math
116} // namespace stan
117
118#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.
The lgamma implementation in stan-math is based on either the reentrant safe lgamma_r implementation ...
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,...