packages feed

fpnla-examples-0.1: src-test/TestLAPACK.hs

{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE OverlappingInstances #-}

module Main (

    main,

) where

import Test.QuickCheck (Arbitrary, quickCheckResult)
import Data.Tagged (Tagged(Tagged, unTagged))
import Data.Default (Default(def))
import System.Random (Random)

--import qualified Data.Array as A (Array)
--import qualified Data.Array.Repa as R (D, DIM1, DIM2, Array)
import qualified Data.Packed.Matrix as HM (Matrix)
import qualified Data.Packed.Vector as HV (Vector)

import TestBase (Truncable, PotrfTestData(..), Tag2(), eqMatrix, handleResult)

import FPNLA.Matrix.Instances.RepaMatrix(RepaMatrix, RepaVector)
import FPNLA.Matrix.Instances.HMatrix ()
import FPNLA.Operations.Parameters (ResM, getResultDataM, StratCtx)
import FPNLA.Operations.LAPACK.Strategies (HMatrixBindSeq, CholLLVSeq, CholLLVPar_Repa, CholLLVBlocksSeq)
import FPNLA.Operations.BLAS.Strategies (DefSeq, DefPar_ST)
import FPNLA.Operations.LAPACK (POTRF(potrf))

-- Propiedades:
propPotrfIsOK :: forall st m v e. (Show e, Eq e, Truncable e, Arbitrary e, Random e, POTRF st m v e, Default (Tagged st (StratCtx st)), POTRF HMatrixBindSeq m v e) => PotrfTestData m e -> Tagged (Tag2 st v) Bool
propPotrfIsOK (PotrfTestData pmA) = Tagged $ eqMatrix r1 r2
    where
        r1 = getResultDataM (potrf (unTagged (def :: Tagged st (StratCtx st))) pmA :: ResM st v m e)
        r2 = getResultDataM (potrf (unTagged (def :: Tagged HMatrixBindSeq (StratCtx HMatrixBindSeq))) pmA :: ResM HMatrixBindSeq v m e)

type TMatrix = {-VMatrix-} {--VMatrix--} HM.Matrix {-LLR.LLMatrix-} {-RepaMatrix-}
type TVector = {-VVector-} {--A.Array Int--} HV.Vector {-LLR.LVector-} {-RepaVector-}
--type TElem = Complex Double
type TElem = Double

propTest :: PotrfTestData HM.Matrix Double -> Tagged (Tag2 HMatrixBindSeq HV.Vector) Bool
propTest = propPotrfIsOK

propPotrfDefSeqStratIsOK_Inst :: PotrfTestData TMatrix TElem -> Tagged (Tag2 (CholLLVSeq DefSeq DefSeq) TVector) Bool
propPotrfDefSeqStratIsOK_Inst = propPotrfIsOK

propPotrfRepaDefSeqStratIsOK_Inst :: PotrfTestData RepaMatrix TElem -> Tagged (Tag2 (CholLLVPar_Repa DefSeq DefSeq) RepaVector) Bool
propPotrfRepaDefSeqStratIsOK_Inst = propPotrfIsOK

propPotrfCholLLVBlocksSeqStratIsOK_Inst :: PotrfTestData TMatrix TElem -> Tagged (Tag2 (CholLLVBlocksSeq DefPar_ST DefSeq DefSeq (CholLLVSeq DefSeq DefSeq)) TVector) Bool
propPotrfCholLLVBlocksSeqStratIsOK_Inst = propPotrfIsOK

execPotrfQC :: IO [()]
execPotrfQC = do
    putStrLn "execPotrfQC"
    res1 <- quickCheckResult propTest
    res2 <- quickCheckResult propPotrfDefSeqStratIsOK_Inst
    res3 <- quickCheckResult propPotrfRepaDefSeqStratIsOK_Inst
    res4 <- quickCheckResult propPotrfCholLLVBlocksSeqStratIsOK_Inst
    mapM handleResult [res1, res2, res3, res4]

execQuickCheck :: IO [()]
execQuickCheck = execPotrfQC

main :: IO [()]
main = execQuickCheck