From 660dbac0059fe83c2f1e6df5950c5d4efc88c8b7 Mon Sep 17 00:00:00 2001 From: TurtlePU Date: Wed, 12 Feb 2025 20:47:29 +0300 Subject: [PATCH 1/3] compile-IVC: change Var types --- .../ZkFold/Base/Protocol/IVC/AlgebraicMap.hs | 7 ++- .../Base/Protocol/Plonkup/LookupConstraint.hs | 3 +- .../Base/Protocol/Plonkup/PlonkConstraint.hs | 16 ++--- .../Protocol/Plonkup/PlonkupConstraint.hs | 6 +- symbolic-base/src/ZkFold/Symbolic/Compiler.hs | 2 +- .../Symbolic/Compiler/ArithmeticCircuit.hs | 6 +- .../Compiler/ArithmeticCircuit/Instance.hs | 6 +- .../Compiler/ArithmeticCircuit/Internal.hs | 48 +++++++++------ .../Compiler/ArithmeticCircuit/Map.hs | 1 + .../ArithmeticCircuit/Optimization.hs | 14 ++--- .../Compiler/ArithmeticCircuit/Var.hs | 61 +++++++++++-------- .../ArithmeticCircuit/WitnessEstimation.hs | 46 +++++++------- 12 files changed, 118 insertions(+), 98 deletions(-) diff --git a/symbolic-base/src/ZkFold/Base/Protocol/IVC/AlgebraicMap.hs b/symbolic-base/src/ZkFold/Base/Protocol/IVC/AlgebraicMap.hs index 63e319b36..a457b91f7 100644 --- a/symbolic-base/src/ZkFold/Base/Protocol/IVC/AlgebraicMap.hs +++ b/symbolic-base/src/ZkFold/Base/Protocol/IVC/AlgebraicMap.hs @@ -20,6 +20,7 @@ import ZkFold.Base.Data.Vector (Vector) import ZkFold.Base.Protocol.IVC.Predicate (Predicate (..)) import ZkFold.Symbolic.Compiler import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Internal +import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Var (NewVar (..), SysVar (..)) import ZkFold.Symbolic.Data.Eq -- | Algebraic map of @a@. @@ -41,18 +42,18 @@ algebraicMap :: forall d k a i p f . -> [f] algebraicMap Predicate {..} pi pm _ pad = padDecomposition pad f_sps_uni where - sys :: [PM.Poly a (SysVar i) Natural] + sys :: [ACConstraint a i] sys = M.elems (acSystem predicateCircuit) witness :: Map ByteString f witness = M.fromList $ zip (keys $ acWitness predicateCircuit) (V.head pm) - varMap :: SysVar i -> f + varMap :: ACSysVar i -> f varMap (InVar inV) = index pi inV varMap (NewVar (EqVar newV)) = M.findWithDefault zero newV witness varMap (NewVar (FoldVar _ _)) = P.error "unexpected FOLD constraint" - f_sps :: Vector (d+1) [PM.Poly a (SysVar i) Natural] + f_sps :: Vector (d+1) [ACConstraint a i] f_sps = degreeDecomposition @d $ sys f_sps_uni :: Vector (d+1) [f] diff --git a/symbolic-base/src/ZkFold/Base/Protocol/Plonkup/LookupConstraint.hs b/symbolic-base/src/ZkFold/Base/Protocol/Plonkup/LookupConstraint.hs index caa8424ed..ed4b14c92 100644 --- a/symbolic-base/src/ZkFold/Base/Protocol/Plonkup/LookupConstraint.hs +++ b/symbolic-base/src/ZkFold/Base/Protocol/Plonkup/LookupConstraint.hs @@ -11,8 +11,9 @@ import Test.QuickCheck (Arbitrary import ZkFold.Base.Data.ByteString (toByteString) import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Internal +import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Var (NewVar (..), SysVar (..)) -newtype LookupConstraint i a = LookupConstraint { lkVar :: SysVar i } +newtype LookupConstraint i a = LookupConstraint { lkVar :: ACSysVar i } deriving instance Show (Rep i) => Show (LookupConstraint i a) deriving instance Eq (Rep i) => Eq (LookupConstraint i a) diff --git a/symbolic-base/src/ZkFold/Base/Protocol/Plonkup/PlonkConstraint.hs b/symbolic-base/src/ZkFold/Base/Protocol/Plonkup/PlonkConstraint.hs index 5e64d04b1..6877cab5d 100644 --- a/symbolic-base/src/ZkFold/Base/Protocol/Plonkup/PlonkConstraint.hs +++ b/symbolic-base/src/ZkFold/Base/Protocol/Plonkup/PlonkConstraint.hs @@ -26,7 +26,7 @@ import ZkFold.Base.Algebra.Polynomials.Multivariate (Poly, eval import ZkFold.Base.Data.ByteString (toByteString) import ZkFold.Prelude (length, take) import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Internal -import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Var (toVar) +import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Var data PlonkConstraint i a = PlonkConstraint { qm :: a @@ -34,9 +34,9 @@ data PlonkConstraint i a = PlonkConstraint , qr :: a , qo :: a , qc :: a - , x1 :: Var a i - , x2 :: Var a i - , x3 :: Var a i + , x1 :: ACVar a i + , x2 :: ACVar a i + , x3 :: ACVar a i } deriving instance (Show a, Show (Rep i)) => Show (PlonkConstraint i a) @@ -54,7 +54,7 @@ instance (Ord a, Arbitrary a, Binary a, Ord (Rep i), Semiring a) => Arbitrary (P let x1 = head xs; x2 = xs !! 1; x3 = xs !! 2 return $ PlonkConstraint qm ql qr qo qc x1 x2 x3 -toPlonkConstraint :: forall a i . (Ord a, FiniteField a, Ord (Rep i)) => Poly a (Var a i) Natural -> PlonkConstraint i a +toPlonkConstraint :: forall a i . (Ord a, FiniteField a, Ord (Rep i)) => Poly a (ACVar a i) Natural -> PlonkConstraint i a toPlonkConstraint p = let xs = Just <$> toList (variables p) perms = nubOrd $ map (take 3) $ permutations $ case length xs of @@ -63,12 +63,12 @@ toPlonkConstraint p = 2 -> [Nothing] ++ xs ++ xs _ -> xs ++ xs - getCoef :: Map (Maybe (Var a i)) Natural -> a + getCoef :: Map (Maybe (ACVar a i)) Natural -> a getCoef m = case find (\(_, as) -> m == Map.mapKeys Just as) (toList p) of Just (c, _) -> c _ -> zero - getCoefs :: [Maybe (Var a i)] -> Maybe (PlonkConstraint i a) + getCoefs :: [Maybe (ACVar a i)] -> Maybe (PlonkConstraint i a) getCoefs [a, b, c] = do let xa = [(a, 1)] xb = [(b, 1)] @@ -91,7 +91,7 @@ toPlonkConstraint p = [] -> toPlonkConstraint zero _ -> head $ mapMaybe getCoefs perms -fromPlonkConstraint :: (Ord a, Field a, Ord (Rep i)) => PlonkConstraint i a -> Poly a (Var a i) Natural +fromPlonkConstraint :: (Ord a, Field a, Ord (Rep i)) => PlonkConstraint i a -> Poly a (ACVar a i) Natural fromPlonkConstraint (PlonkConstraint qm ql qr qo qc a b c) = let xa = var a xb = var b diff --git a/symbolic-base/src/ZkFold/Base/Protocol/Plonkup/PlonkupConstraint.hs b/symbolic-base/src/ZkFold/Base/Protocol/Plonkup/PlonkupConstraint.hs index 9adbd0068..ac78cf706 100644 --- a/symbolic-base/src/ZkFold/Base/Protocol/Plonkup/PlonkupConstraint.hs +++ b/symbolic-base/src/ZkFold/Base/Protocol/Plonkup/PlonkupConstraint.hs @@ -20,17 +20,17 @@ isLookupConstraint :: FiniteField a => PlonkupConstraint i a -> a isLookupConstraint (ConsLookup _) = one isLookupConstraint _ = zero -getA :: forall a i . (Ord a, FiniteField a, Ord (Rep i)) => PlonkupConstraint i a -> Var a i +getA :: forall a i . (Ord a, FiniteField a, Ord (Rep i)) => PlonkupConstraint i a -> ACVar a i getA (ConsPlonk c) = x1 c getA (ConsLookup c) = toVar $ lkVar c getA ConsExtra = x1 (toPlonkConstraint zero) -getB :: forall a i . (Ord a, FiniteField a, Ord (Rep i)) => PlonkupConstraint i a -> Var a i +getB :: forall a i . (Ord a, FiniteField a, Ord (Rep i)) => PlonkupConstraint i a -> ACVar a i getB (ConsPlonk c) = x2 c getB (ConsLookup c) = toVar $ lkVar c getB ConsExtra = x2 (toPlonkConstraint zero) -getC :: forall a i . (Ord a, FiniteField a, Ord (Rep i)) => PlonkupConstraint i a -> Var a i +getC :: forall a i . (Ord a, FiniteField a, Ord (Rep i)) => PlonkupConstraint i a -> ACVar a i getC (ConsPlonk c) = x3 c getC (ConsLookup c) = toVar $ lkVar c getC ConsExtra = x3 (toPlonkConstraint zero) diff --git a/symbolic-base/src/ZkFold/Symbolic/Compiler.hs b/symbolic-base/src/ZkFold/Symbolic/Compiler.hs index f694ef365..5885e13cc 100644 --- a/symbolic-base/src/ZkFold/Symbolic/Compiler.hs +++ b/symbolic-base/src/ZkFold/Symbolic/Compiler.hs @@ -101,7 +101,7 @@ compileIO :: , SymbolicData f , Context f ~ c , Support f ~ s - , ToJSON (Layout f (Var a l)) + , ToJSON (Layout f (ACVar a l)) , SymbolicInput s , Context s ~ c , Layout s ~ l diff --git a/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit.hs b/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit.hs index 90d098841..c72e7f60b 100644 --- a/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit.hs +++ b/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit.hs @@ -2,8 +2,8 @@ module ZkFold.Symbolic.Compiler.ArithmeticCircuit ( ArithmeticCircuit, + ACVar, Constraint, - Var, witnessGenerator, -- high-level functions optimize, @@ -68,7 +68,7 @@ import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Instance () import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Internal import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Map import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Optimization -import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Var (toVar) +import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Var (toVar, SysVar (..)) import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Witness (WitnessF) import ZkFold.Symbolic.Data.Combinators (expansion) import ZkFold.Symbolic.MonadCircuit (MonadCircuit (..)) @@ -140,7 +140,7 @@ acValue = exec -- TODO: Check that all arguments have been applied. acPrint :: (Arithmetic a, Binary a, Show a) => - (Show (o (Var a U1)), Show (o a), Functor o) => + (Show (o (ACVar a U1)), Show (o a), Functor o) => ArithmeticCircuit a U1 U1 o -> IO () acPrint ac = do let m = elems (acSystem ac) diff --git a/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/Instance.hs b/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/Instance.hs index dbd3c7c40..2b234bb14 100644 --- a/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/Instance.hs +++ b/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/Instance.hs @@ -105,14 +105,14 @@ createRangeConstraint (FieldElement x) a = FieldElement $ fromCircuitF x (\ (Par return v -- TODO: make it more readable -instance (Show a, Show (o (Var a i)), Show (Var a i), Show (Rep i), Haskell.Ord (Rep i)) => Show (ArithmeticCircuit a p i o) where +instance (Show a, Show (o (ACVar a i)), Show (ACVar a i), Show (Rep i), Haskell.Ord (Rep i)) => Show (ArithmeticCircuit a p i o) where show r = "ArithmeticCircuit { acSystem = " ++ show (acSystem r) ++ "\n, acRange = " ++ show (acRange r) ++ "\n, acOutput = " ++ show (acOutput r) ++ " }" -- TODO: add witness generation info to the JSON object -instance (ToJSON a, ToJSON (o (Var a i)), ToJSONKey a, FromJSONKey (Var a i), ToJSON (Rep i)) => ToJSON (ArithmeticCircuit a p i o) where +instance (ToJSON a, ToJSON (o (ACVar a i)), ToJSONKey a, FromJSONKey (ACVar a i), ToJSON (Rep i)) => ToJSON (ArithmeticCircuit a p i o) where toJSON r = object [ "system" .= acSystem r, @@ -121,7 +121,7 @@ instance (ToJSON a, ToJSON (o (Var a i)), ToJSONKey a, FromJSONKey (Var a i), To ] -- TODO: properly restore the witness generation function -instance (FromJSON a, FromJSON (o (Var a i)), ToJSONKey (Var a i), FromJSONKey a, Haskell.Ord a, Haskell.Ord (Rep i), FromJSON (Rep i)) => FromJSON (ArithmeticCircuit a p i o) where +instance (FromJSON a, FromJSON (o (ACVar a i)), ToJSONKey (ACVar a i), FromJSONKey a, Haskell.Ord a, Haskell.Ord (Rep i), FromJSON (Rep i)) => FromJSON (ArithmeticCircuit a p i o) where parseJSON = withObject "ArithmeticCircuit" $ \v -> do acSystem <- v .: "system" diff --git a/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/Internal.hs b/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/Internal.hs index 3fdad1f05..7d1fdaff6 100644 --- a/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/Internal.hs +++ b/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/Internal.hs @@ -10,10 +10,11 @@ module ZkFold.Symbolic.Compiler.ArithmeticCircuit.Internal ( ArithmeticCircuit(..), CircuitFold (..), - Var (..), - SysVar (..), - NewVar (..), + ACConstraint, + ACSysVar, + ACVar, WitVar (..), + CircuitWitness, VarField, Arithmetic, Constraint, @@ -81,8 +82,15 @@ import ZkFold.Symbolic.Compiler.ArithmeticCircuit.WitnessEstimation import ZkFold.Symbolic.Fold import ZkFold.Symbolic.MonadCircuit +-- | A polynomial constraint is a polynomial +-- over both input and additional variables which should equal zero. +type Constraint c i n = Poly c (SysVar i n) Natural + +-- | Type of variables used in the constraint system of an arithmetic circuit. +type ACSysVar i = SysVar i NewVar + -- | The type that represents a constraint in the arithmetic circuit. -type Constraint c i = Poly c (SysVar i) Natural +type ACConstraint c i = Constraint c i NewVar type CircuitWitness a p i = WitnessF a (WitVar p i) @@ -117,18 +125,20 @@ instance Bifunctor (CircuitFold a) where instance (NFData a, NFData v) => NFData (CircuitFold a v w) where rnf CircuitFold {..} = rnf (foldStep, foldCount) `seq` liftRnf rnf foldSeed +type ACVar a i = Var a i NewVar + -- | Arithmetic circuit in the form of a system of polynomial constraints. data ArithmeticCircuit a p i o = ArithmeticCircuit { - acSystem :: Map ByteString (Constraint a i), + acSystem :: Map ByteString (ACConstraint a i), -- ^ The system of polynomial constraints - acRange :: MonoidalMap a (S.Set (SysVar i)), + acRange :: MonoidalMap a (S.Set (ACSysVar i)), -- ^ The range constraints [0, a] for the selected variables acWitness :: Map ByteString (CircuitWitness a p i), -- ^ The witness generation functions - acFold :: Map ByteString (CircuitFold a (Var a i) (CircuitWitness a p i)), + acFold :: Map ByteString (CircuitFold a (ACVar a i) (CircuitWitness a p i)), -- ^ The set of folding operations - acOutput :: o (Var a i) + acOutput :: o (ACVar a i) -- ^ The output variables } deriving (Generic) @@ -148,7 +158,7 @@ type VarField = Zp (2 ^ (32 * 8)) data WitVar p i = WExVar (Rep p) | WFoldVar ByteString ByteString - | WSysVar (SysVar i) + | WSysVar (ACSysVar i) imapWitVar :: (Representable i, Representable j) => @@ -187,29 +197,29 @@ idCircuit = emptyCircuit { acOutput = acInput } ---------------------------------- Variables ----------------------------------- -acInput :: (Representable i, Semiring a) => i (Var a i) +acInput :: (Representable i, Semiring a) => i (ACVar a i) acInput = fmapRep (toVar . InVar) (tabulate id) getAllVars :: forall a p i o. (Representable i, Foldable i) => - ArithmeticCircuit a p i o -> [SysVar i] + ArithmeticCircuit a p i o -> [ACSysVar i] getAllVars ac = toList acInput0 ++ map (NewVar . EqVar) (M.keys $ acWitness ac) ++ map NewVar (M.foldMapWithKey (\fi -> map (FoldVar fi) . keys) $ acFold ac) where - acInput0 :: i (SysVar i) + acInput0 :: i (ACSysVar i) acInput0 = tabulate InVar keys :: CircuitFold a v w -> [ByteString] keys CircuitFold {..} = toList $ imapRep (\r _ -> toByteString r) foldSeed indexW :: (Arithmetic a, Binary a, Representable p, Representable i) => - ArithmeticCircuit a p i o -> p a -> i a -> Var a i -> a + ArithmeticCircuit a p i o -> p a -> i a -> ACVar a i -> a indexW circuit payload inputs = indexG (witnessGenerator circuit payload inputs) inputs -indexG :: (Representable i, Arithmetic a) => Map NewVar a -> i a -> Var a i -> a +indexG :: (Representable i, Arithmetic a) => Map NewVar a -> i a -> ACVar a i -> a indexG witGen inputs = \case LinVar k (InVar inV) b -> (\t -> k * t + b) $ index inputs inV LinVar k (NewVar newV) b -> (\t -> k * t + b) $ fromMaybe @@ -240,10 +250,10 @@ hpmap f ac = ac --------------------------- Symbolic compiler context -------------------------- -crown :: ArithmeticCircuit a p i g -> f (Var a i) -> ArithmeticCircuit a p i f +crown :: ArithmeticCircuit a p i g -> f (ACVar a i) -> ArithmeticCircuit a p i f crown = flip (set #acOutput) -behead :: ArithmeticCircuit a p i f -> (ArithmeticCircuit a p i U1, f (Var a i)) +behead :: ArithmeticCircuit a p i f -> (ArithmeticCircuit a p i U1, f (ACVar a i)) behead = liftA2 (,) (set #acOutput U1) acOutput instance HFunctor (ArithmeticCircuit a p i) where @@ -282,13 +292,13 @@ instance ----------------------------- MonadCircuit instance ---------------------------- -instance Finite a => Witness (Var a i) (CircuitWitness a p i) where +instance Finite a => Witness (ACVar a i) (CircuitWitness a p i) where at (ConstVar cV) = fromConstant cV at (LinVar k sV b) = fromConstant k * pure (WSysVar sV) + fromConstant b instance (Arithmetic a, Binary a, Binary (Rep p), Binary (Rep i), Ord (Rep i), o ~ U1) - => MonadCircuit (Var a i) a (CircuitWitness a p i) (State (ArithmeticCircuit a p i o)) where + => MonadCircuit (ACVar a i) a (CircuitWitness a p i) (State (ArithmeticCircuit a p i o)) where unconstrained wf = case runWitnessF wf $ \case WSysVar sV -> LinUVar one sV zero @@ -458,7 +468,7 @@ apply xs ac = ac witF (WFoldVar i v) = pure (WFoldVar i v) witF (WExVar v) = pure (WExVar v) - filterSet :: Ord (Rep j) => S.Set (SysVar (i :*: j)) -> S.Set (Maybe (SysVar j)) + filterSet :: Ord (Rep j) => S.Set (ACSysVar (i :*: j)) -> S.Set (Maybe (ACSysVar j)) filterSet = S.map (\case NewVar v -> Just (NewVar v) InVar (Right v) -> Just (InVar v) diff --git a/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/Map.hs b/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/Map.hs index 9c6242c8b..7b8262a48 100644 --- a/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/Map.hs +++ b/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/Map.hs @@ -20,6 +20,7 @@ import ZkFold.Base.Algebra.Basic.Class import ZkFold.Base.Algebra.Polynomials.Multivariate import ZkFold.Base.Data.ByteString (toByteString) import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Internal +import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Var -- This module contains functions for mapping variables in arithmetic circuits. diff --git a/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/Optimization.hs b/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/Optimization.hs index b04544213..8881c86cb 100644 --- a/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/Optimization.hs +++ b/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/Optimization.hs @@ -15,13 +15,13 @@ import Prelude hiding splitAt, sum, take, (!!), (^)) import ZkFold.Base.Algebra.Basic.Class -import ZkFold.Base.Algebra.Basic.Number import ZkFold.Base.Algebra.Polynomials.Multivariate (evalMonomial) import ZkFold.Base.Algebra.Polynomials.Multivariate.Monomial (Mono (..), oneM) import ZkFold.Base.Algebra.Polynomials.Multivariate.Polynomial (Poly (..), evalPolynomial, var) import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Instance () import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Internal import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Witness (WitnessF (..)) +import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Var --------------------------------- High-level functions -------------------------------- @@ -47,16 +47,16 @@ optimize (ArithmeticCircuit s r w f o) = ArithmeticCircuit { isInVar (InVar _) = True isInVar _ = False - addInVarConstraints :: Map ByteString (Poly a (SysVar i) Natural) -> Map ByteString (Poly a (SysVar i) Natural) + addInVarConstraints :: Map ByteString (ACConstraint a i) -> Map ByteString (ACConstraint a i) addInVarConstraints p = p <> fromList [(polyId, poly) | (inVar, v) <- assocs $ filterWithKey (const . isInVar) vs, let poly = var inVar - fromConstant v, let polyId = witToVar @a @p @i (pure (WSysVar inVar) - fromConstant v)] - optRanges :: Map (SysVar i) a -> MM.MonoidalMap a (S.Set (SysVar i)) -> MM.MonoidalMap a (S.Set (SysVar i)) + optRanges :: Map (ACSysVar i) a -> MM.MonoidalMap a (S.Set (ACSysVar i)) -> MM.MonoidalMap a (S.Set (ACSysVar i)) optRanges m = MM.mapMaybeWithKey (\k v -> bool (error "range constraint less then value") (let t = S.difference v $ keysSet m in if null t then Nothing else Just t) (all (<= k) $ restrictKeys m v)) - optWitVar :: Map (SysVar i) a -> WitVar p i -> WitnessF a (WitVar p i) + optWitVar :: Map (ACSysVar i) a -> WitVar p i -> WitnessF a (WitVar p i) optWitVar m = \case (WSysVar sv) -> case M.lookup sv m of @@ -71,12 +71,12 @@ optimize (ArithmeticCircuit s r w f o) = ArithmeticCircuit { varF (ConstVar c) = ConstVar c -varsToReplace :: (Arithmetic a, Ord (Rep i)) => (Map ByteString (Constraint a i) , Map (SysVar i) a) -> (Map ByteString (Constraint a i) , Map (SysVar i) a) +varsToReplace :: (Arithmetic a, Ord (Rep i)) => (Map ByteString (ACConstraint a i) , Map (ACSysVar i) a) -> (Map ByteString (ACConstraint a i) , Map (ACSysVar i) a) varsToReplace (s, l) = if newVars == M.empty then (s, l) else varsToReplace (M.filter (/= zero) $ optimizeSystems newVars s, M.union newVars l) where newVars = M.fromList . M.elems $ mapMaybe toConstVar s - optimizeSystems :: (Arithmetic a, Ord (Rep i)) => Map (SysVar i) a -> Map ByteString (Constraint a i) -> Map ByteString (Constraint a i) + optimizeSystems :: (Arithmetic a, Ord (Rep i)) => Map (ACSysVar i) a -> Map ByteString (ACConstraint a i) -> Map ByteString (ACConstraint a i) optimizeSystems m as = bool (error "unsatisfiable constraint") ns (all checkZero ns) where ns = evalPolynomial evalMonomial varF <$> as @@ -84,7 +84,7 @@ varsToReplace (s, l) = if newVars == M.empty then (s, l) else varsToReplace (M.f checkZero (P [(c, mx)]) = (c == zero) && oneM mx || not (oneM mx) checkZero _ = True - toConstVar :: Arithmetic a => Constraint a i -> Maybe (SysVar i, a) + toConstVar :: Arithmetic a => ACConstraint a i -> Maybe (ACSysVar i, a) toConstVar = \case P [(_, M m1)] -> case toList m1 of [(m1var, 1)] -> Just (m1var, zero) diff --git a/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/Var.hs b/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/Var.hs index 412656cbb..ebcaac5ea 100644 --- a/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/Var.hs +++ b/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/Var.hs @@ -24,48 +24,57 @@ data NewVar ( Generic, Binary, FromJSON, FromJSONKey, ToJSON, ToJSONKey , Show, Eq, Ord, NFData) -data SysVar i +data SysVar i n = InVar (Rep i) - | NewVar NewVar + | NewVar n deriving (Generic) imapSysVar :: (Representable i, Representable j) => - (forall x. j x -> i x) -> SysVar i -> SysVar j + (forall x. j x -> i x) -> SysVar i n -> SysVar j n imapSysVar f (InVar r) = index (f (tabulate InVar)) r imapSysVar _ (NewVar v) = NewVar v -instance Binary (Rep i) => Binary (SysVar i) -instance NFData (Rep i) => NFData (SysVar i) -instance FromJSON (Rep i) => FromJSON (SysVar i) -instance FromJSON (Rep i) => FromJSONKey (SysVar i) -instance ToJSON (Rep i) => ToJSON (SysVar i) -instance ToJSON (Rep i) => ToJSONKey (SysVar i) -deriving stock instance Show (Rep i) => Show (SysVar i) -deriving stock instance Eq (Rep i) => Eq (SysVar i) -deriving stock instance Ord (Rep i) => Ord (SysVar i) +deriving anyclass instance (Binary (Rep i), Binary n) => Binary (SysVar i n) +deriving anyclass instance (NFData (Rep i), NFData n) => NFData (SysVar i n) +deriving anyclass instance + (FromJSON (Rep i), FromJSON n) => FromJSON (SysVar i n) +deriving anyclass instance + (FromJSON (Rep i), FromJSON n, FromJSONKey n) => FromJSONKey (SysVar i n) +deriving anyclass instance (ToJSON (Rep i), ToJSON n) => ToJSON (SysVar i n) +deriving anyclass instance + (ToJSON (Rep i), ToJSON n, ToJSONKey n) => ToJSONKey (SysVar i n) +deriving stock instance (Show (Rep i), Show n) => Show (SysVar i n) +deriving stock instance (Eq (Rep i), Eq n) => Eq (SysVar i n) +deriving stock instance (Ord (Rep i), Ord n) => Ord (SysVar i n) -data Var a i - = LinVar a (SysVar i) a +data Var a i n + = LinVar a (SysVar i n) a | ConstVar a deriving Generic -toVar :: Semiring a => SysVar i -> Var a i +toVar :: Semiring a => SysVar i n -> Var a i n toVar x = LinVar one x zero imapVar :: (Representable i, Representable j) => - (forall x. j x -> i x) -> Var a i -> Var a j + (forall x. j x -> i x) -> Var a i n -> Var a j n imapVar f (LinVar k x b) = LinVar k (imapSysVar f x) b imapVar _ (ConstVar c) = ConstVar c -deriving anyclass instance (Binary (Rep i), Binary a) => Binary (Var a i) -deriving anyclass instance (FromJSON (Rep i), FromJSON a) => FromJSON (Var a i) -deriving anyclass instance (FromJSON (Rep i), FromJSON a) => FromJSONKey (Var a i) -deriving anyclass instance (ToJSON (Rep i), ToJSON a) => ToJSONKey (Var a i) -deriving anyclass instance (ToJSON (Rep i), ToJSON a) => ToJSON (Var a i) -deriving stock instance (Show (Rep i), Show a) => Show (Var a i) -deriving stock instance (Eq (Rep i), Eq a) => Eq (Var a i) -deriving stock instance (Ord (Rep i), Ord a) => Ord (Var a i) -deriving instance (NFData (Rep i), NFData a) => NFData (Var a i) -instance FromConstant a (Var a i) where fromConstant = ConstVar +deriving anyclass instance + (Binary (Rep i), Binary a, Binary n) => Binary (Var a i n) +deriving anyclass instance + (FromJSON (Rep i), FromJSON a, FromJSON n) => FromJSON (Var a i n) +deriving anyclass instance + (FromJSON (Rep i), FromJSON a, FromJSON n, FromJSONKey n) => + FromJSONKey (Var a i n) +deriving anyclass instance + (ToJSON (Rep i), ToJSON a, ToJSON n, ToJSONKey n) => ToJSONKey (Var a i n) +deriving anyclass instance + (ToJSON (Rep i), ToJSON a, ToJSON n) => ToJSON (Var a i n) +deriving stock instance (Show (Rep i), Show a, Show n) => Show (Var a i n) +deriving stock instance (Eq (Rep i), Eq a, Eq n) => Eq (Var a i n) +deriving stock instance (Ord (Rep i), Ord a, Ord n) => Ord (Var a i n) +deriving instance (NFData (Rep i), NFData a, NFData n) => NFData (Var a i n) +instance FromConstant a (Var a i n) where fromConstant = ConstVar diff --git a/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/WitnessEstimation.hs b/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/WitnessEstimation.hs index 608255063..21ed7f03e 100644 --- a/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/WitnessEstimation.hs +++ b/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/WitnessEstimation.hs @@ -6,7 +6,6 @@ module ZkFold.Symbolic.Compiler.ArithmeticCircuit.WitnessEstimation where import Control.Applicative () -import Data.Functor.Rep (Rep) import GHC.Generics (Generic) import GHC.Integer (Integer) import GHC.Natural (Natural) @@ -15,23 +14,22 @@ import Prelude (Eq, Maybe (..), import ZkFold.Base.Algebra.Basic.Class import ZkFold.Base.Data.ByteString () import ZkFold.Symbolic.Class (Arithmetic) -import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Var import ZkFold.Symbolic.MonadCircuit (ResidueField (..)) -data UVar a i +data UVar a v = ConstUVar a - | LinUVar a (SysVar i) a + | LinUVar a v a | More deriving Generic -instance FromConstant a (UVar a i) where +instance FromConstant a (UVar a v) where fromConstant = ConstUVar -instance FromConstant Natural a => FromConstant Natural (UVar a i) where fromConstant = ConstUVar . fromConstant -instance FromConstant Integer a => FromConstant Integer (UVar a i) where fromConstant = ConstUVar . fromConstant +instance FromConstant Natural a => FromConstant Natural (UVar a v) where fromConstant = ConstUVar . fromConstant +instance FromConstant Integer a => FromConstant Integer (UVar a v) where fromConstant = ConstUVar . fromConstant -instance (Semiring a, Eq a) => Scale a (UVar a i) where +instance (Semiring a, Eq a) => Scale a (UVar a v) where scale k (ConstUVar c) = ConstUVar $ k * c scale k (LinUVar a x b) = if k == zero then ConstUVar zero @@ -40,22 +38,22 @@ instance (Semiring a, Eq a) => Scale a (UVar a i) where then ConstUVar zero else More -instance (Semiring a, Eq a) => Scale Natural (UVar a i) where scale k = scale (fromConstant k :: a) -instance (Semiring a, Eq a, FromConstant Integer a) => Scale Integer (UVar a i) where scale k = scale (fromConstant k :: a) +instance (Semiring a, Eq a) => Scale Natural (UVar a v) where scale k = scale (fromConstant k :: a) +instance (Semiring a, Eq a, FromConstant Integer a) => Scale Integer (UVar a v) where scale k = scale (fromConstant k :: a) -instance MultiplicativeMonoid a => Exponent (UVar a i) Natural where +instance MultiplicativeMonoid a => Exponent (UVar a v) Natural where (ConstUVar c) ^ n = ConstUVar $ c ^ n v ^ 1 = v _ ^ 0 = ConstUVar one _ ^ _ = More -instance (Exponent a Integer, MultiplicativeMonoid a) => Exponent (UVar a i) Integer where +instance (Exponent a Integer, MultiplicativeMonoid a) => Exponent (UVar a v) Integer where (ConstUVar c) ^ n = ConstUVar $ c ^ n (LinUVar k x b) ^ 1 = LinUVar k x b _ ^ 0 = ConstUVar one _ ^ _ = More -instance (AdditiveMonoid a, Eq a, Eq (Rep i)) => AdditiveSemigroup (UVar a i) where +instance (AdditiveMonoid a, Eq a, Eq v) => AdditiveSemigroup (UVar a v) where ConstUVar c + x = c .+ x x + ConstUVar c = c .+ x LinUVar k1 x1 b1 + (LinUVar k2 x2 b2) = if x1 == x2 then @@ -65,39 +63,39 @@ instance (AdditiveMonoid a, Eq a, Eq (Rep i)) => AdditiveSemigroup (UVar a i) wh else More _ + _ = More -(.+) :: AdditiveSemigroup a => a -> UVar a i -> UVar a i +(.+) :: AdditiveSemigroup a => a -> UVar a v -> UVar a v c1 .+ ConstUVar c2 = ConstUVar $ c1 + c2 c .+ LinUVar k x b = LinUVar k x (b + c) _ .+ More = More -instance (Semiring a, Eq a, Eq (Rep i)) => AdditiveMonoid (UVar a i) where +instance (Semiring a, Eq a, Eq v) => AdditiveMonoid (UVar a v) where zero = ConstUVar zero -instance (Ring a, Eq a, Eq (Rep i)) => AdditiveGroup (UVar a i) where +instance (Ring a, Eq a, Eq v) => AdditiveGroup (UVar a v) where negate (ConstUVar c) = ConstUVar (negate c) negate (LinUVar k x b) = LinUVar (negate k) x (negate b) negate More = More -instance (Semiring a, Eq a) => MultiplicativeSemigroup (UVar a i) where +instance (Semiring a, Eq a) => MultiplicativeSemigroup (UVar a v) where ConstUVar c * x = scale c x x * ConstUVar c = scale c x _ * _ = More -instance (Semiring a, Eq a) => MultiplicativeMonoid (UVar a i) where +instance (Semiring a, Eq a) => MultiplicativeMonoid (UVar a v) where one = ConstUVar one -instance (Semiring a, Eq a, Eq (Rep i)) => Semiring (UVar a i) +instance (Semiring a, Eq a, Eq v) => Semiring (UVar a v) -instance (Ring a, Eq a, Eq (Rep i)) => Ring (UVar a i) +instance (Ring a, Eq a, Eq v) => Ring (UVar a v) -instance (Field a, Eq a, Eq (Rep i)) => Field (UVar a i) where +instance (Field a, Eq a, Eq v) => Field (UVar a v) where finv (ConstUVar c) = ConstUVar $ finv c finv _ = More -instance Finite a => Finite (UVar a i) where type Order (UVar a i) = Order a +instance Finite a => Finite (UVar a v) where type Order (UVar a v) = Order a -instance (Arithmetic a, Eq (Rep i)) => ResidueField (UVar a i) where - type IntegralOf (UVar a i) = Maybe Integer +instance (Arithmetic a, Eq v) => ResidueField (UVar a v) where + type IntegralOf (UVar a v) = Maybe Integer fromIntegral (Just x) = ConstUVar (fromConstant x) fromIntegral Nothing = More toIntegral (ConstUVar c) = Just (toIntegral c) From 42e5c2522949e2c07a0ddd311d1adf884d2b4234 Mon Sep 17 00:00:00 2001 From: TurtlePU Date: Wed, 12 Feb 2025 20:47:43 +0300 Subject: [PATCH 2/3] compile-IVC: first sketch --- .../Compiler/ArithmeticCircuit/IVC.hs | 120 ++++++++++++++++++ symbolic-base/symbolic-base.cabal | 1 + 2 files changed, 121 insertions(+) create mode 100644 symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/IVC.hs diff --git a/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/IVC.hs b/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/IVC.hs new file mode 100644 index 000000000..f57749250 --- /dev/null +++ b/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/IVC.hs @@ -0,0 +1,120 @@ +{-# LANGUAGE TypeOperators #-} + +module ZkFold.Symbolic.Compiler.ArithmeticCircuit.IVC where + +import Control.Applicative (Applicative (..)) +import Control.Monad.State (State) +import Data.ByteString (ByteString) +import Data.Either (Either (..)) +import Data.Foldable (Foldable (..)) +import Data.Function ((.)) +import Data.Functor (Functor (..)) +import Data.Functor.Rep (Rep) +import Data.List.Infinite (Infinite) +import Data.Map.Lazy (Map) +import qualified Data.Map.Lazy as M +import Data.Maybe (fromJust) +import Data.Monoid (Monoid (..)) +import Data.Semigroup (Semigroup (..)) +import Data.Tuple (uncurry) +import GHC.Generics (Par1 (..), U1 (..), (:*:) (..), (:.:)) +import Prelude (error) + +import ZkFold.Base.Algebra.Basic.Class +import ZkFold.Base.Control.HApplicative (HApplicative (..)) +import ZkFold.Base.Data.ByteString (Binary, fromByteString) +import ZkFold.Symbolic.Class (Symbolic (..)) +import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Internal +import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Var (SysVar, Var) +import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Witness (WitnessF) +import ZkFold.Symbolic.Data.Bool (Bool) +import ZkFold.Symbolic.Data.Class (LayoutFunctor, PayloadFunctor) +import ZkFold.Symbolic.Data.Conditional (Conditional (..)) +import ZkFold.Symbolic.Data.FieldElement (FieldElement (..)) +import ZkFold.Symbolic.Data.Ord (Ord (..)) + +data RangeEntry a v = RangeEntry + { reUpperBound :: a + , reRangedVars :: [v] + } + +type PCWitness v a p i = WitnessF a (Either (Rep p) (SysVar i v)) + +data PrimitiveCircuit v a p i n o = PrimitiveCircuit + { pcSystem :: [Constraint a i v] + , pcRange :: [RangeEntry a (SysVar i v)] + , pcWitness :: Map v (PCWitness v a p i) + , pcPayload :: n (PCWitness v a p i) + , pcOutput :: o (Var a i v) + } + +data RecursiveCircuit v a p i n o = + forall sp si it. + RecursiveCircuit + { rcStep :: PrimitiveCircuit v a sp (si :*: it) sp si + , rcBoot :: PrimitiveCircuit v a (p :*: sp) (i :*: si) + (n :*: sp :*: (Infinite :.: it)) + (o :*: si :*: Par1) + } + +data FoldingCircuit a ext = + forall p l i. + FoldingCircuit + { fcLayoutStep :: ArithmeticCircuit a p (l :*: i) l + , fcWitnessStep :: p (CircuitWitness a p (l :*: i)) + , fcSeedPayload :: p (WitnessField ext) + , fcSeedLayout :: ext l + , fcStream :: Infinite (i (WitnessField ext)) + , fcCount :: FieldElement ext + , fcOutPayload :: Map ByteString (ByteString -> Rep p) + , fcOutLayout :: Map ByteString (ByteString -> Rep l) + } + +fromFold :: + ByteString -> CircuitFold a (ACVar a i) (CircuitWitness a p i) -> + FoldingCircuit a (ArithmeticCircuit a p i) +fromFold fldID CircuitFold {..} = FoldingCircuit + { fcLayoutStep = foldStep + , fcWitnessStep = foldStepP + , fcSeedPayload = foldSeedP + , fcSeedLayout = emptyCircuit { acOutput = foldSeed } + , fcStream = foldStream + , fcCount = FieldElement emptyCircuit { acOutput = Par1 foldCount } + , fcOutPayload = M.singleton fldID (fromJust . fromByteString) + , fcOutLayout = M.singleton fldID (fromJust . fromByteString) + } + +instance Symbolic c => Semigroup (FoldingCircuit a c) where + FoldingCircuit _ _ sp sl s k op ol <> FoldingCircuit _ _ tp tl t l pp pl = + FoldingCircuit + { fcLayoutStep = error "TODO" + , fcWitnessStep = error "TODO" + , fcSeedPayload = sp :*: tp + , fcSeedLayout = hpair sl tl + , fcStream = liftA2 (:*:) s t + , fcCount = bool k l (k < l :: Bool c) + , fcOutPayload = fmap (Left .) op <> fmap (Right .) pp + , fcOutLayout = fmap (Left .) ol <> fmap (Right .) pl + } + +instance Symbolic c => Monoid (FoldingCircuit a c) where + mempty = FoldingCircuit + { fcLayoutStep = emptyCircuit + , fcWitnessStep = U1 + , fcSeedPayload = U1 + , fcSeedLayout = hunit + , fcStream = pure U1 + , fcCount = zero + , fcOutPayload = M.empty + , fcOutLayout = M.empty + } + +recursiveCircuit :: + ArithmeticCircuit a p i o -> State [v] (RecursiveCircuit v a p i U1 o) +recursiveCircuit = error "TODO" + +foldingCircuit :: + (Arithmetic a, Binary a, LayoutFunctor i, PayloadFunctor p) => + Map ByteString (CircuitFold a (ACVar a i) (CircuitWitness a p i)) -> + FoldingCircuit a (ArithmeticCircuit a p i) +foldingCircuit = foldMap (uncurry fromFold) . M.assocs diff --git a/symbolic-base/symbolic-base.cabal b/symbolic-base/symbolic-base.cabal index 782b0a74c..2545eb710 100644 --- a/symbolic-base/symbolic-base.cabal +++ b/symbolic-base/symbolic-base.cabal @@ -180,6 +180,7 @@ library ZkFold.Symbolic.Compiler.ArithmeticCircuit ZkFold.Symbolic.Compiler.ArithmeticCircuit.Instance ZkFold.Symbolic.Compiler.ArithmeticCircuit.Internal + ZkFold.Symbolic.Compiler.ArithmeticCircuit.IVC ZkFold.Symbolic.Compiler.ArithmeticCircuit.Map ZkFold.Symbolic.Compiler.ArithmeticCircuit.MerkleHash ZkFold.Symbolic.Compiler.ArithmeticCircuit.Optimization From bc11744a067867d174080c58f2e4cd91b1e0fea5 Mon Sep 17 00:00:00 2001 From: TurtlePU Date: Wed, 12 Feb 2025 18:04:19 +0000 Subject: [PATCH 3/3] stylish-haskell auto-commit --- .../Symbolic/Compiler/ArithmeticCircuit.hs | 2 +- .../Compiler/ArithmeticCircuit/Optimization.hs | 2 +- .../ArithmeticCircuit/WitnessEstimation.hs | 16 ++++++++-------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit.hs b/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit.hs index c72e7f60b..607cff22b 100644 --- a/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit.hs +++ b/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit.hs @@ -68,7 +68,7 @@ import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Instance () import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Internal import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Map import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Optimization -import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Var (toVar, SysVar (..)) +import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Var (SysVar (..), toVar) import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Witness (WitnessF) import ZkFold.Symbolic.Data.Combinators (expansion) import ZkFold.Symbolic.MonadCircuit (MonadCircuit (..)) diff --git a/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/Optimization.hs b/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/Optimization.hs index 8881c86cb..bc1727f9d 100644 --- a/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/Optimization.hs +++ b/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/Optimization.hs @@ -20,8 +20,8 @@ import ZkFold.Base.Algebra.Polynomials.Multivariate.Monomial (Mono ( import ZkFold.Base.Algebra.Polynomials.Multivariate.Polynomial (Poly (..), evalPolynomial, var) import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Instance () import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Internal +import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Var import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Witness (WitnessF (..)) -import ZkFold.Symbolic.Compiler.ArithmeticCircuit.Var --------------------------------- High-level functions -------------------------------- diff --git a/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/WitnessEstimation.hs b/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/WitnessEstimation.hs index 21ed7f03e..84d1d8249 100644 --- a/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/WitnessEstimation.hs +++ b/symbolic-base/src/ZkFold/Symbolic/Compiler/ArithmeticCircuit/WitnessEstimation.hs @@ -5,16 +5,16 @@ module ZkFold.Symbolic.Compiler.ArithmeticCircuit.WitnessEstimation where -import Control.Applicative () -import GHC.Generics (Generic) -import GHC.Integer (Integer) -import GHC.Natural (Natural) -import Prelude (Eq, Maybe (..), ($), (.), (==)) +import Control.Applicative () +import GHC.Generics (Generic) +import GHC.Integer (Integer) +import GHC.Natural (Natural) +import Prelude (Eq, Maybe (..), ($), (.), (==)) import ZkFold.Base.Algebra.Basic.Class -import ZkFold.Base.Data.ByteString () -import ZkFold.Symbolic.Class (Arithmetic) -import ZkFold.Symbolic.MonadCircuit (ResidueField (..)) +import ZkFold.Base.Data.ByteString () +import ZkFold.Symbolic.Class (Arithmetic) +import ZkFold.Symbolic.MonadCircuit (ResidueField (..))