packages feed

lapack-0.3: test/Test/Generic.hs

{-# LANGUAGE TypeFamilies #-}
module Test.Generic where

import qualified Test.Generator as Gen
import qualified Test.Logic as Logic
import Test.Generator ((<#*|>), (<#=#>))
import Test.Utility (approxVector)

import qualified Numeric.LAPACK.Matrix.Shape as MatrixShape
import qualified Numeric.LAPACK.Matrix.Array as ArrMatrix
import qualified Numeric.LAPACK.Matrix as Matrix
import Numeric.LAPACK.Matrix.Array (ArrayMatrix)
import Numeric.LAPACK.Matrix (ShapeInt, (#*|), (#+#), (#-#))
import Numeric.LAPACK.Vector (Vector, (|+|), (|-|))
import Numeric.LAPACK.Scalar (RealOf)

import qualified Numeric.Netlib.Class as Class

import qualified Data.Array.Comfort.Shape as Shape

import Control.Applicative ((<$>))


forceOrder ::
   (ArrMatrix.ShapeOrder shape, ArrMatrix.MultiplyVector shape,
    MatrixShape.HeightOf shape ~ height, Shape.C height, Eq height,
    MatrixShape.WidthOf shape ~ width, width ~ ShapeInt,
    Class.Floating a, RealOf a ~ ar, Class.Real ar) =>
   MatrixShape.Order ->
   (ArrayMatrix shape a, Vector width a) -> Bool
forceOrder order (a,x) =
   let ao = Matrix.forceOrder order a
   in ArrMatrix.shapeOrder (ArrMatrix.shape ao) == order
      &&
      approxVector (a #*| x) (ao #*| x)


genDistribution ::
   (Logic.Dim height, Eq height, Logic.Dim width, Eq width, Class.Floating a) =>
   Gen.Matrix height width a matrix ->
   Gen.Vector height a ((matrix, matrix), Vector width a)
genDistribution gen = (,) <$> ((,) <$> gen <#=#> gen) <#*|> Gen.vector

addDistributive, subDistributive ::
   (ArrMatrix.Additive shape, ArrMatrix.MultiplyVector shape,
    MatrixShape.HeightOf shape ~ height, Shape.C height, Eq height,
    MatrixShape.WidthOf shape ~ width, width ~ ShapeInt,
    Class.Floating a, RealOf a ~ ar, Class.Real ar) =>
   ((ArrayMatrix shape a, ArrayMatrix shape a), Vector width a) ->
   Bool
addDistributive ((a,b),x) = approxVector ((a#+#b) #*| x) (a#*|x |+| b#*|x)
subDistributive ((a,b),x) = approxVector ((a#-#b) #*| x) (a#*|x |-| b#*|x)