packages feed

lapack-0.4: 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, equalArray)

import qualified Numeric.LAPACK.Matrix.Shape as MatrixShape
import qualified Numeric.LAPACK.Matrix.Array as ArrMatrix
import qualified Numeric.LAPACK.Matrix.Extent as Extent
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 ::
   (MatrixShape.Packing pack, MatrixShape.Property property,
    MatrixShape.Strip lower, MatrixShape.Strip upper,
    Extent.Measure meas, Extent.C vert, Extent.C horiz,
    Shape.C height, Eq height, width ~ ShapeInt,
    Class.Floating a, RealOf a ~ ar, Class.Real ar) =>
   MatrixShape.Order ->
   (ArrayMatrix pack property lower upper meas vert horiz height width a,
    Vector width a) ->
   Bool
forceOrder order (a,x) =
   let ao = Matrix.forceOrder order a
   in ArrMatrix.order ao == order
      &&
      approxVector (a #*| x) (ao #*| x)

forceOrderInverse ::
   (Extent.Measure meas, Extent.C vert, Extent.C horiz,
    Shape.C height, Eq height, width ~ ShapeInt,
    Class.Floating a, RealOf a ~ ar, Class.Real ar) =>
   ArrayMatrix pack property lower upper meas vert horiz height width a -> Bool
forceOrderInverse a =
   let order = ArrMatrix.order a
   in equalArray a $
         Matrix.forceOrder order $
         Matrix.forceOrder (MatrixShape.flipOrder order) a


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

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 = genDistribution2 ((,) <$> gen <#=#> gen)

addDistributive, subDistributive ::
   (MatrixShape.Packing pack, ArrMatrix.Subtractive property,
    MatrixShape.Strip lower, MatrixShape.Strip upper,
    Extent.Measure meas, Extent.C vert, Extent.C horiz,
    Shape.C height, Eq height, width ~ ShapeInt,
    Class.Floating a, RealOf a ~ ar, Class.Real ar,
    ArrayMatrix pack property lower upper meas vert horiz height width a ~
      matrix) =>
   ((matrix, matrix), 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)