11 #ifndef EIGEN_CXX11_TENSOR_TENSOR_REVERSE_H
12 #define EIGEN_CXX11_TENSOR_TENSOR_REVERSE_H
22 template<
typename ReverseDimensions,
typename XprType>
23 struct traits<TensorReverseOp<ReverseDimensions,
24 XprType> > :
public traits<XprType>
26 typedef typename XprType::Scalar Scalar;
27 typedef traits<XprType> XprTraits;
28 typedef typename packet_traits<Scalar>::type Packet;
29 typedef typename XprTraits::StorageKind StorageKind;
30 typedef typename XprTraits::Index Index;
31 typedef typename XprType::Nested Nested;
32 typedef typename remove_reference<Nested>::type _Nested;
33 static const int NumDimensions = XprTraits::NumDimensions;
34 static const int Layout = XprTraits::Layout;
37 template<
typename ReverseDimensions,
typename XprType>
38 struct eval<TensorReverseOp<ReverseDimensions, XprType>,
Eigen::Dense>
40 typedef const TensorReverseOp<ReverseDimensions, XprType>& type;
43 template<
typename ReverseDimensions,
typename XprType>
44 struct nested<TensorReverseOp<ReverseDimensions, XprType>, 1,
45 typename eval<TensorReverseOp<ReverseDimensions, XprType> >::type>
47 typedef TensorReverseOp<ReverseDimensions, XprType> type;
52 template<
typename ReverseDimensions,
typename XprType>
53 class TensorReverseOp :
public TensorBase<TensorReverseOp<ReverseDimensions,
54 XprType>, WriteAccessors>
57 typedef typename Eigen::internal::traits<TensorReverseOp>::Scalar Scalar;
58 typedef typename Eigen::internal::traits<TensorReverseOp>::Packet Packet;
59 typedef typename Eigen::NumTraits<Scalar>::Real RealScalar;
60 typedef typename XprType::CoeffReturnType CoeffReturnType;
61 typedef typename XprType::PacketReturnType PacketReturnType;
62 typedef typename Eigen::internal::nested<TensorReverseOp>::type Nested;
63 typedef typename Eigen::internal::traits<TensorReverseOp>::StorageKind
65 typedef typename Eigen::internal::traits<TensorReverseOp>::Index Index;
67 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorReverseOp(
68 const XprType& expr,
const ReverseDimensions& reverse_dims)
69 : m_xpr(expr), m_reverse_dims(reverse_dims) {}
72 const ReverseDimensions& reverse()
const {
return m_reverse_dims; }
75 const typename internal::remove_all<typename XprType::Nested>::type&
76 expression()
const {
return m_xpr; }
79 EIGEN_STRONG_INLINE TensorReverseOp& operator = (
const TensorReverseOp& other)
81 typedef TensorAssignOp<TensorReverseOp, const TensorReverseOp> Assign;
82 Assign assign(*
this, other);
83 internal::TensorExecutor<const Assign, DefaultDevice>::run(assign, DefaultDevice());
87 template<
typename OtherDerived>
89 EIGEN_STRONG_INLINE TensorReverseOp& operator = (
const OtherDerived& other)
91 typedef TensorAssignOp<TensorReverseOp, const OtherDerived> Assign;
92 Assign assign(*
this, other);
93 internal::TensorExecutor<const Assign, DefaultDevice>::run(assign, DefaultDevice());
98 typename XprType::Nested m_xpr;
99 const ReverseDimensions m_reverse_dims;
103 template<
typename ReverseDimensions,
typename ArgType,
typename Device>
104 struct TensorEvaluator<const TensorReverseOp<ReverseDimensions, ArgType>, Device>
106 typedef TensorReverseOp<ReverseDimensions, ArgType> XprType;
107 typedef typename XprType::Index Index;
108 static const int NumDims = internal::array_size<ReverseDimensions>::value;
109 typedef DSizes<Index, NumDims> Dimensions;
113 PacketAccess = TensorEvaluator<ArgType, Device>::PacketAccess,
114 Layout = TensorEvaluator<ArgType, Device>::Layout,
118 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(
const XprType& op,
119 const Device& device)
120 : m_impl(op.expression(), device), m_reverse(op.reverse())
123 m_dimensions = m_impl.dimensions();
124 if (static_cast<int>(Layout) == static_cast<int>(ColMajor)) {
126 for (
int i = 1; i < NumDims; ++i) {
127 m_strides[i] = m_strides[i-1] * m_dimensions[i-1];
130 m_strides[NumDims-1] = 1;
131 for (
int i = NumDims - 2; i >= 0; --i) {
132 m_strides[i] = m_strides[i+1] * m_dimensions[i+1];
137 typedef typename XprType::Scalar Scalar;
138 typedef typename XprType::CoeffReturnType CoeffReturnType;
139 typedef typename XprType::PacketReturnType PacketReturnType;
141 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
142 const Dimensions& dimensions()
const {
return m_dimensions; }
144 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
bool evalSubExprsIfNeeded(Scalar*) {
145 m_impl.evalSubExprsIfNeeded(NULL);
148 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void cleanup() {
152 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index reverseIndex(
154 eigen_assert(index < dimensions().TotalSize());
155 Index inputIndex = 0;
156 if (static_cast<int>(Layout) == static_cast<int>(ColMajor)) {
157 for (
int i = NumDims - 1; i > 0; --i) {
158 Index idx = index / m_strides[i];
159 index -= idx * m_strides[i];
161 idx = m_dimensions[i] - idx - 1;
163 inputIndex += idx * m_strides[i] ;
166 inputIndex += (m_dimensions[0] - index - 1);
171 for (
int i = 0; i < NumDims - 1; ++i) {
172 Index idx = index / m_strides[i];
173 index -= idx * m_strides[i];
175 idx = m_dimensions[i] - idx - 1;
177 inputIndex += idx * m_strides[i] ;
179 if (m_reverse[NumDims-1]) {
180 inputIndex += (m_dimensions[NumDims-1] - index - 1);
188 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(
190 return m_impl.coeff(reverseIndex(index));
193 template<
int LoadMode>
194 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
195 PacketReturnType packet(Index index)
const
197 const int packetSize = internal::unpacket_traits<PacketReturnType>::size;
198 EIGEN_STATIC_ASSERT(packetSize > 1, YOU_MADE_A_PROGRAMMING_MISTAKE)
199 eigen_assert(index+packetSize-1 < dimensions().TotalSize());
203 EIGEN_ALIGN_MAX typename internal::remove_const<CoeffReturnType>::type
205 for (
int i = 0; i < packetSize; ++i) {
206 values[i] = coeff(index+i);
208 PacketReturnType rslt = internal::pload<PacketReturnType>(values);
212 EIGEN_DEVICE_FUNC Scalar* data()
const {
return NULL; }
215 Dimensions m_dimensions;
216 array<Index, NumDims> m_strides;
217 TensorEvaluator<ArgType, Device> m_impl;
218 ReverseDimensions m_reverse;
223 template <
typename ReverseDimensions,
typename ArgType,
typename Device>
224 struct TensorEvaluator<TensorReverseOp<ReverseDimensions, ArgType>, Device>
225 :
public TensorEvaluator<const TensorReverseOp<ReverseDimensions, ArgType>,
227 typedef TensorEvaluator<const TensorReverseOp<ReverseDimensions, ArgType>,
229 typedef TensorReverseOp<ReverseDimensions, ArgType> XprType;
230 typedef typename XprType::Index Index;
231 static const int NumDims = internal::array_size<ReverseDimensions>::value;
232 typedef DSizes<Index, NumDims> Dimensions;
236 PacketAccess = TensorEvaluator<ArgType, Device>::PacketAccess,
237 Layout = TensorEvaluator<ArgType, Device>::Layout,
240 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(
const XprType& op,
241 const Device& device)
242 : Base(op, device) {}
244 typedef typename XprType::Scalar Scalar;
245 typedef typename XprType::CoeffReturnType CoeffReturnType;
246 typedef typename XprType::PacketReturnType PacketReturnType;
248 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
249 const Dimensions& dimensions()
const {
return this->m_dimensions; }
251 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar& coeffRef(Index index) {
252 return this->m_impl.coeffRef(this->reverseIndex(index));
255 template <
int StoreMode> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
256 void writePacket(Index index,
const PacketReturnType& x) {
257 const int packetSize = internal::unpacket_traits<PacketReturnType>::size;
258 EIGEN_STATIC_ASSERT(packetSize > 1, YOU_MADE_A_PROGRAMMING_MISTAKE)
259 eigen_assert(index+packetSize-1 < dimensions().TotalSize());
262 EIGEN_ALIGN_MAX CoeffReturnType values[packetSize];
263 internal::pstore<CoeffReturnType, PacketReturnType>(values, x);
264 for (
int i = 0; i < packetSize; ++i) {
265 this->coeffRef(index+i) = values[i];
274 #endif // EIGEN_CXX11_TENSOR_TENSOR_REVERSE_H
Namespace containing all symbols from the Eigen library.
Definition: CXX11Meta.h:13