packages feed

arithmetic-circuits-0.2.0: bench/Circuit.hs

{-# LANGUAGE NoImplicitPrelude #-}

module Circuit (benchmarks) where

import Protolude

import           Circuit.Affine
import           Circuit.Arithmetic
import           Criterion.Main
import           Data.Curve.Weierstrass.BN254 (Fr)
import qualified Data.Map                     as Map
import           Data.Pairing.BN254           (getRootOfUnity)
import           Fresh
import           QAP


program :: ArithCircuit Fr
program = ArithCircuit
  [ Mul (Var (InputWire 0)) (Var (InputWire 1)) (IntermediateWire 0)
  , Mul (Var (IntermediateWire 0))(Add (Var (InputWire 0)) (Var (InputWire 2))) (OutputWire 0)
  ]

input :: Map.Map Int Fr
input = Map.fromList [(0, 7), (1, 5), (2, 4)]

benchmarks :: [Benchmark]
benchmarks
  = [ bench "evaluating circuit"
    $ whnf (evalArithCircuit lookupAtWire updateAtWire program) (initialQapSet input)
    , bench "creating QAP (no interpolation)"
    $ nf (\c -> arithCircuitToGenQAP (evalFresh $ generateRoots (fromIntegral <$> fresh) c) c) program
    , bench "creating QAP (fast interpolation)"
    $ nf (\c -> arithCircuitToQAPFFT getRootOfUnity (evalFresh $ generateRoots (fromIntegral <$> fresh) c) c) program
    , bench "creating QAP (slow interpolation)"
    $ nf (\c -> arithCircuitToQAP (evalFresh $ generateRoots (fromIntegral <$> fresh) c) c) program
    ]