packages feed

accelerate-fourier 0.0.1 → 1.0

raw patch · 12 files changed

+218/−214 lines, 12 filesdep ~acceleratedep ~accelerate-arithmeticdep ~accelerate-utilityPVP ok

version bump matches the API change (PVP)

Dependency ranges changed: accelerate, accelerate-arithmetic, accelerate-utility, base

API changes (from Hackage documentation)

- Data.Array.Accelerate.Fourier.Planned: instance Elt a => Show (Cache a)
- Data.Array.Accelerate.Fourier.Planned: instance Elt a => Show (CacheSplitRadixChain a)
- Data.Array.Accelerate.Fourier.Planned: instance Elt a => Show (LevelCacheChirp a)
- Data.Array.Accelerate.Fourier.Planned: instance Elt a => Show (LevelCacheComposite a)
- Data.Array.Accelerate.Fourier.Planned: instance Elt a => Show (LevelCachePrime a)
- Data.Array.Accelerate.Fourier.Planned: instance Elt a => Show (LevelCacheRadix2 a)
- Data.Array.Accelerate.Fourier.Planned: instance Elt a => Show (LevelCacheSplitRadix a)
- Data.Array.Accelerate.Fourier.Planned: instance Enum LevelSmall
- Data.Array.Accelerate.Fourier.Planned: instance Eq Direction
- Data.Array.Accelerate.Fourier.Planned: instance Eq LevelSmall
- Data.Array.Accelerate.Fourier.Planned: instance Ord Direction
- Data.Array.Accelerate.Fourier.Planned: instance Ord LevelSmall
- Data.Array.Accelerate.Fourier.Planned: instance Show Direction
- Data.Array.Accelerate.Fourier.Planned: instance Show LevelCacheCoprime
- Data.Array.Accelerate.Fourier.Planned: instance Show LevelSmall
- Data.Array.Accelerate.Fourier.Planned: instance Show Plan
- Data.Array.Accelerate.Fourier.Planned: instance Show PlanStructure
- Data.Array.Accelerate.Fourier.Planned: instance Show a => Show (LevelCacheSmall a)
+ Data.Array.Accelerate.Fourier.Planned: instance Data.Array.Accelerate.Array.Sugar.Elt a => GHC.Show.Show (Data.Array.Accelerate.Fourier.Planned.Cache a)
+ Data.Array.Accelerate.Fourier.Planned: instance Data.Array.Accelerate.Array.Sugar.Elt a => GHC.Show.Show (Data.Array.Accelerate.Fourier.Planned.CacheSplitRadixChain a)
+ Data.Array.Accelerate.Fourier.Planned: instance Data.Array.Accelerate.Array.Sugar.Elt a => GHC.Show.Show (Data.Array.Accelerate.Fourier.Planned.LevelCacheChirp a)
+ Data.Array.Accelerate.Fourier.Planned: instance Data.Array.Accelerate.Array.Sugar.Elt a => GHC.Show.Show (Data.Array.Accelerate.Fourier.Planned.LevelCacheComposite a)
+ Data.Array.Accelerate.Fourier.Planned: instance Data.Array.Accelerate.Array.Sugar.Elt a => GHC.Show.Show (Data.Array.Accelerate.Fourier.Planned.LevelCachePrime a)
+ Data.Array.Accelerate.Fourier.Planned: instance Data.Array.Accelerate.Array.Sugar.Elt a => GHC.Show.Show (Data.Array.Accelerate.Fourier.Planned.LevelCacheRadix2 a)
+ Data.Array.Accelerate.Fourier.Planned: instance Data.Array.Accelerate.Array.Sugar.Elt a => GHC.Show.Show (Data.Array.Accelerate.Fourier.Planned.LevelCacheSplitRadix a)
+ Data.Array.Accelerate.Fourier.Planned: instance GHC.Classes.Eq Data.Array.Accelerate.Fourier.Planned.Direction
+ Data.Array.Accelerate.Fourier.Planned: instance GHC.Classes.Eq Data.Array.Accelerate.Fourier.Planned.LevelSmall
+ Data.Array.Accelerate.Fourier.Planned: instance GHC.Classes.Ord Data.Array.Accelerate.Fourier.Planned.Direction
+ Data.Array.Accelerate.Fourier.Planned: instance GHC.Classes.Ord Data.Array.Accelerate.Fourier.Planned.LevelSmall
+ Data.Array.Accelerate.Fourier.Planned: instance GHC.Enum.Enum Data.Array.Accelerate.Fourier.Planned.LevelSmall
+ Data.Array.Accelerate.Fourier.Planned: instance GHC.Show.Show Data.Array.Accelerate.Fourier.Planned.Direction
+ Data.Array.Accelerate.Fourier.Planned: instance GHC.Show.Show Data.Array.Accelerate.Fourier.Planned.LevelCacheCoprime
+ Data.Array.Accelerate.Fourier.Planned: instance GHC.Show.Show Data.Array.Accelerate.Fourier.Planned.LevelSmall
+ Data.Array.Accelerate.Fourier.Planned: instance GHC.Show.Show Data.Array.Accelerate.Fourier.Planned.Plan
+ Data.Array.Accelerate.Fourier.Planned: instance GHC.Show.Show Data.Array.Accelerate.Fourier.Planned.PlanStructure
+ Data.Array.Accelerate.Fourier.Planned: instance GHC.Show.Show a => GHC.Show.Show (Data.Array.Accelerate.Fourier.Planned.LevelCacheSmall a)
- Data.Array.Accelerate.Convolution.Adhoc: complex :: (Shape sh, Slice sh, Elt a, IsNum a) => Transform2 (sh :. Int) a -> Transform2 (sh :. Int) (Complex a)
+ Data.Array.Accelerate.Convolution.Adhoc: complex :: (Shape sh, Slice sh, Num a) => Transform2 (sh :. Int) a -> Transform2 (sh :. Int) (Complex a)
- Data.Array.Accelerate.Convolution.Adhoc: cyclic :: (Shape sh, Slice sh, Elt a, IsNum a) => Transform2 (sh :. Int) a -> Transform2 (sh :. Int) a
+ Data.Array.Accelerate.Convolution.Adhoc: cyclic :: (Shape sh, Slice sh, Num a) => Transform2 (sh :. Int) a -> Transform2 (sh :. Int) a
- Data.Array.Accelerate.Convolution.Adhoc: karatsuba :: (Shape sh, Slice sh, Elt a, IsNum a) => Transform2 (sh :. Int) a
+ Data.Array.Accelerate.Convolution.Adhoc: karatsuba :: (Shape sh, Slice sh, Num a) => Transform2 (sh :. Int) a
- Data.Array.Accelerate.Convolution.Preprocessed: karatsuba :: (Shape sh, Slice sh, Elt a, IsNum a) => Int -> Transform2 (sh :. Int) a
+ Data.Array.Accelerate.Convolution.Preprocessed: karatsuba :: (Shape sh, Slice sh, Num a) => Int -> Transform2 (sh :. Int) a
- Data.Array.Accelerate.Fourier.Adhoc: dit2 :: (Slice sh, Shape sh, IsFloating a, Elt a) => Exp (Sign a) -> Transform (sh :. Int) (Complex a)
+ Data.Array.Accelerate.Fourier.Adhoc: dit2 :: (Slice sh, Shape sh, RealFloat a, FromIntegral Int a) => Exp (Sign a) -> Transform (sh :. Int) (Complex a)
- Data.Array.Accelerate.Fourier.Adhoc: dit235 :: (Slice sh, Shape sh, IsFloating a, Elt a) => Exp (Sign a) -> Transform (sh :. Int) (Complex a)
+ Data.Array.Accelerate.Fourier.Adhoc: dit235 :: (Slice sh, Shape sh, RealFloat a, FromIntegral Int a) => Exp (Sign a) -> Transform (sh :. Int) (Complex a)
- Data.Array.Accelerate.Fourier.Adhoc: ditSplitRadix :: (Slice sh, Shape sh, IsFloating a, Elt a) => Exp (Sign a) -> Transform (sh :. Int) (Complex a)
+ Data.Array.Accelerate.Fourier.Adhoc: ditSplitRadix :: (Slice sh, Shape sh, RealFloat a, FromIntegral Int a) => Exp (Sign a) -> Transform (sh :. Int) (Complex a)
- Data.Array.Accelerate.Fourier.Adhoc: forward :: (Elt a, IsNum a) => Exp (Sign a)
+ Data.Array.Accelerate.Fourier.Adhoc: forward :: (Num a) => Exp (Sign a)
- Data.Array.Accelerate.Fourier.Adhoc: inverse :: (Elt a, IsNum a) => Exp (Sign a)
+ Data.Array.Accelerate.Fourier.Adhoc: inverse :: (Num a) => Exp (Sign a)
- Data.Array.Accelerate.Fourier.Adhoc: transform :: (Slice sh, Shape sh, IsFloating a, Elt a) => Exp (Sign a) -> Transform (sh :. Int) (Complex a)
+ Data.Array.Accelerate.Fourier.Adhoc: transform :: (Slice sh, Shape sh, RealFloat a, FromIntegral Int a) => Exp (Sign a) -> Transform (sh :. Int) (Complex a)
- Data.Array.Accelerate.Fourier.Adhoc: transform2d :: (Shape sh, Slice sh, IsFloating a, Elt a) => SubTransform (Complex a) -> Transform ((sh :. Int) :. Int) (Complex a)
+ Data.Array.Accelerate.Fourier.Adhoc: transform2d :: (Shape sh, Slice sh, RealFloat a) => SubTransform (Complex a) -> Transform ((sh :. Int) :. Int) (Complex a)
- Data.Array.Accelerate.Fourier.Adhoc: transform3d :: (Shape sh, Slice sh, IsFloating a, Elt a) => SubTransform (Complex a) -> Transform (((sh :. Int) :. Int) :. Int) (Complex a)
+ Data.Array.Accelerate.Fourier.Adhoc: transform3d :: (Shape sh, Slice sh, RealFloat a) => SubTransform (Complex a) -> Transform (((sh :. Int) :. Int) :. Int) (Complex a)
- Data.Array.Accelerate.Fourier.Adhoc: transformChirp2 :: (Shape sh, Slice sh, IsFloating a, Elt a) => Exp (Sign a) -> Transform (sh :. Int) (Complex a)
+ Data.Array.Accelerate.Fourier.Adhoc: transformChirp2 :: (Shape sh, Slice sh, RealFloat a, FromIntegral Int a) => Exp (Sign a) -> Transform (sh :. Int) (Complex a)
- Data.Array.Accelerate.Fourier.Adhoc: transformChirp235 :: (Shape sh, Slice sh, IsFloating a, Elt a) => Exp (Sign a) -> Transform (sh :. Int) (Complex a)
+ Data.Array.Accelerate.Fourier.Adhoc: transformChirp235 :: (Shape sh, Slice sh, RealFloat a, FromIntegral Int a) => Exp (Sign a) -> Transform (sh :. Int) (Complex a)
- Data.Array.Accelerate.Fourier.Planned: cache :: (RealFloat a, Elt a, IsFloating a) => Sign a -> Int -> Cache (Complex a)
+ Data.Array.Accelerate.Fourier.Planned: cache :: (RealFloat a, FromIntegral Int a, Num a, Ord a) => Sign a -> Int -> Cache (Complex a)
- Data.Array.Accelerate.Fourier.Planned: cacheDuplex :: (a ~ Complex b, RealFloat b, Elt b, IsFloating b) => Int -> (Cache a, Cache a)
+ Data.Array.Accelerate.Fourier.Planned: cacheDuplex :: (a ~ Complex b, RealFloat b, FromIntegral Int b, Num b) => Int -> (Cache a, Cache a)
- Data.Array.Accelerate.Fourier.Planned: cacheFromPlanWithMapUpdate :: (a ~ Complex b, RealFloat b, Elt b, IsFloating b) => Plan -> (Direction, Sign b) -> State (CacheMap a) (Cache a)
+ Data.Array.Accelerate.Fourier.Planned: cacheFromPlanWithMapUpdate :: (a ~ Complex b, RealFloat b, FromIntegral Int b, Num b) => Plan -> (Direction, Sign b) -> State (CacheMap a) (Cache a)
- Data.Array.Accelerate.Fourier.Planned: cacheFromPlanWithMapUpdate2 :: (a ~ Complex b, RealFloat b, Elt b, IsFloating b) => (Plan, Plan) -> ((Direction, Sign b), (Direction, Sign b)) -> State (CacheMap a) (Cache a, Cache a)
+ Data.Array.Accelerate.Fourier.Planned: cacheFromPlanWithMapUpdate2 :: (a ~ Complex b, RealFloat b, FromIntegral Int b, Num b) => (Plan, Plan) -> ((Direction, Sign b), (Direction, Sign b)) -> State (CacheMap a) (Cache a, Cache a)
- Data.Array.Accelerate.Fourier.Planned: convolveCyclic :: (Shape sh, Slice sh, a ~ Complex b, Elt b, IsFloating b, RealFloat b) => Int -> Acc (Array (sh :. Int) a) -> Acc (Array (sh :. Int) a) -> Acc (Array (sh :. Int) a)
+ Data.Array.Accelerate.Fourier.Planned: convolveCyclic :: (Shape sh, Slice sh, a ~ Complex b, RealFloat b, FromIntegral Int b, Num b) => Int -> Acc (Array (sh :. Int) a) -> Acc (Array (sh :. Int) a) -> Acc (Array (sh :. Int) a)
- Data.Array.Accelerate.Fourier.Planned: directionModes :: Num a => Int -> ((Direction, Sign a), (Direction, Sign a))
+ Data.Array.Accelerate.Fourier.Planned: directionModes :: (Num a) => Int -> ((Direction, Sign a), (Direction, Sign a))
- Data.Array.Accelerate.Fourier.Planned: transform :: (Slice sh, Shape sh, RealFloat a, Elt a, IsFloating a) => Sign a -> Int -> Transform (sh :. Int) (Complex a)
+ Data.Array.Accelerate.Fourier.Planned: transform :: (Slice sh, Shape sh, RealFloat a, FromIntegral Int a, Num a, Ord a) => Sign a -> Int -> Transform (sh :. Int) (Complex a)
- Data.Array.Accelerate.Fourier.Planned: transformChirp2 :: (Slice sh, Shape sh, Elt a, IsFloating a, RealFloat a) => Sign a -> Int -> Transform (sh :. Int) (Complex a)
+ Data.Array.Accelerate.Fourier.Planned: transformChirp2 :: (Slice sh, Shape sh, RealFloat a, FromIntegral Int a, Num a, Ord a) => Sign a -> Int -> Transform (sh :. Int) (Complex a)
- Data.Array.Accelerate.Fourier.Planned: transformChirp235 :: (Slice sh, Shape sh, Elt a, IsFloating a, RealFloat a) => Sign a -> Int -> Transform (sh :. Int) (Complex a)
+ Data.Array.Accelerate.Fourier.Planned: transformChirp235 :: (Slice sh, Shape sh, RealFloat a, FromIntegral Int a, Num a, Ord a) => Sign a -> Int -> Transform (sh :. Int) (Complex a)
- Data.Array.Accelerate.Fourier.Planned: transformDecompose :: (Slice sh, Shape sh, Elt a, IsFloating a, RealFloat a) => Sign a -> Int -> Transform (sh :. Int) (Complex a)
+ Data.Array.Accelerate.Fourier.Planned: transformDecompose :: (Slice sh, Shape sh, RealFloat a, FromIntegral Int a, Num a, Ord a) => Sign a -> Int -> Transform (sh :. Int) (Complex a)
- Data.Array.Accelerate.Fourier.Planned: transformWithCache :: (Slice sh, Shape sh, Elt a, IsFloating a) => Cache (Complex a) -> Transform (sh :. Int) (Complex a)
+ Data.Array.Accelerate.Fourier.Planned: transformWithCache :: (Slice sh, Shape sh, RealFloat a) => Cache (Complex a) -> Transform (sh :. Int) (Complex a)
- Data.Array.Accelerate.Fourier.Planned: transformWithPlanner :: (Slice sh, Shape sh, Elt a, IsFloating a, RealFloat a) => (Integer -> State PlanMap Plan) -> Sign a -> Int -> Transform (sh :. Int) (Complex a)
+ Data.Array.Accelerate.Fourier.Planned: transformWithPlanner :: (Slice sh, Shape sh, RealFloat a, FromIntegral Int a, Num a, Ord a) => (Integer -> State PlanMap Plan) -> Sign a -> Int -> Transform (sh :. Int) (Complex a)
- Data.Array.Accelerate.Fourier.Preprocessed: dif2 :: (Slice sh, Shape sh, IsFloating a, Elt a) => Sign a -> Int -> Transform (sh :. Int) (Complex a)
+ Data.Array.Accelerate.Fourier.Preprocessed: dif2 :: (Slice sh, Shape sh, RealFloat a, FromIntegral Int a) => Sign a -> Int -> Transform (sh :. Int) (Complex a)
- Data.Array.Accelerate.Fourier.Preprocessed: dit2 :: (Slice sh, Shape sh, IsFloating a, Elt a) => Sign a -> Int -> Transform (sh :. Int) (Complex a)
+ Data.Array.Accelerate.Fourier.Preprocessed: dit2 :: (Slice sh, Shape sh, RealFloat a, FromIntegral Int a) => Sign a -> Int -> Transform (sh :. Int) (Complex a)
- Data.Array.Accelerate.Fourier.Preprocessed: ditSplitRadix :: (Slice sh, Shape sh, IsFloating a, Elt a) => Sign a -> Int -> Transform (sh :. Int) (Complex a)
+ Data.Array.Accelerate.Fourier.Preprocessed: ditSplitRadix :: (Slice sh, Shape sh, RealFloat a, FromIntegral Int a) => Sign a -> Int -> Transform (sh :. Int) (Complex a)
- Data.Array.Accelerate.Fourier.Preprocessed: transform2d :: (Shape sh, Slice sh, IsFloating a, Elt a) => SubTransformPair (Complex a) -> Transform ((sh :. Int) :. Int) (Complex a)
+ Data.Array.Accelerate.Fourier.Preprocessed: transform2d :: (Shape sh, Slice sh, RealFloat a) => SubTransformPair (Complex a) -> Transform ((sh :. Int) :. Int) (Complex a)
- Data.Array.Accelerate.Fourier.Preprocessed: transform3d :: (Shape sh, Slice sh, IsFloating a, Elt a) => SubTransformTriple (Complex a) -> Transform (((sh :. Int) :. Int) :. Int) (Complex a)
+ Data.Array.Accelerate.Fourier.Preprocessed: transform3d :: (Shape sh, Slice sh, RealFloat a) => SubTransformTriple (Complex a) -> Transform (((sh :. Int) :. Int) :. Int) (Complex a)
- Data.Array.Accelerate.Fourier.Real: entangleCoefficient :: (IsFloating a, Elt a) => Exp (Complex a) -> Exp (Complex a) -> Exp (Complex a, Complex a)
+ Data.Array.Accelerate.Fourier.Real: entangleCoefficient :: (RealFloat a) => Exp (Complex a) -> Exp (Complex a) -> Exp (Complex a, Complex a)
- Data.Array.Accelerate.Fourier.Real: entangleSpectra :: (Shape sh, Slice sh, Elt a, IsFloating a) => Acc (Array (sh :. Int) (Complex a, Complex a)) -> Acc (Array (sh :. Int) (Complex a))
+ Data.Array.Accelerate.Fourier.Real: entangleSpectra :: (Shape sh, Slice sh, RealFloat a) => Acc (Array (sh :. Int) (Complex a, Complex a)) -> Acc (Array (sh :. Int) (Complex a))
- Data.Array.Accelerate.Fourier.Real: entangleSpectra2d :: (Shape sh, Slice sh, Elt a, IsFloating a) => Acc (Array ((sh :. Int) :. Int) (Complex a, Complex a)) -> Acc (Array ((sh :. Int) :. Int) (Complex a))
+ Data.Array.Accelerate.Fourier.Real: entangleSpectra2d :: (Shape sh, Slice sh, RealFloat a) => Acc (Array ((sh :. Int) :. Int) (Complex a, Complex a)) -> Acc (Array ((sh :. Int) :. Int) (Complex a))
- Data.Array.Accelerate.Fourier.Real: fromSpectrum :: (Shape sh, Slice sh, Elt a, IsFloating a) => Transform (sh :. Int) (Complex a) -> Acc (Array (sh :. Int) (Complex a)) -> Acc (Array (sh :. Int) a)
+ Data.Array.Accelerate.Fourier.Real: fromSpectrum :: (Shape sh, Slice sh, RealFloat a, FromIntegral Int a) => Transform (sh :. Int) (Complex a) -> Acc (Array (sh :. Int) (Complex a)) -> Acc (Array (sh :. Int) a)
- Data.Array.Accelerate.Fourier.Real: toSpectrum :: (Shape sh, Slice sh, Elt a, IsFloating a) => Transform (sh :. Int) (Complex a) -> Acc (Array (sh :. Int) a) -> Acc (Array (sh :. Int) (Complex a))
+ Data.Array.Accelerate.Fourier.Real: toSpectrum :: (Shape sh, Slice sh, RealFloat a, FromIntegral Int a) => Transform (sh :. Int) (Complex a) -> Acc (Array (sh :. Int) a) -> Acc (Array (sh :. Int) (Complex a))
- Data.Array.Accelerate.Fourier.Real: twoFromSpectrum :: (Shape sh, Slice sh, Elt a, IsFloating a) => Transform (sh :. Int) (Complex a) -> Acc (Array (sh :. Int) (Complex a, Complex a)) -> Acc (Array (sh :. Int) (a, a))
+ Data.Array.Accelerate.Fourier.Real: twoFromSpectrum :: (Shape sh, Slice sh, RealFloat a) => Transform (sh :. Int) (Complex a) -> Acc (Array (sh :. Int) (Complex a, Complex a)) -> Acc (Array (sh :. Int) (a, a))
- Data.Array.Accelerate.Fourier.Real: twoFromSpectrum2d :: (Shape sh, Slice sh, Elt a, IsFloating a) => Transform ((sh :. Int) :. Int) (Complex a) -> Acc (Array ((sh :. Int) :. Int) (Complex a, Complex a)) -> Acc (Array ((sh :. Int) :. Int) (a, a))
+ Data.Array.Accelerate.Fourier.Real: twoFromSpectrum2d :: (Shape sh, Slice sh, RealFloat a) => Transform ((sh :. Int) :. Int) (Complex a) -> Acc (Array ((sh :. Int) :. Int) (Complex a, Complex a)) -> Acc (Array ((sh :. Int) :. Int) (a, a))
- Data.Array.Accelerate.Fourier.Real: twoToSpectrum :: (Shape sh, Slice sh, Elt a, IsFloating a) => Transform (sh :. Int) (Complex a) -> Acc (Array (sh :. Int) (a, a)) -> Acc (Array (sh :. Int) (Complex a, Complex a))
+ Data.Array.Accelerate.Fourier.Real: twoToSpectrum :: (Shape sh, Slice sh, RealFloat a) => Transform (sh :. Int) (Complex a) -> Acc (Array (sh :. Int) (a, a)) -> Acc (Array (sh :. Int) (Complex a, Complex a))
- Data.Array.Accelerate.Fourier.Real: twoToSpectrum2d :: (Shape sh, Slice sh, Elt a, IsFloating a) => Transform ((sh :. Int) :. Int) (Complex a) -> Acc (Array ((sh :. Int) :. Int) (a, a)) -> Acc (Array ((sh :. Int) :. Int) (Complex a, Complex a))
+ Data.Array.Accelerate.Fourier.Real: twoToSpectrum2d :: (Shape sh, Slice sh, RealFloat a) => Transform ((sh :. Int) :. Int) (Complex a) -> Acc (Array ((sh :. Int) :. Int) (a, a)) -> Acc (Array ((sh :. Int) :. Int) (Complex a, Complex a))
- Data.Array.Accelerate.Fourier.Real: untangleCoefficient :: (IsFloating a, Elt a) => Exp (Complex a) -> Exp (Complex a) -> Exp (Complex a, Complex a)
+ Data.Array.Accelerate.Fourier.Real: untangleCoefficient :: (RealFloat a) => Exp (Complex a) -> Exp (Complex a) -> Exp (Complex a, Complex a)
- Data.Array.Accelerate.Fourier.Real: untangleSpectra :: (Shape sh, Slice sh, Elt a, IsFloating a) => Acc (Array (sh :. Int) (Complex a)) -> Acc (Array (sh :. Int) (Complex a, Complex a))
+ Data.Array.Accelerate.Fourier.Real: untangleSpectra :: (Shape sh, Slice sh, RealFloat a) => Acc (Array (sh :. Int) (Complex a)) -> Acc (Array (sh :. Int) (Complex a, Complex a))
- Data.Array.Accelerate.Fourier.Real: untangleSpectra2d :: (Shape sh, Slice sh, Elt a, IsFloating a) => Acc (Array ((sh :. Int) :. Int) (Complex a)) -> Acc (Array ((sh :. Int) :. Int) (Complex a, Complex a))
+ Data.Array.Accelerate.Fourier.Real: untangleSpectra2d :: (Shape sh, Slice sh, RealFloat a) => Acc (Array ((sh :. Int) :. Int) (Complex a)) -> Acc (Array ((sh :. Int) :. Int) (Complex a, Complex a))
- Data.Array.Accelerate.Fourier.Utility: scaleDown :: (Shape sh, Slice sh, Elt a, IsFloating a) => Transform (sh :. Int) (Complex a)
+ Data.Array.Accelerate.Fourier.Utility: scaleDown :: (Shape sh, Slice sh, RealFloat a, FromIntegral Int a) => Transform (sh :. Int) (Complex a)

