10#ifndef EIGEN_CXX11_TENSOR_TENSOR_EXPR_H
11#define EIGEN_CXX11_TENSOR_TENSOR_EXPR_H
31template<
typename NullaryOp,
typename XprType>
32struct traits<TensorCwiseNullaryOp<NullaryOp, XprType> >
35 typedef traits<XprType> XprTraits;
36 typedef typename XprType::Scalar Scalar;
37 typedef typename XprType::Nested XprTypeNested;
38 typedef typename remove_reference<XprTypeNested>::type _XprTypeNested;
39 static const int NumDimensions = XprTraits::NumDimensions;
40 static const int Layout = XprTraits::Layout;
41 typedef typename XprTraits::PointerType PointerType;
51template<
typename NullaryOp,
typename XprType>
52class TensorCwiseNullaryOp :
public TensorBase<TensorCwiseNullaryOp<NullaryOp, XprType>, ReadOnlyAccessors>
55 typedef typename Eigen::internal::traits<TensorCwiseNullaryOp>::Scalar Scalar;
57 typedef typename XprType::CoeffReturnType CoeffReturnType;
58 typedef TensorCwiseNullaryOp<NullaryOp, XprType> Nested;
59 typedef typename Eigen::internal::traits<TensorCwiseNullaryOp>::StorageKind StorageKind;
60 typedef typename Eigen::internal::traits<TensorCwiseNullaryOp>::Index
Index;
62 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCwiseNullaryOp(
const XprType& xpr,
const NullaryOp& func = NullaryOp())
63 : m_xpr(xpr), m_functor(func) {}
66 const typename internal::remove_all<typename XprType::Nested>::type&
67 nestedExpression()
const {
return m_xpr; }
70 const NullaryOp& functor()
const {
return m_functor; }
73 typename XprType::Nested m_xpr;
74 const NullaryOp m_functor;
80template<
typename UnaryOp,
typename XprType>
81struct traits<TensorCwiseUnaryOp<UnaryOp, XprType> >
86 typedef typename result_of<UnaryOp(
typename XprType::Scalar)>::type Scalar;
87 typedef traits<XprType> XprTraits;
88 typedef typename XprType::Nested XprTypeNested;
89 typedef typename remove_reference<XprTypeNested>::type _XprTypeNested;
90 static const int NumDimensions = XprTraits::NumDimensions;
91 static const int Layout = XprTraits::Layout;
92 typedef typename TypeConversion<Scalar,
93 typename XprTraits::PointerType
98template<
typename UnaryOp,
typename XprType>
99struct eval<TensorCwiseUnaryOp<UnaryOp, XprType>,
Eigen::Dense>
101 typedef const TensorCwiseUnaryOp<UnaryOp, XprType>& type;
104template<
typename UnaryOp,
typename XprType>
105struct nested<TensorCwiseUnaryOp<UnaryOp, XprType>, 1, typename eval<TensorCwiseUnaryOp<UnaryOp, XprType> >::type>
107 typedef TensorCwiseUnaryOp<UnaryOp, XprType> type;
114template<
typename UnaryOp,
typename XprType>
115class TensorCwiseUnaryOp :
public TensorBase<TensorCwiseUnaryOp<UnaryOp, XprType>, ReadOnlyAccessors>
120 typedef typename Eigen::internal::traits<TensorCwiseUnaryOp>::Scalar Scalar;
122 typedef Scalar CoeffReturnType;
123 typedef typename Eigen::internal::nested<TensorCwiseUnaryOp>::type Nested;
124 typedef typename Eigen::internal::traits<TensorCwiseUnaryOp>::StorageKind StorageKind;
125 typedef typename Eigen::internal::traits<TensorCwiseUnaryOp>::Index
Index;
127 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCwiseUnaryOp(
const XprType& xpr,
const UnaryOp& func = UnaryOp())
128 : m_xpr(xpr), m_functor(func) {}
131 const UnaryOp& functor()
const {
return m_functor; }
135 const typename internal::remove_all<typename XprType::Nested>::type&
136 nestedExpression()
const {
return m_xpr; }
139 typename XprType::Nested m_xpr;
140 const UnaryOp m_functor;
145template<
typename BinaryOp,
typename LhsXprType,
typename RhsXprType>
146struct traits<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType> >
152 typedef typename result_of<
153 BinaryOp(
typename LhsXprType::Scalar,
154 typename RhsXprType::Scalar)>::type Scalar;
155 typedef traits<LhsXprType> XprTraits;
156 typedef typename promote_storage_type<
157 typename traits<LhsXprType>::StorageKind,
158 typename traits<RhsXprType>::StorageKind>::ret StorageKind;
159 typedef typename promote_index_type<
160 typename traits<LhsXprType>::Index,
161 typename traits<RhsXprType>::Index>::type
Index;
162 typedef typename LhsXprType::Nested LhsNested;
163 typedef typename RhsXprType::Nested RhsNested;
164 typedef typename remove_reference<LhsNested>::type _LhsNested;
165 typedef typename remove_reference<RhsNested>::type _RhsNested;
166 static const int NumDimensions = XprTraits::NumDimensions;
167 static const int Layout = XprTraits::Layout;
168 typedef typename TypeConversion<Scalar,
169 typename conditional<Pointer_type_promotion<typename LhsXprType::Scalar, Scalar>::val,
170 typename traits<LhsXprType>::PointerType,
171 typename traits<RhsXprType>::PointerType>::type
179template<
typename BinaryOp,
typename LhsXprType,
typename RhsXprType>
180struct eval<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType>,
Eigen::Dense>
182 typedef const TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType>& type;
185template<
typename BinaryOp,
typename LhsXprType,
typename RhsXprType>
186struct nested<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType>, 1, typename eval<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType> >::type>
188 typedef TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType> type;
195template<
typename BinaryOp,
typename LhsXprType,
typename RhsXprType>
196class TensorCwiseBinaryOp :
public TensorBase<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType>, ReadOnlyAccessors>
201 typedef typename Eigen::internal::traits<TensorCwiseBinaryOp>::Scalar Scalar;
203 typedef Scalar CoeffReturnType;
204 typedef typename Eigen::internal::nested<TensorCwiseBinaryOp>::type Nested;
205 typedef typename Eigen::internal::traits<TensorCwiseBinaryOp>::StorageKind StorageKind;
206 typedef typename Eigen::internal::traits<TensorCwiseBinaryOp>::Index
Index;
208 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCwiseBinaryOp(
const LhsXprType& lhs,
const RhsXprType& rhs,
const BinaryOp& func = BinaryOp())
209 : m_lhs_xpr(lhs), m_rhs_xpr(rhs), m_functor(func) {}
212 const BinaryOp& functor()
const {
return m_functor; }
216 const typename internal::remove_all<typename LhsXprType::Nested>::type&
217 lhsExpression()
const {
return m_lhs_xpr; }
220 const typename internal::remove_all<typename RhsXprType::Nested>::type&
221 rhsExpression()
const {
return m_rhs_xpr; }
224 typename LhsXprType::Nested m_lhs_xpr;
225 typename RhsXprType::Nested m_rhs_xpr;
226 const BinaryOp m_functor;
231template<
typename TernaryOp,
typename Arg1XprType,
typename Arg2XprType,
typename Arg3XprType>
232struct traits<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType> >
235 typedef typename result_of<
236 TernaryOp(
typename Arg1XprType::Scalar,
237 typename Arg2XprType::Scalar,
238 typename Arg3XprType::Scalar)>::type Scalar;
239 typedef traits<Arg1XprType> XprTraits;
240 typedef typename traits<Arg1XprType>::StorageKind StorageKind;
241 typedef typename traits<Arg1XprType>::Index
Index;
242 typedef typename Arg1XprType::Nested Arg1Nested;
243 typedef typename Arg2XprType::Nested Arg2Nested;
244 typedef typename Arg3XprType::Nested Arg3Nested;
245 typedef typename remove_reference<Arg1Nested>::type _Arg1Nested;
246 typedef typename remove_reference<Arg2Nested>::type _Arg2Nested;
247 typedef typename remove_reference<Arg3Nested>::type _Arg3Nested;
248 static const int NumDimensions = XprTraits::NumDimensions;
249 static const int Layout = XprTraits::Layout;
250 typedef typename TypeConversion<Scalar,
251 typename conditional<Pointer_type_promotion<typename Arg2XprType::Scalar, Scalar>::val,
252 typename traits<Arg2XprType>::PointerType,
253 typename traits<Arg3XprType>::PointerType>::type
261template<
typename TernaryOp,
typename Arg1XprType,
typename Arg2XprType,
typename Arg3XprType>
262struct eval<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType>,
Eigen::Dense>
264 typedef const TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType>& type;
267template<
typename TernaryOp,
typename Arg1XprType,
typename Arg2XprType,
typename Arg3XprType>
268struct nested<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType>, 1, typename eval<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType> >::type>
270 typedef TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType> type;
277template<
typename TernaryOp,
typename Arg1XprType,
typename Arg2XprType,
typename Arg3XprType>
278class TensorCwiseTernaryOp :
public TensorBase<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType>, ReadOnlyAccessors>
281 typedef typename Eigen::internal::traits<TensorCwiseTernaryOp>::Scalar Scalar;
283 typedef Scalar CoeffReturnType;
284 typedef typename Eigen::internal::nested<TensorCwiseTernaryOp>::type Nested;
285 typedef typename Eigen::internal::traits<TensorCwiseTernaryOp>::StorageKind StorageKind;
286 typedef typename Eigen::internal::traits<TensorCwiseTernaryOp>::Index
Index;
288 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCwiseTernaryOp(
const Arg1XprType& arg1,
const Arg2XprType& arg2,
const Arg3XprType& arg3,
const TernaryOp& func = TernaryOp())
289 : m_arg1_xpr(arg1), m_arg2_xpr(arg2), m_arg3_xpr(arg3), m_functor(func) {}
292 const TernaryOp& functor()
const {
return m_functor; }
296 const typename internal::remove_all<typename Arg1XprType::Nested>::type&
297 arg1Expression()
const {
return m_arg1_xpr; }
300 const typename internal::remove_all<typename Arg2XprType::Nested>::type&
301 arg2Expression()
const {
return m_arg2_xpr; }
304 const typename internal::remove_all<typename Arg3XprType::Nested>::type&
305 arg3Expression()
const {
return m_arg3_xpr; }
308 typename Arg1XprType::Nested m_arg1_xpr;
309 typename Arg2XprType::Nested m_arg2_xpr;
310 typename Arg3XprType::Nested m_arg3_xpr;
311 const TernaryOp m_functor;
316template<
typename IfXprType,
typename ThenXprType,
typename ElseXprType>
317struct traits<TensorSelectOp<IfXprType, ThenXprType, ElseXprType> >
318 : traits<ThenXprType>
320 typedef typename traits<ThenXprType>::Scalar Scalar;
321 typedef traits<ThenXprType> XprTraits;
322 typedef typename promote_storage_type<typename traits<ThenXprType>::StorageKind,
323 typename traits<ElseXprType>::StorageKind>::ret StorageKind;
324 typedef typename promote_index_type<typename traits<ElseXprType>::Index,
325 typename traits<ThenXprType>::Index>::type
Index;
326 typedef typename IfXprType::Nested IfNested;
327 typedef typename ThenXprType::Nested ThenNested;
328 typedef typename ElseXprType::Nested ElseNested;
329 static const int NumDimensions = XprTraits::NumDimensions;
330 static const int Layout = XprTraits::Layout;
331 typedef typename conditional<Pointer_type_promotion<typename ThenXprType::Scalar, Scalar>::val,
332 typename traits<ThenXprType>::PointerType,
333 typename traits<ElseXprType>::PointerType>::type PointerType;
336template<
typename IfXprType,
typename ThenXprType,
typename ElseXprType>
337struct eval<TensorSelectOp<IfXprType, ThenXprType, ElseXprType>,
Eigen::Dense>
339 typedef const TensorSelectOp<IfXprType, ThenXprType, ElseXprType>& type;
342template<
typename IfXprType,
typename ThenXprType,
typename ElseXprType>
343struct nested<TensorSelectOp<IfXprType, ThenXprType, ElseXprType>, 1, typename eval<TensorSelectOp<IfXprType, ThenXprType, ElseXprType> >::type>
345 typedef TensorSelectOp<IfXprType, ThenXprType, ElseXprType> type;
351template<
typename IfXprType,
typename ThenXprType,
typename ElseXprType>
352class TensorSelectOp :
public TensorBase<TensorSelectOp<IfXprType, ThenXprType, ElseXprType>, ReadOnlyAccessors>
355 typedef typename Eigen::internal::traits<TensorSelectOp>::Scalar Scalar;
357 typedef typename internal::promote_storage_type<
typename ThenXprType::CoeffReturnType,
358 typename ElseXprType::CoeffReturnType>::ret CoeffReturnType;
359 typedef typename Eigen::internal::nested<TensorSelectOp>::type Nested;
360 typedef typename Eigen::internal::traits<TensorSelectOp>::StorageKind StorageKind;
361 typedef typename Eigen::internal::traits<TensorSelectOp>::Index
Index;
364 TensorSelectOp(
const IfXprType& a_condition,
365 const ThenXprType& a_then,
366 const ElseXprType& a_else)
367 : m_condition(a_condition), m_then(a_then), m_else(a_else)
371 const IfXprType& ifExpression()
const {
return m_condition; }
374 const ThenXprType& thenExpression()
const {
return m_then; }
377 const ElseXprType& elseExpression()
const {
return m_else; }
380 typename IfXprType::Nested m_condition;
381 typename ThenXprType::Nested m_then;
382 typename ElseXprType::Nested m_else;
Namespace containing all symbols from the Eigen library.
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index