{-# LANGUAGE GADTs               #-}
{-# LANGUAGE PatternGuards       #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications    #-}
{-# LANGUAGE TypeFamilies        #-}
{-# LANGUAGE TypeOperators       #-}
-- |
-- Module      : Data.Array.Accelerate.Math.FFT.LLVM.Native
-- Copyright   : [2017..2020] The Accelerate Team
-- License     : BSD3
--
-- Maintainer  : Trevor L. McDonell <trevor.mcdonell@gmail.com>
-- Stability   : experimental
-- Portability : non-portable (GHC extensions)
--

module Data.Array.Accelerate.Math.FFT.LLVM.Native (

  fft,
  fft1D,
  fft2D,
  fft3D,

) where

import Data.Array.Accelerate.Math.FFT.Mode
import Data.Array.Accelerate.Math.FFT.Type
import Data.Array.Accelerate.Math.FFT.LLVM.Native.Ix
import Data.Array.Accelerate.Math.FFT.LLVM.Native.Base

import Data.Array.Accelerate.Analysis.Match
import Data.Array.Accelerate.Data.Complex
import Data.Array.Accelerate.Error
import Data.Array.Accelerate.Representation.Array
import Data.Array.Accelerate.Representation.Shape
import Data.Array.Accelerate.Sugar.Elt

import Data.Primitive.Vec

import Data.Array.Accelerate.LLVM.Native.Foreign

import Data.Proxy
import Data.Array.CArray                                            ( CArray )
import Math.FFT.Base                                                ( FFTWReal )
import Prelude                                                      as P
import qualified Math.FFT                                           as FFT


fft :: forall sh e. HasCallStack
    => Mode
    -> ShapeR sh
    -> NumericR e
    -> ForeignAcc (Array sh (Vec2 e) -> Array sh (Vec2 e))
fft :: Mode
-> ShapeR sh
-> NumericR e
-> ForeignAcc (Array sh (Vec2 e) -> Array sh (Vec2 e))
fft Mode
mode ShapeR sh
shR NumericR e
eR
  = String
-> (Array sh (Vec2 e) -> Par Native (Future (Array sh (Vec2 e))))
-> ForeignAcc (Array sh (Vec2 e) -> Array sh (Vec2 e))
forall a b.
String -> (a -> Par Native (Future b)) -> ForeignAcc (a -> b)
ForeignAcc (Mode -> ShapeR sh -> String
forall sh. Mode -> ShapeR sh -> String
nameOf Mode
mode ShapeR sh
shR)
  ((Array sh (Vec2 e) -> Par Native (Future (Array sh (Vec2 e))))
 -> ForeignAcc (Array sh (Vec2 e) -> Array sh (Vec2 e)))
-> (Array sh (Vec2 e) -> Par Native (Future (Array sh (Vec2 e))))
-> ForeignAcc (Array sh (Vec2 e) -> Array sh (Vec2 e))
forall a b. (a -> b) -> a -> b
$ case NumericR e
eR of
      NumericR e
NumericRfloat32 -> Array sh (Vec2 e) -> Par Native (Future (Array sh (Vec2 e)))
FFTWReal e =>
Array sh (Vec2 e) -> Par Native (Future (Array sh (Vec2 e)))
go
      NumericR e
NumericRfloat64 -> Array sh (Vec2 e) -> Par Native (Future (Array sh (Vec2 e)))
FFTWReal e =>
Array sh (Vec2 e) -> Par Native (Future (Array sh (Vec2 e)))
go
  where
    go :: FFTWReal e => Array sh (Vec2 e) -> Par Native (Future (Array sh (Vec2 e)))
    go :: Array sh (Vec2 e) -> Par Native (Future (Array sh (Vec2 e)))
go | Just sh :~: DIM1
Refl <- ShapeR sh -> ShapeR DIM1 -> Maybe (sh :~: DIM1)
forall s t. ShapeR s -> ShapeR t -> Maybe (s :~: t)
matchShapeR ShapeR sh
shR ShapeR DIM1
dim1 = ShapeR sh
-> NumericR e
-> (CArray Int (Complex e) -> CArray Int (Complex e))
-> Array sh (Vec2 e)
-> Par Native (Future (Array sh (Vec2 e)))
forall ix sh e.
(IxShapeR (EltR ix) ~ sh, Elt ix) =>
ShapeR sh
-> NumericR e
-> (CArray ix (Complex e) -> CArray ix (Complex e))
-> Array sh (Vec2 e)
-> Par Native (Future (Array sh (Vec2 e)))
liftCtoA ShapeR sh
shR NumericR e
eR (Sign
-> Flag
-> [Int]
-> CArray Int (Complex e)
-> CArray Int (Complex e)
forall r i.
(FFTWReal r, Ix i, Shapable i) =>
Sign
-> Flag -> [Int] -> CArray i (Complex r) -> CArray i (Complex r)
FFT.dftGU (Mode -> Sign
signOf Mode
mode) Flag
flags [Int
0] (CArray Int (Complex e) -> CArray Int (Complex e))
-> Proxy Int -> CArray Int (Complex e) -> CArray Int (Complex e)
forall (a :: * -> * -> *) i r (proxy :: * -> *).
(a i r -> a i r) -> proxy i -> a i r -> a i r
`ix` (Proxy Int
forall k (t :: k). Proxy t
Proxy :: Proxy (Int)))
       | Just sh :~: DIM2
Refl <- ShapeR sh -> ShapeR DIM2 -> Maybe (sh :~: DIM2)
forall s t. ShapeR s -> ShapeR t -> Maybe (s :~: t)
matchShapeR ShapeR sh
shR ShapeR DIM2
dim2 = ShapeR sh
-> NumericR e
-> (CArray (Int, Int) (Complex e) -> CArray (Int, Int) (Complex e))
-> Array sh (Vec2 e)
-> Par Native (Future (Array sh (Vec2 e)))
forall ix sh e.
(IxShapeR (EltR ix) ~ sh, Elt ix) =>
ShapeR sh
-> NumericR e
-> (CArray ix (Complex e) -> CArray ix (Complex e))
-> Array sh (Vec2 e)
-> Par Native (Future (Array sh (Vec2 e)))
liftCtoA ShapeR sh
shR NumericR e
eR (Sign
-> Flag
-> [Int]
-> CArray (Int, Int) (Complex e)
-> CArray (Int, Int) (Complex e)
forall r i.
(FFTWReal r, Ix i, Shapable i) =>
Sign
-> Flag -> [Int] -> CArray i (Complex r) -> CArray i (Complex r)
FFT.dftGU (Mode -> Sign
signOf Mode
mode) Flag
flags [Int
1] (CArray (Int, Int) (Complex e) -> CArray (Int, Int) (Complex e))
-> Proxy (Int, Int)
-> CArray (Int, Int) (Complex e)
-> CArray (Int, Int) (Complex e)
forall (a :: * -> * -> *) i r (proxy :: * -> *).
(a i r -> a i r) -> proxy i -> a i r -> a i r
`ix` (Proxy (Int, Int)
forall k (t :: k). Proxy t
Proxy :: Proxy (Int,Int)))
       | Just sh :~: DIM3
Refl <- ShapeR sh -> ShapeR DIM3 -> Maybe (sh :~: DIM3)
forall s t. ShapeR s -> ShapeR t -> Maybe (s :~: t)
matchShapeR ShapeR sh
shR ShapeR DIM3
dim3 = ShapeR sh
-> NumericR e
-> (CArray (Int, Int, Int) (Complex e)
    -> CArray (Int, Int, Int) (Complex e))
-> Array sh (Vec2 e)
-> Par Native (Future (Array sh (Vec2 e)))
forall ix sh e.
(IxShapeR (EltR ix) ~ sh, Elt ix) =>
ShapeR sh
-> NumericR e
-> (CArray ix (Complex e) -> CArray ix (Complex e))
-> Array sh (Vec2 e)
-> Par Native (Future (Array sh (Vec2 e)))
liftCtoA ShapeR sh
shR NumericR e
eR (Sign
-> Flag
-> [Int]
-> CArray (Int, Int, Int) (Complex e)
-> CArray (Int, Int, Int) (Complex e)
forall r i.
(FFTWReal r, Ix i, Shapable i) =>
Sign
-> Flag -> [Int] -> CArray i (Complex r) -> CArray i (Complex r)
FFT.dftGU (Mode -> Sign
signOf Mode
mode) Flag
flags [Int
2] (CArray (Int, Int, Int) (Complex e)
 -> CArray (Int, Int, Int) (Complex e))
-> Proxy (Int, Int, Int)
-> CArray (Int, Int, Int) (Complex e)
-> CArray (Int, Int, Int) (Complex e)
forall (a :: * -> * -> *) i r (proxy :: * -> *).
(a i r -> a i r) -> proxy i -> a i r -> a i r
`ix` (Proxy (Int, Int, Int)
forall k (t :: k). Proxy t
Proxy :: Proxy (Int,Int,Int)))
       | Just sh :~: (DIM3, Int)
Refl <- ShapeR sh -> ShapeR (DIM3, Int) -> Maybe (sh :~: (DIM3, Int))
forall s t. ShapeR s -> ShapeR t -> Maybe (s :~: t)
matchShapeR ShapeR sh
shR ShapeR (DIM3, Int)
dim4 = ShapeR sh
-> NumericR e
-> (CArray (Int, Int, Int, Int) (Complex e)
    -> CArray (Int, Int, Int, Int) (Complex e))
-> Array sh (Vec2 e)
-> Par Native (Future (Array sh (Vec2 e)))
forall ix sh e.
(IxShapeR (EltR ix) ~ sh, Elt ix) =>
ShapeR sh
-> NumericR e
-> (CArray ix (Complex e) -> CArray ix (Complex e))
-> Array sh (Vec2 e)
-> Par Native (Future (Array sh (Vec2 e)))
liftCtoA ShapeR sh
shR NumericR e
eR (Sign
-> Flag
-> [Int]
-> CArray (Int, Int, Int, Int) (Complex e)
-> CArray (Int, Int, Int, Int) (Complex e)
forall r i.
(FFTWReal r, Ix i, Shapable i) =>
Sign
-> Flag -> [Int] -> CArray i (Complex r) -> CArray i (Complex r)
FFT.dftGU (Mode -> Sign
signOf Mode
mode) Flag
flags [Int
3] (CArray (Int, Int, Int, Int) (Complex e)
 -> CArray (Int, Int, Int, Int) (Complex e))
-> Proxy (Int, Int, Int, Int)
-> CArray (Int, Int, Int, Int) (Complex e)
-> CArray (Int, Int, Int, Int) (Complex e)
forall (a :: * -> * -> *) i r (proxy :: * -> *).
(a i r -> a i r) -> proxy i -> a i r -> a i r
`ix` (Proxy (Int, Int, Int, Int)
forall k (t :: k). Proxy t
Proxy :: Proxy (Int,Int,Int,Int)))
       | Just sh :~: ((DIM3, Int), Int)
Refl <- ShapeR sh
-> ShapeR ((DIM3, Int), Int) -> Maybe (sh :~: ((DIM3, Int), Int))
forall s t. ShapeR s -> ShapeR t -> Maybe (s :~: t)
matchShapeR ShapeR sh
shR ShapeR ((DIM3, Int), Int)
dim5 = ShapeR sh
-> NumericR e
-> (CArray (Int, Int, Int, Int, Int) (Complex e)
    -> CArray (Int, Int, Int, Int, Int) (Complex e))
-> Array sh (Vec2 e)
-> Par Native (Future (Array sh (Vec2 e)))
forall ix sh e.
(IxShapeR (EltR ix) ~ sh, Elt ix) =>
ShapeR sh
-> NumericR e
-> (CArray ix (Complex e) -> CArray ix (Complex e))
-> Array sh (Vec2 e)
-> Par Native (Future (Array sh (Vec2 e)))
liftCtoA ShapeR sh
shR NumericR e
eR (Sign
-> Flag
-> [Int]
-> CArray (Int, Int, Int, Int, Int) (Complex e)
-> CArray (Int, Int, Int, Int, Int) (Complex e)
forall r i.
(FFTWReal r, Ix i, Shapable i) =>
Sign
-> Flag -> [Int] -> CArray i (Complex r) -> CArray i (Complex r)
FFT.dftGU (Mode -> Sign
signOf Mode
mode) Flag
flags [Int
4] (CArray (Int, Int, Int, Int, Int) (Complex e)
 -> CArray (Int, Int, Int, Int, Int) (Complex e))
-> Proxy (Int, Int, Int, Int, Int)
-> CArray (Int, Int, Int, Int, Int) (Complex e)
-> CArray (Int, Int, Int, Int, Int) (Complex e)
forall (a :: * -> * -> *) i r (proxy :: * -> *).
(a i r -> a i r) -> proxy i -> a i r -> a i r
`ix` (Proxy (Int, Int, Int, Int, Int)
forall k (t :: k). Proxy t
Proxy :: Proxy (Int,Int,Int,Int,Int)))
       | Bool
otherwise = String
-> Array sh (Vec2 e) -> Par Native (Future (Array sh (Vec2 e)))
forall a. HasCallStack => String -> a
internalError String
"only for 1D..5D inner-dimension transforms"
    --
    ix :: (a i r -> a i r) -> proxy i -> (a i r -> a i r)
    ix :: (a i r -> a i r) -> proxy i -> a i r -> a i r
ix a i r -> a i r
f proxy i
_ = a i r -> a i r
f

    dim4 :: ShapeR (DIM3, Int)
dim4 = ShapeR DIM3 -> ShapeR (DIM3, Int)
forall sh1. ShapeR sh1 -> ShapeR (sh1, Int)
ShapeRsnoc ShapeR DIM3
dim3
    dim5 :: ShapeR ((DIM3, Int), Int)
dim5 = ShapeR (DIM3, Int) -> ShapeR ((DIM3, Int), Int)
forall sh1. ShapeR sh1 -> ShapeR (sh1, Int)
ShapeRsnoc ShapeR (DIM3, Int)
dim4

fft1D :: Mode -> NumericR e -> ForeignAcc (Array DIM1 (Vec2 e) -> Array DIM1 (Vec2 e))
fft1D :: Mode
-> NumericR e
-> ForeignAcc (Array DIM1 (Vec2 e) -> Array DIM1 (Vec2 e))
fft1D Mode
mode NumericR e
eR
  = String
-> (Array DIM1 (Vec2 e)
    -> Par Native (Future (Array DIM1 (Vec2 e))))
-> ForeignAcc (Array DIM1 (Vec2 e) -> Array DIM1 (Vec2 e))
forall a b.
String -> (a -> Par Native (Future b)) -> ForeignAcc (a -> b)
ForeignAcc (Mode -> ShapeR DIM1 -> String
forall sh. Mode -> ShapeR sh -> String
nameOf Mode
mode ShapeR DIM1
dim1)
  ((Array DIM1 (Vec2 e) -> Par Native (Future (Array DIM1 (Vec2 e))))
 -> ForeignAcc (Array DIM1 (Vec2 e) -> Array DIM1 (Vec2 e)))
-> (Array DIM1 (Vec2 e)
    -> Par Native (Future (Array DIM1 (Vec2 e))))
-> ForeignAcc (Array DIM1 (Vec2 e) -> Array DIM1 (Vec2 e))
forall a b. (a -> b) -> a -> b
$ case NumericR e
eR of
      NumericR e
NumericRfloat32 -> ShapeR DIM1
-> NumericR e
-> (CArray Int (Complex e) -> CArray Int (Complex e))
-> Array DIM1 (Vec2 e)
-> Par Native (Future (Array DIM1 (Vec2 e)))
forall ix sh e.
(IxShapeR (EltR ix) ~ sh, Elt ix) =>
ShapeR sh
-> NumericR e
-> (CArray ix (Complex e) -> CArray ix (Complex e))
-> Array sh (Vec2 e)
-> Par Native (Future (Array sh (Vec2 e)))
liftCtoA ShapeR DIM1
dim1 NumericR e
eR CArray Int (Complex e) -> CArray Int (Complex e)
forall r.
FFTWReal r =>
CArray Int (Complex r) -> CArray Int (Complex r)
go
      NumericR e
NumericRfloat64 -> ShapeR DIM1
-> NumericR e
-> (CArray Int (Complex e) -> CArray Int (Complex e))
-> Array DIM1 (Vec2 e)
-> Par Native (Future (Array DIM1 (Vec2 e)))
forall ix sh e.
(IxShapeR (EltR ix) ~ sh, Elt ix) =>
ShapeR sh
-> NumericR e
-> (CArray ix (Complex e) -> CArray ix (Complex e))
-> Array sh (Vec2 e)
-> Par Native (Future (Array sh (Vec2 e)))
liftCtoA ShapeR DIM1
dim1 NumericR e
eR CArray Int (Complex e) -> CArray Int (Complex e)
forall r.
FFTWReal r =>
CArray Int (Complex r) -> CArray Int (Complex r)
go
  where
    go :: FFTWReal r => CArray Int (Complex r) -> CArray Int (Complex r)
    go :: CArray Int (Complex r) -> CArray Int (Complex r)
go = Sign
-> Flag
-> [Int]
-> CArray Int (Complex r)
-> CArray Int (Complex r)
forall r i.
(FFTWReal r, Ix i, Shapable i) =>
Sign
-> Flag -> [Int] -> CArray i (Complex r) -> CArray i (Complex r)
FFT.dftGU (Mode -> Sign
signOf Mode
mode) Flag
flags [Int
0]

fft2D :: Mode -> NumericR e -> ForeignAcc (Array DIM2 (Vec2 e) -> Array DIM2 (Vec2 e))
fft2D :: Mode
-> NumericR e
-> ForeignAcc (Array DIM2 (Vec2 e) -> Array DIM2 (Vec2 e))
fft2D Mode
mode NumericR e
eR
  = String
-> (Array DIM2 (Vec2 e)
    -> Par Native (Future (Array DIM2 (Vec2 e))))
-> ForeignAcc (Array DIM2 (Vec2 e) -> Array DIM2 (Vec2 e))
forall a b.
String -> (a -> Par Native (Future b)) -> ForeignAcc (a -> b)
ForeignAcc (Mode -> ShapeR DIM2 -> String
forall sh. Mode -> ShapeR sh -> String
nameOf Mode
mode ShapeR DIM2
dim2)
  ((Array DIM2 (Vec2 e) -> Par Native (Future (Array DIM2 (Vec2 e))))
 -> ForeignAcc (Array DIM2 (Vec2 e) -> Array DIM2 (Vec2 e)))
-> (Array DIM2 (Vec2 e)
    -> Par Native (Future (Array DIM2 (Vec2 e))))
-> ForeignAcc (Array DIM2 (Vec2 e) -> Array DIM2 (Vec2 e))
forall a b. (a -> b) -> a -> b
$ case NumericR e
eR of
      NumericR e
NumericRfloat32 -> ShapeR DIM2
-> NumericR e
-> (CArray (Int, Int) (Complex e) -> CArray (Int, Int) (Complex e))
-> Array DIM2 (Vec2 e)
-> Par Native (Future (Array DIM2 (Vec2 e)))
forall ix sh e.
(IxShapeR (EltR ix) ~ sh, Elt ix) =>
ShapeR sh
-> NumericR e
-> (CArray ix (Complex e) -> CArray ix (Complex e))
-> Array sh (Vec2 e)
-> Par Native (Future (Array sh (Vec2 e)))
liftCtoA ShapeR DIM2
dim2 NumericR e
eR CArray (Int, Int) (Complex e) -> CArray (Int, Int) (Complex e)
forall r.
FFTWReal r =>
CArray (Int, Int) (Complex r) -> CArray (Int, Int) (Complex r)
go
      NumericR e
NumericRfloat64 -> ShapeR DIM2
-> NumericR e
-> (CArray (Int, Int) (Complex e) -> CArray (Int, Int) (Complex e))
-> Array DIM2 (Vec2 e)
-> Par Native (Future (Array DIM2 (Vec2 e)))
forall ix sh e.
(IxShapeR (EltR ix) ~ sh, Elt ix) =>
ShapeR sh
-> NumericR e
-> (CArray ix (Complex e) -> CArray ix (Complex e))
-> Array sh (Vec2 e)
-> Par Native (Future (Array sh (Vec2 e)))
liftCtoA ShapeR DIM2
dim2 NumericR e
eR CArray (Int, Int) (Complex e) -> CArray (Int, Int) (Complex e)
forall r.
FFTWReal r =>
CArray (Int, Int) (Complex r) -> CArray (Int, Int) (Complex r)
go
  where
    go :: FFTWReal r => CArray (Int,Int) (Complex r) -> CArray (Int,Int) (Complex r)
    go :: CArray (Int, Int) (Complex r) -> CArray (Int, Int) (Complex r)
go = Sign
-> Flag
-> [Int]
-> CArray (Int, Int) (Complex r)
-> CArray (Int, Int) (Complex r)
forall r i.
(FFTWReal r, Ix i, Shapable i) =>
Sign
-> Flag -> [Int] -> CArray i (Complex r) -> CArray i (Complex r)
FFT.dftGU (Mode -> Sign
signOf Mode
mode) Flag
flags [Int
0,Int
1]

fft3D :: Mode -> NumericR e -> ForeignAcc (Array DIM3 (Vec2 e) -> Array DIM3 (Vec2 e))
fft3D :: Mode
-> NumericR e
-> ForeignAcc (Array DIM3 (Vec2 e) -> Array DIM3 (Vec2 e))
fft3D Mode
mode NumericR e
eR
  = String
-> (Array DIM3 (Vec2 e)
    -> Par Native (Future (Array DIM3 (Vec2 e))))
-> ForeignAcc (Array DIM3 (Vec2 e) -> Array DIM3 (Vec2 e))
forall a b.
String -> (a -> Par Native (Future b)) -> ForeignAcc (a -> b)
ForeignAcc (Mode -> ShapeR DIM3 -> String
forall sh. Mode -> ShapeR sh -> String
nameOf Mode
mode ShapeR DIM3
dim3)
  ((Array DIM3 (Vec2 e) -> Par Native (Future (Array DIM3 (Vec2 e))))
 -> ForeignAcc (Array DIM3 (Vec2 e) -> Array DIM3 (Vec2 e)))
-> (Array DIM3 (Vec2 e)
    -> Par Native (Future (Array DIM3 (Vec2 e))))
-> ForeignAcc (Array DIM3 (Vec2 e) -> Array DIM3 (Vec2 e))
forall a b. (a -> b) -> a -> b
$ case NumericR e
eR of
      NumericR e
NumericRfloat32 -> ShapeR DIM3
-> NumericR e
-> (CArray (Int, Int, Int) (Complex e)
    -> CArray (Int, Int, Int) (Complex e))
-> Array DIM3 (Vec2 e)
-> Par Native (Future (Array DIM3 (Vec2 e)))
forall ix sh e.
(IxShapeR (EltR ix) ~ sh, Elt ix) =>
ShapeR sh
-> NumericR e
-> (CArray ix (Complex e) -> CArray ix (Complex e))
-> Array sh (Vec2 e)
-> Par Native (Future (Array sh (Vec2 e)))
liftCtoA ShapeR DIM3
dim3 NumericR e
eR CArray (Int, Int, Int) (Complex e)
-> CArray (Int, Int, Int) (Complex e)
forall r.
FFTWReal r =>
CArray (Int, Int, Int) (Complex r)
-> CArray (Int, Int, Int) (Complex r)
go
      NumericR e
NumericRfloat64 -> ShapeR DIM3
-> NumericR e
-> (CArray (Int, Int, Int) (Complex e)
    -> CArray (Int, Int, Int) (Complex e))
-> Array DIM3 (Vec2 e)
-> Par Native (Future (Array DIM3 (Vec2 e)))
forall ix sh e.
(IxShapeR (EltR ix) ~ sh, Elt ix) =>
ShapeR sh
-> NumericR e
-> (CArray ix (Complex e) -> CArray ix (Complex e))
-> Array sh (Vec2 e)
-> Par Native (Future (Array sh (Vec2 e)))
liftCtoA ShapeR DIM3
dim3 NumericR e
eR CArray (Int, Int, Int) (Complex e)
-> CArray (Int, Int, Int) (Complex e)
forall r.
FFTWReal r =>
CArray (Int, Int, Int) (Complex r)
-> CArray (Int, Int, Int) (Complex r)
go
  where
    go :: FFTWReal r => CArray (Int,Int,Int) (Complex r) -> CArray (Int,Int,Int) (Complex r)
    go :: CArray (Int, Int, Int) (Complex r)
-> CArray (Int, Int, Int) (Complex r)
go = Sign
-> Flag
-> [Int]
-> CArray (Int, Int, Int) (Complex r)
-> CArray (Int, Int, Int) (Complex r)
forall r i.
(FFTWReal r, Ix i, Shapable i) =>
Sign
-> Flag -> [Int] -> CArray i (Complex r) -> CArray i (Complex r)
FFT.dftGU (Mode -> Sign
signOf Mode
mode) Flag
flags [Int
0,Int
1,Int
2]

liftCtoA
    :: forall ix sh e. (IxShapeR (EltR ix) ~ sh, Elt ix)
    => ShapeR sh
    -> NumericR e
    -> (CArray ix (Complex e) -> CArray ix (Complex e))
    -> Array sh (Vec2 e)
    -> Par Native (Future (Array sh (Vec2 e)))
liftCtoA :: ShapeR sh
-> NumericR e
-> (CArray ix (Complex e) -> CArray ix (Complex e))
-> Array sh (Vec2 e)
-> Par Native (Future (Array sh (Vec2 e)))
liftCtoA ShapeR sh
shR NumericR e
eR CArray ix (Complex e) -> CArray ix (Complex e)
f Array sh (Vec2 e)
a =
  Array sh (Vec2 e) -> Par Native (Future (Array sh (Vec2 e)))
forall arch a.
(Async arch, HasCallStack) =>
a -> Par arch (FutureR arch a)
newFull (Array sh (Vec2 e) -> Par Native (Future (Array sh (Vec2 e))))
-> Par Native (Array sh (Vec2 e))
-> Par Native (Future (Array sh (Vec2 e)))
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< IO (Array sh (Vec2 e)) -> Par Native (Array sh (Vec2 e))
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (ShapeR sh
-> NumericR e
-> Array sh (Vec2 e)
-> (CArray ix (Complex e) -> IO (Array sh (Vec2 e)))
-> IO (Array sh (Vec2 e))
forall ix sh e a.
(IxShapeR (EltR ix) ~ sh, Elt ix) =>
ShapeR sh
-> NumericR e
-> Array sh (Vec2 e)
-> (CArray ix (Complex e) -> IO a)
-> IO a
withCArray ShapeR sh
shR NumericR e
eR Array sh (Vec2 e)
a (ShapeR sh
-> NumericR e -> CArray ix (Complex e) -> IO (Array sh (Vec2 e))
forall ix sh e.
(IxShapeR (EltR ix) ~ sh, Elt ix) =>
ShapeR sh
-> NumericR e -> CArray ix (Complex e) -> IO (Array sh (Vec2 e))
fromCArray ShapeR sh
shR NumericR e
eR (CArray ix (Complex e) -> IO (Array sh (Vec2 e)))
-> (CArray ix (Complex e) -> CArray ix (Complex e))
-> CArray ix (Complex e)
-> IO (Array sh (Vec2 e))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CArray ix (Complex e) -> CArray ix (Complex e)
f))