module Crypto.Lol.Benchmarks.TensorBenches (tensorBenches1, tensorBenches2) where
import Control.Applicative
import Control.Monad.Random hiding (lift)
import Crypto.Lol.Benchmarks
import Crypto.Lol.Prelude
import Crypto.Lol.Cyclotomic.Tensor
import Crypto.Lol.Types
import Crypto.Random
tensorBenches1 :: (Monad rnd, _) => Proxy '(t,m,r) -> Proxy gen -> rnd Benchmark
tensorBenches1 ptmr pgen = benchGroup "Tensor" $ ($ ptmr) <$> [
genBenchArgs "unzipPow" bench_unzip,
genBenchArgs "unzipDec" bench_unzip,
genBenchArgs "unzipCRT" bench_unzip,
genBenchArgs "zipWith (*)" bench_mul,
genBenchArgs "crt" bench_crt,
genBenchArgs "crtInv" bench_crtInv,
genBenchArgs "l" bench_l,
genBenchArgs "lInv" bench_lInv,
genBenchArgs "*g Pow" bench_mulgPow,
genBenchArgs "*g Dec" bench_mulgDec,
genBenchArgs "*g CRT" bench_mulgCRT,
genBenchArgs "divg Pow" bench_divgPow,
genBenchArgs "divg Dec" bench_divgDec,
genBenchArgs "divg CRT" bench_divgCRT,
genBenchArgs "lift" bench_liftPow,
genBenchArgs "error" (bench_errRounded 0.1) . addGen pgen
]
tensorBenches2 :: (Monad rnd, _) => Proxy '(t,m,m',r) -> rnd Benchmark
tensorBenches2 p = benchGroup "Tensor" $ ($ p) <$> [
genBenchArgs "twacePow" bench_twacePow,
genBenchArgs "twaceDec" bench_twacePow,
genBenchArgs "twaceCRT" bench_twaceCRT,
genBenchArgs "embedPow" bench_embedPow,
genBenchArgs "embedDec" bench_embedDec,
genBenchArgs "embedCRT" bench_embedCRT
]
bench_unzip :: _ => t m (r,r) -> Bench '(t,m,r)
bench_unzip = bench unzipT
bench_mul :: _ => t m r -> t m r -> Bench '(t,m,r)
bench_mul a = bench (zipWithT (*) a)
bench_crt :: _ => t m r -> Bench '(t,m,r)
bench_crt = bench (fromJust' "TensorBenches.bench_crt" crt)
bench_crtInv :: _ => t m r -> Bench '(t,m,r)
bench_crtInv = bench (fromJust' "TensorBenches.bench_crtInv" crtInv)
bench_l :: _ => t m r -> Bench '(t,m,r)
bench_l = bench l
bench_lInv :: _ => t m r -> Bench '(t,m,r)
bench_lInv = bench lInv
bench_liftPow :: _ => t m r -> Bench '(t,m,r)
bench_liftPow = bench (fmapT lift)
bench_mulgPow :: _ => t m r -> Bench '(t,m,r)
bench_mulgPow = bench mulGPow
bench_mulgDec :: _ => t m r -> Bench '(t,m,r)
bench_mulgDec = bench mulGDec
bench_mulgCRT :: _ => t m r -> Bench '(t,m,r)
bench_mulgCRT = bench (fromJust' "TensorBenches.bench_mulgCRT" mulGCRT)
bench_divgPow :: _ => t m r -> Bench '(t,m,r)
bench_divgPow = bench divGPow . mulGPow
bench_divgDec :: _ => t m r -> Bench '(t,m,r)
bench_divgDec = bench divGDec . mulGDec
bench_divgCRT :: _ => t m r -> Bench '(t,m,r)
bench_divgCRT = bench (fromJust' "TensorBenches.bench_divgCRT" divGCRT)
bench_errRounded :: forall t m r gen . (TElt t r, Fact m, CryptoRandomGen gen, _)
=> Double -> Bench '(t,m,r,gen)
bench_errRounded v = benchIO $ do
gen <- newGenIO
return $ evalRand
(fmapT (roundMult one) <$>
(tGaussianDec v :: Rand (CryptoRand gen) (t m Double)) :: Rand (CryptoRand gen) (t m (LiftOf r))) gen
bench_twacePow :: forall t m m' r . (Tensor t, TElt t r, Fact m, _)
=> t m' r -> Bench '(t,m,m',r)
bench_twacePow = bench (twacePowDec :: t m' r -> t m r)
bench_twaceCRT :: forall t m m' r . (Tensor t, TElt t r, Fact m, _)
=> t m' r -> Bench '(t,m,m',r)
bench_twaceCRT = bench (fromJust' "TensorBenches.bench_twaceCRT" twaceCRT :: t m' r -> t m r)
bench_embedPow :: forall t m m' r . (Tensor t, TElt t r, Fact m', _)
=> t m r -> Bench '(t,m,m',r)
bench_embedPow = bench (embedPow :: t m r -> t m' r)
bench_embedDec :: forall t m m' r . (Tensor t, TElt t r, Fact m', _)
=> t m r -> Bench '(t,m,m',r)
bench_embedDec = bench (embedDec :: t m r -> t m' r)
bench_embedCRT :: forall t m m' r . (Tensor t, TElt t r, Fact m', _)
=> t m r -> Bench '(t,m,m',r)
bench_embedCRT = bench (fromJust' "TensorBenches.bench_embedCRT" embedCRT :: t m r -> t m' r)