Go to the documentation of this file.
10 #ifndef EIGEN_CXX11_TENSOR_TENSOR_FFT_H
11 #define EIGEN_CXX11_TENSOR_TENSOR_FFT_H
35 std::complex<T>
operator() (
const T& val)
const {
return std::complex<T>(val, 0); }
41 std::complex<T>
operator() (
const std::complex<T>& val)
const {
return val; }
44 template <
int ResultType>
struct PartOf {
45 template <
typename T>
T operator() (
const T& val)
const {
return val; }
49 template <
typename T>
T operator() (
const std::complex<T>& val)
const {
return val.real(); }
53 template <
typename T>
T operator() (
const std::complex<T>& val)
const {
return val.imag(); }
57 template <
typename FFT,
typename XprType,
int FFTResultType,
int FFTDir>
66 typedef typename XprType::Nested
Nested;
68 static const int NumDimensions = XprTraits::NumDimensions;
69 static const int Layout = XprTraits::Layout;
73 template <
typename FFT,
typename XprType,
int FFTResultType,
int FFTDirection>
78 template <
typename FFT,
typename XprType,
int FFTResultType,
int FFTDirection>
85 template <
typename FFT,
typename XprType,
int FFTResultType,
int FFTDir>
114 template <
typename FFT,
typename ArgType,
typename Device,
int FFTResultType,
int FFTDir>
149 for (
int i = 0;
i < NumDims; ++
i) {
151 m_dimensions[
i] = input_dims[
i];
156 for (
int i = 1;
i < NumDims; ++
i) {
157 m_strides[
i] = m_strides[
i - 1] * m_dimensions[
i - 1];
160 m_strides[NumDims - 1] = 1;
161 for (
int i = NumDims - 2;
i >= 0; --
i) {
162 m_strides[
i] = m_strides[
i + 1] * m_dimensions[
i + 1];
165 m_size = m_dimensions.TotalSize();
173 m_impl.evalSubExprsIfNeeded(
NULL);
196 template <
int LoadMode>
199 return internal::ploadt<PacketReturnType, LoadMode>(
m_data + index);
208 #ifdef EIGEN_USE_SYCL
220 for (
Index i = 0;
i < m_size; ++
i) {
224 for (
size_t i = 0;
i < m_fft.size(); ++
i) {
227 Index line_len = m_dimensions[dim];
230 const bool is_power_of_two = isPowerOfTwo(line_len);
231 const Index good_composite = is_power_of_two ? 0 : findGoodComposite(line_len);
232 const Index log_len = is_power_of_two ? getLog2(line_len) : getLog2(good_composite);
237 if (!is_power_of_two) {
264 for (
int j = 0;
j < line_len + 1; ++
j) {
271 for (
Index partial_index = 0; partial_index < m_size / line_len; ++partial_index) {
272 const Index base_offset = getBaseOffsetFromIndex(partial_index, dim);
275 const Index stride = m_strides[dim];
280 for (
int j = 0;
j < line_len; ++
j,
offset += stride) {
286 if (is_power_of_two) {
287 processDataLineCooleyTukey(line_buf, line_len, log_len);
290 processDataLineBluestein(line_buf, line_len, good_composite, log_len,
a,
b, pos_j_base_powered);
299 for (
int j = 0;
j < line_len; ++
j,
offset += stride) {
305 if (!is_power_of_two) {
308 m_device.deallocate(pos_j_base_powered);
313 for (
Index i = 0;
i < m_size; ++
i) {
322 return !(
x & (
x - 1));
328 while (
i < 2 *
n - 1)
i *= 2;
334 while (
m >>= 1) log2m++;
341 scramble_FFT(line_buf, line_len);
342 compute_1D_Butterfly<FFTDir>(line_buf, line_len, log_len);
356 a[
i] =
data[
i] * pos_j_base_powered[
i];
365 b[
i] = pos_j_base_powered[
i];
376 b[
i] = pos_j_base_powered[
m-
i];
384 compute_1D_Butterfly<FFT_FORWARD>(
a,
m, log_len);
387 compute_1D_Butterfly<FFT_FORWARD>(
b,
m, log_len);
394 compute_1D_Butterfly<FFT_REVERSE>(
a,
m, log_len);
406 data[
i] =
a[
i] * pos_j_base_powered[
i];
419 while (
m >= 2 &&
j >
m) {
445 data[0] = tmp[0] + tmp[2];
446 data[1] = tmp[1] + tmp[3];
447 data[2] = tmp[0] - tmp[2];
448 data[3] = tmp[1] - tmp[3];
472 tmp_2[0] = tmp_1[0] + tmp_1[2];
473 tmp_2[1] = tmp_1[1] + tmp_1[3];
474 tmp_2[2] = tmp_1[0] - tmp_1[2];
475 tmp_2[3] = tmp_1[1] - tmp_1[3];
476 tmp_2[4] = tmp_1[4] + tmp_1[6];
478 #define SQRT2DIV2 0.7071067811865476
488 data[0] = tmp_2[0] + tmp_2[4];
489 data[1] = tmp_2[1] + tmp_2[5];
490 data[2] = tmp_2[2] + tmp_2[6];
491 data[3] = tmp_2[3] + tmp_2[7];
492 data[4] = tmp_2[0] - tmp_2[4];
493 data[5] = tmp_2[1] - tmp_2[5];
494 data[6] = tmp_2[2] - tmp_2[6];
495 data[7] = tmp_2[3] - tmp_2[7];
504 const RealScalar wtemp = m_sin_PI_div_n_LUT[n_power_of_2];
506 ? m_minus_sin_2_PI_div_n_LUT[n_power_of_2]
507 : -m_minus_sin_2_PI_div_n_LUT[n_power_of_2];
527 data[
i + 1] += temp1;
530 data[
i + 2] += temp2;
533 data[
i + 3] += temp3;
542 compute_1D_Butterfly<Dir>(
data,
n / 2, n_power_of_2 - 1);
543 compute_1D_Butterfly<Dir>(
data +
n / 2,
n / 2, n_power_of_2 - 1);
544 butterfly_1D_merge<Dir>(
data,
n, n_power_of_2);
546 butterfly_8<Dir>(
data);
548 butterfly_4<Dir>(
data);
550 butterfly_2<Dir>(
data);
558 for (
int i = NumDims - 1;
i > omitted_dim; --
i) {
559 const Index partial_m_stride = m_strides[
i] / m_dimensions[omitted_dim];
560 const Index idx = index / partial_m_stride;
561 index -= idx * partial_m_stride;
567 for (
Index i = 0;
i < omitted_dim; ++
i) {
568 const Index partial_m_stride = m_strides[
i] / m_dimensions[omitted_dim];
569 const Index idx = index / partial_m_stride;
570 index -= idx * partial_m_stride;
669 #endif // EIGEN_CXX11_TENSOR_TENSOR_FFT_H
EIGEN_DEVICE_FUNC const EIGEN_STRONG_INLINE Dimensions & dimensions() const
Eigen::internal::nested< TensorFFTOp >::type Nested
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketReturnType packet(Index index) const
EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void scramble_FFT(ComplexScalar *data, Index n)
#define EIGEN_DEVICE_FUNC
EIGEN_STRONG_INLINE void cleanup()
Namespace containing all symbols from the Eigen library.
Annotation indicating that a class derives from another given type.
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index getIndexFromOffset(Index base, Index omitted_dim, Index offset) const
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void processDataLineBluestein(ComplexScalar *line_buf, Index line_len, Index good_composite, Index log_len, ComplexScalar *a, ComplexScalar *b, const ComplexScalar *pos_j_base_powered)
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void butterfly_1D_merge(ComplexScalar *data, Index n, Index n_power_of_2)
Generic expression where a coefficient-wise binary operator is applied to two expressions.
Array< double, 1, 3 > e(1./3., 0.5, 2.)
traits< XprType > XprTraits
EIGEN_STRONG_INLINE TensorEvaluator(const XprType &op, const Device &device)
XprTraits::Scalar InputScalar
internal::traits< XprType > XprTraits
PacketType< OutputScalar, Device >::type PacketReturnType
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
const typedef TensorFFTOp< FFT, XprType, FFTResultType, FFTDirection > & type
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void compute_1D_Butterfly(ComplexScalar *data, Index n, Index n_power_of_2)
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void butterfly_4(ComplexScalar *data)
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorFFTOp(const XprType &expr, const FFT &fft)
TensorFFTOp< FFT, ArgType, FFTResultType, FFTDir > XprType
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index getBaseOffsetFromIndex(Index index, Index omitted_dim) const
Eigen::internal::traits< TensorFFTOp >::Index Index
DSizes< Index, NumDims > Dimensions
const FFT EIGEN_DEVICE_REF m_fft
StorageMemory< CoeffReturnType, Device > Storage
std::complex< RealScalar > ComplexScalar
EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Index findGoodComposite(Index n)
static const int PacketSize
EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(EvaluatorPointerType data)
EIGEN_DEVICE_FUNC T operator()(const T &val) const
Eigen::NumTraits< Scalar >::Real RealScalar
const EIGEN_DEVICE_FUNC FFT & fft() const
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void processDataLineCooleyTukey(ComplexScalar *line_buf, Index line_len, Index log_len)
std::complex< RealScalar > ComplexScalar
array< Index, NumDims > m_strides
Eigen::NumTraits< Scalar >::Real RealScalar
EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE bool isPowerOfTwo(Index x)
std::complex< RealScalar > ComplexScalar
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void butterfly_8(ComplexScalar *data)
EvaluatorPointerType m_data
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void butterfly_2(ComplexScalar *data)
conditional< FFTResultType==RealPart||FFTResultType==ImagPart, RealScalar, ComplexScalar >::type OutputScalar
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void evalToBuf(EvaluatorPointerType data)
OutputScalar CoeffReturnType
EIGEN_DEVICE_FUNC EvaluatorPointerType data() const
EIGEN_DEVICE_FUNC EvaluatorPointerType data() const
remove_reference< Nested >::type _Nested
Storage::Type EvaluatorPointerType
traits< XprType >::PointerType PointerType
#define EIGEN_STRONG_INLINE
Eigen::internal::traits< TensorFFTOp >::StorageKind StorageKind
void swap(GeographicLib::NearestNeighbor< dist_t, pos_t, distfun_t > &a, GeographicLib::NearestNeighbor< dist_t, pos_t, distfun_t > &b)
EIGEN_DEVICE_FUNC const EIGEN_STRONG_INLINE Dimensions & dimensions() const
const Device EIGEN_DEVICE_REF m_device
#define EIGEN_ALWAYS_INLINE
NumTraits< typename XprTraits::Scalar >::Real RealScalar
const Device EIGEN_DEVICE_REF m_device
AnnoyingScalar conj(const AnnoyingScalar &x)
TensorEvaluator< ArgType, Device > m_impl
TensorFFTOp< FFT, XprType, FFTResultType, FFTDirection > type
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 y set format x g set format y g set format x2 g set format y2 g set format z g set angles radians set nogrid set key title set key left top Right noreverse box linetype linewidth samplen spacing width set nolabel set noarrow set nologscale set logscale x set set pointsize set encoding default set nopolar set noparametric set set set set surface set nocontour set clabel set mapping cartesian set nohidden3d set cntrparam order set cntrparam linear set cntrparam levels auto set cntrparam points set size set set xzeroaxis lt lw set x2zeroaxis lt lw set yzeroaxis lt lw set y2zeroaxis lt lw set tics in set ticslevel set tics set mxtics default set mytics default set mx2tics default set my2tics default set xtics border mirror norotate autofreq set ytics border mirror norotate autofreq set ztics border nomirror norotate autofreq set nox2tics set noy2tics set timestamp bottom norotate offset
NumTraits< Scalar >::Real RealScalar
OutputScalar CoeffReturnType
internal::conditional< FFTResultType==RealPart||FFTResultType==ImagPart, RealScalar, ComplexScalar >::type OutputScalar
Storage::Type EvaluatorPointerType
Eigen::internal::traits< TensorFFTOp >::Scalar Scalar
EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Index getLog2(Index m)
internal::conditional< FFTResultType==RealPart||FFTResultType==ImagPart, RealScalar, ComplexScalar >::type OutputScalar
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T sin(const T &x)
A cost model used to limit the number of threads used for evaluating tensor expression.
XprTraits::Scalar InputScalar
EvaluatorPointerType m_data
const EIGEN_DEVICE_FUNC internal::remove_all< typename XprType::Nested >::type & expression() const
internal::TensorBlockNotImplemented TensorBlock
TensorEvaluator< ArgType, Device >::Dimensions InputDimensions
XprTraits::StorageKind StorageKind
PacketType< CoeffReturnType, Device >::type PacketReturnType
T operator()(const T &val) const
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T cos(const T &x)
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE CoeffReturnType coeff(Index index) const
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
gtsam
Author(s):
autogenerated on Sat Nov 16 2024 04:05:56