{-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-} {-# LANGUAGE GADTs #-} module Test.Mosaic ( testsVar, Property(..), genIdentity, repack, ) where import qualified Test.Multiply as Multiply import qualified Test.Generator as Gen import Test.Utility (Tagged) import qualified Numeric.LAPACK.Matrix.Array as ArrMatrix import qualified Numeric.LAPACK.Matrix.Shape.Omni as Omni import qualified Numeric.LAPACK.Matrix.Shape as MatrixShape import qualified Numeric.LAPACK.Matrix.Layout as Layout import Numeric.LAPACK.Matrix (ShapeInt) import Numeric.LAPACK.Scalar (RealOf) import qualified Numeric.Netlib.Class as Class import qualified Data.Array.Comfort.Shape as Shape import Control.Applicative ((<$>)) import qualified Test.QuickCheck as QC data Property property lower upper where Symmetric :: Property Omni.Symmetric MatrixShape.Filled MatrixShape.Filled Hermitian :: Property Omni.HermitianUnknownDefiniteness MatrixShape.Filled MatrixShape.Filled Diagonal :: (MatrixShape.TriDiag diag) => Property diag MatrixShape.Empty MatrixShape.Empty Lower :: (MatrixShape.TriDiag diag) => Property diag MatrixShape.Filled MatrixShape.Empty Upper :: (MatrixShape.TriDiag diag) => Property diag MatrixShape.Empty MatrixShape.Filled genMosaic :: (sh ~ ShapeInt, Class.Floating a, RealOf a ~ ar, Class.Real ar) => Property prop lo up -> Layout.PackingSingleton pack -> Gen.Square sh a (ArrMatrix.Quadratic pack prop lo up sh a) genMosaic prop p = case prop of Symmetric -> repack p <$> Gen.symmetric Hermitian -> repack p <$> Gen.hermitian Diagonal -> repack p <$> Gen.triangular Lower -> repack p <$> Gen.triangular Upper -> repack p <$> Gen.triangular genIdentity :: (sh ~ ShapeInt, Class.Floating a, RealOf a ~ ar, Class.Real ar) => Property prop lo up -> Layout.PackingSingleton pack -> Gen.Square sh a (ArrMatrix.Quadratic pack prop lo up sh a) genIdentity prop p = case prop of Symmetric -> repack p <$> Gen.identity `asTypeOf` Gen.symmetric Hermitian -> repack p <$> Gen.identity `asTypeOf` Gen.hermitian Diagonal -> repack p <$> Gen.triangularIdentity Lower -> repack p <$> Gen.identity `asTypeOf` Gen.triangular Upper -> repack p <$> Gen.identity `asTypeOf` Gen.triangular repack :: (Shape.C sh, Class.Floating a) => Layout.PackingSingleton pack -> ArrMatrix.Quadratic Layout.Packed prop lo up sh a -> ArrMatrix.Quadratic pack prop lo up sh a repack pack m = case pack of Layout.Packed -> m Layout.Unpacked -> ArrMatrix.unpack m testsVar :: (MatrixShape.Property prop, MatrixShape.PowerStrip lo, MatrixShape.PowerStrip up) => (Layout.Packing pack) => (Show a, Class.Floating a, Eq a, RealOf a ~ ar, Class.Real ar) => Property prop lo up -> Layout.PackingSingleton pack -> [(String, Tagged a QC.Property)] testsVar prop p = Multiply.testsVar (genIdentity prop p) (genMosaic prop p)