packages feed

linear-massiv-0.1.0.0: bench/Bench/Orthogonal.hs

{-# LANGUAGE AllowAmbiguousTypes #-}

module Bench.Orthogonal (orthogonalBenchmarks) where

import Criterion.Main
import qualified Data.Massiv.Array as M
import GHC.TypeNats (KnownNat)

import Numeric.LinearAlgebra.Massiv.Types
import Numeric.LinearAlgebra.Massiv.Internal
import Numeric.LinearAlgebra.Massiv.Orthogonal.QR (qr, qrGivens)

mkMatP :: forall m n. (KnownNat m, KnownNat n) => Matrix m n M.P Double
mkMatP = makeMatrix @m @n @M.P $ \i j -> fromIntegral (i * 7 + j * 3 + 1) / 100.0

orthogonalBenchmarks :: [Benchmark]
orthogonalBenchmarks =
  [ bgroup "qr-householder"
    [ bench "10x10/P"  $ nf qr (mkMatP @10 @10)
    , bench "50x50/P"  $ nf qr (mkMatP @50 @50)
    , bench "100x100/P" $ nf qr (mkMatP @100 @100)
    ]
  , bgroup "qr-givens"
    [ bench "10x10/P"  $ nf qrGivens (mkMatP @10 @10)
    , bench "50x50/P"  $ nf qrGivens (mkMatP @50 @50)
    ]
  ]