-- Do not edit! Automatically created with doctest-extract from src/Numeric/BLAS/Vector.hs {-# LINE 117 "src/Numeric/BLAS/Vector.hs" #-} module Test.Float.Numeric.BLAS.Vector where import Test.DocTest.Base import qualified Test.DocTest.Driver as DocTest {-# LINE 118 "src/Numeric/BLAS/Vector.hs" #-} import Test.Type import Test.Generator (genNumber) import Test.Slice (shapeInt) import Test.Utility (approx) import qualified Numeric.BLAS.Matrix.RowMajor as Matrix 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 Number_ = Float type Real_ = RealOf Number_ type Complex_ = Complex Real_ type ComplexDummy_ = ComplexFloat 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 IntervalVector = Vector.Vector (Shape.Interval Int) forIntervalVector :: (QC.Testable prop, QC.Arbitrary a, Class.Floating a, Show a) => QC.Gen a -> (IntervalVector a -> prop) -> QC.Property forIntervalVector genElem prop = forVector genElem $ \xs start -> prop $ Array.mapShape (\(Shape.ZeroBased n) -> Shape.Interval start (start+n-1)) xs 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" #-} QC.forAll number_ $ \x -> Vector.constant () x == Vector.singleton x ) DocTest.printPrefix "Numeric.BLAS.Vector:241: " {-# LINE 241 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 241 "src/Numeric/BLAS/Vector.hs" #-} QC.forAll (QC.choose (0,1000)) $ \n -> QC.forAll number_ $ \x -> Vector.sum (Vector.constant (shapeInt n) x) == fromIntegral n * x ) DocTest.printPrefix "Numeric.BLAS.Vector:258: " {-# LINE 258 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 258 "src/Numeric/BLAS/Vector.hs" #-} QC.forAll (QC.choose (0,1000)) $ \n -> Vector.sum (Vector.zero (shapeInt n)) == (0 :: Number_) ) DocTest.printPrefix "Numeric.BLAS.Vector:267: " {-# LINE 267 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 267 "src/Numeric/BLAS/Vector.hs" #-} QC.forAll (QC.choose (0,1000)) $ \n -> Vector.sum (Vector.one (shapeInt n)) == (fromIntegral n :: Number_) ) DocTest.printPrefix "Numeric.BLAS.Vector:276: " {-# LINE 276 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 276 "src/Numeric/BLAS/Vector.hs" #-} QC.forAll (fmap shapeInt $ QC.choose (1,1000)) $ \sh -> QC.forAll (QC.elements $ Shape.indices sh) $ \k -> Vector.sum (Vector.unit sh k) == (1 :: Number_) ) DocTest.printPrefix "Numeric.BLAS.Vector:298: " {-# LINE 298 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 298 "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:314: " {-# LINE 314 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 314 "src/Numeric/BLAS/Vector.hs" #-} Vector.autoFromList [] == (Vector.reverse $ Vector.autoFromList [] :: Vector Number_) ) DocTest.printPrefix "Numeric.BLAS.Vector:315: " {-# LINE 315 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 315 "src/Numeric/BLAS/Vector.hs" #-} Vector.autoFromList [1] == (Vector.reverse $ Vector.autoFromList [1] :: Vector Number_) ) DocTest.printPrefix "Numeric.BLAS.Vector:316: " {-# LINE 316 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 316 "src/Numeric/BLAS/Vector.hs" #-} Vector.autoFromList [3,2,1] == (Vector.reverse $ Vector.autoFromList [1,2,3] :: Vector Number_) ) DocTest.printPrefix "Numeric.BLAS.Vector:318: " {-# LINE 318 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 318 "src/Numeric/BLAS/Vector.hs" #-} forVector number_ $ \xs -> reverse (Vector.toList xs) == Vector.toList (Vector.reverse xs) ) DocTest.printPrefix "Numeric.BLAS.Vector:319: " {-# LINE 319 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 319 "src/Numeric/BLAS/Vector.hs" #-} forVector number_ $ \xs -> xs == Vector.reverse (Vector.reverse xs) ) DocTest.printPrefix "Numeric.BLAS.Vector:320: " {-# LINE 320 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 320 "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:344: " {-# LINE 344 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 344 "src/Numeric/BLAS/Vector.hs" #-} forIntervalVector number_ $ \xs -> reverse (Vector.toList xs) == Vector.toList (Vector.intervalReverse xs) ) DocTest.printPrefix "Numeric.BLAS.Vector:348: " {-# LINE 348 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 348 "src/Numeric/BLAS/Vector.hs" #-} forIntervalVector number_ $ \xs -> xs == Vector.intervalReverse (Vector.intervalReverse xs) ) DocTest.printPrefix "Numeric.BLAS.Vector:352: " {-# LINE 352 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 352 "src/Numeric/BLAS/Vector.hs" #-} forIntervalVector number_ $ \xs -> let is = Shape.indices $ Array.shape xs in not (null is) ==> QC.forAll (QC.elements is) $ \i -> xs!i == Vector.intervalReverse xs ! (-i) ) DocTest.printPrefix "Numeric.BLAS.Vector:370: " {-# LINE 370 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 370 "src/Numeric/BLAS/Vector.hs" #-} cyclicVectorFromList [] == Vector.cyclicReverse (cyclicVectorFromList []) ) DocTest.printPrefix "Numeric.BLAS.Vector:371: " {-# LINE 371 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 371 "src/Numeric/BLAS/Vector.hs" #-} cyclicVectorFromList [1] == Vector.cyclicReverse (cyclicVectorFromList [1]) ) DocTest.printPrefix "Numeric.BLAS.Vector:372: " {-# LINE 372 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 372 "src/Numeric/BLAS/Vector.hs" #-} cyclicVectorFromList [1,3,2] == Vector.cyclicReverse (cyclicVectorFromList [1,2,3]) ) DocTest.printPrefix "Numeric.BLAS.Vector:373: " {-# LINE 373 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 373 "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:375: " {-# LINE 375 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 375 "src/Numeric/BLAS/Vector.hs" #-} forCyclicVector number_ $ \xs -> xs == Vector.cyclicReverse (Vector.cyclicReverse xs) ) DocTest.printPrefix "Numeric.BLAS.Vector:376: " {-# LINE 376 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 376 "src/Numeric/BLAS/Vector.hs" #-} forCyclicVector number_ $ \xs -> let is = Shape.indices $ Array.shape xs in not (null is) ==> QC.forAll (QC.elements is) $ \i -> xs!i == Vector.cyclicReverse xs ! (-i) ) DocTest.printPrefix "Numeric.BLAS.Vector:399: " {-# LINE 399 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 399 "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:426: " {-# LINE 426 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 426 "src/Numeric/BLAS/Vector.hs" #-} forVector2 number_ $ \xs ys -> Vector.dot xs ys == Matrix.multiply (Matrix.singleRow xs) (Matrix.singleColumn ys) ! ((),()) ) DocTest.printPrefix "Numeric.BLAS.Vector:433: " {-# LINE 433 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 433 "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.dot (Vector.unit (shapeInt dim) i) (Vector.unit (shapeInt dim) j) == (fromIntegral (fromEnum (i==j)) :: Number_) ) DocTest.printPrefix "Numeric.BLAS.Vector:459: " {-# LINE 459 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 459 "src/Numeric/BLAS/Vector.hs" #-} forVector2 number_ $ \xs ys -> Vector.inner xs ys == Vector.dot (Vector.conjugate xs) ys ) DocTest.printPrefix "Numeric.BLAS.Vector:512: " {-# LINE 512 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 512 "src/Numeric/BLAS/Vector.hs" #-} forVector number_ $ \xs -> Vector.sum xs == List.sum (Vector.toList xs) ) DocTest.printPrefix "Numeric.BLAS.Vector:587: " {-# LINE 587 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 587 "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:611: " {-# LINE 611 "src/Numeric/BLAS/Vector.hs" #-} DocTest.example( {-# LINE 611 "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:614: " {-# LINE 614 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 614 "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:615: " {-# LINE 615 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 615 "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:620: " {-# LINE 620 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 620 "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:673: " {-# LINE 673 "src/Numeric/BLAS/Vector.hs" #-} DocTest.example( {-# LINE 673 "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:676: " {-# LINE 676 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 676 "src/Numeric/BLAS/Vector.hs" #-} forVector real_ $ \xs -> isNonEmpty xs ==> Vector.argAbsMaximum xs == Vector.argAbs1Maximum xs ) DocTest.printPrefix "Numeric.BLAS.Vector:709: " {-# LINE 709 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 709 "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:725: " {-# LINE 725 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 725 "src/Numeric/BLAS/Vector.hs" #-} forVector real_ $ \xs -> isNonEmpty xs ==> Vector.minimum xs == List.minimum (Vector.toList xs) ) DocTest.printPrefix "Numeric.BLAS.Vector:726: " {-# LINE 726 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 726 "src/Numeric/BLAS/Vector.hs" #-} forVector real_ $ \xs -> isNonEmpty xs ==> Vector.maximum xs == List.maximum (Vector.toList xs) ) DocTest.printPrefix "Numeric.BLAS.Vector:727: " {-# LINE 727 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 727 "src/Numeric/BLAS/Vector.hs" #-} forVector real_ $ \xs -> isNonEmpty xs ==> - Vector.maximum xs == Vector.minimum (Vector.negate xs) ) DocTest.printPrefix "Numeric.BLAS.Vector:743: " {-# LINE 743 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 743 "src/Numeric/BLAS/Vector.hs" #-} forVector real_ $ \xs -> isNonEmpty xs ==> Vector.limits xs == Array.limits xs ) DocTest.printPrefix "Numeric.BLAS.Vector:773: " {-# LINE 773 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 773 "src/Numeric/BLAS/Vector.hs" #-} forVector number_ $ \xs -> Vector.negate xs == Vector.scale minusOne xs ) DocTest.printPrefix "Numeric.BLAS.Vector:774: " {-# LINE 774 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 774 "src/Numeric/BLAS/Vector.hs" #-} forVector number_ $ \xs -> Vector.scale 2 xs == xs |+| xs ) DocTest.printPrefix "Numeric.BLAS.Vector:843: " {-# LINE 843 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 843 "src/Numeric/BLAS/Vector.hs" #-} forVector2 number_ $ \xs ys -> xs |+| ys == ys |+| xs ) DocTest.printPrefix "Numeric.BLAS.Vector:844: " {-# LINE 844 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 844 "src/Numeric/BLAS/Vector.hs" #-} forVector2 number_ $ \xs ys -> xs == xs |-| ys |+| ys ) DocTest.printPrefix "Numeric.BLAS.Vector:856: " {-# LINE 856 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 856 "src/Numeric/BLAS/Vector.hs" #-} QC.forAll number_ $ \a -> forVector2 number_ $ \xs ys -> Vector.mac a xs ys == Vector.scale a xs |+| ys ) DocTest.printPrefix "Numeric.BLAS.Vector:877: " {-# LINE 877 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 877 "src/Numeric/BLAS/Vector.hs" #-} forVector number_ $ \xs -> xs == Vector.negate (Vector.negate xs) ) DocTest.printPrefix "Numeric.BLAS.Vector:890: " {-# LINE 890 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 890 "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:907: " {-# LINE 907 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 907 "src/Numeric/BLAS/Vector.hs" #-} forVector2 number_ $ \xs ys -> Vector.mul xs ys == Vector.mul ys xs ) DocTest.printPrefix "Numeric.BLAS.Vector:915: " {-# LINE 915 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 915 "src/Numeric/BLAS/Vector.hs" #-} forVector2 number_ $ \xs ys -> Vector.mulConj xs ys == Vector.mul (Vector.conjugate xs) ys ) DocTest.printPrefix "Numeric.BLAS.Vector:939: " {-# LINE 939 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 939 "src/Numeric/BLAS/Vector.hs" #-} forVector2 number_ $ \xs ys -> let xrs = Vector.realPart xs in Vector.mulReal xrs ys == Vector.mul (Vector.fromReal xrs) ys ) DocTest.printPrefix "Numeric.BLAS.Vector:961: " {-# LINE 961 "src/Numeric/BLAS/Vector.hs" #-} DocTest.property( {-# LINE 961 "src/Numeric/BLAS/Vector.hs" #-} forVector2 number_ $ \xs ys -> let xrs = Vector.realPart xs in Vector.mulRealConj xrs ys == Vector.mul (Vector.fromReal xrs) (Vector.conjugate ys) )