packages feed

comfort-blas-0.0.2: test/Test/Float/Numeric/BLAS/Vector.hs

-- Do not edit! Automatically created with doctest-extract from src/Numeric/BLAS/Vector.hs
{-# LINE 100 "src/Numeric/BLAS/Vector.hs" #-}

module Test.Float.Numeric.BLAS.Vector where

import Test.DocTest.Base
import qualified Test.DocTest.Driver as DocTest

{-# LINE 101 "src/Numeric/BLAS/Vector.hs" #-}
import     Test.Float.Type (Number_)
import     Test.Generator (genNumber)
import     Test.Slice (shapeInt)
import     Test.Utility (approx)
import     qualified Numeric.BLAS.Vector as Vector
import     qualified Numeric.Netlib.Class as Class
import     qualified Data.Array.Comfort.Shape as Shape
import     qualified Data.Array.Comfort.Storable as Array
import     qualified Data.List as List
import     Numeric.BLAS.Vector ((+++), (|+|), (|-|))
import     Numeric.BLAS.Scalar (RealOf, absolute, minusOne)
import     Data.Array.Comfort.Storable (Array, (!))
import     Data.Complex (Complex((:+)))
import     Data.Monoid ((<>))
import     Data.Tuple.HT (mapPair)
import     Control.Applicative (liftA2)
import     Control.Monad (replicateM)

import     qualified Test.QuickCheck as QC
import     Test.QuickCheck ((==>))

type     Vector = Vector.Vector (Shape.ZeroBased Int)
type     Real_ = RealOf Number_
type     Complex_ = Complex Real_

maxElem     :: Integer
maxElem     = 10

maxDim     :: Int
maxDim     = 100

genVector     ::
       (Shape.C sh, Class.Floating a) =>
       sh -> QC.Gen a -> QC.Gen (Vector.Vector sh a)
genVector     shape genElem =
       fmap (Vector.fromList shape) $
       replicateM (Shape.size shape) genElem

real_     :: QC.Gen Real_
real_     = genNumber maxElem

complex_     :: QC.Gen Complex_
complex_     = genNumber maxElem

number_     :: QC.Gen Number_
number_     = genNumber maxElem

isNonEmpty     :: Shape.C sh => Array sh a -> Bool
isNonEmpty     xs = Shape.size (Array.shape xs) > 0

forVector     ::
       (QC.Testable prop, QC.Arbitrary a, Class.Floating a, Show a) =>
       QC.Gen a -> (Vector a -> prop) -> QC.Property
forVector     genElem =
       QC.forAllShrink
          (flip genVector genElem . shapeInt =<< QC.choose (0,maxDim))
          (map Vector.autoFromList . QC.shrink . Vector.toList)

forVector2     ::
       (QC.Testable prop, QC.Arbitrary a, Class.Floating a, Show a) =>
       QC.Gen a -> (Vector a -> Vector a -> prop) -> QC.Property
forVector2     genElem prop =
       QC.forAllShrink
          (do shape <- fmap shapeInt $ QC.choose (0,maxDim)
              liftA2 (,) (genVector shape genElem) (genVector shape genElem))
          (map (mapPair (Vector.autoFromList, Vector.autoFromList) . unzip) .
           QC.shrink .
           uncurry zip . mapPair (Vector.toList, Vector.toList))
          (uncurry prop)

type     CyclicVector = Vector.Vector (Shape.Cyclic Int)

genCyclicVector     ::
       (Class.Floating a) =>
       Integer -> Int -> QC.Gen (CyclicVector a)
genCyclicVector     maxE dim =
       fmap (Vector.fromList (Shape.Cyclic dim)) $
       replicateM dim $ genNumber maxE

cyclicVectorFromListGen     :: (Class.Floating a) => [a] -> CyclicVector a
cyclicVectorFromListGen     xs = Vector.fromList (Shape.Cyclic $ length xs) xs

cyclicVectorFromList     :: [Number_] -> CyclicVector Number_
cyclicVectorFromList     = cyclicVectorFromListGen

forCyclicVector     ::
       (QC.Testable prop, QC.Arbitrary a, Class.Floating a, Show a) =>
       QC.Gen a -> (CyclicVector a -> prop) -> QC.Property
forCyclicVector     genElem =
       QC.forAllShrink
          (flip genVector genElem . Shape.Cyclic =<< QC.choose (0,maxDim))
          (map cyclicVectorFromListGen . QC.shrink . Vector.toList)

test :: DocTest.T ()
test = do
 DocTest.printPrefix "Numeric.BLAS.Vector:239: "
{-# LINE 239 "src/Numeric/BLAS/Vector.hs" #-}
 DocTest.property(
{-# LINE 239 "src/Numeric/BLAS/Vector.hs" #-}
      forVector number_ $ \xs -> forVector number_ $ \ys -> forVector number_ $ \zs -> Vector.toList ((xs +++ ys) +++ zs) == Vector.toList (xs +++ (ys +++ zs))
  )
 DocTest.printPrefix "Numeric.BLAS.Vector:248: "
{-# LINE 248 "src/Numeric/BLAS/Vector.hs" #-}
 DocTest.property(
{-# LINE 248 "src/Numeric/BLAS/Vector.hs" #-}
      Vector.autoFromList [] == (Vector.reverse $ Vector.autoFromList [] :: Vector Number_)
  )
 DocTest.printPrefix "Numeric.BLAS.Vector:249: "
{-# LINE 249 "src/Numeric/BLAS/Vector.hs" #-}
 DocTest.property(
{-# LINE 249 "src/Numeric/BLAS/Vector.hs" #-}
      Vector.autoFromList [1] == (Vector.reverse $ Vector.autoFromList [1] :: Vector Number_)
  )
 DocTest.printPrefix "Numeric.BLAS.Vector:250: "
{-# LINE 250 "src/Numeric/BLAS/Vector.hs" #-}
 DocTest.property(
{-# LINE 250 "src/Numeric/BLAS/Vector.hs" #-}
      Vector.autoFromList [3,2,1] == (Vector.reverse $ Vector.autoFromList [1,2,3] :: Vector Number_)
  )
 DocTest.printPrefix "Numeric.BLAS.Vector:252: "
{-# LINE 252 "src/Numeric/BLAS/Vector.hs" #-}
 DocTest.property(
{-# LINE 252 "src/Numeric/BLAS/Vector.hs" #-}
      forVector number_ $ \xs -> reverse (Vector.toList xs) == Vector.toList (Vector.reverse xs)
  )
 DocTest.printPrefix "Numeric.BLAS.Vector:253: "
{-# LINE 253 "src/Numeric/BLAS/Vector.hs" #-}
 DocTest.property(
{-# LINE 253 "src/Numeric/BLAS/Vector.hs" #-}
      forVector number_ $ \xs -> xs == Vector.reverse (Vector.reverse xs)
  )
 DocTest.printPrefix "Numeric.BLAS.Vector:254: "
{-# LINE 254 "src/Numeric/BLAS/Vector.hs" #-}
 DocTest.property(
{-# LINE 254 "src/Numeric/BLAS/Vector.hs" #-}
      forVector number_ $ \xs -> forVector number_ $ \ys -> Vector.reverse (xs <> ys) == Vector.reverse ys <> Vector.reverse xs
  )
 DocTest.printPrefix "Numeric.BLAS.Vector:269: "
{-# LINE 269 "src/Numeric/BLAS/Vector.hs" #-}
 DocTest.property(
{-# LINE 269 "src/Numeric/BLAS/Vector.hs" #-}
      cyclicVectorFromList [] == Vector.cyclicReverse (cyclicVectorFromList [])
  )
 DocTest.printPrefix "Numeric.BLAS.Vector:270: "
{-# LINE 270 "src/Numeric/BLAS/Vector.hs" #-}
 DocTest.property(
{-# LINE 270 "src/Numeric/BLAS/Vector.hs" #-}
      cyclicVectorFromList [1] == Vector.cyclicReverse (cyclicVectorFromList [1])
  )
 DocTest.printPrefix "Numeric.BLAS.Vector:271: "
{-# LINE 271 "src/Numeric/BLAS/Vector.hs" #-}
 DocTest.property(
{-# LINE 271 "src/Numeric/BLAS/Vector.hs" #-}
      cyclicVectorFromList [1,3,2] == Vector.cyclicReverse (cyclicVectorFromList [1,2,3])
  )
 DocTest.printPrefix "Numeric.BLAS.Vector:272: "
{-# LINE 272 "src/Numeric/BLAS/Vector.hs" #-}
 DocTest.property(
{-# LINE 272 "src/Numeric/BLAS/Vector.hs" #-}
      cyclicVectorFromList [1,6,5,4,3,2] == Vector.cyclicReverse (cyclicVectorFromList [1,2,3,4,5,6])
  )
 DocTest.printPrefix "Numeric.BLAS.Vector:274: "
{-# LINE 274 "src/Numeric/BLAS/Vector.hs" #-}
 DocTest.property(
{-# LINE 274 "src/Numeric/BLAS/Vector.hs" #-}
      forCyclicVector number_ $ \xs -> xs == Vector.cyclicReverse (Vector.cyclicReverse xs)
  )
 DocTest.printPrefix "Numeric.BLAS.Vector:291: "
{-# LINE 291 "src/Numeric/BLAS/Vector.hs" #-}
 DocTest.property(
{-# LINE 291 "src/Numeric/BLAS/Vector.hs" #-}
      QC.forAll (QC.choose (1,100)) $ \dim -> QC.forAll (QC.choose (0, dim-1)) $ \i -> QC.forAll (QC.choose (0, dim-1)) $ \j -> Vector.unit (Shape.ZeroBased dim) i == (Vector.swap i j (Vector.unit (Shape.ZeroBased dim) j) :: Vector Number_)
  )
 DocTest.printPrefix "Numeric.BLAS.Vector:326: "
{-# LINE 326 "src/Numeric/BLAS/Vector.hs" #-}
 DocTest.property(
{-# LINE 326 "src/Numeric/BLAS/Vector.hs" #-}
      forVector2 number_ $ \xs ys -> Vector.inner xs ys == Vector.dot (Vector.conjugate xs) ys
  )
 DocTest.printPrefix "Numeric.BLAS.Vector:379: "
{-# LINE 379 "src/Numeric/BLAS/Vector.hs" #-}
 DocTest.property(
{-# LINE 379 "src/Numeric/BLAS/Vector.hs" #-}
      forVector number_ $ \xs -> Vector.sum xs == List.sum (Vector.toList xs)
  )
 DocTest.printPrefix "Numeric.BLAS.Vector:439: "
{-# LINE 439 "src/Numeric/BLAS/Vector.hs" #-}
 DocTest.property(
{-# LINE 439 "src/Numeric/BLAS/Vector.hs" #-}
      forVector number_ $ \xs -> Vector.normInf xs == List.maximum (0 : List.map absolute (Vector.toList xs))
  )
 DocTest.printPrefix "Numeric.BLAS.Vector:463: "
{-# LINE 463 "src/Numeric/BLAS/Vector.hs" #-}
 DocTest.example(
{-# LINE 463 "src/Numeric/BLAS/Vector.hs" #-}
    Vector.argAbsMaximum $ Vector.autoFromList [1:+2, 3:+4, 5, 6 :: Complex_]
  )
  [ExpectedLine [LineChunk "(3,6.0 :+ 0.0)"]]
 DocTest.printPrefix "Numeric.BLAS.Vector:466: "
{-# LINE 466 "src/Numeric/BLAS/Vector.hs" #-}
 DocTest.property(
{-# LINE 466 "src/Numeric/BLAS/Vector.hs" #-}
      forVector number_ $ \xs -> isNonEmpty xs ==> let (xi,xm) = Vector.argAbsMaximum xs in xs!xi == xm
  )
 DocTest.printPrefix "Numeric.BLAS.Vector:467: "
{-# LINE 467 "src/Numeric/BLAS/Vector.hs" #-}
 DocTest.property(
{-# LINE 467 "src/Numeric/BLAS/Vector.hs" #-}
      forVector number_ $ \xs -> isNonEmpty xs ==> let (_xi,xm) = Vector.argAbsMaximum xs in List.all (\x -> absolute x <= absolute xm) $ Vector.toList xs
  )
 DocTest.printPrefix "Numeric.BLAS.Vector:468: "
{-# LINE 468 "src/Numeric/BLAS/Vector.hs" #-}
 DocTest.property(
{-# LINE 468 "src/Numeric/BLAS/Vector.hs" #-}
      forVector number_ $ \xs -> forVector number_ $ \ys -> isNonEmpty xs && isNonEmpty ys ==> let (_xi,xm) = Vector.argAbsMaximum xs; (_yi,ym) = Vector.argAbsMaximum ys; (zi,zm) = Vector.argAbsMaximum (xs+++ys) in case zi of Left _ -> xm==zm && absolute xm >= absolute ym; Right _ -> ym==zm && absolute xm < absolute ym
  )
 DocTest.printPrefix "Numeric.BLAS.Vector:512: "
{-# LINE 512 "src/Numeric/BLAS/Vector.hs" #-}
 DocTest.example(
{-# LINE 512 "src/Numeric/BLAS/Vector.hs" #-}
    Vector.argAbs1Maximum $ Vector.autoFromList [1:+2, 3:+4, 5, 6 :: Complex_]
  )
  [ExpectedLine [LineChunk "(1,3.0 :+ 4.0)"]]
 DocTest.printPrefix "Numeric.BLAS.Vector:515: "
{-# LINE 515 "src/Numeric/BLAS/Vector.hs" #-}
 DocTest.property(
{-# LINE 515 "src/Numeric/BLAS/Vector.hs" #-}
      forVector real_ $ \xs -> isNonEmpty xs ==> Vector.argAbsMaximum xs == Vector.argAbs1Maximum xs
  )
 DocTest.printPrefix "Numeric.BLAS.Vector:548: "
{-# LINE 548 "src/Numeric/BLAS/Vector.hs" #-}
 DocTest.property(
{-# LINE 548 "src/Numeric/BLAS/Vector.hs" #-}
      QC.forAll (QC.choose (0,10)) $ \dim -> QC.forAll (genVector (shapeInt dim) (genNumber 3)) $ \xs -> approx 1e-2 (Vector.product xs) (List.product (Vector.toList (xs :: Vector Number_)))
  )
 DocTest.printPrefix "Numeric.BLAS.Vector:558: "
{-# LINE 558 "src/Numeric/BLAS/Vector.hs" #-}
 DocTest.property(
{-# LINE 558 "src/Numeric/BLAS/Vector.hs" #-}
      forVector real_ $ \xs -> isNonEmpty xs ==> Vector.minimum xs == List.minimum (Vector.toList xs)
  )
 DocTest.printPrefix "Numeric.BLAS.Vector:559: "
{-# LINE 559 "src/Numeric/BLAS/Vector.hs" #-}
 DocTest.property(
{-# LINE 559 "src/Numeric/BLAS/Vector.hs" #-}
      forVector real_ $ \xs -> isNonEmpty xs ==> Vector.maximum xs == List.maximum (Vector.toList xs)
  )
 DocTest.printPrefix "Numeric.BLAS.Vector:560: "
{-# LINE 560 "src/Numeric/BLAS/Vector.hs" #-}
 DocTest.property(
{-# LINE 560 "src/Numeric/BLAS/Vector.hs" #-}
      forVector real_ $ \xs -> isNonEmpty xs ==> - Vector.maximum xs == Vector.minimum (Vector.negate xs)
  )
 DocTest.printPrefix "Numeric.BLAS.Vector:576: "
{-# LINE 576 "src/Numeric/BLAS/Vector.hs" #-}
 DocTest.property(
{-# LINE 576 "src/Numeric/BLAS/Vector.hs" #-}
      forVector real_ $ \xs -> isNonEmpty xs ==> Vector.limits xs == Array.limits xs
  )
 DocTest.printPrefix "Numeric.BLAS.Vector:606: "
{-# LINE 606 "src/Numeric/BLAS/Vector.hs" #-}
 DocTest.property(
{-# LINE 606 "src/Numeric/BLAS/Vector.hs" #-}
      forVector number_ $ \xs -> Vector.negate xs == Vector.scale minusOne xs
  )
 DocTest.printPrefix "Numeric.BLAS.Vector:607: "
{-# LINE 607 "src/Numeric/BLAS/Vector.hs" #-}
 DocTest.property(
{-# LINE 607 "src/Numeric/BLAS/Vector.hs" #-}
      forVector number_ $ \xs -> Vector.scale 2 xs == xs |+| xs
  )
 DocTest.printPrefix "Numeric.BLAS.Vector:676: "
{-# LINE 676 "src/Numeric/BLAS/Vector.hs" #-}
 DocTest.property(
{-# LINE 676 "src/Numeric/BLAS/Vector.hs" #-}
      forVector2 number_ $ \xs ys -> xs |+| ys == ys |+| xs
  )
 DocTest.printPrefix "Numeric.BLAS.Vector:677: "
{-# LINE 677 "src/Numeric/BLAS/Vector.hs" #-}
 DocTest.property(
{-# LINE 677 "src/Numeric/BLAS/Vector.hs" #-}
      forVector2 number_ $ \xs ys -> xs == xs |-| ys |+| ys
  )
 DocTest.printPrefix "Numeric.BLAS.Vector:707: "
{-# LINE 707 "src/Numeric/BLAS/Vector.hs" #-}
 DocTest.property(
{-# LINE 707 "src/Numeric/BLAS/Vector.hs" #-}
      forVector number_ $ \xs -> xs == Vector.negate (Vector.negate xs)
  )
 DocTest.printPrefix "Numeric.BLAS.Vector:720: "
{-# LINE 720 "src/Numeric/BLAS/Vector.hs" #-}
 DocTest.property(
{-# LINE 720 "src/Numeric/BLAS/Vector.hs" #-}
      QC.forAll (genNumber maxElem) $ \d -> forVector number_ $ \xs -> xs == Vector.raise (-d) (Vector.raise d xs)
  )
 DocTest.printPrefix "Numeric.BLAS.Vector:737: "
{-# LINE 737 "src/Numeric/BLAS/Vector.hs" #-}
 DocTest.property(
{-# LINE 737 "src/Numeric/BLAS/Vector.hs" #-}
      forVector2 number_ $ \xs ys -> Vector.mul xs ys == Vector.mul ys xs
  )
 DocTest.printPrefix "Numeric.BLAS.Vector:745: "
{-# LINE 745 "src/Numeric/BLAS/Vector.hs" #-}
 DocTest.property(
{-# LINE 745 "src/Numeric/BLAS/Vector.hs" #-}
      forVector2 number_ $ \xs ys -> Vector.mulConj xs ys == Vector.mul (Vector.conjugate xs) ys
  )