10 #ifndef EIGEN_CXX11_TENSOR_TENSOR_EXPR_H 11 #define EIGEN_CXX11_TENSOR_TENSOR_EXPR_H 31 template<
typename NullaryOp,
typename XprType>
32 struct 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;
51 template<
typename NullaryOp,
typename XprType>
52 class TensorCwiseNullaryOp :
public TensorBase<TensorCwiseNullaryOp<NullaryOp, XprType>, ReadOnlyAccessors>
55 typedef typename Eigen::internal::traits<TensorCwiseNullaryOp>::Scalar Scalar;
56 typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
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;
80 template<
typename UnaryOp,
typename XprType>
81 struct 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;
94 template<
typename UnaryOp,
typename XprType>
95 struct eval<TensorCwiseUnaryOp<UnaryOp, XprType>,
Eigen::Dense>
97 typedef const TensorCwiseUnaryOp<UnaryOp, XprType>& type;
100 template<
typename UnaryOp,
typename XprType>
101 struct nested<TensorCwiseUnaryOp<UnaryOp, XprType>, 1, typename eval<TensorCwiseUnaryOp<UnaryOp, XprType> >::type>
103 typedef TensorCwiseUnaryOp<UnaryOp, XprType> type;
110 template<
typename UnaryOp,
typename XprType>
111 class TensorCwiseUnaryOp :
public TensorBase<TensorCwiseUnaryOp<UnaryOp, XprType>, ReadOnlyAccessors>
116 typedef typename Eigen::internal::traits<TensorCwiseUnaryOp>::Scalar Scalar;
117 typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
118 typedef Scalar CoeffReturnType;
119 typedef typename Eigen::internal::nested<TensorCwiseUnaryOp>::type Nested;
120 typedef typename Eigen::internal::traits<TensorCwiseUnaryOp>::StorageKind StorageKind;
121 typedef typename Eigen::internal::traits<TensorCwiseUnaryOp>::Index Index;
123 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCwiseUnaryOp(
const XprType& xpr,
const UnaryOp& func = UnaryOp())
124 : m_xpr(xpr), m_functor(func) {}
127 const UnaryOp& functor()
const {
return m_functor; }
131 const typename internal::remove_all<typename XprType::Nested>::type&
132 nestedExpression()
const {
return m_xpr; }
135 typename XprType::Nested m_xpr;
136 const UnaryOp m_functor;
141 template<
typename BinaryOp,
typename LhsXprType,
typename RhsXprType>
142 struct traits<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType> >
148 typedef typename result_of<
149 BinaryOp(
typename LhsXprType::Scalar,
150 typename RhsXprType::Scalar)>::type Scalar;
151 typedef traits<LhsXprType> XprTraits;
152 typedef typename promote_storage_type<
153 typename traits<LhsXprType>::StorageKind,
154 typename traits<RhsXprType>::StorageKind>::ret StorageKind;
155 typedef typename promote_index_type<
156 typename traits<LhsXprType>::Index,
157 typename traits<RhsXprType>::Index>::type Index;
158 typedef typename LhsXprType::Nested LhsNested;
159 typedef typename RhsXprType::Nested RhsNested;
160 typedef typename remove_reference<LhsNested>::type _LhsNested;
161 typedef typename remove_reference<RhsNested>::type _RhsNested;
162 static const int NumDimensions = XprTraits::NumDimensions;
163 static const int Layout = XprTraits::Layout;
170 template<
typename BinaryOp,
typename LhsXprType,
typename RhsXprType>
171 struct eval<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType>,
Eigen::Dense>
173 typedef const TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType>& type;
176 template<
typename BinaryOp,
typename LhsXprType,
typename RhsXprType>
177 struct nested<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType>, 1, typename eval<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType> >::type>
179 typedef TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType> type;
186 template<
typename BinaryOp,
typename LhsXprType,
typename RhsXprType>
187 class TensorCwiseBinaryOp :
public TensorBase<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType>, ReadOnlyAccessors>
192 typedef typename Eigen::internal::traits<TensorCwiseBinaryOp>::Scalar Scalar;
193 typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
194 typedef Scalar CoeffReturnType;
195 typedef typename Eigen::internal::nested<TensorCwiseBinaryOp>::type Nested;
196 typedef typename Eigen::internal::traits<TensorCwiseBinaryOp>::StorageKind StorageKind;
197 typedef typename Eigen::internal::traits<TensorCwiseBinaryOp>::Index Index;
199 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCwiseBinaryOp(
const LhsXprType& lhs,
const RhsXprType& rhs,
const BinaryOp& func = BinaryOp())
200 : m_lhs_xpr(lhs), m_rhs_xpr(rhs), m_functor(func) {}
203 const BinaryOp& functor()
const {
return m_functor; }
207 const typename internal::remove_all<typename LhsXprType::Nested>::type&
208 lhsExpression()
const {
return m_lhs_xpr; }
211 const typename internal::remove_all<typename RhsXprType::Nested>::type&
212 rhsExpression()
const {
return m_rhs_xpr; }
215 typename LhsXprType::Nested m_lhs_xpr;
216 typename RhsXprType::Nested m_rhs_xpr;
217 const BinaryOp m_functor;
222 template<
typename TernaryOp,
typename Arg1XprType,
typename Arg2XprType,
typename Arg3XprType>
223 struct traits<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType> >
226 typedef typename result_of<
227 TernaryOp(
typename Arg1XprType::Scalar,
228 typename Arg2XprType::Scalar,
229 typename Arg3XprType::Scalar)>::type Scalar;
230 typedef traits<Arg1XprType> XprTraits;
231 typedef typename traits<Arg1XprType>::StorageKind StorageKind;
232 typedef typename traits<Arg1XprType>::Index Index;
233 typedef typename Arg1XprType::Nested Arg1Nested;
234 typedef typename Arg2XprType::Nested Arg2Nested;
235 typedef typename Arg3XprType::Nested Arg3Nested;
236 typedef typename remove_reference<Arg1Nested>::type _Arg1Nested;
237 typedef typename remove_reference<Arg2Nested>::type _Arg2Nested;
238 typedef typename remove_reference<Arg3Nested>::type _Arg3Nested;
239 static const int NumDimensions = XprTraits::NumDimensions;
240 static const int Layout = XprTraits::Layout;
247 template<
typename TernaryOp,
typename Arg1XprType,
typename Arg2XprType,
typename Arg3XprType>
248 struct eval<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType>,
Eigen::Dense>
250 typedef const TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType>& type;
253 template<
typename TernaryOp,
typename Arg1XprType,
typename Arg2XprType,
typename Arg3XprType>
254 struct nested<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType>, 1, typename eval<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType> >::type>
256 typedef TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType> type;
263 template<
typename TernaryOp,
typename Arg1XprType,
typename Arg2XprType,
typename Arg3XprType>
264 class TensorCwiseTernaryOp :
public TensorBase<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType>, ReadOnlyAccessors>
267 typedef typename Eigen::internal::traits<TensorCwiseTernaryOp>::Scalar Scalar;
268 typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
269 typedef Scalar CoeffReturnType;
270 typedef typename Eigen::internal::nested<TensorCwiseTernaryOp>::type Nested;
271 typedef typename Eigen::internal::traits<TensorCwiseTernaryOp>::StorageKind StorageKind;
272 typedef typename Eigen::internal::traits<TensorCwiseTernaryOp>::Index Index;
274 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCwiseTernaryOp(
const Arg1XprType& arg1,
const Arg2XprType& arg2,
const Arg3XprType& arg3,
const TernaryOp& func = TernaryOp())
275 : m_arg1_xpr(arg1), m_arg2_xpr(arg2), m_arg3_xpr(arg3), m_functor(func) {}
278 const TernaryOp& functor()
const {
return m_functor; }
282 const typename internal::remove_all<typename Arg1XprType::Nested>::type&
283 arg1Expression()
const {
return m_arg1_xpr; }
286 const typename internal::remove_all<typename Arg2XprType::Nested>::type&
287 arg2Expression()
const {
return m_arg2_xpr; }
290 const typename internal::remove_all<typename Arg3XprType::Nested>::type&
291 arg3Expression()
const {
return m_arg3_xpr; }
294 typename Arg1XprType::Nested m_arg1_xpr;
295 typename Arg2XprType::Nested m_arg2_xpr;
296 typename Arg3XprType::Nested m_arg3_xpr;
297 const TernaryOp m_functor;
302 template<
typename IfXprType,
typename ThenXprType,
typename ElseXprType>
303 struct traits<TensorSelectOp<IfXprType, ThenXprType, ElseXprType> >
304 : traits<ThenXprType>
306 typedef typename traits<ThenXprType>::Scalar Scalar;
307 typedef traits<ThenXprType> XprTraits;
308 typedef typename promote_storage_type<typename traits<ThenXprType>::StorageKind,
309 typename traits<ElseXprType>::StorageKind>::ret StorageKind;
310 typedef typename promote_index_type<typename traits<ElseXprType>::Index,
311 typename traits<ThenXprType>::Index>::type Index;
312 typedef typename IfXprType::Nested IfNested;
313 typedef typename ThenXprType::Nested ThenNested;
314 typedef typename ElseXprType::Nested ElseNested;
315 static const int NumDimensions = XprTraits::NumDimensions;
316 static const int Layout = XprTraits::Layout;
319 template<
typename IfXprType,
typename ThenXprType,
typename ElseXprType>
320 struct eval<TensorSelectOp<IfXprType, ThenXprType, ElseXprType>,
Eigen::Dense>
322 typedef const TensorSelectOp<IfXprType, ThenXprType, ElseXprType>& type;
325 template<
typename IfXprType,
typename ThenXprType,
typename ElseXprType>
326 struct nested<TensorSelectOp<IfXprType, ThenXprType, ElseXprType>, 1, typename eval<TensorSelectOp<IfXprType, ThenXprType, ElseXprType> >::type>
328 typedef TensorSelectOp<IfXprType, ThenXprType, ElseXprType> type;
334 template<
typename IfXprType,
typename ThenXprType,
typename ElseXprType>
335 class TensorSelectOp :
public TensorBase<TensorSelectOp<IfXprType, ThenXprType, ElseXprType>, ReadOnlyAccessors>
338 typedef typename Eigen::internal::traits<TensorSelectOp>::Scalar Scalar;
339 typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
340 typedef typename internal::promote_storage_type<
typename ThenXprType::CoeffReturnType,
341 typename ElseXprType::CoeffReturnType>::ret CoeffReturnType;
342 typedef typename Eigen::internal::nested<TensorSelectOp>::type Nested;
343 typedef typename Eigen::internal::traits<TensorSelectOp>::StorageKind StorageKind;
344 typedef typename Eigen::internal::traits<TensorSelectOp>::Index Index;
347 TensorSelectOp(
const IfXprType& a_condition,
348 const ThenXprType& a_then,
349 const ElseXprType& a_else)
350 : m_condition(a_condition), m_then(a_then), m_else(a_else)
354 const IfXprType& ifExpression()
const {
return m_condition; }
357 const ThenXprType& thenExpression()
const {
return m_then; }
360 const ElseXprType& elseExpression()
const {
return m_else; }
363 typename IfXprType::Nested m_condition;
364 typename ThenXprType::Nested m_then;
365 typename ElseXprType::Nested m_else;
371 #endif // EIGEN_CXX11_TENSOR_TENSOR_EXPR_H Namespace containing all symbols from the Eigen library.
Definition: AdolcForward:45