packages feed

lapack-0.3: test/Test/Multiply.hs

{-# LANGUAGE TypeFamilies #-}
module Test.Multiply (
   multiplySquare,
   squareSquare,
   power,
   ) where

import qualified Test.Utility as Util

import qualified Numeric.LAPACK.Matrix.Square as Square
import qualified Numeric.LAPACK.Matrix.Array as ArrMatrix
import qualified Numeric.LAPACK.Matrix as Matrix
import qualified Numeric.LAPACK.Vector as Vector
import Numeric.LAPACK.Matrix (Matrix, ShapeInt, (#*##))
import Numeric.LAPACK.Scalar (RealOf)

import qualified Numeric.Netlib.Class as Class



multiplySquare ::
   (Matrix.Power typ, Matrix.MultiplySquare typ,
    Matrix.SquareShape typ, Matrix.HeightOf typ ~ ShapeInt,
    Class.Floating a, RealOf a ~ ar, Class.Real ar) =>
   Matrix typ a -> Bool
multiplySquare a =
   Util.approxArray -- (Scalar.selectReal 1e-1 1e-5)
      (Matrix.toSquare $ Matrix.square a)
      (a #*## Matrix.toSquare a)

squareSquare ::
   (Matrix.Power typ, Matrix.MultiplySquare typ,
    Matrix.SquareShape typ, Matrix.HeightOf typ ~ ShapeInt,
    Class.Floating a, RealOf a ~ ar, Class.Real ar) =>
   Matrix typ a -> Bool
squareSquare a =
   Util.approxArray -- (Scalar.selectReal 1e-1 1e-5)
      (Matrix.toSquare $ Matrix.square a)
      (Square.square $ Matrix.toSquare a)

power ::
   (Matrix.Power typ, Matrix.MultiplySquare typ,
    Matrix.SquareShape typ, Matrix.HeightOf typ ~ ShapeInt,
    Class.Floating a, RealOf a ~ ar, Class.Real ar) =>
   Int -> Matrix typ a -> Bool
power n a =
   let b = Matrix.toSquare (Matrix.power (n+1) a)
       c = a #*## Matrix.toSquare (Matrix.power n a)
       normInf1 = Vector.normInf1 . ArrMatrix.toVector
   in Util.approxArrayTol (1e-6 * (normInf1 b + normInf1 c)) b c