{-|
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