content: {-|
  Module      : BenchLolCPPMain
  Description : Main driver for lol benchmarks with CPP.
  Copyright   : (c) Eric Crockett, 2011-2017
                    Chris Peikert, 2011-2017
  License     : GPL-3
  Maintainer  : ecrockett0@email.com
  Stability   : experimental
  Portability : POSIX
  
  Main driver for lol benchmarks with CPP.
  -}
  
  {-# LANGUAGE DataKinds             #-}
  {-# LANGUAGE DuplicateRecordFields #-}
  {-# LANGUAGE NoStarIsType          #-}
  {-# LANGUAGE TypeOperators         #-}
  
  module BenchLolCPPMain where
  
  import Crypto.Lol.Benchmarks
  import Crypto.Lol.Cyclotomic.Tensor.CPP
  import Crypto.Lol.Factored
  import Crypto.Random.DRBG
  
  import Data.Proxy
  
  -- choose which layers of Lol to benchmark
  ls :: [String]
  ls = [
    "Tensor",
    "Cyc",
    "CycRep"
    ]
  
  -- choose which operations to benchmark
  bs :: [String]
  bs = [
    "zipWith (*)",
    "crt",
    "crtInv",
    "l",
    "lInv",
    "*g Pow",
    "*g Dec",
    "*g CRT",
    "divG Pow",
    "divG Dec",
    "divG CRT",
    "lift",
    "error",
    "twacePow",
    "twaceDec",
    "twaceCRT",
    "embedPow",
    "embedDec",
    "embedCRT"
    ]
  
  main :: IO ()
  main = diagnosticMain
  
  diagnosticMain :: IO ()
  diagnosticMain = do
    let opts = defaultDiagnosticOpts{levels=ls, benches=bs}
        b1 = bgroup "Single Index"
             [oneIdxBenches (Proxy::Proxy '(F64*F9*F25, Zq 14401)) (Proxy::Proxy CT) (Proxy::Proxy HashDRBG)]
        b2 = bgroup "Twace-Embed"
             [twoIdxBenches (Proxy::Proxy '(F64*F9*F25, F64*F9*F25, Zq 14401)) (Proxy::Proxy CT)]
    mapM_ (prettyBenchesDiagnostic opts) [b1,b2]
  