10 #ifndef EIGEN_CXX11_TENSOR_TENSOR_CONCATENATION_H
11 #define EIGEN_CXX11_TENSOR_TENSOR_CONCATENATION_H
26 template <
typename Axis,
typename LhsXprType,
typename RhsXprType>
46 template <
typename Axis,
typename LhsXprType,
typename RhsXprType>
51 template <
typename Axis,
typename LhsXprType,
typename RhsXprType>
59 template <
typename Axis,
typename LhsXprType,
typename RhsXprType>
92 template <
typename Axis,
typename LeftArgType,
typename RightArgType,
typename Device>
97 static constexpr
int RightNumDims =
121 : m_leftImpl(
op.lhsExpression(), device), m_rightImpl(
op.rhsExpression(), device), m_axis(
op.axis()) {
125 YOU_MADE_A_PROGRAMMING_MISTAKE);
130 const Dimensions& lhs_dims = m_leftImpl.dimensions();
131 const Dimensions& rhs_dims = m_rightImpl.dimensions();
134 for (;
i < m_axis; ++
i) {
137 m_dimensions[
i] = lhs_dims[
i];
141 m_dimensions[
i] = lhs_dims[
i] + rhs_dims[
i];
142 for (++
i;
i < NumDims; ++
i) {
145 m_dimensions[
i] = lhs_dims[
i];
150 m_leftStrides[0] = 1;
151 m_rightStrides[0] = 1;
152 m_outputStrides[0] = 1;
154 for (
int j = 1;
j < NumDims; ++
j) {
155 m_leftStrides[
j] = m_leftStrides[
j - 1] * lhs_dims[
j - 1];
156 m_rightStrides[
j] = m_rightStrides[
j - 1] * rhs_dims[
j - 1];
157 m_outputStrides[
j] = m_outputStrides[
j - 1] * m_dimensions[
j - 1];
160 m_leftStrides[NumDims - 1] = 1;
161 m_rightStrides[NumDims - 1] = 1;
162 m_outputStrides[NumDims - 1] = 1;
164 for (
int j = NumDims - 2;
j >= 0; --
j) {
165 m_leftStrides[
j] = m_leftStrides[
j + 1] * lhs_dims[
j + 1];
166 m_rightStrides[
j] = m_rightStrides[
j + 1] * rhs_dims[
j + 1];
167 m_outputStrides[
j] = m_outputStrides[
j + 1] * m_dimensions[
j + 1];
176 m_leftImpl.evalSubExprsIfNeeded(NULL);
177 m_rightImpl.evalSubExprsIfNeeded(NULL);
182 m_leftImpl.cleanup();
183 m_rightImpl.cleanup();
192 for (
int i = NumDims - 1;
i > 0; --
i) {
193 subs[
i] = index / m_outputStrides[
i];
194 index -= subs[
i] * m_outputStrides[
i];
198 for (
int i = 0;
i < NumDims - 1; ++
i) {
199 subs[
i] = index / m_outputStrides[
i];
200 index -= subs[
i] * m_outputStrides[
i];
202 subs[NumDims - 1] = index;
205 const Dimensions& left_dims = m_leftImpl.dimensions();
206 if (subs[m_axis] < left_dims[m_axis]) {
209 left_index = subs[0];
211 for (
int i = 1;
i < NumDims; ++
i) {
212 left_index += (subs[
i] % left_dims[
i]) * m_leftStrides[
i];
215 left_index = subs[NumDims - 1];
217 for (
int i = NumDims - 2;
i >= 0; --
i) {
218 left_index += (subs[
i] % left_dims[
i]) * m_leftStrides[
i];
221 return m_leftImpl.coeff(left_index);
223 subs[m_axis] -= left_dims[m_axis];
224 const Dimensions& right_dims = m_rightImpl.dimensions();
227 right_index = subs[0];
229 for (
int i = 1;
i < NumDims; ++
i) {
230 right_index += (subs[
i] % right_dims[
i]) * m_rightStrides[
i];
233 right_index = subs[NumDims - 1];
235 for (
int i = NumDims - 2;
i >= 0; --
i) {
236 right_index += (subs[
i] % right_dims[
i]) * m_rightStrides[
i];
239 return m_rightImpl.coeff(right_index);
244 template <
int LoadMode>
252 for (
int i = 0;
i < packetSize; ++
i) {
260 const double compute_cost = NumDims * (2 * TensorOpCost::AddCost<Index>() + 2 * TensorOpCost::MulCost<Index>() +
261 TensorOpCost::DivCost<Index>() + TensorOpCost::ModCost<Index>());
262 const double lhs_size = m_leftImpl.dimensions().TotalSize();
263 const double rhs_size = m_rightImpl.dimensions().TotalSize();
264 return (lhs_size / (lhs_size + rhs_size)) * m_leftImpl.costPerCoeff(vectorized) +
265 (rhs_size / (lhs_size + rhs_size)) * m_rightImpl.costPerCoeff(vectorized) +
TensorOpCost(0, 0, compute_cost);
281 template <
typename Axis,
typename LeftArgType,
typename RightArgType,
typename Device>
283 :
public TensorEvaluator<const TensorConcatenationOp<Axis, LeftArgType, RightArgType>, Device> {
314 for (
int i = Base::NumDims - 1;
i > 0; --
i) {
315 subs[
i] = index / this->m_outputStrides[
i];
316 index -= subs[
i] * this->m_outputStrides[
i];
320 const Dimensions& left_dims = this->m_leftImpl.dimensions();
321 if (subs[this->m_axis] < left_dims[this->m_axis]) {
322 Index left_index = subs[0];
323 for (
int i = 1;
i < Base::NumDims; ++
i) {
324 left_index += (subs[
i] % left_dims[
i]) * this->m_leftStrides[
i];
326 return this->m_leftImpl.coeffRef(left_index);
328 subs[this->m_axis] -= left_dims[this->m_axis];
329 const Dimensions& right_dims = this->m_rightImpl.dimensions();
330 Index right_index = subs[0];
331 for (
int i = 1;
i < Base::NumDims; ++
i) {
332 right_index += (subs[
i] % right_dims[
i]) * this->m_rightStrides[
i];
334 return this->m_rightImpl.coeffRef(right_index);
338 template <
int StoreMode>
345 internal::pstore<CoeffReturnType, PacketReturnType>(values,
x);
346 for (
int i = 0;
i < packetSize; ++
i) {
int i
Definition: BiCGSTAB_step_by_step.cpp:9
#define EIGEN_UNROLL_LOOP
Definition: Macros.h:1298
#define EIGEN_DEVICE_FUNC
Definition: Macros.h:892
#define eigen_assert(x)
Definition: Macros.h:910
#define EIGEN_STRONG_INLINE
Definition: Macros.h:834
#define EIGEN_STATIC_ASSERT(X, MSG)
Definition: StaticAssert.h:26
#define EIGEN_TENSOR_INHERIT_ASSIGNMENT_OPERATORS(Derived)
Macro to manually inherit assignment operators. This is necessary, because the implicitly defined ass...
Definition: TensorMacros.h:81
The tensor base class.
Definition: TensorBase.h:1026
Tensor concatenation class.
Definition: TensorConcatenation.h:60
EIGEN_DEVICE_FUNC const Axis & axis() const
Definition: TensorConcatenation.h:82
internal::traits< TensorConcatenationOp >::StorageKind StorageKind
Definition: TensorConcatenation.h:64
TensorBase< TensorConcatenationOp< Axis, LhsXprType, RhsXprType >, WriteAccessors > Base
Definition: TensorConcatenation.h:62
internal::nested< TensorConcatenationOp >::type Nested
Definition: TensorConcatenation.h:66
EIGEN_DEVICE_FUNC const internal::remove_all_t< typename RhsXprType::Nested > & rhsExpression() const
Definition: TensorConcatenation.h:78
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorConcatenationOp(const LhsXprType &lhs, const RhsXprType &rhs, Axis axis)
Definition: TensorConcatenation.h:71
internal::traits< TensorConcatenationOp >::Index Index
Definition: TensorConcatenation.h:65
RhsXprType::Nested m_rhs_xpr
Definition: TensorConcatenation.h:87
NumTraits< Scalar >::Real RealScalar
Definition: TensorConcatenation.h:69
const Axis m_axis
Definition: TensorConcatenation.h:88
internal::traits< TensorConcatenationOp >::Scalar Scalar
Definition: TensorConcatenation.h:63
internal::promote_storage_type< typename LhsXprType::CoeffReturnType, typename RhsXprType::CoeffReturnType >::ret CoeffReturnType
Definition: TensorConcatenation.h:68
LhsXprType::Nested m_lhs_xpr
Definition: TensorConcatenation.h:86
EIGEN_DEVICE_FUNC const internal::remove_all_t< typename LhsXprType::Nested > & lhsExpression() const
Definition: TensorConcatenation.h:74
Definition: TensorCostModel.h:28
Definition: TensorBlock.h:566
@ WriteAccessors
Definition: Constants.h:374
@ ColMajor
Definition: Constants.h:318
Eigen::DenseIndex ret
Definition: level1_cplx_impl.h:43
char char * op
Definition: level2_impl.h:374
typename remove_all< T >::type remove_all_t
Definition: Meta.h:142
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:70
std::array< T, N > array
Definition: EmulateArray.h:231
squared absolute value
Definition: GlobalFunctions.h:87
Extend namespace for flags.
Definition: fsi_chan_precond_driver.cc:56
val
Definition: calibrate.py:119
type
Definition: compute_granudrum_aor.py:141
Definition: Eigen_Colamd.h:49
list x
Definition: plotDoE.py:28
Definition: Constants.h:519
Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
Definition: NumTraits.h:217
Definition: TensorMeta.h:47
Definition: TensorForwardDeclarations.h:42
TensorConcatenationOp< Axis, LeftArgType, RightArgType > XprType
Definition: TensorConcatenation.h:285
internal::TensorBlockNotImplemented TensorBlock
Definition: TensorConcatenation.h:299
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void writePacket(Index index, const PacketReturnType &x) const
Definition: TensorConcatenation.h:339
XprType::CoeffReturnType CoeffReturnType
Definition: TensorConcatenation.h:308
PacketType< CoeffReturnType, Device >::type PacketReturnType
Definition: TensorConcatenation.h:309
Base::Dimensions Dimensions
Definition: TensorConcatenation.h:286
TensorEvaluator< const TensorConcatenationOp< Axis, LeftArgType, RightArgType >, Device > Base
Definition: TensorConcatenation.h:284
EIGEN_STRONG_INLINE TensorEvaluator(XprType &op, const Device &device)
Definition: TensorConcatenation.h:302
XprType::Index Index
Definition: TensorConcatenation.h:306
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType & coeffRef(Index index) const
Definition: TensorConcatenation.h:311
XprType::Scalar Scalar
Definition: TensorConcatenation.h:307
Definition: TensorConcatenation.h:93
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
Definition: TensorConcatenation.h:188
TensorEvaluator< RightArgType, Device > m_rightImpl
Definition: TensorConcatenation.h:276
PacketType< CoeffReturnType, Device >::type PacketReturnType
Definition: TensorConcatenation.h:102
TensorEvaluator< LeftArgType, Device > m_leftImpl
Definition: TensorConcatenation.h:275
array< Index, NumDims > m_rightStrides
Definition: TensorConcatenation.h:274
EIGEN_DEVICE_FUNC EvaluatorPointerType data() const
Definition: TensorConcatenation.h:268
XprType::Index Index
Definition: TensorConcatenation.h:95
EIGEN_STRONG_INLINE TensorEvaluator(const XprType &op, const Device &device)
Definition: TensorConcatenation.h:120
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorOpCost costPerCoeff(bool vectorized) const
Definition: TensorConcatenation.h:259
StorageMemory< CoeffReturnType, Device > Storage
Definition: TensorConcatenation.h:103
Dimensions m_dimensions
Definition: TensorConcatenation.h:271
array< Index, NumDims > m_leftStrides
Definition: TensorConcatenation.h:273
array< Index, NumDims > m_outputStrides
Definition: TensorConcatenation.h:272
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const
Definition: TensorConcatenation.h:245
TensorConcatenationOp< Axis, LeftArgType, RightArgType > XprType
Definition: TensorConcatenation.h:94
internal::TensorBlockNotImplemented TensorBlock
Definition: TensorConcatenation.h:117
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions & dimensions() const
Definition: TensorConcatenation.h:172
XprType::CoeffReturnType CoeffReturnType
Definition: TensorConcatenation.h:101
EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(EvaluatorPointerType)
Definition: TensorConcatenation.h:175
Storage::Type EvaluatorPointerType
Definition: TensorConcatenation.h:104
const Axis m_axis
Definition: TensorConcatenation.h:277
DSizes< Index, NumDims > Dimensions
Definition: TensorConcatenation.h:99
XprType::Scalar Scalar
Definition: TensorConcatenation.h:100
EIGEN_STRONG_INLINE void cleanup()
Definition: TensorConcatenation.h:181
A cost model used to limit the number of threads used for evaluating tensor expression.
Definition: TensorEvaluator.h:31
static constexpr int Layout
Definition: TensorEvaluator.h:46
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType & coeffRef(Index index) const
Definition: TensorEvaluator.h:94
@ PacketAccess
Definition: TensorEvaluator.h:50
@ IsAligned
Definition: TensorEvaluator.h:49
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
Definition: TensorEvaluator.h:89
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions & dimensions() const
Definition: TensorEvaluator.h:69
const TensorConcatenationOp< Axis, LhsXprType, RhsXprType > & type
Definition: TensorConcatenation.h:48
Definition: XprHelper.h:427
TensorConcatenationOp< Axis, LhsXprType, RhsXprType > type
Definition: TensorConcatenation.h:54
Definition: TensorTraits.h:152
ref_selector< T >::type type
Definition: TensorTraits.h:153
RhsXprType::Nested RhsNested
Definition: TensorConcatenation.h:35
promote_storage_type< typename LhsXprType::Scalar, typename RhsXprType::Scalar >::ret Scalar
Definition: TensorConcatenation.h:29
LhsXprType::Nested LhsNested
Definition: TensorConcatenation.h:34
promote_storage_type< typename traits< LhsXprType >::StorageKind, typename traits< RhsXprType >::StorageKind >::ret StorageKind
Definition: TensorConcatenation.h:31
std::remove_reference_t< LhsNested > LhsNested_
Definition: TensorConcatenation.h:36
promote_index_type< typename traits< LhsXprType >::Index, typename traits< RhsXprType >::Index >::type Index
Definition: TensorConcatenation.h:33
std::conditional_t< Pointer_type_promotion< typename LhsXprType::Scalar, Scalar >::val, typename traits< LhsXprType >::PointerType, typename traits< RhsXprType >::PointerType > PointerType
Definition: TensorConcatenation.h:43
std::remove_reference_t< RhsNested > RhsNested_
Definition: TensorConcatenation.h:37
Definition: ForwardDeclarations.h:21
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2