{-# Language FlexibleInstances, ScopedTypeVariables #-}
module Csound.Typed.Types.Array(
Arr(..),
newLocalArr, newGlobalArr, newLocalCtrlArr, newGlobalCtrlArr,
fillLocalArr, fillGlobalArr, fillLocalCtrlArr, fillGlobalCtrlArr,
readArr, writeArr, writeInitArr, modifyArr, mixArr,
Arr1, DArr1, Arr2, DArr2, Arr3, DArr3,
arr1, darr1, arr2, darr2, arr3, darr3,
maparrayNew, lenarray, copyf2array, copya2ftab, minarray, maxarray, sumarray,
scalearray, slicearrayNew,
maparrayCopy, slicearrayCopy,
divArrayCopy, subArrayCopy,
addArrayCopy, mulArrayCopy,
addArrayNew, mulArrayNew, divArrayNew, subArrayNew,
SpecArr,
fftNew, fftinvNew, rfftNew, rifftNew, pvs2tab, tab2pvs, cmplxprodNew,
rect2polNew, pol2rectNew, pol2rect2New, windowArrayNew,
r2cNew, c2rNew, magsArrayNew, phsArrayNew,
fftCopy, fftinvCopy, rfftCopy, rifftCopy, cmplxprodCopy,
rect2polCopy, pol2rectCopy, pol2rect2Copy, windowArrayCopy,
r2cCopy, c2rCopy, magsArrayCopy, phsArrayCopy
) where
import Control.Monad
import Csound.Dynamic hiding (writeArr, writeInitArr, readArr, newLocalArrVar, newTmpArrVar, int)
import qualified Csound.Dynamic as D
import Csound.Typed.Types.Prim
import Csound.Typed.Types.Tuple
import Csound.Typed.GlobalState.SE
import Csound.Typed.GlobalState.GE
type Arr1 a = Arr Sig a
type DArr1 a = Arr D a
type Arr2 a = Arr (Sig, Sig) a
type DArr2 a = Arr (D, D) a
type Arr3 a = Arr (Sig, Sig, Sig) a
type DArr3 a = Arr (D, D, D) a
arr1 :: SE (Arr Sig a) -> SE (Arr Sig a)
arr1 :: SE (Arr Sig a) -> SE (Arr Sig a)
arr1 = SE (Arr Sig a) -> SE (Arr Sig a)
forall a. a -> a
id
darr1 :: SE (Arr D a) -> SE (Arr D a)
darr1 :: SE (Arr D a) -> SE (Arr D a)
darr1 = SE (Arr D a) -> SE (Arr D a)
forall a. a -> a
id
arr2 :: SE (Arr (Sig,Sig) a) -> SE (Arr (Sig,Sig) a)
arr2 :: SE (Arr (Sig, Sig) a) -> SE (Arr (Sig, Sig) a)
arr2 = SE (Arr (Sig, Sig) a) -> SE (Arr (Sig, Sig) a)
forall a. a -> a
id
darr2 :: SE (Arr (D,D) a) -> SE (Arr (D,D) a)
darr2 :: SE (Arr (D, D) a) -> SE (Arr (D, D) a)
darr2 = SE (Arr (D, D) a) -> SE (Arr (D, D) a)
forall a. a -> a
id
arr3 :: SE (Arr (Sig,Sig,Sig) a) -> SE (Arr (Sig,Sig,Sig) a)
arr3 :: SE (Arr (Sig, Sig, Sig) a) -> SE (Arr (Sig, Sig, Sig) a)
arr3 = SE (Arr (Sig, Sig, Sig) a) -> SE (Arr (Sig, Sig, Sig) a)
forall a. a -> a
id
darr3 :: SE (Arr (D,D,D) a) -> SE (Arr (D,D,D) a)
darr3 :: SE (Arr (D, D, D) a) -> SE (Arr (D, D, D) a)
darr3 = SE (Arr (D, D, D) a) -> SE (Arr (D, D, D) a)
forall a. a -> a
id
newtype Arr ix a = Arr { Arr ix a -> [Var]
unArr :: [Var] }
newArrBy :: forall ix a . (Tuple a, Tuple ix) => (Rate -> GE [E] -> SE Var) -> [D] -> SE (Arr ix a)
newArrBy :: (Rate -> GE [E] -> SE Var) -> [D] -> SE (Arr ix a)
newArrBy Rate -> GE [E] -> SE Var
mkVar [D]
sizes =
([Var] -> Arr ix a) -> SE [Var] -> SE (Arr ix a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [Var] -> Arr ix a
forall ix a. [Var] -> Arr ix a
Arr (SE [Var] -> SE (Arr ix a)) -> SE [Var] -> SE (Arr ix a)
forall a b. (a -> b) -> a -> b
$ (Rate -> SE Var) -> [Rate] -> SE [Var]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (\Rate
x -> Rate -> GE [E] -> SE Var
mkVar Rate
x ((D -> GE E) -> [D] -> GE [E]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM D -> GE E
forall a. Val a => a -> GE E
toGE [D]
sizes)) (a -> [Rate]
forall a. Tuple a => a -> [Rate]
tupleRates (a -> [Rate]) -> a -> [Rate]
forall a b. (a -> b) -> a -> b
$ (a
forall a. HasCallStack => a
undefined :: a))
getIndices :: Tuple ix => [Int] -> [ix]
getIndices :: [Int] -> [ix]
getIndices [Int]
xs = ([Int] -> ix) -> [[Int]] -> [ix]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (GE [E] -> ix
forall a. Tuple a => GE [E] -> a
toTuple (GE [E] -> ix) -> ([Int] -> GE [E]) -> [Int] -> ix
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [E] -> GE [E]
forall (m :: * -> *) a. Monad m => a -> m a
return ([E] -> GE [E]) -> ([Int] -> [E]) -> [Int] -> GE [E]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> E) -> [Int] -> [E]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Int -> E
D.int) ([[Int]] -> [ix]) -> [[Int]] -> [ix]
forall a b. (a -> b) -> a -> b
$ [Int] -> [[Int]]
getIntIndices [Int]
xs
getIntIndices :: [Int] -> [[Int]]
getIntIndices :: [Int] -> [[Int]]
getIntIndices = ([Int] -> [Int]) -> [[Int]] -> [[Int]]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [Int] -> [Int]
forall a. [a] -> [a]
reverse ([[Int]] -> [[Int]]) -> ([Int] -> [[Int]]) -> [Int] -> [[Int]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([[Int]] -> Int -> [[Int]]) -> [[Int]] -> [Int] -> [[Int]]
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl [[Int]] -> Int -> [[Int]]
go []
where
go :: [[Int]] -> Int -> [[Int]]
go :: [[Int]] -> Int -> [[Int]]
go [[Int]]
res Int
n = case [[Int]]
res of
[] -> (Int -> [Int]) -> [Int] -> [[Int]]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Int
x -> [Int
x]) [Int]
ix
[[Int]]
xs -> [ Int
first Int -> [Int] -> [Int]
forall a. a -> [a] -> [a]
: [Int]
rest | Int
first <- [Int]
ix, [Int]
rest <- [[Int]]
xs ]
where ix :: [Int]
ix = [Int
0 .. Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1]
fillArrBy :: (Tuple a, Tuple ix) => (Rate -> GE [E] -> SE Var) -> [Int] -> [a] -> SE (Arr ix a)
fillArrBy :: (Rate -> GE [E] -> SE Var) -> [Int] -> [a] -> SE (Arr ix a)
fillArrBy Rate -> GE [E] -> SE Var
mkVar [Int]
sizes [a]
inits = do
Arr ix a
arr <- (Rate -> GE [E] -> SE Var) -> [D] -> SE (Arr ix a)
forall ix a.
(Tuple a, Tuple ix) =>
(Rate -> GE [E] -> SE Var) -> [D] -> SE (Arr ix a)
newArrBy Rate -> GE [E] -> SE Var
mkVar ((Int -> D) -> [Int] -> [D]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Int -> D
int [Int]
sizes)
(ix -> a -> SE ()) -> [ix] -> [a] -> SE ()
forall (m :: * -> *) a b c.
Applicative m =>
(a -> b -> m c) -> [a] -> [b] -> m ()
zipWithM_ (Arr ix a -> ix -> a -> SE ()
forall ix a. (Tuple ix, Tuple a) => Arr ix a -> ix -> a -> SE ()
writeInitArr Arr ix a
arr) ([Int] -> [ix]
forall ix. Tuple ix => [Int] -> [ix]
getIndices [Int]
sizes) [a]
inits
Arr ix a -> SE (Arr ix a)
forall (m :: * -> *) a. Monad m => a -> m a
return Arr ix a
arr
newLocalArr :: (Tuple a, Tuple ix) => [D] -> SE (Arr ix a)
newLocalArr :: [D] -> SE (Arr ix a)
newLocalArr = (Rate -> GE [E] -> SE Var) -> [D] -> SE (Arr ix a)
forall ix a.
(Tuple a, Tuple ix) =>
(Rate -> GE [E] -> SE Var) -> [D] -> SE (Arr ix a)
newArrBy Rate -> GE [E] -> SE Var
newLocalArrVar
newGlobalArr :: (Tuple a, Tuple ix) => [D] -> SE (Arr ix a)
newGlobalArr :: [D] -> SE (Arr ix a)
newGlobalArr = (Rate -> GE [E] -> SE Var) -> [D] -> SE (Arr ix a)
forall ix a.
(Tuple a, Tuple ix) =>
(Rate -> GE [E] -> SE Var) -> [D] -> SE (Arr ix a)
newArrBy Rate -> GE [E] -> SE Var
newGlobalArrVar
newLocalCtrlArr :: (Tuple a, Tuple ix) => [D] -> SE (Arr ix a)
newLocalCtrlArr :: [D] -> SE (Arr ix a)
newLocalCtrlArr = (Rate -> GE [E] -> SE Var) -> [D] -> SE (Arr ix a)
forall ix a.
(Tuple a, Tuple ix) =>
(Rate -> GE [E] -> SE Var) -> [D] -> SE (Arr ix a)
newArrBy Rate -> GE [E] -> SE Var
newLocalCtrlArrVar
newGlobalCtrlArr :: (Tuple a, Tuple ix) => [D] -> SE (Arr ix a)
newGlobalCtrlArr :: [D] -> SE (Arr ix a)
newGlobalCtrlArr = (Rate -> GE [E] -> SE Var) -> [D] -> SE (Arr ix a)
forall ix a.
(Tuple a, Tuple ix) =>
(Rate -> GE [E] -> SE Var) -> [D] -> SE (Arr ix a)
newArrBy Rate -> GE [E] -> SE Var
newGlobalCtrlArrVar
fillLocalArr :: (Tuple a, Tuple ix) => [Int] -> [a] -> SE (Arr ix a)
fillLocalArr :: [Int] -> [a] -> SE (Arr ix a)
fillLocalArr = (Rate -> GE [E] -> SE Var) -> [Int] -> [a] -> SE (Arr ix a)
forall a ix.
(Tuple a, Tuple ix) =>
(Rate -> GE [E] -> SE Var) -> [Int] -> [a] -> SE (Arr ix a)
fillArrBy Rate -> GE [E] -> SE Var
newLocalArrVar
fillGlobalArr :: (Tuple a, Tuple ix) => [Int] -> [a] -> SE (Arr ix a)
fillGlobalArr :: [Int] -> [a] -> SE (Arr ix a)
fillGlobalArr = (Rate -> GE [E] -> SE Var) -> [Int] -> [a] -> SE (Arr ix a)
forall a ix.
(Tuple a, Tuple ix) =>
(Rate -> GE [E] -> SE Var) -> [Int] -> [a] -> SE (Arr ix a)
fillArrBy Rate -> GE [E] -> SE Var
newGlobalArrVar
fillLocalCtrlArr :: (Tuple a, Tuple ix) => [Int] -> [a] -> SE (Arr ix a)
fillLocalCtrlArr :: [Int] -> [a] -> SE (Arr ix a)
fillLocalCtrlArr = (Rate -> GE [E] -> SE Var) -> [Int] -> [a] -> SE (Arr ix a)
forall a ix.
(Tuple a, Tuple ix) =>
(Rate -> GE [E] -> SE Var) -> [Int] -> [a] -> SE (Arr ix a)
fillArrBy Rate -> GE [E] -> SE Var
newLocalCtrlArrVar
fillGlobalCtrlArr :: (Tuple a, Tuple ix) => [Int] -> [a] -> SE (Arr ix a)
fillGlobalCtrlArr :: [Int] -> [a] -> SE (Arr ix a)
fillGlobalCtrlArr = (Rate -> GE [E] -> SE Var) -> [Int] -> [a] -> SE (Arr ix a)
forall a ix.
(Tuple a, Tuple ix) =>
(Rate -> GE [E] -> SE Var) -> [Int] -> [a] -> SE (Arr ix a)
fillArrBy Rate -> GE [E] -> SE Var
newGlobalCtrlArrVar
newLocalCtrlArrVar, newGlobalCtrlArrVar :: Rate -> GE [E] -> SE Var
newLocalCtrlArrVar :: Rate -> GE [E] -> SE Var
newLocalCtrlArrVar = Rate -> GE [E] -> SE Var
newLocalArrVar (Rate -> GE [E] -> SE Var)
-> (Rate -> Rate) -> Rate -> GE [E] -> SE Var
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rate -> Rate
toCtrlRate
newGlobalCtrlArrVar :: Rate -> GE [E] -> SE Var
newGlobalCtrlArrVar = Rate -> GE [E] -> SE Var
newGlobalArrVar (Rate -> GE [E] -> SE Var)
-> (Rate -> Rate) -> Rate -> GE [E] -> SE Var
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rate -> Rate
toCtrlRate
toCtrlRate :: Rate -> Rate
toCtrlRate :: Rate -> Rate
toCtrlRate Rate
x = case Rate
x of
Rate
Ar -> Rate
Kr
Rate
Kr -> Rate
Ir
Rate
_ -> Rate
x
readArr :: (Tuple a, Tuple ix) => Arr ix a -> ix -> SE a
readArr :: Arr ix a -> ix -> SE a
readArr (Arr [Var]
vars) ix
ixs = ([E] -> a) -> SE [E] -> SE a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (GE [E] -> a
forall a. Tuple a => GE [E] -> a
toTuple (GE [E] -> a) -> ([E] -> GE [E]) -> [E] -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [E] -> GE [E]
forall (m :: * -> *) a. Monad m => a -> m a
return) (SE [E] -> SE a) -> SE [E] -> SE a
forall a b. (a -> b) -> a -> b
$ Dep [E] -> SE [E]
forall a. Dep a -> SE a
SE (Dep [E] -> SE [E]) -> Dep [E] -> SE [E]
forall a b. (a -> b) -> a -> b
$ GE (Dep [E]) -> Dep [E]
forall a. GE (Dep a) -> Dep a
hideGEinDep (GE (Dep [E]) -> Dep [E]) -> GE (Dep [E]) -> Dep [E]
forall a b. (a -> b) -> a -> b
$ do
[E]
ixsExp <- ix -> GE [E]
forall a. Tuple a => a -> GE [E]
fromTuple ix
ixs
Dep [E] -> GE (Dep [E])
forall (m :: * -> *) a. Monad m => a -> m a
return (Dep [E] -> GE (Dep [E])) -> Dep [E] -> GE (Dep [E])
forall a b. (a -> b) -> a -> b
$ (Var -> DepT GE E) -> [Var] -> Dep [E]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (\Var
v -> Var -> [E] -> DepT GE E
read' Var
v [E]
ixsExp) [Var]
vars
where
read' :: Var -> [E] -> Dep E
read' :: Var -> [E] -> DepT GE E
read' = Var -> [E] -> DepT GE E
forall (m :: * -> *). Monad m => Var -> [E] -> DepT m E
D.readArr
writeArr :: (Tuple ix, Tuple a) => Arr ix a -> ix -> a -> SE ()
writeArr :: Arr ix a -> ix -> a -> SE ()
writeArr (Arr [Var]
vars) ix
ixs a
b = Dep () -> SE ()
forall a. Dep a -> SE a
SE (Dep () -> SE ()) -> Dep () -> SE ()
forall a b. (a -> b) -> a -> b
$ GE (Dep ()) -> Dep ()
forall a. GE (Dep a) -> Dep a
hideGEinDep (GE (Dep ()) -> Dep ()) -> GE (Dep ()) -> Dep ()
forall a b. (a -> b) -> a -> b
$ do
[E]
ixsExp <- ix -> GE [E]
forall a. Tuple a => a -> GE [E]
fromTuple ix
ixs
[E]
bsExp <- a -> GE [E]
forall a. Tuple a => a -> GE [E]
fromTuple a
b
Dep () -> GE (Dep ())
forall (m :: * -> *) a. Monad m => a -> m a
return (Dep () -> GE (Dep ())) -> Dep () -> GE (Dep ())
forall a b. (a -> b) -> a -> b
$ (Var -> E -> Dep ()) -> [Var] -> [E] -> Dep ()
forall (m :: * -> *) a b c.
Applicative m =>
(a -> b -> m c) -> [a] -> [b] -> m ()
zipWithM_ (\Var
var E
value -> Var -> [E] -> E -> Dep ()
write Var
var [E]
ixsExp E
value) [Var]
vars [E]
bsExp
where
write :: Var -> [E] -> E -> Dep ()
write :: Var -> [E] -> E -> Dep ()
write = Var -> [E] -> E -> Dep ()
forall (m :: * -> *). Monad m => Var -> [E] -> E -> DepT m ()
D.writeArr
writeInitArr :: (Tuple ix, Tuple a) => Arr ix a -> ix -> a -> SE ()
writeInitArr :: Arr ix a -> ix -> a -> SE ()
writeInitArr (Arr [Var]
vars) ix
ixs a
b = Dep () -> SE ()
forall a. Dep a -> SE a
SE (Dep () -> SE ()) -> Dep () -> SE ()
forall a b. (a -> b) -> a -> b
$ GE (Dep ()) -> Dep ()
forall a. GE (Dep a) -> Dep a
hideGEinDep (GE (Dep ()) -> Dep ()) -> GE (Dep ()) -> Dep ()
forall a b. (a -> b) -> a -> b
$ do
[E]
ixsExp <- ix -> GE [E]
forall a. Tuple a => a -> GE [E]
fromTuple ix
ixs
[E]
bsExp <- a -> GE [E]
forall a. Tuple a => a -> GE [E]
fromTuple a
b
Dep () -> GE (Dep ())
forall (m :: * -> *) a. Monad m => a -> m a
return (Dep () -> GE (Dep ())) -> Dep () -> GE (Dep ())
forall a b. (a -> b) -> a -> b
$ (Var -> E -> Dep ()) -> [Var] -> [E] -> Dep ()
forall (m :: * -> *) a b c.
Applicative m =>
(a -> b -> m c) -> [a] -> [b] -> m ()
zipWithM_ (\Var
var E
value -> Var -> [E] -> E -> Dep ()
write Var
var [E]
ixsExp E
value) [Var]
vars [E]
bsExp
where
write :: Var -> [E] -> E -> Dep ()
write :: Var -> [E] -> E -> Dep ()
write = Var -> [E] -> E -> Dep ()
forall (m :: * -> *). Monad m => Var -> [E] -> E -> DepT m ()
D.writeInitArr
modifyArr :: (Tuple a, Tuple ix) => Arr ix a -> ix -> (a -> a) -> SE ()
modifyArr :: Arr ix a -> ix -> (a -> a) -> SE ()
modifyArr Arr ix a
ref ix
ixs a -> a
f = do
a
value <- Arr ix a -> ix -> SE a
forall a ix. (Tuple a, Tuple ix) => Arr ix a -> ix -> SE a
readArr Arr ix a
ref ix
ixs
Arr ix a -> ix -> a -> SE ()
forall ix a. (Tuple ix, Tuple a) => Arr ix a -> ix -> a -> SE ()
writeArr Arr ix a
ref ix
ixs (a -> a
f a
value)
mixArr :: (Tuple ix, Tuple a, Num a) => Arr ix a -> ix -> a -> SE ()
mixArr :: Arr ix a -> ix -> a -> SE ()
mixArr Arr ix a
ref ix
ixs a
a = Arr ix a -> ix -> (a -> a) -> SE ()
forall a ix.
(Tuple a, Tuple ix) =>
Arr ix a -> ix -> (a -> a) -> SE ()
modifyArr Arr ix a
ref ix
ixs (a -> a -> a
forall a. Num a => a -> a -> a
+ a
a)
mulArrayNew :: (Tuple b, Num b) => Arr a b -> Arr a b -> SE (Arr a b)
mulArrayNew :: Arr a b -> Arr a b -> SE (Arr a b)
mulArrayNew = String -> Arr a b -> Arr a b -> SE (Arr a b)
forall a b. String -> Arr a b -> Arr a b -> SE (Arr a b)
binOp String
"*"
addArrayNew :: (Tuple b, Num b) => Arr a b -> Arr a b -> SE (Arr a b)
addArrayNew :: Arr a b -> Arr a b -> SE (Arr a b)
addArrayNew = String -> Arr a b -> Arr a b -> SE (Arr a b)
forall a b. String -> Arr a b -> Arr a b -> SE (Arr a b)
binOp String
"+"
subArrayNew :: (Tuple b, Num b) => Arr a b -> Arr a b -> SE (Arr a b)
subArrayNew :: Arr a b -> Arr a b -> SE (Arr a b)
subArrayNew = String -> Arr a b -> Arr a b -> SE (Arr a b)
forall a b. String -> Arr a b -> Arr a b -> SE (Arr a b)
binOp String
"-"
divArrayNew :: (Tuple b, Num b) => Arr a b -> Arr a b -> SE (Arr a b)
divArrayNew :: Arr a b -> Arr a b -> SE (Arr a b)
divArrayNew = String -> Arr a b -> Arr a b -> SE (Arr a b)
forall a b. String -> Arr a b -> Arr a b -> SE (Arr a b)
binOp String
"/"
lenarray :: SigOrD c => Arr a b -> c
lenarray :: Arr a b -> c
lenarray (Arr [Var]
vs) = GE E -> c
forall a. Val a => GE E -> a
fromGE (GE E -> c) -> GE E -> c
forall a b. (a -> b) -> a -> b
$ E -> GE E
forall (m :: * -> *) a. Monad m => a -> m a
return (E -> GE E) -> E -> GE E
forall a b. (a -> b) -> a -> b
$ E -> E
f (Var -> E
inlineVar (Var -> E) -> Var -> E
forall a b. (a -> b) -> a -> b
$ [Var] -> Var
forall a. [a] -> a
head [Var]
vs)
where f :: E -> E
f E
a = String -> Spec1 -> [E] -> E
opcs String
"lenarray" [(Rate
Kr, [Rate
Xr, Rate
Ir]), (Rate
Ir, [Rate
Xr, Rate
Ir])] [E
a]
copyf2array :: Arr Sig Sig -> Tab -> SE ()
copyf2array :: Arr Sig Sig -> Tab -> SE ()
copyf2array (Arr [Var]
vs) Tab
t = Dep () -> SE ()
forall a. Dep a -> SE a
SE (Dep () -> SE ()) -> Dep () -> SE ()
forall a b. (a -> b) -> a -> b
$ GE (Dep ()) -> Dep ()
forall a. GE (Dep a) -> Dep a
hideGEinDep (GE (Dep ()) -> Dep ()) -> GE (Dep ()) -> Dep ()
forall a b. (a -> b) -> a -> b
$ do
E
tabExp <- Tab -> GE E
forall a. Val a => a -> GE E
toGE Tab
t
Dep () -> GE (Dep ())
forall (m :: * -> *) a. Monad m => a -> m a
return (Dep () -> GE (Dep ())) -> Dep () -> GE (Dep ())
forall a b. (a -> b) -> a -> b
$ E -> Dep ()
forall (m :: * -> *). Monad m => E -> DepT m ()
depT_ (E -> Dep ()) -> E -> Dep ()
forall a b. (a -> b) -> a -> b
$ String -> Spec1 -> [E] -> E
opcs String
"copyf2array" [(Rate
Xr, [Var -> Rate
varRate (Var -> Rate) -> Var -> Rate
forall a b. (a -> b) -> a -> b
$ [Var] -> Var
forall a. [a] -> a
head [Var]
vs, Rate
Ir])] [Var -> E
inlineVar (Var -> E) -> Var -> E
forall a b. (a -> b) -> a -> b
$ [Var] -> Var
forall a. [a] -> a
head [Var]
vs, E
tabExp]
copya2ftab :: Arr Sig Sig -> Tab -> SE ()
copya2ftab :: Arr Sig Sig -> Tab -> SE ()
copya2ftab (Arr [Var]
vs) Tab
t = Dep () -> SE ()
forall a. Dep a -> SE a
SE (Dep () -> SE ()) -> Dep () -> SE ()
forall a b. (a -> b) -> a -> b
$ GE (Dep ()) -> Dep ()
forall a. GE (Dep a) -> Dep a
hideGEinDep (GE (Dep ()) -> Dep ()) -> GE (Dep ()) -> Dep ()
forall a b. (a -> b) -> a -> b
$ do
E
tabExp <- Tab -> GE E
forall a. Val a => a -> GE E
toGE Tab
t
Dep () -> GE (Dep ())
forall (m :: * -> *) a. Monad m => a -> m a
return (Dep () -> GE (Dep ())) -> Dep () -> GE (Dep ())
forall a b. (a -> b) -> a -> b
$ E -> Dep ()
forall (m :: * -> *). Monad m => E -> DepT m ()
depT_ (E -> Dep ()) -> E -> Dep ()
forall a b. (a -> b) -> a -> b
$ String -> Spec1 -> [E] -> E
opcs String
"copya2ftab" [(Rate
Xr, [Var -> Rate
varRate (Var -> Rate) -> Var -> Rate
forall a b. (a -> b) -> a -> b
$ [Var] -> Var
forall a. [a] -> a
head [Var]
vs, Rate
Ir])] [Var -> E
inlineVar (Var -> E) -> Var -> E
forall a b. (a -> b) -> a -> b
$ [Var] -> Var
forall a. [a] -> a
head [Var]
vs, E
tabExp]
maparrayNew :: Arr a b -> Str -> SE (Arr a b)
maparrayNew :: Arr a b -> Str -> SE (Arr a b)
maparrayNew (Arr [Var]
vs) Str
s = Dep (Arr a b) -> SE (Arr a b)
forall a. Dep a -> SE a
SE (Dep (Arr a b) -> SE (Arr a b)) -> Dep (Arr a b) -> SE (Arr a b)
forall a b. (a -> b) -> a -> b
$ ([Var] -> Arr a b) -> DepT GE [Var] -> Dep (Arr a b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [Var] -> Arr a b
forall ix a. [Var] -> Arr ix a
Arr (DepT GE [Var] -> Dep (Arr a b)) -> DepT GE [Var] -> Dep (Arr a b)
forall a b. (a -> b) -> a -> b
$ GE (DepT GE [Var]) -> DepT GE [Var]
forall a. GE (Dep a) -> Dep a
hideGEinDep (GE (DepT GE [Var]) -> DepT GE [Var])
-> GE (DepT GE [Var]) -> DepT GE [Var]
forall a b. (a -> b) -> a -> b
$ do
E
strExp <- Str -> GE E
forall a. Val a => a -> GE E
toGE Str
s
DepT GE [Var] -> GE (DepT GE [Var])
forall (m :: * -> *) a. Monad m => a -> m a
return (DepT GE [Var] -> GE (DepT GE [Var]))
-> DepT GE [Var] -> GE (DepT GE [Var])
forall a b. (a -> b) -> a -> b
$ (Var -> DepT GE Var) -> [Var] -> DepT GE [Var]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (\Var
var -> Var -> E -> DepT GE Var
go Var
var E
strExp) [Var]
vs
where
go :: Var -> E -> DepT GE Var
go Var
var E
strExp = do
Var
outVar <- SE Var -> DepT GE Var
forall a. SE a -> Dep a
unSE (SE Var -> DepT GE Var) -> SE Var -> DepT GE Var
forall a b. (a -> b) -> a -> b
$ Rate -> SE Var
newTmpArrVar (Var -> Rate
varRate Var
var)
IsArrInit -> Var -> String -> Spec1 -> [E] -> Dep ()
forall (m :: * -> *).
Monad m =>
IsArrInit -> Var -> String -> Spec1 -> [E] -> DepT m ()
opcsArr IsArrInit
isArrayInit Var
outVar String
"slicearray" Spec1
idRate [Var -> E
inlineVar Var
var, E
strExp]
Var -> DepT GE Var
forall (m :: * -> *) a. Monad m => a -> m a
return (Var -> DepT GE Var) -> Var -> DepT GE Var
forall a b. (a -> b) -> a -> b
$ Var
outVar
idRate :: Spec1
idRate = (Rate -> (Rate, [Rate])) -> [Rate] -> Spec1
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Rate
rate -> (Rate
rate, [Rate
rate, Rate
Ir, Rate
Ir])) [Rate
Ir, Rate
Kr, Rate
Ar]
minarray :: (Tuple b, Num b) => Arr a b -> SE b
minarray :: Arr a b -> SE b
minarray = String -> Arr a b -> SE b
forall b a. Tuple b => String -> Arr a b -> SE b
extractArray String
"minarray"
maxarray :: (Tuple b, Num b) => Arr a b -> SE b
maxarray :: Arr a b -> SE b
maxarray = String -> Arr a b -> SE b
forall b a. Tuple b => String -> Arr a b -> SE b
extractArray String
"maxarray"
sumarray :: (Tuple b, Num b) => Arr a b -> SE b
sumarray :: Arr a b -> SE b
sumarray = String -> Arr a b -> SE b
forall b a. Tuple b => String -> Arr a b -> SE b
extractArray String
"sumarray"
scalearray :: (Tuple b, Num b) => Arr a b -> (b, b) -> SE ()
scalearray :: Arr a b -> (b, b) -> SE ()
scalearray (Arr [Var]
vs) (b
a, b
b) = Dep () -> SE ()
forall a. Dep a -> SE a
SE (Dep () -> SE ()) -> Dep () -> SE ()
forall a b. (a -> b) -> a -> b
$ GE (Dep ()) -> Dep ()
forall a. GE (Dep a) -> Dep a
hideGEinDep (GE (Dep ()) -> Dep ()) -> GE (Dep ()) -> Dep ()
forall a b. (a -> b) -> a -> b
$ do
[E]
aExps <- b -> GE [E]
forall a. Tuple a => a -> GE [E]
fromTuple b
a
[E]
bExps <- b -> GE [E]
forall a. Tuple a => a -> GE [E]
fromTuple b
b
Dep () -> GE (Dep ())
forall (m :: * -> *) a. Monad m => a -> m a
return (Dep () -> GE (Dep ())) -> Dep () -> GE (Dep ())
forall a b. (a -> b) -> a -> b
$ (Var -> (E, E) -> Dep ()) -> [Var] -> [(E, E)] -> Dep ()
forall (m :: * -> *) a b c.
Applicative m =>
(a -> b -> m c) -> [a] -> [b] -> m ()
zipWithM_ (\Var
var (E
aExp, E
bExp) -> Var -> (E, E) -> Dep ()
forall (m :: * -> *). Monad m => Var -> (E, E) -> DepT m ()
go Var
var (E
aExp, E
bExp)) [Var]
vs ([E] -> [E] -> [(E, E)]
forall a b. [a] -> [b] -> [(a, b)]
zip [E]
aExps [E]
bExps)
where
go :: Var -> (E, E) -> DepT m ()
go Var
v (E
aExp, E
bExp) =
E -> DepT m ()
forall (m :: * -> *). Monad m => E -> DepT m ()
depT_ (E -> DepT m ()) -> E -> DepT m ()
forall a b. (a -> b) -> a -> b
$ String -> Spec1 -> [E] -> E
opcs String
"copyf2array" [(Rate
Xr, [Var -> Rate
varRate (Var -> Rate) -> Var -> Rate
forall a b. (a -> b) -> a -> b
$ [Var] -> Var
forall a. [a] -> a
head [Var]
vs, Rate
Ir])] [Var -> E
inlineVar Var
v, E
aExp, E
bExp]
slicearrayNew :: Arr D a -> (D, D) -> SE (Arr D a)
slicearrayNew :: Arr D a -> (D, D) -> SE (Arr D a)
slicearrayNew (Arr [Var]
vs) (D
from, D
to) = Dep (Arr D a) -> SE (Arr D a)
forall a. Dep a -> SE a
SE (Dep (Arr D a) -> SE (Arr D a)) -> Dep (Arr D a) -> SE (Arr D a)
forall a b. (a -> b) -> a -> b
$ ([Var] -> Arr D a) -> DepT GE [Var] -> Dep (Arr D a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [Var] -> Arr D a
forall ix a. [Var] -> Arr ix a
Arr (DepT GE [Var] -> Dep (Arr D a)) -> DepT GE [Var] -> Dep (Arr D a)
forall a b. (a -> b) -> a -> b
$ GE (DepT GE [Var]) -> DepT GE [Var]
forall a. GE (Dep a) -> Dep a
hideGEinDep (GE (DepT GE [Var]) -> DepT GE [Var])
-> GE (DepT GE [Var]) -> DepT GE [Var]
forall a b. (a -> b) -> a -> b
$ do
E
fromExpr <- D -> GE E
forall a. Val a => a -> GE E
toGE D
from
E
toExpr <- D -> GE E
forall a. Val a => a -> GE E
toGE D
to
DepT GE [Var] -> GE (DepT GE [Var])
forall (m :: * -> *) a. Monad m => a -> m a
return (DepT GE [Var] -> GE (DepT GE [Var]))
-> DepT GE [Var] -> GE (DepT GE [Var])
forall a b. (a -> b) -> a -> b
$ (Var -> DepT GE Var) -> [Var] -> DepT GE [Var]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (\Var
var -> Var -> (E, E) -> DepT GE Var
go Var
var (E
fromExpr, E
toExpr)) [Var]
vs
where
go :: Var -> (E, E) -> DepT GE Var
go Var
var (E
fromExpr, E
toExpr) = do
Var
outVar <- SE Var -> DepT GE Var
forall a. SE a -> Dep a
unSE (SE Var -> DepT GE Var) -> SE Var -> DepT GE Var
forall a b. (a -> b) -> a -> b
$ Rate -> SE Var
newTmpArrVar (Var -> Rate
varRate Var
var)
IsArrInit -> Var -> String -> Spec1 -> [E] -> Dep ()
forall (m :: * -> *).
Monad m =>
IsArrInit -> Var -> String -> Spec1 -> [E] -> DepT m ()
opcsArr IsArrInit
isArrayInit Var
outVar String
"slicearray" Spec1
idRate [Var -> E
inlineVar Var
var, E
fromExpr, E
toExpr]
Var -> DepT GE Var
forall (m :: * -> *) a. Monad m => a -> m a
return (Var -> DepT GE Var) -> Var -> DepT GE Var
forall a b. (a -> b) -> a -> b
$ Var
outVar
idRate :: Spec1
idRate = (Rate -> (Rate, [Rate])) -> [Rate] -> Spec1
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Rate
rate -> (Rate
rate, [Rate
rate, Rate
Ir, Rate
Ir])) [Rate
Ir, Rate
Kr, Rate
Ar]
type SpecArr = Arr Sig Sig
fftNew :: SpecArr -> SE SpecArr
fftNew :: Arr Sig Sig -> SE (Arr Sig Sig)
fftNew = String -> Arr Sig Sig -> SE (Arr Sig Sig)
forall a b. String -> Arr a b -> SE (Arr a b)
convert String
"fft"
fftinvNew :: SpecArr -> SE SpecArr
fftinvNew :: Arr Sig Sig -> SE (Arr Sig Sig)
fftinvNew = String -> Arr Sig Sig -> SE (Arr Sig Sig)
forall a b. String -> Arr a b -> SE (Arr a b)
convert String
"fftinvi"
rfftNew :: SpecArr -> SE SpecArr
rfftNew :: Arr Sig Sig -> SE (Arr Sig Sig)
rfftNew = String -> Arr Sig Sig -> SE (Arr Sig Sig)
forall a b. String -> Arr a b -> SE (Arr a b)
convert String
"rfft"
rifftNew :: SpecArr -> SE SpecArr
rifftNew :: Arr Sig Sig -> SE (Arr Sig Sig)
rifftNew = String -> Arr Sig Sig -> SE (Arr Sig Sig)
forall a b. String -> Arr a b -> SE (Arr a b)
convert String
"rifft"
pvs2tab :: SpecArr -> Spec -> SE Sig
pvs2tab :: Arr Sig Sig -> Spec -> SE Sig
pvs2tab = String -> (Rate, [Rate]) -> Arr Sig Sig -> Spec -> SE Sig
forall b c d a.
(Tuple b, Tuple c, Tuple d) =>
String -> (Rate, [Rate]) -> Arr a b -> c -> SE d
extractWith String
"pvs2tab" (Rate
Kr, [Rate
Xr, Rate
Fr])
tab2pvs :: SpecArr -> SE Spec
tab2pvs :: Arr Sig Sig -> SE Spec
tab2pvs = Rate -> String -> Arr Sig Sig -> SE Spec
forall b c a.
(Tuple b, Tuple c) =>
Rate -> String -> Arr a b -> SE c
extract1 Rate
Fr String
"tab2pvs"
cmplxprodNew :: SpecArr -> SpecArr -> SE SpecArr
cmplxprodNew :: Arr Sig Sig -> Arr Sig Sig -> SE (Arr Sig Sig)
cmplxprodNew = String -> Arr Sig Sig -> Arr Sig Sig -> SE (Arr Sig Sig)
forall a b. String -> Arr a b -> Arr a b -> SE (Arr a b)
convert2 String
"cmplxprod"
rect2polNew :: SpecArr -> SE SpecArr
rect2polNew :: Arr Sig Sig -> SE (Arr Sig Sig)
rect2polNew = String -> Arr Sig Sig -> SE (Arr Sig Sig)
forall a b. String -> Arr a b -> SE (Arr a b)
convert String
"rect2pol"
pol2rectNew :: SpecArr -> SE SpecArr
pol2rectNew :: Arr Sig Sig -> SE (Arr Sig Sig)
pol2rectNew = String -> Arr Sig Sig -> SE (Arr Sig Sig)
forall a b. String -> Arr a b -> SE (Arr a b)
convert String
"pol2rect"
pol2rect2New :: SpecArr -> SpecArr -> SE SpecArr
pol2rect2New :: Arr Sig Sig -> Arr Sig Sig -> SE (Arr Sig Sig)
pol2rect2New = String -> Arr Sig Sig -> Arr Sig Sig -> SE (Arr Sig Sig)
forall a b. String -> Arr a b -> Arr a b -> SE (Arr a b)
convert2 String
"pol2rect"
windowArrayNew :: SpecArr -> SE SpecArr
windowArrayNew :: Arr Sig Sig -> SE (Arr Sig Sig)
windowArrayNew = String -> Arr Sig Sig -> SE (Arr Sig Sig)
forall a b. String -> Arr a b -> SE (Arr a b)
convert String
"window"
r2cNew :: SpecArr -> SE SpecArr
r2cNew :: Arr Sig Sig -> SE (Arr Sig Sig)
r2cNew = String -> Arr Sig Sig -> SE (Arr Sig Sig)
forall a b. String -> Arr a b -> SE (Arr a b)
convert String
"r2c"
c2rNew :: SpecArr -> SE SpecArr
c2rNew :: Arr Sig Sig -> SE (Arr Sig Sig)
c2rNew = String -> Arr Sig Sig -> SE (Arr Sig Sig)
forall a b. String -> Arr a b -> SE (Arr a b)
convert String
"c2r"
magsArrayNew :: SpecArr -> SE SpecArr
magsArrayNew :: Arr Sig Sig -> SE (Arr Sig Sig)
magsArrayNew = String -> Arr Sig Sig -> SE (Arr Sig Sig)
forall a b. String -> Arr a b -> SE (Arr a b)
convert String
"mags"
phsArrayNew :: SpecArr -> SE SpecArr
phsArrayNew :: Arr Sig Sig -> SE (Arr Sig Sig)
phsArrayNew = String -> Arr Sig Sig -> SE (Arr Sig Sig)
forall a b. String -> Arr a b -> SE (Arr a b)
convert String
"phs"
isArrayInit, noArrayInit :: Bool
isArrayInit :: IsArrInit
isArrayInit = IsArrInit
True
noArrayInit :: IsArrInit
noArrayInit = IsArrInit
False
binOp :: String -> Arr a b -> Arr a b -> SE (Arr a b)
binOp :: String -> Arr a b -> Arr a b -> SE (Arr a b)
binOp String
name (Arr [Var]
xs) (Arr [Var]
ys) = ([Var] -> Arr a b) -> SE [Var] -> SE (Arr a b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [Var] -> Arr a b
forall ix a. [Var] -> Arr ix a
Arr (SE [Var] -> SE (Arr a b)) -> SE [Var] -> SE (Arr a b)
forall a b. (a -> b) -> a -> b
$ (Var -> Var -> SE Var) -> [Var] -> [Var] -> SE [Var]
forall (m :: * -> *) a b c.
Applicative m =>
(a -> b -> m c) -> [a] -> [b] -> m [c]
zipWithM Var -> Var -> SE Var
go [Var]
xs [Var]
ys
where
go :: Var -> Var -> SE Var
go Var
x Var
y = DepT GE Var -> SE Var
forall a. Dep a -> SE a
SE (DepT GE Var -> SE Var) -> DepT GE Var -> SE Var
forall a b. (a -> b) -> a -> b
$ do
Var
outVar <- SE Var -> DepT GE Var
forall a. SE a -> Dep a
unSE (SE Var -> DepT GE Var) -> SE Var -> DepT GE Var
forall a b. (a -> b) -> a -> b
$ Rate -> SE Var
newTmpArrVar (Var -> Rate
varRate Var
x)
IsArrInit -> Var -> String -> E -> E -> Dep ()
forall (m :: * -> *).
Monad m =>
IsArrInit -> Var -> String -> E -> E -> DepT m ()
infOprArr IsArrInit
isArrayInit Var
outVar String
name (Var -> E
inlineVar Var
x) (Var -> E
inlineVar Var
y)
Var -> DepT GE Var
forall (m :: * -> *) a. Monad m => a -> m a
return Var
outVar
convert :: String -> Arr a b -> SE (Arr a b)
convert :: String -> Arr a b -> SE (Arr a b)
convert String
name (Arr [Var]
vars) = ([Var] -> Arr a b) -> SE [Var] -> SE (Arr a b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [Var] -> Arr a b
forall ix a. [Var] -> Arr ix a
Arr (SE [Var] -> SE (Arr a b)) -> SE [Var] -> SE (Arr a b)
forall a b. (a -> b) -> a -> b
$ (Var -> SE Var) -> [Var] -> SE [Var]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Var -> SE Var
go [Var]
vars
where
go :: Var -> SE Var
go Var
v = DepT GE Var -> SE Var
forall a. Dep a -> SE a
SE (DepT GE Var -> SE Var) -> DepT GE Var -> SE Var
forall a b. (a -> b) -> a -> b
$ do
Var
outVar <- SE Var -> DepT GE Var
forall a. SE a -> Dep a
unSE (SE Var -> DepT GE Var) -> SE Var -> DepT GE Var
forall a b. (a -> b) -> a -> b
$ Rate -> SE Var
newTmpArrVar (Var -> Rate
varRate Var
v)
IsArrInit -> Var -> String -> Spec1 -> [E] -> Dep ()
forall (m :: * -> *).
Monad m =>
IsArrInit -> Var -> String -> Spec1 -> [E] -> DepT m ()
opcsArr IsArrInit
isArrayInit Var
outVar String
name Spec1
idRate1 [Var -> E
inlineVar Var
v]
Var -> DepT GE Var
forall (m :: * -> *) a. Monad m => a -> m a
return Var
outVar
idRate1 :: Spec1
idRate1 = (Rate -> (Rate, [Rate])) -> [Rate] -> Spec1
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Rate
r -> (Rate
r, [Rate
r])) [Rate
Kr, Rate
Ar, Rate
Ir, Rate
Sr, Rate
Fr]
convert2 :: String -> Arr a b -> Arr a b -> SE (Arr a b)
convert2 :: String -> Arr a b -> Arr a b -> SE (Arr a b)
convert2 String
name (Arr [Var]
xs) (Arr [Var]
ys) = ([Var] -> Arr a b) -> SE [Var] -> SE (Arr a b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [Var] -> Arr a b
forall ix a. [Var] -> Arr ix a
Arr (SE [Var] -> SE (Arr a b)) -> SE [Var] -> SE (Arr a b)
forall a b. (a -> b) -> a -> b
$ (Var -> Var -> SE Var) -> [Var] -> [Var] -> SE [Var]
forall (m :: * -> *) a b c.
Applicative m =>
(a -> b -> m c) -> [a] -> [b] -> m [c]
zipWithM Var -> Var -> SE Var
go [Var]
xs [Var]
ys
where
go :: Var -> Var -> SE Var
go Var
x Var
y = DepT GE Var -> SE Var
forall a. Dep a -> SE a
SE (DepT GE Var -> SE Var) -> DepT GE Var -> SE Var
forall a b. (a -> b) -> a -> b
$ do
Var
outVar <- SE Var -> DepT GE Var
forall a. SE a -> Dep a
unSE (SE Var -> DepT GE Var) -> SE Var -> DepT GE Var
forall a b. (a -> b) -> a -> b
$ Rate -> SE Var
newTmpArrVar (Var -> Rate
varRate Var
x)
IsArrInit -> Var -> String -> Spec1 -> [E] -> Dep ()
forall (m :: * -> *).
Monad m =>
IsArrInit -> Var -> String -> Spec1 -> [E] -> DepT m ()
opcsArr IsArrInit
isArrayInit Var
outVar String
name Spec1
idRate2 [Var -> E
inlineVar Var
x, Var -> E
inlineVar Var
y]
Var -> DepT GE Var
forall (m :: * -> *) a. Monad m => a -> m a
return Var
outVar
idRate2 :: Spec1
idRate2 = (Rate -> (Rate, [Rate])) -> [Rate] -> Spec1
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Rate
r -> (Rate
r, [Rate
r, Rate
r])) [Rate
Kr, Rate
Ar, Rate
Ir, Rate
Sr, Rate
Fr]
extractArray :: (Tuple b) => String -> Arr a b -> SE b
String
name (Arr [Var]
vs) = Dep b -> SE b
forall a. Dep a -> SE a
SE (Dep b -> SE b) -> Dep b -> SE b
forall a b. (a -> b) -> a -> b
$ ([E] -> b) -> Dep [E] -> Dep b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (GE [E] -> b
forall a. Tuple a => GE [E] -> a
toTuple (GE [E] -> b) -> ([E] -> GE [E]) -> [E] -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [E] -> GE [E]
forall (m :: * -> *) a. Monad m => a -> m a
return) (Dep [E] -> Dep b) -> Dep [E] -> Dep b
forall a b. (a -> b) -> a -> b
$ (Var -> DepT GE E) -> [Var] -> Dep [E]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (E -> DepT GE E
forall (m :: * -> *). Monad m => E -> DepT m E
f (E -> DepT GE E) -> (Var -> E) -> Var -> DepT GE E
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Var -> E
inlineVar) [Var]
vs
where f :: E -> DepT m E
f E
a = E -> DepT m E
forall (m :: * -> *). Monad m => E -> DepT m E
depT (E -> DepT m E) -> E -> DepT m E
forall a b. (a -> b) -> a -> b
$ String -> Spec1 -> [E] -> E
opcs String
name [(Rate
Xr, [Rate
Xr])] [E
a]
extract1 :: (Tuple b, Tuple c) => Rate -> String -> Arr a b -> SE c
Rate
rate String
name (Arr [Var]
vs) = Dep c -> SE c
forall a. Dep a -> SE a
SE (Dep c -> SE c) -> Dep c -> SE c
forall a b. (a -> b) -> a -> b
$ ([E] -> c) -> Dep [E] -> Dep c
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (GE [E] -> c
forall a. Tuple a => GE [E] -> a
toTuple (GE [E] -> c) -> ([E] -> GE [E]) -> [E] -> c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [E] -> GE [E]
forall (m :: * -> *) a. Monad m => a -> m a
return) (Dep [E] -> Dep c) -> Dep [E] -> Dep c
forall a b. (a -> b) -> a -> b
$ (Var -> DepT GE E) -> [Var] -> Dep [E]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (E -> DepT GE E
forall (m :: * -> *). Monad m => E -> DepT m E
f (E -> DepT GE E) -> (Var -> E) -> Var -> DepT GE E
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Var -> E
inlineVar) [Var]
vs
where f :: E -> DepT m E
f E
a = E -> DepT m E
forall (m :: * -> *). Monad m => E -> DepT m E
depT (E -> DepT m E) -> E -> DepT m E
forall a b. (a -> b) -> a -> b
$ String -> Spec1 -> [E] -> E
opcs String
name [(Rate
rate, [Rate
Xr])] [E
a]
extractWith :: (Tuple b, Tuple c, Tuple d) => String -> (Rate, [Rate]) -> Arr a b -> c -> SE d
String
name (Rate, [Rate])
rates (Arr [Var]
vs) c
argument = Dep d -> SE d
forall a. Dep a -> SE a
SE (Dep d -> SE d) -> Dep d -> SE d
forall a b. (a -> b) -> a -> b
$ ([E] -> d) -> Dep [E] -> Dep d
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (GE [E] -> d
forall a. Tuple a => GE [E] -> a
toTuple (GE [E] -> d) -> ([E] -> GE [E]) -> [E] -> d
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [E] -> GE [E]
forall (m :: * -> *) a. Monad m => a -> m a
return) (Dep [E] -> Dep d) -> Dep [E] -> Dep d
forall a b. (a -> b) -> a -> b
$ GE (Dep [E]) -> Dep [E]
forall a. GE (Dep a) -> Dep a
hideGEinDep (GE (Dep [E]) -> Dep [E]) -> GE (Dep [E]) -> Dep [E]
forall a b. (a -> b) -> a -> b
$ do
[E]
argExps <- c -> GE [E]
forall a. Tuple a => a -> GE [E]
fromTuple c
argument
Dep [E] -> GE (Dep [E])
forall (m :: * -> *) a. Monad m => a -> m a
return (Dep [E] -> GE (Dep [E])) -> Dep [E] -> GE (Dep [E])
forall a b. (a -> b) -> a -> b
$ (Var -> E -> DepT GE E) -> [Var] -> [E] -> Dep [E]
forall (m :: * -> *) a b c.
Applicative m =>
(a -> b -> m c) -> [a] -> [b] -> m [c]
zipWithM (\Var
var E
x -> E -> E -> DepT GE E
forall (m :: * -> *). Monad m => E -> E -> DepT m E
f (Var -> E
inlineVar Var
var) E
x) [Var]
vs [E]
argExps
where f :: E -> E -> DepT m E
f E
a E
b = E -> DepT m E
forall (m :: * -> *). Monad m => E -> DepT m E
depT (E -> DepT m E) -> E -> DepT m E
forall a b. (a -> b) -> a -> b
$ String -> Spec1 -> [E] -> E
opcs String
name [(Rate, [Rate])
rates] [E
a, E
b]
maparrayCopy :: Arr a b -> Str -> Arr a b -> SE ()
maparrayCopy :: Arr a b -> Str -> Arr a b -> SE ()
maparrayCopy (Arr [Var]
vs) Str
s (Arr [Var]
outs) = Dep () -> SE ()
forall a. Dep a -> SE a
SE (Dep () -> SE ()) -> Dep () -> SE ()
forall a b. (a -> b) -> a -> b
$ GE (Dep ()) -> Dep ()
forall a. GE (Dep a) -> Dep a
hideGEinDep (GE (Dep ()) -> Dep ()) -> GE (Dep ()) -> Dep ()
forall a b. (a -> b) -> a -> b
$ do
E
strExp <- Str -> GE E
forall a. Val a => a -> GE E
toGE Str
s
Dep () -> GE (Dep ())
forall (m :: * -> *) a. Monad m => a -> m a
return (Dep () -> GE (Dep ())) -> Dep () -> GE (Dep ())
forall a b. (a -> b) -> a -> b
$ (Var -> Var -> Dep ()) -> [Var] -> [Var] -> Dep ()
forall (m :: * -> *) a b c.
Applicative m =>
(a -> b -> m c) -> [a] -> [b] -> m ()
zipWithM_ (\Var
var Var
outVar -> Var -> E -> Var -> Dep ()
forall (m :: * -> *). Monad m => Var -> E -> Var -> DepT m ()
go Var
var E
strExp Var
outVar) [Var]
vs [Var]
outs
where
go :: Var -> E -> Var -> DepT m ()
go Var
var E
strExp Var
outVar = IsArrInit -> Var -> String -> Spec1 -> [E] -> DepT m ()
forall (m :: * -> *).
Monad m =>
IsArrInit -> Var -> String -> Spec1 -> [E] -> DepT m ()
opcsArr IsArrInit
noArrayInit Var
outVar String
"slicearray" Spec1
idRate [Var -> E
inlineVar Var
var, E
strExp]
idRate :: Spec1
idRate = (Rate -> (Rate, [Rate])) -> [Rate] -> Spec1
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Rate
rate -> (Rate
rate, [Rate
rate, Rate
Ir, Rate
Ir])) [Rate
Ir, Rate
Kr, Rate
Ar]
slicearrayCopy :: Arr D a -> (D, D) -> Arr D a -> SE ()
slicearrayCopy :: Arr D a -> (D, D) -> Arr D a -> SE ()
slicearrayCopy (Arr [Var]
vs) (D
from, D
to) (Arr [Var]
outs) = Dep () -> SE ()
forall a. Dep a -> SE a
SE (Dep () -> SE ()) -> Dep () -> SE ()
forall a b. (a -> b) -> a -> b
$ GE (Dep ()) -> Dep ()
forall a. GE (Dep a) -> Dep a
hideGEinDep (GE (Dep ()) -> Dep ()) -> GE (Dep ()) -> Dep ()
forall a b. (a -> b) -> a -> b
$ do
E
fromExpr <- D -> GE E
forall a. Val a => a -> GE E
toGE D
from
E
toExpr <- D -> GE E
forall a. Val a => a -> GE E
toGE D
to
Dep () -> GE (Dep ())
forall (m :: * -> *) a. Monad m => a -> m a
return (Dep () -> GE (Dep ())) -> Dep () -> GE (Dep ())
forall a b. (a -> b) -> a -> b
$ (Var -> Var -> Dep ()) -> [Var] -> [Var] -> Dep ()
forall (m :: * -> *) a b c.
Applicative m =>
(a -> b -> m c) -> [a] -> [b] -> m ()
zipWithM_ (\Var
var Var
outVar -> Var -> (E, E) -> Var -> Dep ()
forall (m :: * -> *). Monad m => Var -> (E, E) -> Var -> DepT m ()
go Var
var (E
fromExpr, E
toExpr) Var
outVar) [Var]
vs [Var]
outs
where
go :: Var -> (E, E) -> Var -> DepT m ()
go Var
var (E
fromExpr, E
toExpr) Var
outVar = IsArrInit -> Var -> String -> Spec1 -> [E] -> DepT m ()
forall (m :: * -> *).
Monad m =>
IsArrInit -> Var -> String -> Spec1 -> [E] -> DepT m ()
opcsArr IsArrInit
noArrayInit Var
outVar String
"slicearray" Spec1
idRate [Var -> E
inlineVar Var
var, E
fromExpr, E
toExpr]
idRate :: Spec1
idRate = (Rate -> (Rate, [Rate])) -> [Rate] -> Spec1
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Rate
rate -> (Rate
rate, [Rate
rate, Rate
Ir, Rate
Ir])) [Rate
Ir, Rate
Kr, Rate
Ar]
mulArrayCopy :: (Tuple b, Num b) => Arr a b -> Arr a b -> Arr a b -> SE ()
mulArrayCopy :: Arr a b -> Arr a b -> Arr a b -> SE ()
mulArrayCopy = String -> Arr a b -> Arr a b -> Arr a b -> SE ()
forall a b. String -> Arr a b -> Arr a b -> Arr a b -> SE ()
binOpCopy String
"*"
addArrayCopy :: (Tuple b, Num b) => Arr a b -> Arr a b -> Arr a b -> SE ()
addArrayCopy :: Arr a b -> Arr a b -> Arr a b -> SE ()
addArrayCopy = String -> Arr a b -> Arr a b -> Arr a b -> SE ()
forall a b. String -> Arr a b -> Arr a b -> Arr a b -> SE ()
binOpCopy String
"+"
subArrayCopy :: (Tuple b, Num b) => Arr a b -> Arr a b -> Arr a b -> SE ()
subArrayCopy :: Arr a b -> Arr a b -> Arr a b -> SE ()
subArrayCopy = String -> Arr a b -> Arr a b -> Arr a b -> SE ()
forall a b. String -> Arr a b -> Arr a b -> Arr a b -> SE ()
binOpCopy String
"-"
divArrayCopy :: (Tuple b, Num b) => Arr a b -> Arr a b -> Arr a b -> SE ()
divArrayCopy :: Arr a b -> Arr a b -> Arr a b -> SE ()
divArrayCopy = String -> Arr a b -> Arr a b -> Arr a b -> SE ()
forall a b. String -> Arr a b -> Arr a b -> Arr a b -> SE ()
binOpCopy String
"/"
fftCopy :: SpecArr -> SpecArr -> SE ()
fftCopy :: Arr Sig Sig -> Arr Sig Sig -> SE ()
fftCopy = String -> Arr Sig Sig -> Arr Sig Sig -> SE ()
forall a b. String -> Arr a b -> Arr a b -> SE ()
convertCopy String
"fft"
fftinvCopy :: SpecArr -> SpecArr -> SE ()
fftinvCopy :: Arr Sig Sig -> Arr Sig Sig -> SE ()
fftinvCopy = String -> Arr Sig Sig -> Arr Sig Sig -> SE ()
forall a b. String -> Arr a b -> Arr a b -> SE ()
convertCopy String
"fftinvi"
rfftCopy :: SpecArr -> SpecArr -> SE ()
rfftCopy :: Arr Sig Sig -> Arr Sig Sig -> SE ()
rfftCopy = String -> Arr Sig Sig -> Arr Sig Sig -> SE ()
forall a b. String -> Arr a b -> Arr a b -> SE ()
convertCopy String
"rfft"
rifftCopy :: SpecArr -> SpecArr -> SE ()
rifftCopy :: Arr Sig Sig -> Arr Sig Sig -> SE ()
rifftCopy = String -> Arr Sig Sig -> Arr Sig Sig -> SE ()
forall a b. String -> Arr a b -> Arr a b -> SE ()
convertCopy String
"rifft"
cmplxprodCopy :: SpecArr -> SpecArr -> SpecArr -> SE ()
cmplxprodCopy :: Arr Sig Sig -> Arr Sig Sig -> Arr Sig Sig -> SE ()
cmplxprodCopy = String -> Arr Sig Sig -> Arr Sig Sig -> Arr Sig Sig -> SE ()
forall a b. String -> Arr a b -> Arr a b -> Arr a b -> SE ()
convert2Copy String
"cmplxprod"
rect2polCopy :: SpecArr -> SpecArr -> SE ()
rect2polCopy :: Arr Sig Sig -> Arr Sig Sig -> SE ()
rect2polCopy = String -> Arr Sig Sig -> Arr Sig Sig -> SE ()
forall a b. String -> Arr a b -> Arr a b -> SE ()
convertCopy String
"rect2pol"
pol2rectCopy :: SpecArr -> SpecArr -> SE ()
pol2rectCopy :: Arr Sig Sig -> Arr Sig Sig -> SE ()
pol2rectCopy = String -> Arr Sig Sig -> Arr Sig Sig -> SE ()
forall a b. String -> Arr a b -> Arr a b -> SE ()
convertCopy String
"pol2rect"
pol2rect2Copy :: SpecArr -> SpecArr -> SpecArr -> SE ()
pol2rect2Copy :: Arr Sig Sig -> Arr Sig Sig -> Arr Sig Sig -> SE ()
pol2rect2Copy = String -> Arr Sig Sig -> Arr Sig Sig -> Arr Sig Sig -> SE ()
forall a b. String -> Arr a b -> Arr a b -> Arr a b -> SE ()
convert2Copy String
"pol2rect2"
windowArrayCopy :: SpecArr -> SpecArr -> SE ()
windowArrayCopy :: Arr Sig Sig -> Arr Sig Sig -> SE ()
windowArrayCopy = String -> Arr Sig Sig -> Arr Sig Sig -> SE ()
forall a b. String -> Arr a b -> Arr a b -> SE ()
convertCopy String
"window"
r2cCopy :: SpecArr -> SpecArr -> SE ()
r2cCopy :: Arr Sig Sig -> Arr Sig Sig -> SE ()
r2cCopy = String -> Arr Sig Sig -> Arr Sig Sig -> SE ()
forall a b. String -> Arr a b -> Arr a b -> SE ()
convertCopy String
"r2c"
c2rCopy :: SpecArr -> SpecArr -> SE ()
c2rCopy :: Arr Sig Sig -> Arr Sig Sig -> SE ()
c2rCopy = String -> Arr Sig Sig -> Arr Sig Sig -> SE ()
forall a b. String -> Arr a b -> Arr a b -> SE ()
convertCopy String
"c2r"
magsArrayCopy :: SpecArr -> SpecArr -> SE ()
magsArrayCopy :: Arr Sig Sig -> Arr Sig Sig -> SE ()
magsArrayCopy = String -> Arr Sig Sig -> Arr Sig Sig -> SE ()
forall a b. String -> Arr a b -> Arr a b -> SE ()
convertCopy String
"mags"
phsArrayCopy :: SpecArr -> SpecArr -> SE ()
phsArrayCopy :: Arr Sig Sig -> Arr Sig Sig -> SE ()
phsArrayCopy = String -> Arr Sig Sig -> Arr Sig Sig -> SE ()
forall a b. String -> Arr a b -> Arr a b -> SE ()
convertCopy String
"phs"
binOpCopy :: String -> Arr a b -> Arr a b -> Arr a b -> SE ()
binOpCopy :: String -> Arr a b -> Arr a b -> Arr a b -> SE ()
binOpCopy String
name (Arr [Var]
xs) (Arr [Var]
ys) (Arr [Var]
outs) = ((Var, Var, Var) -> SE ()) -> [(Var, Var, Var)] -> SE ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (Var, Var, Var) -> SE ()
go ([(Var, Var, Var)] -> SE ()) -> [(Var, Var, Var)] -> SE ()
forall a b. (a -> b) -> a -> b
$ [Var] -> [Var] -> [Var] -> [(Var, Var, Var)]
forall a b c. [a] -> [b] -> [c] -> [(a, b, c)]
zip3 [Var]
xs [Var]
ys [Var]
outs
where
go :: (Var, Var, Var) -> SE ()
go (Var
x, Var
y, Var
outVar) = Dep () -> SE ()
forall a. Dep a -> SE a
SE (Dep () -> SE ()) -> Dep () -> SE ()
forall a b. (a -> b) -> a -> b
$ IsArrInit -> Var -> String -> E -> E -> Dep ()
forall (m :: * -> *).
Monad m =>
IsArrInit -> Var -> String -> E -> E -> DepT m ()
infOprArr IsArrInit
noArrayInit Var
outVar String
name (Var -> E
inlineVar Var
x) (Var -> E
inlineVar Var
y)
convertCopy :: String -> Arr a b -> Arr a b -> SE ()
convertCopy :: String -> Arr a b -> Arr a b -> SE ()
convertCopy String
name (Arr [Var]
vars) (Arr [Var]
outs) = (Var -> Var -> SE ()) -> [Var] -> [Var] -> SE ()
forall (m :: * -> *) a b c.
Applicative m =>
(a -> b -> m c) -> [a] -> [b] -> m ()
zipWithM_ Var -> Var -> SE ()
go [Var]
vars [Var]
outs
where
go :: Var -> Var -> SE ()
go Var
v Var
outVar = Dep () -> SE ()
forall a. Dep a -> SE a
SE (Dep () -> SE ()) -> Dep () -> SE ()
forall a b. (a -> b) -> a -> b
$ IsArrInit -> Var -> String -> Spec1 -> [E] -> Dep ()
forall (m :: * -> *).
Monad m =>
IsArrInit -> Var -> String -> Spec1 -> [E] -> DepT m ()
opcsArr IsArrInit
noArrayInit Var
outVar String
name Spec1
idRate1 [Var -> E
inlineVar Var
v]
idRate1 :: Spec1
idRate1 = (Rate -> (Rate, [Rate])) -> [Rate] -> Spec1
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Rate
r -> (Rate
r, [Rate
r])) [Rate
Kr, Rate
Ar, Rate
Ir, Rate
Sr, Rate
Fr]
convert2Copy :: String -> Arr a b -> Arr a b -> Arr a b -> SE ()
convert2Copy :: String -> Arr a b -> Arr a b -> Arr a b -> SE ()
convert2Copy String
name (Arr [Var]
xs) (Arr [Var]
ys) (Arr [Var]
outs) = ((Var, Var, Var) -> SE ()) -> [(Var, Var, Var)] -> SE ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (Var, Var, Var) -> SE ()
go ([(Var, Var, Var)] -> SE ()) -> [(Var, Var, Var)] -> SE ()
forall a b. (a -> b) -> a -> b
$ [Var] -> [Var] -> [Var] -> [(Var, Var, Var)]
forall a b c. [a] -> [b] -> [c] -> [(a, b, c)]
zip3 [Var]
xs [Var]
ys [Var]
outs
where
go :: (Var, Var, Var) -> SE ()
go (Var
x, Var
y, Var
outVar) = Dep () -> SE ()
forall a. Dep a -> SE a
SE (Dep () -> SE ()) -> Dep () -> SE ()
forall a b. (a -> b) -> a -> b
$ IsArrInit -> Var -> String -> Spec1 -> [E] -> Dep ()
forall (m :: * -> *).
Monad m =>
IsArrInit -> Var -> String -> Spec1 -> [E] -> DepT m ()
opcsArr IsArrInit
noArrayInit Var
outVar String
name Spec1
idRate2 [Var -> E
inlineVar Var
x, Var -> E
inlineVar Var
y]
idRate2 :: Spec1
idRate2 = (Rate -> (Rate, [Rate])) -> [Rate] -> Spec1
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Rate
r -> (Rate
r, [Rate
r, Rate
r])) [Rate
Kr, Rate
Ar, Rate
Ir, Rate
Sr, Rate
Fr]