10#ifndef EIGEN_CXX11_TENSOR_TENSOR_EXPR_H
11#define EIGEN_CXX11_TENSOR_TENSOR_EXPR_H
16template<
typename NullaryOp,
typename XprType>
17struct traits<TensorCwiseNullaryOp<NullaryOp, XprType> >
20 typedef traits<XprType> XprTraits;
21 typedef typename XprType::Scalar Scalar;
22 typedef typename XprType::Nested XprTypeNested;
23 typedef typename remove_reference<XprTypeNested>::type _XprTypeNested;
24 static const int NumDimensions = XprTraits::NumDimensions;
25 static const int Layout = XprTraits::Layout;
42template <
typename NullaryOp,
typename XprType>
43class TensorCwiseNullaryOp :
public TensorBase<TensorCwiseNullaryOp<NullaryOp, XprType>, ReadOnlyAccessors> {
45 typedef typename Eigen::internal::traits<TensorCwiseNullaryOp>::Scalar Scalar;
47 typedef typename XprType::CoeffReturnType CoeffReturnType;
48 typedef TensorCwiseNullaryOp<NullaryOp, XprType> Nested;
49 typedef typename Eigen::internal::traits<TensorCwiseNullaryOp>::StorageKind StorageKind;
50 typedef typename Eigen::internal::traits<TensorCwiseNullaryOp>::Index Index;
52 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCwiseNullaryOp(
const XprType& xpr,
const NullaryOp& func = NullaryOp())
53 : m_xpr(xpr), m_functor(func) {}
56 const typename internal::remove_all<typename XprType::Nested>::type&
57 nestedExpression()
const {
return m_xpr; }
60 const NullaryOp& functor()
const {
return m_functor; }
63 typename XprType::Nested m_xpr;
64 const NullaryOp m_functor;
70template<
typename UnaryOp,
typename XprType>
76 typedef typename result_of<UnaryOp(
typename XprType::Scalar)>::type
Scalar;
77 typedef traits<XprType> XprTraits;
78 typedef typename XprType::Nested XprTypeNested;
79 typedef typename remove_reference<XprTypeNested>::type _XprTypeNested;
80 static const int NumDimensions = XprTraits::NumDimensions;
81 static const int Layout = XprTraits::Layout;
84template<
typename UnaryOp,
typename XprType>
85struct eval<TensorCwiseUnaryOp<UnaryOp, XprType>,
Eigen::Dense>
87 typedef const TensorCwiseUnaryOp<UnaryOp, XprType>& type;
90template<
typename UnaryOp,
typename XprType>
91struct nested<TensorCwiseUnaryOp<UnaryOp, XprType>, 1, typename eval<TensorCwiseUnaryOp<UnaryOp, XprType> >::type>
93 typedef TensorCwiseUnaryOp<UnaryOp, XprType> type;
106template <
typename UnaryOp,
typename XprType>
107class TensorCwiseUnaryOp :
public TensorBase<TensorCwiseUnaryOp<UnaryOp, XprType>, ReadOnlyAccessors> {
111 typedef typename Eigen::internal::traits<TensorCwiseUnaryOp>::Scalar Scalar;
113 typedef Scalar CoeffReturnType;
114 typedef typename Eigen::internal::nested<TensorCwiseUnaryOp>::type Nested;
115 typedef typename Eigen::internal::traits<TensorCwiseUnaryOp>::StorageKind StorageKind;
116 typedef typename Eigen::internal::traits<TensorCwiseUnaryOp>::Index Index;
118 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCwiseUnaryOp(
const XprType& xpr,
const UnaryOp& func = UnaryOp())
119 : m_xpr(xpr), m_functor(func) {}
122 const UnaryOp& functor()
const {
return m_functor; }
126 const typename internal::remove_all<typename XprType::Nested>::type&
130 typename XprType::Nested m_xpr;
131 const UnaryOp m_functor;
136template<
typename BinaryOp,
typename LhsXprType,
typename RhsXprType>
137struct traits<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType> >
143 typedef typename result_of<
144 BinaryOp(
typename LhsXprType::Scalar,
145 typename RhsXprType::Scalar)>::type Scalar;
146 typedef traits<LhsXprType> XprTraits;
147 typedef typename promote_storage_type<
148 typename traits<LhsXprType>::StorageKind,
149 typename traits<RhsXprType>::StorageKind>::ret StorageKind;
150 typedef typename promote_index_type<
151 typename traits<LhsXprType>::Index,
152 typename traits<RhsXprType>::Index>::type Index;
153 typedef typename LhsXprType::Nested LhsNested;
154 typedef typename RhsXprType::Nested RhsNested;
155 typedef typename remove_reference<LhsNested>::type _LhsNested;
156 typedef typename remove_reference<RhsNested>::type _RhsNested;
157 static const int NumDimensions = XprTraits::NumDimensions;
158 static const int Layout = XprTraits::Layout;
165template<
typename BinaryOp,
typename LhsXprType,
typename RhsXprType>
166struct eval<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType>, Eigen::Dense>
168 typedef const TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType>& type;
171template<
typename BinaryOp,
typename LhsXprType,
typename RhsXprType>
172struct nested<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType>, 1, typename eval<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType> >::type>
174 typedef TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType> type;
187template <
typename BinaryOp,
typename LhsXprType,
typename RhsXprType>
188class TensorCwiseBinaryOp
189 :
public TensorBase<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType>, ReadOnlyAccessors> {
193 typedef typename Eigen::internal::traits<TensorCwiseBinaryOp>::Scalar Scalar;
195 typedef Scalar CoeffReturnType;
196 typedef typename Eigen::internal::nested<TensorCwiseBinaryOp>::type Nested;
197 typedef typename Eigen::internal::traits<TensorCwiseBinaryOp>::StorageKind StorageKind;
198 typedef typename Eigen::internal::traits<TensorCwiseBinaryOp>::Index Index;
200 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCwiseBinaryOp(
const LhsXprType& lhs,
const RhsXprType& rhs,
const BinaryOp& func = BinaryOp())
201 : m_lhs_xpr(lhs), m_rhs_xpr(rhs), m_functor(func) {}
204 const BinaryOp& functor()
const {
return m_functor; }
208 const typename internal::remove_all<typename LhsXprType::Nested>::type&
212 const typename internal::remove_all<typename RhsXprType::Nested>::type&
213 rhsExpression()
const {
return m_rhs_xpr; }
216 typename LhsXprType::Nested m_lhs_xpr;
217 typename RhsXprType::Nested m_rhs_xpr;
218 const BinaryOp m_functor;
223template<
typename TernaryOp,
typename Arg1XprType,
typename Arg2XprType,
typename Arg3XprType>
224struct traits<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType> >
227 typedef typename result_of<
228 TernaryOp(
typename Arg1XprType::Scalar,
229 typename Arg2XprType::Scalar,
230 typename Arg3XprType::Scalar)>::type Scalar;
231 typedef traits<Arg1XprType> XprTraits;
232 typedef typename traits<Arg1XprType>::StorageKind StorageKind;
233 typedef typename traits<Arg1XprType>::Index
Index;
234 typedef typename Arg1XprType::Nested Arg1Nested;
235 typedef typename Arg2XprType::Nested Arg2Nested;
236 typedef typename Arg3XprType::Nested Arg3Nested;
237 typedef typename remove_reference<Arg1Nested>::type _Arg1Nested;
238 typedef typename remove_reference<Arg2Nested>::type _Arg2Nested;
239 typedef typename remove_reference<Arg3Nested>::type _Arg3Nested;
240 static const int NumDimensions = XprTraits::NumDimensions;
241 static const int Layout = XprTraits::Layout;
248template<
typename TernaryOp,
typename Arg1XprType,
typename Arg2XprType,
typename Arg3XprType>
249struct eval<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType>, Eigen::Dense>
251 typedef const TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType>& type;
254template<
typename TernaryOp,
typename Arg1XprType,
typename Arg2XprType,
typename Arg3XprType>
255struct nested<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType>, 1, typename eval<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType> >::type>
257 typedef TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType> type;
264template<
typename TernaryOp,
typename Arg1XprType,
typename Arg2XprType,
typename Arg3XprType>
265class TensorCwiseTernaryOp :
public TensorBase<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType>, ReadOnlyAccessors>
268 typedef typename Eigen::internal::traits<TensorCwiseTernaryOp>::Scalar Scalar;
269 typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
270 typedef Scalar CoeffReturnType;
271 typedef typename Eigen::internal::nested<TensorCwiseTernaryOp>::type Nested;
272 typedef typename Eigen::internal::traits<TensorCwiseTernaryOp>::StorageKind StorageKind;
273 typedef typename Eigen::internal::traits<TensorCwiseTernaryOp>::Index Index;
275 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCwiseTernaryOp(
const Arg1XprType& arg1,
const Arg2XprType& arg2,
const Arg3XprType& arg3,
const TernaryOp& func = TernaryOp())
276 : m_arg1_xpr(arg1), m_arg2_xpr(arg2), m_arg3_xpr(arg3), m_functor(func) {}
279 const TernaryOp& functor()
const {
return m_functor; }
283 const typename internal::remove_all<typename Arg1XprType::Nested>::type&
284 arg1Expression()
const {
return m_arg1_xpr; }
287 const typename internal::remove_all<typename Arg2XprType::Nested>::type&
288 arg2Expression()
const {
return m_arg2_xpr; }
291 const typename internal::remove_all<typename Arg3XprType::Nested>::type&
292 arg3Expression()
const {
return m_arg3_xpr; }
295 typename Arg1XprType::Nested m_arg1_xpr;
296 typename Arg2XprType::Nested m_arg2_xpr;
297 typename Arg3XprType::Nested m_arg3_xpr;
298 const TernaryOp m_functor;
303template<
typename IfXprType,
typename ThenXprType,
typename ElseXprType>
304struct traits<TensorSelectOp<IfXprType, ThenXprType, ElseXprType> >
305 : traits<ThenXprType>
307 typedef typename traits<ThenXprType>::Scalar Scalar;
308 typedef traits<ThenXprType> XprTraits;
309 typedef typename promote_storage_type<typename traits<ThenXprType>::StorageKind,
310 typename traits<ElseXprType>::StorageKind>::ret StorageKind;
311 typedef typename promote_index_type<typename traits<ElseXprType>::Index,
312 typename traits<ThenXprType>::Index>::type
Index;
313 typedef typename IfXprType::Nested IfNested;
314 typedef typename ThenXprType::Nested ThenNested;
315 typedef typename ElseXprType::Nested ElseNested;
316 static const int NumDimensions = XprTraits::NumDimensions;
317 static const int Layout = XprTraits::Layout;
320template<
typename IfXprType,
typename ThenXprType,
typename ElseXprType>
321struct eval<TensorSelectOp<IfXprType, ThenXprType, ElseXprType>, Eigen::Dense>
323 typedef const TensorSelectOp<IfXprType, ThenXprType, ElseXprType>& type;
326template<
typename IfXprType,
typename ThenXprType,
typename ElseXprType>
327struct nested<TensorSelectOp<IfXprType, ThenXprType, ElseXprType>, 1, typename eval<TensorSelectOp<IfXprType, ThenXprType, ElseXprType> >::type>
329 typedef TensorSelectOp<IfXprType, ThenXprType, ElseXprType> type;
335template<
typename IfXprType,
typename ThenXprType,
typename ElseXprType>
336class TensorSelectOp :
public TensorBase<TensorSelectOp<IfXprType, ThenXprType, ElseXprType>, ReadOnlyAccessors>
339 typedef typename Eigen::internal::traits<TensorSelectOp>::Scalar Scalar;
340 typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
341 typedef typename internal::promote_storage_type<
typename ThenXprType::CoeffReturnType,
342 typename ElseXprType::CoeffReturnType>::ret CoeffReturnType;
343 typedef typename Eigen::internal::nested<TensorSelectOp>::type Nested;
344 typedef typename Eigen::internal::traits<TensorSelectOp>::StorageKind StorageKind;
345 typedef typename Eigen::internal::traits<TensorSelectOp>::Index Index;
348 TensorSelectOp(
const IfXprType& a_condition,
349 const ThenXprType& a_then,
350 const ElseXprType& a_else)
351 : m_condition(a_condition), m_then(a_then), m_else(a_else)
355 const IfXprType& ifExpression()
const {
return m_condition; }
358 const ThenXprType& thenExpression()
const {
return m_then; }
361 const ElseXprType& elseExpression()
const {
return m_else; }
364 typename IfXprType::Nested m_condition;
365 typename ThenXprType::Nested m_then;
366 typename ElseXprType::Nested m_else;
The tensor base class.
Definition TensorForwardDeclarations.h:29
const internal::remove_all< typenameLhsXprType::Nested >::type & lhsExpression() const
Definition TensorExpr.h:209
Tensor unary expression.
Definition TensorExpr.h:107
const internal::remove_all< typenameXprType::Nested >::type & nestedExpression() const
Definition TensorExpr.h:127
Namespace containing all symbols from the Eigen library.
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index