10 #ifndef EIGEN_CXX11_TENSOR_TENSOR_EXPR_H
11 #define EIGEN_CXX11_TENSOR_TENSOR_EXPR_H
13 #include "./InternalHeaderCheck.h"
33 template<
typename NullaryOp,
typename XprType>
34 struct traits<TensorCwiseNullaryOp<NullaryOp, XprType> >
37 typedef traits<XprType> XprTraits;
38 typedef typename XprType::Scalar Scalar;
39 typedef typename XprType::Nested XprTypeNested;
40 typedef std::remove_reference_t<XprTypeNested> XprTypeNested_;
41 static constexpr
int NumDimensions = XprTraits::NumDimensions;
42 static constexpr
int Layout = XprTraits::Layout;
43 typedef typename XprTraits::PointerType PointerType;
53 template<
typename NullaryOp,
typename XprType>
54 class TensorCwiseNullaryOp :
public TensorBase<TensorCwiseNullaryOp<NullaryOp, XprType>, ReadOnlyAccessors>
57 typedef typename Eigen::internal::traits<TensorCwiseNullaryOp>::Scalar Scalar;
59 typedef typename XprType::CoeffReturnType CoeffReturnType;
60 typedef TensorCwiseNullaryOp<NullaryOp, XprType> Nested;
61 typedef typename Eigen::internal::traits<TensorCwiseNullaryOp>::StorageKind StorageKind;
62 typedef typename Eigen::internal::traits<TensorCwiseNullaryOp>::Index
Index;
64 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCwiseNullaryOp(
const XprType& xpr,
const NullaryOp& func = NullaryOp())
65 : m_xpr(xpr), m_functor(func) {}
68 const internal::remove_all_t<typename XprType::Nested>&
69 nestedExpression()
const {
return m_xpr; }
72 const NullaryOp& functor()
const {
return m_functor; }
75 typename XprType::Nested m_xpr;
76 const NullaryOp m_functor;
82 template<
typename UnaryOp,
typename XprType>
83 struct traits<TensorCwiseUnaryOp<UnaryOp, XprType> >
88 typedef typename result_of<UnaryOp(
typename XprType::Scalar)>::type Scalar;
89 typedef traits<XprType> XprTraits;
90 typedef typename XprType::Nested XprTypeNested;
91 typedef std::remove_reference_t<XprTypeNested> XprTypeNested_;
92 static constexpr
int NumDimensions = XprTraits::NumDimensions;
93 static constexpr
int Layout = XprTraits::Layout;
94 typedef typename TypeConversion<Scalar,
95 typename XprTraits::PointerType
100 template<
typename UnaryOp,
typename XprType>
101 struct eval<TensorCwiseUnaryOp<UnaryOp, XprType>,
Eigen::Dense>
103 typedef const TensorCwiseUnaryOp<UnaryOp, XprType>& type;
106 template<
typename UnaryOp,
typename XprType>
107 struct nested<TensorCwiseUnaryOp<UnaryOp, XprType>, 1, typename eval<TensorCwiseUnaryOp<UnaryOp, XprType> >::type>
109 typedef TensorCwiseUnaryOp<UnaryOp, XprType> type;
116 template<
typename UnaryOp,
typename XprType>
117 class TensorCwiseUnaryOp :
public TensorBase<TensorCwiseUnaryOp<UnaryOp, XprType>, ReadOnlyAccessors>
122 typedef typename Eigen::internal::traits<TensorCwiseUnaryOp>::Scalar Scalar;
124 typedef Scalar CoeffReturnType;
125 typedef typename Eigen::internal::nested<TensorCwiseUnaryOp>::type Nested;
126 typedef typename Eigen::internal::traits<TensorCwiseUnaryOp>::StorageKind StorageKind;
127 typedef typename Eigen::internal::traits<TensorCwiseUnaryOp>::Index
Index;
129 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCwiseUnaryOp(
const XprType& xpr,
const UnaryOp& func = UnaryOp())
130 : m_xpr(xpr), m_functor(func) {}
133 const UnaryOp& functor()
const {
return m_functor; }
137 const internal::remove_all_t<typename XprType::Nested>&
138 nestedExpression()
const {
return m_xpr; }
141 typename XprType::Nested m_xpr;
142 const UnaryOp m_functor;
147 template<
typename BinaryOp,
typename LhsXprType,
typename RhsXprType>
148 struct traits<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType> >
154 typedef typename result_of<
155 BinaryOp(
typename LhsXprType::Scalar,
156 typename RhsXprType::Scalar)>::type Scalar;
157 typedef traits<LhsXprType> XprTraits;
158 typedef typename promote_storage_type<
159 typename traits<LhsXprType>::StorageKind,
160 typename traits<RhsXprType>::StorageKind>::ret StorageKind;
161 typedef typename promote_index_type<
162 typename traits<LhsXprType>::Index,
163 typename traits<RhsXprType>::Index>::type
Index;
164 typedef typename LhsXprType::Nested LhsNested;
165 typedef typename RhsXprType::Nested RhsNested;
166 typedef std::remove_reference_t<LhsNested> LhsNested_;
167 typedef std::remove_reference_t<RhsNested> RhsNested_;
168 static constexpr
int NumDimensions = XprTraits::NumDimensions;
169 static constexpr
int Layout = XprTraits::Layout;
170 typedef typename TypeConversion<Scalar,
171 std::conditional_t<Pointer_type_promotion<typename LhsXprType::Scalar, Scalar>::val,
172 typename traits<LhsXprType>::PointerType,
173 typename traits<RhsXprType>::PointerType>
181 template<
typename BinaryOp,
typename LhsXprType,
typename RhsXprType>
182 struct eval<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType>,
Eigen::Dense>
184 typedef const TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType>& type;
187 template<
typename BinaryOp,
typename LhsXprType,
typename RhsXprType>
188 struct nested<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType>, 1, typename eval<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType> >::type>
190 typedef TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType> type;
197 template<
typename BinaryOp,
typename LhsXprType,
typename RhsXprType>
198 class TensorCwiseBinaryOp :
public TensorBase<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType>, ReadOnlyAccessors>
203 typedef typename Eigen::internal::traits<TensorCwiseBinaryOp>::Scalar Scalar;
205 typedef Scalar CoeffReturnType;
206 typedef typename Eigen::internal::nested<TensorCwiseBinaryOp>::type Nested;
207 typedef typename Eigen::internal::traits<TensorCwiseBinaryOp>::StorageKind StorageKind;
208 typedef typename Eigen::internal::traits<TensorCwiseBinaryOp>::Index
Index;
210 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCwiseBinaryOp(
const LhsXprType& lhs,
const RhsXprType& rhs,
const BinaryOp& func = BinaryOp())
211 : m_lhs_xpr(lhs), m_rhs_xpr(rhs), m_functor(func) {}
214 const BinaryOp& functor()
const {
return m_functor; }
218 const internal::remove_all_t<typename LhsXprType::Nested>&
219 lhsExpression()
const {
return m_lhs_xpr; }
222 const internal::remove_all_t<typename RhsXprType::Nested>&
223 rhsExpression()
const {
return m_rhs_xpr; }
226 typename LhsXprType::Nested m_lhs_xpr;
227 typename RhsXprType::Nested m_rhs_xpr;
228 const BinaryOp m_functor;
233 template<
typename TernaryOp,
typename Arg1XprType,
typename Arg2XprType,
typename Arg3XprType>
234 struct traits<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType> >
237 typedef typename result_of<
238 TernaryOp(
typename Arg1XprType::Scalar,
239 typename Arg2XprType::Scalar,
240 typename Arg3XprType::Scalar)>::type Scalar;
241 typedef traits<Arg1XprType> XprTraits;
242 typedef typename traits<Arg1XprType>::StorageKind StorageKind;
243 typedef typename traits<Arg1XprType>::Index
Index;
244 typedef typename Arg1XprType::Nested Arg1Nested;
245 typedef typename Arg2XprType::Nested Arg2Nested;
246 typedef typename Arg3XprType::Nested Arg3Nested;
247 typedef std::remove_reference_t<Arg1Nested> Arg1Nested_;
248 typedef std::remove_reference_t<Arg2Nested> Arg2Nested_;
249 typedef std::remove_reference_t<Arg3Nested> Arg3Nested_;
250 static constexpr
int NumDimensions = XprTraits::NumDimensions;
251 static constexpr
int Layout = XprTraits::Layout;
252 typedef typename TypeConversion<Scalar,
253 std::conditional_t<Pointer_type_promotion<typename Arg2XprType::Scalar, Scalar>::val,
254 typename traits<Arg2XprType>::PointerType,
255 typename traits<Arg3XprType>::PointerType>
263 template<
typename TernaryOp,
typename Arg1XprType,
typename Arg2XprType,
typename Arg3XprType>
264 struct eval<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType>,
Eigen::Dense>
266 typedef const TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType>& type;
269 template<
typename TernaryOp,
typename Arg1XprType,
typename Arg2XprType,
typename Arg3XprType>
270 struct nested<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType>, 1, typename eval<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType> >::type>
272 typedef TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType> type;
279 template<
typename TernaryOp,
typename Arg1XprType,
typename Arg2XprType,
typename Arg3XprType>
280 class TensorCwiseTernaryOp :
public TensorBase<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType>, ReadOnlyAccessors>
283 typedef typename Eigen::internal::traits<TensorCwiseTernaryOp>::Scalar Scalar;
285 typedef Scalar CoeffReturnType;
286 typedef typename Eigen::internal::nested<TensorCwiseTernaryOp>::type Nested;
287 typedef typename Eigen::internal::traits<TensorCwiseTernaryOp>::StorageKind StorageKind;
288 typedef typename Eigen::internal::traits<TensorCwiseTernaryOp>::Index
Index;
290 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCwiseTernaryOp(
const Arg1XprType& arg1,
const Arg2XprType& arg2,
const Arg3XprType& arg3,
const TernaryOp& func = TernaryOp())
291 : m_arg1_xpr(arg1), m_arg2_xpr(arg2), m_arg3_xpr(arg3), m_functor(func) {}
294 const TernaryOp& functor()
const {
return m_functor; }
298 const internal::remove_all_t<typename Arg1XprType::Nested>&
299 arg1Expression()
const {
return m_arg1_xpr; }
302 const internal::remove_all_t<typename Arg2XprType::Nested>&
303 arg2Expression()
const {
return m_arg2_xpr; }
306 const internal::remove_all_t<typename Arg3XprType::Nested>&
307 arg3Expression()
const {
return m_arg3_xpr; }
310 typename Arg1XprType::Nested m_arg1_xpr;
311 typename Arg2XprType::Nested m_arg2_xpr;
312 typename Arg3XprType::Nested m_arg3_xpr;
313 const TernaryOp m_functor;
318 template<
typename IfXprType,
typename ThenXprType,
typename ElseXprType>
319 struct traits<TensorSelectOp<IfXprType, ThenXprType, ElseXprType> >
320 : traits<ThenXprType>
322 typedef typename traits<ThenXprType>::Scalar Scalar;
323 typedef traits<ThenXprType> XprTraits;
324 typedef typename promote_storage_type<typename traits<ThenXprType>::StorageKind,
325 typename traits<ElseXprType>::StorageKind>::ret StorageKind;
326 typedef typename promote_index_type<typename traits<ElseXprType>::Index,
327 typename traits<ThenXprType>::Index>::type
Index;
328 typedef typename IfXprType::Nested IfNested;
329 typedef typename ThenXprType::Nested ThenNested;
330 typedef typename ElseXprType::Nested ElseNested;
331 static constexpr
int NumDimensions = XprTraits::NumDimensions;
332 static constexpr
int Layout = XprTraits::Layout;
333 typedef std::conditional_t<Pointer_type_promotion<typename ThenXprType::Scalar, Scalar>::val,
334 typename traits<ThenXprType>::PointerType,
335 typename traits<ElseXprType>::PointerType> PointerType;
338 template<
typename IfXprType,
typename ThenXprType,
typename ElseXprType>
339 struct eval<TensorSelectOp<IfXprType, ThenXprType, ElseXprType>,
Eigen::Dense>
341 typedef const TensorSelectOp<IfXprType, ThenXprType, ElseXprType>& type;
344 template<
typename IfXprType,
typename ThenXprType,
typename ElseXprType>
345 struct nested<TensorSelectOp<IfXprType, ThenXprType, ElseXprType>, 1, typename eval<TensorSelectOp<IfXprType, ThenXprType, ElseXprType> >::type>
347 typedef TensorSelectOp<IfXprType, ThenXprType, ElseXprType> type;
353 template<
typename IfXprType,
typename ThenXprType,
typename ElseXprType>
354 class TensorSelectOp :
public TensorBase<TensorSelectOp<IfXprType, ThenXprType, ElseXprType>, ReadOnlyAccessors>
357 typedef typename Eigen::internal::traits<TensorSelectOp>::Scalar Scalar;
359 typedef typename internal::promote_storage_type<
typename ThenXprType::CoeffReturnType,
360 typename ElseXprType::CoeffReturnType>::ret CoeffReturnType;
361 typedef typename Eigen::internal::nested<TensorSelectOp>::type Nested;
362 typedef typename Eigen::internal::traits<TensorSelectOp>::StorageKind StorageKind;
363 typedef typename Eigen::internal::traits<TensorSelectOp>::Index
Index;
366 TensorSelectOp(
const IfXprType& a_condition,
367 const ThenXprType& a_then,
368 const ElseXprType& a_else)
369 : m_condition(a_condition), m_then(a_then), m_else(a_else)
373 const IfXprType& ifExpression()
const {
return m_condition; }
376 const ThenXprType& thenExpression()
const {
return m_then; }
379 const ElseXprType& elseExpression()
const {
return m_else; }
382 typename IfXprType::Nested m_condition;
383 typename ThenXprType::Nested m_then;
384 typename ElseXprType::Nested m_else;
Namespace containing all symbols from the Eigen library.
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index