module Numeric.LinearAlgebra.Tests.Instances(
Sq(..), rSq,cSq,
Rot(..), rRot,cRot,
Her(..), rHer,cHer,
WC(..), rWC,cWC,
SqWC(..), rSqWC, cSqWC,
PosDef(..), rPosDef, cPosDef,
RM,CM, rM,cM
) where
import Numeric.LinearAlgebra
import Test.QuickCheck
import Control.Monad(replicateM)
instance (Arbitrary a, RealFloat a) => Arbitrary (Complex a) where
arbitrary = do
r <- arbitrary
i <- arbitrary
return (r:+i)
coarbitrary = undefined
chooseDim = sized $ \m -> choose (1,max 1 m)
instance (Field a, Arbitrary a) => Arbitrary (Vector a) where
arbitrary = do m <- chooseDim
l <- vector m
return $ fromList l
coarbitrary = undefined
instance (Element a, Arbitrary a) => Arbitrary (Matrix a) where
arbitrary = do
m <- chooseDim
n <- chooseDim
l <- vector (m*n)
return $ (m><n) l
coarbitrary = undefined
newtype (Sq a) = Sq (Matrix a) deriving Show
instance (Element a, Arbitrary a) => Arbitrary (Sq a) where
arbitrary = do
n <- chooseDim
l <- vector (n*n)
return $ Sq $ (n><n) l
coarbitrary = undefined
newtype (Rot a) = Rot (Matrix a) deriving Show
instance (Field a, Arbitrary a) => Arbitrary (Rot a) where
arbitrary = do
Sq m <- arbitrary
let (q,_) = qr m
return (Rot q)
coarbitrary = undefined
newtype (Her a) = Her (Matrix a) deriving Show
instance (Field a, Arbitrary a) => Arbitrary (Her a) where
arbitrary = do
Sq m <- arbitrary
let m' = m/2
return $ Her (m' + ctrans m')
coarbitrary = undefined
newtype (WC a) = WC (Matrix a) deriving Show
instance (Field a, Arbitrary a) => Arbitrary (WC a) where
arbitrary = do
m <- arbitrary
let (u,_,v) = svd m
r = rows m
c = cols m
n = min r c
sv <- replicateM n (choose (1,100))
let s = diagRect (fromList sv) r c
return $ WC (u <> real s <> trans v)
coarbitrary = undefined
newtype (SqWC a) = SqWC (Matrix a) deriving Show
instance (Field a, Arbitrary a) => Arbitrary (SqWC a) where
arbitrary = do
Sq m <- arbitrary
let (u,_,v) = svd m
n = rows m
sv <- replicateM n (choose (1,100))
let s = diag (fromList sv)
return $ SqWC (u <> real s <> trans v)
coarbitrary = undefined
newtype (PosDef a) = PosDef (Matrix a) deriving Show
instance (Field a, Arbitrary a) => Arbitrary (PosDef a) where
arbitrary = do
Her m <- arbitrary
let (_,v) = eigSH m
n = rows m
l <- replicateM n (choose (0,100))
let s = diag (fromList l)
p = v <> real s <> ctrans v
return $ PosDef (0.5 .* p + 0.5 .* ctrans p)
coarbitrary = undefined
type RM = Matrix Double
type CM = Matrix (Complex Double)
rM m = m :: RM
cM m = m :: CM
rHer (Her m) = m :: RM
cHer (Her m) = m :: CM
rRot (Rot m) = m :: RM
cRot (Rot m) = m :: CM
rSq (Sq m) = m :: RM
cSq (Sq m) = m :: CM
rWC (WC m) = m :: RM
cWC (WC m) = m :: CM
rSqWC (SqWC m) = m :: RM
cSqWC (SqWC m) = m :: CM
rPosDef (PosDef m) = m :: RM
cPosDef (PosDef m) = m :: CM