Eigen-unsupported  3.4.1 (git rev 28ded8800c26864e537852658428ab44c8399e87)
 
Loading...
Searching...
No Matches
TensorExpr.h
1// This file is part of Eigen, a lightweight C++ template library
2// for linear algebra.
3//
4// Copyright (C) 2014 Benoit Steiner <benoit.steiner.goog@gmail.com>
5//
6// This Source Code Form is subject to the terms of the Mozilla
7// Public License v. 2.0. If a copy of the MPL was not distributed
8// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9
10#ifndef EIGEN_CXX11_TENSOR_TENSOR_EXPR_H
11#define EIGEN_CXX11_TENSOR_TENSOR_EXPR_H
12
13namespace Eigen {
14
15namespace internal {
16template<typename NullaryOp, typename XprType>
17struct traits<TensorCwiseNullaryOp<NullaryOp, XprType> >
18 : traits<XprType>
19{
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;
26 typedef typename XprTraits::PointerType PointerType;
27 enum {
28 Flags = 0
29 };
30};
31
32} // end namespace internal
33
42template <typename NullaryOp, typename XprType>
43class TensorCwiseNullaryOp : public TensorBase<TensorCwiseNullaryOp<NullaryOp, XprType>, ReadOnlyAccessors> {
44 public:
45 typedef typename Eigen::internal::traits<TensorCwiseNullaryOp>::Scalar Scalar;
46 typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
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;
51
52 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCwiseNullaryOp(const XprType& xpr, const NullaryOp& func = NullaryOp())
53 : m_xpr(xpr), m_functor(func) {}
54
55 EIGEN_DEVICE_FUNC
56 const typename internal::remove_all<typename XprType::Nested>::type&
57 nestedExpression() const { return m_xpr; }
58
59 EIGEN_DEVICE_FUNC
60 const NullaryOp& functor() const { return m_functor; }
61
62 protected:
63 typename XprType::Nested m_xpr;
64 const NullaryOp m_functor;
65};
66
67
68
69namespace internal {
70template<typename UnaryOp, typename XprType>
71struct traits<TensorCwiseUnaryOp<UnaryOp, XprType> >
72 : traits<XprType>
73{
74 // TODO(phli): Add InputScalar, InputPacket. Check references to
75 // current Scalar/Packet to see if the intent is Input or Output.
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;
82 typedef typename TypeConversion<Scalar,
83 typename XprTraits::PointerType
84 >::type
85 PointerType;
86};
87
88template<typename UnaryOp, typename XprType>
89struct eval<TensorCwiseUnaryOp<UnaryOp, XprType>, Eigen::Dense>
90{
91 typedef const TensorCwiseUnaryOp<UnaryOp, XprType>& type;
92};
93
94template<typename UnaryOp, typename XprType>
95struct nested<TensorCwiseUnaryOp<UnaryOp, XprType>, 1, typename eval<TensorCwiseUnaryOp<UnaryOp, XprType> >::type>
96{
97 typedef TensorCwiseUnaryOp<UnaryOp, XprType> type;
98};
99
100} // end namespace internal
101
110template <typename UnaryOp, typename XprType>
111class TensorCwiseUnaryOp : public TensorBase<TensorCwiseUnaryOp<UnaryOp, XprType>, ReadOnlyAccessors> {
112 public:
113 // TODO(phli): Add InputScalar, InputPacket. Check references to
114 // current Scalar/Packet to see if the intent is Input or Output.
115 typedef typename Eigen::internal::traits<TensorCwiseUnaryOp>::Scalar Scalar;
116 typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
117 typedef Scalar CoeffReturnType;
118 typedef typename Eigen::internal::nested<TensorCwiseUnaryOp>::type Nested;
119 typedef typename Eigen::internal::traits<TensorCwiseUnaryOp>::StorageKind StorageKind;
120 typedef typename Eigen::internal::traits<TensorCwiseUnaryOp>::Index Index;
121
122 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCwiseUnaryOp(const XprType& xpr, const UnaryOp& func = UnaryOp())
123 : m_xpr(xpr), m_functor(func) {}
124
125 EIGEN_DEVICE_FUNC
126 const UnaryOp& functor() const { return m_functor; }
127
129 EIGEN_DEVICE_FUNC
130 const typename internal::remove_all<typename XprType::Nested>::type&
131 nestedExpression() const { return m_xpr; }
132
133 protected:
134 typename XprType::Nested m_xpr;
135 const UnaryOp m_functor;
136};
137
138
139namespace internal {
140template<typename BinaryOp, typename LhsXprType, typename RhsXprType>
141struct traits<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType> >
142{
143 // Type promotion to handle the case where the types of the lhs and the rhs
144 // are different.
145 // TODO(phli): Add Lhs/RhsScalar, Lhs/RhsPacket. Check references to
146 // current Scalar/Packet to see if the intent is Inputs or Output.
147 typedef typename result_of<
148 BinaryOp(typename LhsXprType::Scalar,
149 typename RhsXprType::Scalar)>::type Scalar;
150 typedef traits<LhsXprType> XprTraits;
151 typedef typename promote_storage_type<
152 typename traits<LhsXprType>::StorageKind,
153 typename traits<RhsXprType>::StorageKind>::ret StorageKind;
154 typedef typename promote_index_type<
155 typename traits<LhsXprType>::Index,
156 typename traits<RhsXprType>::Index>::type Index;
157 typedef typename LhsXprType::Nested LhsNested;
158 typedef typename RhsXprType::Nested RhsNested;
159 typedef typename remove_reference<LhsNested>::type _LhsNested;
160 typedef typename remove_reference<RhsNested>::type _RhsNested;
161 static const int NumDimensions = XprTraits::NumDimensions;
162 static const int Layout = XprTraits::Layout;
163 typedef typename TypeConversion<Scalar,
164 typename conditional<Pointer_type_promotion<typename LhsXprType::Scalar, Scalar>::val,
165 typename traits<LhsXprType>::PointerType,
166 typename traits<RhsXprType>::PointerType>::type
167 >::type
168 PointerType;
169 enum {
170 Flags = 0
171 };
172};
173
174template<typename BinaryOp, typename LhsXprType, typename RhsXprType>
175struct eval<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType>, Eigen::Dense>
176{
177 typedef const TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType>& type;
178};
179
180template<typename BinaryOp, typename LhsXprType, typename RhsXprType>
181struct nested<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType>, 1, typename eval<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType> >::type>
182{
183 typedef TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType> type;
184};
185
186} // end namespace internal
187
196template <typename BinaryOp, typename LhsXprType, typename RhsXprType>
197class TensorCwiseBinaryOp
198 : public TensorBase<TensorCwiseBinaryOp<BinaryOp, LhsXprType, RhsXprType>, ReadOnlyAccessors> {
199 public:
200 // TODO(phli): Add Lhs/RhsScalar, Lhs/RhsPacket. Check references to
201 // current Scalar/Packet to see if the intent is Inputs or Output.
202 typedef typename Eigen::internal::traits<TensorCwiseBinaryOp>::Scalar Scalar;
203 typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
204 typedef Scalar CoeffReturnType;
205 typedef typename Eigen::internal::nested<TensorCwiseBinaryOp>::type Nested;
206 typedef typename Eigen::internal::traits<TensorCwiseBinaryOp>::StorageKind StorageKind;
207 typedef typename Eigen::internal::traits<TensorCwiseBinaryOp>::Index Index;
208
209 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCwiseBinaryOp(const LhsXprType& lhs, const RhsXprType& rhs, const BinaryOp& func = BinaryOp())
210 : m_lhs_xpr(lhs), m_rhs_xpr(rhs), m_functor(func) {}
211
212 EIGEN_DEVICE_FUNC
213 const BinaryOp& functor() const { return m_functor; }
214
216 EIGEN_DEVICE_FUNC
217 const typename internal::remove_all<typename LhsXprType::Nested>::type&
218 lhsExpression() const { return m_lhs_xpr; }
219
220 EIGEN_DEVICE_FUNC
221 const typename internal::remove_all<typename RhsXprType::Nested>::type&
222 rhsExpression() const { return m_rhs_xpr; }
223
224 protected:
225 typename LhsXprType::Nested m_lhs_xpr;
226 typename RhsXprType::Nested m_rhs_xpr;
227 const BinaryOp m_functor;
228};
229
230
231namespace internal {
232template<typename TernaryOp, typename Arg1XprType, typename Arg2XprType, typename Arg3XprType>
233struct traits<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType> >
234{
235 // Type promotion to handle the case where the types of the args are different.
236 typedef typename result_of<
237 TernaryOp(typename Arg1XprType::Scalar,
238 typename Arg2XprType::Scalar,
239 typename Arg3XprType::Scalar)>::type Scalar;
240 typedef traits<Arg1XprType> XprTraits;
241 typedef typename traits<Arg1XprType>::StorageKind StorageKind;
242 typedef typename traits<Arg1XprType>::Index Index;
243 typedef typename Arg1XprType::Nested Arg1Nested;
244 typedef typename Arg2XprType::Nested Arg2Nested;
245 typedef typename Arg3XprType::Nested Arg3Nested;
246 typedef typename remove_reference<Arg1Nested>::type _Arg1Nested;
247 typedef typename remove_reference<Arg2Nested>::type _Arg2Nested;
248 typedef typename remove_reference<Arg3Nested>::type _Arg3Nested;
249 static const int NumDimensions = XprTraits::NumDimensions;
250 static const int Layout = XprTraits::Layout;
251 typedef typename TypeConversion<Scalar,
252 typename conditional<Pointer_type_promotion<typename Arg2XprType::Scalar, Scalar>::val,
253 typename traits<Arg2XprType>::PointerType,
254 typename traits<Arg3XprType>::PointerType>::type
255 >::type
256 PointerType;
257 enum {
258 Flags = 0
259 };
260};
261
262template<typename TernaryOp, typename Arg1XprType, typename Arg2XprType, typename Arg3XprType>
263struct eval<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType>, Eigen::Dense>
264{
265 typedef const TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType>& type;
266};
267
268template<typename TernaryOp, typename Arg1XprType, typename Arg2XprType, typename Arg3XprType>
269struct nested<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType>, 1, typename eval<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType> >::type>
270{
271 typedef TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType> type;
272};
273
274} // end namespace internal
275
276
277
278template<typename TernaryOp, typename Arg1XprType, typename Arg2XprType, typename Arg3XprType>
279class TensorCwiseTernaryOp : public TensorBase<TensorCwiseTernaryOp<TernaryOp, Arg1XprType, Arg2XprType, Arg3XprType>, ReadOnlyAccessors>
280{
281 public:
282 typedef typename Eigen::internal::traits<TensorCwiseTernaryOp>::Scalar Scalar;
283 typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
284 typedef Scalar CoeffReturnType;
285 typedef typename Eigen::internal::nested<TensorCwiseTernaryOp>::type Nested;
286 typedef typename Eigen::internal::traits<TensorCwiseTernaryOp>::StorageKind StorageKind;
287 typedef typename Eigen::internal::traits<TensorCwiseTernaryOp>::Index Index;
288
289 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorCwiseTernaryOp(const Arg1XprType& arg1, const Arg2XprType& arg2, const Arg3XprType& arg3, const TernaryOp& func = TernaryOp())
290 : m_arg1_xpr(arg1), m_arg2_xpr(arg2), m_arg3_xpr(arg3), m_functor(func) {}
291
292 EIGEN_DEVICE_FUNC
293 const TernaryOp& functor() const { return m_functor; }
294
296 EIGEN_DEVICE_FUNC
297 const typename internal::remove_all<typename Arg1XprType::Nested>::type&
298 arg1Expression() const { return m_arg1_xpr; }
299
300 EIGEN_DEVICE_FUNC
301 const typename internal::remove_all<typename Arg2XprType::Nested>::type&
302 arg2Expression() const { return m_arg2_xpr; }
303
304 EIGEN_DEVICE_FUNC
305 const typename internal::remove_all<typename Arg3XprType::Nested>::type&
306 arg3Expression() const { return m_arg3_xpr; }
307
308 protected:
309 typename Arg1XprType::Nested m_arg1_xpr;
310 typename Arg2XprType::Nested m_arg2_xpr;
311 typename Arg3XprType::Nested m_arg3_xpr;
312 const TernaryOp m_functor;
313};
314
315
316namespace internal {
317template<typename IfXprType, typename ThenXprType, typename ElseXprType>
318struct traits<TensorSelectOp<IfXprType, ThenXprType, ElseXprType> >
319 : traits<ThenXprType>
320{
321 typedef typename traits<ThenXprType>::Scalar Scalar;
322 typedef traits<ThenXprType> XprTraits;
323 typedef typename promote_storage_type<typename traits<ThenXprType>::StorageKind,
324 typename traits<ElseXprType>::StorageKind>::ret StorageKind;
325 typedef typename promote_index_type<typename traits<ElseXprType>::Index,
326 typename traits<ThenXprType>::Index>::type Index;
327 typedef typename IfXprType::Nested IfNested;
328 typedef typename ThenXprType::Nested ThenNested;
329 typedef typename ElseXprType::Nested ElseNested;
330 static const int NumDimensions = XprTraits::NumDimensions;
331 static const int Layout = XprTraits::Layout;
332 typedef typename conditional<Pointer_type_promotion<typename ThenXprType::Scalar, Scalar>::val,
333 typename traits<ThenXprType>::PointerType,
334 typename traits<ElseXprType>::PointerType>::type PointerType;
335};
336
337template<typename IfXprType, typename ThenXprType, typename ElseXprType>
338struct eval<TensorSelectOp<IfXprType, ThenXprType, ElseXprType>, Eigen::Dense>
339{
340 typedef const TensorSelectOp<IfXprType, ThenXprType, ElseXprType>& type;
341};
342
343template<typename IfXprType, typename ThenXprType, typename ElseXprType>
344struct nested<TensorSelectOp<IfXprType, ThenXprType, ElseXprType>, 1, typename eval<TensorSelectOp<IfXprType, ThenXprType, ElseXprType> >::type>
345{
346 typedef TensorSelectOp<IfXprType, ThenXprType, ElseXprType> type;
347};
348
349} // end namespace internal
350
351
352template<typename IfXprType, typename ThenXprType, typename ElseXprType>
353class TensorSelectOp : public TensorBase<TensorSelectOp<IfXprType, ThenXprType, ElseXprType>, ReadOnlyAccessors>
354{
355 public:
356 typedef typename Eigen::internal::traits<TensorSelectOp>::Scalar Scalar;
357 typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
358 typedef typename internal::promote_storage_type<typename ThenXprType::CoeffReturnType,
359 typename ElseXprType::CoeffReturnType>::ret CoeffReturnType;
360 typedef typename Eigen::internal::nested<TensorSelectOp>::type Nested;
361 typedef typename Eigen::internal::traits<TensorSelectOp>::StorageKind StorageKind;
362 typedef typename Eigen::internal::traits<TensorSelectOp>::Index Index;
363
364 EIGEN_DEVICE_FUNC
365 TensorSelectOp(const IfXprType& a_condition,
366 const ThenXprType& a_then,
367 const ElseXprType& a_else)
368 : m_condition(a_condition), m_then(a_then), m_else(a_else)
369 { }
370
371 EIGEN_DEVICE_FUNC
372 const IfXprType& ifExpression() const { return m_condition; }
373
374 EIGEN_DEVICE_FUNC
375 const ThenXprType& thenExpression() const { return m_then; }
376
377 EIGEN_DEVICE_FUNC
378 const ElseXprType& elseExpression() const { return m_else; }
379
380 protected:
381 typename IfXprType::Nested m_condition;
382 typename ThenXprType::Nested m_then;
383 typename ElseXprType::Nested m_else;
384};
385
386
387} // end namespace Eigen
388
389#endif // EIGEN_CXX11_TENSOR_TENSOR_EXPR_H
The tensor base class.
Definition TensorForwardDeclarations.h:56
const internal::remove_all< typenameLhsXprType::Nested >::type & lhsExpression() const
Definition TensorExpr.h:218
Tensor unary expression.
Definition TensorExpr.h:111
const internal::remove_all< typenameXprType::Nested >::type & nestedExpression() const
Definition TensorExpr.h:131
Namespace containing all symbols from the Eigen library.
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index