content: {-|
  Module      : Crypto.Lol.Applications.Benchmarks.Default
  Description : Default benchmarks for lol-apps.
  Copyright   : (c) Eric Crockett, 2011-2017
                    Chris Peikert, 2011-2017
  License     : GPL-3
  Maintainer  : ecrockett0@gmail.com
  Stability   : experimental
  Portability : POSIX
  
  Mostly-monomorphized benchmarks for lol-apps.
  -}
  
  {-# LANGUAGE DataKinds             #-}
  {-# LANGUAGE FlexibleContexts      #-}
  {-# LANGUAGE NoStarIsType          #-}
  {-# LANGUAGE PartialTypeSignatures #-}
  {-# LANGUAGE PolyKinds             #-}
  {-# LANGUAGE QuantifiedConstraints #-}
  {-# LANGUAGE ScopedTypeVariables   #-}
  {-# LANGUAGE TypeFamilies          #-}
  {-# LANGUAGE TypeOperators         #-}
  
  {-# OPTIONS_GHC -fno-warn-partial-type-signatures #-}
  
  module Crypto.Lol.Applications.Benchmarks.Default
   ( defaultBGVBenches
   , defaultKHPRFBenches
   ) where
  
  import Control.DeepSeq (NFData)
  
  import Crypto.Lol
  import Crypto.Lol.Applications.Benchmarks.KHPRFBenches
  import Crypto.Lol.Applications.Benchmarks.BGVBenches
  import Crypto.Lol.Benchmarks                           (type (**),
                                                          Benchmark, Zq,
                                                          bgroup)
  
  defaultBGVBenches :: (forall m r . (Fact m, NFData r) => NFData (t m r), _)
                    => Proxy t -> Proxy gad -> Proxy gen -> rnd [Benchmark]
  defaultBGVBenches pt pgad pgen  = sequence [
    fmap (bgroup "BGV") $ sequence $ ($ pt) . ($ pgen) <$>
      [bgvBenches (Proxy::Proxy '(F16, F1024, Zq 8,  Zq 1017857)),
       bgvBenches (Proxy::Proxy '(F16, F2048, Zq 16, Zq 1017857))],
    fmap (bgroup "Dec") $ sequence $ ($ pt) <$>
      [decBenches (Proxy::Proxy '(F16, F1024, Zq 8,  Zq 1017857)),
       decBenches (Proxy::Proxy '(F16, F2048, Zq 16, Zq 1017857))],
    fmap (bgroup "Rescale") $ sequence $ ($ pt) <$>
      [rescaleBenches (Proxy::Proxy '(F32, F2048,      Zq 16, Zq 1017857, Zq (1032193 ** 1017857))),
       rescaleBenches (Proxy::Proxy '(F32, F64*F9*F25, Zq 16, Zq 1008001, Zq (1065601 ** 1008001)))],
    fmap (bgroup "KeySwitch") $ sequence $ ($ pt) . ($ pgad) <$>
      [keySwitchBenches (Proxy::Proxy '(F32, F2048,      Zq 16, Zq (1017857 ** 1032193))),
       keySwitchBenches (Proxy::Proxy '(F32, F64*F9*F25, Zq 16, Zq (1008001 ** 1065601)))],
    fmap (bgroup "Tunnel") $ sequence $ ($ pt) . ($ pgad) <$>
      [tunnelBenches {- H0 -> H1 -} (Proxy::Proxy '(F128,
                                                    F128 * F7 * F13,
                                                    F64 * F7, F64 * F7 * F13,
                                                    Zq PP32,
                                                    Zq 3144961)),
       tunnelBenches {- H1 -> H2 -} (Proxy::Proxy '(F64 * F7,
                                                    F64 * F7 * F13,
                                                    F32 * F7 * F13,
                                                    F32 * F7 * F13,
                                                    Zq PP32,
                                                    Zq 3144961)),
       tunnelBenches {- H2 -> H3 -} (Proxy::Proxy '(F32 * F7 * F13,
                                                    F32 * F7 * F13,
                                                    F8 * F5 * F7 * F13,
                                                    F8 * F5 * F7 *F13,
                                                    Zq PP32,
                                                    Zq 3144961)),
       tunnelBenches {- H3 -> H4 -} (Proxy::Proxy '(F8 * F5 * F7 * F13,
                                                    F8 * F5 * F7 *F13,
                                                    F4 * F3 * F5 * F7 * F13,
                                                    F4 * F3 * F5 * F7 * F13,
                                                    Zq PP32,
                                                    Zq 3144961)),
       tunnelBenches {- H4 -> H5 -} (Proxy::Proxy '(F4 * F3 * F5 * F7 * F13,
                                                    F4 * F3 * F5 * F7 *F13,
                                                    F9 * F5 * F7 * F13,
                                                    F9 * F5 * F7 * F13,
                                                    Zq PP32,
                                                    Zq 3144961))]]
  
  
  defaultKHPRFBenches :: (forall m r . (Fact m, NFData r) => NFData (t m r), _)
   => Proxy t -> Proxy gad -> rnd [Benchmark]
  defaultKHPRFBenches = khprfBenches
  