Files

accelerate-fourier.cabal view
@@ -1,5 +1,5 @@ Name:             accelerate-fourier-Version:          0.0.1+Version:          1.0 License:          BSD3 License-File:     LICENSE Author:           Henning Thielemann <haskell@henning-thielemann.de>@@ -22,7 +22,7 @@ Build-Type:       Simple  Source-Repository this-  Tag:         0.0.1+  Tag:         1.0   Type:        darcs   Location:    http://hub.darcs.net/thielema/accelerate-fourier/ @@ -32,14 +32,14 @@  Library   Build-Depends:-    accelerate-arithmetic >=0.1 && <0.2,-    accelerate-utility >=0.1 && <0.2,-    accelerate >=0.15 && <0.16,+    accelerate-arithmetic >=1.0 && <1.1,+    accelerate-utility >=1.0 && <1.1,+    accelerate >=1.0 && <1.2,     containers >=0.5 && <0.6,     transformers >=0.3 && <0.6,     utility-ht >=0.0.8 && <0.1,     QuickCheck >=2.4 && <3,-    base >=4.5 && <4.9+    base >=4.5 && <4.11    GHC-Options:      -Wall -fwarn-missing-import-lists   Hs-Source-Dirs:   src
src/Data/Array/Accelerate/Convolution/Adhoc.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-} module Data.Array.Accelerate.Convolution.Adhoc (    Transform2,    karatsuba,@@ -22,16 +23,15 @@  import qualified Data.Array.Accelerate as A import Data.Array.Accelerate-          (Exp, Acc, Array, IsNum, Elt,-           Z(Z), (:.)((:.)), Any(Any), All(All), Slice, Shape,-           (!), (>*), )+          (Exp, Acc, Array,+           Z(Z), (:.)((:.)), Any(Any), All(All), Slice, Shape, (!), )   {- | Both arrays must have the same size. -} karatsuba ::-   (Shape sh, Slice sh, Elt a, IsNum a) =>+   (Shape sh, Slice sh, A.Num a) =>    Transform2 (sh :. Int) a karatsuba x y =    flip A.slice (A.lift $ Any :. (0::Int) :. All)@@ -39,7 +39,7 @@    A.afst    .    A.awhile-      (\arrs -> A.unit $ (Sliced.length $ A.asnd arrs) >* 1)+      (\arrs -> A.unit $ (Sliced.length $ A.asnd arrs) A.> 1)       (Acc.modify (acc, acc) $        \(z, lens) ->           (karatsubaGo (lens ! A.index1 0) (2*(lens ! A.index1 1)-1) z,@@ -49,7 +49,7 @@     \((x0,y0), lens) -> (A.zipWith (*) x0 y0, lens))    .    A.awhile-      (\arrs -> A.unit $ (Sliced.length $ A.afst $ A.afst arrs) >* 1)+      (\arrs -> A.unit $ (Sliced.length $ A.afst $ A.afst arrs) A.> 1)       (Acc.modify ((acc, acc), acc) $        \((x0,y0), lens) ->           let (x1,y1) = karatsubaReorder (x0,y0)@@ -61,7 +61,7 @@        A.fill (A.constant $ Z:.1) (Sliced.length x))  karatsubaReorder ::-   (Shape sh, Slice sh, Elt a, IsNum a) =>+   (Shape sh, Slice sh, A.Num a) =>    (Acc (Array (sh :. Int :. Int) a),     Acc (Array (sh :. Int :. Int) a)) ->    (Acc (Array (sh :. Int :. Int) a),@@ -76,7 +76,7 @@         Sliced1.append3 yl (A.zipWith (+) yl yr) yr)  karatsubaGo ::-   (Shape sh, Slice sh, Elt a, IsNum a) =>+   (Shape sh, Slice sh, A.Num a) =>    Exp Int ->    Exp Int ->    Transform (sh :. Int :. Int) a@@ -99,7 +99,7 @@ Turn an ordinary convolution into a cyclic convolution of the same length. -} cyclic ::-   (Shape sh, Slice sh, Elt a, IsNum a) =>+   (Shape sh, Slice sh, A.Num a) =>    Transform2 (sh :. Int) a ->    Transform2 (sh :. Int) a cyclic conv x y =@@ -113,7 +113,7 @@ Can be removed when we get @instance IsNum (Complex a)@. -} complex, _complex ::-   (Shape sh, Slice sh, Elt a, IsNum a) =>+   (Shape sh, Slice sh, A.Num a) =>    Transform2 (sh :. Int) a ->    Transform2 (sh :. Int) (Complex a) complex conv x y =
src/Data/Array/Accelerate/Convolution/Preprocessed.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-} module Data.Array.Accelerate.Convolution.Preprocessed (    Transform2,    karatsuba,@@ -12,9 +13,7 @@ import Data.Array.Accelerate.Utility.Lift.Exp (expr)  import qualified Data.Array.Accelerate as A-import Data.Array.Accelerate-          (IsNum, Elt,-           (:.)((:.)), Any(Any), All(All), Slice, Shape, )+import Data.Array.Accelerate ((:.)((:.)), Any(Any), All(All), Slice, Shape, )   {- |@@ -24,7 +23,7 @@ thus you should prefer 'Data.Array.Accelerate.Convolution.Adhoc.karatsuba'. -} karatsuba ::-   (Shape sh, Slice sh, Elt a, IsNum a) =>+   (Shape sh, Slice sh, A.Num a) =>    Int -> Transform2 (sh :. Int) a karatsuba len x y =    if len <= 1
src/Data/Array/Accelerate/Convolution/Private.hs view
@@ -1,14 +1,13 @@ {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-} module Data.Array.Accelerate.Convolution.Private where  import qualified Data.Array.Accelerate.Utility.Sliced as Sliced  import qualified Data.Array.Accelerate as A import Data.Array.Accelerate-          (Exp, Acc, Array, IsNum, Elt,-           (:.)((:.)), Slice, Shape,-           (!), (?), (&&*), (<*), (<=*), )+          (Exp, Acc, Array, (:.)((:.)), Slice, Shape, (!), (?), )  import Prelude (Int, ) @@ -20,8 +19,8 @@   indexPad ::-   (Shape sh, Slice sh, Elt a, IsNum a) =>+   (Shape sh, Slice sh, A.Num a) =>    Exp sh :. Exp Int ->    Acc (Array (sh:.Int) a) -> Exp a indexPad (ix:.k) xs =-   0 <=* k &&* k <* Sliced.length xs ? (xs ! A.lift (ix:.k), 0)+   0 A.<= k A.&& k A.< Sliced.length xs ? (xs ! A.lift (ix:.k), 0)
src/Data/Array/Accelerate/Fourier/Adhoc.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-} {- | The implementations in this module work entirely in the 'A.Acc' domain. This means that they can be applied to any array@@ -53,14 +54,12 @@ import Data.Array.Accelerate.Data.Complex (Complex, )  import qualified Data.Array.Accelerate as A-import Data.Array.Accelerate-          (Slice, Shape, DIM1, Z(Z), (:.)((:.)),-           Exp, Elt, IsFloating, (<=*), (>*), (==*), )+import Data.Array.Accelerate.Data.Bits ((.&.))+import Data.Array.Accelerate (Slice, Shape, DIM1, Z(Z), (:.)((:.)), Exp, ) -import Data.Bits ((.&.))  -forward, inverse :: (Elt a, A.IsNum a) => Exp (Sign a)+forward, inverse :: (A.Num a) => Exp (Sign a) forward = Sign.forwardExp inverse = Sign.inverseExp @@ -72,12 +71,12 @@ "Data.Array.Accelerate.Fourier.Planned". -} transform ::-   (Slice sh, Shape sh, IsFloating a, Elt a) =>+   (Slice sh, Shape sh, A.RealFloat a, A.FromIntegral Int a) =>    Exp (Sign a) ->    Transform (sh:.Int) (Complex a) transform sign arr =    let len = Sliced.length arr-   in  A.acond (len <=* 1) arr $+   in  A.acond (len A.<= 1) arr $           let (pow2, smooth5) = is2or5smooth len           in  A.acond pow2 (ditSplitRadixLoop sign arr) $               A.acond smooth5 (dit235 sign arr) $@@ -87,35 +86,35 @@ is2or5smooth len =    let maxPowerOfTwo = len .&. negate len        lenOdd = div len maxPowerOfTwo-   in  (lenOdd ==* 1,-        (divideMaxPower 5 $ divideMaxPower 3 lenOdd) ==* 1)+   in  (lenOdd A.== 1,+        (divideMaxPower 5 $ divideMaxPower 3 lenOdd) A.== 1)  divideMaxPower :: Exp Int -> Exp Int -> Exp Int divideMaxPower fac =-   A.while (\n -> mod n fac ==* 0) (flip div fac)+   A.while (\n -> mod n fac A.== 0) (flip div fac)   {- | Split-Radix for power-of-two sizes. -} ditSplitRadix ::-   (Slice sh, Shape sh, IsFloating a, Elt a) =>+   (Slice sh, Shape sh, A.RealFloat a, A.FromIntegral Int a) =>    Exp (Sign a) ->    Transform (sh:.Int) (Complex a) ditSplitRadix sign arr =    A.acond-      (Sliced.length arr <=* 1)+      (Sliced.length arr A.<= 1)       arr (ditSplitRadixLoop sign arr)  ditSplitRadixLoop ::-   (Slice sh, Shape sh, IsFloating a, Elt a) =>+   (Slice sh, Shape sh, A.RealFloat a, A.FromIntegral Int a) =>    Exp (Sign a) ->    Transform (sh:.Int) (Complex a) ditSplitRadixLoop sign =    Fourier.finishSplitRadix . A.afst    .    A.awhile-      (\x -> A.unit $ (Sliced1.length $ A.asnd x) >* 0)+      (\x -> A.unit $ (Sliced1.length $ A.asnd x) A.> 0)       (Acc.modify (acc, acc) $        \(arr2, arr1) ->          Fourier.ditSplitRadixStep@@ -126,7 +125,7 @@    Acc.modify (acc, acc) Fourier.ditSplitRadixBase    .    A.awhile-      (\x -> A.unit $ (Sliced.length $ A.asnd x) >* 1)+      (\x -> A.unit $ (Sliced.length $ A.asnd x) A.> 1)       (Acc.modify (acc, acc) Fourier.ditSplitRadixReorder)    .    A.lift . Fourier.initSplitRadix@@ -136,24 +135,24 @@ Decimation in time for power-of-two sizes. -} dit2 ::-   (Slice sh, Shape sh, IsFloating a, Elt a) =>+   (Slice sh, Shape sh, A.RealFloat a, A.FromIntegral Int a) =>    Exp (Sign a) ->    Transform (sh:.Int) (Complex a) dit2 sign =    flip A.slice (A.lift $ A.Any :. (0::Int) :. A.All)    .    A.awhile-      (\x -> A.unit $ Sliced1.length x >* 1)+      (\x -> A.unit $ Sliced1.length x A.> 1)       (ditStep sign)    .    A.awhile-      (\x -> A.unit $ Sliced.length x >* 1)+      (\x -> A.unit $ Sliced.length x A.> 1)       (twist 2)    .    A.replicate (A.lift $ A.Any :. (1::Int) :. A.All)  ditStep ::-   (Slice sh, Shape sh, IsFloating a, Elt a) =>+   (Slice sh, Shape sh, A.RealFloat a, A.FromIntegral Int a) =>    Exp (Sign a) ->    Transform (sh:.Int:.Int) (Complex a) ditStep sign x =@@ -169,7 +168,7 @@ <http://oeis.org/A051037>. -} dit235 ::-   (Slice sh, Shape sh, IsFloating a, Elt a) =>+   (Slice sh, Shape sh, A.RealFloat a, A.FromIntegral Int a) =>    Exp (Sign a) ->    Transform (sh:.Int) (Complex a) dit235 sign =@@ -178,17 +177,17 @@    A.afst    .    A.awhile-      (\x -> A.unit $ (A.length $ A.asnd x) >* 0)+      (\x -> A.unit $ (A.length $ A.asnd x) A.> 0)       (Acc.modify (acc,acc) $        \(arr,factors) ->          let fac = factors A.! A.index1 0          in  (dit235Step sign fac arr, Sliced.tail factors))    .    A.awhile-      (\x -> A.unit $ (Sliced.length $ A.afst x) >* 1)+      (\x -> A.unit $ (Sliced.length $ A.afst x) A.> 1)       (Acc.modify (acc,acc) $        \(arr,factors) ->-         let divides k n = mod n k ==* 0+         let divides k n = mod n k A.== 0              caseFactor k = (divides k, k)              len = Sliced.length arr              factor =@@ -204,7 +203,7 @@    A.replicate (A.lift $ A.Any :. (1::Int) :. A.All)  dit235Step ::-   (Slice sh, Shape sh, IsFloating a, Elt a) =>+   (Slice sh, Shape sh, A.RealFloat a, A.FromIntegral Int a) =>    Exp (Sign a) ->    Exp Int ->    Transform (sh:.Int:.Int) (Complex a)@@ -217,9 +216,9 @@           $           x    in  Fourier.merge $-       A.acond (fac ==* 5) (Fourier.transform5 (Fourier.cache5 sign) twiddled) $-       A.acond (fac ==* 4) (Fourier.transform4 (Fourier.cache4 sign) twiddled) $-       A.acond (fac ==* 3) (Fourier.transform3 (Fourier.cache3 sign) twiddled) $+       A.acond (fac A.== 5) (Fourier.transform5 (Fourier.cache5 sign) twiddled) $+       A.acond (fac A.== 4) (Fourier.transform4 (Fourier.cache4 sign) twiddled) $+       A.acond (fac A.== 3) (Fourier.transform3 (Fourier.cache3 sign) twiddled) $        Fourier.transform2 (Fourier.cache2 sign) twiddled  @@ -234,7 +233,7 @@    (A.fromIntegral n :: Exp Double)  ceiling5SmoothFloat ::-   (Elt a, IsFloating a) =>+   (A.RealFloat a, A.FromIntegral Int a) =>    Exp a -> Exp (a, (Int, Int, Int)) ceiling5SmoothFloat n =    let d3 = ceilingLogBase 3 n@@ -252,7 +251,7 @@ but sometimes misses optimal results due to rounding errors. -} _ceiling5SmoothLog ::-   (Elt a, IsFloating a) =>+   (A.RealFloat a, A.FromIntegral Int a) =>    Exp a -> Exp (a, (Int, Int, Int)) _ceiling5SmoothLog n =    let log3 = logBase 2 3@@ -269,7 +268,7 @@           in  (logP53 + A.fromIntegral e2, (e2, e3, e5))  _ceiling5SmoothFloat ::-   (Elt a, IsFloating a) =>+   (A.RealFloat a, A.FromIntegral Int a) =>    Exp a -> Exp (a, (Int, Int, Int)) _ceiling5SmoothFloat n =    let powers base =@@ -285,7 +284,7 @@        LinAlg.outer (powers 5) (powers 3)  ceilingLogBase ::-   (Elt a, IsFloating a) =>+   (A.RealFloat a, A.FromIntegral Int a) =>    Exp Int -> Exp a -> Exp Int ceilingLogBase base x =    A.ceiling $ logBase (A.fromIntegral base) x@@ -295,7 +294,7 @@   _transformChirp ::-   (Shape sh, Slice sh, IsFloating a, Elt a) =>+   (Shape sh, Slice sh, A.RealFloat a, A.FromIntegral Int a) =>    Exp (Sign a) ->    Exp Int ->    (Transform DIM1 (Complex a),@@ -305,7 +304,7 @@ _transformChirp sign padLen (analysis1,analysis,synthesis) arr =    let len = Sliced.length arr        chirp = Fourier.chirp sign padLen $ A.fromIntegral len-   in  A.acond (len<=*1) arr $+   in  A.acond (len A.<= 1) arr $        Sliced.take len $ scaleDown $        LinAlg.zipExtrudedVectorWith (*) chirp $ synthesis $        LinAlg.zipExtrudedVectorWith (*)@@ -314,7 +313,7 @@            LinAlg.zipExtrudedVectorWith (*) chirp arr)  transformChirp ::-   (Shape sh, Slice sh, IsFloating a, Elt a) =>+   (Shape sh, Slice sh, A.RealFloat a, A.FromIntegral Int a) =>    Exp (Sign a) ->    Exp Int ->    SubTransformPair (Complex a) ->@@ -329,7 +328,7 @@              (A.reshape (A.lift $ A.index1 (A.shapeSize sh) :. padLen) $               Sliced.pad 0 padLen $               LinAlg.zipExtrudedVectorWith (*) chirp arr)-   in  A.acond (len<=*1) arr $+   in  A.acond (len A.<= 1) arr $        Sliced.take len $ scaleDown $        LinAlg.zipExtrudedVectorWith (*) chirp $ synthesis $        LinAlg.zipExtrudedVectorWith (*)@@ -340,7 +339,7 @@ Transformation of arbitrary length based on Bluestein on a power-of-two size. -} transformChirp2 ::-   (Shape sh, Slice sh, IsFloating a, Elt a) =>+   (Shape sh, Slice sh, A.RealFloat a, A.FromIntegral Int a) =>    Exp (Sign a) -> Transform (sh:.Int) (Complex a) transformChirp2 sign arr =    transformChirp sign@@ -353,7 +352,7 @@ Transformation of arbitrary length based on Bluestein on a 5-smooth size. -} transformChirp235 ::-   (Shape sh, Slice sh, IsFloating a, Elt a) =>+   (Shape sh, Slice sh, A.RealFloat a, A.FromIntegral Int a) =>    Exp (Sign a) -> Transform (sh:.Int) (Complex a) transformChirp235 sign arr =    transformChirp sign@@ -363,7 +362,7 @@   transform2d ::-   (Shape sh, Slice sh, IsFloating a, Elt a) =>+   (Shape sh, Slice sh, A.RealFloat a) =>    SubTransform (Complex a) ->    Transform (sh:.Int:.Int) (Complex a) transform2d (SubTransform trans) =@@ -371,7 +370,7 @@    LinAlg.transpose . trans  transform3d ::-   (Shape sh, Slice sh, IsFloating a, Elt a) =>+   (Shape sh, Slice sh, A.RealFloat a) =>    SubTransform (Complex a) ->    Transform (sh:.Int:.Int:.Int) (Complex a) transform3d (SubTransform trans) =
src/Data/Array/Accelerate/Fourier/Planned.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-} {- | Like "Data.Array.Accelerate.Fourier.Preprocessed" this module allows to factor out some preprocessing.@@ -73,8 +74,7 @@ import qualified Data.Array.Accelerate as A import Data.Array.Accelerate.Data.Complex (Complex, conjugate, ) import Data.Array.Accelerate-          (Exp, Acc, Array, DIM1, DIM2, IsFloating, Elt,-           (:.)((:.)), Slice, Shape, )+          (Exp, Acc, Array, DIM1, DIM2, (:.)((:.)), Elt, Slice, Shape, )  import qualified Control.Monad.Trans.State as State import Control.Monad (liftM2, )@@ -99,7 +99,7 @@ is equal to the extent of the inner dimension of every transformed array. -} transform ::-   (Slice sh, Shape sh, RealFloat a, Elt a, IsFloating a) =>+   (Slice sh, Shape sh, A.RealFloat a, A.FromIntegral Int a, Num a, Ord a) =>    Sign a -> Int -> Transform (sh:.Int) (Complex a) transform sign len = transformWithCache $ cache sign len @@ -110,14 +110,14 @@ This is more for testing and benchmarking than for real use. -} transformDecompose ::-   (Slice sh, Shape sh, Elt a, IsFloating a, RealFloat a) =>+   (Slice sh, Shape sh, A.RealFloat a, A.FromIntegral Int a, Num a, Ord a) =>    Sign a -> Int ->    Transform (sh :. Int) (Complex a) transformDecompose =    transformWithPlanner planDecomposeWithMapUpdate  transformWithPlanner ::-   (Slice sh, Shape sh, Elt a, IsFloating a, RealFloat a) =>+   (Slice sh, Shape sh, A.RealFloat a, A.FromIntegral Int a, Num a, Ord a) =>    (Integer -> State.State PlanMap Plan) ->    Sign a -> Int ->    Transform (sh :. Int) (Complex a)@@ -133,7 +133,7 @@ that the cache was generated for. -} transformWithCache ::-   (Slice sh, Shape sh, Elt a, IsFloating a) =>+   (Slice sh, Shape sh, A.RealFloat a) =>    Cache (Complex a) -> Transform (sh:.Int) (Complex a) transformWithCache ch =    case ch of@@ -165,12 +165,11 @@          subTransformPairWithCache subCaches  subTransformWithCache ::-   (Elt a, IsFloating a) =>-   Cache (Complex a) -> SubTransform (Complex a)+   (A.RealFloat a) => Cache (Complex a) -> SubTransform (Complex a) subTransformWithCache ch = SubTransform (transformWithCache ch)  subTransformPairWithCache ::-   (Elt a, IsFloating a) =>+   (A.RealFloat a) =>    (Cache (Complex a), Cache (Complex a)) -> SubTransformPair (Complex a) subTransformPairWithCache (ch0,ch1) =    SubTransformPair (transformWithCache ch0) (transformWithCache ch1)@@ -319,7 +318,7 @@ You can use this cache in 'transformWithCache'. -} cache ::-   (RealFloat a, Elt a, IsFloating a) =>+   (A.RealFloat a, A.FromIntegral Int a, Num a, Ord a) =>    Sign a -> Int -> Cache (Complex a) cache sign len =    cacheFromPlan@@ -332,7 +331,7 @@ but 'cacheDuplex' shares common data of both caches. -} cacheDuplex ::-   (a ~ Complex b, RealFloat b, Elt b, IsFloating b) =>+   (a ~ Complex b, A.RealFloat b, A.FromIntegral Int b, Num b) =>    Int -> (Cache a, Cache a) cacheDuplex len =    let p = plan $ fromIntegral len@@ -347,7 +346,7 @@ type CacheMap a = Map.Map (Integer,Direction) (Cache a)  cacheFromPlan ::-   (a ~ Complex b, RealFloat b, Elt b, IsFloating b) =>+   (a ~ Complex b, A.RealFloat b, A.FromIntegral Int b, Num b) =>    Plan -> (Direction, Sign b) -> Cache a cacheFromPlan p z =    State.evalState (cacheFromPlanWithMapUpdate p z) Map.empty@@ -357,7 +356,7 @@ Detect and re-use common sub-caches. -} cacheFromPlanWithMap ::-   (a ~ Complex b, RealFloat b, Elt b, IsFloating b) =>+   (a ~ Complex b, A.RealFloat b, Num b, A.FromIntegral Int b) =>    Plan -> (Direction, Sign b) ->    State.State (CacheMap a) (Cache a) cacheFromPlanWithMap (Plan len struct) dsign@(_d,sign) =@@ -417,7 +416,7 @@             (directionModes $ fromInteger padlen)  cacheFromPlanWithMapUpdate ::-   (a ~ Complex b, RealFloat b, Elt b, IsFloating b) =>+   (a ~ Complex b, A.RealFloat b, A.FromIntegral Int b, Num b) =>    Plan -> (Direction, Sign b) ->    State.State (CacheMap a) (Cache a) cacheFromPlanWithMapUpdate p@(Plan len _) z = do@@ -431,7 +430,7 @@          return m  cacheFromPlanWithMapUpdate2 ::-   (a ~ Complex b, RealFloat b, Elt b, IsFloating b) =>+   (a ~ Complex b, A.RealFloat b, A.FromIntegral Int b, Num b) =>    (Plan, Plan) -> ((Direction, Sign b), (Direction, Sign b)) ->    State.State (CacheMap a) (Cache a, Cache a) cacheFromPlanWithMapUpdate2 (p0,p1) (dm0,dm1) =@@ -470,14 +469,14 @@    deriving (Show)  levelCacheRadix2 ::-   (Elt a, IsFloating a) =>+   (A.RealFloat a, A.FromIntegral Int a) =>    Integer -> Sign a -> LevelCacheRadix2 (Complex a) levelCacheRadix2 n2 sign =    LevelCacheRadix2 $    Fourier.twiddleFactors2 (A.constant sign) (expInteger n2)  transformRadix2InterleavedTime ::-   (Shape sh, Slice sh, a ~ Complex b, IsFloating b, Elt b) =>+   (Shape sh, Slice sh, a ~ Complex b, A.RealFloat b) =>    LevelCacheRadix2 a ->    SubTransform a ->    Transform (sh:.Int) a@@ -491,14 +490,14 @@    deriving (Show)  levelCacheSplitRadix ::-   (Elt a, IsFloating a) =>+   (A.RealFloat a, Num a, A.FromIntegral Int a) =>    Integer -> Sign a -> LevelCacheSplitRadix (Complex a) levelCacheSplitRadix n2 sign =    LevelCacheSplitRadix (Fourier.imagSplitRadixPlain sign) $    Fourier.twiddleFactorsSRPair (A.constant sign) (expInteger (div n2 2))  transformSplitRadixInterleavedTime ::-   (Shape sh, Slice sh, a ~ Complex b, IsFloating b, Elt b) =>+   (Shape sh, Slice sh, a ~ Complex b, A.RealFloat b) =>    LevelCacheSplitRadix a ->    SubPairTransform a ->    PairTransform (sh:.Int:.Int) a@@ -509,7 +508,7 @@    Fourier.ditSplitRadixReorder  transformSplitRadixInterleavedTimeChain ::-   (Shape sh, Slice sh, a ~ Complex b, IsFloating b, Elt b) =>+   (Shape sh, Slice sh, a ~ Complex b, A.RealFloat b) =>    CacheSplitRadixChain a ->    PairTransform (sh:.Int:.Int) a transformSplitRadixInterleavedTimeChain chain =@@ -526,7 +525,7 @@    deriving (Show)  levelCacheComposite ::-   (Elt a, IsFloating a) =>+   (A.RealFloat a, A.FromIntegral Int a) =>    (Integer, Integer) -> Sign a -> LevelCacheComposite (Complex a) levelCacheComposite (n,m) sign =    LevelCacheComposite $@@ -540,7 +539,7 @@ Cooley-Tukey-algorithm -} transformComposite ::-   (Shape sh, Slice sh, a ~ Complex b, IsFloating b, Elt b) =>+   (Shape sh, Slice sh, a ~ Complex b, A.RealFloat b) =>    LevelCacheComposite a ->    SubTransformPair a ->    Transform (sh:.Int) a@@ -581,7 +580,7 @@ Good-Thomas algorithm -} transformCoprime ::-   (Shape sh, Slice sh, a ~ Complex b, IsFloating b, Elt b) =>+   (Shape sh, Slice sh, a ~ Complex b, A.RealFloat b) =>    LevelCacheCoprime ->    SubTransformPair a ->    Transform (sh:.Int) a@@ -647,7 +646,7 @@       deriving (Show)  levelCachePrime ::-   (RealFloat a, IsFloating a, Elt a) =>+   (A.RealFloat a, A.FromIntegral Int a) =>    Integer ->    Maybe (SubTransform (Complex a)) ->    Sign a -> LevelCachePrime (Complex a)@@ -666,7 +665,7 @@ Rader's algorithm for prime length signals. -} transformPrime ::-   (Shape sh, Slice sh, a ~ Complex b, IsFloating b, Elt b) =>+   (Shape sh, Slice sh, a ~ Complex b, A.RealFloat b) =>    LevelCachePrime a ->    Maybe (SubTransformPair a) ->    Transform (sh:.Int) a@@ -701,7 +700,7 @@ and nicer factors in <http://oeis.org/A061303>. -} transformChirp2 ::-   (Slice sh, Shape sh, Elt a, IsFloating a, RealFloat a) =>+   (Slice sh, Shape sh, A.RealFloat a, A.FromIntegral Int a, Num a, Ord a) =>    Sign a -> Int ->    Transform (sh :. Int) (Complex a) transformChirp2 = transformChirpComplete NumberTheory.ceilingPowerOfTwo@@ -713,14 +712,14 @@ (5-smooth = all prime factors are at most 5) -} transformChirp235 ::-   (Slice sh, Shape sh, Elt a, IsFloating a, RealFloat a) =>+   (Slice sh, Shape sh, A.RealFloat a, A.FromIntegral Int a, Num a, Ord a) =>    Sign a -> Int ->    Transform (sh :. Int) (Complex a) transformChirp235 = transformChirpComplete NumberTheory.ceiling5Smooth   transformChirpComplete ::-   (Slice sh, Shape sh, Elt a, IsFloating a, RealFloat a) =>+   (Slice sh, Shape sh, A.RealFloat a, A.FromIntegral Int a, Num a, Ord a) =>    (Integer -> Integer) ->    Sign a -> Int ->    Transform (sh :. Int) (Complex a)@@ -741,7 +740,7 @@       deriving (Show)  levelCacheChirp ::-   (RealFloat a, IsFloating a, Elt a) =>+   (A.RealFloat a, A.FromIntegral Int a) =>    Integer -> Integer ->    SubTransform (Complex a) ->    Sign a -> LevelCacheChirp (Complex a)@@ -757,7 +756,7 @@ and possibly slightly generalised basis vectors. -} transformChirp ::-   (Shape sh, Slice sh, a ~ Complex b, IsFloating b, Elt b) =>+   (Shape sh, Slice sh, a ~ Complex b, A.RealFloat b) =>    LevelCacheChirp a ->    SubTransformPair a ->    Transform (sh:.Int) a@@ -776,7 +775,8 @@ Signals must have equal size and must not be empty. -} convolveCyclic ::-   (Shape sh, Slice sh, a ~ Complex b, Elt b, IsFloating b, RealFloat b) =>+   (Shape sh, Slice sh, a ~ Complex b,+    A.RealFloat b, A.FromIntegral Int b, Num b) =>    Int ->    Acc (Array (sh:.Int) a) ->    Acc (Array (sh:.Int) a) ->@@ -790,7 +790,7 @@            cacheFromPlan (plan len) zInv)  convolveCyclicCache ::-   (Shape sh, Slice sh, a ~ Complex b, IsFloating b, Elt b) =>+   (Shape sh, Slice sh, a ~ Complex b, A.RealFloat b, A.FromIntegral Int b) =>    SubTransformPair a ->    Acc (Array (sh:.Int) a) ->    Acc (Array (sh:.Int) a) ->@@ -799,7 +799,7 @@    convolveSpectrumCyclicCache transs $ scaleDown $ trans x  convolveSingleSpectrumCyclicCache ::-   (Shape sh, Slice sh, a ~ Complex b, IsFloating b, Elt b) =>+   (Shape sh, Slice sh, a ~ Complex b, A.RealFloat b) =>    SubTransformPair a ->    Acc (Array DIM1 a) -> Transform (sh:.Int) a convolveSingleSpectrumCyclicCache caches x y =@@ -812,12 +812,12 @@ if you want a plain convolution. -} convolveSpectrumCyclicCache ::-   (Shape sh, Slice sh, a ~ Complex b, IsFloating b, Elt b) =>+   (Shape sh, Slice sh, a ~ Complex b, A.RealFloat b) =>    SubTransformPair a ->    Acc (Array (sh:.Int) a) -> Transform (sh:.Int) a convolveSpectrumCyclicCache (SubTransformPair trans transInv) x y =    transInv $ A.zipWith (*) x (trans y)  -expInteger :: (Elt a, Num a) => Integer -> Exp a-expInteger = A.constant . fromInteger+expInteger :: (A.Num a) => Integer -> Exp a+expInteger = A.fromInteger
src/Data/Array/Accelerate/Fourier/Preprocessed.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-} {- | The implementations in this module require that you know the transformation data set size on the Haskell side.@@ -43,8 +44,7 @@ import qualified Data.Array.Accelerate.Utility.Sliced as Sliced  import qualified Data.Array.Accelerate as A-import Data.Array.Accelerate-          (Slice, Shape, (:.), Exp, Elt, IsFloating, )+import Data.Array.Accelerate (Slice, Shape, (:.), Exp, )   {- |@@ -52,7 +52,7 @@ Should be faster than 'dit2'. -} ditSplitRadix ::-   (Slice sh, Shape sh, IsFloating a, Elt a) =>+   (Slice sh, Shape sh, A.RealFloat a, A.FromIntegral Int a) =>    Sign a ->    Int ->    Transform (sh:.Int) (Complex a)@@ -78,7 +78,7 @@ and then work with @sh = Z@. -} ditSplitRadixGo ::-   (Slice sh, Shape sh, IsFloating a, Elt a) =>+   (Slice sh, Shape sh, A.RealFloat a, A.FromIntegral Int a) =>    Exp (Sign a) ->    Int ->    PairTransform (sh:.Int:.Int) (Complex a)@@ -98,7 +98,7 @@ Decimation in time for power-of-two sizes. -} dit2 ::-   (Slice sh, Shape sh, IsFloating a, Elt a) =>+   (Slice sh, Shape sh, A.RealFloat a, A.FromIntegral Int a) =>    Sign a ->    Int ->    Transform (sh:.Int) (Complex a)@@ -116,7 +116,7 @@ Decimation in frequency for power-of-two sizes. -} dif2 ::-   (Slice sh, Shape sh, IsFloating a, Elt a) =>+   (Slice sh, Shape sh, A.RealFloat a, A.FromIntegral Int a) =>    Sign a ->    Int ->    Transform (sh:.Int) (Complex a)@@ -141,7 +141,7 @@ are ordered from least-significant to most-significant dimension. -} transform2d ::-   (Shape sh, Slice sh, IsFloating a, Elt a) =>+   (Shape sh, Slice sh, A.RealFloat a) =>    SubTransformPair (Complex a) ->    Transform (sh:.Int:.Int) (Complex a) transform2d (SubTransformPair transform0 transform1) =@@ -153,7 +153,7 @@ are ordered from least-significant to most-significant dimension. -} transform3d ::-   (Shape sh, Slice sh, IsFloating a, Elt a) =>+   (Shape sh, Slice sh, A.RealFloat a) =>    SubTransformTriple (Complex a) ->    Transform (sh:.Int:.Int:.Int) (Complex a) transform3d (SubTransformTriple transform0 transform1 transform2) =
src/Data/Array/Accelerate/Fourier/Private.hs view
@@ -1,11 +1,12 @@ {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-} {-# LANGUAGE Rank2Types #-}+{-# LANGUAGE FlexibleContexts #-} module Data.Array.Accelerate.Fourier.Private where  import qualified Data.Array.Accelerate.Fourier.Sign as Sign import qualified Data.Array.Accelerate.Convolution.Small as Cyclic-import Data.Array.Accelerate.Fourier.Sign (Sign, )+import Data.Array.Accelerate.Fourier.Sign (Sign(Sign), )  import qualified Data.Array.Accelerate.Utility.Sliced as Sliced import qualified Data.Array.Accelerate.Utility.Sliced1 as Sliced1@@ -17,10 +18,10 @@ import Data.Array.Accelerate.Utility.Lift.Exp (expr)  import qualified Data.Array.Accelerate as A-import Data.Array.Accelerate.Data.Complex (Complex((:+)), ) import Data.Array.Accelerate-          (Exp, Acc, Array, DIM1, DIM2, IsNum, IsFloating, Elt,-           Z(Z), (:.)((:.)), Slice, Shape, (!), (?), (==*), (>*), )+          (Exp, Acc, Array, DIM1, DIM2, Elt,+           Z(Z), (:.)((:.)), Slice, Shape, (!), (?), )+import Data.Complex (Complex((:+)), )   type Transform sh a = Acc (Array sh a) -> Acc (Array sh a)@@ -50,13 +51,15 @@            (forall sh. (Shape sh, Slice sh) => PairTransform (sh:.Int:.Int) a)  -cache2 :: (sign ~ Exp (Sign b), a ~ Exp (Complex b), Elt b, IsFloating b) =>+cache2 :: (sign ~ Exp (Sign b), a ~ Exp (Complex b), A.RealFloat b) =>    sign -> a-cache3 :: (sign ~ Exp (Sign b), a ~ Exp (Complex b), Elt b, IsFloating b) =>+cache3 :: (sign ~ Exp (Sign b), a ~ Exp (Complex b), A.RealFloat b) =>    sign -> (a,a)-cache4 :: (sign ~ Exp (Sign b), a ~ Exp (Complex b), Elt b, IsFloating b) =>+cache4 :: (sign ~ Exp (Sign b), a ~ Exp (Complex b), A.RealFloat b) =>    sign -> (a,a,a)-cache5 :: (sign ~ Exp (Sign b), a ~ Exp (Complex b), Elt b, IsFloating b) =>+cache5 ::+   (sign ~ Exp (Sign b), a ~ Exp (Complex b),+    A.RealFloat b, A.FromIntegral Int b) =>    sign -> (a,a,a,a)  cache2 _sign = -1@@ -85,10 +88,10 @@    A.generate       (Exp.indexCons (A.shape x) (A.constant 2))       (Exp.modify (expr :. expr) $-       \(ix :. k)  ->  let xi = x ! ix in k ==* 0 ? (A.fst xi, A.snd xi))+       \(ix :. k)  ->  let xi = x ! ix in k A.== 0 ? (A.fst xi, A.snd xi))  transform2 ::-   (Shape sh, Slice sh, a ~ Complex b, IsFloating b, Elt b) =>+   (Shape sh, Slice sh, a ~ Complex b, A.RealFloat b) =>    Exp a -> Transform (sh:.Int) a transform2 z arr =    flatten2 $@@ -108,12 +111,12 @@        \(ix :. k)  ->           let (x0,x1,x2) = A.unlift $ x ! ix           in  flip (A.caseof k) x0 $-                 ((==*1), x1) :-                 ((==*2), x2) :+                 ((A.==1), x1) :+                 ((A.==2), x2) :                  [])  transform3 ::-   (Shape sh, Slice sh, a ~ Complex b, IsFloating b, Elt b) =>+   (Shape sh, Slice sh, a ~ Complex b, A.RealFloat b) =>    (Exp a, Exp a) -> Transform (sh:.Int) a transform3 (z,z2) arr =    flatten3 $@@ -137,13 +140,13 @@        \(ix :. k)  ->           let (x0,x1,x2,x3) = A.unlift $ x ! ix           in  flip (A.caseof k) x0 $-                 ((==*1), x1) :-                 ((==*2), x2) :-                 ((==*3), x3) :+                 ((A.==1), x1) :+                 ((A.==2), x2) :+                 ((A.==3), x3) :                  [])  transform4 ::-   (Shape sh, Slice sh, a ~ Complex b, IsFloating b, Elt b) =>+   (Shape sh, Slice sh, a ~ Complex b, A.RealFloat b) =>    (Exp a, Exp a, Exp a) -> Transform (sh:.Int) a transform4 (z,z2,z3) arr =    flatten4 $@@ -170,10 +173,10 @@        \(ix :. k)  ->           let (x0,x1,x2,x3,x4) = A.unlift $ x ! ix           in  flip (A.caseof k) x0 $-                 ((==*1), x1) :-                 ((==*2), x2) :-                 ((==*3), x3) :-                 ((==*4), x4) :+                 ((A.==1), x1) :+                 ((A.==2), x2) :+                 ((A.==3), x3) :+                 ((A.==4), x4) :                  [])  @@ -197,7 +200,7 @@ 0 3 1 2 4 -} transform5 ::-   (Shape sh, Slice sh, a ~ Complex b, IsFloating b, Elt b) =>+   (Shape sh, Slice sh, a ~ Complex b, A.RealFloat b) =>    (Exp a, Exp a, Exp a, Exp a) -> Transform (sh:.Int) a transform5 (z1,z2,z3,z4) arr =    flatten5 $@@ -250,20 +253,20 @@       (Exp.modify (expr :. expr :. expr) $        \(globalIx :. evenOdd :. k) ->           let ix = A.lift $ globalIx :. k-          in  evenOdd ==* 0 ? (x ! ix, y ! ix))+          in  evenOdd A.== 0 ? (x ! ix, y ! ix))   {- | twiddle factors for radix-2 Cooley-Tukey transforms -} twiddleFactors2 ::-   (Elt a, IsFloating a) =>+   (A.RealFloat a, A.FromIntegral Int a) =>    Exp (Sign a) -> Exp Int -> Acc (A.Vector (Complex a)) twiddleFactors2 sign len2 =    A.generate (A.lift $ Z:.len2) $ twiddle2 sign len2 . A.indexHead  twiddle2 ::-   (Elt a, IsFloating a) =>+   (A.RealFloat a, A.FromIntegral Int a) =>    Exp (Sign a) -> Exp Int -> Exp Int -> Exp (Complex a) twiddle2 sign n2i ki =    let n2 = A.fromIntegral n2i@@ -272,7 +275,7 @@   twiddleFactors ::-   (Elt a, IsFloating a) =>+   (A.RealFloat a, A.FromIntegral Int a) =>    Exp (Sign a) -> Exp Int -> Exp Int -> Acc (Array DIM2 (Complex a)) twiddleFactors sign lenk lenj =    A.generate (A.lift $ Z:.lenk:.lenj) $@@ -280,14 +283,14 @@    \(_z :. k :. j) -> twiddle sign (lenk*lenj) k j  twiddle ::-   (Elt a, IsFloating a) =>+   (A.RealFloat a, A.FromIntegral Int a) =>    Exp (Sign a) -> Exp Int -> Exp Int -> Exp Int -> Exp (Complex a) twiddle sign n k j =    Sign.cisRat sign n $ mod (k*j) n   transformRadix2InterleavedTime ::-   (Shape sh, Slice sh, a ~ Complex b, IsFloating b, Elt b) =>+   (Shape sh, Slice sh, a ~ Complex b, A.RealFloat b) =>    Acc (Array DIM1 a) ->    Transform (sh:.Int:.Int) a ->    Transform (sh:.Int) a@@ -309,7 +312,7 @@   initSplitRadix ::-   (Slice sh, Shape sh, a ~ Complex b, IsFloating b, Elt b) =>+   (Slice sh, Shape sh, a ~ Complex b, A.RealFloat b) =>    Acc (Array (sh:.Int) a) ->    (Acc (Array (sh:.Int:.Int) a), Acc (Array (sh:.Int:.Int) a)) initSplitRadix arr =@@ -318,14 +321,14 @@         A.fill (A.lift $ sh:.(0::Int):.div len 2) 0)  finishSplitRadix ::-   (Slice sh, Shape sh, a ~ Complex b, IsFloating b, Elt b) =>+   (Slice sh, Shape sh, a ~ Complex b, A.RealFloat b) =>    Acc (Array (sh:.Int:.Int) a) -> Acc (Array (sh:.Int) a) finishSplitRadix =    flip A.slice (A.lift $ A.Any :. (0::Int) :. A.All)   initSplitRadixFlat ::-   (Slice sh, Shape sh, a ~ Complex b, IsFloating b, Elt b) =>+   (Slice sh, Shape sh, a ~ Complex b, A.RealFloat b) =>    Acc (Array (sh:.Int) a) ->    (Acc (Array DIM2 a), Acc (Array DIM2 a)) initSplitRadixFlat arr =@@ -334,18 +337,18 @@         A.fill (A.lift $ Z:.(0::Int):.div len 2) 0)  finishSplitRadixFlat ::-   (Slice sh, Shape sh, a ~ Complex b, IsFloating b, Elt b) =>+   (Slice sh, Shape sh, a ~ Complex b, A.RealFloat b) =>    Exp (sh:.Int) -> Acc (Array DIM2 a) -> Acc (Array (sh:.Int) a) finishSplitRadixFlat = A.reshape   imagSplitRadixPlain ::-   (Elt a, IsNum a) =>+   (Num a) =>    Sign a -> Complex a imagSplitRadixPlain sign = 0 :+ Sign.getSign sign  imagSplitRadix ::-   (Elt a, IsNum a) =>+   (A.Num a) =>    Exp (Sign a) -> Exp (Complex a) imagSplitRadix sign =    A.lift (0 :+ Sign.toSign sign)@@ -359,12 +362,12 @@    in  (Sliced1.append evens arr1, twist 2 odds)  ditSplitRadixBase ::-   (Slice sh, Shape sh, Elt a, IsFloating a) =>+   (Slice sh, Shape sh, A.RealFloat a) =>    PairTransform (sh:.Int:.Int) (Complex a) ditSplitRadixBase (arr2, arr1) = (transform2 (-1) arr2, arr1)  ditSplitRadixStep ::-   (Slice sh, Shape sh, a ~ Complex b, Elt b, IsFloating b) =>+   (Slice sh, Shape sh, a ~ Complex b, A.RealFloat b) =>    Exp a ->    (Acc (Array DIM1 a), Acc (Array DIM1 a)) ->    PairTransform (sh:.Int:.Int) a@@ -383,7 +386,7 @@   twiddleSR ::-   (Elt a, IsFloating a) =>+   (A.RealFloat a, A.FromIntegral Int a) =>    Exp (Sign a) -> Exp Int -> Exp Int -> Exp Int -> Exp (Complex a) twiddleSR sign n4i ki ji =    let n4 = A.fromIntegral n4i@@ -392,13 +395,13 @@    in  Sign.cis sign $ pi*(k*j)/(2*n4)  twiddleFactorsSR ::-   (Elt a, IsFloating a) =>+   (A.RealFloat a, A.FromIntegral Int a) =>    Exp (Sign a) -> Exp Int -> Exp Int -> Acc (Array DIM1 (Complex a)) twiddleFactorsSR sign len4 k =    A.generate (A.lift $ Z:.len4) $ twiddleSR sign len4 k . A.indexHead  twiddleFactorsSRPair ::-   (Elt a, IsFloating a) =>+   (A.RealFloat a, A.FromIntegral Int a) =>    Exp (Sign a) -> Exp Int ->    (Acc (Array DIM1 (Complex a)), Acc (Array DIM1 (Complex a))) twiddleFactorsSRPair sign len4 =@@ -421,11 +424,11 @@   chirp ::-   (Elt a, IsFloating a) =>+   (A.RealFloat a, A.FromIntegral Int a) =>    Exp (Sign a) -> Exp Int -> Exp a -> A.Acc (A.Array DIM1 (Complex a)) chirp sign padLen lenFloat =    A.generate (A.index1 padLen) $    \ix ->       let k = A.unindex1 ix-          sk = A.fromIntegral (padLen >* 2*k ? (k, k-padLen))+          sk = A.fromIntegral (padLen A.> 2*k ? (k, k-padLen))       in  Sign.cis sign (pi*sk*sk/lenFloat)
src/Data/Array/Accelerate/Fourier/Real.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-} {- | Compute transforms on real data based on complex-valued transforms. -}@@ -35,8 +36,7 @@  import qualified Data.Array.Accelerate as A import Data.Array.Accelerate-          (Acc, Array, Exp, Elt, IsFloating, Slice, Shape, (:.)((:.)),-           (!), (?), (==*), )+          (Acc, Array, Exp, Slice, Shape, (:.)((:.)), (!), (?), )   {- |@@ -46,7 +46,7 @@ Result has the same size as the input, i.e. it is not halved. -} toSpectrum ::-   (Shape sh, Slice sh, Elt a, IsFloating a) =>+   (Shape sh, Slice sh, A.RealFloat a, A.FromIntegral Int a) =>    Fourier.Transform (sh:.Int) (Complex a) ->    Acc (Array (sh:.Int) a) -> Acc (Array (sh:.Int) (Complex a)) toSpectrum subTrans arr =@@ -69,7 +69,7 @@        A.zipWith (+) evens odds  complexDeinterleave ::-   (Shape sh, Slice sh, Elt a, IsFloating a) =>+   (Shape sh, Slice sh, A.RealFloat a) =>    Acc (Array (sh:.Int) a) -> Acc (Array (sh:.Int) (Complex a)) complexDeinterleave arr =    let (sh:.len) = Exp.unlift (expr:.expr) $ A.shape arr@@ -89,7 +89,7 @@ Result has the same size as the input, i.e. it is not doubled. -} fromSpectrum ::-   (Shape sh, Slice sh, Elt a, IsFloating a) =>+   (Shape sh, Slice sh, A.RealFloat a, A.FromIntegral Int a) =>    Fourier.Transform (sh:.Int) (Complex a) ->    Acc (Array (sh:.Int) (Complex a)) -> Acc (Array (sh:.Int) a) fromSpectrum subTrans spec =@@ -106,7 +106,7 @@    in  complexInterleave $ subTrans $ A.zipWith (+) fe fo  complexInterleave ::-   (Shape sh, Slice sh, Elt a, IsFloating a) =>+   (Shape sh, Slice sh, A.RealFloat a) =>    Acc (Array (sh:.Int) (Complex a)) -> Acc (Array (sh:.Int) a) complexInterleave arr =    let (sh:.len) = Exp.unlift (expr:.expr) $ A.shape arr@@ -117,7 +117,7 @@              let k = div j 2                  r = mod j 2                  x = arr ! A.lift (ix:.k)-             in  r==*0 ? (Complex.real x, Complex.imag x))+             in  r A.== 0 ? (Complex.real x, Complex.imag x))   {- |@@ -126,7 +126,7 @@ Input can have arbitrary size. -} twoToSpectrum ::-   (Shape sh, Slice sh, Elt a, IsFloating a) =>+   (Shape sh, Slice sh, A.RealFloat a) =>    Fourier.Transform (sh:.Int) (Complex a) ->    Acc (Array (sh:.Int) (a,a)) ->    Acc (Array (sh:.Int) (Complex a, Complex a))@@ -135,7 +135,7 @@    A.map (Exp.modify (expr,expr) $ uncurry (:+))  twoToSpectrum2d ::-   (Shape sh, Slice sh, Elt a, IsFloating a) =>+   (Shape sh, Slice sh, A.RealFloat a) =>    Fourier.Transform (sh:.Int:.Int) (Complex a) ->    Acc (Array (sh:.Int:.Int) (a,a)) ->    Acc (Array (sh:.Int:.Int) (Complex a, Complex a))@@ -165,21 +165,21 @@   -> this swaps role of f and g in the proof above -} untangleSpectra ::-   (Shape sh, Slice sh, Elt a, IsFloating a) =>+   (Shape sh, Slice sh, A.RealFloat a) =>    Acc (Array (sh:.Int) (Complex a)) ->    Acc (Array (sh:.Int) (Complex a, Complex a)) untangleSpectra spec =    A.zipWith untangleCoefficient spec (Cyclic.reverse spec)  untangleSpectra2d ::-   (Shape sh, Slice sh, Elt a, IsFloating a) =>+   (Shape sh, Slice sh, A.RealFloat a) =>    Acc (Array (sh:.Int:.Int) (Complex a)) ->    Acc (Array (sh:.Int:.Int) (Complex a, Complex a)) untangleSpectra2d spec =    A.zipWith untangleCoefficient spec (Cyclic.reverse2d spec)  untangleCoefficient ::-   (IsFloating a, Elt a) =>+   (A.RealFloat a) =>    Exp (Complex a) -> Exp (Complex a) -> Exp (Complex a, Complex a) untangleCoefficient a b =    let bc = Complex.conjugate b@@ -187,7 +187,7 @@   twoFromSpectrum ::-   (Shape sh, Slice sh, Elt a, IsFloating a) =>+   (Shape sh, Slice sh, A.RealFloat a) =>    Fourier.Transform (sh:.Int) (Complex a) ->    Acc (Array (sh:.Int) (Complex a, Complex a)) ->    Acc (Array (sh:.Int) (a,a))@@ -196,7 +196,7 @@    subTrans . entangleSpectra  twoFromSpectrum2d ::-   (Shape sh, Slice sh, Elt a, IsFloating a) =>+   (Shape sh, Slice sh, A.RealFloat a) =>    Fourier.Transform (sh:.Int:.Int) (Complex a) ->    Acc (Array (sh:.Int:.Int) (Complex a, Complex a)) ->    Acc (Array (sh:.Int:.Int) (a,a))@@ -205,19 +205,19 @@    subTrans . entangleSpectra2d  entangleSpectra ::-   (Shape sh, Slice sh, Elt a, IsFloating a) =>+   (Shape sh, Slice sh, A.RealFloat a) =>    Acc (Array (sh:.Int) (Complex a, Complex a)) ->    Acc (Array (sh:.Int) (Complex a)) entangleSpectra = entangleSpectraGen  entangleSpectra2d ::-   (Shape sh, Slice sh, Elt a, IsFloating a) =>+   (Shape sh, Slice sh, A.RealFloat a) =>    Acc (Array (sh:.Int:.Int) (Complex a, Complex a)) ->    Acc (Array (sh:.Int:.Int) (Complex a)) entangleSpectra2d = entangleSpectraGen  entangleSpectraGen ::-   (Shape sh, Slice sh, Elt a, IsFloating a) =>+   (Shape sh, Slice sh, A.RealFloat a) =>    Acc (Array sh (Complex a, Complex a)) ->    Acc (Array sh (Complex a)) entangleSpectraGen = A.map (A.fst . A.uncurry entangleCoefficient)@@ -228,12 +228,16 @@ 2i*d = a - bc     bc = c - i*d -} entangleCoefficient ::-   (IsFloating a, Elt a) =>+   (A.RealFloat a) =>    Exp (Complex a) -> Exp (Complex a) -> Exp (Complex a, Complex a) entangleCoefficient c d =    let di = d * imagUnit    in  A.lift (c + di, Complex.conjugate (c - di))  -imagUnit :: (A.Elt a, A.IsNum a) => Exp (Complex a)-imagUnit = A.constant $ 0 :+ 1+imagUnit :: (A.Num a) => Exp (Complex a)+imagUnit = A.lift $ zero :+ one++zero, one :: (A.Num a) => Exp a+zero = 0+one = 1
src/Data/Array/Accelerate/Fourier/Sign.hs view
@@ -2,6 +2,7 @@ {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE DeriveDataTypeable #-} module Data.Array.Accelerate.Fourier.Sign where @@ -9,13 +10,14 @@  import qualified Data.Array.Accelerate as A import Data.Array.Accelerate (Lift(lift), Unlift(unlift), Plain, )-import Data.Array.Accelerate.Smart (Exp(Exp), PreExp(Tuple, Prj), )-import Data.Array.Accelerate.Tuple-          (IsTuple(TupleRepr, fromTuple, toTuple),-           Tuple(NilTup, SnocTup), TupleIdx(ZeroTupIdx), )+import Data.Array.Accelerate.Product+         (IsProduct(ProdRepr, fromProd, toProd, prod),+          ProdR(ProdRsnoc, ProdRunit),+          TupleIdx(ZeroTupIdx), ) import Data.Array.Accelerate.Array.Sugar-          (Elt(eltType, toElt, fromElt, eltType', toElt', fromElt'),-           EltRepr, EltRepr', )+         (Tuple(NilTup, SnocTup),+          EltRepr, Elt(eltType, toElt, fromElt), )+import Data.Array.Accelerate.Smart (Exp(Exp), PreExp(Tuple, Prj), )  import Data.Typeable (Typeable, ) @@ -25,22 +27,18 @@ newtype Sign a = Sign {getSign :: a}    deriving (Eq, Show, Typeable) -type instance EltRepr  (Sign a) = EltRepr  a-type instance EltRepr' (Sign a) = EltRepr' a+type instance EltRepr (Sign a) = EltRepr a  instance Elt a => Elt (Sign a) where    eltType = eltType . getSign    toElt   = Sign . toElt    fromElt = fromElt . getSign -   eltType' = eltType' . getSign-   toElt'   = Sign . toElt'-   fromElt' = fromElt' . getSign--instance IsTuple (Sign a) where-   type TupleRepr (Sign a) = ((), a)-   fromTuple (Sign a) = ((), a)-   toTuple ((), a)    = Sign a+instance (cst a) => IsProduct cst (Sign a) where+   type ProdRepr (Sign a) = ((), a)+   fromProd _ (Sign a) = ((), a)+   toProd _ ((), a) = Sign a+   prod _ (Sign _) = ProdRsnoc ProdRunit  instance (Lift Exp a, Elt (Plain a)) => Lift Exp (Sign a) where    type Plain (Sign a) = Sign (Plain a)@@ -54,20 +52,20 @@ forward = Sign (-1) inverse = Sign 1 -forwardExp, inverseExp :: (Elt a, A.IsNum a) => Exp (Sign a)-forwardExp = lift $ Sign $ A.fromIntegral (-1 :: Exp Int)-inverseExp = lift $ Sign $ A.fromIntegral ( 1 :: Exp Int)+forwardExp, inverseExp :: (A.Num a) => Exp (Sign a)+forwardExp = lift $ Sign (-1 :: (A.Num a) => Exp a)+inverseExp = lift $ Sign ( 1 :: (A.Num a) => Exp a)  toSign :: (Elt a) => Exp (Sign a) -> Exp a toSign = getSign . unlift  cis ::-   (Elt a, A.IsFloating a) =>+   (A.RealFloat a) =>    Exp (Sign a) -> Exp a -> Exp (Complex a) cis sign w  =  A.lift $ cos w :+ toSign sign * sin w  cisRat ::-   (Elt a, A.IsFloating a) =>+   (A.RealFloat a, A.FromIntegral Int a) =>    Exp (Sign a) -> Exp Int -> Exp Int -> Exp (Complex a) cisRat sign denom numer =    cis sign $ 2*pi * A.fromIntegral numer / A.fromIntegral denom
src/Data/Array/Accelerate/Fourier/Utility.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleContexts #-} module Data.Array.Accelerate.Fourier.Utility (    scaleDown,    ) where@@ -10,19 +11,16 @@  import qualified Data.Array.Accelerate.Utility.Sliced as Sliced import qualified Data.Array.Accelerate as A-import Data.Array.Accelerate-          (Exp, Elt, IsNum, IsFloating, Slice, Shape, (:.), )+import Data.Array.Accelerate (Exp, Slice, Shape, (:.), )   scaleDown ::-   (Shape sh, Slice sh, Elt a, IsFloating a) =>+   (Shape sh, Slice sh, A.RealFloat a, A.FromIntegral Int a) =>    Transform (sh:.Int) (Complex a) scaleDown zs =    A.map (cscale (recip $ A.fromIntegral $ Sliced.length zs)) zs -cscale ::-   (IsNum a, Elt a) =>-   Exp a -> Exp (Complex a) -> Exp (Complex a)+cscale :: (A.Num a) => Exp a -> Exp (Complex a) -> Exp (Complex a) cscale x z =    case A.unlift z of       r :+ i -> A.lift (x*r :+ x*i)
test/Test/Data/Array/Accelerate/Fourier.hs view
@@ -14,8 +14,7 @@ import Data.Array.Accelerate.Fourier.Planned (Transform, ) import Data.Array.Accelerate.Fourier.Utility (scaleDown, ) import Data.Array.Accelerate-          (Acc, Exp, Array, DIM1, DIM2, DIM3, Z(Z), (:.)((:.)),-           (<=*), (==*),(&&*), )+          (Acc, Exp, Array, DIM1, DIM2, DIM3, Z(Z), (:.)((:.)), )  import qualified Data.Array.Accelerate.LinearAlgebra as LinAlg import qualified Data.Array.Accelerate.Utility.Sliced as Sliced@@ -36,16 +35,16 @@ tolerance = 1e-10  approxEqualAbs ::-   (A.Elt a, A.IsFloating a) =>+   (A.RealFloat a) =>    Exp a -> Exp a -> Exp a -> Exp Bool approxEqualAbs eps x y =-   abs (x-y) <=* eps+   abs (x-y) A.<= eps  approxEqualComplexAbs ::-   (A.Elt a, A.IsFloating a) =>+   (A.RealFloat a) =>    Exp a -> Exp (Complex a) -> Exp (Complex a) -> Exp Bool approxEqualComplexAbs eps x y =-   Complex.magnitude (x-y) <=* eps+   Complex.magnitude (x-y) A.<= eps   genComplex :: QC.Gen (Complex Double)@@ -258,9 +257,14 @@ (<+>) = A.zipWith (+)  +quickCheckWithSign ::+   (Arbitrary normed, Show normed) =>+   (Planned.Sign Double -> normed -> Bool) -> IO ()+quickCheckWithSign = quickCheck + {--should be replaced by (==*) in future+should be replaced by (A.==) in future -} class (A.Shape sh, A.Slice sh) => EqShape sh where    eqShape :: Exp sh -> Exp sh -> Exp Bool@@ -272,7 +276,7 @@    eqShape =       Exp.modify2 (expr:.expr) (expr:.expr) $       \(sh0:.n0) (sh1:.n1) ->-         n0 ==* n1  &&*  eqShape sh0 sh1+         n0 A.== n1  A.&&  eqShape sh0 sh1   infix 4 =~=@@ -283,8 +287,8 @@    Acc (Array sh (Complex Double)) ->    Acc (A.Scalar Bool) (=~=) xs ys =-   A.map (eqShape (A.shape xs) (A.shape ys)  &&*) $-   A.and $ A.zipWith (approxEqualComplexAbs (A.constant tolerance)) xs ys+   A.map (eqShape (A.shape xs) (A.shape ys)  A.&&) $ A.and $ A.flatten $+   A.zipWith (approxEqualComplexAbs (A.constant tolerance)) xs ys   run :: Acc (A.Scalar Bool) -> Bool@@ -498,7 +502,7 @@              (specr,speci) =                 A.unzip $ FourierReal.untangleSpectra $                 Planned.transform Planned.forward len x-         in  A.zipWith (&&*)+         in  A.zipWith (A.&&)                 (FourierReal.toSpectrum transform xr =~= specr)                 (FourierReal.toSpectrum transform xi =~= speci)) :    ("double real to spectrum, arbitrary",@@ -508,7 +512,7 @@              transform = Planned.transform Planned.forward len              (specr,speci) =                 A.unzip $ FourierReal.untangleSpectra $ transform x-         in  A.zipWith (&&*)+         in  A.zipWith (A.&&)                 (transform xr =~= specr)                 (transform xi =~= speci)) :    ("entangle and untangle spectrum of real data",@@ -517,7 +521,7 @@                 A.unzip $                 A.map (A.uncurry FourierReal.untangleCoefficient) $                 A.zipWith FourierReal.entangleCoefficient x y-         in  A.zipWith (&&*) (x =~= xt) (y =~= yt)) :+         in  A.zipWith (A.&&) (x =~= xt) (y =~= yt)) :    ("double real from spectrum",       quickCheck $ \(Normed1 len x) -> run $          let imagUnit = A.constant (0:+1)@@ -527,11 +531,11 @@              (xSignal,ySignal) =                 A.unzip $ FourierReal.twoFromSpectrum transform $                 A.zip xSelfAdjoint ySelfAdjoint-         in  A.zipWith (&&*)+         in  A.zipWith (A.&&)                 (transform xSelfAdjoint =~= A.map (A.lift . (:+0)) xSignal)                 (transform ySelfAdjoint =~= A.map (A.lift . (:+0)) ySignal)) :    ("transform2d vs. transposition, preprocessed",-      quickCheck $ \sign (Normed2 width height x) -> run $+      quickCheckWithSign $ \sign (Normed2 width height x) -> run $          let transformH =                 Prep.transform2d                    (Prep.SubTransformPair@@ -546,7 +550,7 @@              =~=              transformV (LinAlg.transpose x)) :    ("transform2d vs. transposition, adhoc",-      quickCheck $ \sign (Normed2 _width _height x) -> run $+      quickCheckWithSign $ \sign (Normed2 _width _height x) -> run $          let transform =                 Adhoc.transform2d                    (Adhoc.SubTransform@@ -555,7 +559,7 @@              =~=              transform (LinAlg.transpose x)) :    ("transform3d vs. transposition, preprocessed",-      quickCheck $ \sign (Normed3 width height depth x) -> run $+      quickCheckWithSign $ \sign (Normed3 width height depth x) -> run $          let transformH =                 Prep.transform3d                    (Prep.SubTransformTriple@@ -572,7 +576,7 @@              =~=              transformV (cycleDim3 x)) :    ("transform2d vs. transposition, adhoc",-      quickCheck $ \sign (Normed3 _width _height _depth x) -> run $+      quickCheckWithSign $ \sign (Normed3 _width _height _depth x) -> run $          let transform =                 Adhoc.transform2d                    (Adhoc.SubTransform