10 #ifndef EIGEN_CXX11_TENSOR_TENSOR_SHUFFLING_H 11 #define EIGEN_CXX11_TENSOR_TENSOR_SHUFFLING_H 23 template<
typename Shuffle,
typename XprType>
30 typedef typename XprType::Nested
Nested;
32 static const int NumDimensions = XprTraits::NumDimensions;
33 static const int Layout = XprTraits::Layout;
36 template<
typename Shuffle,
typename XprType>
42 template<
typename Shuffle,
typename XprType>
52 template<
typename Shuffle,
typename XprType>
64 : m_xpr(expr), m_shuffle(shuffle) {}
77 Assign assign(*
this, other);
82 template<
typename OtherDerived>
87 Assign assign(*
this, other);
99 template<
typename Shuffle,
typename ArgType,
typename Device>
120 : m_impl(op.expression(), device)
124 for (
int i = 0;
i < NumDims; ++
i) {
125 m_dimensions[
i] = input_dims[shuffle[
i]];
130 if (static_cast<int>(Layout) == static_cast<int>(
ColMajor)) {
132 m_outputStrides[0] = 1;
133 for (
int i = 1;
i < NumDims; ++
i) {
134 inputStrides[
i] = inputStrides[
i - 1] * input_dims[
i - 1];
135 m_outputStrides[
i] = m_outputStrides[
i - 1] * m_dimensions[
i - 1];
138 inputStrides[NumDims - 1] = 1;
139 m_outputStrides[NumDims - 1] = 1;
140 for (
int i = NumDims - 2;
i >= 0; --
i) {
141 inputStrides[
i] = inputStrides[
i + 1] * input_dims[
i + 1];
142 m_outputStrides[
i] = m_outputStrides[
i + 1] * m_dimensions[
i + 1];
146 for (
int i = 0;
i < NumDims; ++
i) {
147 m_inputStrides[
i] = inputStrides[shuffle[
i]];
154 m_impl.evalSubExprsIfNeeded(
NULL);
163 return m_impl.coeff(srcCoeff(index));
166 template<
int LoadMode>
173 for (
int i = 0;
i < PacketSize; ++
i) {
174 values[
i] = coeff(index+
i);
176 PacketReturnType rslt = internal::pload<PacketReturnType>(
values);
181 const double compute_cost = NumDims * (2 * TensorOpCost::AddCost<Index>() +
182 2 * TensorOpCost::MulCost<Index>() +
183 TensorOpCost::DivCost<Index>());
184 return m_impl.costPerCoeff(vectorized) +
188 EIGEN_DEVICE_FUNC Scalar*
data()
const {
return NULL; }
192 Index inputIndex = 0;
193 if (static_cast<int>(Layout) == static_cast<int>(
ColMajor)) {
194 for (
int i = NumDims - 1;
i > 0; --
i) {
195 const Index idx = index / m_outputStrides[
i];
196 inputIndex += idx * m_inputStrides[
i];
197 index -= idx * m_outputStrides[
i];
199 return inputIndex + index * m_inputStrides[0];
201 for (
int i = 0;
i < NumDims - 1; ++
i) {
202 const Index idx = index / m_outputStrides[
i];
203 inputIndex += idx * m_inputStrides[
i];
204 index -= idx * m_outputStrides[
i];
206 return inputIndex + index * m_inputStrides[NumDims - 1];
218 template<
typename Shuffle,
typename ArgType,
typename Device>
220 :
public TensorEvaluator<const TensorShufflingOp<Shuffle, ArgType>, Device>
245 return this->m_impl.coeffRef(this->srcCoeff(index));
254 internal::pstore<CoeffReturnType, PacketReturnType>(
values,
x);
255 for (
int i = 0;
i < PacketSize; ++
i) {
256 this->coeffRef(index+
i) = values[
i];
264 #endif // EIGEN_CXX11_TENSOR_TENSOR_SHUFFLING_H
Eigen::NumTraits< Scalar >::Real RealScalar
#define EIGEN_STRONG_INLINE
XprType::CoeffReturnType CoeffReturnType
Eigen::internal::nested< TensorShufflingOp >::type Nested
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions & dimensions() const
const TensorShufflingOp< Shuffle, XprType > & type
EIGEN_DEVICE_FUNC Scalar * data() const
TensorShufflingOp< Shuffle, ArgType > XprType
XprType::CoeffReturnType CoeffReturnType
PacketType< CoeffReturnType, Device >::type PacketReturnType
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType & coeffRef(Index index)
XprTraits::StorageKind StorageKind
PacketType< CoeffReturnType, Device >::type PacketReturnType
Namespace containing all symbols from the Eigen library.
A cost model used to limit the number of threads used for evaluating tensor expression.
#define EIGEN_STATIC_ASSERT(CONDITION, MSG)
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(const XprType &op, const Device &device)
vector< size_t > dimensions(L.begin(), L.end())
traits< XprType > XprTraits
array< Index, NumDims > m_outputStrides
TensorEvaluator< const TensorShufflingOp< Shuffle, ArgType >, Device > Base
remove_reference< Nested >::type _Nested
Eigen::internal::traits< TensorShufflingOp >::Scalar Scalar
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(Scalar *)
EIGEN_DEVICE_FUNC const internal::remove_all< typename XprType::Nested >::type & expression() const
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
TensorShufflingOp< Shuffle, XprType > type
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorShufflingOp(const XprType &expr, const Shuffle &shuffle)
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index srcCoeff(Index index) const
DSizes< Index, NumDims > Dimensions
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions & dimensions() const
static EIGEN_DEVICE_FUNC void run(const Expression &expr, const Device &device=Device())
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const
array< Index, NumDims > m_inputStrides
XprType::CoeffReturnType CoeffReturnType
TensorShufflingOp< Shuffle, ArgType > XprType
Eigen::internal::traits< TensorShufflingOp >::Index Index
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
EIGEN_STRONG_INLINE void writePacket(Index index, const PacketReturnType &x)
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(const XprType &op, const Device &device)
DSizes< Index, NumDims > Dimensions
EIGEN_DEVICE_FUNC const Shuffle & shufflePermutation() const
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void cleanup()
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const
set noclip points set clip one set noclip two set bar set border lt lw set xdata set ydata set zdata set x2data set y2data set boxwidth set dummy x
Eigen::internal::traits< TensorShufflingOp >::StorageKind StorageKind
TensorEvaluator< ArgType, Device > m_impl