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