lol-0.2.0.0: benchmarks/CycBenches.hs
{-# LANGUAGE DataKinds, FlexibleContexts,
NoImplicitPrelude, RebindableSyntax,
ScopedTypeVariables, TypeFamilies,
TypeOperators, UndecidableInstances #-}
module CycBenches (cycBenches) where
import Benchmarks
import Harness.Cyc
import Utils
import Control.Monad.Random
import Crypto.Lol
import Crypto.Lol.Types.Random
import Crypto.Random.DRBG
import Data.Singletons
import Data.Promotion.Prelude.List
import Data.Promotion.Prelude.Eq
import Data.Singletons.TypeRepStar
cycBenches :: (MonadRandom m) => m Benchmark
cycBenches = benchGroup "Cyc" [
benchGroup "*" $ applyBasic (Proxy::Proxy AllParams) $ hideArgs bench_mul,
benchGroup "crt" $ applyBasic (Proxy::Proxy AllParams) $ hideArgs bench_crt,
benchGroup "crtInv" $ applyBasic (Proxy::Proxy AllParams) $ hideArgs bench_crtInv,
benchGroup "l" $ applyBasic (Proxy::Proxy AllParams) $ hideArgs bench_l,
benchGroup "*g Pow" $ applyBasic (Proxy::Proxy AllParams) $ hideArgs bench_mulgPow,
benchGroup "*g CRT" $ applyBasic (Proxy::Proxy AllParams) $ hideArgs bench_mulgCRT,
benchGroup "lift" $ applyLift (Proxy::Proxy LiftParams) $ hideArgs bench_liftPow,
benchGroup "error" $ applyError (Proxy::Proxy ErrorParams) $ hideArgs $ bench_errRounded 0.1,
benchGroup "twace" $ applyTwoIdx (Proxy::Proxy TwoIdxParams) $ hideArgs bench_twacePow,
benchGroup "embed" $ applyTwoIdx (Proxy::Proxy TwoIdxParams) $ hideArgs bench_embedPow
]
-- no CRT conversion, just coefficient-wise multiplication
bench_mul :: (BasicCtx t m r) => Cyc t m r -> Cyc t m r -> Bench '(t,m,r)
bench_mul a b =
let a' = adviseCRT a
b' = adviseCRT b
in bench (a' *) b'
-- convert input from Pow basis to CRT basis
bench_crt :: (BasicCtx t m r) => Cyc t m r -> Bench '(t,m,r)
bench_crt x = let y = advisePow x in bench adviseCRT y
-- convert input from CRT basis to Pow basis
bench_crtInv :: (BasicCtx t m r) => Cyc t m r -> Bench '(t,m,r)
bench_crtInv x = let y = adviseCRT x in bench advisePow y
-- convert input from Dec basis to Pow basis
bench_l :: (BasicCtx t m r) => Cyc t m r -> Bench '(t,m,r)
bench_l x = let y = adviseDec x in bench advisePow y
-- lift an element in the Pow basis
bench_liftPow :: forall t m r . (LiftCtx t m r) => Cyc t m r -> Bench '(t,m,r)
bench_liftPow x = let y = advisePow x in bench (liftCyc Pow :: Cyc t m r -> Cyc t m (LiftOf r)) y
-- multiply by g when input is in Pow basis
bench_mulgPow :: (BasicCtx t m r) => Cyc t m r -> Bench '(t,m,r)
bench_mulgPow x = let y = advisePow x in bench mulG y
-- multiply by g when input is in CRT basis
bench_mulgCRT :: (BasicCtx t m r) => Cyc t m r -> Bench '(t,m,r)
bench_mulgCRT x = let y = adviseCRT x in bench mulG y
-- generate a rounded error term
bench_errRounded :: forall t m r gen . (ErrorCtx t m r gen)
=> Double -> Bench '(t,m,r,gen)
bench_errRounded v = benchIO $ do
gen <- newGenIO
return $ evalRand (errorRounded v :: Rand (CryptoRand gen) (Cyc t m (LiftOf r))) gen
bench_twacePow :: forall t m m' r . (TwoIdxCtx t m m' r)
=> Cyc t m' r -> Bench '(t,m,m',r)
bench_twacePow x =
let y = advisePow x
in bench (twace :: Cyc t m' r -> Cyc t m r) y
bench_embedPow :: forall t m m' r . (TwoIdxCtx t m m' r)
=> Cyc t m r -> Bench '(t,m,m',r)
bench_embedPow x =
let y = advisePow x
in bench (embed :: Cyc t m r -> Cyc t m' r) y
type Tensors = '[CT,RT]
type MM'RCombos =
'[ '(F4, F128, Zq 257),
'(F1, PToF Prime281, Zq 563),
'(F12, F32 * F9, Zq 512),
'(F12, F32 * F9, Zq 577),
'(F12, F32 * F9, Zq (577 ** 1153)),
'(F12, F32 * F9, Zq (577 ** 1153 ** 2017)),
'(F12, F32 * F9, Zq (577 ** 1153 ** 2017 ** 2593)),
'(F12, F32 * F9, Zq (577 ** 1153 ** 2017 ** 2593 ** 3169)),
'(F12, F32 * F9, Zq (577 ** 1153 ** 2017 ** 2593 ** 3169 ** 3457)),
'(F12, F32 * F9, Zq (577 ** 1153 ** 2017 ** 2593 ** 3169 ** 3457 ** 6337)),
'(F12, F32 * F9, Zq (577 ** 1153 ** 2017 ** 2593 ** 3169 ** 3457 ** 6337 ** 7489)),
'(F12, F32 * F9 * F25, Zq 14401)
]
-- EAC: must be careful where we use Nub: apparently TypeRepStar doesn't work well with the Tensor constructors
type AllParams = ( '(,) <$> Tensors) <*> (Nub (Map RemoveM MM'RCombos))
type LiftParams = ( '(,) <$> Tensors) <*> (Nub (Filter Liftable (Map RemoveM MM'RCombos)))
type TwoIdxParams = ( '(,) <$> Tensors) <*> MM'RCombos
type ErrorParams = ( '(,) <$> '[HashDRBG]) <*> LiftParams
data Liftable :: TyFun (Factored, *) Bool -> *
type instance Apply Liftable '(m',r) = Int64 :== (LiftOf r)
data RemoveM :: TyFun (Factored, Factored, *) (Factored, *) -> *
type instance Apply RemoveM '(m,m',r) = '(m',r)