-- Do not edit! Automatically created with doctest-extract from private/Numeric/FFTW/Extra/Rank1/Transform.hs {-# LINE 78 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} {-# OPTIONS_GHC -XTypeFamilies #-} module DocTest.Float.Numeric.FFTW.Extra.Rank1.Transform where import qualified Test.DocTest.Driver as DocTest {-# LINE 80 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} import Test.Numeric.FFTW.Extra.Utility import DocTest.Float.Numeric.FFTW.Extra.Rank1.Convolution (complex_, real_) import Numeric.FFTW.Extra.Rank1.Transform import Numeric.FFTW.Extra.Rank1.Convolution (arrangeMutable) import Numeric.FFTW.Extra.NumberTheory (divisors) import Numeric.FFTW.Extra.Utility (cyclicTake, padCyclic, spreadCyclic) import qualified Numeric.FFTW.Shape as Spectrum import qualified Numeric.FFTW.Rank1 as Rank1 import qualified Numeric.BLAS.Vector as Vector -- import qualified Data.Array.Comfort.Storable.Dim2 as Array2 import qualified Data.Array.Comfort.Storable as Array import qualified Data.Array.Comfort.Shape as Shape -- import qualified Data.Foldable as Fold -- import qualified Data.List.Match as Match import Data.Array.Comfort.Storable ((!), (//)) import Data.Complex (Complex((:+)), cis) import qualified Test.QuickCheck as QC import Test.QuickCheck ((.&&.)) test :: DocTest.T () test = do DocTest.printPrefix "Numeric.FFTW.Extra.Rank1.Transform:109: " {-# LINE 109 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} DocTest.property( {-# LINE 109 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} QC.forAll (genCyclic complex_) $ \xy -> let (x,y) = Vector.unzipComplex xy in let (fx,fy) = fourierRC2 (x,y) in Rank1.fourierRC x =~= fx .&&. Rank1.fourierRC y =~= fy ) DocTest.printPrefix "Numeric.FFTW.Extra.Rank1.Transform:287: " {-# LINE 287 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} DocTest.property( {-# LINE 287 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} QC.forAll (genCyclic complex_) $ \x sign -> let n = Shape.size $ Array.shape x in QC.forAll (QC.elements $ divisors n) $ \m -> QC.forAll (chooseLogarithmic n) $ \mcut -> takeDivisorFourier sign mcut m x =~= takeShape (Shape.ZeroBased mcut) (Rank1.fourier sign x) ) DocTest.printPrefix "Numeric.FFTW.Extra.Rank1.Transform:348: " {-# LINE 348 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} DocTest.property( {-# LINE 348 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} QC.forAll (genCyclic complex_) $ \x sign -> let n = Shape.size $ Array.shape x in QC.forAll (QC.elements $ divisors n) $ \m -> QC.forAll (chooseLogarithmic n) $ \mcut from -> let shape = Shape.intervalFromShifted $ Shape.Shifted from mcut in takeDivisorFourierInterval sign shape m x =~= cyclicTake shape (Rank1.fourier sign x) ) DocTest.printPrefix "Numeric.FFTW.Extra.Rank1.Transform:385: " {-# LINE 385 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} DocTest.property( {-# LINE 385 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} QC.forAll (genCyclic complex_) $ \x sign -> let n = Shape.size $ Array.shape x in QC.forAll (QC.elements $ divisors n) $ \m -> QC.forAll (chooseLogarithmic n) $ \mcut -> takeDivisorFourier sign mcut m x =~= takeNonDivisorFourier sign mcut x ) DocTest.printPrefix "Numeric.FFTW.Extra.Rank1.Transform:415: " {-# LINE 415 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} DocTest.property( {-# LINE 415 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} QC.forAll (genCyclic complex_) $ \x sign -> let n = Shape.size $ Array.shape x in QC.forAll (chooseLogarithmic n) $ \m from -> let shape = Shape.intervalFromShifted $ Shape.Shifted from m in takeNonDivisorFourierInterval sign shape x =~= cyclicTake shape (Rank1.fourier sign x) ) DocTest.printPrefix "Numeric.FFTW.Extra.Rank1.Transform:465: " {-# LINE 465 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} DocTest.property( {-# LINE 465 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} QC.forAll (genCyclic real_) $ \x -> let n = Shape.cyclicSize $ Array.shape x in QC.forAll (QC.elements $ divisors n) $ \m -> QC.forAll (chooseLogarithmic n) $ \mcut -> takeDivisorFourierRC mcut m x =~= takeNonDivisorFourierRC mcut x ) DocTest.printPrefix "Numeric.FFTW.Extra.Rank1.Transform:501: " {-# LINE 501 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} DocTest.property( {-# LINE 501 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} QC.forAll genVectorShape $ \shape sign -> let n = Shape.zeroBasedSize shape in QC.forAll (QC.elements $ divisors n) $ \m -> QC.forAll (chooseLogarithmic n) $ \mcut -> QC.forAll (genVectorForShape complex_ (Shape.ZeroBased mcut)) $ \x -> Rank1.fourier sign (padCyclic n x) =~= extendDivisorFourier sign n m x ) DocTest.printPrefix "Numeric.FFTW.Extra.Rank1.Transform:559: " {-# LINE 559 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} DocTest.property( {-# LINE 559 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} QC.forAll genVectorShape $ \shape sign -> let n = Shape.zeroBasedSize shape in QC.forAll (QC.elements $ divisors n) $ \m -> QC.forAll (chooseLogarithmic n) $ \mcut from -> let rng = Shape.intervalFromShifted $ Shape.Shifted from mcut in QC.forAll (genVectorForShape complex_ rng) $ \x -> extendDivisorFourierInterval sign n m x =~= Rank1.fourier sign (spreadCyclic n x) ) DocTest.printPrefix "Numeric.FFTW.Extra.Rank1.Transform:595: " {-# LINE 595 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} DocTest.property( {-# LINE 595 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} QC.forAll genVectorShape $ \shape sign -> let n = Shape.zeroBasedSize shape in QC.forAll (chooseLogarithmic n) $ \m -> QC.forAll (genVectorForShape complex_ (Shape.ZeroBased m)) $ \x -> Rank1.fourier sign (padCyclic n x) =~= extendNonDivisorFourier sign n x ) DocTest.printPrefix "Numeric.FFTW.Extra.Rank1.Transform:606: " {-# LINE 606 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} DocTest.property( {-# LINE 606 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} QC.forAll genVectorShape $ \shape sign -> let n = Shape.zeroBasedSize shape in QC.forAll (chooseLogarithmic n) $ \m -> QC.forAll (genVectorForShape complex_ (Shape.ZeroBased m)) $ \x -> takeNonDivisorFourier (Rank1.flipSign sign) m (extendNonDivisorFourier sign n x) =~= Vector.scaleReal (fromIntegral n) x ) DocTest.printPrefix "Numeric.FFTW.Extra.Rank1.Transform:638: " {-# LINE 638 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} DocTest.property( {-# LINE 638 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} QC.forAll genCyclicShape $ \shape -> let n = Shape.cyclicSize shape in n>=2 QC.==> QC.forAll (chooseLogarithmic (n-1)) $ \m -> let halfShape = Spectrum.Half m in QC.forAll (genVectorForShape complex_ halfShape) $ \xh -> extendNonDivisorFourierInterval Rank1.Backward n (spectrumIntervalFromHalf xh) =~= Vector.fromReal (extendNonDivisorFourierCR n xh) ) DocTest.printPrefix "Numeric.FFTW.Extra.Rank1.Transform:652: " {-# LINE 652 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} DocTest.property( {-# LINE 652 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} QC.forAll genVectorShape $ \shape -> let n = Shape.zeroBasedSize shape in QC.forAll (chooseLogarithmic n) $ \m -> let halfShape = Spectrum.Half m in QC.forAll (genVectorForShape complex_ halfShape) $ \x -> Vector.realPart (Rank1.fourier Rank1.Backward (padCyclic n $ Array.mapShape (Shape.ZeroBased . Shape.size) $ Vector.scaleReal 2 x // [(0, x!0)])) =~= extendNonDivisorFourierCR n x ) DocTest.printPrefix "Numeric.FFTW.Extra.Rank1.Transform:667: " {-# LINE 667 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} DocTest.property( {-# LINE 667 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} QC.forAll genVectorShape $ \shape -> let n = Shape.zeroBasedSize shape in QC.forAll (QC.elements $ divisors n) $ \m -> QC.forAll (chooseLogarithmic n) $ \mcut -> QC.forAll (genVectorForShape complex_ (Spectrum.Half mcut)) $ \x -> extendDivisorFourierCR n m x =~= extendNonDivisorFourierCR n x ) DocTest.printPrefix "Numeric.FFTW.Extra.Rank1.Transform:680: " {-# LINE 680 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} DocTest.property( {-# LINE 680 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} QC.forAll genCyclicShape $ \shape -> let n = Shape.cyclicSize shape in forChoose (0, div n 2) $ \f a b -> let c = -2*pi / fromIntegral n in let (a2,b2) = if f==0 then (a,b) else (2*a,2*b) in extendNonDivisorFourierCR n (Array.fromAssociations 0 (Spectrum.Half (2*f)) [(f, a:+b :: Complex Float)]) =~= Array.sample shape (\t -> a2 * cos (c * fromIntegral (mod (t*f) n)) + b2 * sin (c * fromIntegral (mod (t*f) n))) ) DocTest.printPrefix "Numeric.FFTW.Extra.Rank1.Transform:743: " {-# LINE 743 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} DocTest.property( {-# LINE 743 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} QC.forAll genCyclicShape $ \shape sign -> let n = Shape.cyclicSize shape in QC.forAll (chooseLogarithmic n) $ \m -> QC.forAll (genVectorForShape complex_ (Shape.ZeroBased m)) $ \x -> extendNonDivisorFourier sign n x =~= extendNonDivisorFourierInterval sign n (Array.reshape (Shape.Interval 0 (m-1)) x) ) DocTest.printPrefix "Numeric.FFTW.Extra.Rank1.Transform:754: " {-# LINE 754 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} DocTest.property( {-# LINE 754 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} QC.forAll genCyclicShape $ \shape sign f a -> let n = Shape.cyclicSize shape in let cu = 2*pi / fromIntegral n in let c = case sign of Rank1.Forward -> -cu; Rank1.Backward -> cu in extendNonDivisorFourierInterval sign n (Array.replicate (Shape.Interval f f) (a :: Complex Float)) =~= Array.sample shape (\t -> a * cis (c * fromIntegral (mod (t*f) n))) ) DocTest.printPrefix "Numeric.FFTW.Extra.Rank1.Transform:766: " {-# LINE 766 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} DocTest.property( {-# LINE 766 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} QC.forAll genCyclicShape $ \shape sign -> let n = Shape.cyclicSize shape in n>=2 QC.==> forChoose (1,n-1) $ \d f0 a b -> let f1 = f0+d in let cu = 2*pi / fromIntegral n in let c = case sign of Rank1.Forward -> -cu; Rank1.Backward -> cu in extendNonDivisorFourierInterval sign n (Array.fromAssociations 0 (Shape.Interval f0 f1) [(f0,a), (f1,b :: Complex Float)]) =~= Array.sample shape (\t -> a * cis (c * fromIntegral (mod (t*f0) n)) + b * cis (c * fromIntegral (mod (t*f1) n))) ) DocTest.printPrefix "Numeric.FFTW.Extra.Rank1.Transform:872: " {-# LINE 872 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} DocTest.property( {-# LINE 872 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} QC.forAll genVectorShape $ \shapeShort -> forChoose (1,10) $ \stepSize -> forChoose (2,10) $ \overlap -> let m = stepSize * overlap in let window = Array.sample (Shape.ZeroBased m) (\i -> sin (pi * fromIntegral i / fromIntegral m)) in let shape = fmap (\n -> n + mod (-n) (stepSize*overlap)) shapeShort in QC.forAll (genVectorForShape complex_ shape) $ \x -> let zeroPad = Vector.zero $ Shape.ZeroBased $ (overlap-1)*stepSize in let xpad = zeroPad <> x <> zeroPad in Vector.scaleReal (fromIntegral (m*overlap) / 2) xpad =~= shortTimeFourierBackward window overlap (shortTimeFourierForward window overlap xpad) ) DocTest.printPrefix "Numeric.FFTW.Extra.Rank1.Transform:916: " {-# LINE 916 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} DocTest.property( {-# LINE 916 "private/Numeric/FFTW/Extra/Rank1/Transform.hs" #-} QC.forAll (genVector real_) $ \dat -> let n = Shape.zeroBasedSize $ Array.shape dat in forChoose (1, min n 4) $ \overlap -> QC.forAll (chooseLogarithmic (div n overlap)) $ \stepSize -> let width = overlap * stepSize in let height = div n width in let xs = takeShape (Shape.ZeroBased height, Shape.ZeroBased width) dat in fromOverlappingBlocks overlap xs =~= arrangeMutable ((height-1 + overlap) * stepSize) stepSize xs (Vector.zero (Shape.ZeroBased 0)) )