From 6eec3646c203133500d967962c8ea51a3c8e3075 Mon Sep 17 00:00:00 2001 From: Anurudh Peduri Date: Tue, 17 Feb 2026 20:20:16 +0000 Subject: [PATCH 01/28] wip --- test/Traq/Examples/SteepMaxKSatSpec.hs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/Traq/Examples/SteepMaxKSatSpec.hs b/test/Traq/Examples/SteepMaxKSatSpec.hs index 2c78761..71408c8 100644 --- a/test/Traq/Examples/SteepMaxKSatSpec.hs +++ b/test/Traq/Examples/SteepMaxKSatSpec.hs @@ -43,16 +43,16 @@ spec = describe "Steep max-k-sat" $ do ex <- loadExample assertRight $ P.typeCheckProg ex - xdescribe "Compile" $ do + fdescribe "Compile" $ do let eps = A.failProb (0.0001 :: Double) it "lowers" $ do - ex <- loadExample + ex <- P.renameVars' <$> loadExample ex' <- expectRight $ A.annotateProgWith (P._exts (A.annSinglePrim eps)) ex assertRight $ Compiler.lowerProgram ex' it "typechecks" $ do - ex <- loadExample + ex <- P.renameVars' <$> loadExample ex' <- expectRight $ A.annotateProgWith (P._exts (A.annSinglePrim eps)) ex ex_uqpl <- expectRight $ Compiler.lowerProgram ex' assertRight $ CQPL.typeCheckProgram ex_uqpl From 8a760ef0d413477ceb09946f46859651e628538c Mon Sep 17 00:00:00 2001 From: Anurudh Peduri Date: Thu, 19 Feb 2026 13:32:07 +0000 Subject: [PATCH 02/28] reorg --- src/Traq/Primitives/Max/QMax.hs | 84 ++++++++++++++------------------- 1 file changed, 35 insertions(+), 49 deletions(-) diff --git a/src/Traq/Primitives/Max/QMax.hs b/src/Traq/Primitives/Max/QMax.hs index 150d77b..b932f9c 100644 --- a/src/Traq/Primitives/Max/QMax.hs +++ b/src/Traq/Primitives/Max/QMax.hs @@ -29,33 +29,15 @@ import Traq.Prelude import Traq.Primitives.Class import qualified Traq.ProtoLang as P --- ================================================================================ --- Cost Formulas --- ================================================================================ - --- [1], Page 16, below Eq. 11 -_EQMax :: forall sizeT precT. (Floating precT, P.SizeToPrec sizeT precT) => sizeT -> precT -_EQMax n = 6.3505 * sqrt_n + 2.8203 - where - sqrt_n :: precT - sqrt_n = sqrt $ P.sizeToPrec n - --- [1], Corollary 1. -_WQMax :: forall sizeT precT. (Floating precT, P.SizeToPrec sizeT precT) => sizeT -> P.FailProb precT -> precT -_WQMax n eps = 3 * _EQMax n * log_eps - where - log_eps :: precT - log_eps = log (1 / P.getFailProb eps) - -- ================================================================================ -- Primitive Class Implementation -- ================================================================================ -data QMax sizeT precT = QMax {arg_ty :: P.VarType sizeT} +data QMax size prec = QMax {arg_ty :: P.VarType size} deriving (Eq, Show, Read) -type instance SizeType (QMax sizeT precT) = sizeT -type instance PrecType (QMax sizeT precT) = precT +type instance SizeType (QMax size prec) = size +type instance PrecType (QMax size prec) = prec newtype QMaxFunArg a = QMaxFunArg {fun :: a} @@ -72,13 +54,13 @@ instance P.MapSize (QMax size prec) where mapSize f (QMax t) = QMax (P.mapSize f t) -instance (Show sizeT) => SerializePrim (QMax sizeT precT) where +instance (Show size) => SerializePrim (QMax size prec) where primNames = ["max"] parsePrimParams tp _ = QMax <$> P.varType tp printPrimParams QMax{arg_ty} = [show arg_ty] -- Type check -instance (Eq sizeT) => TypeCheckPrim (QMax sizeT precT) sizeT where +instance (Eq size) => TypeCheckPrim (QMax size prec) size where inferRetTypesPrim QMax{arg_ty} QMaxFunArg{fun = fun_type} = do let P.FnType param_types ret_types = fun_type @@ -96,7 +78,7 @@ instance (Eq sizeT) => TypeCheckPrim (QMax sizeT precT) sizeT where {- | Evaluate an `any` call by evaluating the predicate on each element of the search space and or-ing the results. -} -instance EvalPrim (QMax sizeT precT) sizeT precT where +instance EvalPrim (QMax size prec) size prec where evalPrim QMax{arg_ty} QMaxFunArg{fun = fun_eval} = do let search_range = P.domain arg_ty @@ -109,16 +91,12 @@ instance EvalPrim (QMax sizeT precT) sizeT precT where return [P.FinV $ maximum vs] -- ================================================================================ --- Abstract Costs +-- Unitary -- ================================================================================ --- | Compute the unitary cost using the QSearch_Zalka cost formula. instance - ( Integral sizeT - , Floating precT - , P.SizeToPrec sizeT precT - ) => - UnitaryCostPrim (QMax sizeT precT) sizeT precT + (Integral size, Floating prec, P.SizeToPrec size prec) => + UnitaryCostPrim (QMax size prec) size prec where unitaryQueryCosts QMax{arg_ty} eps = QMaxFunArg{fun = strongQueries $ _WQMax _N eps} where @@ -126,12 +104,31 @@ instance unitaryExprCosts _ _ = Alg.zero +instance UnitaryCompilePrim (QMax size prec) size prec where + compileUPrim QMax{} eps = do + error "TODO: CompileU QMax" + +-- ================================================================================ +-- Quantum +-- ================================================================================ + +-- [1], Page 16, below Eq. 11 +_EQMax :: forall size prec. (Floating prec, P.SizeToPrec size prec) => size -> prec +_EQMax n = 6.3505 * sqrt_n + 2.8203 + where + sqrt_n :: prec + sqrt_n = sqrt $ P.sizeToPrec n + +-- [1], Corollary 1. +_WQMax :: forall size prec. (Floating prec, P.SizeToPrec size prec) => size -> P.FailProb prec -> prec +_WQMax n eps = 3 * _EQMax n * log_eps + where + log_eps :: prec + log_eps = log (1 / P.getFailProb eps) + instance - ( Integral sizeT - , Floating precT - , P.SizeToPrec sizeT precT - ) => - QuantumHavocCostPrim (QMax sizeT precT) sizeT precT + (Integral size, Floating prec, P.SizeToPrec size prec) => + QuantumHavocCostPrim (QMax size prec) size prec where quantumQueryCostsUnitary QMax{arg_ty} eps = QMaxFunArg{fun = strongQueries $ _WQMax _N eps} where @@ -143,11 +140,8 @@ instance quantumExprCosts = Alg.zero instance - ( Floating precT - , Integral sizeT - , P.SizeToPrec sizeT precT - ) => - QuantumExpCostPrim (QMax sizeT precT) sizeT precT + (Floating prec, Integral size, P.SizeToPrec size prec) => + QuantumExpCostPrim (QMax size prec) size prec where quantumExpQueryCostsUnitary QMax{arg_ty} _ _ = QMaxFunArg{fun = strongQueries $ _EQMax _N} where @@ -158,14 +152,6 @@ instance quantumExpExprCosts = Alg.zero --- ================================================================================ --- Compilation --- ================================================================================ - -instance UnitaryCompilePrim (QMax size prec) size prec where - compileUPrim QMax{} eps = do - error "TODO: CompileU QMax" - instance QuantumCompilePrim (QMax size prec) size prec where compileQPrim QMax{} eps = do error "TODO: CompileQ QMax" From 5dfc5646dfcf1715a9cee9dc1dfd397eee40ebd7 Mon Sep 17 00:00:00 2001 From: Anurudh Peduri Date: Thu, 19 Feb 2026 13:48:05 +0000 Subject: [PATCH 03/28] wip --- src/Traq/Primitives/Max/QMax.hs | 5 +++-- test/Traq/Examples/SteepMaxKSatSpec.hs | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Traq/Primitives/Max/QMax.hs b/src/Traq/Primitives/Max/QMax.hs index b932f9c..92b8fa8 100644 --- a/src/Traq/Primitives/Max/QMax.hs +++ b/src/Traq/Primitives/Max/QMax.hs @@ -24,6 +24,7 @@ import Text.Printf (printf) import qualified Numeric.Algebra as Alg +import qualified Traq.Analysis as A import qualified Traq.Analysis as P import Traq.Prelude import Traq.Primitives.Class @@ -98,14 +99,14 @@ instance (Integral size, Floating prec, P.SizeToPrec size prec) => UnitaryCostPrim (QMax size prec) size prec where - unitaryQueryCosts QMax{arg_ty} eps = QMaxFunArg{fun = strongQueries $ _WQMax _N eps} + unitaryQueryCosts QMax{arg_ty} _ = QMaxFunArg{fun = weakQueries (A.sizeToPrec _N)} where _N = P.domainSize arg_ty unitaryExprCosts _ _ = Alg.zero instance UnitaryCompilePrim (QMax size prec) size prec where - compileUPrim QMax{} eps = do + compileUPrim QMax{arg_ty} _ = do error "TODO: CompileU QMax" -- ================================================================================ diff --git a/test/Traq/Examples/SteepMaxKSatSpec.hs b/test/Traq/Examples/SteepMaxKSatSpec.hs index 71408c8..eb1e036 100644 --- a/test/Traq/Examples/SteepMaxKSatSpec.hs +++ b/test/Traq/Examples/SteepMaxKSatSpec.hs @@ -43,7 +43,7 @@ spec = describe "Steep max-k-sat" $ do ex <- loadExample assertRight $ P.typeCheckProg ex - fdescribe "Compile" $ do + xdescribe "Compile" $ do let eps = A.failProb (0.0001 :: Double) it "lowers" $ do From 06c1eb005996bd57f9501681fe4188d1c3db3bf7 Mon Sep 17 00:00:00 2001 From: Anurudh Peduri Date: Thu, 19 Feb 2026 13:54:03 +0000 Subject: [PATCH 04/28] rename typevars --- src/Traq/Analysis/CostModel/Class.hs | 4 +- src/Traq/Analysis/CostModel/QueryCost.hs | 14 +- src/Traq/Analysis/Error/Prelude.hs | 6 +- src/Traq/Analysis/Prelude.hs | 6 +- src/Traq/CQPL/Cost.hs | 42 ++--- src/Traq/CQPL/Syntax.hs | 166 +++++++++---------- src/Traq/CQPL/TypeCheck.hs | 76 ++++----- src/Traq/Compiler/Prelude.hs | 12 +- src/Traq/Compiler/Unitary.hs | 4 +- src/Traq/Examples/MatrixSearch.hs | 14 +- src/Traq/Examples/Search.hs | 14 +- src/Traq/Examples/TreeGenerator.hs | 2 +- src/Traq/Primitives.hs | 30 ++-- src/Traq/Primitives/Amplify/CAmplify.hs | 16 +- src/Traq/Primitives/Amplify/Prelude.hs | 12 +- src/Traq/Primitives/Amplify/QAmplify.hs | 20 +-- src/Traq/Primitives/Count/QCount.hs | 10 +- src/Traq/Primitives/Search/DetSearch.hs | 8 +- src/Traq/Primitives/Search/Prelude.hs | 10 +- src/Traq/Primitives/Search/QSearchCFNW.hs | 136 +++++++-------- src/Traq/Primitives/Search/RandomSearch.hs | 12 +- src/Traq/Primitives/Search/Symbolic.hs | 24 +-- src/Traq/Primitives/Simons/Prelude.hs | 14 +- src/Traq/Primitives/Simons/Quantum.hs | 26 +-- src/Traq/Primitives/TreeSearch.hs | 22 +-- src/Traq/ProtoLang/Eval.hs | 122 +++++++------- src/Traq/ProtoLang/Parser.hs | 2 +- src/Traq/ProtoLang/Syntax.hs | 84 +++++----- src/Traq/ProtoLang/TypeCheck.hs | 62 +++---- src/Traq/ProtoLang/Vars.hs | 4 +- test/Traq/Compiler/QuantumSpec.hs | 2 +- test/Traq/Examples/TreeGeneratorSpec.hs | 2 +- test/Traq/Primitives/Amplify/CAmplifySpec.hs | 4 +- test/Traq/Primitives/Amplify/PreludeSpec.hs | 6 +- test/Traq/Primitives/TreeSearchSpec.hs | 2 +- tools/compile.hs | 2 +- 36 files changed, 496 insertions(+), 496 deletions(-) diff --git a/src/Traq/Analysis/CostModel/Class.hs b/src/Traq/Analysis/CostModel/Class.hs index 85f95c1..fb4356f 100644 --- a/src/Traq/Analysis/CostModel/Class.hs +++ b/src/Traq/Analysis/CostModel/Class.hs @@ -18,7 +18,7 @@ class (Alg.Monoidal c, Alg.Module (PrecType c) c) => CostModel c where query :: QueryType -> Ident -> c -- | Execute an expression. - callExpr :: QueryType -> P.BasicExpr sizeT -> c + callExpr :: QueryType -> P.BasicExpr size -> c -- | Execute a distribution (randomized) expression - callDistrExpr :: QueryType -> P.DistrExpr sizeT -> c + callDistrExpr :: QueryType -> P.DistrExpr size -> c diff --git a/src/Traq/Analysis/CostModel/QueryCost.hs b/src/Traq/Analysis/CostModel/QueryCost.hs index 0ab1e94..fd76194 100644 --- a/src/Traq/Analysis/CostModel/QueryCost.hs +++ b/src/Traq/Analysis/CostModel/QueryCost.hs @@ -21,15 +21,15 @@ import Traq.Data.Default import Traq.Analysis.CostModel.Class import Traq.Prelude -data QueryCost precT = QueryCost - { uqueries :: Map.Map Ident precT - , cqueries :: Map.Map Ident precT +data QueryCost prec = QueryCost + { uqueries :: Map.Map Ident prec + , cqueries :: Map.Map Ident prec } deriving (Eq, Ord, Show, Read, Generic, HasDefault, Functor) -type instance PrecType (QueryCost precT) = precT +type instance PrecType (QueryCost prec) = prec -type Ticks precT = Map.Map Ident precT +type Ticks prec = Map.Map Ident prec totalQueryCost :: forall a. @@ -79,10 +79,10 @@ instance (Alg.Rig a) => CostModel (QueryCost a) where {- | A simple cost that counts the number of queries to all external functions. It treats unitary and classical queries as the same. -} -newtype SimpleQueryCost precT = SimpleQueryCost {getCost :: precT} +newtype SimpleQueryCost prec = SimpleQueryCost {getCost :: prec} deriving (Eq, Ord, Show, Read, Generic, HasDefault, Functor) -type instance PrecType (SimpleQueryCost precT) = precT +type instance PrecType (SimpleQueryCost prec) = prec instance (Alg.Additive a) => Alg.Additive (SimpleQueryCost a) where (SimpleQueryCost a) + (SimpleQueryCost a') = SimpleQueryCost (a Alg.+ a') diff --git a/src/Traq/Analysis/Error/Prelude.hs b/src/Traq/Analysis/Error/Prelude.hs index 6c8eaf6..5f3db30 100644 --- a/src/Traq/Analysis/Error/Prelude.hs +++ b/src/Traq/Analysis/Error/Prelude.hs @@ -28,14 +28,14 @@ import Traq.ProtoLang.Syntax (FunCtx) -- ================================================================================ -- | Wrapper for values representing a failure probability in [0, 1] -newtype FailProb precT = FailProb precT +newtype FailProb prec = FailProb prec deriving (Eq, Read, Show, Num, Ord) -- | Safe constructor -failProb :: (Num precT) => precT -> FailProb precT +failProb :: (Num prec) => prec -> FailProb prec failProb = FailProb -getFailProb :: FailProb precT -> precT +getFailProb :: FailProb prec -> prec getFailProb (FailProb p) = p -- | Helper: split an epsilon into `n` equal parts. diff --git a/src/Traq/Analysis/Prelude.hs b/src/Traq/Analysis/Prelude.hs index e41395d..31ac27a 100644 --- a/src/Traq/Analysis/Prelude.hs +++ b/src/Traq/Analysis/Prelude.hs @@ -8,8 +8,8 @@ import qualified Traq.Data.Symbolic as Sym class SizeToPrec size prec where sizeToPrec :: size -> prec -instance (Floating precT) => SizeToPrec Integer precT where sizeToPrec = fromIntegral -instance (Floating precT) => SizeToPrec Int precT where sizeToPrec = fromIntegral +instance (Floating prec) => SizeToPrec Integer prec where sizeToPrec = fromIntegral +instance (Floating prec) => SizeToPrec Int prec where sizeToPrec = fromIntegral -instance (Show sizeT) => SizeToPrec (Sym.Sym sizeT) (Sym.Sym precT) where +instance (Show size) => SizeToPrec (Sym.Sym size) (Sym.Sym prec) where sizeToPrec s = Sym.var (show s) diff --git a/src/Traq/CQPL/Cost.hs b/src/Traq/CQPL/Cost.hs index 61484b0..5ab43b4 100644 --- a/src/Traq/CQPL/Cost.hs +++ b/src/Traq/CQPL/Cost.hs @@ -32,12 +32,12 @@ import qualified Traq.ProtoLang as P type CostMap c = Map.Map Ident c -- | Environment: the list of procedures. -type CostEnv sizeT = ProcCtx sizeT +type CostEnv size = ProcCtx size -- | Monad to compute unitary cost. -type CostCalculator sizeT c = +type CostCalculator size c = ReaderT - (CostEnv sizeT) + (CostEnv size) ( StateT (CostMap c) (Either String) @@ -45,19 +45,19 @@ type CostCalculator sizeT c = class HasCost t where cost :: - forall sizeT precT costT m. - ( sizeT ~ SizeType t - , Integral sizeT + forall size prec costT m. + ( size ~ SizeType t + , Integral size , C.CostModel costT - , precT ~ PrecType costT + , prec ~ PrecType costT , Ord costT - , Floating precT - , m ~ CostCalculator sizeT costT + , Floating prec + , m ~ CostCalculator size costT ) => t -> m costT -instance HasCost (UStmt sizeT) where +instance HasCost (UStmt size) where cost USkipS = return Alg.zero cost (UCommentS _) = return Alg.zero cost UnitaryS{} = return Alg.zero @@ -74,7 +74,7 @@ instance HasCost (UStmt sizeT) where bc <- cost body_ustmt return $ wc Alg.+ wc Alg.+ bc -instance HasCost (Stmt sizeT) where +instance HasCost (Stmt size) where -- zero-cost statements cost SkipS = return Alg.zero cost (CommentS _) = return Alg.zero @@ -95,19 +95,19 @@ instance HasCost (Stmt sizeT) where cost WhileKWithCondExpr{} = throwError "unsupported cost" cost ForInArray{} = throwError "unsupported cost" -instance HasCost (ProcDef sizeT) where +instance HasCost (ProcDef size) where cost ProcDef{proc_name, proc_body = ProcBodyC CProcDecl} = pure $ C.query C.Classical proc_name cost ProcDef{proc_name, proc_body = ProcBodyU UProcDecl} = pure $ C.query C.Unitary proc_name cost ProcDef{proc_body = ProcBodyC CProcBody{cproc_body_stmt}} = cost cproc_body_stmt cost ProcDef{proc_body = ProcBodyU UProcBody{uproc_body_stmt}} = cost uproc_body_stmt cachedProcCost :: - ( Integral sizeT + ( Integral size , C.CostModel c - , precT ~ PrecType c + , prec ~ PrecType c , Ord c - , Floating precT - , m ~ CostCalculator sizeT c + , Floating prec + , m ~ CostCalculator size c ) => Ident -> m c @@ -123,14 +123,14 @@ cachedProcCost name = get_cached_cost >>= maybe calc_cost return return c programCost :: - forall sizeT c precT. - ( Integral sizeT + forall size c prec. + ( Integral size , C.CostModel c - , precT ~ PrecType c + , prec ~ PrecType c , Ord c - , Floating precT + , Floating prec ) => - Program sizeT -> + Program size -> (c, CostMap c) programCost (Program ps) = either (\e -> error $ "could not compute cost: " ++ e) id $ do diff --git a/src/Traq/CQPL/Syntax.hs b/src/Traq/CQPL/Syntax.hs index 2aa74e4..e281473 100644 --- a/src/Traq/CQPL/Syntax.hs +++ b/src/Traq/CQPL/Syntax.hs @@ -106,17 +106,17 @@ instance HasAdjoint BasicGate where adjoint g = g -- | Unitary operators in CQPL -data Unitary sizeT +data Unitary size = BasicGateU BasicGate - | RevEmbedU [Ident] (P.BasicExpr sizeT) - | DistrU (P.DistrExpr sizeT) - | Controlled (Unitary sizeT) - | Adjoint (Unitary sizeT) + | RevEmbedU [Ident] (P.BasicExpr size) + | DistrU (P.DistrExpr size) + | Controlled (Unitary size) + | Adjoint (Unitary size) deriving (Eq, Show, Read) -type instance SizeType (Unitary sizeT) = sizeT +type instance SizeType (Unitary size) = size -instance (Show sizeT) => PP.ToCodeString (Unitary sizeT) where +instance (Show size) => PP.ToCodeString (Unitary size) where build (BasicGateU g) = PP.build g build (RevEmbedU xs e) = do e_s <- PP.fromBuild e @@ -127,7 +127,7 @@ instance (Show sizeT) => PP.ToCodeString (Unitary sizeT) where build (Controlled u) = PP.putWord . ("Ctrl-" <>) =<< PP.fromBuild u build (Adjoint u) = PP.putWord . ("Adj-" <>) =<< PP.fromBuild u -instance HasAdjoint (Unitary sizeT) where +instance HasAdjoint (Unitary size) where adjoint (BasicGateU g) = BasicGateU (adjoint g) adjoint u@(RevEmbedU _ _) = u adjoint (Controlled u) = Controlled (adjoint u) @@ -139,30 +139,30 @@ instance HasAdjoint (Unitary sizeT) where -- -------------------------------------------------------------------------------- -- | Unitary Statement -data UStmt sizeT +data UStmt size = USkipS - | UnitaryS {qargs :: [Arg sizeT], unitary :: Unitary sizeT} -- q... *= U - | UCallS {uproc_id :: Ident, dagger :: Bool, qargs :: [Arg sizeT]} -- call F(q...) - | USeqS [UStmt sizeT] -- W1; W2; ... + | UnitaryS {qargs :: [Arg size], unitary :: Unitary size} -- q... *= U + | UCallS {uproc_id :: Ident, dagger :: Bool, qargs :: [Arg size]} -- call F(q...) + | USeqS [UStmt size] -- W1; W2; ... | -- placeholders UCommentS String | -- syntax sugar - URepeatS {n_iter :: P.MetaParam sizeT, uloop_body :: UStmt sizeT} -- repeat k do S; + URepeatS {n_iter :: P.MetaParam size, uloop_body :: UStmt size} -- repeat k do S; | UForInRangeS { iter_meta_var :: Ident - , iter_lim :: P.MetaParam sizeT - , uloop_body :: UStmt sizeT + , iter_lim :: P.MetaParam size + , uloop_body :: UStmt size , dagger :: Bool } - | UWithComputedS {with_ustmt, body_ustmt :: UStmt sizeT} + | UWithComputedS {with_ustmt, body_ustmt :: UStmt size} deriving (Eq, Show, Read) -type instance SizeType (UStmt sizeT) = sizeT +type instance SizeType (UStmt size) = size -mkForInRangeS :: Ident -> P.MetaParam sizeT -> UStmt sizeT -> UStmt sizeT +mkForInRangeS :: Ident -> P.MetaParam size -> UStmt size -> UStmt size mkForInRangeS iter_meta_var iter_lim uloop_body = UForInRangeS{iter_meta_var, iter_lim, uloop_body, dagger = False} -instance HasAdjoint (UStmt sizeT) where +instance HasAdjoint (UStmt size) where adjoint s@(UCommentS _) = s adjoint USkipS = USkipS adjoint s@UCallS{dagger} = s{dagger = not dagger} @@ -176,7 +176,7 @@ showDagger :: Bool -> String showDagger True = "-adj" showDagger False = "" -instance (Show sizeT) => PP.ToCodeString (UStmt sizeT) where +instance (Show size) => PP.ToCodeString (UStmt size) where build USkipS = PP.putLine "skip;" build (UCommentS c) = PP.putComment c build UnitaryS{qargs, unitary} = PP.concatenated $ do @@ -218,29 +218,29 @@ data FunctionCall deriving (Eq, Show, Read) -- | CQ Statement -data Stmt sizeT +data Stmt size = SkipS | CommentS String - | AssignS {rets :: [Ident], expr :: P.BasicExpr sizeT} - | RandomS {rets :: [Ident], distr_expr :: P.DistrExpr sizeT} + | AssignS {rets :: [Ident], expr :: P.BasicExpr size} + | RandomS {rets :: [Ident], distr_expr :: P.DistrExpr size} | RandomDynS {ret :: Ident, max_var :: Ident} - | CallS {fun :: FunctionCall, meta_params :: [Either (MetaParam sizeT) Ident], args :: [Arg sizeT]} - | SeqS [Stmt sizeT] - | IfThenElseS {cond :: Ident, s_true, s_false :: Stmt sizeT} - | RepeatS {n_iter :: MetaParam sizeT, loop_body :: Stmt sizeT} + | CallS {fun :: FunctionCall, meta_params :: [Either (MetaParam size) Ident], args :: [Arg size]} + | SeqS [Stmt size] + | IfThenElseS {cond :: Ident, s_true, s_false :: Stmt size} + | RepeatS {n_iter :: MetaParam size, loop_body :: Stmt size} | -- syntax sugar - WhileK {n_iter :: MetaParam sizeT, cond :: Ident, loop_body :: Stmt sizeT} - | WhileKWithCondExpr {n_iter :: MetaParam sizeT, cond :: Ident, cond_expr :: P.BasicExpr sizeT, loop_body :: Stmt sizeT} - | ForInArray {loop_index :: Ident, loop_index_ty :: VarType sizeT, loop_values :: [P.BasicExpr sizeT], loop_body :: Stmt sizeT} - | ForInRangeS {iter_meta_var :: Ident, iter_lim :: P.MetaParam sizeT, loop_body :: Stmt sizeT} + WhileK {n_iter :: MetaParam size, cond :: Ident, loop_body :: Stmt size} + | WhileKWithCondExpr {n_iter :: MetaParam size, cond :: Ident, cond_expr :: P.BasicExpr size, loop_body :: Stmt size} + | ForInArray {loop_index :: Ident, loop_index_ty :: VarType size, loop_values :: [P.BasicExpr size], loop_body :: Stmt size} + | ForInRangeS {iter_meta_var :: Ident, iter_lim :: P.MetaParam size, loop_body :: Stmt size} deriving (Eq, Show, Read) -type instance SizeType (Stmt sizeT) = sizeT +type instance SizeType (Stmt size) = size -ifThenS :: Ident -> Stmt sizeT -> Stmt sizeT +ifThenS :: Ident -> Stmt size -> Stmt size ifThenS cond s_true = IfThenElseS{cond, s_true, s_false = SkipS} -instance (Show sizeT) => PP.ToCodeString (Stmt sizeT) where +instance (Show size) => PP.ToCodeString (Stmt size) where build SkipS = PP.putLine "skip;" build AssignS{rets, expr} = do e_s <- PP.fromBuild expr @@ -306,20 +306,20 @@ instance PP.ToCodeString ParamTag where build ParamUnk = PP.putWord "" -- | Unitary Procedure body: either a statement (with parameter name bindings) or a tick. -data UProcBody sizeT +data UProcBody size = UProcBody { uproc_param_names :: [Ident] , uproc_param_tags :: [ParamTag] - , uproc_body_stmt :: UStmt sizeT + , uproc_body_stmt :: UStmt size } | UProcDecl deriving (Eq, Show, Read) -type instance SizeType (UProcBody sizeT) = sizeT +type instance SizeType (UProcBody size) = size buildUProcBody :: - (MonadWriter [String] m, MonadFail m, Show sizeT) => - UProcBody sizeT -> + (MonadWriter [String] m, MonadFail m, Show size) => + UProcBody size -> String -> [String] -> m () @@ -335,18 +335,18 @@ buildUProcBody UProcBody{uproc_param_names, uproc_param_tags, uproc_body_stmt} n PP.bracedBlockWith header $ PP.build uproc_body_stmt -- | Classical Procedure body: either a tick, or statement with bindings for parameters names, and optionally using local variables. -data CProcBody sizeT +data CProcBody size = CProcBody { cproc_param_names :: [Ident] - , cproc_local_vars :: [(Ident, VarType sizeT)] - , cproc_body_stmt :: Stmt sizeT + , cproc_local_vars :: [(Ident, VarType size)] + , cproc_body_stmt :: Stmt size } | CProcDecl deriving (Eq, Show, Read) buildCProcBody :: - (MonadWriter [String] m, MonadFail m, Show sizeT) => - CProcBody sizeT -> + (MonadWriter [String] m, MonadFail m, Show size) => + CProcBody size -> String -> [String] -> m () @@ -368,52 +368,52 @@ buildCProcBody CProcBody{cproc_param_names, cproc_local_vars, cproc_body_stmt} n (PP.commaList local_list) PP.bracedBlockWith header $ PP.build cproc_body_stmt -type instance SizeType (CProcBody sizeT) = sizeT +type instance SizeType (CProcBody size) = size -data ProcBody sizeT - = ProcBodyU (UProcBody sizeT) - | ProcBodyC (CProcBody sizeT) +data ProcBody size + = ProcBodyU (UProcBody size) + | ProcBodyC (CProcBody size) deriving (Eq, Read, Show) class ClassifyProc p where isUProc :: p -> Bool isCProc :: p -> Bool -instance ClassifyProc (ProcBody sizeT) where +instance ClassifyProc (ProcBody size) where isUProc (ProcBodyU _) = True isUProc _ = False isCProc (ProcBodyC _) = True isCProc _ = False -type instance SizeType (ProcBody sizeT) = sizeT +type instance SizeType (ProcBody size) = size buildProcBody :: - (MonadWriter [String] m, MonadFail m, Show sizeT) => - ProcBody sizeT -> + (MonadWriter [String] m, MonadFail m, Show size) => + ProcBody size -> String -> [String] -> m () buildProcBody (ProcBodyU p) = buildUProcBody p buildProcBody (ProcBodyC p) = buildCProcBody p -data ProcDef sizeT +data ProcDef size = ProcDef { info_comment :: String , proc_name :: Ident , proc_meta_params :: [Ident] - , proc_param_types :: [VarType sizeT] - , proc_body :: ProcBody sizeT + , proc_param_types :: [VarType size] + , proc_body :: ProcBody size } deriving (Eq, Read, Show) -instance ClassifyProc (ProcDef sizeT) where +instance ClassifyProc (ProcDef size) where isUProc = isUProc . proc_body isCProc = isCProc . proc_body -type instance SizeType (ProcDef sizeT) = sizeT +type instance SizeType (ProcDef size) = size -instance (Show sizeT) => PP.ToCodeString (ProcDef sizeT) where +instance (Show size) => PP.ToCodeString (ProcDef size) where build ProcDef{info_comment, proc_name, proc_meta_params, proc_param_types, proc_body} = do PP.putComment info_comment @@ -432,20 +432,20 @@ instance (Show sizeT) => PP.ToCodeString (ProcDef sizeT) where -- ================================================================================ -- | CQ procedures -type ProcCtx sizeT = Ctx.Context (ProcDef sizeT) +type ProcCtx size = Ctx.Context (ProcDef size) class HasProcCtx s where - _procCtx :: (sizeT ~ SizeType s, precT ~ PrecType s) => Lens' s (ProcCtx sizeT) + _procCtx :: (size ~ SizeType s, prec ~ PrecType s) => Lens' s (ProcCtx size) -instance HasProcCtx (ProcCtx sizeT) where _procCtx = id +instance HasProcCtx (ProcCtx size) where _procCtx = id -- | CQ Program -newtype Program sizeT = Program [ProcDef sizeT] +newtype Program size = Program [ProcDef size] deriving (Eq, Show, Read) -type instance SizeType (Program sizeT) = sizeT +type instance SizeType (Program size) = size -instance (Show sizeT) => PP.ToCodeString (Program sizeT) where +instance (Show size) => PP.ToCodeString (Program size) where build (Program ps) = do mapM_ (PP.build >=> const PP.endl) ps @@ -453,29 +453,29 @@ instance (Show sizeT) => PP.ToCodeString (Program sizeT) where -- Lenses -- ================================================================================ -instance HasAst (Stmt sizeT) where +instance HasAst (Stmt size) where _ast focus (SeqS ss) = SeqS <$> traverse focus ss _ast focus (IfThenElseS cond s_true s_false) = IfThenElseS cond <$> focus s_true <*> focus s_false _ast focus (RepeatS n_iter loop_body) = RepeatS n_iter <$> focus loop_body _ast _ s = pure s -instance HasStmt (Stmt sizeT) where - type StmtOf (Stmt sizeT) = Stmt sizeT +instance HasStmt (Stmt size) where + type StmtOf (Stmt size) = Stmt size _stmt = id -instance HasStmt (CProcBody sizeT) where - type StmtOf (CProcBody sizeT) = Stmt sizeT +instance HasStmt (CProcBody size) where + type StmtOf (CProcBody size) = Stmt size _stmt focus b@CProcBody{cproc_body_stmt} = focus cproc_body_stmt <&> \s' -> b{cproc_body_stmt = s'} _stmt _ b@CProcDecl{} = pure b -instance HasStmt (ProcDef sizeT) where - type StmtOf (ProcDef sizeT) = Stmt sizeT +instance HasStmt (ProcDef size) where + type StmtOf (ProcDef size) = Stmt size _stmt focus p@ProcDef{proc_body = ProcBodyC b} = _stmt focus b <&> \b' -> p{proc_body = ProcBodyC b'} _stmt _ p = pure p -instance HasStmt (Program sizeT) where - type StmtOf (Program sizeT) = Stmt sizeT +instance HasStmt (Program size) where + type StmtOf (Program size) = Stmt size _stmt focus (Program ps) = Program <$> traverse (_stmt focus) ps -- ================================================================================ @@ -485,25 +485,25 @@ instance HasStmt (Program sizeT) where -- | bounded while loop whileK :: -- | iteration limit - MetaParam sizeT -> + MetaParam size -> -- | loop condition Ident -> -- | loop body - Stmt sizeT -> - Stmt sizeT + Stmt size -> + Stmt size whileK k cond body = RepeatS k $ IfThenElseS cond body SkipS -- | bounded while loop given an expression for the loop condition whileKWithCondExpr :: -- | iteration limit - MetaParam sizeT -> + MetaParam size -> -- | loop condition variable Ident -> -- | loop condition expression - P.BasicExpr sizeT -> + P.BasicExpr size -> -- | loop body - Stmt sizeT -> - Stmt sizeT + Stmt size -> + Stmt size whileKWithCondExpr k cond_var cond_expr body = SeqS [ compute_cond @@ -512,7 +512,7 @@ whileKWithCondExpr k cond_var cond_expr body = where compute_cond = AssignS [cond_var] cond_expr -forInArray :: Ident -> VarType sizeT -> [P.BasicExpr sizeT] -> Stmt sizeT -> Stmt sizeT +forInArray :: Ident -> VarType size -> [P.BasicExpr size] -> Stmt size -> Stmt size forInArray i _ty ix_vals s = SeqS [ SeqS [AssignS{rets = [i], expr = v}, s] @@ -523,12 +523,12 @@ forInArray i _ty ix_vals s = class CanDesugar p where desugarS :: p -> Maybe p -instance CanDesugar (Stmt sizeT) where +instance CanDesugar (Stmt size) where desugarS WhileK{n_iter, cond, loop_body} = Just $ whileK n_iter cond loop_body desugarS WhileKWithCondExpr{n_iter, cond, cond_expr, loop_body} = Just $ whileKWithCondExpr n_iter cond cond_expr loop_body desugarS ForInArray{loop_index, loop_index_ty, loop_values, loop_body} = Just $ forInArray loop_index loop_index_ty loop_values loop_body desugarS _ = Nothing -instance CanDesugar (UStmt sizeT) where +instance CanDesugar (UStmt size) where desugarS UWithComputedS{with_ustmt, body_ustmt} = Just $ USeqS [with_ustmt, body_ustmt, adjoint with_ustmt] desugarS _ = Nothing diff --git a/src/Traq/CQPL/TypeCheck.hs b/src/Traq/CQPL/TypeCheck.hs index eeabea6..84fbc0e 100644 --- a/src/Traq/CQPL/TypeCheck.hs +++ b/src/Traq/CQPL/TypeCheck.hs @@ -54,10 +54,10 @@ ensureEqual expected actual err = do -- | Verify that the argument types match the deduced types verifyArgTys :: - forall sizeT m. - (P.TypingReqs sizeT, MonadError Err.MyError m) => - [P.VarType sizeT] -> - [P.VarType sizeT] -> + forall size m. + (P.TypingReqs size, MonadError Err.MyError m) => + [P.VarType size] -> + [P.VarType size] -> m () verifyArgTys arg_tys tys = do when (length arg_tys /= length tys) $ @@ -91,15 +91,15 @@ getArgTy (ArrElemArg arg _) = do -- | Verify that the arguments match the deduced types verifyArgs :: - forall sizeT env m. - ( P.TypingReqs sizeT + forall size env m. + ( P.TypingReqs size , MonadError Err.MyError m , MonadReader env m , P.HasTypingCtx env - , sizeT ~ SizeType env + , size ~ SizeType env ) => - [Arg sizeT] -> - [P.VarType sizeT] -> + [Arg size] -> + [P.VarType size] -> m () verifyArgs args tys = do arg_tys <- forM args getArgTy @@ -110,19 +110,19 @@ verifyArgs args tys = do -- ================================================================================ -- | Env for type checking -data CheckingCtx sizeT = CheckingCtx (ProcCtx sizeT) (P.TypingCtx sizeT) +data CheckingCtx size = CheckingCtx (ProcCtx size) (P.TypingCtx size) deriving (Generic, HasDefault) -type instance SizeType (CheckingCtx sizeT) = sizeT +type instance SizeType (CheckingCtx size) = size -instance HasProcCtx (CheckingCtx sizeT) where +instance HasProcCtx (CheckingCtx size) where _procCtx focus (CheckingCtx p t) = focus p <&> \p' -> CheckingCtx p' t -instance P.HasTypingCtx (CheckingCtx sizeT) where +instance P.HasTypingCtx (CheckingCtx size) where _typingCtx focus (CheckingCtx p t) = focus t <&> \t' -> CheckingCtx p t' -- | Monad for type checking -type TypeChecker sizeT = ReaderT (CheckingCtx sizeT) (Either Err.MyError) +type TypeChecker size = ReaderT (CheckingCtx size) (Either Err.MyError) -- ================================================================================ -- Type Checking @@ -139,7 +139,7 @@ typeCheckBasicGate (PhaseOnZero _) _ = return () typeCheckBasicGate COPY tys = let n = length tys `div` 2 in verifyArgTys (take n tys) (drop n tys) typeCheckBasicGate SWAP tys = let n = length tys `div` 2 in verifyArgTys (take n tys) (drop n tys) -typeCheckUnitary :: forall sizeT. (P.TypingReqs sizeT) => Unitary sizeT -> [P.VarType sizeT] -> TypeChecker sizeT () +typeCheckUnitary :: forall size. (P.TypingReqs size) => Unitary size -> [P.VarType size] -> TypeChecker size () typeCheckUnitary (BasicGateU g) tys = typeCheckBasicGate g tys typeCheckUnitary (DistrU (P.UniformE ty)) tys = verifyArgTys tys [ty] typeCheckUnitary (DistrU (P.BernoulliE _)) tys = verifyArgTys tys [P.tbool] @@ -162,7 +162,7 @@ typeCheckUnitary (Controlled u) tys = do typeCheckUnitary u (tail tys) typeCheckUnitary (Adjoint u) tys = typeCheckUnitary u tys -typeCheckUStmt :: forall sizeT. (P.TypingReqs sizeT) => UStmt sizeT -> TypeChecker sizeT () +typeCheckUStmt :: forall size. (P.TypingReqs size) => UStmt size -> TypeChecker size () -- single statements typeCheckUStmt USkipS = return () typeCheckUStmt (UCommentS _) = return () @@ -187,7 +187,7 @@ typeCheckUStmt UForInRangeS{iter_meta_var, iter_lim, uloop_body} = do typeCheckUStmt' uloop_body typeCheckUStmt UWithComputedS{with_ustmt, body_ustmt} = mapM_ typeCheckUStmt' [with_ustmt, body_ustmt] -typeCheckUStmt' :: (P.TypingReqs sizeT) => UStmt sizeT -> TypeChecker sizeT () +typeCheckUStmt' :: (P.TypingReqs size) => UStmt size -> TypeChecker size () typeCheckUStmt' s = do gamma <- view P._typingCtx typeCheckUStmt s @@ -196,10 +196,10 @@ typeCheckUStmt' s = do -- | Check a statement typeCheckStmt :: - forall sizeT. - (P.TypingReqs sizeT) => - Stmt sizeT -> - TypeChecker sizeT () + forall size. + (P.TypingReqs size) => + Stmt size -> + TypeChecker size () typeCheckStmt SkipS = return () typeCheckStmt (CommentS _) = return () -- Simple statements @@ -267,12 +267,12 @@ typeCheckStmt s = case desugarS s of Nothing -> error $ "Unable to TypeCheck: " ++ show s typeCheckUProcBody :: - forall sizeT. - (P.TypingReqs sizeT) => - UProcBody sizeT -> + forall size. + (P.TypingReqs size) => + UProcBody size -> -- | parameter types - [P.VarType sizeT] -> - TypeChecker sizeT () + [P.VarType size] -> + TypeChecker size () -- declaration with a tick typeCheckUProcBody UProcDecl{} _ = return () -- definition with a body @@ -286,12 +286,12 @@ typeCheckUProcBody procdef@UProcBody{uproc_param_names, uproc_body_stmt} tys = d -- | Check a procedure def typeCheckCProcBody :: - forall sizeT. - (P.TypingReqs sizeT) => - CProcBody sizeT -> + forall size. + (P.TypingReqs size) => + CProcBody size -> -- | parameter types - [P.VarType sizeT] -> - TypeChecker sizeT () + [P.VarType size] -> + TypeChecker size () -- declaration with a tick typeCheckCProcBody CProcDecl{} _ = return () -- definition with a body @@ -308,10 +308,10 @@ typeCheckCProcBody CProcBody{cproc_param_names, cproc_local_vars, cproc_body_stm typeCheckStmt cproc_body_stmt typeCheckProc :: - forall sizeT. - (P.TypingReqs sizeT) => - ProcDef sizeT -> - TypeChecker sizeT () + forall size. + (P.TypingReqs size) => + ProcDef size -> + TypeChecker size () typeCheckProc ProcDef{proc_name, proc_param_types, proc_body} = case proc_body of ProcBodyC cbody -> typeCheckCProcBody cbody proc_param_types @@ -320,9 +320,9 @@ typeCheckProc ProcDef{proc_name, proc_param_types, proc_body} = -- | Check an entire program given the input bindings. typeCheckProgram :: - forall sizeT. - (P.TypingReqs sizeT) => - Program sizeT -> + forall size. + (P.TypingReqs size) => + Program size -> Either Err.MyError () typeCheckProgram (Program ps) = do let env = diff --git a/src/Traq/Compiler/Prelude.hs b/src/Traq/Compiler/Prelude.hs index 003b796..b4bdedd 100644 --- a/src/Traq/Compiler/Prelude.hs +++ b/src/Traq/Compiler/Prelude.hs @@ -98,22 +98,22 @@ mkUProcName s = s ++ "_U" data ProcSignature size = ProcSignature {in_tys, out_tys, aux_tys :: [P.VarType size]} -- | A global lowering context. -data LoweringCtx sizeT +data LoweringCtx size = LoweringCtx -- | The set of already used identifiers (to generate unique ones) (Set.Set Ident) -- | The typing context: mapping all variables in context to their types. - (P.TypingCtx sizeT) + (P.TypingCtx size) -- | Signature of each uproc - (Map.Map Ident (ProcSignature sizeT)) + (Map.Map Ident (ProcSignature size)) deriving (Generic, HasDefault) -type instance SizeType (LoweringCtx sizeT) = sizeT +type instance SizeType (LoweringCtx size) = size -instance HasUniqNamesCtx (LoweringCtx sizeT) where +instance HasUniqNamesCtx (LoweringCtx size) where _uniqNamesCtx focus (LoweringCtx a b c) = focus a <&> \a' -> LoweringCtx a' b c -instance P.HasTypingCtx (LoweringCtx sizeT) where +instance P.HasTypingCtx (LoweringCtx size) where _typingCtx focus (LoweringCtx a b c) = focus b <&> \b' -> LoweringCtx a b' c _procSignatures :: Lens' (LoweringCtx size) (Map.Map Ident (ProcSignature size)) diff --git a/src/Traq/Compiler/Unitary.hs b/src/Traq/Compiler/Unitary.hs index b227cb0..bd2ac5e 100644 --- a/src/Traq/Compiler/Unitary.hs +++ b/src/Traq/Compiler/Unitary.hs @@ -40,14 +40,14 @@ import qualified Traq.ProtoLang as P -- ================================================================================ -- | Allocate an ancilla register, and update the typing context. -allocAncillaWithPref :: (sizeT ~ SizeType ext) => Ident -> P.VarType sizeT -> CompilerT ext Ident +allocAncillaWithPref :: (size ~ SizeType ext) => Ident -> P.VarType size -> CompilerT ext Ident allocAncillaWithPref pref ty = do name <- newIdent pref zoom P._typingCtx $ Ctx.put name ty return name -- | Allocate an ancilla register @aux_<>@, and update the typing context. -allocAncilla :: (sizeT ~ SizeType ext) => P.VarType sizeT -> CompilerT ext Ident +allocAncilla :: (size ~ SizeType ext) => P.VarType size -> CompilerT ext Ident allocAncilla = allocAncillaWithPref "aux" -- | Allocate fresh set of auxiliaries corresponding to the types of given vars. diff --git a/src/Traq/Examples/MatrixSearch.hs b/src/Traq/Examples/MatrixSearch.hs index 7c34eed..5ac700c 100644 --- a/src/Traq/Examples/MatrixSearch.hs +++ b/src/Traq/Examples/MatrixSearch.hs @@ -10,11 +10,11 @@ import Traq.ProtoLang.Syntax import Traq.ProtoLang.TypeCheck (tbool) mkMatrixExample :: - forall ext sizeT. - (sizeT ~ SizeType ext, Num sizeT) => - (VarType sizeT -> PartialFun -> Expr ext) -> - sizeT -> - sizeT -> + forall ext size. + (size ~ SizeType ext, Num size) => + (VarType size -> PartialFun -> Expr ext) -> + size -> + size -> Program ext mkMatrixExample mkAny n m = Program @@ -24,7 +24,7 @@ mkMatrixExample mkAny n m = , NamedFunDef check_matrix_name check_matrix ] where - tyI, tyJ :: VarType sizeT + tyI, tyJ :: VarType size tyI = Fin n tyJ = Fin m @@ -104,5 +104,5 @@ mkMatrixExample mkAny n m = where ok = "ok" -matrixExampleS :: SizeT -> SizeT -> Program (DefaultPrims SizeT precT) +matrixExampleS :: SizeT -> SizeT -> Program (DefaultPrims SizeT prec) matrixExampleS = mkMatrixExample (\ty pfun -> PrimCallE $ Primitive [pfun] $ QAny $ QSearchCFNW $ PrimSearch AnyK ty) diff --git a/src/Traq/Examples/Search.hs b/src/Traq/Examples/Search.hs index 10d9ba4..12c6c76 100644 --- a/src/Traq/Examples/Search.hs +++ b/src/Traq/Examples/Search.hs @@ -6,13 +6,13 @@ import Traq.Primitives.Search.Prelude import Traq.Primitives.Search.QSearchCFNW import Traq.ProtoLang.Syntax -arraySearch :: forall precT. SizeT -> Program (DefaultPrims SizeT precT) +arraySearch :: forall prec. SizeT -> Program (DefaultPrims SizeT prec) arraySearch n = Program [NamedFunDef "Oracle" oracle_decl, NamedFunDef "main" main_def] where - oracle_decl :: FunDef (DefaultPrims SizeT precT) + oracle_decl :: FunDef (DefaultPrims SizeT prec) oracle_decl = FunDef{param_types = [Fin n], ret_types = [Fin 2], mbody = Nothing} - main_def :: FunDef (DefaultPrims SizeT precT) + main_def :: FunDef (DefaultPrims SizeT prec) main_def = FunDef { param_types = [] @@ -30,13 +30,13 @@ arraySearch n = Program [NamedFunDef "Oracle" oracle_decl, NamedFunDef "main" ma } } -arraySearchIx :: forall precT. SizeT -> Program (DefaultPrims SizeT precT) +arraySearchIx :: forall prec. SizeT -> Program (DefaultPrims SizeT prec) arraySearchIx n = Program [NamedFunDef "Oracle" oracle_decl, NamedFunDef "check" check, NamedFunDef "main" main_def] where - oracle_decl :: FunDef (DefaultPrims SizeT precT) + oracle_decl :: FunDef (DefaultPrims SizeT prec) oracle_decl = FunDef{param_types = [Fin n], ret_types = [Fin 2], mbody = Nothing} - check :: FunDef (DefaultPrims SizeT precT) + check :: FunDef (DefaultPrims SizeT prec) check = FunDef { param_types = [Fin n] @@ -54,7 +54,7 @@ arraySearchIx n = Program [NamedFunDef "Oracle" oracle_decl, NamedFunDef "check" , ret_types = [Fin 2] } - main_def :: FunDef (DefaultPrims SizeT precT) + main_def :: FunDef (DefaultPrims SizeT prec) main_def = FunDef { param_types = [] diff --git a/src/Traq/Examples/TreeGenerator.hs b/src/Traq/Examples/TreeGenerator.hs index 0032908..ab78899 100644 --- a/src/Traq/Examples/TreeGenerator.hs +++ b/src/Traq/Examples/TreeGenerator.hs @@ -3,7 +3,7 @@ module Traq.Examples.TreeGenerator where import Traq.Prelude import Traq.ProtoLang.Syntax -treeGeneratorExample :: (Num sizeT, SizeType ext ~ sizeT) => sizeT -> sizeT -> sizeT -> Program ext +treeGeneratorExample :: (Num size, SizeType ext ~ size) => size -> size -> size -> Program ext treeGeneratorExample n w p = Program [ NamedFunDef diff --git a/src/Traq/Primitives.hs b/src/Traq/Primitives.hs index 5e6388f..5e97e08 100644 --- a/src/Traq/Primitives.hs +++ b/src/Traq/Primitives.hs @@ -40,19 +40,19 @@ import qualified Traq.ProtoLang as P -- Default primitives: Supports exp cost and compile -- ================================================================================ -data DefaultPrimCollection sizeT precT - = QAny (QSearchCFNW sizeT precT) - | RAny (RandomSearch sizeT precT) - | DAny (DetSearch sizeT precT) - | CAmp (CAmplify sizeT precT) - | QAmp (QAmplify sizeT precT) - | QMax' (QMax sizeT precT) +data DefaultPrimCollection size prec + = QAny (QSearchCFNW size prec) + | RAny (RandomSearch size prec) + | DAny (DetSearch size prec) + | CAmp (CAmplify size prec) + | QAmp (QAmplify size prec) + | QMax' (QMax size prec) deriving (Eq, Show, Generic) -type instance SizeType (DefaultPrimCollection sizeT precT) = sizeT -type instance PrecType (DefaultPrimCollection sizeT precT) = precT +type instance SizeType (DefaultPrimCollection size prec) = size +type instance PrecType (DefaultPrimCollection size prec) = prec -type instance PrimFnShape (DefaultPrimCollection sizeT precT) = [] +type instance PrimFnShape (DefaultPrimCollection size prec) = [] instance P.MapSize (DefaultPrimCollection size prec) where type MappedSize (DefaultPrimCollection size prec) size' = DefaultPrimCollection size' prec @@ -121,7 +121,7 @@ instance (size ~ SizeT, P.TypingReqs size, Integral size, RealFloat prec, Show prec) => QuantumCompilePrim (DefaultPrimCollection size prec) size prec -type DefaultPrims sizeT precT = Primitive (DefaultPrimCollection sizeT precT) +type DefaultPrims size prec = Primitive (DefaultPrimCollection size prec) type DefaultPrims' = DefaultPrims SizeT Double @@ -134,10 +134,10 @@ data WorstCasePrimCollection size prec | Simon (SimonsFindXorPeriod size prec) deriving (Eq, Show, Generic) -type instance SizeType (WorstCasePrimCollection sizeT precT) = sizeT -type instance PrecType (WorstCasePrimCollection sizeT precT) = precT +type instance SizeType (WorstCasePrimCollection size prec) = size +type instance PrecType (WorstCasePrimCollection size prec) = prec -type instance PrimFnShape (WorstCasePrimCollection sizeT precT) = [] +type instance PrimFnShape (WorstCasePrimCollection size prec) = [] instance P.MapSize (WorstCasePrimCollection size prec) where type MappedSize (WorstCasePrimCollection size prec) size' = WorstCasePrimCollection size' prec @@ -175,6 +175,6 @@ instance (size ~ SizeT, RealFloat prec, Show prec) => QuantumCompilePrim (WorstCasePrimCollection size prec) size prec -type WorstCasePrims sizeT precT = Primitive (WorstCasePrimCollection sizeT precT) +type WorstCasePrims size prec = Primitive (WorstCasePrimCollection size prec) type WorstCasePrims' = WorstCasePrims SizeT Double diff --git a/src/Traq/Primitives/Amplify/CAmplify.hs b/src/Traq/Primitives/Amplify/CAmplify.hs index b4b0c87..6894285 100644 --- a/src/Traq/Primitives/Amplify/CAmplify.hs +++ b/src/Traq/Primitives/Amplify/CAmplify.hs @@ -25,15 +25,15 @@ import Traq.Primitives.Class import qualified Traq.ProtoLang as P -- | Classical (probabilistic) bounded repetition. -newtype CAmplify sizeT precT = CAmplify (Amplify sizeT precT) +newtype CAmplify size prec = CAmplify (Amplify size prec) deriving (Eq, Show, Read, Generic) -type instance SizeType (CAmplify sizeT precT) = sizeT -type instance PrecType (CAmplify sizeT precT) = precT +type instance SizeType (CAmplify size prec) = size +type instance PrecType (CAmplify size prec) = prec type instance PrimFnShape (CAmplify size prec) = SamplerFn -instance Amplify sizeT precT :<: CAmplify sizeT precT +instance Amplify size prec :<: CAmplify size prec instance P.MapSize (CAmplify size prec) where type MappedSize (CAmplify size prec) size' = CAmplify size' prec @@ -46,10 +46,10 @@ instance (Show prec, Fractional prec) => SerializePrim (CAmplify size prec) wher parsePrimParams tp name = CAmplify <$> parsePrimParams tp name printPrimParams (CAmplify prim) = printPrimParams prim -instance (P.TypingReqs sizeT) => TypeCheckPrim (CAmplify sizeT precT) sizeT where +instance (P.TypingReqs size) => TypeCheckPrim (CAmplify size prec) size where inferRetTypesPrim (CAmplify p) = inferRetTypesPrim p -instance (P.EvalReqs sizeT precT, Ord precT) => EvalPrim (CAmplify sizeT precT) sizeT precT where +instance (P.EvalReqs size prec, Ord prec) => EvalPrim (CAmplify size prec) size prec where evalPrim (CAmplify p) = evalPrim p -- ================================================================================ @@ -57,11 +57,11 @@ instance (P.EvalReqs sizeT precT, Ord precT) => EvalPrim (CAmplify sizeT precT) -- ================================================================================ -- | Maximum queries -_QMax :: forall precT. (Floating precT) => A.FailProb precT -> precT -> precT +_QMax :: forall prec. (Floating prec) => A.FailProb prec -> prec -> prec _QMax eps p_min = logBase (1 / (1 - p_min)) (1 / A.getFailProb eps) -- | Expected queries -_EQ :: forall precT. (Floating precT, Ord precT) => A.FailProb precT -> precT -> precT -> precT +_EQ :: forall prec. (Floating prec, Ord prec) => A.FailProb prec -> prec -> prec -> prec _EQ eps p_min p_good | p_good >= p_min = 1 / p_good | p_good == 0 = _QMax eps p_min diff --git a/src/Traq/Primitives/Amplify/Prelude.hs b/src/Traq/Primitives/Amplify/Prelude.hs index 3a92da2..c893b7b 100644 --- a/src/Traq/Primitives/Amplify/Prelude.hs +++ b/src/Traq/Primitives/Amplify/Prelude.hs @@ -30,11 +30,11 @@ import qualified Traq.ProtoLang as P The sampler must return a sample and a boolean flag, and if there is a good sample, it should return one with probability at least p_min. -} -data Amplify sizeT precT = Amplify {p_min :: precT} +data Amplify size prec = Amplify {p_min :: prec} deriving (Eq, Show, Read) -type instance SizeType (Amplify sizeT precT) = sizeT -type instance PrecType (Amplify sizeT precT) = precT +type instance SizeType (Amplify size prec) = size +type instance PrecType (Amplify size prec) = prec newtype SamplerFn a = SamplerFn a @@ -57,7 +57,7 @@ instance (Show prec, Fractional prec) => SerializePrim (Amplify size prec) where printPrimParams Amplify{p_min} = [show p_min] -- Type check -instance (P.TypingReqs sizeT) => TypeCheckPrim (Amplify sizeT precT) sizeT where +instance (P.TypingReqs size) => TypeCheckPrim (Amplify size prec) size where inferRetTypesPrim _ (SamplerFn sampler_ty) = do let P.FnType param_types ret_types = sampler_ty @@ -76,8 +76,8 @@ and get success probability Psucc := P(b=1) conditioned on μ. Finally, returnin based on Psucc. -} instance - (Ord precT, sizeT ~ SizeT, P.EvalReqs sizeT precT) => - EvalPrim (Amplify sizeT precT) sizeT precT + (Ord prec, size ~ SizeT, P.EvalReqs size prec) => + EvalPrim (Amplify size prec) size prec where evalPrim Amplify{p_min} (SamplerFn sampler) = do -- result distribution diff --git a/src/Traq/Primitives/Amplify/QAmplify.hs b/src/Traq/Primitives/Amplify/QAmplify.hs index 3c2694a..7fe56d3 100644 --- a/src/Traq/Primitives/Amplify/QAmplify.hs +++ b/src/Traq/Primitives/Amplify/QAmplify.hs @@ -36,15 +36,15 @@ import Traq.Primitives.Class import qualified Traq.ProtoLang as P -- | Quantum Amplitude Amplification. -newtype QAmplify sizeT precT = QAmplify (Amplify sizeT precT) +newtype QAmplify size prec = QAmplify (Amplify size prec) deriving (Eq, Show, Read, Generic) -type instance SizeType (QAmplify sizeT precT) = sizeT -type instance PrecType (QAmplify sizeT precT) = precT +type instance SizeType (QAmplify size prec) = size +type instance PrecType (QAmplify size prec) = prec type instance PrimFnShape (QAmplify size prec) = SamplerFn -instance Amplify sizeT precT :<: QAmplify sizeT precT +instance Amplify size prec :<: QAmplify size prec instance P.MapSize (QAmplify size prec) where type MappedSize (QAmplify size prec) size' = QAmplify size' prec @@ -57,10 +57,10 @@ instance (Show prec, Fractional prec) => SerializePrim (QAmplify size prec) wher parsePrimParams tp name = QAmplify <$> parsePrimParams tp name printPrimParams (QAmplify prim) = printPrimParams prim -instance (P.TypingReqs sizeT) => TypeCheckPrim (QAmplify sizeT precT) sizeT where +instance (P.TypingReqs size) => TypeCheckPrim (QAmplify size prec) size where inferRetTypesPrim (QAmplify p) = inferRetTypesPrim p -instance (P.EvalReqs sizeT precT, Ord precT) => EvalPrim (QAmplify sizeT precT) sizeT precT where +instance (P.EvalReqs size prec, Ord prec) => EvalPrim (QAmplify size prec) size prec where evalPrim (QAmplify p) = evalPrim p -- ================================================================================ @@ -68,7 +68,7 @@ instance (P.EvalReqs sizeT precT, Ord precT) => EvalPrim (QAmplify sizeT precT) -- ================================================================================ -- | Fixed-Point Amplitude Amplification. -_FPAA_L :: forall precT. (Floating precT) => A.FailProb precT -> precT -> precT +_FPAA_L :: forall prec. (Floating prec) => A.FailProb prec -> prec -> prec _FPAA_L eps p_min = acosh (1 / sqrt (A.getFailProb eps)) / acosh (1 / sqrt (1 - p_min)) instance (P.TypingReqs size, Floating prec) => UnitaryCostPrim (QAmplify size prec) size prec where @@ -87,11 +87,11 @@ _WQSearch_N_Runs eps = logBase 3 (1 / A.getFailProb eps) _WQSearch_Q_Max :: forall prec. (Floating prec) => prec -> prec _WQSearch_Q_Max p_min = _WQSearch_alpha / sqrt p_min -_WQSearch :: forall precT. (Floating precT) => A.FailProb precT -> precT -> precT +_WQSearch :: forall prec. (Floating prec) => A.FailProb prec -> prec -> prec _WQSearch eps p_min = _WQSearch_N_Runs eps * _WQSearch_Q_Max p_min -- | Eq. 3 of https://arxiv.org/abs/2203.04975 -_F :: forall precT. (Floating precT, Ord precT) => precT -> precT +_F :: forall prec. (Floating prec, Ord prec) => prec -> prec _F p_good | p_good >= 0.25 = 2.0344 | otherwise = _WQSearch_alpha / (3 * sqrt p_good) @@ -99,7 +99,7 @@ _F p_good {- | Cost of quantum search adapted to general amplitude amplification. Eq. 2 of https://arxiv.org/abs/2203.04975 -} -_EQSearch :: forall precT. (Floating precT, Ord precT) => A.FailProb precT -> precT -> precT -> precT +_EQSearch :: forall prec. (Floating prec, Ord prec) => A.FailProb prec -> prec -> prec -> prec _EQSearch eps p_min p_good | p_good == 0 = _WQSearch eps p_min | otherwise = _F p_good * (1 + 1 / (1 - term)) diff --git a/src/Traq/Primitives/Count/QCount.hs b/src/Traq/Primitives/Count/QCount.hs index 6e739f1..d44efe6 100644 --- a/src/Traq/Primitives/Count/QCount.hs +++ b/src/Traq/Primitives/Count/QCount.hs @@ -16,11 +16,11 @@ import Traq.Prelude import Traq.Primitives.Class import qualified Traq.ProtoLang as P -data QCount sizeT precT = QCount {arg_ty :: P.VarType sizeT} +data QCount size prec = QCount {arg_ty :: P.VarType size} deriving (Eq, Show, Read) -type instance SizeType (QCount sizeT precT) = sizeT -type instance PrecType (QCount sizeT precT) = precT +type instance SizeType (QCount size prec) = size +type instance PrecType (QCount size prec) = prec newtype QCountFunArg a = QCountFunArg {fun :: a} @@ -32,13 +32,13 @@ instance ValidPrimShape QCountFunArg where shapeToList QCountFunArg{fun} = [fun] -instance (Show sizeT) => SerializePrim (QCount sizeT precT) where +instance (Show size) => SerializePrim (QCount size prec) where primNames = ["count"] parsePrimParams tp _ = QCount <$> P.varType tp printPrimParams QCount{arg_ty} = [show arg_ty] -- Type check -instance (Eq sizeT, Integral sizeT) => TypeCheckPrim (QCount sizeT precT) sizeT where +instance (Eq size, Integral size) => TypeCheckPrim (QCount size prec) size where inferRetTypesPrim QCount{arg_ty} QCountFunArg{fun} = do let P.FnType param_tys ret_tys = fun diff --git a/src/Traq/Primitives/Search/DetSearch.hs b/src/Traq/Primitives/Search/DetSearch.hs index 28c7862..0708427 100644 --- a/src/Traq/Primitives/Search/DetSearch.hs +++ b/src/Traq/Primitives/Search/DetSearch.hs @@ -26,11 +26,11 @@ import qualified Traq.ProtoLang as P -- ================================================================================ -- | Primitive implementing brute-force classical search. -newtype DetSearch sizeT precT = DetSearch (PrimSearch sizeT precT) +newtype DetSearch size prec = DetSearch (PrimSearch size prec) deriving (Eq, Show, Read, Generic) -type instance SizeType (DetSearch sizeT precT) = sizeT -type instance PrecType (DetSearch sizeT precT) = precT +type instance SizeType (DetSearch size prec) = size +type instance PrecType (DetSearch size prec) = prec type instance PrimFnShape (DetSearch size prec) = BooleanPredicate @@ -38,7 +38,7 @@ instance P.MapSize (DetSearch size prec) where type MappedSize (DetSearch size prec) size' = DetSearch size' prec mapSize f (DetSearch p) = DetSearch (P.mapSize f p) -instance PrimSearch sizeT precT :<: DetSearch sizeT precT +instance PrimSearch size prec :<: DetSearch size prec instance (Show size) => SerializePrim (DetSearch size prec) where primNames = ["any"] diff --git a/src/Traq/Primitives/Search/Prelude.hs b/src/Traq/Primitives/Search/Prelude.hs index e7ed88d..f219531 100644 --- a/src/Traq/Primitives/Search/Prelude.hs +++ b/src/Traq/Primitives/Search/Prelude.hs @@ -34,11 +34,11 @@ data PrimSearchKind deriving (Eq, Read, Show, Enum) -- Primitive @search@ which returns a uniformly random solution -data PrimSearch sizeT precT = PrimSearch {search_kind :: PrimSearchKind, search_ty :: P.VarType sizeT} +data PrimSearch size prec = PrimSearch {search_kind :: PrimSearchKind, search_ty :: P.VarType size} deriving (Eq, Read, Show) -type instance SizeType (PrimSearch sizeT precT) = sizeT -type instance PrecType (PrimSearch sizeT precT) = precT +type instance SizeType (PrimSearch size prec) = size +type instance PrecType (PrimSearch size prec) = prec type instance PrimFnShape (PrimSearch size prec) = BooleanPredicate @@ -64,7 +64,7 @@ instance (Show size) => SerializePrim (PrimSearch size prec) where printPrimParams PrimSearch{search_ty} = [PP.toCodeWord search_ty] -instance (P.TypingReqs sizeT) => TypeCheckPrim (PrimSearch sizeT precT) sizeT where +instance (P.TypingReqs size) => TypeCheckPrim (PrimSearch size prec) size where inferRetTypesPrim PrimSearch{search_kind, search_ty} (BooleanPredicate pred_ty) = do when (pred_ty /= P.FnType [search_ty] [P.tbool]) $ throwError $ @@ -74,7 +74,7 @@ instance (P.TypingReqs sizeT) => TypeCheckPrim (PrimSearch sizeT precT) sizeT wh AllK -> [P.tbool] SearchK -> [P.tbool, search_ty] -instance EvalPrim (PrimSearch sizeT precT) sizeT precT where +instance EvalPrim (PrimSearch size prec) size prec where evalPrim PrimSearch{search_kind, search_ty} (BooleanPredicate eval_pred) = do let search_range = P.domain search_ty res <- forM search_range $ \v -> do diff --git a/src/Traq/Primitives/Search/QSearchCFNW.hs b/src/Traq/Primitives/Search/QSearchCFNW.hs index d84f467..e0f49ac 100644 --- a/src/Traq/Primitives/Search/QSearchCFNW.hs +++ b/src/Traq/Primitives/Search/QSearchCFNW.hs @@ -70,7 +70,7 @@ _QSearch_alpha :: (Floating prec) => prec _QSearch_alpha = 9.2 -- | https://arxiv.org/pdf/2203.04975v2, Eq. 4 -_EQSearchWorst :: forall sizeT precT. (Integral sizeT, Floating precT) => sizeT -> A.FailProb precT -> precT +_EQSearchWorst :: forall size prec. (Integral size, Floating prec) => size -> A.FailProb prec -> prec _EQSearchWorst n eps = (max_iter_per_rep + 1) * n_reps where -- using +1 instead of ceiling @@ -78,13 +78,13 @@ _EQSearchWorst n eps = (max_iter_per_rep + 1) * n_reps n_reps = logBase 3 (1 / A.getFailProb eps) + 1 -- | https://arxiv.org/pdf/2203.04975v2, Eq. 3 -_F :: forall sizeT precT. (Integral sizeT, Floating precT) => sizeT -> sizeT -> precT +_F :: forall size prec. (Integral size, Floating prec) => size -> size -> prec _F n t | 4 * t >= n = 2.0344 | otherwise = 3.1 * sqrt (fromIntegral n / fromIntegral t) -- | https://arxiv.org/pdf/2203.04975v2, Eq. 2 -_EQSearch :: forall sizeT precT. (Integral sizeT, Floating precT) => sizeT -> sizeT -> A.FailProb precT -> precT +_EQSearch :: forall size prec. (Integral size, Floating prec) => size -> size -> A.FailProb prec -> prec _EQSearch n t eps | t == 0 = _EQSearchWorst n eps | otherwise = _F n t * (1 + 1 / (1 - term)) @@ -95,21 +95,21 @@ _EQSearch n t eps -- QSearch_Zalka: from https://arxiv.org/abs/quant-ph/9711070 -- -------------------------------------------------------------------------------- -_QSearchZalka :: forall sizeT precT. (Integral sizeT, Floating precT) => sizeT -> A.FailProb precT -> precT +_QSearchZalka :: forall size prec. (Integral size, Floating prec) => size -> A.FailProb prec -> prec _QSearchZalka n eps = nq_simple where -- Section 2.1 simple algorithm cost -- +1 for extra query at the end to obtain the flag bit (and result) - nq_simple :: precT + nq_simple :: prec nq_simple = fromIntegral (_QSearchZalka_max_iter n + 1) * _QSearchZalka_n_reps eps -- Section 2.2 Improved Algorithm (i.e. sqrt log(1/eps) instead of log(1/eps)) -- log_fac = ceiling log_fac --- log_fac :: precT +-- log_fac :: prec -- log_fac = log (1 / eps) / (2 * log (4 / 3)) -- number of queries of the original algorithm. --- nq :: precT +-- nq :: prec -- nq = 5 * log_fac + pi * sqrt (fromIntegral n * log_fac) -- Section 2.1 simple algorithm cost @@ -126,11 +126,11 @@ _QSearchZalka_n_reps eps = 1 + logBase (1 - p) (A.getFailProb eps) -- Primitive Class Implementation -- ================================================================================ -newtype QSearchCFNW sizeT precT = QSearchCFNW (PrimSearch sizeT precT) +newtype QSearchCFNW size prec = QSearchCFNW (PrimSearch size prec) deriving (Eq, Show, Read, Generic) -type instance SizeType (QSearchCFNW sizeT precT) = sizeT -type instance PrecType (QSearchCFNW sizeT precT) = precT +type instance SizeType (QSearchCFNW size prec) = size +type instance PrecType (QSearchCFNW size prec) = prec type instance PrimFnShape (QSearchCFNW size prec) = BooleanPredicate @@ -139,11 +139,11 @@ instance P.MapSize (QSearchCFNW size prec) where mapSize f (QSearchCFNW p) = QSearchCFNW (P.mapSize f p) -instance PrimSearch sizeT precT :<: QSearchCFNW sizeT precT where +instance PrimSearch size prec :<: QSearchCFNW size prec where inject = QSearchCFNW project (QSearchCFNW p) = Just p -instance (Show sizeT) => SerializePrim (QSearchCFNW sizeT precT) where +instance (Show size) => SerializePrim (QSearchCFNW size prec) where primNames = ["any", "search"] primNameOf (QSearchCFNW p) = primNameOf p parsePrimParams tp s = QSearchCFNW <$> parsePrimParams tp s @@ -166,8 +166,8 @@ getSearchType (QSearchCFNW (PrimSearch{search_ty})) = search_ty -- | Compute the unitary cost using the QSearch_Zalka cost formula. instance - (P.TypingReqs sizeT, Integral sizeT, Floating precT) => - UnitaryCostPrim (QSearchCFNW sizeT precT) sizeT precT + (P.TypingReqs size, Integral size, Floating prec) => + UnitaryCostPrim (QSearchCFNW size prec) size prec where unitaryQueryCosts prim eps = BooleanPredicate $ strongQueries $ _QSearchZalka _N eps where @@ -176,8 +176,8 @@ instance unitaryExprCosts _ _ = Alg.zero instance - (P.TypingReqs sizeT, Integral sizeT, A.SizeToPrec sizeT precT, Floating precT) => - QuantumHavocCostPrim (QSearchCFNW sizeT precT) sizeT precT + (P.TypingReqs size, Integral size, A.SizeToPrec size prec, Floating prec) => + QuantumHavocCostPrim (QSearchCFNW size prec) size prec where quantumQueryCostsUnitary prim eps = BooleanPredicate $ strongQueries $ _EQSearchWorst _N eps where @@ -187,7 +187,7 @@ instance quantumExprCosts = Alg.zero -instance (sizeT ~ SizeT, Floating precT, Prob.RVType precT precT) => QuantumExpCostPrim (QSearchCFNW sizeT precT) sizeT precT where +instance (size ~ SizeT, Floating prec, Prob.RVType prec prec) => QuantumExpCostPrim (QSearchCFNW size prec) size prec where quantumExpQueryCostsUnitary prim eps (BooleanPredicate eval_pred) = BooleanPredicate $ strongQueries $ _EQSearch _N _K eps where @@ -228,7 +228,7 @@ addPredCall c x b = do mk_pred <- view $ to pred_call_builder writeElem $ mk_pred c x b -withComputed :: (sizeT ~ SizeType ext) => CQPL.UStmt sizeT -> UQSearchBuilder ext a -> UQSearchBuilder ext a +withComputed :: (size ~ SizeType ext) => CQPL.UStmt size -> UQSearchBuilder ext a -> UQSearchBuilder ext a withComputed s m = do writeElem s a <- m @@ -236,19 +236,19 @@ withComputed s m = do return a addGroverIteration :: - forall ext sizeT precT. - ( Integral sizeT - , RealFloat precT - , P.TypingReqs sizeT - , sizeT ~ SizeType ext - , precT ~ PrecType ext + forall ext size prec. + ( Integral size + , RealFloat prec + , P.TypingReqs size + , size ~ SizeType ext + , prec ~ PrecType ext ) => -- | ctrl - CQPL.Arg sizeT -> + CQPL.Arg size -> -- | x - CQPL.Arg sizeT -> + CQPL.Arg size -> -- | b - CQPL.Arg sizeT -> + CQPL.Arg size -> UQSearchBuilder ext () addGroverIteration c x b = do x_ty <- view $ to search_arg_type @@ -259,19 +259,19 @@ addGroverIteration c x b = do writeElem $ CQPL.UnitaryS [x] unifX algoQSearchZalkaRandomIterStep :: - forall ext sizeT precT. - ( Integral sizeT - , RealFloat precT - , P.TypingReqs sizeT - , sizeT ~ SizeType ext - , precT ~ PrecType ext + forall ext size prec. + ( Integral size + , RealFloat prec + , P.TypingReqs size + , size ~ SizeType ext + , prec ~ PrecType ext ) => -- | max num of iteration - sizeT -> - CQPL.Arg sizeT -> - CQPL.Arg sizeT -> - CQPL.Arg sizeT -> - CQPL.Arg sizeT -> + size -> + CQPL.Arg size -> + CQPL.Arg size -> + CQPL.Arg size -> + CQPL.Arg size -> UQSearchBuilder ext () algoQSearchZalkaRandomIterStep r r_reg ctrl_bit x_reg b_reg = do let r_ty = P.Fin r @@ -306,15 +306,15 @@ algoQSearchZalkaRandomIterStep r r_reg ctrl_bit x_reg b_reg = do addPredCall ctrl_bit x_reg b_reg algoQSearchZalka :: - forall ext sizeT precT. - ( Integral sizeT - , RealFloat precT - , P.TypingReqs sizeT - , sizeT ~ SizeType ext - , precT ~ PrecType ext + forall ext size prec. + ( Integral size + , RealFloat prec + , P.TypingReqs size + , size ~ SizeType ext + , prec ~ PrecType ext ) => -- | max. error (TV/trace-norm) - A.FailProb precT -> + A.FailProb prec -> -- | output bit Ident -> -- | output value of search @@ -324,7 +324,7 @@ algoQSearchZalka eps out_bit out_val = do s_ty <- view $ to search_arg_type let n = P.domainSize s_ty - let n_iter = floor (_QSearchZalka_n_reps eps) :: sizeT + let n_iter = floor (_QSearchZalka_n_reps eps) :: size ctrl_bits <- lift $ Compiler.allocAncillaWithPref "ctrl" (P.Arr n_iter P.tbool) b_regs <- lift $ Compiler.allocAncillaWithPref "pred_out" (P.Arr n_iter P.tbool) @@ -460,10 +460,10 @@ type QSearchCompilerT ext = allocReg :: ( m ~ QSearchCompilerT ext - , sizeT ~ SizeType ext + , size ~ SizeType ext ) => Ident -> - P.VarType sizeT -> + P.VarType size -> m Ident allocReg prefix ty = do reg <- lift $ Compiler.newIdent prefix @@ -472,16 +472,16 @@ allocReg prefix ty = do -- | Run K grover iterations groverK :: - forall sizeT. + forall size. -- | number of rounds - P.MetaParam sizeT -> + P.MetaParam size -> -- | the element and type to search for. @x : T@ - (Ident, P.VarType sizeT) -> + (Ident, P.VarType size) -> -- | the output bit Ident -> -- | run the predicate - (Ident -> Ident -> CQPL.UStmt sizeT) -> - CQPL.UStmt sizeT + (Ident -> Ident -> CQPL.UStmt size) -> + CQPL.UStmt size groverK k (x, x_ty) b mk_pred = CQPL.USeqS [ prepb @@ -493,7 +493,7 @@ groverK k (x, x_ty) b mk_pred = unifX = CQPL.DistrU (P.UniformE x_ty) -- map b to |-> and x to uniform - prepb, prepx :: CQPL.UStmt sizeT + prepb, prepx :: CQPL.UStmt size prepb = CQPL.USeqS [ CQPL.UnitaryS [CQPL.Arg b] (CQPL.BasicGateU CQPL.XGate) @@ -501,7 +501,7 @@ groverK k (x, x_ty) b mk_pred = ] prepx = CQPL.UnitaryS [CQPL.Arg x] unifX - grover_iterate :: CQPL.UStmt sizeT + grover_iterate :: CQPL.UStmt size grover_iterate = CQPL.USeqS [ mk_pred x b @@ -512,25 +512,25 @@ groverK k (x, x_ty) b mk_pred = -- | Implementation of the hybrid quantum search algorithm \( \textbf{QSearch} \). algoQSearch :: - forall ext sizeT precT. - ( Integral sizeT - , RealFloat precT - , sizeT ~ SizeT - , Show sizeT - , Show precT - , P.TypingReqs sizeT - , SizeType ext ~ sizeT + forall ext size prec. + ( Integral size + , RealFloat prec + , size ~ SizeT + , Show size + , Show prec + , P.TypingReqs size + , SizeType ext ~ size ) => -- | search elem type - P.VarType sizeT -> + P.VarType size -> -- | number of classical samples - sizeT -> + size -> -- | max fail prob - A.FailProb precT -> + A.FailProb prec -> -- | grover_k caller: k, x, b - (Either (CQPL.MetaParam sizeT) Ident -> Ident -> Ident -> CQPL.Stmt sizeT) -> + (Either (CQPL.MetaParam size) Ident -> Ident -> Ident -> CQPL.Stmt size) -> -- | cqpl predicate caller - (Ident -> Ident -> CQPL.Stmt sizeT) -> + (Ident -> Ident -> CQPL.Stmt size) -> -- | output bit Ident -> -- | output value diff --git a/src/Traq/Primitives/Search/RandomSearch.hs b/src/Traq/Primitives/Search/RandomSearch.hs index 02ec303..1810c60 100644 --- a/src/Traq/Primitives/Search/RandomSearch.hs +++ b/src/Traq/Primitives/Search/RandomSearch.hs @@ -25,15 +25,15 @@ import qualified Traq.ProtoLang as P -- ================================================================================ -- | Number of predicate queries to unitarily implement random search. -_URandomSearch :: forall sizeT precT. (Integral sizeT, Floating precT) => sizeT -> precT +_URandomSearch :: forall size prec. (Integral size, Floating prec) => size -> prec _URandomSearch = fromIntegral -- | Worst case number of predicate queries to implement random search. -_ERandomSearchWorst :: forall sizeT precT. (Integral sizeT, Floating precT) => sizeT -> P.FailProb precT -> precT +_ERandomSearchWorst :: forall size prec. (Integral size, Floating prec) => size -> P.FailProb prec -> prec _ERandomSearchWorst n eps = fromIntegral n * log (1 / P.getFailProb eps) -- | Expected number of predicate queries to implement random search. -_ERandomSearch :: forall sizeT precT. (Integral sizeT, Floating precT) => sizeT -> sizeT -> P.FailProb precT -> precT +_ERandomSearch :: forall size prec. (Integral size, Floating prec) => size -> size -> P.FailProb prec -> prec _ERandomSearch n 0 eps = _ERandomSearchWorst n eps _ERandomSearch n k _ = fromIntegral n / fromIntegral k @@ -44,11 +44,11 @@ _ERandomSearch n k _ = fromIntegral n / fromIntegral k {- | Primitive implementing search using classical random sampling. The unitary mode does a brute-force loop. -} -newtype RandomSearch sizeT precT = RandomSearch (PrimSearch sizeT precT) +newtype RandomSearch size prec = RandomSearch (PrimSearch size prec) deriving (Eq, Show, Read, Generic) -type instance SizeType (RandomSearch sizeT precT) = sizeT -type instance PrecType (RandomSearch sizeT precT) = precT +type instance SizeType (RandomSearch size prec) = size +type instance PrecType (RandomSearch size prec) = prec type instance PrimFnShape (RandomSearch size prec) = BooleanPredicate diff --git a/src/Traq/Primitives/Search/Symbolic.hs b/src/Traq/Primitives/Search/Symbolic.hs index 0d93b57..331f029 100644 --- a/src/Traq/Primitives/Search/Symbolic.hs +++ b/src/Traq/Primitives/Search/Symbolic.hs @@ -29,19 +29,19 @@ import qualified Traq.ProtoLang as P -- ================================================================================ -- Primitive Class Implementation -- ================================================================================ -newtype QSearchSym sizeT precT = QSearchSym (PrimSearch (Sym.Sym sizeT) (Sym.Sym precT)) +newtype QSearchSym size prec = QSearchSym (PrimSearch (Sym.Sym size) (Sym.Sym prec)) deriving (Eq, Show, Generic) -type instance SizeType (QSearchSym sizeT precT) = Sym.Sym sizeT -type instance PrecType (QSearchSym sizeT precT) = Sym.Sym precT +type instance SizeType (QSearchSym size prec) = Sym.Sym size +type instance PrecType (QSearchSym size prec) = Sym.Sym prec type instance PrimFnShape (QSearchSym size prec) = BooleanPredicate -instance PrimSearch (Sym.Sym sizeT) (Sym.Sym precT) :<: QSearchSym sizeT precT where +instance PrimSearch (Sym.Sym size) (Sym.Sym prec) :<: QSearchSym size prec where inject = QSearchSym project (QSearchSym p) = Just p -instance (Show sizeT) => SerializePrim (QSearchSym sizeT precT) where +instance (Show size) => SerializePrim (QSearchSym size prec) where primNames = ["any_sym", "search_sym"] parsePrimParams tp "any_sym" = QSearchSym <$> parsePrimParams tp "any" @@ -51,7 +51,7 @@ instance (Show sizeT) => SerializePrim (QSearchSym sizeT precT) where printPrimParams (QSearchSym prim) = printPrimParams prim -- Type check -instance (P.TypingReqs sizeT) => TypeCheckPrim (QSearchSym sizeT precT) (Sym.Sym sizeT) where +instance (P.TypingReqs size) => TypeCheckPrim (QSearchSym size prec) (Sym.Sym size) where inferRetTypesPrim (QSearchSym p) = inferRetTypesPrim p -- ================================================================================ @@ -61,10 +61,10 @@ instance (P.TypingReqs sizeT) => TypeCheckPrim (QSearchSym sizeT precT) (Sym.Sym getSearchType :: QSearchSym size prec -> P.VarType (Sym.Sym size) getSearchType (QSearchSym (PrimSearch _ ty)) = ty -_QryU :: forall sizeT precT. (Show sizeT, Show precT) => Sym.Sym sizeT -> P.FailProb (Sym.Sym precT) -> Sym.Sym precT +_QryU :: forall size prec. (Show size, Show prec) => Sym.Sym size -> P.FailProb (Sym.Sym prec) -> Sym.Sym prec _QryU n delta = Sym.var $ printf "QryU(%s, %s)" (show n) (show $ P.getFailProb delta) -_QryQmax :: forall sizeT precT. (Show sizeT, Show precT) => Sym.Sym sizeT -> P.FailProb (Sym.Sym precT) -> Sym.Sym precT +_QryQmax :: forall size prec. (Show size, Show prec) => Sym.Sym size -> P.FailProb (Sym.Sym prec) -> Sym.Sym prec _QryQmax n eps = Sym.var $ printf "QryQmax(%s, %s)" (show n) (show $ P.getFailProb eps) domainSizeSym :: (Num size, Eq size, Show size) => P.VarType (Sym.Sym size) -> Sym.Sym size @@ -74,8 +74,8 @@ domainSizeSym (P.Arr n t) = n * domainSizeSym t domainSizeSym (P.Tup ts) = product $ map domainSizeSym ts instance - (P.TypingReqs sizeT, Show precT, Num precT, Eq precT) => - UnitaryCostPrim (QSearchSym sizeT precT) (Sym.Sym sizeT) (Sym.Sym precT) + (P.TypingReqs size, Show prec, Num prec, Eq prec) => + UnitaryCostPrim (QSearchSym size prec) (Sym.Sym size) (Sym.Sym prec) where unitaryQueryCosts prim eps = BooleanPredicate $ strongQueries $ _QryU _N eps where @@ -84,8 +84,8 @@ instance unitaryExprCosts _ _ = Alg.zero instance - (P.TypingReqs sizeT, Show precT, Num precT, Eq precT) => - QuantumHavocCostPrim (QSearchSym sizeT precT) (Sym.Sym sizeT) (Sym.Sym precT) + (P.TypingReqs size, Show prec, Num prec, Eq prec) => + QuantumHavocCostPrim (QSearchSym size prec) (Sym.Sym size) (Sym.Sym prec) where quantumQueryCostsUnitary prim eps = BooleanPredicate $ strongQueries $ _QryQmax _N eps where diff --git a/src/Traq/Primitives/Simons/Prelude.hs b/src/Traq/Primitives/Simons/Prelude.hs index c11e8c9..59743d9 100644 --- a/src/Traq/Primitives/Simons/Prelude.hs +++ b/src/Traq/Primitives/Simons/Prelude.hs @@ -34,16 +34,16 @@ References: "On the Power of Quantum Computation" https://epubs.siam.org/doi/10.1137/S0097539796298637 -} -data FindXorPeriod sizeT precT = FindXorPeriod {n :: sizeT, p_0 :: precT} +data FindXorPeriod size prec = FindXorPeriod {n :: size, p_0 :: prec} deriving (Eq, Show, Read) -type instance SizeType (FindXorPeriod sizeT precT) = sizeT -type instance PrecType (FindXorPeriod sizeT precT) = precT +type instance SizeType (FindXorPeriod size prec) = size +type instance PrecType (FindXorPeriod size prec) = prec newtype FindXorPeriodArg a = FindXorPeriodArg {fun :: a} deriving (Eq, Show) -type instance PrimFnShape (FindXorPeriod sizeT precT) = FindXorPeriodArg +type instance PrimFnShape (FindXorPeriod size prec) = FindXorPeriodArg instance ValidPrimShape FindXorPeriodArg where listToShape [fun] = Right FindXorPeriodArg{fun} @@ -56,7 +56,7 @@ instance P.MapSize (FindXorPeriod size prec) where mapSize f FindXorPeriod{n, ..} = FindXorPeriod{n = f n, ..} -- Pretty Printing -instance (Show sizeT) => SerializePrim (FindXorPeriod sizeT Double) where +instance (Show size) => SerializePrim (FindXorPeriod size Double) where primNames = ["findXorPeriod"] parsePrimParams TokenParser{..} _ = do n <- (Sym.con . fromInteger <$> integer) <|> (Sym.var <$> identifier) @@ -74,8 +74,8 @@ bitsize (P.Arr n t) = (n *) <$> bitsize t bitsize (P.Tup ts) = sum <$> mapM bitsize ts instance - (P.TypingReqs sizeT, Num precT, Ord precT, Show precT) => - TypeCheckPrim (FindXorPeriod sizeT precT) sizeT + (P.TypingReqs size, Num prec, Ord prec, Show prec) => + TypeCheckPrim (FindXorPeriod size prec) size where inferRetTypesPrim FindXorPeriod{n, p_0} FindXorPeriodArg{fun} = do when (p_0 < 0 || p_0 > 1) $ diff --git a/src/Traq/Primitives/Simons/Quantum.hs b/src/Traq/Primitives/Simons/Quantum.hs index 08c24ca..7542320 100644 --- a/src/Traq/Primitives/Simons/Quantum.hs +++ b/src/Traq/Primitives/Simons/Quantum.hs @@ -44,13 +44,13 @@ References: 1. [Breaking Symmetric Cryptosystems using Quantum Period Finding](https://arxiv.org/pdf/1602.05973) -} -newtype SimonsFindXorPeriod sizeT precT = SimonsFindXorPeriod (FindXorPeriod sizeT precT) +newtype SimonsFindXorPeriod size prec = SimonsFindXorPeriod (FindXorPeriod size prec) deriving (Eq, Show, Read, Generic) -type instance SizeType (SimonsFindXorPeriod sizeT precT) = sizeT -type instance PrecType (SimonsFindXorPeriod sizeT precT) = precT +type instance SizeType (SimonsFindXorPeriod size prec) = size +type instance PrecType (SimonsFindXorPeriod size prec) = prec -type instance PrimFnShape (SimonsFindXorPeriod sizeT precT) = FindXorPeriodArg +type instance PrimFnShape (SimonsFindXorPeriod size prec) = FindXorPeriodArg instance P.MapSize (SimonsFindXorPeriod size prec) where type MappedSize (SimonsFindXorPeriod size prec) size' = (SimonsFindXorPeriod size' prec) @@ -60,11 +60,11 @@ instance P.MapSize (SimonsFindXorPeriod size prec) where -- Basic Instances -- ================================================================================ -instance FindXorPeriod sizeT precT :<: SimonsFindXorPeriod sizeT precT +instance FindXorPeriod size prec :<: SimonsFindXorPeriod size prec -instance IsA (FindXorPeriod sizeT precT) (SimonsFindXorPeriod sizeT precT) +instance IsA (FindXorPeriod size prec) (SimonsFindXorPeriod size prec) -instance (Show sizeT) => SerializePrim (SimonsFindXorPeriod sizeT Double) where +instance (Show size) => SerializePrim (SimonsFindXorPeriod size Double) where primNames = ["findXorPeriod"] parsePrimParams tp s = SimonsFindXorPeriod <$> parsePrimParams tp s printPrimParams (SimonsFindXorPeriod prim) = printPrimParams prim @@ -81,15 +81,15 @@ instance -- | Number of queries as described in Theorem 1. _SimonsQueries :: - forall sizeT precT. - (Floating precT, P.SizeToPrec sizeT precT) => + forall size prec. + (Floating prec, P.SizeToPrec size prec) => -- | bitsize - sizeT -> + size -> -- | p_0: maximum probability of spurious collisions for non-period values. - precT -> + prec -> -- | maximum allowed failure probability. - P.FailProb precT -> - precT + P.FailProb prec -> + prec _SimonsQueries n p0 eps = q where {- Sketch: diff --git a/src/Traq/Primitives/TreeSearch.hs b/src/Traq/Primitives/TreeSearch.hs index 075283a..fd4d6a4 100644 --- a/src/Traq/Primitives/TreeSearch.hs +++ b/src/Traq/Primitives/TreeSearch.hs @@ -30,7 +30,7 @@ import qualified Traq.Utils.Printing as PP @checkNode@ returns a boolean value. -} -data TreeSearch sizeT precT = TreeSearch +data TreeSearch size prec = TreeSearch { getChildren :: Ident , getChildrenArgs :: [Ident] , checkNode :: Ident @@ -38,11 +38,11 @@ data TreeSearch sizeT precT = TreeSearch } deriving (Eq, Show, Read) -type instance SizeType (TreeSearch sizeT precT) = sizeT -type instance PrecType (TreeSearch sizeT precT) = precT +type instance SizeType (TreeSearch size prec) = size +type instance PrecType (TreeSearch size prec) = prec -- Printing -instance PP.ToCodeString (TreeSearch sizeT precT) where +instance PP.ToCodeString (TreeSearch size prec) where build TreeSearch{getChildren, getChildrenArgs, checkNode, checkNodeArgs} = PP.putWord $ printf @@ -53,7 +53,7 @@ instance PP.ToCodeString (TreeSearch sizeT precT) where (PP.commaList checkNodeArgs) -- Parsing -instance P.Parseable (TreeSearch sizeT precT) where +instance P.Parseable (TreeSearch size prec) where parseE tp = do symbol tp "@treesearch" (getChildren, checkNode) <- brackets tp $ do @@ -66,7 +66,7 @@ instance P.Parseable (TreeSearch sizeT precT) where return TreeSearch{getChildren, getChildrenArgs, checkNode, checkNodeArgs} -- Type check -instance (P.TypingReqs sizeT) => P.TypeInferrable (TreeSearch sizeT precT) sizeT where +instance (P.TypingReqs size) => P.TypeInferrable (TreeSearch size prec) size where inferTypes TreeSearch{getChildren, getChildrenArgs, checkNode, checkNodeArgs} = do P.FunDef{P.param_types = gc_param_tys, P.ret_types = gc_ret_tys} <- view (Ctx.at getChildren) @@ -99,10 +99,10 @@ instance (P.TypingReqs sizeT) => P.TypeInferrable (TreeSearch sizeT precT) sizeT -- | Evaluation runTreeSearch :: - (Monad m, sizeT ~ SizeT) => - (P.Value sizeT -> m (P.Value sizeT, P.Value sizeT)) -> - (P.Value sizeT -> m Bool) -> - P.Value sizeT -> + (Monad m, size ~ SizeT) => + (P.Value size -> m (P.Value size, P.Value size)) -> + (P.Value size -> m Bool) -> + P.Value size -> m Bool runTreeSearch _ _ (P.FinV 0) = return False runTreeSearch child check u = do @@ -113,7 +113,7 @@ runTreeSearch child check u = do (l, r) <- child u (||) <$> check l <*> check r -instance (P.EvalReqs SizeT precT) => P.Evaluatable (TreeSearch SizeT precT) SizeT precT where +instance (P.EvalReqs SizeT prec) => P.Evaluatable (TreeSearch SizeT prec) SizeT prec where eval TreeSearch{getChildren, getChildrenArgs, checkNode, checkNodeArgs} sigma = do child_fun <- view $ P._funCtx . Ctx.at getChildren . to (fromMaybe (error "unable to find predicate, please typecheck first!")) check_fun <- view $ P._funCtx . Ctx.at checkNode . to (fromMaybe (error "unable to find predicate, please typecheck first!")) diff --git a/src/Traq/ProtoLang/Eval.hs b/src/Traq/ProtoLang/Eval.hs index 5432629..b8d7a18 100644 --- a/src/Traq/ProtoLang/Eval.hs +++ b/src/Traq/ProtoLang/Eval.hs @@ -66,14 +66,14 @@ import Traq.ProtoLang.Syntax -- ================================================================================ -- | default value of a given type -defaultV :: forall sizeT. (sizeT ~ SizeT) => VarType sizeT -> Value sizeT +defaultV :: forall size. (size ~ SizeT) => VarType size -> Value size defaultV (Fin _) = FinV 0 defaultV (Bitvec _) = FinV 0 defaultV (Arr n t) = ArrV $ replicate n (defaultV t) defaultV (Tup ts) = TupV $ map defaultV ts -- | Check if a given runtime value is of a given type. -validateValueType :: forall sizeT. (sizeT ~ SizeT) => VarType sizeT -> Value sizeT -> Bool +validateValueType :: forall size. (size ~ SizeT) => VarType size -> Value size -> Bool validateValueType (Fin n) (FinV v) = 0 <= v && v < n validateValueType (Arr n t) (ArrV vs) = length vs == n && all (validateValueType t) vs validateValueType (Tup ts) (TupV vs) = length vs == length ts && and (zipWith validateValueType ts vs) @@ -119,14 +119,14 @@ valueToBool :: Value SizeT -> Bool valueToBool = fromValue -- | Size of the value set of a given type. -domainSize :: (Integral sizeT) => VarType sizeT -> sizeT +domainSize :: (Integral size) => VarType size -> size domainSize (Fin _N) = _N domainSize (Bitvec n) = 2 ^ n domainSize (Arr n t) = domainSize t ^ n domainSize (Tup ts) = product $ map domainSize ts -- | Set of all values of a given type -domain :: (Integral sizeT) => VarType sizeT -> [Value sizeT] +domain :: (Integral size) => VarType size -> [Value size] domain (Fin _N) = FinV <$> [0 .. _N - 1] domain (Bitvec n) = FinV <$> [0 .. 2 ^ n - 1] domain (Arr n t) = ArrV <$> replicateM (fromIntegral n) (domain t) @@ -143,10 +143,10 @@ bitsize (Tup ts) = sum <$> mapM bitsize ts -- Evaluating Basic Expressions -- ================================================================================ -evalUnOp :: (sizeT ~ SizeT) => UnOp -> Value sizeT -> Value sizeT +evalUnOp :: (size ~ SizeT) => UnOp -> Value size -> Value size evalUnOp NotOp = toValue . not . fromValue -evalBinOp :: (sizeT ~ SizeT) => BinOp -> Value sizeT -> Value sizeT -> Value sizeT +evalBinOp :: (size ~ SizeT) => BinOp -> Value size -> Value size -> Value size evalBinOp AddOp (FinV x) (FinV y) = FinV $ x + y evalBinOp MulOp (FinV x) (FinV y) = FinV $ x * y evalBinOp SubOp (FinV x) (FinV y) = FinV $ x - y @@ -157,36 +157,36 @@ evalBinOp EqOp (FinV x) (FinV y) = toValue $ x == y evalBinOp AndOp v1 v2 = toValue $ fromValue v1 && fromValue v2 evalBinOp op lhs rhs = error $ printf "evalBinOp failed: %s (%s) (%s)" (show op) (show lhs) (show rhs) -evalOp :: (sizeT ~ SizeT) => NAryOp -> [Value sizeT] -> Value sizeT +evalOp :: (size ~ SizeT) => NAryOp -> [Value size] -> Value size evalOp MultiOrOp = toValue . any valueToBool -- | @elemOfArr i a@ returns a[i] -elemOfArr :: (sizeT ~ SizeT) => Value sizeT -> Value sizeT -> Value sizeT +elemOfArr :: (size ~ SizeT) => Value size -> Value size -> Value size elemOfArr (FinV i) (ArrV xs) = xs !! i elemOfArr (FinV i) (TupV xs) = xs !! i elemOfArr i arr = error $ printf "invalid inputs: elemOfArr[ix: %s, arr: %s]" (show i) (show arr) -- | @modifyArr a i v@ sets a[i] to v. -modifyArr :: (sizeT ~ SizeT) => Value sizeT -> Value sizeT -> Value sizeT -> Value sizeT +modifyArr :: (size ~ SizeT) => Value size -> Value size -> Value size -> Value size modifyArr (ArrV xs) (FinV i) v = ArrV $ xs & ix i .~ v modifyArr _ _ _ = error "invalid inputs" -- | The deterministic state of the program -type ProgramState sizeT = Ctx.Context (Value sizeT) +type ProgramState size = Ctx.Context (Value size) class HasProgramState p where - _state :: (sizeT ~ SizeType p) => Lens' p (ProgramState sizeT) + _state :: (size ~ SizeType p) => Lens' p (ProgramState size) -instance HasProgramState (ProgramState sizeT) where _state = id +instance HasProgramState (ProgramState size) where _state = id evalBasicExpr :: ( MonadReader env m , HasProgramState env - , sizeT ~ SizeType env - , sizeT ~ SizeT + , size ~ SizeType env + , size ~ SizeT ) => - BasicExpr sizeT -> - m (Value sizeT) + BasicExpr size -> + m (Value size) evalBasicExpr VarE{var} = view $ _state . Ctx.at var . non' (error $ "cannot find variable " <> var) evalBasicExpr DefaultE{ty} = return $ defaultV ty evalBasicExpr ConstE{val} = return val @@ -225,17 +225,17 @@ evalBasicExpr ProjectE{tup_expr, tup_ix_val} = do -- ================================================================================ -- | Inject runtime data into a program -type FunInterp sizeT = [Value sizeT] -> [Value sizeT] +type FunInterp size = [Value size] -> [Value size] -type instance SizeType (FunInterp sizeT) = sizeT +type instance SizeType (FunInterp size) = size -- | A mapping of data intepretations -type FunInterpCtx sizeT = Map.Map Ident (FunInterp sizeT) +type FunInterpCtx size = Map.Map Ident (FunInterp size) class HasFunInterpCtx p where - _funInterpCtx :: (sizeT ~ SizeType p) => Lens' p (FunInterpCtx sizeT) + _funInterpCtx :: (size ~ SizeType p) => Lens' p (FunInterpCtx size) -instance HasFunInterpCtx (FunInterpCtx sizeT) where _funInterpCtx = id +instance HasFunInterpCtx (FunInterpCtx size) where _funInterpCtx = id -- | Environment for evaluation data EvaluationEnv ext = EvaluationEnv (FunCtx ext) (FunInterpCtx (SizeType ext)) @@ -260,7 +260,7 @@ instance HasFunInterpCtx (EvaluationEnv ext) where -- ================================================================================ -- | Base probability monad to evaluate the program. -type EvaluationMonad precT = Prob.ExpMonad precT +type EvaluationMonad prec = Prob.ExpMonad prec -- | Non-deterministic evaluation monad (i.e. no state) type Evaluator ext = ReaderT (EvaluationEnv ext) (EvaluationMonad (PrecType ext)) @@ -270,64 +270,64 @@ type Evaluator ext = ReaderT (EvaluationEnv ext) (EvaluationMonad (PrecType ext) -- -------------------------------------------------------------------------------- -- | Constraints to be satisfied to support evaluation. -type EvalReqs sizeT precT = - ( sizeT ~ SizeT - , Prob.ProbType precT - , Prob.RVType precT precT - , Fractional precT +type EvalReqs size prec = + ( size ~ SizeT + , Prob.ProbType prec + , Prob.RVType prec prec + , Fractional prec ) -- | Primitives that support evaluation. class - (EvalReqs sizeT precT, sizeT ~ SizeType ext, precT ~ PrecType ext) => - Evaluatable ext sizeT precT - | ext -> sizeT precT + (EvalReqs size prec, size ~ SizeType ext, prec ~ PrecType ext) => + Evaluatable ext size prec + | ext -> size prec where eval :: forall ext' m. - ( Evaluatable ext' sizeT precT + ( Evaluatable ext' size prec , m ~ Evaluator ext' - , SizeType ext' ~ sizeT - , PrecType ext' ~ precT + , SizeType ext' ~ size + , PrecType ext' ~ prec ) => ext -> - ProgramState sizeT -> - m [Value sizeT] + ProgramState size -> + m [Value size] default eval :: forall ext' m. ( Generic ext - , GEvaluatable (Rep ext) sizeT precT - , Evaluatable ext' sizeT precT + , GEvaluatable (Rep ext) size prec + , Evaluatable ext' size prec , m ~ Evaluator ext' - , SizeType ext' ~ sizeT - , PrecType ext' ~ precT + , SizeType ext' ~ size + , PrecType ext' ~ prec ) => ext -> - ProgramState sizeT -> - m [Value sizeT] + ProgramState size -> + m [Value size] eval x = geval (from x) -instance (EvalReqs SizeT precT) => Evaluatable (Core SizeT precT) SizeT precT where +instance (EvalReqs SizeT prec) => Evaluatable (Core SizeT prec) SizeT prec where eval p = case p of {} -class GEvaluatable f sizeT precT | f -> sizeT precT where +class GEvaluatable f size prec | f -> size prec where geval :: forall ext' m ext. ( m ~ Evaluator ext' - , Evaluatable ext' sizeT precT + , Evaluatable ext' size prec ) => f ext -> - ProgramState sizeT -> - m [Value sizeT] + ProgramState size -> + m [Value size] -instance (GEvaluatable f1 sizeT precT, GEvaluatable f2 sizeT precT) => GEvaluatable (f1 :+: f2) sizeT precT where +instance (GEvaluatable f1 size prec, GEvaluatable f2 size prec) => GEvaluatable (f1 :+: f2) size prec where geval (L1 p) = geval p geval (R1 p) = geval p -instance (GEvaluatable f sizeT precT) => GEvaluatable (M1 i c f) sizeT precT where +instance (GEvaluatable f size prec) => GEvaluatable (M1 i c f) size prec where geval (M1 x) = geval x -instance (Evaluatable f sizeT precT) => GEvaluatable (K1 i f) sizeT precT where +instance (Evaluatable f size prec) => GEvaluatable (K1 i f) size prec where geval (K1 x) = eval x -- -------------------------------------------------------------------------------- @@ -335,24 +335,24 @@ instance (Evaluatable f sizeT precT) => GEvaluatable (K1 i f) sizeT precT where -- -------------------------------------------------------------------------------- lookupS :: - forall sizeT env m. + forall size env m. ( MonadState env m , HasProgramState env - , sizeT ~ SizeType env + , size ~ SizeType env ) => Ident -> - m (Value sizeT) + m (Value size) lookupS x = use $ _state . Ctx.at x . non' (error $ "cannot find variable " ++ x) evalRandomSampleExpr :: ( MonadReader env m , HasProgramState env - , sizeT ~ SizeType env - , Prob.MonadProb precT m - , EvalReqs sizeT precT + , size ~ SizeType env + , Prob.MonadProb prec m + , EvalReqs size prec ) => - DistrExpr sizeT -> - m (Value sizeT) + DistrExpr size -> + m (Value size) evalRandomSampleExpr UniformE{sample_ty} = Prob.uniform (domain sample_ty) evalRandomSampleExpr BernoulliE{prob_one} = toValue <$> Prob.bernoulli (realToFrac prob_one) @@ -447,10 +447,10 @@ instance Eval1 Program where -- | Entry-point: run the program (i.e. last function) runProgram :: - forall ext precT m. - ( Evaluatable ext SizeT precT - , EvalReqs SizeT precT - , m ~ EvaluationMonad precT + forall ext prec m. + ( Evaluatable ext SizeT prec + , EvalReqs SizeT prec + , m ~ EvaluationMonad prec ) => Program ext -> FunInterpCtx SizeT -> diff --git a/src/Traq/ProtoLang/Parser.hs b/src/Traq/ProtoLang/Parser.hs index 3e1bfa1..110d4f2 100644 --- a/src/Traq/ProtoLang/Parser.hs +++ b/src/Traq/ProtoLang/Parser.hs @@ -76,7 +76,7 @@ protoLangTokenParser = makeTokenParser protoLangDef class Parseable ext where parseE :: TokenParser () -> Parser ext -instance Parseable (Core SymbSize precT) where +instance Parseable (Core SymbSize prec) where parseE _ = fail "no parse" symbSize :: TokenParser () -> Parser SymbSize diff --git a/src/Traq/ProtoLang/Syntax.hs b/src/Traq/ProtoLang/Syntax.hs index 60b2b13..b84f5eb 100644 --- a/src/Traq/ProtoLang/Syntax.hs +++ b/src/Traq/ProtoLang/Syntax.hs @@ -71,10 +71,10 @@ import Traq.Utils.ASTRewriting import qualified Traq.Utils.Printing as PP -- | Compile-time constant parameters -data MetaParam sizeT = MetaName String | MetaSize sizeT | MetaValue Integer +data MetaParam size = MetaName String | MetaSize size | MetaValue Integer deriving (Eq, Show, Read) -instance (Show sizeT) => PP.ToCodeString (MetaParam sizeT) where +instance (Show size) => PP.ToCodeString (MetaParam size) where build (MetaName n) = PP.putWord $ "#" ++ n build (MetaSize n) = PP.putWord $ show n build (MetaValue n) = PP.putWord $ show n @@ -84,24 +84,24 @@ instance (Show sizeT) => PP.ToCodeString (MetaParam sizeT) where -- ================================================================================ -- | Types -data VarType sizeT - = Fin sizeT -- Fin = [0, ..., N - 1] - | Bitvec sizeT -- Bitvec = {0, 1}^n - | Arr sizeT (VarType sizeT) -- Arr - | Tup [VarType sizeT] -- (T_1, ..., T_k) +data VarType size + = Fin size -- Fin = [0, ..., N - 1] + | Bitvec size -- Bitvec = {0, 1}^n + | Arr size (VarType size) -- Arr + | Tup [VarType size] -- (T_1, ..., T_k) deriving (Eq, Show, Read, Functor) -type instance SizeType (VarType sizeT) = sizeT +type instance SizeType (VarType size) = size -_Fin :: Traversal' (VarType sizeT) sizeT +_Fin :: Traversal' (VarType size) size _Fin focus (Fin n) = Fin <$> focus n _Fin _ t = pure t -_Arr :: Traversal' (VarType sizeT) (sizeT, VarType sizeT) +_Arr :: Traversal' (VarType size) (size, VarType size) _Arr focus (Arr n t) = uncurry Arr <$> focus (n, t) _Arr _ t = pure t -_Tup :: Traversal' (VarType sizeT) [VarType sizeT] +_Tup :: Traversal' (VarType size) [VarType size] _Tup focus (Tup ts) = Tup <$> focus ts _Tup _ t = pure t @@ -114,30 +114,30 @@ instance (Show a) => PP.ToCodeString (VarType a) where PP.putWord $ printf "Tup<%s>" $ PP.commaList ws -- | Basic Values -data Value sizeT +data Value size = -- | value of type @Fin n@ - FinV sizeT + FinV size | -- | value of type @Arr n t@ - ArrV [Value sizeT] + ArrV [Value size] | -- | tuple value - TupV [Value sizeT] + TupV [Value size] deriving (Eq, Ord, Show, Read, Functor) -type instance SizeType (Value sizeT) = sizeT +type instance SizeType (Value size) = size -_FinV :: Traversal' (Value sizeT) sizeT +_FinV :: Traversal' (Value size) size _FinV focus (FinV n) = FinV <$> focus n _FinV _ t = pure t -_ArrV :: Traversal' (Value sizeT) [Value sizeT] +_ArrV :: Traversal' (Value size) [Value size] _ArrV focus (ArrV vs) = ArrV <$> focus vs _ArrV _ t = pure t -_TupV :: Traversal' (Value sizeT) [Value sizeT] +_TupV :: Traversal' (Value size) [Value size] _TupV focus (TupV vs) = TupV <$> focus vs _TupV _ t = pure t -instance (Show sizeT) => PP.ToCodeString (Value sizeT) where +instance (Show size) => PP.ToCodeString (Value size) where build (FinV v) = PP.putWord $ show v build (ArrV vs) = PP.joined (printf "[%s]" . PP.commaList) $ mapM_ PP.build vs build (TupV vs) = PP.joined (printf "(%s)" . PP.commaList) $ mapM_ PP.build vs @@ -195,37 +195,37 @@ instance PP.ToCodeString NAryOp where build MultiOrOp = PP.putWord "or" -- | Basic arithmetic and logical expressions -data BasicExpr sizeT +data BasicExpr size = VarE {var :: Ident} | ParamE {param :: Ident} -- compile-time constant parameter - | DefaultE {ty :: VarType sizeT} -- initialize to default value of `ty` - | ConstE {val :: Value sizeT, ty :: VarType sizeT} - | UnOpE {un_op :: UnOp, operand :: BasicExpr sizeT} - | BinOpE {bin_op :: BinOp, lhs, rhs :: BasicExpr sizeT} - | TernaryE {branch, lhs, rhs :: BasicExpr sizeT} - | NAryE {op :: NAryOp, operands :: [BasicExpr sizeT]} + | DefaultE {ty :: VarType size} -- initialize to default value of `ty` + | ConstE {val :: Value size, ty :: VarType size} + | UnOpE {un_op :: UnOp, operand :: BasicExpr size} + | BinOpE {bin_op :: BinOp, lhs, rhs :: BasicExpr size} + | TernaryE {branch, lhs, rhs :: BasicExpr size} + | NAryE {op :: NAryOp, operands :: [BasicExpr size]} | -- array - IndexE {arr_expr :: BasicExpr sizeT, ix_val :: sizeT} - | DynIndexE {arr_expr, ix_expr :: BasicExpr sizeT} - | UpdateArrE {arr_expr, ix_expr, rhs :: BasicExpr sizeT} + IndexE {arr_expr :: BasicExpr size, ix_val :: size} + | DynIndexE {arr_expr, ix_expr :: BasicExpr size} + | UpdateArrE {arr_expr, ix_expr, rhs :: BasicExpr size} | -- tuple - ProjectE {tup_expr :: BasicExpr sizeT, tup_ix_val :: Int} + ProjectE {tup_expr :: BasicExpr size, tup_ix_val :: Int} deriving (Eq, Show, Read, Functor) -- Helpers for shorter expressions -instance IsString (BasicExpr sizeT) where +instance IsString (BasicExpr size) where fromString ('#' : s) = ParamE s fromString s = VarE s -notE :: BasicExpr sizeT -> BasicExpr sizeT +notE :: BasicExpr size -> BasicExpr size notE = UnOpE NotOp -(.<=.), (.+.), (.&&.) :: BasicExpr sizeT -> BasicExpr sizeT -> BasicExpr sizeT +(.<=.), (.+.), (.&&.) :: BasicExpr size -> BasicExpr size -> BasicExpr size (.<=.) = BinOpE LEqOp (.+.) = BinOpE AddOp (.&&.) = BinOpE AndOp -instance (Show sizeT) => PP.ToCodeString (BasicExpr sizeT) where +instance (Show size) => PP.ToCodeString (BasicExpr size) where build VarE{var} = PP.putWord var build ParamE{param} = PP.putWord $ printf "#%s" param build DefaultE{ty} = PP.putWord . printf "default : %s" =<< PP.fromBuild ty @@ -256,14 +256,14 @@ instance (Show sizeT) => PP.ToCodeString (BasicExpr sizeT) where -- ================================================================================ -- | An expression denoting a probablity distribution. -data DistrExpr sizeT - = UniformE {sample_ty :: VarType sizeT} +data DistrExpr size + = UniformE {sample_ty :: VarType size} | BernoulliE {prob_one :: Double} deriving (Eq, Show, Read, Functor) -type instance SizeType (DistrExpr sizeT) = sizeT +type instance SizeType (DistrExpr size) = size -instance (Show sizeT) => PP.ToCodeString (DistrExpr sizeT) where +instance (Show size) => PP.ToCodeString (DistrExpr size) where build UniformE{sample_ty} = PP.putWord . printf "uniform : %s" =<< PP.fromBuild sample_ty build BernoulliE{prob_one} = PP.putWord $ printf "bernoulli[%s]" (show prob_one) @@ -378,7 +378,7 @@ instance (Show (SizeType ext), PP.ToCodeString ext) => PP.ToCodeString (NamedFun PP.putLine $ printf "return %s" (PP.commaList ret_names) PP.putLine "end" where - -- showTypedVar :: Ident -> VarType sizeT -> String + -- showTypedVar :: Ident -> VarType size -> String showTypedVar x ty = printf "%s: %s" x <$> PP.fromBuild ty -- declare build @@ -422,9 +422,9 @@ instance (Show (SizeType ext), PP.ToCodeString ext) => PP.ToCodeString (Program build (Program fs) = mapM_ (\f -> PP.build f >> PP.endl) fs {- | Void extension (i.e. only use the core language) -Usage: @p :: Program (Core sizeT precT)@ +Usage: @p :: Program (Core size prec)@ -} -data Core sizeT precT +data Core size prec deriving (Eq, Read, Show) type instance SizeType (Core size prec) = size diff --git a/src/Traq/ProtoLang/TypeCheck.hs b/src/Traq/ProtoLang/TypeCheck.hs index 8e2fd75..b0d2515 100644 --- a/src/Traq/ProtoLang/TypeCheck.hs +++ b/src/Traq/ProtoLang/TypeCheck.hs @@ -50,22 +50,22 @@ import Traq.ProtoLang.Syntax -- ================================================================================ -- | A context mapping variables to their types. -type TypingCtx sizeT = Ctx.Context (VarType sizeT) +type TypingCtx size = Ctx.Context (VarType size) class HasTypingCtx p where - _typingCtx :: (sizeT ~ SizeType p) => Lens' p (TypingCtx sizeT) + _typingCtx :: (size ~ SizeType p) => Lens' p (TypingCtx size) -instance HasTypingCtx (TypingCtx sizeT) where _typingCtx = id +instance HasTypingCtx (TypingCtx size) where _typingCtx = id -- ================================================================================ -- Typecheckable size types -- ================================================================================ --- | Type @sizeT@ that can be type-checked. -type TypingReqs sizeT = (Eq sizeT, Show sizeT, Num sizeT) +-- | Type @size@ that can be type-checked. +type TypingReqs size = (Eq size, Show size, Num size) -- | Boolean type in our language. -tbool :: (Num sizeT) => VarType sizeT +tbool :: (Num size) => VarType size tbool = Fin 2 -- ================================================================================ @@ -73,13 +73,13 @@ tbool = Fin 2 -- ================================================================================ typeCheckBasicExpr :: - forall sizeT m. - ( TypingReqs sizeT + forall size m. + ( TypingReqs size , MonadError String m - , MonadReader (TypingCtx sizeT) m + , MonadReader (TypingCtx size) m ) => - BasicExpr sizeT -> - m (VarType sizeT) + BasicExpr size -> + m (VarType size) typeCheckBasicExpr VarE{var} = Ctx.lookup' var typeCheckBasicExpr ParamE{param} = do -- TODO use a separate context for params @@ -207,7 +207,7 @@ lookupFunE :: ( MonadError String m , MonadReader r m , HasFunCtx r primT - , sizeT ~ SizeType r + , size ~ SizeType r ) => Ident -> m (FunDef primT) @@ -231,56 +231,56 @@ type TypeChecker ext = -- -------------------------------------------------------------------------------- -- Primitives -- -------------------------------------------------------------------------------- -class (TypingReqs sizeT, sizeT ~ SizeType ext) => TypeInferrable ext sizeT | ext -> sizeT where +class (TypingReqs size, size ~ SizeType ext) => TypeInferrable ext size | ext -> size where inferTypes :: forall ext' m. ( m ~ TypeChecker ext' - , sizeT ~ SizeType ext' + , size ~ SizeType ext' ) => ext -> - m [VarType sizeT] + m [VarType size] default inferTypes :: forall ext' m. ( Generic ext - , GTypeInferrable (Rep ext) sizeT + , GTypeInferrable (Rep ext) size , m ~ TypeChecker ext' - , sizeT ~ SizeType ext' + , size ~ SizeType ext' ) => ext -> - m [VarType sizeT] + m [VarType size] inferTypes p = ginferTypes (from p) -instance (TypingReqs sizeT) => TypeInferrable (Core sizeT precT) sizeT where +instance (TypingReqs size) => TypeInferrable (Core size prec) size where inferTypes = \case {} -class (TypingReqs sizeT) => GTypeInferrable f sizeT | f -> sizeT where +class (TypingReqs size) => GTypeInferrable f size | f -> size where ginferTypes :: forall ext' m ext. ( m ~ TypeChecker ext' - , sizeT ~ SizeType ext' + , size ~ SizeType ext' ) => f ext -> - m [VarType sizeT] + m [VarType size] -instance (GTypeInferrable p1 sizeT, GTypeInferrable p2 sizeT) => GTypeInferrable (p1 :+: p2) sizeT where +instance (GTypeInferrable p1 size, GTypeInferrable p2 size) => GTypeInferrable (p1 :+: p2) size where ginferTypes (L1 p) = ginferTypes p ginferTypes (R1 p) = ginferTypes p -instance (GTypeInferrable p sizeT) => GTypeInferrable (M1 i c p) sizeT where +instance (GTypeInferrable p size) => GTypeInferrable (M1 i c p) size where ginferTypes (M1 x) = ginferTypes x -instance (TypeInferrable p sizeT, sizeT ~ SizeType p) => GTypeInferrable (K1 i p) sizeT where +instance (TypeInferrable p size, size ~ SizeType p) => GTypeInferrable (K1 i p) size where ginferTypes (K1 x) = inferTypes x -- -------------------------------------------------------------------------------- -- Core Language -- -------------------------------------------------------------------------------- -instance (TypingReqs sizeT) => TypeInferrable (DistrExpr sizeT) sizeT where +instance (TypingReqs size) => TypeInferrable (DistrExpr size) size where inferTypes UniformE{sample_ty} = pure [sample_ty] inferTypes BernoulliE{} = pure [tbool] -instance (TypeInferrable ext sizeT) => TypeInferrable (Expr ext) sizeT where +instance (TypeInferrable ext size) => TypeInferrable (Expr ext) size where inferTypes BasicExprE{basic_expr} = do gamma <- use id lift $ do @@ -316,7 +316,7 @@ instance (TypeInferrable ext sizeT) => TypeInferrable (Expr ext) sizeT where (Fin _) -> return ret_types _ -> throwError "Last type of the loop function should be a Fin type." -instance (TypeInferrable ext sizeT) => TypeInferrable (Stmt ext) sizeT where +instance (TypeInferrable ext size) => TypeInferrable (Stmt ext) size where -- single statement inferTypes ExprS{rets, expr} = do out_tys <- inferTypes expr @@ -344,8 +344,8 @@ instance (TypeInferrable ext sizeT) => TypeInferrable (Stmt ext) sizeT where -- | Type check a single function. typeCheckFun :: - ( TypeInferrable primT sizeT - , sizeT ~ SizeType primT + ( TypeInferrable primT size + , size ~ SizeType primT ) => FunCtx primT -> FunDef primT -> @@ -379,7 +379,7 @@ typeCheckFun _ FunDef{mbody = Nothing} = return () -- | Type check a full program (i.e. list of functions). typeCheckProg :: - (TypeInferrable primT sizeT) => + (TypeInferrable primT size) => Program primT -> Either String () typeCheckProg (Program fs) = diff --git a/src/Traq/ProtoLang/Vars.hs b/src/Traq/ProtoLang/Vars.hs index 4dc7f2e..f4ebd44 100644 --- a/src/Traq/ProtoLang/Vars.hs +++ b/src/Traq/ProtoLang/Vars.hs @@ -63,7 +63,7 @@ freeVars = Set.fromList . freeVarsList instance HasFreeVars (Core size prec) where freeVarsList = \case {} -instance HasFreeVars (BasicExpr sizeT) where +instance HasFreeVars (BasicExpr size) where freeVarsList VarE{var} = [var] freeVarsList ConstE{} = [] freeVarsList ParamE{} = [] @@ -77,7 +77,7 @@ instance HasFreeVars (BasicExpr sizeT) where freeVarsList UpdateArrE{arr_expr, ix_expr, rhs} = concatMap freeVarsList [arr_expr, ix_expr, rhs] freeVarsList ProjectE{tup_expr} = freeVarsList tup_expr -instance HasFreeVars (DistrExpr sizeT) where +instance HasFreeVars (DistrExpr size) where freeVarsList UniformE{} = [] freeVarsList BernoulliE{} = [] diff --git a/test/Traq/Compiler/QuantumSpec.hs b/test/Traq/Compiler/QuantumSpec.hs index 3e9d416..7813bd8 100644 --- a/test/Traq/Compiler/QuantumSpec.hs +++ b/test/Traq/Compiler/QuantumSpec.hs @@ -15,7 +15,7 @@ import qualified Traq.ProtoLang as P import Test.Hspec import TestHelpers -_ProcBodyC :: Traversal' (ProcBody sizeT) (CProcBody sizeT) +_ProcBodyC :: Traversal' (ProcBody size) (CProcBody size) _ProcBodyC _focus (ProcBodyC cb) = ProcBodyC <$> _focus cb _ProcBodyC _ b = pure b diff --git a/test/Traq/Examples/TreeGeneratorSpec.hs b/test/Traq/Examples/TreeGeneratorSpec.hs index 5baf80e..97712b8 100644 --- a/test/Traq/Examples/TreeGeneratorSpec.hs +++ b/test/Traq/Examples/TreeGeneratorSpec.hs @@ -20,7 +20,7 @@ import qualified Traq.ProtoLang as P import Test.Hspec import TestHelpers -loopExample :: forall ext sizeT. (Num sizeT, sizeT ~ SizeType ext) => sizeT -> sizeT -> Program ext +loopExample :: forall ext size. (Num size, size ~ SizeType ext) => size -> size -> Program ext loopExample n w = Program [ NamedFunDef diff --git a/test/Traq/Primitives/Amplify/CAmplifySpec.hs b/test/Traq/Primitives/Amplify/CAmplifySpec.hs index bc4b0e4..b6dfc68 100644 --- a/test/Traq/Primitives/Amplify/CAmplifySpec.hs +++ b/test/Traq/Primitives/Amplify/CAmplifySpec.hs @@ -12,9 +12,9 @@ import qualified Traq.ProtoLang as P import Test.Hspec import TestHelpers -type Prim sizeT precT = Primitive (CAmplify sizeT precT) +type Prim size prec = Primitive (CAmplify size prec) -exampleProgram :: (Num sizeT, Fractional precT) => sizeT -> P.Program (Prim sizeT precT) +exampleProgram :: (Num size, Fractional prec) => size -> P.Program (Prim size prec) exampleProgram n = P.Program [P.NamedFunDef "sampler" sampler, P.NamedFunDef "main" main_fun] where node_ty = P.Fin n diff --git a/test/Traq/Primitives/Amplify/PreludeSpec.hs b/test/Traq/Primitives/Amplify/PreludeSpec.hs index 6481a84..0b94dcd 100644 --- a/test/Traq/Primitives/Amplify/PreludeSpec.hs +++ b/test/Traq/Primitives/Amplify/PreludeSpec.hs @@ -15,7 +15,7 @@ import qualified Traq.Utils.Printing as PP import Test.Hspec import TestHelpers -exampleProgram1 :: (Num sizeT, Fractional precT) => sizeT -> P.Program (Primitive (Amplify sizeT precT)) +exampleProgram1 :: (Num size, Fractional prec) => size -> P.Program (Primitive (Amplify size prec)) exampleProgram1 n = P.Program [P.NamedFunDef "sampler" sampler, P.NamedFunDef "main" main_fun] where node_ty = P.Fin n @@ -60,7 +60,7 @@ exampleProgram1 n = P.Program [P.NamedFunDef "sampler" sampler, P.NamedFunDef "m Amplify{p_min = 0.02} } -exampleProgram2 :: (Num sizeT, Fractional precT) => sizeT -> P.Program (Primitive (Amplify sizeT precT)) +exampleProgram2 :: (Num size, Fractional prec) => size -> P.Program (Primitive (Amplify size prec)) exampleProgram2 n = P.Program [P.NamedFunDef "f" fDef, P.NamedFunDef "main" mainDef] where node_ty = P.Fin n @@ -131,7 +131,7 @@ exampleProgram2 n = P.Program [P.NamedFunDef "f" fDef, P.NamedFunDef "main" main } } -exampleProgram3 :: (Num sizeT, Fractional precT) => sizeT -> P.Program (Primitive (Amplify sizeT precT)) +exampleProgram3 :: (Num size, Fractional prec) => size -> P.Program (Primitive (Amplify size prec)) exampleProgram3 n = P.Program [P.NamedFunDef "sampler" sampler, P.NamedFunDef "main" mainDef] where node_ty = P.Fin n diff --git a/test/Traq/Primitives/TreeSearchSpec.hs b/test/Traq/Primitives/TreeSearchSpec.hs index 9d4c3c0..3a860fd 100644 --- a/test/Traq/Primitives/TreeSearchSpec.hs +++ b/test/Traq/Primitives/TreeSearchSpec.hs @@ -14,7 +14,7 @@ import Traq.ProtoLang.Parser (programParser) import Test.Hspec import TestHelpers -exampleProgram :: sizeT -> sizeT -> P.Program (TreeSearch sizeT precT) +exampleProgram :: size -> size -> P.Program (TreeSearch size prec) exampleProgram n two = P.Program [ P.NamedFunDef "child" child diff --git a/tools/compile.hs b/tools/compile.hs index 2b4552b..a6cba6f 100644 --- a/tools/compile.hs +++ b/tools/compile.hs @@ -62,7 +62,7 @@ subsNM params s = Sym.unSym $ foldr subsOnce s params subsOnce :: (Ident, SizeT) -> SymbSize -> SymbSize subsOnce (k, v) = Sym.subst k (Sym.con v) -compile :: (RealFloat precT, Show precT) => P.Program (WorstCasePrims SizeT precT) -> precT -> IO String +compile :: (RealFloat prec, Show prec) => P.Program (WorstCasePrims SizeT prec) -> prec -> IO String compile prog eps = do let prog_rn = if P.checkVarsUnique prog then prog else P.renameVars' prog prog' <- either fail pure $ A.annotateProgWithErrorBudget (P.failProb eps) prog_rn From 20a5d8982fa024767f54a2b512d81011bc0297b5 Mon Sep 17 00:00:00 2001 From: Anurudh Peduri Date: Thu, 19 Feb 2026 16:34:29 +0000 Subject: [PATCH 05/28] cost tests --- package.yaml | 1 + src/Traq/Analysis/Annotate/Prelude.hs | 12 ++++++++++++ src/Traq/CQPL/Cost.hs | 18 +++++++++--------- src/Traq/CQPL/TypeCheck.hs | 1 - src/Traq/Primitives/Simons/Quantum.hs | 6 +++--- src/Traq/ProtoLang/Syntax.hs | 3 +-- test/TestHelpers.hs | 5 +++++ test/Traq/Examples/ClusteringAlgorithmSpec.hs | 9 +++++++++ .../Traq/Examples/DepthThreeNandFormulaSpec.hs | 7 +++++++ test/Traq/Examples/EvenMansourSpec.hs | 9 ++++++++- test/Traq/Examples/GroverMeetsSimonSpec.hs | 9 +++++++++ test/Traq/Examples/MatrixSearchSpec.hs | 9 ++++++++- test/Traq/Examples/NonDetSpec.hs | 9 +++++++++ test/Traq/Examples/PeriodFindingSpec.hs | 7 +++++++ test/Traq/Examples/SearchSpec.hs | 9 ++++++++- test/Traq/Examples/SteepMaxKSatSpec.hs | 9 +++++++++ .../Examples/ThreeRoundFeistelAttackSpec.hs | 9 +++++++++ test/Traq/Examples/TreeGeneratorSpec.hs | 17 +++++++++++++++++ test/Traq/Examples/TriangleCycleSpec.hs | 9 +++++++++ traq.cabal | 3 ++- 20 files changed, 142 insertions(+), 19 deletions(-) diff --git a/package.yaml b/package.yaml index 3f65cd1..5ce7ac4 100644 --- a/package.yaml +++ b/package.yaml @@ -117,6 +117,7 @@ tests: - traq - hspec >= 2.11.0 - QuickCheck + - HUnit - HUnit-approx cpp-options: -DTEST build-tools: hspec-discover diff --git a/src/Traq/Analysis/Annotate/Prelude.hs b/src/Traq/Analysis/Annotate/Prelude.hs index 05c9697..78f98a8 100644 --- a/src/Traq/Analysis/Annotate/Prelude.hs +++ b/src/Traq/Analysis/Annotate/Prelude.hs @@ -33,6 +33,9 @@ import Lens.Micro.Mtl import qualified Traq.Data.Context as Ctx import Traq.Data.Default (HasDefault (..)) +import Traq.Analysis.Cost.Prelude +import Traq.Analysis.Cost.Quantum +import Traq.Analysis.Cost.Unitary import Traq.Analysis.Error.Prelude import Traq.Prelude import Traq.ProtoLang @@ -63,6 +66,15 @@ instance (Evaluatable ext size prec) => Evaluatable (AnnFailProb ext) size prec instance (HasFreeVars ext) => HasFreeVars (AnnFailProb ext) where freeVarsList (AnnFailProb _ e) = freeVarsList e +instance (CostReqs size prec) => CostU (AnnFailProb (Core size prec)) size prec where + costU (AnnFailProb _ e) = costU e + +instance (CostReqs size prec) => CostQ (AnnFailProb (Core size prec)) size prec where + costQ (AnnFailProb _ e) = costQ e + +instance (CostReqs size prec, EvalReqs size prec) => ExpCostQ (AnnFailProb (Core size prec)) size prec where + expCostQ (AnnFailProb _ e) = expCostQ e + -- ============================================================================ -- RS Monad to perform annotation -- ============================================================================ diff --git a/src/Traq/CQPL/Cost.hs b/src/Traq/CQPL/Cost.hs index 5ab43b4..037ff01 100644 --- a/src/Traq/CQPL/Cost.hs +++ b/src/Traq/CQPL/Cost.hs @@ -64,11 +64,9 @@ instance HasCost (UStmt size) where cost UCallS{uproc_id} = cachedProcCost uproc_id cost (USeqS ss) = Alg.sum <$> mapM cost ss cost URepeatS{n_iter = P.MetaSize k, uloop_body} = Alg.sinnum (fromIntegral k) <$> cost uloop_body - cost URepeatS{n_iter = P.MetaValue k, uloop_body} = Alg.sinnum (fromIntegral k) <$> cost uloop_body - cost URepeatS{n_iter = P.MetaName _} = throwError "unsupported meta parameter substitution" + cost URepeatS{n_iter = P.MetaName _} = return Alg.zero cost UForInRangeS{iter_lim = P.MetaSize k, uloop_body} = Alg.sinnum (fromIntegral k) <$> cost uloop_body - cost UForInRangeS{iter_lim = P.MetaValue k, uloop_body} = Alg.sinnum (fromIntegral k) <$> cost uloop_body - cost UForInRangeS{iter_lim = _} = throwError "unsupported meta parameter substitution" + cost UForInRangeS{iter_lim = P.MetaName _} = return Alg.zero cost UWithComputedS{with_ustmt, body_ustmt} = do wc <- cost with_ustmt bc <- cost body_ustmt @@ -82,18 +80,20 @@ instance HasCost (Stmt size) where cost RandomS{} = return Alg.zero cost RandomDynS{} = return Alg.zero -- single statements - cost CallS{fun = FunctionCall p, meta_params = []} = cachedProcCost p - cost CallS{fun = UProcAndMeas up, meta_params = []} = cachedProcCost up - cost CallS{} = throwError "unsupported cost: proc call with params" + cost CallS{fun = FunctionCall p} = cachedProcCost p + cost CallS{fun = UProcAndMeas up} = cachedProcCost up -- compound statements cost (SeqS ss) = Alg.sum <$> mapM cost ss cost IfThenElseS{s_true, s_false} = max <$> cost s_true <*> cost s_false cost RepeatS{n_iter = P.MetaSize k, loop_body} = Alg.sinnum (fromIntegral k) <$> cost loop_body - cost RepeatS{n_iter = P.MetaValue k, loop_body} = Alg.sinnum (fromIntegral k) <$> cost loop_body cost RepeatS{} = throwError "unsupported cost" + cost WhileK{n_iter = P.MetaSize k, loop_body} = Alg.sinnum (fromIntegral k) <$> cost loop_body cost WhileK{} = throwError "unsupported cost" + cost WhileKWithCondExpr{n_iter = P.MetaSize k, loop_body} = Alg.sinnum (fromIntegral k) <$> cost loop_body cost WhileKWithCondExpr{} = throwError "unsupported cost" - cost ForInArray{} = throwError "unsupported cost" + cost ForInArray{loop_values, loop_body} = Alg.sinnum (fromIntegral (length loop_values)) <$> cost loop_body + cost ForInRangeS{iter_lim = P.MetaSize k, loop_body} = Alg.sinnum (fromIntegral k) <$> cost loop_body + cost ForInRangeS{} = throwError "unsupported cost" instance HasCost (ProcDef size) where cost ProcDef{proc_name, proc_body = ProcBodyC CProcDecl} = pure $ C.query C.Classical proc_name diff --git a/src/Traq/CQPL/TypeCheck.hs b/src/Traq/CQPL/TypeCheck.hs index 84fbc0e..17262b9 100644 --- a/src/Traq/CQPL/TypeCheck.hs +++ b/src/Traq/CQPL/TypeCheck.hs @@ -257,7 +257,6 @@ typeCheckStmt RepeatS{loop_body} = typeCheckStmt loop_body typeCheckStmt ForInRangeS{loop_body, iter_meta_var, iter_lim} = do iter_ty <- case iter_lim of P.MetaSize n -> pure $ P.Fin n - P.MetaValue n -> pure $ P.Fin $ fromIntegral n P.MetaName _ -> Err.throwErrorMessage "cannot find iteration" local (P._typingCtx . Ctx.ins ('#' : iter_meta_var) .~ iter_ty) $ typeCheckStmt loop_body diff --git a/src/Traq/Primitives/Simons/Quantum.hs b/src/Traq/Primitives/Simons/Quantum.hs index 7542320..8090d37 100644 --- a/src/Traq/Primitives/Simons/Quantum.hs +++ b/src/Traq/Primitives/Simons/Quantum.hs @@ -90,7 +90,7 @@ _SimonsQueries :: -- | maximum allowed failure probability. P.FailProb prec -> prec -_SimonsQueries n p0 eps = q +_SimonsQueries n p0 eps = q + 1 where {- Sketch: We need to pick @c@ such that @(2 * ((1 + p0)/2)^c)^n <= eps@ (see Theorem 1) @@ -195,7 +195,7 @@ instance proc_name <- lift $ Compiler.newIdent "USimon" i <- lift $ Compiler.newIdent "i" - let nq = ceiling $ _SimonsQueries n p_0 eps + let nq = floor $ _SimonsQueries n p_0 eps xts <- forM (simons_uproc & CQPL.proc_param_types) $ \t -> do let t' = P.Arr nq t x <- lift $ Compiler.allocAncillaWithPref (proc_name ++ "_aux") t' @@ -254,7 +254,7 @@ instance proc_name <- lift $ Compiler.newIdent "QSimon" i <- lift $ Compiler.newIdent "i" - let nq = ceiling $ _SimonsQueries n p_0 eps + let nq = floor $ _SimonsQueries n p_0 eps xts <- forM arg_tys $ \t -> do let t' = P.Arr nq t x <- lift $ Compiler.allocAncillaWithPref (proc_name ++ "__u") t' diff --git a/src/Traq/ProtoLang/Syntax.hs b/src/Traq/ProtoLang/Syntax.hs index b84f5eb..1c6bd84 100644 --- a/src/Traq/ProtoLang/Syntax.hs +++ b/src/Traq/ProtoLang/Syntax.hs @@ -71,13 +71,12 @@ import Traq.Utils.ASTRewriting import qualified Traq.Utils.Printing as PP -- | Compile-time constant parameters -data MetaParam size = MetaName String | MetaSize size | MetaValue Integer +data MetaParam size = MetaName String | MetaSize size deriving (Eq, Show, Read) instance (Show size) => PP.ToCodeString (MetaParam size) where build (MetaName n) = PP.putWord $ "#" ++ n build (MetaSize n) = PP.putWord $ show n - build (MetaValue n) = PP.putWord $ show n -- ================================================================================ -- Types and Values diff --git a/test/TestHelpers.hs b/test/TestHelpers.hs index 818b264..c73ba20 100644 --- a/test/TestHelpers.hs +++ b/test/TestHelpers.hs @@ -3,9 +3,11 @@ module TestHelpers where import Control.Monad (forM_) import Data.Either import Data.Maybe +import Text.Printf (printf) import qualified Traq.Data.Probability as Prob +import Test.HUnit import Test.HUnit.Approx import Test.Hspec @@ -51,3 +53,6 @@ shouldBeDistribution mu vals = do assertApproxEqual "mass" epsilon (sum $ map snd vals) $ Prob.mass mu forM_ vals $ \(x, p) -> assertApproxEqual ("Prob[" <> show x <> "]") epsilon p $ Prob.probabilityOf (== x) mu + +shouldBeLE :: (Ord a, Show a) => a -> a -> Expectation +shouldBeLE x y = assertBool (printf "failed: %s <= %s" (show x) (show y)) (x <= y) diff --git a/test/Traq/Examples/ClusteringAlgorithmSpec.hs b/test/Traq/Examples/ClusteringAlgorithmSpec.hs index d7032bb..f049077 100644 --- a/test/Traq/Examples/ClusteringAlgorithmSpec.hs +++ b/test/Traq/Examples/ClusteringAlgorithmSpec.hs @@ -9,6 +9,7 @@ import Lens.Micro.GHC import qualified Traq.Data.Symbolic as Sym import qualified Traq.Analysis as A +import Traq.Analysis.CostModel.QueryCost (SimpleQueryCost (getCost)) import qualified Traq.CQPL as CQPL import qualified Traq.Compiler as Compiler import Traq.Prelude @@ -55,3 +56,11 @@ spec = describe "Clustering Algorithm" $ do ex' <- expectRight $ A.annotateProgWith (P._exts (A.annSinglePrim eps)) ex ex_uqpl <- expectRight $ Compiler.lowerProgram ex' assertRight $ CQPL.typeCheckProgram ex_uqpl + + it "cost" $ do + ex <- loadExample + ex' <- expectRight $ A.annotateProgWith (P._exts (A.annSinglePrim eps)) ex + ex_cqpl <- expectRight $ Compiler.lowerProgram ex' + let cost = fst (CQPL.programCost ex_cqpl) :: SimpleQueryCost Double + let cost_from_analysis = getCost $ A.costQProg ex' + getCost cost `shouldBeLE` cost_from_analysis diff --git a/test/Traq/Examples/DepthThreeNandFormulaSpec.hs b/test/Traq/Examples/DepthThreeNandFormulaSpec.hs index 9eed730..b72d048 100644 --- a/test/Traq/Examples/DepthThreeNandFormulaSpec.hs +++ b/test/Traq/Examples/DepthThreeNandFormulaSpec.hs @@ -11,6 +11,7 @@ import Lens.Micro.GHC import qualified Traq.Data.Symbolic as Sym import qualified Traq.Analysis as A +import Traq.Analysis.CostModel.QueryCost (SimpleQueryCost (getCost)) import qualified Traq.CQPL as CQPL import qualified Traq.Compiler as Compiler import Traq.Prelude @@ -48,3 +49,9 @@ spec = describe "Depth 3 NAND Formula" $ do it "typechecks" $ \ex -> do ex_uqpl <- expectRight $ Compiler.lowerProgram ex assertRight $ CQPL.typeCheckProgram ex_uqpl + + it "cost" $ \ex -> do + ex_cqpl <- expectRight $ Compiler.lowerProgram ex + let cost = fst (CQPL.programCost ex_cqpl) :: SimpleQueryCost Double + let cost_from_analysis = getCost $ A.costQProg ex + getCost cost `shouldBeLE` cost_from_analysis diff --git a/test/Traq/Examples/EvenMansourSpec.hs b/test/Traq/Examples/EvenMansourSpec.hs index 6820ee4..645c121 100644 --- a/test/Traq/Examples/EvenMansourSpec.hs +++ b/test/Traq/Examples/EvenMansourSpec.hs @@ -18,7 +18,7 @@ import Traq.Primitives.Simons.Quantum import qualified Traq.ProtoLang as P import Test.Hspec -import TestHelpers (assertRight, expectRight) +import TestHelpers examplePath :: String examplePath = "examples/cryptanalysis/even_mansour.traq" @@ -85,3 +85,10 @@ spec = describe "FindXorPeriod" $ do ex' <- expectRight $ A.annotateProgWith (P._exts (A.annSinglePrim eps)) program ex_uqpl <- expectRight $ Compiler.lowerProgram ex' assertRight $ CQPL.typeCheckProgram ex_uqpl + + it "cost" $ \program -> do + ex' <- expectRight $ A.annotateProgWith (P._exts (A.annSinglePrim eps)) program + ex_cqpl <- expectRight $ Compiler.lowerProgram ex' + let cost = fst (CQPL.programCost ex_cqpl) :: SimpleQueryCost Double + let cost_from_analysis = getCost $ A.costQProg ex' + getCost cost `shouldBeLE` cost_from_analysis diff --git a/test/Traq/Examples/GroverMeetsSimonSpec.hs b/test/Traq/Examples/GroverMeetsSimonSpec.hs index 74bc854..002ee3f 100644 --- a/test/Traq/Examples/GroverMeetsSimonSpec.hs +++ b/test/Traq/Examples/GroverMeetsSimonSpec.hs @@ -11,6 +11,7 @@ import Lens.Micro.GHC import qualified Traq.Data.Symbolic as Sym import qualified Traq.Analysis as A +import Traq.Analysis.CostModel.QueryCost (SimpleQueryCost (getCost)) import qualified Traq.CQPL as CQPL import qualified Traq.Compiler as Compiler import Traq.Prelude @@ -56,3 +57,11 @@ spec = describe "Grover Meets Simon" $ do ex' <- expectRight $ A.annotateProgWithErrorBudget eps ex ex_uqpl <- expectRight $ Compiler.lowerProgram ex' assertRight $ CQPL.typeCheckProgram ex_uqpl + + it "cost" $ do + ex <- P.renameVars' <$> loadExample + ex' <- expectRight $ A.annotateProgWithErrorBudget eps ex + ex_cqpl <- expectRight $ Compiler.lowerProgram ex' + let cost = fst (CQPL.programCost ex_cqpl) :: SimpleQueryCost Double + let cost_from_analysis = getCost $ A.costQProg ex' + getCost cost `shouldBeLE` cost_from_analysis diff --git a/test/Traq/Examples/MatrixSearchSpec.hs b/test/Traq/Examples/MatrixSearchSpec.hs index 62d7ff3..d9d463a 100644 --- a/test/Traq/Examples/MatrixSearchSpec.hs +++ b/test/Traq/Examples/MatrixSearchSpec.hs @@ -91,7 +91,7 @@ spec = describe "MatrixSearch" $ do ex_uqpl <- expectRight $ Compiler.lowerProgramU ex' let uqpl_cost = getCost . fst $ CQPL.programCost ex_uqpl let proto_cost = getCost $ A.costUProg ex' - uqpl_cost `shouldSatisfy` (<= proto_cost) + uqpl_cost `shouldBeLE` proto_cost describe "lower to CQPL" $ do let eps = A.failProb (0.001 :: Double) @@ -104,6 +104,13 @@ spec = describe "MatrixSearch" $ do ex_cqpl <- expectRight $ Compiler.lowerProgram ex' assertRight $ CQPL.typeCheckProgram ex_cqpl + it "cost" $ do + ex' <- expectRight $ A.annotateProgWithErrorBudget eps ex + ex_cqpl <- expectRight $ Compiler.lowerProgram ex' + let cost = fst (CQPL.programCost ex_cqpl) :: SimpleQueryCost Double + let cost_from_analysis = getCost $ A.costQProg ex' + getCost cost `shouldBeLE` cost_from_analysis + describe "symbolic" $ do let n = Sym.var "n" :: Sym.Sym Int let m = Sym.var "m" :: Sym.Sym Int diff --git a/test/Traq/Examples/NonDetSpec.hs b/test/Traq/Examples/NonDetSpec.hs index 5f009e2..b68aeec 100644 --- a/test/Traq/Examples/NonDetSpec.hs +++ b/test/Traq/Examples/NonDetSpec.hs @@ -11,6 +11,7 @@ import Lens.Micro.GHC import qualified Traq.Data.Symbolic as Sym import qualified Traq.Analysis as A +import Traq.Analysis.CostModel.QueryCost (SimpleQueryCost (getCost)) import qualified Traq.CQPL as CQPL import qualified Traq.Compiler as Compiler import Traq.Prelude @@ -83,3 +84,11 @@ spec = do ex' <- expectRight $ A.annotateProgWith (P._exts (A.annSinglePrim eps)) ex ex_uqpl <- expectRight $ Compiler.lowerProgram ex' assertRight $ CQPL.typeCheckProgram ex_uqpl + + it "cost" $ do + ex <- load' + ex' <- expectRight $ A.annotateProgWith (P._exts (A.annSinglePrim eps)) ex + ex_cqpl <- expectRight $ Compiler.lowerProgram ex' + let cost = fst (CQPL.programCost ex_cqpl) :: SimpleQueryCost Double + let cost_from_analysis = getCost $ A.costQProg ex' + getCost cost `shouldBeLE` cost_from_analysis diff --git a/test/Traq/Examples/PeriodFindingSpec.hs b/test/Traq/Examples/PeriodFindingSpec.hs index aa1b7b0..ed99892 100644 --- a/test/Traq/Examples/PeriodFindingSpec.hs +++ b/test/Traq/Examples/PeriodFindingSpec.hs @@ -85,3 +85,10 @@ spec = describe "FindXorPeriod" $ do ex' <- expectRight $ A.annotateProgWith (P._exts (A.annSinglePrim eps)) program ex_uqpl <- expectRight $ Compiler.lowerProgram ex' assertRight $ CQPL.typeCheckProgram ex_uqpl + + it "cost" $ \program -> do + ex' <- expectRight $ A.annotateProgWith (P._exts (A.annSinglePrim eps)) program + ex_cqpl <- expectRight $ Compiler.lowerProgram ex' + let cost = fst (CQPL.programCost ex_cqpl) :: SimpleQueryCost Double + let cost_from_analysis = getCost $ A.costQProg ex' + getCost cost `shouldBeLE` cost_from_analysis diff --git a/test/Traq/Examples/SearchSpec.hs b/test/Traq/Examples/SearchSpec.hs index 7ed202d..5fced34 100644 --- a/test/Traq/Examples/SearchSpec.hs +++ b/test/Traq/Examples/SearchSpec.hs @@ -77,7 +77,7 @@ spec = describe "SearchSpec" $ do ex_uqpl <- expectRight $ Compiler.lowerProgramU ex' let (uqpl_cost, _) = CQPL.programCost ex_uqpl let proto_cost = A.costUProg ex' :: SimpleQueryCost Double - uqpl_cost `shouldSatisfy` (<= proto_cost) + uqpl_cost `shouldBeLE` proto_cost describe "Compile" $ do let eps = A.failProb (0.0001 :: Double) @@ -91,6 +91,13 @@ spec = describe "SearchSpec" $ do ex_uqpl <- expectRight $ Compiler.lowerProgram ex' assertRight $ CQPL.typeCheckProgram ex_uqpl + it "cost" $ do + ex' <- expectRight $ A.annotateProgWith (P._exts (A.annSinglePrim eps)) ex + ex_cqpl <- expectRight $ Compiler.lowerProgram ex' + let cost = fst (CQPL.programCost ex_cqpl) :: SimpleQueryCost Double + let cost_from_analysis = getCost $ A.costQProg ex' + getCost cost `shouldBeLE` cost_from_analysis + describe "arraySearch (returning solution)" $ do let n = 10 let ex = arraySearchIx n diff --git a/test/Traq/Examples/SteepMaxKSatSpec.hs b/test/Traq/Examples/SteepMaxKSatSpec.hs index eb1e036..da46b7b 100644 --- a/test/Traq/Examples/SteepMaxKSatSpec.hs +++ b/test/Traq/Examples/SteepMaxKSatSpec.hs @@ -9,6 +9,7 @@ import Lens.Micro.GHC import qualified Traq.Data.Symbolic as Sym import qualified Traq.Analysis as A +import Traq.Analysis.CostModel.QueryCost (SimpleQueryCost (getCost)) import qualified Traq.CQPL as CQPL import qualified Traq.Compiler as Compiler import Traq.Prelude @@ -56,3 +57,11 @@ spec = describe "Steep max-k-sat" $ do ex' <- expectRight $ A.annotateProgWith (P._exts (A.annSinglePrim eps)) ex ex_uqpl <- expectRight $ Compiler.lowerProgram ex' assertRight $ CQPL.typeCheckProgram ex_uqpl + + it "cost" $ do + ex <- P.renameVars' <$> loadExample + ex' <- expectRight $ A.annotateProgWith (P._exts (A.annSinglePrim eps)) ex + ex_cqpl <- expectRight $ Compiler.lowerProgram ex' + let cost = fst (CQPL.programCost ex_cqpl) :: SimpleQueryCost Double + let cost_from_analysis = getCost $ A.costQProg ex' + getCost cost `shouldBeLE` cost_from_analysis diff --git a/test/Traq/Examples/ThreeRoundFeistelAttackSpec.hs b/test/Traq/Examples/ThreeRoundFeistelAttackSpec.hs index 44ba218..fff1cd3 100644 --- a/test/Traq/Examples/ThreeRoundFeistelAttackSpec.hs +++ b/test/Traq/Examples/ThreeRoundFeistelAttackSpec.hs @@ -9,6 +9,7 @@ import Lens.Micro.GHC import qualified Traq.Data.Symbolic as Sym import qualified Traq.Analysis as A +import Traq.Analysis.CostModel.QueryCost (SimpleQueryCost (getCost)) import qualified Traq.CQPL as CQPL import qualified Traq.Compiler as Compiler import Traq.Prelude @@ -57,3 +58,11 @@ spec = describe "3 round feistel attack" $ do ex' <- expectRight $ A.annotateProgWith (P._exts (A.annSinglePrim eps)) ex ex_uqpl <- expectRight $ Compiler.lowerProgram ex' assertRight $ CQPL.typeCheckProgram ex_uqpl + + it "cost" $ do + ex <- P.renameVars' <$> loadExample + ex' <- expectRight $ A.annotateProgWith (P._exts (A.annSinglePrim eps)) ex + ex_cqpl <- expectRight $ Compiler.lowerProgram ex' + let cost = fst (CQPL.programCost ex_cqpl) :: SimpleQueryCost Double + let cost_from_analysis = getCost $ A.costQProg ex' + getCost cost `shouldBeLE` cost_from_analysis diff --git a/test/Traq/Examples/TreeGeneratorSpec.hs b/test/Traq/Examples/TreeGeneratorSpec.hs index 97712b8..dae861b 100644 --- a/test/Traq/Examples/TreeGeneratorSpec.hs +++ b/test/Traq/Examples/TreeGeneratorSpec.hs @@ -10,6 +10,7 @@ import Lens.Micro.GHC import qualified Traq.Data.Symbolic as Sym import qualified Traq.Analysis as A +import Traq.Analysis.CostModel.QueryCost (SimpleQueryCost (getCost)) import qualified Traq.CQPL as CQPL import qualified Traq.Compiler as Compiler import Traq.Prelude @@ -136,6 +137,14 @@ spec = do ex_uqpl <- expectRight $ Compiler.lowerProgram ex' assertRight $ CQPL.typeCheckProgram ex_uqpl + it "cost" $ do + ex <- P.renameVars' <$> loadKnapsack 2 20 30 2 + ex' <- expectRight $ A.annotateProgWith (_exts (A.annSinglePrim eps)) ex + ex_cqpl <- expectRight $ Compiler.lowerProgram ex' + let cost = fst (CQPL.programCost ex_cqpl) :: SimpleQueryCost Double + let cost_from_analysis = getCost $ A.costQProg ex' + getCost cost `shouldBeLE` cost_from_analysis + describe "Loop example" $ do it "parses" $ do p <- @@ -160,3 +169,11 @@ spec = do ex' <- expectRight $ A.annotateProgWith (_exts A.annNoPrims) ex ex_uqpl <- expectRight $ Compiler.lowerProgram ex' assertRight $ CQPL.typeCheckProgram ex_uqpl + + it "cost" $ do + let ex = P.renameVars' $ loopExample @Core' 10 20 + ex' <- expectRight $ A.annotateProgWith (_exts A.annNoPrims) ex + ex_cqpl <- expectRight $ Compiler.lowerProgram ex' + let cost = fst (CQPL.programCost ex_cqpl) :: SimpleQueryCost Double + let cost_from_analysis = getCost $ A.costQProg ex' + getCost cost `shouldBeLE` cost_from_analysis diff --git a/test/Traq/Examples/TriangleCycleSpec.hs b/test/Traq/Examples/TriangleCycleSpec.hs index 2a503f5..0d8861f 100644 --- a/test/Traq/Examples/TriangleCycleSpec.hs +++ b/test/Traq/Examples/TriangleCycleSpec.hs @@ -9,6 +9,7 @@ import Lens.Micro.GHC import qualified Traq.Data.Symbolic as Sym import qualified Traq.Analysis as A +import Traq.Analysis.CostModel.QueryCost (SimpleQueryCost (getCost)) import qualified Traq.CQPL as CQPL import qualified Traq.Compiler as Compiler import Traq.Prelude @@ -55,3 +56,11 @@ spec = describe "Triangle Cycle Finding" $ do ex' <- expectRight $ A.annotateProgWithErrorBudget eps ex ex_uqpl <- expectRight $ Compiler.lowerProgram ex' assertRight $ CQPL.typeCheckProgram ex_uqpl + + it "cost" $ do + ex <- loadExample + ex' <- expectRight $ A.annotateProgWithErrorBudget eps ex + ex_cqpl <- expectRight $ Compiler.lowerProgram ex' + let cost = fst (CQPL.programCost ex_cqpl) :: SimpleQueryCost Double + let cost_from_analysis = getCost $ A.costQProg ex' + getCost cost `shouldBeLE` cost_from_analysis diff --git a/traq.cabal b/traq.cabal index bbdec79..3b2c807 100644 --- a/traq.cabal +++ b/traq.cabal @@ -431,7 +431,8 @@ test-suite spec build-tool-depends: hspec-discover:hspec-discover build-depends: - HUnit-approx + HUnit + , HUnit-approx , QuickCheck , algebra ==4.3.* , base >=4.10 && <5 From 11a4659d84402a9dfe3112469cb05d3423dd26a9 Mon Sep 17 00:00:00 2001 From: Anurudh Peduri Date: Sat, 21 Feb 2026 09:15:09 +0000 Subject: [PATCH 06/28] fix imports --- experiments/matrixsearch.hs | 7 +++---- src/Traq/Primitives/Max/QMax.hs | 15 +++++++-------- src/Traq/Primitives/Search/DetSearch.hs | 4 ++-- src/Traq/Primitives/Search/RandomSearch.hs | 10 +++++----- src/Traq/Primitives/Search/Symbolic.hs | 10 +++++----- src/Traq/Primitives/Simons/Quantum.hs | 12 ++++++------ test/Traq/Primitives/Search/QSearchCFNWSpec.hs | 8 ++++---- tools/compile.hs | 3 +-- 8 files changed, 33 insertions(+), 36 deletions(-) diff --git a/experiments/matrixsearch.hs b/experiments/matrixsearch.hs index 57f223a..f635c8f 100644 --- a/experiments/matrixsearch.hs +++ b/experiments/matrixsearch.hs @@ -8,7 +8,6 @@ import Text.Printf (printf) import qualified Traq.Data.Symbolic as Sym import qualified Traq.Analysis as A -import qualified Traq.Analysis as P import Traq.Analysis.CostModel.QueryCost (QueryCost (..)) import qualified Traq.CQPL as CQPL import qualified Traq.Compiler as Compiler @@ -56,10 +55,10 @@ concreteEx = do printDivider putStrLn $ PP.toCodeString ex - let eps = P.failProb (0.001 :: Double) + let eps = A.failProb (0.001 :: Double) ex' <- either fail pure $ A.annotateProgWithErrorBudget eps ex - let u_formula_cost = P.costUProg ex' :: QueryCost Double + let u_formula_cost = A.costUProg ex' :: QueryCost Double printDivider Right exU <- return $ Compiler.lowerProgramU ex' @@ -82,7 +81,7 @@ concreteQEx = do printDivider putStrLn $ PP.toCodeString ex - let eps = P.failProb (0.001 :: Double) + let eps = A.failProb (0.001 :: Double) ex' <- either fail pure $ A.annotateProgWithErrorBudget eps ex printDivider diff --git a/src/Traq/Primitives/Max/QMax.hs b/src/Traq/Primitives/Max/QMax.hs index 92b8fa8..0023c75 100644 --- a/src/Traq/Primitives/Max/QMax.hs +++ b/src/Traq/Primitives/Max/QMax.hs @@ -25,7 +25,6 @@ import Text.Printf (printf) import qualified Numeric.Algebra as Alg import qualified Traq.Analysis as A -import qualified Traq.Analysis as P import Traq.Prelude import Traq.Primitives.Class import qualified Traq.ProtoLang as P @@ -96,7 +95,7 @@ instance EvalPrim (QMax size prec) size prec where -- ================================================================================ instance - (Integral size, Floating prec, P.SizeToPrec size prec) => + (Integral size, Floating prec, A.SizeToPrec size prec) => UnitaryCostPrim (QMax size prec) size prec where unitaryQueryCosts QMax{arg_ty} _ = QMaxFunArg{fun = weakQueries (A.sizeToPrec _N)} @@ -114,21 +113,21 @@ instance UnitaryCompilePrim (QMax size prec) size prec where -- ================================================================================ -- [1], Page 16, below Eq. 11 -_EQMax :: forall size prec. (Floating prec, P.SizeToPrec size prec) => size -> prec +_EQMax :: forall size prec. (Floating prec, A.SizeToPrec size prec) => size -> prec _EQMax n = 6.3505 * sqrt_n + 2.8203 where sqrt_n :: prec - sqrt_n = sqrt $ P.sizeToPrec n + sqrt_n = sqrt $ A.sizeToPrec n -- [1], Corollary 1. -_WQMax :: forall size prec. (Floating prec, P.SizeToPrec size prec) => size -> P.FailProb prec -> prec +_WQMax :: forall size prec. (Floating prec, A.SizeToPrec size prec) => size -> A.FailProb prec -> prec _WQMax n eps = 3 * _EQMax n * log_eps where log_eps :: prec - log_eps = log (1 / P.getFailProb eps) + log_eps = log (1 / A.getFailProb eps) instance - (Integral size, Floating prec, P.SizeToPrec size prec) => + (Integral size, Floating prec, A.SizeToPrec size prec) => QuantumHavocCostPrim (QMax size prec) size prec where quantumQueryCostsUnitary QMax{arg_ty} eps = QMaxFunArg{fun = strongQueries $ _WQMax _N eps} @@ -141,7 +140,7 @@ instance quantumExprCosts = Alg.zero instance - (Floating prec, Integral size, P.SizeToPrec size prec) => + (Floating prec, Integral size, A.SizeToPrec size prec) => QuantumExpCostPrim (QMax size prec) size prec where quantumExpQueryCostsUnitary QMax{arg_ty} _ _ = QMaxFunArg{fun = strongQueries $ _EQMax _N} diff --git a/src/Traq/Primitives/Search/DetSearch.hs b/src/Traq/Primitives/Search/DetSearch.hs index 0708427..a049ba1 100644 --- a/src/Traq/Primitives/Search/DetSearch.hs +++ b/src/Traq/Primitives/Search/DetSearch.hs @@ -15,7 +15,7 @@ import qualified Numeric.Algebra as Alg import qualified Traq.Data.Probability as Prob import Traq.Data.Subtyping -import qualified Traq.Analysis as P +import qualified Traq.Analysis as A import Traq.Prelude import Traq.Primitives.Class import Traq.Primitives.Search.Prelude @@ -62,7 +62,7 @@ instance (P.TypingReqs size, Integral size, Num prec) => UnitaryCostPrim (DetSea unitaryExprCosts _ _ = Alg.zero -instance (P.TypingReqs size, Integral size, Num prec, P.SizeToPrec size prec) => QuantumHavocCostPrim (DetSearch size prec) size prec where +instance (P.TypingReqs size, Integral size, Num prec, A.SizeToPrec size prec) => QuantumHavocCostPrim (DetSearch size prec) size prec where -- only classical queries quantumQueryCostsQuantum (DetSearch PrimSearch{search_ty}) _ = BooleanPredicate (fromIntegral _N) where diff --git a/src/Traq/Primitives/Search/RandomSearch.hs b/src/Traq/Primitives/Search/RandomSearch.hs index 1810c60..ca09ca2 100644 --- a/src/Traq/Primitives/Search/RandomSearch.hs +++ b/src/Traq/Primitives/Search/RandomSearch.hs @@ -14,7 +14,7 @@ import qualified Numeric.Algebra as Alg import qualified Traq.Data.Probability as Prob -import qualified Traq.Analysis as P +import qualified Traq.Analysis as A import Traq.Prelude import Traq.Primitives.Class import Traq.Primitives.Search.Prelude @@ -29,11 +29,11 @@ _URandomSearch :: forall size prec. (Integral size, Floating prec) => size -> pr _URandomSearch = fromIntegral -- | Worst case number of predicate queries to implement random search. -_ERandomSearchWorst :: forall size prec. (Integral size, Floating prec) => size -> P.FailProb prec -> prec -_ERandomSearchWorst n eps = fromIntegral n * log (1 / P.getFailProb eps) +_ERandomSearchWorst :: forall size prec. (Integral size, Floating prec) => size -> A.FailProb prec -> prec +_ERandomSearchWorst n eps = fromIntegral n * log (1 / A.getFailProb eps) -- | Expected number of predicate queries to implement random search. -_ERandomSearch :: forall size prec. (Integral size, Floating prec) => size -> size -> P.FailProb prec -> prec +_ERandomSearch :: forall size prec. (Integral size, Floating prec) => size -> size -> A.FailProb prec -> prec _ERandomSearch n 0 eps = _ERandomSearchWorst n eps _ERandomSearch n k _ = fromIntegral n / fromIntegral k @@ -78,7 +78,7 @@ instance (P.TypingReqs size, Integral size, Floating prec) => UnitaryCostPrim (R unitaryExprCosts _ _ = Alg.zero -instance (P.TypingReqs size, Integral size, Floating prec, P.SizeToPrec size prec) => QuantumHavocCostPrim (RandomSearch size prec) size prec where +instance (P.TypingReqs size, Integral size, Floating prec, A.SizeToPrec size prec) => QuantumHavocCostPrim (RandomSearch size prec) size prec where -- only classical queries quantumQueryCostsQuantum (RandomSearch PrimSearch{search_ty}) eps = BooleanPredicate $ _ERandomSearchWorst _N eps diff --git a/src/Traq/Primitives/Search/Symbolic.hs b/src/Traq/Primitives/Search/Symbolic.hs index 331f029..61fe3c2 100644 --- a/src/Traq/Primitives/Search/Symbolic.hs +++ b/src/Traq/Primitives/Search/Symbolic.hs @@ -20,7 +20,7 @@ import qualified Numeric.Algebra as Alg import Traq.Data.Subtyping import qualified Traq.Data.Symbolic as Sym -import qualified Traq.Analysis as P +import qualified Traq.Analysis as A import Traq.Prelude import Traq.Primitives.Class import Traq.Primitives.Search.Prelude @@ -61,11 +61,11 @@ instance (P.TypingReqs size) => TypeCheckPrim (QSearchSym size prec) (Sym.Sym si getSearchType :: QSearchSym size prec -> P.VarType (Sym.Sym size) getSearchType (QSearchSym (PrimSearch _ ty)) = ty -_QryU :: forall size prec. (Show size, Show prec) => Sym.Sym size -> P.FailProb (Sym.Sym prec) -> Sym.Sym prec -_QryU n delta = Sym.var $ printf "QryU(%s, %s)" (show n) (show $ P.getFailProb delta) +_QryU :: forall size prec. (Show size, Show prec) => Sym.Sym size -> A.FailProb (Sym.Sym prec) -> Sym.Sym prec +_QryU n delta = Sym.var $ printf "QryU(%s, %s)" (show n) (show $ A.getFailProb delta) -_QryQmax :: forall size prec. (Show size, Show prec) => Sym.Sym size -> P.FailProb (Sym.Sym prec) -> Sym.Sym prec -_QryQmax n eps = Sym.var $ printf "QryQmax(%s, %s)" (show n) (show $ P.getFailProb eps) +_QryQmax :: forall size prec. (Show size, Show prec) => Sym.Sym size -> A.FailProb (Sym.Sym prec) -> Sym.Sym prec +_QryQmax n eps = Sym.var $ printf "QryQmax(%s, %s)" (show n) (show $ A.getFailProb eps) domainSizeSym :: (Num size, Eq size, Show size) => P.VarType (Sym.Sym size) -> Sym.Sym size domainSizeSym (P.Fin _N) = _N diff --git a/src/Traq/Primitives/Simons/Quantum.hs b/src/Traq/Primitives/Simons/Quantum.hs index 8090d37..88c7ba6 100644 --- a/src/Traq/Primitives/Simons/Quantum.hs +++ b/src/Traq/Primitives/Simons/Quantum.hs @@ -24,7 +24,7 @@ import Traq.Control.Monad import qualified Traq.Data.Context as Ctx import Traq.Data.Subtyping -import qualified Traq.Analysis as P +import qualified Traq.Analysis as A import qualified Traq.CQPL as CQPL import qualified Traq.Compiler as Compiler import Traq.Prelude @@ -82,13 +82,13 @@ instance -- | Number of queries as described in Theorem 1. _SimonsQueries :: forall size prec. - (Floating prec, P.SizeToPrec size prec) => + (Floating prec, A.SizeToPrec size prec) => -- | bitsize size -> -- | p_0: maximum probability of spurious collisions for non-period values. prec -> -- | maximum allowed failure probability. - P.FailProb prec -> + A.FailProb prec -> prec _SimonsQueries n p0 eps = q + 1 where @@ -99,12 +99,12 @@ _SimonsQueries n p0 eps = q + 1 ==> n + log_2 (1/eps) <= q * log_2(2 / (1+p0)) -} - q_num = P.sizeToPrec n + logBase 2 (1 / P.getFailProb eps) + q_num = A.sizeToPrec n + logBase 2 (1 / A.getFailProb eps) q_den = logBase 2 (2 / (1 + p0)) q = q_num / q_den instance - (P.TypingReqs size, Floating prec, Ord prec, Show prec, P.SizeToPrec size prec) => + (P.TypingReqs size, Floating prec, Ord prec, Show prec, A.SizeToPrec size prec) => UnitaryCostPrim (SimonsFindXorPeriod size prec) size prec where unitaryQueryCosts prim eps = @@ -115,7 +115,7 @@ instance -- | Same as unitary compilation. instance - (P.TypingReqs size, Floating prec, Ord prec, Show prec, P.SizeToPrec size prec) => + (P.TypingReqs size, Floating prec, Ord prec, Show prec, A.SizeToPrec size prec) => QuantumHavocCostPrim (SimonsFindXorPeriod size prec) size prec where quantumQueryCostsQuantum _ _ = FindXorPeriodArg{fun = 0} diff --git a/test/Traq/Primitives/Search/QSearchCFNWSpec.hs b/test/Traq/Primitives/Search/QSearchCFNWSpec.hs index 19e8dbf..234b745 100644 --- a/test/Traq/Primitives/Search/QSearchCFNWSpec.hs +++ b/test/Traq/Primitives/Search/QSearchCFNWSpec.hs @@ -8,7 +8,7 @@ import Lens.Micro.GHC import Traq.Data.Default -import qualified Traq.Analysis as P +import qualified Traq.Analysis as A import Traq.Analysis.CostModel.QueryCost (SimpleQueryCost (..)) import qualified Traq.CQPL as CQPL import Traq.Prelude @@ -28,13 +28,13 @@ fst3 (a, _, _) = a execRWT :: (Monad m, Monoid w) => r -> RWST r w () m a -> m w execRWT r m = snd <$> evalRWST m r () -data SearchParams = SearchParams {space_size :: Int, precision :: P.FailProb Double} +data SearchParams = SearchParams {space_size :: Int, precision :: A.FailProb Double} deriving (Show, Eq, Read) instance Arbitrary SearchParams where arbitrary = sized $ \n -> do space_size <- chooseInt (1, n + 1) - precision <- P.failProb <$> genDouble + precision <- A.failProb <$> genDouble return SearchParams{space_size, precision} spec :: Spec @@ -42,7 +42,7 @@ spec = do describe "Grover circuit" $ do it "for simple values" $ do let n = 10 :: Int - let eps = P.failProb (0.001 :: Double) + let eps = A.failProb (0.001 :: Double) let pred_caller c x b = CQPL.UCallS{CQPL.uproc_id = "Oracle", CQPL.dagger = False, CQPL.qargs = [c, x, b]} let lenv = default_ let lctx = default_ diff --git a/tools/compile.hs b/tools/compile.hs index a6cba6f..adc377e 100644 --- a/tools/compile.hs +++ b/tools/compile.hs @@ -9,7 +9,6 @@ import Text.Read (readMaybe) import qualified Traq.Data.Symbolic as Sym import qualified Traq.Analysis as A -import qualified Traq.Analysis as P import qualified Traq.CQPL as CQPL import qualified Traq.Compiler.Quantum as CompileQ import Traq.Prelude @@ -65,7 +64,7 @@ subsNM params s = Sym.unSym $ foldr subsOnce s params compile :: (RealFloat prec, Show prec) => P.Program (WorstCasePrims SizeT prec) -> prec -> IO String compile prog eps = do let prog_rn = if P.checkVarsUnique prog then prog else P.renameVars' prog - prog' <- either fail pure $ A.annotateProgWithErrorBudget (P.failProb eps) prog_rn + prog' <- either fail pure $ A.annotateProgWithErrorBudget (A.failProb eps) prog_rn cqpl_prog <- either fail pure $ CompileQ.lowerProgram prog' let nqubits = CQPL.numQubits cqpl_prog From 0590ba379605ad13fa8d38a38205b4456f760e74 Mon Sep 17 00:00:00 2001 From: Anurudh Peduri Date: Sat, 21 Feb 2026 09:27:49 +0000 Subject: [PATCH 07/28] wip qmax --- src/Traq/Primitives/Max/QMax.hs | 71 +++++++++++++++++++++++++++------ 1 file changed, 58 insertions(+), 13 deletions(-) diff --git a/src/Traq/Primitives/Max/QMax.hs b/src/Traq/Primitives/Max/QMax.hs index 0023c75..6841953 100644 --- a/src/Traq/Primitives/Max/QMax.hs +++ b/src/Traq/Primitives/Max/QMax.hs @@ -20,11 +20,19 @@ module Traq.Primitives.Max.QMax ( import Control.Monad (forM, when) import Control.Monad.Except (throwError) +import Control.Monad.Trans (lift) import Text.Printf (printf) +import Lens.Micro.GHC +import Lens.Micro.Mtl import qualified Numeric.Algebra as Alg +import Traq.Control.Monad +import qualified Traq.Data.Context as Ctx + import qualified Traq.Analysis as A +import qualified Traq.CQPL as CQPL +import qualified Traq.Compiler as Compiler import Traq.Prelude import Traq.Primitives.Class import qualified Traq.ProtoLang as P @@ -39,15 +47,15 @@ data QMax size prec = QMax {arg_ty :: P.VarType size} type instance SizeType (QMax size prec) = size type instance PrecType (QMax size prec) = prec -newtype QMaxFunArg a = QMaxFunArg {fun :: a} +newtype QMaxFunArg a = QMaxFunArg a type instance PrimFnShape (QMax size prec) = QMaxFunArg instance ValidPrimShape QMaxFunArg where - listToShape [fun] = Right QMaxFunArg{fun} + listToShape [fun] = Right $ QMaxFunArg fun listToShape _ = Left "max expects exactly one function argument" - shapeToList QMaxFunArg{fun} = [fun] + shapeToList (QMaxFunArg fun) = [fun] instance P.MapSize (QMax size prec) where type MappedSize (QMax size prec) size' = QMax size' prec @@ -61,7 +69,7 @@ instance (Show size) => SerializePrim (QMax size prec) where -- Type check instance (Eq size) => TypeCheckPrim (QMax size prec) size where - inferRetTypesPrim QMax{arg_ty} QMaxFunArg{fun = fun_type} = do + inferRetTypesPrim QMax{arg_ty} (QMaxFunArg fun_type) = do let P.FnType param_types ret_types = fun_type when (param_types /= [arg_ty]) $ @@ -79,7 +87,7 @@ instance (Eq size) => TypeCheckPrim (QMax size prec) size where and or-ing the results. -} instance EvalPrim (QMax size prec) size prec where - evalPrim QMax{arg_ty} QMaxFunArg{fun = fun_eval} = do + evalPrim QMax{arg_ty} (QMaxFunArg fun_eval) = do let search_range = P.domain arg_ty vs <- forM search_range $ \val -> do @@ -98,15 +106,52 @@ instance (Integral size, Floating prec, A.SizeToPrec size prec) => UnitaryCostPrim (QMax size prec) size prec where - unitaryQueryCosts QMax{arg_ty} _ = QMaxFunArg{fun = weakQueries (A.sizeToPrec _N)} + unitaryQueryCosts QMax{arg_ty} _ = QMaxFunArg (weakQueries (A.sizeToPrec _N)) where _N = P.domainSize arg_ty unitaryExprCosts _ _ = Alg.zero -instance UnitaryCompilePrim (QMax size prec) size prec where - compileUPrim QMax{arg_ty} _ = do - error "TODO: CompileU QMax" +instance (P.TypingReqs size, Integral size, RealFloat prec, Show prec) => UnitaryCompilePrim (QMax size prec) size prec where + compileUPrim QMax{arg_ty} eps = do + -- Return variables and their types + rets <- view $ to ret_vars + ret_tys <- forM rets $ \x -> do + mty <- use $ P._typingCtx . Ctx.at x + maybeWithError "" mty + + -- Function argument: unitary call builder and aux types + QMaxFunArg call_ufun <- view $ to mk_ucall + QMaxFunArg fun_aux_tys <- view $ to uproc_aux_types + + -- Allocate ancillas for the function argument + fun_aux <- lift $ mapM Compiler.allocAncilla fun_aux_tys + + -- Procedure name + proc_name <- lift $ Compiler.newIdent "UMax" + + -- Build parameters + let all_params = + Compiler.withTag CQPL.ParamOut (zip rets ret_tys) + ++ Compiler.withTag CQPL.ParamAux (zip fun_aux fun_aux_tys) + + -- Body: TODO + let uproc_body_stmt = CQPL.UCommentS "TODO: max-finding circuit" + + return + CQPL.ProcDef + { CQPL.info_comment = "" + , CQPL.proc_name = proc_name + , CQPL.proc_meta_params = [] + , CQPL.proc_param_types = map (view _3) all_params + , CQPL.proc_body = + CQPL.ProcBodyU $ + CQPL.UProcBody + { CQPL.uproc_param_names = map (view _1) all_params + , CQPL.uproc_param_tags = map (view _2) all_params + , CQPL.uproc_body_stmt + } + } -- ================================================================================ -- Quantum @@ -130,12 +175,12 @@ instance (Integral size, Floating prec, A.SizeToPrec size prec) => QuantumHavocCostPrim (QMax size prec) size prec where - quantumQueryCostsUnitary QMax{arg_ty} eps = QMaxFunArg{fun = strongQueries $ _WQMax _N eps} + quantumQueryCostsUnitary QMax{arg_ty} eps = QMaxFunArg (strongQueries $ _WQMax _N eps) where _N = P.domainSize arg_ty -- no quantum queries - quantumQueryCostsQuantum _ _ = QMaxFunArg{fun = 0} + quantumQueryCostsQuantum _ _ = QMaxFunArg 0 quantumExprCosts = Alg.zero @@ -143,12 +188,12 @@ instance (Floating prec, Integral size, A.SizeToPrec size prec) => QuantumExpCostPrim (QMax size prec) size prec where - quantumExpQueryCostsUnitary QMax{arg_ty} _ _ = QMaxFunArg{fun = strongQueries $ _EQMax _N} + quantumExpQueryCostsUnitary QMax{arg_ty} _ _ = QMaxFunArg (strongQueries $ _EQMax _N) where _N = P.domainSize arg_ty -- no quantum queries - quantumExpQueryCostsQuantum _ _ _ = QMaxFunArg{fun = []} + quantumExpQueryCostsQuantum _ _ _ = QMaxFunArg [] quantumExpExprCosts = Alg.zero From b76202cbad349743e9cd0d3ab302ee5b03c19bcc Mon Sep 17 00:00:00 2001 From: Anurudh Peduri Date: Sun, 22 Feb 2026 22:42:27 +0000 Subject: [PATCH 08/28] wip --- src/Traq/Compiler/Prelude.hs | 100 ++++++++++++++++++++++++++++++++++- 1 file changed, 99 insertions(+), 1 deletion(-) diff --git a/src/Traq/Compiler/Prelude.hs b/src/Traq/Compiler/Prelude.hs index b4bdedd..e47968d 100644 --- a/src/Traq/Compiler/Prelude.hs +++ b/src/Traq/Compiler/Prelude.hs @@ -1,6 +1,7 @@ {-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE DerivingStrategies #-} +{-# LANGUAGE DuplicateRecordFields #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GeneralisedNewtypeDeriving #-} @@ -16,6 +17,15 @@ module Traq.Compiler.Prelude ( CompilerT, compileWith, + -- ** proc builder + ProcBuilderT, + allocLocal, + addUStmt, + withUStmt, + addStmt, + withStmt, + buildProc, + -- ** State LoweringCtx, ProcSignature (..), @@ -35,7 +45,7 @@ import Control.Monad.Except (MonadError (throwError)) import Control.Monad.Extra (loopM) import Control.Monad.RWS (RWST, runRWST) import Control.Monad.State (MonadState) -import Control.Monad.Writer (MonadWriter) +import Control.Monad.Writer (MonadWriter, WriterT (..), censor) import qualified Data.Map as Map import qualified Data.Set as Set import GHC.Generics (Generic) @@ -183,3 +193,91 @@ compileWith compiler prog = do (_, _, output) <- runRWST (compiler prog) config lowering_ctx return $ CQPL.Program $ output ^. _loweredProcs + +-- ================================================================================ +-- Helper to build procs +-- ================================================================================ + +-- | Transformer to build CQPL procs in the compiler. +type VarList size = [(Ident, P.VarType size)] + +type ProcBuilderT size = + WriterT + (VarList size, [CQPL.UStmt size], [CQPL.Stmt size]) + +type IsProcBuilder m' size m = + ( m' ~ ProcBuilderT size m + , Monad m + , MonadError String m + , MonadState (LoweringCtx size) m + ) + +allocLocal :: + (IsProcBuilder m' size m) => + Ident -> + P.VarType size -> + m' Ident +allocLocal pref ty = do + x <- newIdent pref + writeElemAt _1 (x, ty) + return x + +addUStmt :: (IsProcBuilder m' size m) => CQPL.UStmt size -> m' () +addUStmt = writeElemAt _2 + +withUStmt :: (IsProcBuilder m' size m) => (CQPL.UStmt size -> CQPL.UStmt size) -> m' a -> m' a +withUStmt f = censor (_2 %~ f') + where + f' ss = [f (CQPL.USeqS ss)] + +addStmt :: (IsProcBuilder m' size m) => CQPL.Stmt size -> m' () +addStmt = writeElemAt _3 + +withStmt :: (IsProcBuilder m' size m) => (CQPL.Stmt size -> CQPL.Stmt size) -> m' a -> m' a +withStmt f = censor (_3 %~ f') + where + f' ss = [f (CQPL.SeqS ss)] + +buildProc :: + (IsProcBuilder m' size m) => + Ident -> + [Ident] -> + [(Ident, P.VarType size)] -> + m' () -> + m (CQPL.ProcDef size) +buildProc proc_name proc_meta_params params m = do + ((), (local_vars, ubody, cbody)) <- runWriterT m + + case (ubody, cbody) of + ([], []) -> throwError "buildProc: no body statements!" + ([], _) -> + pure $ + CQPL.ProcDef + { info_comment = "" + , proc_name + , proc_meta_params + , proc_param_types = map snd params + , proc_body = + CQPL.ProcBodyC + CQPL.CProcBody + { cproc_param_names = map fst params + , cproc_local_vars = local_vars + , cproc_body_stmt = CQPL.SeqS cbody + } + } + (_, []) -> + pure $ + CQPL.ProcDef + { info_comment = "" + , proc_name + , proc_meta_params + , proc_param_types = map snd params ++ map snd local_vars + , proc_body = + CQPL.ProcBodyU + CQPL.UProcBody + { uproc_param_names = map fst params ++ map fst local_vars + , uproc_param_tags = replicate (length params) CQPL.ParamUnk ++ replicate (length local_vars) CQPL.ParamAux + , uproc_body_stmt = CQPL.USeqS ubody + } + } + _ -> throwError "buildProc: contains both ustmt and stmt" From 829e86041a32426b46ae84ad50da7a889cb7e718 Mon Sep 17 00:00:00 2001 From: Anurudh Peduri Date: Mon, 23 Feb 2026 11:39:54 +0000 Subject: [PATCH 09/28] refactor --- .../tree_generator_01_knapsack.qpl | 2 +- src/Traq/Compiler/Prelude.hs | 13 +- src/Traq/Primitives/Amplify/QAmplify.hs | 130 ++++++------------ 3 files changed, 50 insertions(+), 95 deletions(-) diff --git a/examples/tree_generator/tree_generator_01_knapsack.qpl b/examples/tree_generator/tree_generator_01_knapsack.qpl index 74c9b53..5ff70a7 100644 --- a/examples/tree_generator/tree_generator_01_knapsack.qpl +++ b/examples/tree_generator/tree_generator_01_knapsack.qpl @@ -287,7 +287,7 @@ uproc KnapsackLoopBody_U(KnapsackLoopBody_xs : IN Arr<10, Fin<2>>, KnapsackLoopB KnapsackLoopBody_xs_next, KnapsackLoopBody_xs_next_1 *= SWAP; } -uproc Grover[k](KnapsackLoopBody_xs : Arr<10, Fin<2>>, KnapsackLoopBody_pr : Fin<1000>, KnapsackLoopBody_ok : OUT Fin<2>, KnapsackLoopBody_xs' : OUT Arr<10, Fin<2>>, aux_110 : AUX Fin<1000>, aux_111 : AUX Fin<1000>, aux_112 : AUX Fin<1000>, aux_113 : AUX Fin<1000>, aux_114 : AUX Fin<1000>, aux_115 : AUX Fin<1000>, aux_116 : AUX Arr<10, Fin<2>>, aux_117 : AUX Fin<1000>, aux_118 : AUX Fin<1000>, aux_119 : AUX Arr<10, Fin<2>>, aux_120 : AUX Arr<10, Fin<2>>, aux_121 : AUX Arr<10, Fin<2>>, aux_122 : AUX Arr<10, Fin<1000>>, aux_123 : AUX Arr<10, Fin<1000>>, aux_124 : AUX Arr<10, Fin<1000>>, aux_125 : AUX Arr<10, Fin<2>>, aux_126 : AUX Arr<10, Fin<2>>, aux_127 : AUX Arr<10, Fin<1000>>, aux_128 : AUX Arr<10, Fin<1000>>, aux_129 : AUX Arr<10, Fin<2>>, aux_130 : AUX Arr<10, Fin<2>>, aux_131 : AUX Arr<10, Fin<2>>, aux_132 : AUX Arr<10, Fin<2>>, aux_133 : AUX Arr<10, Fin<1000>>, aux_134 : AUX Arr<10, Fin<1000>>, aux_135 : AUX Arr<10, Fin<1000>>, aux_136 : AUX Arr<10, Fin<2>>, aux_137 : AUX Arr<10, Fin<2>>, aux_138 : AUX Arr<10, Arr<10, Fin<2>>>, aux_139 : AUX Arr<10, Fin<1000>>, aux_140 : AUX Arr<10, Fin<1000>>, aux_141 : AUX Arr<10, Fin<1000>>, aux_142 : AUX Arr<10, Fin<1000>>, aux_143 : AUX Arr<10, Fin<10>>, aux_144 : AUX Arr<11, Arr<10, Fin<2>>>, aux_145 : AUX Arr<11, Fin<1000>>, aux_146 : AUX Arr<11, Fin<1000>>, aux_147 : AUX Fin<2>) { +uproc Grover[k](KnapsackLoopBody_xs : Arr<10, Fin<2>>, KnapsackLoopBody_pr : Fin<1000>, KnapsackLoopBody_ok : Fin<2>, KnapsackLoopBody_xs' : Arr<10, Fin<2>>, aux_110 : AUX Fin<1000>, aux_111 : AUX Fin<1000>, aux_112 : AUX Fin<1000>, aux_113 : AUX Fin<1000>, aux_114 : AUX Fin<1000>, aux_115 : AUX Fin<1000>, aux_116 : AUX Arr<10, Fin<2>>, aux_117 : AUX Fin<1000>, aux_118 : AUX Fin<1000>, aux_119 : AUX Arr<10, Fin<2>>, aux_120 : AUX Arr<10, Fin<2>>, aux_121 : AUX Arr<10, Fin<2>>, aux_122 : AUX Arr<10, Fin<1000>>, aux_123 : AUX Arr<10, Fin<1000>>, aux_124 : AUX Arr<10, Fin<1000>>, aux_125 : AUX Arr<10, Fin<2>>, aux_126 : AUX Arr<10, Fin<2>>, aux_127 : AUX Arr<10, Fin<1000>>, aux_128 : AUX Arr<10, Fin<1000>>, aux_129 : AUX Arr<10, Fin<2>>, aux_130 : AUX Arr<10, Fin<2>>, aux_131 : AUX Arr<10, Fin<2>>, aux_132 : AUX Arr<10, Fin<2>>, aux_133 : AUX Arr<10, Fin<1000>>, aux_134 : AUX Arr<10, Fin<1000>>, aux_135 : AUX Arr<10, Fin<1000>>, aux_136 : AUX Arr<10, Fin<2>>, aux_137 : AUX Arr<10, Fin<2>>, aux_138 : AUX Arr<10, Arr<10, Fin<2>>>, aux_139 : AUX Arr<10, Fin<1000>>, aux_140 : AUX Arr<10, Fin<1000>>, aux_141 : AUX Arr<10, Fin<1000>>, aux_142 : AUX Arr<10, Fin<1000>>, aux_143 : AUX Arr<10, Fin<10>>, aux_144 : AUX Arr<11, Arr<10, Fin<2>>>, aux_145 : AUX Arr<11, Fin<1000>>, aux_146 : AUX Arr<11, Fin<1000>>, aux_147 : AUX Fin<2>) { call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok, KnapsackLoopBody_xs', aux_110, aux_111, aux_112, aux_113, aux_114, aux_115, aux_116, aux_117, aux_118, aux_119, aux_120, aux_121, aux_122, aux_123, aux_124, aux_125, aux_126, aux_127, aux_128, aux_129, aux_130, aux_131, aux_132, aux_133, aux_134, aux_135, aux_136, aux_137, aux_138, aux_139, aux_140, aux_141, aux_142, aux_143, aux_144, aux_145, aux_146, aux_147); repeat (#k) { KnapsackLoopBody_ok *= Z; diff --git a/src/Traq/Compiler/Prelude.hs b/src/Traq/Compiler/Prelude.hs index e47968d..79a7fac 100644 --- a/src/Traq/Compiler/Prelude.hs +++ b/src/Traq/Compiler/Prelude.hs @@ -19,6 +19,7 @@ module Traq.Compiler.Prelude ( -- ** proc builder ProcBuilderT, + allocLocalWithPrefix, allocLocal, addUStmt, withUStmt, @@ -212,16 +213,22 @@ type IsProcBuilder m' size m = , MonadState (LoweringCtx size) m ) -allocLocal :: +allocLocalWithPrefix :: (IsProcBuilder m' size m) => Ident -> P.VarType size -> m' Ident -allocLocal pref ty = do +allocLocalWithPrefix pref ty = do x <- newIdent pref writeElemAt _1 (x, ty) return x +allocLocal :: + (IsProcBuilder m' size m) => + P.VarType size -> + m' Ident +allocLocal = allocLocalWithPrefix "aux" + addUStmt :: (IsProcBuilder m' size m) => CQPL.UStmt size -> m' () addUStmt = writeElemAt _2 @@ -246,7 +253,7 @@ buildProc :: m' () -> m (CQPL.ProcDef size) buildProc proc_name proc_meta_params params m = do - ((), (local_vars, ubody, cbody)) <- runWriterT m + ((), (local_vars, ubody, cbody)) <- runWriterT $ withSandboxOf P._typingCtx m case (ubody, cbody) of ([], []) -> throwError "buildProc: no body statements!" diff --git a/src/Traq/Primitives/Amplify/QAmplify.hs b/src/Traq/Primitives/Amplify/QAmplify.hs index 7fe56d3..0468c8b 100644 --- a/src/Traq/Primitives/Amplify/QAmplify.hs +++ b/src/Traq/Primitives/Amplify/QAmplify.hs @@ -12,10 +12,8 @@ module Traq.Primitives.Amplify.QAmplify ( _EQSearch, ) where -import Control.Monad (forM, replicateM, when) +import Control.Monad (forM, when) import Control.Monad.Trans (lift) -import Control.Monad.Writer (WriterT (..), censor) -import Data.Bifunctor (second) import GHC.Generics (Generic) import Lens.Micro.GHC @@ -213,61 +211,23 @@ mkGroverK = do ret_tys <- forM rets $ \x -> use (P._typingCtx . Ctx.at x) >>= maybeWithError "missing variable" - (SamplerFn mk_sampler_call) <- view $ to mk_ucall - (SamplerFn aux_tys) <- view $ to uproc_aux_types - aux_vars <- replicateM (length aux_tys) $ Compiler.newIdent "aux" - - let sampler_call = mk_sampler_call (map CQPL.Arg (rets ++ aux_vars)) - - let grover_iteration = - CQPL.USeqS - [ CQPL.UnitaryS [CQPL.Arg b] $ CQPL.BasicGateU CQPL.ZGate - , CQPL.adjoint sampler_call - , CQPL.UnitaryS (map CQPL.Arg (rets ++ aux_vars)) $ CQPL.BasicGateU (CQPL.PhaseOnZero pi) - , sampler_call - ] - - let uproc_body_stmt = - CQPL.USeqS - [ sampler_call - , CQPL.URepeatS{n_iter = P.MetaName meta_k, uloop_body = grover_iteration} - ] - - let params = - Compiler.withTag CQPL.ParamOut (zip rets ret_tys) - ++ Compiler.withTag CQPL.ParamAux (zip aux_vars aux_tys) - return $ - CQPL.ProcDef - { CQPL.info_comment = "" - , CQPL.proc_name - , CQPL.proc_meta_params = [meta_k] - , CQPL.proc_param_types = map (view _3) params - , CQPL.proc_body = - CQPL.ProcBodyU $ - CQPL.UProcBody - { CQPL.uproc_param_names = map (view _1) params - , CQPL.uproc_param_tags = map (view _2) params - , CQPL.uproc_body_stmt - } - } - -type LocalVars = [(Ident, P.VarType SizeT)] -type AlgoMonad ext prec = - WriterT (LocalVars, [CQPL.Stmt SizeT]) (PrimCompileMonad ext (QAmplify SizeT prec)) - -allocLocal :: (m ~ AlgoMonad ext prec) => Ident -> P.VarType SizeT -> m Ident -allocLocal pref ty = do - x <- Compiler.newIdent pref - writeElemAt _1 (x, ty) - return x + Compiler.buildProc proc_name [meta_k] (zip rets ret_tys) $ do + (SamplerFn mk_sampler_call) <- view $ to mk_ucall + (SamplerFn aux_tys) <- view $ to uproc_aux_types + aux_vars <- mapM Compiler.allocLocal aux_tys -addStmt :: (m ~ AlgoMonad ext prec) => CQPL.Stmt SizeT -> m () -addStmt = writeElemAt _2 + let sampler_call = mk_sampler_call (map CQPL.Arg (rets ++ aux_vars)) -withStmt :: (m ~ AlgoMonad ext prec) => (CQPL.Stmt SizeT -> CQPL.Stmt SizeT) -> m a -> m a -withStmt f = censor (second f') - where - f' ss = [f (CQPL.SeqS ss)] + Compiler.addUStmt sampler_call + Compiler.withUStmt (CQPL.URepeatS (P.MetaName meta_k)) $ + -- grover_iteration + mapM_ + Compiler.addUStmt + [ CQPL.UnitaryS [CQPL.Arg b] $ CQPL.BasicGateU CQPL.ZGate + , CQPL.adjoint sampler_call + , CQPL.UnitaryS (map CQPL.Arg (rets ++ aux_vars)) $ CQPL.BasicGateU (CQPL.PhaseOnZero pi) + , sampler_call + ] -- compute the limits for sampling `j` in each iteration. qamplifySamplingRanges :: forall prec. (RealFloat prec) => prec -> [SizeT] @@ -298,30 +258,32 @@ buildQAmplify :: forall ext prec m. ( RealFloat prec , SizeType ext ~ SizeT - , m ~ AlgoMonad ext prec + , m ~ Compiler.ProcBuilderT SizeT (PrimCompileMonad ext (QAmplify SizeT prec)) ) => -- | n_samples: number of classical samples SizeT -> + -- | ret vars + [Ident] -> + -- | ret types + [P.VarType SizeT] -> -- | eps: max fail prob A.FailProb prec -> -- | p_min: min success probability of sampler prec -> m () -buildQAmplify n_samples eps p_min = do - -- rets - rets <- view $ to ret_vars +buildQAmplify n_samples rets _ret_tys eps p_min = do let b = head rets -- flag - not_done <- allocLocal "not_done" P.tbool - addStmt $ CQPL.AssignS [not_done] (P.ConstE (P.FinV 0) P.tbool) + not_done <- Compiler.allocLocalWithPrefix "not_done" P.tbool + Compiler.addStmt $ CQPL.AssignS [not_done] (P.ConstE (P.FinV 0) P.tbool) -- classical sampling SamplerFn mkSamplerCCall <- view $ to mk_call let sampler_call_c = mkSamplerCCall (map CQPL.Arg rets) when (n_samples /= 0) $ - addStmt $ + Compiler.addStmt $ CQPL.WhileKWithCondExpr (CQPL.MetaSize n_samples) not_done @@ -333,17 +295,17 @@ buildQAmplify n_samples eps p_min = do lift $ Compiler.addProc uproc_grover_k let j_type = P.Fin (ceiling $ _WQSearch_Q_Max p_min) -- type for j and Q_sum - q_sum <- allocLocal "Q_sum" j_type - j <- allocLocal "j" j_type - j_lim <- allocLocal "j_lim" j_type + q_sum <- Compiler.allocLocalWithPrefix "Q_sum" j_type + j <- Compiler.allocLocalWithPrefix "j" j_type + j_lim <- Compiler.allocLocalWithPrefix "j_lim" j_type let n_runs = ceiling $ _WQSearch_N_Runs eps - withStmt (CQPL.RepeatS (CQPL.MetaSize n_runs)) $ do - addStmt $ CQPL.AssignS [q_sum] (P.ConstE{P.val = P.FinV 0, P.ty = j_type}) + Compiler.withStmt (CQPL.RepeatS (CQPL.MetaSize n_runs)) $ do + Compiler.addStmt $ CQPL.AssignS [q_sum] (P.ConstE{P.val = P.FinV 0, P.ty = j_type}) let sampling_ranges = qamplifySamplingRanges p_min - withStmt + Compiler.withStmt ( \s -> CQPL.ForInArray { CQPL.loop_index = j_lim @@ -353,17 +315,17 @@ buildQAmplify n_samples eps p_min = do } ) $ do - addStmt $ CQPL.RandomDynS j j_lim - addStmt $ CQPL.AssignS [q_sum] (P.BinOpE P.AddOp (P.VarE q_sum) (P.VarE j)) - addStmt $ CQPL.AssignS [not_done] (P.VarE not_done P..&&. (P.VarE q_sum P..<=. P.VarE j_lim)) - withStmt (CQPL.ifThenS not_done) $ do - addStmt $ + Compiler.addStmt $ CQPL.RandomDynS j j_lim + Compiler.addStmt $ CQPL.AssignS [q_sum] (P.BinOpE P.AddOp (P.VarE q_sum) (P.VarE j)) + Compiler.addStmt $ CQPL.AssignS [not_done] (P.VarE not_done P..&&. (P.VarE q_sum P..<=. P.VarE j_lim)) + Compiler.withStmt (CQPL.ifThenS not_done) $ do + Compiler.addStmt $ CQPL.CallS { CQPL.fun = CQPL.UProcAndMeas (CQPL.proc_name uproc_grover_k) , CQPL.meta_params = [Right j] , CQPL.args = map CQPL.Arg rets } - addStmt $ CQPL.AssignS [not_done] (P.VarE not_done P..&&. P.notE (P.VarE b)) + Compiler.addStmt $ CQPL.AssignS [not_done] (P.VarE not_done P..&&. P.notE (P.VarE b)) instance (RealFloat prec) => QuantumCompilePrim (QAmplify SizeT prec) SizeT prec where compileQPrim (QAmplify Amplify{p_min}) eps = do @@ -372,19 +334,5 @@ instance (RealFloat prec) => QuantumCompilePrim (QAmplify SizeT prec) SizeT prec use (P._typingCtx . Ctx.at x) >>= maybeWithError "missing variable" proc_name <- Compiler.newIdent "QAmplify" - ((), (local_vars, body)) <- runWriterT $ withSandbox $ buildQAmplify 0 eps p_min - - return $ - CQPL.ProcDef - { CQPL.info_comment = "" - , CQPL.proc_name - , CQPL.proc_meta_params = [] - , CQPL.proc_param_types = ret_tys - , CQPL.proc_body = - CQPL.ProcBodyC $ - CQPL.CProcBody - { CQPL.cproc_param_names = rets - , CQPL.cproc_local_vars = local_vars - , CQPL.cproc_body_stmt = CQPL.SeqS body - } - } + Compiler.buildProc proc_name [] (zip rets ret_tys) $ do + buildQAmplify 0 rets ret_tys eps p_min From 59245d2a4b17652cd4c955c5098c90bb824d3e9c Mon Sep 17 00:00:00 2001 From: Anurudh Peduri Date: Mon, 23 Feb 2026 12:16:12 +0000 Subject: [PATCH 10/28] clean --- src/Traq/CQPL/Syntax.hs | 2 +- src/Traq/Compiler/Unitary.hs | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/Traq/CQPL/Syntax.hs b/src/Traq/CQPL/Syntax.hs index e281473..10c1637 100644 --- a/src/Traq/CQPL/Syntax.hs +++ b/src/Traq/CQPL/Syntax.hs @@ -151,8 +151,8 @@ data UStmt size | UForInRangeS { iter_meta_var :: Ident , iter_lim :: P.MetaParam size - , uloop_body :: UStmt size , dagger :: Bool + , uloop_body :: UStmt size } | UWithComputedS {with_ustmt, body_ustmt :: UStmt size} deriving (Eq, Show, Read) diff --git a/src/Traq/Compiler/Unitary.hs b/src/Traq/Compiler/Unitary.hs index bd2ac5e..4a14f28 100644 --- a/src/Traq/Compiler/Unitary.hs +++ b/src/Traq/Compiler/Unitary.hs @@ -11,7 +11,6 @@ module Traq.Compiler.Unitary ( -- ** Helpers allocAncillaWithPref, allocAncilla, - ControlFlag (..), withTag, -- * Internal @@ -56,8 +55,6 @@ freshAux xs = do tys <- zoom P._typingCtx $ mapM Ctx.lookup xs zipWithM allocAncillaWithPref xs tys -data ControlFlag = WithControl | WithoutControl deriving (Eq, Show, Read, Enum) - withTag :: ParamTag -> [(Ident, P.VarType a)] -> [(Ident, ParamTag, P.VarType a)] withTag tag = map $ \(x, ty) -> (x, tag, ty) From a869841fd1e32a5d5901633330f08505f4665d29 Mon Sep 17 00:00:00 2001 From: Anurudh Peduri Date: Mon, 23 Feb 2026 12:22:52 +0000 Subject: [PATCH 11/28] wip qmax --- examples/hillclimb/steep_max_sat.qpl | 72 ++++++++++++++++++++++++++ src/Traq/Primitives/Max/QMax.hs | 55 ++++++++++---------- test/Traq/Examples/SteepMaxKSatSpec.hs | 2 +- 3 files changed, 100 insertions(+), 29 deletions(-) create mode 100644 examples/hillclimb/steep_max_sat.qpl diff --git a/examples/hillclimb/steep_max_sat.qpl b/examples/hillclimb/steep_max_sat.qpl new file mode 100644 index 0000000..70ab32d --- /dev/null +++ b/examples/hillclimb/steep_max_sat.qpl @@ -0,0 +1,72 @@ +ext uproc Phi_U(Arr<20, Fin<2>>, Fin<1000>); + +ext proc Phi(Arr<20, Fin<2>>, Fin<1000>); + +uproc good_U(good_x : IN Arr<20, Fin<2>>, good_i : IN Fin<20>, good_w' : OUT Fin<1000>, good_w : AUX Fin<1000>, good_b : AUX Fin<2>, good_b' : AUX Fin<2>, good_x' : AUX Arr<20, Fin<2>>, good_w_1 : AUX Fin<1000>, good_b_1 : AUX Fin<2>, good_b'_1 : AUX Fin<2>, good_x'_1 : AUX Arr<20, Fin<2>>, good_w'_1 : AUX Fin<1000>) { + call Phi_U(good_x, good_w_1); + good_w, good_w_1 *= SWAP; + good_i, good_x, good_b_1 *= Embed[(good_i, good_x) => good_x[good_i]]; + good_b, good_b_1 *= SWAP; + good_b, good_b'_1 *= Embed[(good_b) => not good_b]; + good_b', good_b'_1 *= SWAP; + good_b, good_i, good_x, good_x'_1 *= Embed[(good_b, good_i, good_x) => update good_x[good_i] = good_b]; + good_x', good_x'_1 *= SWAP; + call Phi_U(good_x', good_w'_1); + good_w', good_w'_1 *= SWAP; +} + +proc good(good_x : Arr<20, Fin<2>>, good_i : Fin<20>, good_w' : Fin<1000>) { locals : (good_w : Fin<1000>, good_b : Fin<2>, good_b' : Fin<2>, good_x' : Arr<20, Fin<2>>) } { + call Phi(good_x, good_w); + good_b := good_x[good_i]; + good_b' := not good_b; + good_x' := update good_x[good_i] = good_b; + call Phi(good_x', good_w'); +} + +uproc UMax(hillclimb_iter_x : Arr<20, Fin<2>>, hillclimb_iter_i_1 : Fin<1000>, aux : AUX Fin<1000>, aux_1 : AUX Fin<2>, aux_2 : AUX Fin<2>, aux_3 : AUX Arr<20, Fin<2>>, aux_4 : AUX Fin<1000>, aux_5 : AUX Fin<2>, aux_6 : AUX Fin<2>, aux_7 : AUX Arr<20, Fin<2>>, aux_8 : AUX Fin<1000>) { + // TODO: max-finding circuit +} + +uproc hillclimb_iter_U(hillclimb_iter_x : IN Arr<20, Fin<2>>, hillclimb_iter_x' : OUT Arr<20, Fin<2>>, hillclimb_iter_i : AUX Fin<1000>, hillclimb_iter_b : AUX Fin<2>, hillclimb_iter_b' : AUX Fin<2>, hillclimb_iter_i_1 : AUX Fin<1000>, aux_prim : AUX Fin<1000>, aux_prim_1 : AUX Fin<2>, aux_prim_2 : AUX Fin<2>, aux_prim_3 : AUX Arr<20, Fin<2>>, aux_prim_4 : AUX Fin<1000>, aux_prim_5 : AUX Fin<2>, aux_prim_6 : AUX Fin<2>, aux_prim_7 : AUX Arr<20, Fin<2>>, aux_prim_8 : AUX Fin<1000>, hillclimb_iter_b_1 : AUX Fin<2>, hillclimb_iter_b'_1 : AUX Fin<2>, hillclimb_iter_x'_1 : AUX Arr<20, Fin<2>>) { + call UMax(hillclimb_iter_x, hillclimb_iter_i_1, aux_prim, aux_prim_1, aux_prim_2, aux_prim_3, aux_prim_4, aux_prim_5, aux_prim_6, aux_prim_7, aux_prim_8); + hillclimb_iter_i, hillclimb_iter_i_1 *= SWAP; + hillclimb_iter_i, hillclimb_iter_x, hillclimb_iter_b_1 *= Embed[(hillclimb_iter_i, hillclimb_iter_x) => hillclimb_iter_x[hillclimb_iter_i]]; + hillclimb_iter_b, hillclimb_iter_b_1 *= SWAP; + hillclimb_iter_b, hillclimb_iter_b'_1 *= Embed[(hillclimb_iter_b) => not hillclimb_iter_b]; + hillclimb_iter_b', hillclimb_iter_b'_1 *= SWAP; + hillclimb_iter_b, hillclimb_iter_i, hillclimb_iter_x, hillclimb_iter_x'_1 *= Embed[(hillclimb_iter_b, hillclimb_iter_i, hillclimb_iter_x) => update hillclimb_iter_x[hillclimb_iter_i] = hillclimb_iter_b]; + hillclimb_iter_x', hillclimb_iter_x'_1 *= SWAP; +} + +proc QMax(hillclimb_iter_x : Arr<20, Fin<2>>, hillclimb_iter_i : Fin<1000>) { locals : (aux_9 : Fin<1000>, aux_10 : Fin<2>, aux_11 : Fin<2>, aux_12 : Arr<20, Fin<2>>, aux_13 : Fin<1000>, aux_14 : Fin<2>, aux_15 : Fin<2>, aux_16 : Arr<20, Fin<2>>, aux_17 : Fin<1000>) } { + // TODO: max-finding circuit +} + +proc hillclimb_iter(hillclimb_iter_x : Arr<20, Fin<2>>, hillclimb_iter_x' : Arr<20, Fin<2>>) { locals : (hillclimb_iter_i : Fin<1000>, hillclimb_iter_b : Fin<2>, hillclimb_iter_b' : Fin<2>) } { + call QMax(hillclimb_iter_x, hillclimb_iter_i); + hillclimb_iter_b := hillclimb_iter_x[hillclimb_iter_i]; + hillclimb_iter_b' := not hillclimb_iter_b; + hillclimb_iter_x' := update hillclimb_iter_x[hillclimb_iter_i] = hillclimb_iter_b; +} + +uproc hillclimb_3_U(hillclimb_3_x_3 : OUT Arr<20, Fin<2>>, hillclimb_3_x_0 : AUX Arr<20, Fin<2>>, hillclimb_3_x_1 : AUX Arr<20, Fin<2>>, hillclimb_3_x_2 : AUX Arr<20, Fin<2>>, hillclimb_3_x_0_1 : AUX Arr<20, Fin<2>>, hillclimb_3_x_0_1_1 : AUX Arr<20, Fin<2>>, hillclimb_3_x_1_1 : AUX Arr<20, Fin<2>>, aux_18 : AUX Fin<1000>, aux_19 : AUX Fin<2>, aux_20 : AUX Fin<2>, aux_21 : AUX Fin<1000>, aux_22 : AUX Fin<1000>, aux_23 : AUX Fin<2>, aux_24 : AUX Fin<2>, aux_25 : AUX Arr<20, Fin<2>>, aux_26 : AUX Fin<1000>, aux_27 : AUX Fin<2>, aux_28 : AUX Fin<2>, aux_29 : AUX Arr<20, Fin<2>>, aux_30 : AUX Fin<1000>, aux_31 : AUX Fin<2>, aux_32 : AUX Fin<2>, aux_33 : AUX Arr<20, Fin<2>>, hillclimb_3_x_2_1 : AUX Arr<20, Fin<2>>, aux_34 : AUX Fin<1000>, aux_35 : AUX Fin<2>, aux_36 : AUX Fin<2>, aux_37 : AUX Fin<1000>, aux_38 : AUX Fin<1000>, aux_39 : AUX Fin<2>, aux_40 : AUX Fin<2>, aux_41 : AUX Arr<20, Fin<2>>, aux_42 : AUX Fin<1000>, aux_43 : AUX Fin<2>, aux_44 : AUX Fin<2>, aux_45 : AUX Arr<20, Fin<2>>, aux_46 : AUX Fin<1000>, aux_47 : AUX Fin<2>, aux_48 : AUX Fin<2>, aux_49 : AUX Arr<20, Fin<2>>, hillclimb_3_x_3_1 : AUX Arr<20, Fin<2>>, aux_50 : AUX Fin<1000>, aux_51 : AUX Fin<2>, aux_52 : AUX Fin<2>, aux_53 : AUX Fin<1000>, aux_54 : AUX Fin<1000>, aux_55 : AUX Fin<2>, aux_56 : AUX Fin<2>, aux_57 : AUX Arr<20, Fin<2>>, aux_58 : AUX Fin<1000>, aux_59 : AUX Fin<2>, aux_60 : AUX Fin<2>, aux_61 : AUX Arr<20, Fin<2>>, aux_62 : AUX Fin<1000>, aux_63 : AUX Fin<2>, aux_64 : AUX Fin<2>, aux_65 : AUX Arr<20, Fin<2>>) { + hillclimb_3_x_0_1 *= Distr[uniform : Arr<20, Fin<2>>]; + hillclimb_3_x_0_1, hillclimb_3_x_0_1_1 *= COPY; + hillclimb_3_x_0, hillclimb_3_x_0_1 *= SWAP; + call hillclimb_iter_U(hillclimb_3_x_0, hillclimb_3_x_1_1, aux_18, aux_19, aux_20, aux_21, aux_22, aux_23, aux_24, aux_25, aux_26, aux_27, aux_28, aux_29, aux_30, aux_31, aux_32, aux_33); + hillclimb_3_x_1, hillclimb_3_x_1_1 *= SWAP; + call hillclimb_iter_U(hillclimb_3_x_1, hillclimb_3_x_2_1, aux_34, aux_35, aux_36, aux_37, aux_38, aux_39, aux_40, aux_41, aux_42, aux_43, aux_44, aux_45, aux_46, aux_47, aux_48, aux_49); + hillclimb_3_x_2, hillclimb_3_x_2_1 *= SWAP; + call hillclimb_iter_U(hillclimb_3_x_2, hillclimb_3_x_3_1, aux_50, aux_51, aux_52, aux_53, aux_54, aux_55, aux_56, aux_57, aux_58, aux_59, aux_60, aux_61, aux_62, aux_63, aux_64, aux_65); + hillclimb_3_x_3, hillclimb_3_x_3_1 *= SWAP; +} + +proc hillclimb_3(hillclimb_3_x_3 : Arr<20, Fin<2>>) { locals : (hillclimb_3_x_0 : Arr<20, Fin<2>>, hillclimb_3_x_1 : Arr<20, Fin<2>>, hillclimb_3_x_2 : Arr<20, Fin<2>>) } { + hillclimb_3_x_0 :=$ uniform : Arr<20, Fin<2>>; + call hillclimb_iter(hillclimb_3_x_0, hillclimb_3_x_1); + call hillclimb_iter(hillclimb_3_x_1, hillclimb_3_x_2); + call hillclimb_iter(hillclimb_3_x_2, hillclimb_3_x_3); +} + + +// qubits: 534 diff --git a/src/Traq/Primitives/Max/QMax.hs b/src/Traq/Primitives/Max/QMax.hs index 6841953..ff3b6e2 100644 --- a/src/Traq/Primitives/Max/QMax.hs +++ b/src/Traq/Primitives/Max/QMax.hs @@ -124,34 +124,15 @@ instance (P.TypingReqs size, Integral size, RealFloat prec, Show prec) => Unitar QMaxFunArg call_ufun <- view $ to mk_ucall QMaxFunArg fun_aux_tys <- view $ to uproc_aux_types - -- Allocate ancillas for the function argument - fun_aux <- lift $ mapM Compiler.allocAncilla fun_aux_tys - -- Procedure name - proc_name <- lift $ Compiler.newIdent "UMax" - - -- Build parameters - let all_params = - Compiler.withTag CQPL.ParamOut (zip rets ret_tys) - ++ Compiler.withTag CQPL.ParamAux (zip fun_aux fun_aux_tys) - - -- Body: TODO - let uproc_body_stmt = CQPL.UCommentS "TODO: max-finding circuit" - - return - CQPL.ProcDef - { CQPL.info_comment = "" - , CQPL.proc_name = proc_name - , CQPL.proc_meta_params = [] - , CQPL.proc_param_types = map (view _3) all_params - , CQPL.proc_body = - CQPL.ProcBodyU $ - CQPL.UProcBody - { CQPL.uproc_param_names = map (view _1) all_params - , CQPL.uproc_param_tags = map (view _2) all_params - , CQPL.uproc_body_stmt - } - } + proc_name <- Compiler.newIdent "UMax" + + Compiler.buildProc proc_name [] (zip rets ret_tys) $ do + -- Allocate ancillas for the function argument + fun_aux <- mapM Compiler.allocLocal fun_aux_tys + + -- Body: TODO + Compiler.addUStmt $ CQPL.UCommentS "TODO: max-finding circuit" -- ================================================================================ -- Quantum @@ -199,4 +180,22 @@ instance instance QuantumCompilePrim (QMax size prec) size prec where compileQPrim QMax{} eps = do - error "TODO: CompileQ QMax" + -- Return variables and their types + rets <- view $ to ret_vars + ret_tys <- forM rets $ \x -> do + mty <- use $ P._typingCtx . Ctx.at x + maybeWithError "" mty + + -- Function argument: unitary call builder and aux types + QMaxFunArg call_ufun <- view $ to mk_ucall + QMaxFunArg fun_aux_tys <- view $ to uproc_aux_types + + -- Procedure name + proc_name <- Compiler.newIdent "QMax" + + Compiler.buildProc proc_name [] (zip rets ret_tys) $ do + -- Allocate ancillas for the function argument + fun_aux <- mapM Compiler.allocLocal fun_aux_tys + + -- Body: TODO + Compiler.addStmt $ CQPL.CommentS "TODO: max-finding circuit" diff --git a/test/Traq/Examples/SteepMaxKSatSpec.hs b/test/Traq/Examples/SteepMaxKSatSpec.hs index da46b7b..45175d1 100644 --- a/test/Traq/Examples/SteepMaxKSatSpec.hs +++ b/test/Traq/Examples/SteepMaxKSatSpec.hs @@ -44,7 +44,7 @@ spec = describe "Steep max-k-sat" $ do ex <- loadExample assertRight $ P.typeCheckProg ex - xdescribe "Compile" $ do + fdescribe "Compile" $ do let eps = A.failProb (0.0001 :: Double) it "lowers" $ do From 339245aa01cc392e76a7187b5265d29f78fdbc93 Mon Sep 17 00:00:00 2001 From: Anurudh Peduri Date: Mon, 23 Feb 2026 12:49:44 +0000 Subject: [PATCH 12/28] add range loop --- src/Traq/CQPL/Cost.hs | 1 + src/Traq/CQPL/Syntax.hs | 11 +++++++++++ src/Traq/CQPL/TypeCheck.hs | 3 +++ src/Traq/Primitives/Max/QMax.hs | 3 ++- 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/Traq/CQPL/Cost.hs b/src/Traq/CQPL/Cost.hs index 037ff01..ea6c97e 100644 --- a/src/Traq/CQPL/Cost.hs +++ b/src/Traq/CQPL/Cost.hs @@ -67,6 +67,7 @@ instance HasCost (UStmt size) where cost URepeatS{n_iter = P.MetaName _} = return Alg.zero cost UForInRangeS{iter_lim = P.MetaSize k, uloop_body} = Alg.sinnum (fromIntegral k) <$> cost uloop_body cost UForInRangeS{iter_lim = P.MetaName _} = return Alg.zero + cost UForInDomainS{iter_ty, uloop_body} = Alg.sinnum (fromIntegral (P.domainSize iter_ty)) <$> cost uloop_body cost UWithComputedS{with_ustmt, body_ustmt} = do wc <- cost with_ustmt bc <- cost body_ustmt diff --git a/src/Traq/CQPL/Syntax.hs b/src/Traq/CQPL/Syntax.hs index 10c1637..4f2c217 100644 --- a/src/Traq/CQPL/Syntax.hs +++ b/src/Traq/CQPL/Syntax.hs @@ -154,6 +154,12 @@ data UStmt size , dagger :: Bool , uloop_body :: UStmt size } + | UForInDomainS + { iter_meta_var :: Ident + , iter_ty :: P.VarType size + , dagger :: Bool + , uloop_body :: UStmt size + } | UWithComputedS {with_ustmt, body_ustmt :: UStmt size} deriving (Eq, Show, Read) @@ -170,6 +176,7 @@ instance HasAdjoint (UStmt size) where adjoint s@UnitaryS{unitary} = s{unitary = adjoint unitary} adjoint (URepeatS k s) = URepeatS k (adjoint s) adjoint s@UForInRangeS{dagger} = s{dagger = not dagger} + adjoint s@UForInDomainS{dagger} = s{dagger = not dagger} adjoint s@UWithComputedS{body_ustmt = b} = s{body_ustmt = adjoint b} showDagger :: Bool -> String @@ -206,6 +213,10 @@ instance (Show size) => PP.ToCodeString (UStmt size) where where range_str :: String range_str | dagger = "%s - 1 .. 0" | otherwise = "0 .. < %s" + build UForInDomainS{iter_meta_var, iter_ty, dagger, uloop_body} = do + ty <- PP.fromBuild iter_ty + let header = printf "for (#%s in %s%s)" iter_meta_var (if dagger then "reversed " else "") ty + PP.bracedBlockWith header $ PP.build uloop_body -- ================================================================================ -- Classical Statements diff --git a/src/Traq/CQPL/TypeCheck.hs b/src/Traq/CQPL/TypeCheck.hs index 17262b9..7c7a82e 100644 --- a/src/Traq/CQPL/TypeCheck.hs +++ b/src/Traq/CQPL/TypeCheck.hs @@ -185,6 +185,9 @@ typeCheckUStmt UForInRangeS{iter_meta_var, iter_lim, uloop_body} = do _ -> error "unsupported loop limit" local (P._typingCtx . Ctx.ins ('#' : iter_meta_var) .~ iter_lim_ty) $ do typeCheckUStmt' uloop_body +typeCheckUStmt UForInDomainS{iter_meta_var, iter_ty, uloop_body} = do + local (P._typingCtx . Ctx.ins ('#' : iter_meta_var) .~ iter_ty) $ do + typeCheckUStmt' uloop_body typeCheckUStmt UWithComputedS{with_ustmt, body_ustmt} = mapM_ typeCheckUStmt' [with_ustmt, body_ustmt] typeCheckUStmt' :: (P.TypingReqs size) => UStmt size -> TypeChecker size () diff --git a/src/Traq/Primitives/Max/QMax.hs b/src/Traq/Primitives/Max/QMax.hs index ff3b6e2..d104491 100644 --- a/src/Traq/Primitives/Max/QMax.hs +++ b/src/Traq/Primitives/Max/QMax.hs @@ -129,7 +129,8 @@ instance (P.TypingReqs size, Integral size, RealFloat prec, Show prec) => Unitar Compiler.buildProc proc_name [] (zip rets ret_tys) $ do -- Allocate ancillas for the function argument - fun_aux <- mapM Compiler.allocLocal fun_aux_tys + let _N = P.domainSize arg_ty + aux <- mapM (Compiler.allocLocal . P.Arr _N) fun_aux_tys -- Body: TODO Compiler.addUStmt $ CQPL.UCommentS "TODO: max-finding circuit" From 8e522f11c2301aa631576968d55776a75d7cf537 Mon Sep 17 00:00:00 2001 From: Anurudh Peduri Date: Mon, 23 Feb 2026 13:01:31 +0000 Subject: [PATCH 13/28] umax --- examples/hillclimb/steep_max_sat.qpl | 21 ++++++++++++--------- src/Traq/Primitives/Max/QMax.hs | 17 +++++++++++++---- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/examples/hillclimb/steep_max_sat.qpl b/examples/hillclimb/steep_max_sat.qpl index 70ab32d..78ba5b0 100644 --- a/examples/hillclimb/steep_max_sat.qpl +++ b/examples/hillclimb/steep_max_sat.qpl @@ -23,12 +23,15 @@ proc good(good_x : Arr<20, Fin<2>>, good_i : Fin<20>, good_w' : Fin<1000>) { loc call Phi(good_x', good_w'); } -uproc UMax(hillclimb_iter_x : Arr<20, Fin<2>>, hillclimb_iter_i_1 : Fin<1000>, aux : AUX Fin<1000>, aux_1 : AUX Fin<2>, aux_2 : AUX Fin<2>, aux_3 : AUX Arr<20, Fin<2>>, aux_4 : AUX Fin<1000>, aux_5 : AUX Fin<2>, aux_6 : AUX Fin<2>, aux_7 : AUX Arr<20, Fin<2>>, aux_8 : AUX Fin<1000>) { - // TODO: max-finding circuit +uproc UMax(hillclimb_iter_x : Arr<20, Fin<2>>, hillclimb_iter_i_1 : Fin<1000>, inp : AUX Arr<20, Fin<20>>, out : AUX Arr<20, Fin<1000>>, aux : AUX Arr<20, Fin<1000>>, aux_1 : AUX Arr<20, Fin<2>>, aux_2 : AUX Arr<20, Fin<2>>, aux_3 : AUX Arr<20, Arr<20, Fin<2>>>, aux_4 : AUX Arr<20, Fin<1000>>, aux_5 : AUX Arr<20, Fin<2>>, aux_6 : AUX Arr<20, Fin<2>>, aux_7 : AUX Arr<20, Arr<20, Fin<2>>>, aux_8 : AUX Arr<20, Fin<1000>>) { + for (#x in Fin<20>) { + call good_U(hillclimb_iter_x, inp[#x], out[#x], aux[#x], aux_1[#x], aux_2[#x], aux_3[#x], aux_4[#x], aux_5[#x], aux_6[#x], aux_7[#x], aux_8[#x]); + } + // unitarily compute: hillclimb_iter_i_1 := max(out); } -uproc hillclimb_iter_U(hillclimb_iter_x : IN Arr<20, Fin<2>>, hillclimb_iter_x' : OUT Arr<20, Fin<2>>, hillclimb_iter_i : AUX Fin<1000>, hillclimb_iter_b : AUX Fin<2>, hillclimb_iter_b' : AUX Fin<2>, hillclimb_iter_i_1 : AUX Fin<1000>, aux_prim : AUX Fin<1000>, aux_prim_1 : AUX Fin<2>, aux_prim_2 : AUX Fin<2>, aux_prim_3 : AUX Arr<20, Fin<2>>, aux_prim_4 : AUX Fin<1000>, aux_prim_5 : AUX Fin<2>, aux_prim_6 : AUX Fin<2>, aux_prim_7 : AUX Arr<20, Fin<2>>, aux_prim_8 : AUX Fin<1000>, hillclimb_iter_b_1 : AUX Fin<2>, hillclimb_iter_b'_1 : AUX Fin<2>, hillclimb_iter_x'_1 : AUX Arr<20, Fin<2>>) { - call UMax(hillclimb_iter_x, hillclimb_iter_i_1, aux_prim, aux_prim_1, aux_prim_2, aux_prim_3, aux_prim_4, aux_prim_5, aux_prim_6, aux_prim_7, aux_prim_8); +uproc hillclimb_iter_U(hillclimb_iter_x : IN Arr<20, Fin<2>>, hillclimb_iter_x' : OUT Arr<20, Fin<2>>, hillclimb_iter_i : AUX Fin<1000>, hillclimb_iter_b : AUX Fin<2>, hillclimb_iter_b' : AUX Fin<2>, hillclimb_iter_i_1 : AUX Fin<1000>, aux_prim : AUX Arr<20, Fin<20>>, aux_prim_1 : AUX Arr<20, Fin<1000>>, aux_prim_2 : AUX Arr<20, Fin<1000>>, aux_prim_3 : AUX Arr<20, Fin<2>>, aux_prim_4 : AUX Arr<20, Fin<2>>, aux_prim_5 : AUX Arr<20, Arr<20, Fin<2>>>, aux_prim_6 : AUX Arr<20, Fin<1000>>, aux_prim_7 : AUX Arr<20, Fin<2>>, aux_prim_8 : AUX Arr<20, Fin<2>>, aux_prim_9 : AUX Arr<20, Arr<20, Fin<2>>>, aux_prim_10 : AUX Arr<20, Fin<1000>>, hillclimb_iter_b_1 : AUX Fin<2>, hillclimb_iter_b'_1 : AUX Fin<2>, hillclimb_iter_x'_1 : AUX Arr<20, Fin<2>>) { + call UMax(hillclimb_iter_x, hillclimb_iter_i_1, aux_prim, aux_prim_1, aux_prim_2, aux_prim_3, aux_prim_4, aux_prim_5, aux_prim_6, aux_prim_7, aux_prim_8, aux_prim_9, aux_prim_10); hillclimb_iter_i, hillclimb_iter_i_1 *= SWAP; hillclimb_iter_i, hillclimb_iter_x, hillclimb_iter_b_1 *= Embed[(hillclimb_iter_i, hillclimb_iter_x) => hillclimb_iter_x[hillclimb_iter_i]]; hillclimb_iter_b, hillclimb_iter_b_1 *= SWAP; @@ -49,15 +52,15 @@ proc hillclimb_iter(hillclimb_iter_x : Arr<20, Fin<2>>, hillclimb_iter_x' : Arr< hillclimb_iter_x' := update hillclimb_iter_x[hillclimb_iter_i] = hillclimb_iter_b; } -uproc hillclimb_3_U(hillclimb_3_x_3 : OUT Arr<20, Fin<2>>, hillclimb_3_x_0 : AUX Arr<20, Fin<2>>, hillclimb_3_x_1 : AUX Arr<20, Fin<2>>, hillclimb_3_x_2 : AUX Arr<20, Fin<2>>, hillclimb_3_x_0_1 : AUX Arr<20, Fin<2>>, hillclimb_3_x_0_1_1 : AUX Arr<20, Fin<2>>, hillclimb_3_x_1_1 : AUX Arr<20, Fin<2>>, aux_18 : AUX Fin<1000>, aux_19 : AUX Fin<2>, aux_20 : AUX Fin<2>, aux_21 : AUX Fin<1000>, aux_22 : AUX Fin<1000>, aux_23 : AUX Fin<2>, aux_24 : AUX Fin<2>, aux_25 : AUX Arr<20, Fin<2>>, aux_26 : AUX Fin<1000>, aux_27 : AUX Fin<2>, aux_28 : AUX Fin<2>, aux_29 : AUX Arr<20, Fin<2>>, aux_30 : AUX Fin<1000>, aux_31 : AUX Fin<2>, aux_32 : AUX Fin<2>, aux_33 : AUX Arr<20, Fin<2>>, hillclimb_3_x_2_1 : AUX Arr<20, Fin<2>>, aux_34 : AUX Fin<1000>, aux_35 : AUX Fin<2>, aux_36 : AUX Fin<2>, aux_37 : AUX Fin<1000>, aux_38 : AUX Fin<1000>, aux_39 : AUX Fin<2>, aux_40 : AUX Fin<2>, aux_41 : AUX Arr<20, Fin<2>>, aux_42 : AUX Fin<1000>, aux_43 : AUX Fin<2>, aux_44 : AUX Fin<2>, aux_45 : AUX Arr<20, Fin<2>>, aux_46 : AUX Fin<1000>, aux_47 : AUX Fin<2>, aux_48 : AUX Fin<2>, aux_49 : AUX Arr<20, Fin<2>>, hillclimb_3_x_3_1 : AUX Arr<20, Fin<2>>, aux_50 : AUX Fin<1000>, aux_51 : AUX Fin<2>, aux_52 : AUX Fin<2>, aux_53 : AUX Fin<1000>, aux_54 : AUX Fin<1000>, aux_55 : AUX Fin<2>, aux_56 : AUX Fin<2>, aux_57 : AUX Arr<20, Fin<2>>, aux_58 : AUX Fin<1000>, aux_59 : AUX Fin<2>, aux_60 : AUX Fin<2>, aux_61 : AUX Arr<20, Fin<2>>, aux_62 : AUX Fin<1000>, aux_63 : AUX Fin<2>, aux_64 : AUX Fin<2>, aux_65 : AUX Arr<20, Fin<2>>) { +uproc hillclimb_3_U(hillclimb_3_x_3 : OUT Arr<20, Fin<2>>, hillclimb_3_x_0 : AUX Arr<20, Fin<2>>, hillclimb_3_x_1 : AUX Arr<20, Fin<2>>, hillclimb_3_x_2 : AUX Arr<20, Fin<2>>, hillclimb_3_x_0_1 : AUX Arr<20, Fin<2>>, hillclimb_3_x_0_1_1 : AUX Arr<20, Fin<2>>, hillclimb_3_x_1_1 : AUX Arr<20, Fin<2>>, aux_18 : AUX Fin<1000>, aux_19 : AUX Fin<2>, aux_20 : AUX Fin<2>, aux_21 : AUX Fin<1000>, aux_22 : AUX Arr<20, Fin<20>>, aux_23 : AUX Arr<20, Fin<1000>>, aux_24 : AUX Arr<20, Fin<1000>>, aux_25 : AUX Arr<20, Fin<2>>, aux_26 : AUX Arr<20, Fin<2>>, aux_27 : AUX Arr<20, Arr<20, Fin<2>>>, aux_28 : AUX Arr<20, Fin<1000>>, aux_29 : AUX Arr<20, Fin<2>>, aux_30 : AUX Arr<20, Fin<2>>, aux_31 : AUX Arr<20, Arr<20, Fin<2>>>, aux_32 : AUX Arr<20, Fin<1000>>, aux_33 : AUX Fin<2>, aux_34 : AUX Fin<2>, aux_35 : AUX Arr<20, Fin<2>>, hillclimb_3_x_2_1 : AUX Arr<20, Fin<2>>, aux_36 : AUX Fin<1000>, aux_37 : AUX Fin<2>, aux_38 : AUX Fin<2>, aux_39 : AUX Fin<1000>, aux_40 : AUX Arr<20, Fin<20>>, aux_41 : AUX Arr<20, Fin<1000>>, aux_42 : AUX Arr<20, Fin<1000>>, aux_43 : AUX Arr<20, Fin<2>>, aux_44 : AUX Arr<20, Fin<2>>, aux_45 : AUX Arr<20, Arr<20, Fin<2>>>, aux_46 : AUX Arr<20, Fin<1000>>, aux_47 : AUX Arr<20, Fin<2>>, aux_48 : AUX Arr<20, Fin<2>>, aux_49 : AUX Arr<20, Arr<20, Fin<2>>>, aux_50 : AUX Arr<20, Fin<1000>>, aux_51 : AUX Fin<2>, aux_52 : AUX Fin<2>, aux_53 : AUX Arr<20, Fin<2>>, hillclimb_3_x_3_1 : AUX Arr<20, Fin<2>>, aux_54 : AUX Fin<1000>, aux_55 : AUX Fin<2>, aux_56 : AUX Fin<2>, aux_57 : AUX Fin<1000>, aux_58 : AUX Arr<20, Fin<20>>, aux_59 : AUX Arr<20, Fin<1000>>, aux_60 : AUX Arr<20, Fin<1000>>, aux_61 : AUX Arr<20, Fin<2>>, aux_62 : AUX Arr<20, Fin<2>>, aux_63 : AUX Arr<20, Arr<20, Fin<2>>>, aux_64 : AUX Arr<20, Fin<1000>>, aux_65 : AUX Arr<20, Fin<2>>, aux_66 : AUX Arr<20, Fin<2>>, aux_67 : AUX Arr<20, Arr<20, Fin<2>>>, aux_68 : AUX Arr<20, Fin<1000>>, aux_69 : AUX Fin<2>, aux_70 : AUX Fin<2>, aux_71 : AUX Arr<20, Fin<2>>) { hillclimb_3_x_0_1 *= Distr[uniform : Arr<20, Fin<2>>]; hillclimb_3_x_0_1, hillclimb_3_x_0_1_1 *= COPY; hillclimb_3_x_0, hillclimb_3_x_0_1 *= SWAP; - call hillclimb_iter_U(hillclimb_3_x_0, hillclimb_3_x_1_1, aux_18, aux_19, aux_20, aux_21, aux_22, aux_23, aux_24, aux_25, aux_26, aux_27, aux_28, aux_29, aux_30, aux_31, aux_32, aux_33); + call hillclimb_iter_U(hillclimb_3_x_0, hillclimb_3_x_1_1, aux_18, aux_19, aux_20, aux_21, aux_22, aux_23, aux_24, aux_25, aux_26, aux_27, aux_28, aux_29, aux_30, aux_31, aux_32, aux_33, aux_34, aux_35); hillclimb_3_x_1, hillclimb_3_x_1_1 *= SWAP; - call hillclimb_iter_U(hillclimb_3_x_1, hillclimb_3_x_2_1, aux_34, aux_35, aux_36, aux_37, aux_38, aux_39, aux_40, aux_41, aux_42, aux_43, aux_44, aux_45, aux_46, aux_47, aux_48, aux_49); + call hillclimb_iter_U(hillclimb_3_x_1, hillclimb_3_x_2_1, aux_36, aux_37, aux_38, aux_39, aux_40, aux_41, aux_42, aux_43, aux_44, aux_45, aux_46, aux_47, aux_48, aux_49, aux_50, aux_51, aux_52, aux_53); hillclimb_3_x_2, hillclimb_3_x_2_1 *= SWAP; - call hillclimb_iter_U(hillclimb_3_x_2, hillclimb_3_x_3_1, aux_50, aux_51, aux_52, aux_53, aux_54, aux_55, aux_56, aux_57, aux_58, aux_59, aux_60, aux_61, aux_62, aux_63, aux_64, aux_65); + call hillclimb_iter_U(hillclimb_3_x_2, hillclimb_3_x_3_1, aux_54, aux_55, aux_56, aux_57, aux_58, aux_59, aux_60, aux_61, aux_62, aux_63, aux_64, aux_65, aux_66, aux_67, aux_68, aux_69, aux_70, aux_71); hillclimb_3_x_3, hillclimb_3_x_3_1 *= SWAP; } @@ -69,4 +72,4 @@ proc hillclimb_3(hillclimb_3_x_3 : Arr<20, Fin<2>>) { locals : (hillclimb_3_x_0 } -// qubits: 534 +// qubits: 5652 diff --git a/src/Traq/Primitives/Max/QMax.hs b/src/Traq/Primitives/Max/QMax.hs index d104491..efe9574 100644 --- a/src/Traq/Primitives/Max/QMax.hs +++ b/src/Traq/Primitives/Max/QMax.hs @@ -36,6 +36,7 @@ import qualified Traq.Compiler as Compiler import Traq.Prelude import Traq.Primitives.Class import qualified Traq.ProtoLang as P +import qualified Traq.Utils.Printing as PP -- ================================================================================ -- Primitive Class Implementation @@ -113,7 +114,7 @@ instance unitaryExprCosts _ _ = Alg.zero instance (P.TypingReqs size, Integral size, RealFloat prec, Show prec) => UnitaryCompilePrim (QMax size prec) size prec where - compileUPrim QMax{arg_ty} eps = do + compileUPrim QMax{arg_ty} _ = do -- Return variables and their types rets <- view $ to ret_vars ret_tys <- forM rets $ \x -> do @@ -128,12 +129,20 @@ instance (P.TypingReqs size, Integral size, RealFloat prec, Show prec) => Unitar proc_name <- Compiler.newIdent "UMax" Compiler.buildProc proc_name [] (zip rets ret_tys) $ do - -- Allocate ancillas for the function argument let _N = P.domainSize arg_ty + inp <- Compiler.allocLocalWithPrefix "inp" $ P.Arr _N arg_ty + oup <- mapM (Compiler.allocLocalWithPrefix "out" . P.Arr _N) ret_tys aux <- mapM (Compiler.allocLocal . P.Arr _N) fun_aux_tys - -- Body: TODO - Compiler.addUStmt $ CQPL.UCommentS "TODO: max-finding circuit" + i <- Compiler.newIdent "x" + Compiler.withUStmt (CQPL.UForInDomainS i arg_ty False) $ do + let inp_ix = CQPL.ArrElemArg (CQPL.Arg inp) (P.MetaName i) + let oup_ix = map ((`CQPL.ArrElemArg` P.MetaName i) . CQPL.Arg) oup + let aux_ix = map ((`CQPL.ArrElemArg` P.MetaName i) . CQPL.Arg) aux + + Compiler.addUStmt $ call_ufun (inp_ix : oup_ix ++ aux_ix) + + Compiler.addUStmt $ CQPL.UCommentS $ printf "unitarily compute: %s := max(%s);" (PP.commaList rets) (PP.commaList oup) -- ================================================================================ -- Quantum From e8eb831dfe02e3cc53a7708d4e597d46aa1ac5d5 Mon Sep 17 00:00:00 2001 From: Anurudh Peduri Date: Mon, 23 Feb 2026 14:21:27 +0000 Subject: [PATCH 14/28] wip --- .ghci | 4 +++- src/Traq/Primitives/Max/QMax.hs | 12 ++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/.ghci b/.ghci index aeb87a5..f9394bb 100644 --- a/.ghci +++ b/.ghci @@ -1,7 +1,7 @@ :set -DTEST -isrc -itest -:set -XNamedFieldPuns :set -XLambdaCase +:set -XNamedFieldPuns :set -XScopedTypeVariables :set -XApplicativeDo :set -XRankNTypes @@ -9,6 +9,8 @@ :set -XTypeFamilies :set -XTypeOperators :set -XMultiWayIf +:set -XEmptyCase +:set -XConstraintKinds :set -XFlexibleInstances :set -XFunctionalDependencies diff --git a/src/Traq/Primitives/Max/QMax.hs b/src/Traq/Primitives/Max/QMax.hs index efe9574..8601de1 100644 --- a/src/Traq/Primitives/Max/QMax.hs +++ b/src/Traq/Primitives/Max/QMax.hs @@ -20,7 +20,6 @@ module Traq.Primitives.Max.QMax ( import Control.Monad (forM, when) import Control.Monad.Except (throwError) -import Control.Monad.Trans (lift) import Text.Printf (printf) import Lens.Micro.GHC @@ -42,7 +41,7 @@ import qualified Traq.Utils.Printing as PP -- Primitive Class Implementation -- ================================================================================ -data QMax size prec = QMax {arg_ty :: P.VarType size} +newtype QMax size prec = QMax {arg_ty :: P.VarType size} deriving (Eq, Show, Read) type instance SizeType (QMax size prec) = size @@ -188,8 +187,8 @@ instance quantumExpExprCosts = Alg.zero -instance QuantumCompilePrim (QMax size prec) size prec where - compileQPrim QMax{} eps = do +instance (P.TypingReqs size, Integral size, RealFloat prec, Show prec) => QuantumCompilePrim (QMax size prec) size prec where + compileQPrim QMax{arg_ty} eps = do -- Return variables and their types rets <- view $ to ret_vars ret_tys <- forM rets $ \x -> do @@ -204,6 +203,11 @@ instance QuantumCompilePrim (QMax size prec) size prec where proc_name <- Compiler.newIdent "QMax" Compiler.buildProc proc_name [] (zip rets ret_tys) $ do + let _N = P.domainSize arg_ty + inp <- Compiler.allocLocalWithPrefix "inp" $ P.Arr _N arg_ty + oup <- mapM (Compiler.allocLocalWithPrefix "out" . P.Arr _N) ret_tys + aux <- mapM (Compiler.allocLocal . P.Arr _N) fun_aux_tys + -- Allocate ancillas for the function argument fun_aux <- mapM Compiler.allocLocal fun_aux_tys From 519b317abacfe21e173c0e2adbc6afec62f461d7 Mon Sep 17 00:00:00 2001 From: Anurudh Peduri Date: Mon, 23 Feb 2026 16:01:56 +0000 Subject: [PATCH 15/28] wip --- .ghci | 45 +++++++++++++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/.ghci b/.ghci index f9394bb..059b4bd 100644 --- a/.ghci +++ b/.ghci @@ -1,21 +1,38 @@ :set -DTEST -isrc -itest +:set -XAllowAmbiguousTypes +:set -XApplicativeDo +:set -XBangPatterns +:set -XConstraintKinds +:set -XCPP +:set -XDefaultSignatures +:set -XDeriveAnyClass +:set -XDeriveFoldable +:set -XDeriveFunctor +:set -XDeriveGeneric +:set -XDerivingStrategies +:set -XDuplicateRecordFields +:set -XEmptyCase +:set -XEmptyDataDeriving +:set -XExplicitForAll +:set -XFlexibleContexts +:set -XFlexibleInstances +:set -XFunctionalDependencies +:set -XGeneralisedNewtypeDeriving +:set -XGeneralizedNewtypeDeriving +:set -XImplicitParams +:set -XInstanceSigs :set -XLambdaCase +:set -XMultiParamTypeClasses +:set -XMultiWayIf :set -XNamedFieldPuns -:set -XScopedTypeVariables -:set -XApplicativeDo +:set -XNoRebindableSyntax :set -XRankNTypes -:set -XFlexibleContexts -:set -XTypeFamilies -:set -XTypeOperators -:set -XMultiWayIf -:set -XEmptyCase -:set -XConstraintKinds - -:set -XFlexibleInstances -:set -XFunctionalDependencies -:set -XMultiParamTypeClasses -:set -XUndecidableInstances +:set -XRecordWildCards +:set -XScopedTypeVariables +:set -XStandaloneDeriving :set -XTupleSections :set -XTypeApplications -:set -XRecordWildCards +:set -XTypeFamilies +:set -XTypeOperators +:set -XUndecidableInstances From d7c2841985246140508d58c1fd594217e47178c0 Mon Sep 17 00:00:00 2001 From: Anurudh Peduri Date: Mon, 23 Feb 2026 16:48:29 +0000 Subject: [PATCH 16/28] wip --- src/Traq/Compiler/Prelude.hs | 3 ++- src/Traq/Primitives/Amplify/QAmplify.hs | 6 ++---- src/Traq/Primitives/Max/QMax.hs | 11 ++++------- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/Traq/Compiler/Prelude.hs b/src/Traq/Compiler/Prelude.hs index 79a7fac..23fb24e 100644 --- a/src/Traq/Compiler/Prelude.hs +++ b/src/Traq/Compiler/Prelude.hs @@ -252,7 +252,8 @@ buildProc :: [(Ident, P.VarType size)] -> m' () -> m (CQPL.ProcDef size) -buildProc proc_name proc_meta_params params m = do +buildProc proc_name_basic proc_meta_params params m = do + proc_name <- newIdent proc_name_basic ((), (local_vars, ubody, cbody)) <- runWriterT $ withSandboxOf P._typingCtx m case (ubody, cbody) of diff --git a/src/Traq/Primitives/Amplify/QAmplify.hs b/src/Traq/Primitives/Amplify/QAmplify.hs index 0468c8b..f0f3323 100644 --- a/src/Traq/Primitives/Amplify/QAmplify.hs +++ b/src/Traq/Primitives/Amplify/QAmplify.hs @@ -203,7 +203,6 @@ mkGroverK :: ) => m (CQPL.ProcDef size) mkGroverK = do - proc_name <- Compiler.newIdent "Grover" meta_k <- Compiler.newIdent "k" rets <- view $ to ret_vars @@ -211,7 +210,7 @@ mkGroverK = do ret_tys <- forM rets $ \x -> use (P._typingCtx . Ctx.at x) >>= maybeWithError "missing variable" - Compiler.buildProc proc_name [meta_k] (zip rets ret_tys) $ do + Compiler.buildProc "Grover" [meta_k] (zip rets ret_tys) $ do (SamplerFn mk_sampler_call) <- view $ to mk_ucall (SamplerFn aux_tys) <- view $ to uproc_aux_types aux_vars <- mapM Compiler.allocLocal aux_tys @@ -333,6 +332,5 @@ instance (RealFloat prec) => QuantumCompilePrim (QAmplify SizeT prec) SizeT prec ret_tys <- forM rets $ \x -> use (P._typingCtx . Ctx.at x) >>= maybeWithError "missing variable" - proc_name <- Compiler.newIdent "QAmplify" - Compiler.buildProc proc_name [] (zip rets ret_tys) $ do + Compiler.buildProc "QAmplify" [] (zip rets ret_tys) $ do buildQAmplify 0 rets ret_tys eps p_min diff --git a/src/Traq/Primitives/Max/QMax.hs b/src/Traq/Primitives/Max/QMax.hs index 8601de1..eb1c883 100644 --- a/src/Traq/Primitives/Max/QMax.hs +++ b/src/Traq/Primitives/Max/QMax.hs @@ -124,10 +124,7 @@ instance (P.TypingReqs size, Integral size, RealFloat prec, Show prec) => Unitar QMaxFunArg call_ufun <- view $ to mk_ucall QMaxFunArg fun_aux_tys <- view $ to uproc_aux_types - -- Procedure name - proc_name <- Compiler.newIdent "UMax" - - Compiler.buildProc proc_name [] (zip rets ret_tys) $ do + Compiler.buildProc "UMax" [] (zip rets ret_tys) $ do let _N = P.domainSize arg_ty inp <- Compiler.allocLocalWithPrefix "inp" $ P.Arr _N arg_ty oup <- mapM (Compiler.allocLocalWithPrefix "out" . P.Arr _N) ret_tys @@ -196,13 +193,13 @@ instance (P.TypingReqs size, Integral size, RealFloat prec, Show prec) => Quantu maybeWithError "" mty -- Function argument: unitary call builder and aux types + -- f :: arg_ty -> ret_tys QMaxFunArg call_ufun <- view $ to mk_ucall QMaxFunArg fun_aux_tys <- view $ to uproc_aux_types - -- Procedure name - proc_name <- Compiler.newIdent "QMax" + -- Build cmp :: (arg_ty, arg_ty) -> Bool - Compiler.buildProc proc_name [] (zip rets ret_tys) $ do + Compiler.buildProc "QMax" [] (zip rets ret_tys) $ do let _N = P.domainSize arg_ty inp <- Compiler.allocLocalWithPrefix "inp" $ P.Arr _N arg_ty oup <- mapM (Compiler.allocLocalWithPrefix "out" . P.Arr _N) ret_tys From 37cc667c6d512882e71dc4c3965381d76eb7c11e Mon Sep 17 00:00:00 2001 From: Anurudh Peduri Date: Mon, 23 Feb 2026 16:49:07 +0000 Subject: [PATCH 17/28] compile --- examples/hillclimb/steep_max_sat.qpl | 10 +++++----- test/Traq/Examples/SteepMaxKSatSpec.hs | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/hillclimb/steep_max_sat.qpl b/examples/hillclimb/steep_max_sat.qpl index 78ba5b0..95a662e 100644 --- a/examples/hillclimb/steep_max_sat.qpl +++ b/examples/hillclimb/steep_max_sat.qpl @@ -41,7 +41,7 @@ uproc hillclimb_iter_U(hillclimb_iter_x : IN Arr<20, Fin<2>>, hillclimb_iter_x' hillclimb_iter_x', hillclimb_iter_x'_1 *= SWAP; } -proc QMax(hillclimb_iter_x : Arr<20, Fin<2>>, hillclimb_iter_i : Fin<1000>) { locals : (aux_9 : Fin<1000>, aux_10 : Fin<2>, aux_11 : Fin<2>, aux_12 : Arr<20, Fin<2>>, aux_13 : Fin<1000>, aux_14 : Fin<2>, aux_15 : Fin<2>, aux_16 : Arr<20, Fin<2>>, aux_17 : Fin<1000>) } { +proc QMax(hillclimb_iter_x : Arr<20, Fin<2>>, hillclimb_iter_i : Fin<1000>) { locals : (inp_1 : Arr<20, Fin<20>>, out_1 : Arr<20, Fin<1000>>, aux_9 : Arr<20, Fin<1000>>, aux_10 : Arr<20, Fin<2>>, aux_11 : Arr<20, Fin<2>>, aux_12 : Arr<20, Arr<20, Fin<2>>>, aux_13 : Arr<20, Fin<1000>>, aux_14 : Arr<20, Fin<2>>, aux_15 : Arr<20, Fin<2>>, aux_16 : Arr<20, Arr<20, Fin<2>>>, aux_17 : Arr<20, Fin<1000>>, aux_18 : Fin<1000>, aux_19 : Fin<2>, aux_20 : Fin<2>, aux_21 : Arr<20, Fin<2>>, aux_22 : Fin<1000>, aux_23 : Fin<2>, aux_24 : Fin<2>, aux_25 : Arr<20, Fin<2>>, aux_26 : Fin<1000>) } { // TODO: max-finding circuit } @@ -52,15 +52,15 @@ proc hillclimb_iter(hillclimb_iter_x : Arr<20, Fin<2>>, hillclimb_iter_x' : Arr< hillclimb_iter_x' := update hillclimb_iter_x[hillclimb_iter_i] = hillclimb_iter_b; } -uproc hillclimb_3_U(hillclimb_3_x_3 : OUT Arr<20, Fin<2>>, hillclimb_3_x_0 : AUX Arr<20, Fin<2>>, hillclimb_3_x_1 : AUX Arr<20, Fin<2>>, hillclimb_3_x_2 : AUX Arr<20, Fin<2>>, hillclimb_3_x_0_1 : AUX Arr<20, Fin<2>>, hillclimb_3_x_0_1_1 : AUX Arr<20, Fin<2>>, hillclimb_3_x_1_1 : AUX Arr<20, Fin<2>>, aux_18 : AUX Fin<1000>, aux_19 : AUX Fin<2>, aux_20 : AUX Fin<2>, aux_21 : AUX Fin<1000>, aux_22 : AUX Arr<20, Fin<20>>, aux_23 : AUX Arr<20, Fin<1000>>, aux_24 : AUX Arr<20, Fin<1000>>, aux_25 : AUX Arr<20, Fin<2>>, aux_26 : AUX Arr<20, Fin<2>>, aux_27 : AUX Arr<20, Arr<20, Fin<2>>>, aux_28 : AUX Arr<20, Fin<1000>>, aux_29 : AUX Arr<20, Fin<2>>, aux_30 : AUX Arr<20, Fin<2>>, aux_31 : AUX Arr<20, Arr<20, Fin<2>>>, aux_32 : AUX Arr<20, Fin<1000>>, aux_33 : AUX Fin<2>, aux_34 : AUX Fin<2>, aux_35 : AUX Arr<20, Fin<2>>, hillclimb_3_x_2_1 : AUX Arr<20, Fin<2>>, aux_36 : AUX Fin<1000>, aux_37 : AUX Fin<2>, aux_38 : AUX Fin<2>, aux_39 : AUX Fin<1000>, aux_40 : AUX Arr<20, Fin<20>>, aux_41 : AUX Arr<20, Fin<1000>>, aux_42 : AUX Arr<20, Fin<1000>>, aux_43 : AUX Arr<20, Fin<2>>, aux_44 : AUX Arr<20, Fin<2>>, aux_45 : AUX Arr<20, Arr<20, Fin<2>>>, aux_46 : AUX Arr<20, Fin<1000>>, aux_47 : AUX Arr<20, Fin<2>>, aux_48 : AUX Arr<20, Fin<2>>, aux_49 : AUX Arr<20, Arr<20, Fin<2>>>, aux_50 : AUX Arr<20, Fin<1000>>, aux_51 : AUX Fin<2>, aux_52 : AUX Fin<2>, aux_53 : AUX Arr<20, Fin<2>>, hillclimb_3_x_3_1 : AUX Arr<20, Fin<2>>, aux_54 : AUX Fin<1000>, aux_55 : AUX Fin<2>, aux_56 : AUX Fin<2>, aux_57 : AUX Fin<1000>, aux_58 : AUX Arr<20, Fin<20>>, aux_59 : AUX Arr<20, Fin<1000>>, aux_60 : AUX Arr<20, Fin<1000>>, aux_61 : AUX Arr<20, Fin<2>>, aux_62 : AUX Arr<20, Fin<2>>, aux_63 : AUX Arr<20, Arr<20, Fin<2>>>, aux_64 : AUX Arr<20, Fin<1000>>, aux_65 : AUX Arr<20, Fin<2>>, aux_66 : AUX Arr<20, Fin<2>>, aux_67 : AUX Arr<20, Arr<20, Fin<2>>>, aux_68 : AUX Arr<20, Fin<1000>>, aux_69 : AUX Fin<2>, aux_70 : AUX Fin<2>, aux_71 : AUX Arr<20, Fin<2>>) { +uproc hillclimb_3_U(hillclimb_3_x_3 : OUT Arr<20, Fin<2>>, hillclimb_3_x_0 : AUX Arr<20, Fin<2>>, hillclimb_3_x_1 : AUX Arr<20, Fin<2>>, hillclimb_3_x_2 : AUX Arr<20, Fin<2>>, hillclimb_3_x_0_1 : AUX Arr<20, Fin<2>>, hillclimb_3_x_0_1_1 : AUX Arr<20, Fin<2>>, hillclimb_3_x_1_1 : AUX Arr<20, Fin<2>>, aux_27 : AUX Fin<1000>, aux_28 : AUX Fin<2>, aux_29 : AUX Fin<2>, aux_30 : AUX Fin<1000>, aux_31 : AUX Arr<20, Fin<20>>, aux_32 : AUX Arr<20, Fin<1000>>, aux_33 : AUX Arr<20, Fin<1000>>, aux_34 : AUX Arr<20, Fin<2>>, aux_35 : AUX Arr<20, Fin<2>>, aux_36 : AUX Arr<20, Arr<20, Fin<2>>>, aux_37 : AUX Arr<20, Fin<1000>>, aux_38 : AUX Arr<20, Fin<2>>, aux_39 : AUX Arr<20, Fin<2>>, aux_40 : AUX Arr<20, Arr<20, Fin<2>>>, aux_41 : AUX Arr<20, Fin<1000>>, aux_42 : AUX Fin<2>, aux_43 : AUX Fin<2>, aux_44 : AUX Arr<20, Fin<2>>, hillclimb_3_x_2_1 : AUX Arr<20, Fin<2>>, aux_45 : AUX Fin<1000>, aux_46 : AUX Fin<2>, aux_47 : AUX Fin<2>, aux_48 : AUX Fin<1000>, aux_49 : AUX Arr<20, Fin<20>>, aux_50 : AUX Arr<20, Fin<1000>>, aux_51 : AUX Arr<20, Fin<1000>>, aux_52 : AUX Arr<20, Fin<2>>, aux_53 : AUX Arr<20, Fin<2>>, aux_54 : AUX Arr<20, Arr<20, Fin<2>>>, aux_55 : AUX Arr<20, Fin<1000>>, aux_56 : AUX Arr<20, Fin<2>>, aux_57 : AUX Arr<20, Fin<2>>, aux_58 : AUX Arr<20, Arr<20, Fin<2>>>, aux_59 : AUX Arr<20, Fin<1000>>, aux_60 : AUX Fin<2>, aux_61 : AUX Fin<2>, aux_62 : AUX Arr<20, Fin<2>>, hillclimb_3_x_3_1 : AUX Arr<20, Fin<2>>, aux_63 : AUX Fin<1000>, aux_64 : AUX Fin<2>, aux_65 : AUX Fin<2>, aux_66 : AUX Fin<1000>, aux_67 : AUX Arr<20, Fin<20>>, aux_68 : AUX Arr<20, Fin<1000>>, aux_69 : AUX Arr<20, Fin<1000>>, aux_70 : AUX Arr<20, Fin<2>>, aux_71 : AUX Arr<20, Fin<2>>, aux_72 : AUX Arr<20, Arr<20, Fin<2>>>, aux_73 : AUX Arr<20, Fin<1000>>, aux_74 : AUX Arr<20, Fin<2>>, aux_75 : AUX Arr<20, Fin<2>>, aux_76 : AUX Arr<20, Arr<20, Fin<2>>>, aux_77 : AUX Arr<20, Fin<1000>>, aux_78 : AUX Fin<2>, aux_79 : AUX Fin<2>, aux_80 : AUX Arr<20, Fin<2>>) { hillclimb_3_x_0_1 *= Distr[uniform : Arr<20, Fin<2>>]; hillclimb_3_x_0_1, hillclimb_3_x_0_1_1 *= COPY; hillclimb_3_x_0, hillclimb_3_x_0_1 *= SWAP; - call hillclimb_iter_U(hillclimb_3_x_0, hillclimb_3_x_1_1, aux_18, aux_19, aux_20, aux_21, aux_22, aux_23, aux_24, aux_25, aux_26, aux_27, aux_28, aux_29, aux_30, aux_31, aux_32, aux_33, aux_34, aux_35); + call hillclimb_iter_U(hillclimb_3_x_0, hillclimb_3_x_1_1, aux_27, aux_28, aux_29, aux_30, aux_31, aux_32, aux_33, aux_34, aux_35, aux_36, aux_37, aux_38, aux_39, aux_40, aux_41, aux_42, aux_43, aux_44); hillclimb_3_x_1, hillclimb_3_x_1_1 *= SWAP; - call hillclimb_iter_U(hillclimb_3_x_1, hillclimb_3_x_2_1, aux_36, aux_37, aux_38, aux_39, aux_40, aux_41, aux_42, aux_43, aux_44, aux_45, aux_46, aux_47, aux_48, aux_49, aux_50, aux_51, aux_52, aux_53); + call hillclimb_iter_U(hillclimb_3_x_1, hillclimb_3_x_2_1, aux_45, aux_46, aux_47, aux_48, aux_49, aux_50, aux_51, aux_52, aux_53, aux_54, aux_55, aux_56, aux_57, aux_58, aux_59, aux_60, aux_61, aux_62); hillclimb_3_x_2, hillclimb_3_x_2_1 *= SWAP; - call hillclimb_iter_U(hillclimb_3_x_2, hillclimb_3_x_3_1, aux_54, aux_55, aux_56, aux_57, aux_58, aux_59, aux_60, aux_61, aux_62, aux_63, aux_64, aux_65, aux_66, aux_67, aux_68, aux_69, aux_70, aux_71); + call hillclimb_iter_U(hillclimb_3_x_2, hillclimb_3_x_3_1, aux_63, aux_64, aux_65, aux_66, aux_67, aux_68, aux_69, aux_70, aux_71, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80); hillclimb_3_x_3, hillclimb_3_x_3_1 *= SWAP; } diff --git a/test/Traq/Examples/SteepMaxKSatSpec.hs b/test/Traq/Examples/SteepMaxKSatSpec.hs index 45175d1..4899b11 100644 --- a/test/Traq/Examples/SteepMaxKSatSpec.hs +++ b/test/Traq/Examples/SteepMaxKSatSpec.hs @@ -44,7 +44,7 @@ spec = describe "Steep max-k-sat" $ do ex <- loadExample assertRight $ P.typeCheckProg ex - fdescribe "Compile" $ do + describe "Compile" $ do let eps = A.failProb (0.0001 :: Double) it "lowers" $ do From f55897aa122375b929b77633dccda7d38c93f157 Mon Sep 17 00:00:00 2001 From: Anurudh Peduri Date: Mon, 23 Feb 2026 16:55:40 +0000 Subject: [PATCH 18/28] fix --- src/Traq/Compiler/Prelude.hs | 26 ++++++++++++++++++------- src/Traq/Primitives/Amplify/QAmplify.hs | 2 +- src/Traq/Primitives/Max/QMax.hs | 2 +- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/Traq/Compiler/Prelude.hs b/src/Traq/Compiler/Prelude.hs index 23fb24e..8639fc9 100644 --- a/src/Traq/Compiler/Prelude.hs +++ b/src/Traq/Compiler/Prelude.hs @@ -25,6 +25,7 @@ module Traq.Compiler.Prelude ( withUStmt, addStmt, withStmt, + buildUProc, buildProc, -- ** State @@ -245,20 +246,20 @@ withStmt f = censor (_3 %~ f') where f' ss = [f (CQPL.SeqS ss)] -buildProc :: +buildProcHelper :: (IsProcBuilder m' size m) => + Bool -> Ident -> [Ident] -> [(Ident, P.VarType size)] -> m' () -> m (CQPL.ProcDef size) -buildProc proc_name_basic proc_meta_params params m = do +buildProcHelper is_uproc proc_name_basic proc_meta_params params m = do proc_name <- newIdent proc_name_basic ((), (local_vars, ubody, cbody)) <- runWriterT $ withSandboxOf P._typingCtx m - case (ubody, cbody) of - ([], []) -> throwError "buildProc: no body statements!" - ([], _) -> + case (ubody, cbody, is_uproc) of + ([], _, False) -> pure $ CQPL.ProcDef { info_comment = "" @@ -273,7 +274,7 @@ buildProc proc_name_basic proc_meta_params params m = do , cproc_body_stmt = CQPL.SeqS cbody } } - (_, []) -> + (_, [], True) -> pure $ CQPL.ProcDef { info_comment = "" @@ -288,4 +289,15 @@ buildProc proc_name_basic proc_meta_params params m = do , uproc_body_stmt = CQPL.USeqS ubody } } - _ -> throwError "buildProc: contains both ustmt and stmt" + _ -> throwError "buildProc: invalid body statements" + +buildUProc + , buildProc :: + (IsProcBuilder m' size m) => + Ident -> + [Ident] -> + [(Ident, P.VarType size)] -> + m' () -> + m (CQPL.ProcDef size) +buildUProc = buildProcHelper True +buildProc = buildProcHelper False diff --git a/src/Traq/Primitives/Amplify/QAmplify.hs b/src/Traq/Primitives/Amplify/QAmplify.hs index f0f3323..25286f3 100644 --- a/src/Traq/Primitives/Amplify/QAmplify.hs +++ b/src/Traq/Primitives/Amplify/QAmplify.hs @@ -210,7 +210,7 @@ mkGroverK = do ret_tys <- forM rets $ \x -> use (P._typingCtx . Ctx.at x) >>= maybeWithError "missing variable" - Compiler.buildProc "Grover" [meta_k] (zip rets ret_tys) $ do + Compiler.buildUProc "Grover" [meta_k] (zip rets ret_tys) $ do (SamplerFn mk_sampler_call) <- view $ to mk_ucall (SamplerFn aux_tys) <- view $ to uproc_aux_types aux_vars <- mapM Compiler.allocLocal aux_tys diff --git a/src/Traq/Primitives/Max/QMax.hs b/src/Traq/Primitives/Max/QMax.hs index eb1c883..95ddd04 100644 --- a/src/Traq/Primitives/Max/QMax.hs +++ b/src/Traq/Primitives/Max/QMax.hs @@ -124,7 +124,7 @@ instance (P.TypingReqs size, Integral size, RealFloat prec, Show prec) => Unitar QMaxFunArg call_ufun <- view $ to mk_ucall QMaxFunArg fun_aux_tys <- view $ to uproc_aux_types - Compiler.buildProc "UMax" [] (zip rets ret_tys) $ do + Compiler.buildUProc "UMax" [] (zip rets ret_tys) $ do let _N = P.domainSize arg_ty inp <- Compiler.allocLocalWithPrefix "inp" $ P.Arr _N arg_ty oup <- mapM (Compiler.allocLocalWithPrefix "out" . P.Arr _N) ret_tys From 6a533dbc73f7515e6334dc55cc4ad245605d9333 Mon Sep 17 00:00:00 2001 From: Anurudh Peduri Date: Mon, 23 Feb 2026 17:31:28 +0000 Subject: [PATCH 19/28] recompile --- examples/cryptanalysis/grover_meets_simon.qpl | 2 +- examples/hillclimb/max_sat_hillclimb.qpl | 2 +- examples/hillclimb/steep_max_sat.qpl | 9 ++++- .../matrix_search/depth3_NAND_formula.qpl | 6 +-- examples/matrix_search/matrix_search.qpl | 4 +- src/Traq/Primitives/Max/QMax.hs | 38 +++++++++++++------ src/Traq/ProtoLang/Syntax.hs | 4 +- src/Traq/ProtoLang/TypeCheck.hs | 2 + 8 files changed, 47 insertions(+), 20 deletions(-) diff --git a/examples/cryptanalysis/grover_meets_simon.qpl b/examples/cryptanalysis/grover_meets_simon.qpl index fab4c3f..5e97849 100644 --- a/examples/cryptanalysis/grover_meets_simon.qpl +++ b/examples/cryptanalysis/grover_meets_simon.qpl @@ -93,7 +93,7 @@ uproc USearch(outerAttack_ok_1 : OUT Fin<2>, outerAttack_k0_1 : OUT BitVec<20>, call-adj innerAttack_U(s_arg[#run_ix], aux_37, aux_10, aux_11, aux_12, aux_13, aux_14, aux_15, aux_16, aux_17, aux_18, aux_19, aux_20, aux_21, aux_22, aux_23, aux_24, aux_25, aux_26, aux_27, aux_28, aux_29, aux_30, aux_31, aux_32, aux_33, aux_34, aux_35, aux_36); ctrl[#run_ix] *= X; } - pred_out, outerAttack_ok_1 *= Embed[(a) => or a]; + pred_out, outerAttack_ok_1 *= Embed[(a) => multi_or a]; s_arg, pred_out, outerAttack_k0_1 *= Embed[(a, f) => (a selectOn f)]; } diff --git a/examples/hillclimb/max_sat_hillclimb.qpl b/examples/hillclimb/max_sat_hillclimb.qpl index 40f15f8..c714eaf 100644 --- a/examples/hillclimb/max_sat_hillclimb.qpl +++ b/examples/hillclimb/max_sat_hillclimb.qpl @@ -52,7 +52,7 @@ uproc USearch(hillclimb_iter_x : Arr<20, Fin<2>>, hillclimb_iter_ok_1 : OUT Fin< call-adj good_U(hillclimb_iter_x, s_arg[#run_ix], aux_11, aux, aux_1, aux_2, aux_3, aux_4, aux_5, aux_6, aux_7, aux_8, aux_9, aux_10); ctrl[#run_ix] *= X; } - pred_out, hillclimb_iter_ok_1 *= Embed[(a) => or a]; + pred_out, hillclimb_iter_ok_1 *= Embed[(a) => multi_or a]; s_arg, pred_out, hillclimb_iter_i_1 *= Embed[(a, f) => (a selectOn f)]; } diff --git a/examples/hillclimb/steep_max_sat.qpl b/examples/hillclimb/steep_max_sat.qpl index 95a662e..5aa1803 100644 --- a/examples/hillclimb/steep_max_sat.qpl +++ b/examples/hillclimb/steep_max_sat.qpl @@ -41,7 +41,14 @@ uproc hillclimb_iter_U(hillclimb_iter_x : IN Arr<20, Fin<2>>, hillclimb_iter_x' hillclimb_iter_x', hillclimb_iter_x'_1 *= SWAP; } -proc QMax(hillclimb_iter_x : Arr<20, Fin<2>>, hillclimb_iter_i : Fin<1000>) { locals : (inp_1 : Arr<20, Fin<20>>, out_1 : Arr<20, Fin<1000>>, aux_9 : Arr<20, Fin<1000>>, aux_10 : Arr<20, Fin<2>>, aux_11 : Arr<20, Fin<2>>, aux_12 : Arr<20, Arr<20, Fin<2>>>, aux_13 : Arr<20, Fin<1000>>, aux_14 : Arr<20, Fin<2>>, aux_15 : Arr<20, Fin<2>>, aux_16 : Arr<20, Arr<20, Fin<2>>>, aux_17 : Arr<20, Fin<1000>>, aux_18 : Fin<1000>, aux_19 : Fin<2>, aux_20 : Fin<2>, aux_21 : Arr<20, Fin<2>>, aux_22 : Fin<1000>, aux_23 : Fin<2>, aux_24 : Fin<2>, aux_25 : Arr<20, Fin<2>>, aux_26 : Fin<1000>) } { +uproc Compare(hillclimb_iter_x : Arr<20, Fin<2>>, x_1 : Fin<20>, x_2 : Fin<20>, b : Fin<2>, out_1 : AUX Fin<1000>, aux_9 : AUX Fin<1000>, aux_10 : AUX Fin<2>, aux_11 : AUX Fin<2>, aux_12 : AUX Arr<20, Fin<2>>, aux_13 : AUX Fin<1000>, aux_14 : AUX Fin<2>, aux_15 : AUX Fin<2>, aux_16 : AUX Arr<20, Fin<2>>, aux_17 : AUX Fin<1000>, out_2 : AUX Fin<1000>, aux_18 : AUX Fin<1000>, aux_19 : AUX Fin<2>, aux_20 : AUX Fin<2>, aux_21 : AUX Arr<20, Fin<2>>, aux_22 : AUX Fin<1000>, aux_23 : AUX Fin<2>, aux_24 : AUX Fin<2>, aux_25 : AUX Arr<20, Fin<2>>, aux_26 : AUX Fin<1000>, lt : AUX Arr<1, Fin<2>>) { + call good_U(hillclimb_iter_x, x_1, out_1, aux_9, aux_10, aux_11, aux_12, aux_13, aux_14, aux_15, aux_16, aux_17); + call good_U(hillclimb_iter_x, x_2, out_2, aux_18, aux_19, aux_20, aux_21, aux_22, aux_23, aux_24, aux_25, aux_26); + out_1, out_2, lt[0] *= Embed[(a, b) => (a < b)]; + lt, b *= Embed[(a) => multi_and a]; +} + +proc QMax(hillclimb_iter_x : Arr<20, Fin<2>>, hillclimb_iter_i : Fin<1000>) { locals : () } { // TODO: max-finding circuit } diff --git a/examples/matrix_search/depth3_NAND_formula.qpl b/examples/matrix_search/depth3_NAND_formula.qpl index a1776a9..b06cefb 100644 --- a/examples/matrix_search/depth3_NAND_formula.qpl +++ b/examples/matrix_search/depth3_NAND_formula.qpl @@ -40,7 +40,7 @@ uproc UAny(i1 : Fin<20>, j1 : Fin<10>, or_1_1 : OUT Fin<2>, s_result : OUT Fin<1 call-adj NOR_0_U(i1, j1, s_arg[#run_ix], aux_3, aux, aux_1, aux_2); ctrl[#run_ix] *= X; } - pred_out, or_1_1 *= Embed[(a) => or a]; + pred_out, or_1_1 *= Embed[(a) => multi_or a]; s_arg, pred_out, s_result *= Embed[(a, f) => (a selectOn f)]; } @@ -116,7 +116,7 @@ uproc UAny_1(i2 : Fin<20>, or_2_1 : OUT Fin<2>, s_result_2 : OUT Fin<10>, aux_7 call-adj NOR_1_U(i2, s_arg_1[#run_ix], aux_28, aux_7, aux_8, aux_9, aux_10, aux_11, aux_12, aux_13, aux_14, aux_15, aux_16, aux_17, aux_18, aux_19, aux_20, aux_21, aux_22, aux_23, aux_24, aux_25, aux_26, aux_27); ctrl_1[#run_ix] *= X; } - pred_out_1, or_2_1 *= Embed[(a) => or a]; + pred_out_1, or_2_1 *= Embed[(a) => multi_or a]; s_arg_1, pred_out_1, s_result_2 *= Embed[(a, f) => (a selectOn f)]; } @@ -192,7 +192,7 @@ uproc UAny_2(or_3_1 : OUT Fin<2>, s_result_4 : OUT Fin<20>, aux_50 : AUX Fin<2>, call-adj NOR_2_U(s_arg_2[#run_ix], aux_107, aux_50, aux_51, aux_52, aux_53, aux_54, aux_55, aux_56, aux_57, aux_58, aux_59, aux_60, aux_61, aux_62, aux_63, aux_64, aux_65, aux_66, aux_67, aux_68, aux_69, aux_70, aux_71, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106); ctrl_2[#run_ix] *= X; } - pred_out_2, or_3_1 *= Embed[(a) => or a]; + pred_out_2, or_3_1 *= Embed[(a) => multi_or a]; s_arg_2, pred_out_2, s_result_4 *= Embed[(a, f) => (a selectOn f)]; } diff --git a/examples/matrix_search/matrix_search.qpl b/examples/matrix_search/matrix_search.qpl index 732db9b..7c2170b 100644 --- a/examples/matrix_search/matrix_search.qpl +++ b/examples/matrix_search/matrix_search.qpl @@ -40,7 +40,7 @@ uproc UAny(i : Fin<20>, hasZero_1 : OUT Fin<2>, s_result : OUT Fin<10>, aux : AU call-adj IsEntryZero_U(i, s_arg[#run_ix], aux_3, aux, aux_1, aux_2); ctrl[#run_ix] *= X; } - pred_out, hasZero_1 *= Embed[(a) => or a]; + pred_out, hasZero_1 *= Embed[(a) => multi_or a]; s_arg, pred_out, s_result *= Embed[(a, f) => (a selectOn f)]; } @@ -116,7 +116,7 @@ uproc UAny_1(ok_1 : OUT Fin<2>, s_result_2 : OUT Fin<20>, aux_7 : AUX Fin<2>, au call-adj IsRowAllOnes_U(s_arg_1[#run_ix], aux_28, aux_7, aux_8, aux_9, aux_10, aux_11, aux_12, aux_13, aux_14, aux_15, aux_16, aux_17, aux_18, aux_19, aux_20, aux_21, aux_22, aux_23, aux_24, aux_25, aux_26, aux_27); ctrl_1[#run_ix] *= X; } - pred_out_1, ok_1 *= Embed[(a) => or a]; + pred_out_1, ok_1 *= Embed[(a) => multi_or a]; s_arg_1, pred_out_1, s_result_2 *= Embed[(a, f) => (a selectOn f)]; } diff --git a/src/Traq/Primitives/Max/QMax.hs b/src/Traq/Primitives/Max/QMax.hs index 95ddd04..f284af0 100644 --- a/src/Traq/Primitives/Max/QMax.hs +++ b/src/Traq/Primitives/Max/QMax.hs @@ -18,7 +18,7 @@ module Traq.Primitives.Max.QMax ( _WQMax, ) where -import Control.Monad (forM, when) +import Control.Monad (forM, forM_, when) import Control.Monad.Except (throwError) import Text.Printf (printf) @@ -198,15 +198,31 @@ instance (P.TypingReqs size, Integral size, RealFloat prec, Show prec) => Quantu QMaxFunArg fun_aux_tys <- view $ to uproc_aux_types -- Build cmp :: (arg_ty, arg_ty) -> Bool - + x <- Compiler.newIdent "x" + y <- Compiler.newIdent "x" + b <- Compiler.newIdent "b" + cmp <- Compiler.buildUProc "Compare" [] [(x, arg_ty), (y, arg_ty), (b, P.tbool)] $ do + (outs_x, outs_y) <- forOf each (x, y) $ \i -> do + out <- mapM (Compiler.allocLocalWithPrefix "out") ret_tys + aux <- mapM Compiler.allocLocal fun_aux_tys + Compiler.addUStmt $ call_ufun $ map CQPL.Arg (i : out ++ aux) + return out + + lt <- Compiler.allocLocalWithPrefix "lt" (P.Arr (fromIntegral $ length outs_x) P.tbool) + + forM_ (zip3 [0 ..] outs_x outs_y) $ \(i, out_x, out_y) -> do + Compiler.addUStmt $ + CQPL.UnitaryS [CQPL.Arg out_x, CQPL.Arg out_y, CQPL.ArrElemArg (CQPL.Arg lt) (P.MetaSize i)] $ + CQPL.RevEmbedU ["a", "b"] $ + P.BinOpE P.LtOp (P.VarE "a") (P.VarE "b") + + Compiler.addUStmt $ + CQPL.UnitaryS [CQPL.Arg lt, CQPL.Arg b] $ + CQPL.RevEmbedU ["a"] $ + P.UnOpE P.AllOp (P.VarE "a") + + Compiler.addProc cmp + + -- Build the main algorithm Compiler.buildProc "QMax" [] (zip rets ret_tys) $ do - let _N = P.domainSize arg_ty - inp <- Compiler.allocLocalWithPrefix "inp" $ P.Arr _N arg_ty - oup <- mapM (Compiler.allocLocalWithPrefix "out" . P.Arr _N) ret_tys - aux <- mapM (Compiler.allocLocal . P.Arr _N) fun_aux_tys - - -- Allocate ancillas for the function argument - fun_aux <- mapM Compiler.allocLocal fun_aux_tys - - -- Body: TODO Compiler.addStmt $ CQPL.CommentS "TODO: max-finding circuit" diff --git a/src/Traq/ProtoLang/Syntax.hs b/src/Traq/ProtoLang/Syntax.hs index 1c6bd84..1149a24 100644 --- a/src/Traq/ProtoLang/Syntax.hs +++ b/src/Traq/ProtoLang/Syntax.hs @@ -154,12 +154,14 @@ type instance SizeType (FnType size) = size data UnOp = NotOp | AnyOp + | AllOp | MajOp deriving (Eq, Show, Read) instance PP.ToCodeString UnOp where build NotOp = PP.putWord "not " - build AnyOp = PP.putWord "or " + build AnyOp = PP.putWord "multi_or " + build AllOp = PP.putWord "multi_and " build MajOp = PP.putWord "majority " -- | Binary operations diff --git a/src/Traq/ProtoLang/TypeCheck.hs b/src/Traq/ProtoLang/TypeCheck.hs index b0d2515..b22b2bb 100644 --- a/src/Traq/ProtoLang/TypeCheck.hs +++ b/src/Traq/ProtoLang/TypeCheck.hs @@ -97,6 +97,8 @@ typeCheckBasicExpr UnOpE{un_op, operand} = do return tbool AnyOp -> do return tbool + AllOp -> do + return tbool MajOp -> do case arg_ty of Arr _ t -> return t From 4540d4b3b4a5846048d6e233ff9d354b3d46d8ac Mon Sep 17 00:00:00 2001 From: Anurudh Peduri Date: Tue, 24 Feb 2026 10:46:43 +0000 Subject: [PATCH 20/28] wip --- examples/hillclimb/steep_max_sat.traq | 2 +- src/Traq/Primitives/Max/QMax.hs | 56 ++++++++++++++------------- 2 files changed, 31 insertions(+), 27 deletions(-) diff --git a/examples/hillclimb/steep_max_sat.traq b/examples/hillclimb/steep_max_sat.traq index cdadd9a..dd87322 100644 --- a/examples/hillclimb/steep_max_sat.traq +++ b/examples/hillclimb/steep_max_sat.traq @@ -16,7 +16,7 @@ do end fn hillclimb_iter(x: Arr) -> Arr do - i <- @max>[good(x, _)]; + w, i <- @max, Fin>[good(x, _)]; b <- x[i]; b' <- not b; x' <- update x[i] = b; diff --git a/src/Traq/Primitives/Max/QMax.hs b/src/Traq/Primitives/Max/QMax.hs index f284af0..ae3edaf 100644 --- a/src/Traq/Primitives/Max/QMax.hs +++ b/src/Traq/Primitives/Max/QMax.hs @@ -18,8 +18,9 @@ module Traq.Primitives.Max.QMax ( _WQMax, ) where -import Control.Monad (forM, forM_, when) +import Control.Monad (forM, forM_, replicateM, when) import Control.Monad.Except (throwError) +import Text.Parsec.Token (GenTokenParser (..)) import Text.Printf (printf) import Lens.Micro.GHC @@ -41,7 +42,7 @@ import qualified Traq.Utils.Printing as PP -- Primitive Class Implementation -- ================================================================================ -newtype QMax size prec = QMax {arg_ty :: P.VarType size} +data QMax size prec = QMax {arg_ty, res_ty :: P.VarType size} deriving (Eq, Show, Read) type instance SizeType (QMax size prec) = size @@ -60,12 +61,12 @@ instance ValidPrimShape QMaxFunArg where instance P.MapSize (QMax size prec) where type MappedSize (QMax size prec) size' = QMax size' prec - mapSize f (QMax t) = QMax (P.mapSize f t) + mapSize f (QMax t r) = QMax (P.mapSize f t) (P.mapSize f r) instance (Show size) => SerializePrim (QMax size prec) where primNames = ["max"] - parsePrimParams tp _ = QMax <$> P.varType tp - printPrimParams QMax{arg_ty} = [show arg_ty] + parsePrimParams tp _ = QMax <$> P.varType tp <*> (comma tp >> P.varType tp) + printPrimParams QMax{arg_ty, res_ty} = [PP.toCodeString arg_ty, PP.toCodeString res_ty] -- Type check instance (Eq size) => TypeCheckPrim (QMax size prec) size where @@ -75,13 +76,13 @@ instance (Eq size) => TypeCheckPrim (QMax size prec) size where when (param_types /= [arg_ty]) $ throwError "max: argument does not match specified type." - case ret_types of - [P.Fin _] -> pure () + res_ty <- case ret_types of + [P.Fin n] -> pure $ P.Fin n _ -> throwError $ printf "`max` fun arg must return a single value, got %d values" (length ret_types) - return ret_types + return [arg_ty, res_ty] {- | Evaluate an `any` call by evaluating the predicate on each element of the search space and or-ing the results. @@ -115,30 +116,33 @@ instance instance (P.TypingReqs size, Integral size, RealFloat prec, Show prec) => UnitaryCompilePrim (QMax size prec) size prec where compileUPrim QMax{arg_ty} _ = do -- Return variables and their types - rets <- view $ to ret_vars - ret_tys <- forM rets $ \x -> do - mty <- use $ P._typingCtx . Ctx.at x + (res_var, argmax_var) <- + view (to ret_vars) >>= \case + [x, y] -> pure (x, y) + _ -> throwError "typecheck failed" + res_ty <- do + mty <- use $ P._typingCtx . Ctx.at res_var maybeWithError "" mty -- Function argument: unitary call builder and aux types QMaxFunArg call_ufun <- view $ to mk_ucall QMaxFunArg fun_aux_tys <- view $ to uproc_aux_types - Compiler.buildUProc "UMax" [] (zip rets ret_tys) $ do + Compiler.buildUProc "UMax" [] [(res_var, res_ty), (argmax_var, arg_ty)] $ do let _N = P.domainSize arg_ty inp <- Compiler.allocLocalWithPrefix "inp" $ P.Arr _N arg_ty - oup <- mapM (Compiler.allocLocalWithPrefix "out" . P.Arr _N) ret_tys + oup <- Compiler.allocLocalWithPrefix "out" $ P.Arr _N res_ty aux <- mapM (Compiler.allocLocal . P.Arr _N) fun_aux_tys i <- Compiler.newIdent "x" Compiler.withUStmt (CQPL.UForInDomainS i arg_ty False) $ do let inp_ix = CQPL.ArrElemArg (CQPL.Arg inp) (P.MetaName i) - let oup_ix = map ((`CQPL.ArrElemArg` P.MetaName i) . CQPL.Arg) oup + let oup_ix = CQPL.ArrElemArg (CQPL.Arg oup) (P.MetaName i) let aux_ix = map ((`CQPL.ArrElemArg` P.MetaName i) . CQPL.Arg) aux - Compiler.addUStmt $ call_ufun (inp_ix : oup_ix ++ aux_ix) + Compiler.addUStmt $ call_ufun (inp_ix : oup_ix : aux_ix) - Compiler.addUStmt $ CQPL.UCommentS $ printf "unitarily compute: %s := max(%s);" (PP.commaList rets) (PP.commaList oup) + Compiler.addUStmt $ CQPL.UCommentS $ printf "unitarily compute: %s := max(%s); %s := argmax(%s);" res_var oup argmax_var oup -- ================================================================================ -- Quantum @@ -184,7 +188,7 @@ instance quantumExpExprCosts = Alg.zero -instance (P.TypingReqs size, Integral size, RealFloat prec, Show prec) => QuantumCompilePrim (QMax size prec) size prec where +instance (P.TypingReqs size, Integral size, RealFloat prec, Show prec, A.SizeToPrec size prec) => QuantumCompilePrim (QMax size prec) size prec where compileQPrim QMax{arg_ty} eps = do -- Return variables and their types rets <- view $ to ret_vars @@ -199,18 +203,16 @@ instance (P.TypingReqs size, Integral size, RealFloat prec, Show prec) => Quantu -- Build cmp :: (arg_ty, arg_ty) -> Bool x <- Compiler.newIdent "x" - y <- Compiler.newIdent "x" + prevs <- replicateM (length ret_tys) (Compiler.newIdent "x") b <- Compiler.newIdent "b" - cmp <- Compiler.buildUProc "Compare" [] [(x, arg_ty), (y, arg_ty), (b, P.tbool)] $ do - (outs_x, outs_y) <- forOf each (x, y) $ \i -> do - out <- mapM (Compiler.allocLocalWithPrefix "out") ret_tys - aux <- mapM Compiler.allocLocal fun_aux_tys - Compiler.addUStmt $ call_ufun $ map CQPL.Arg (i : out ++ aux) - return out + cmp <- Compiler.buildUProc "Compare" [] (zip prevs ret_tys ++ [(x, arg_ty), (b, P.tbool)]) $ do + outs <- mapM (Compiler.allocLocalWithPrefix "out") ret_tys + aux <- mapM Compiler.allocLocal fun_aux_tys + Compiler.addUStmt $ call_ufun $ map CQPL.Arg (x : outs ++ aux) - lt <- Compiler.allocLocalWithPrefix "lt" (P.Arr (fromIntegral $ length outs_x) P.tbool) + lt <- Compiler.allocLocalWithPrefix "lt" (P.Arr (fromIntegral $ length prevs) P.tbool) - forM_ (zip3 [0 ..] outs_x outs_y) $ \(i, out_x, out_y) -> do + forM_ (zip3 [0 ..] prevs outs) $ \(i, out_x, out_y) -> do Compiler.addUStmt $ CQPL.UnitaryS [CQPL.Arg out_x, CQPL.Arg out_y, CQPL.ArrElemArg (CQPL.Arg lt) (P.MetaSize i)] $ CQPL.RevEmbedU ["a", "b"] $ @@ -225,4 +227,6 @@ instance (P.TypingReqs size, Integral size, RealFloat prec, Show prec) => Quantu -- Build the main algorithm Compiler.buildProc "QMax" [] (zip rets ret_tys) $ do + let _N = P.domainSize arg_ty + let max_queries = ceiling (_WQMax _N eps) :: size Compiler.addStmt $ CQPL.CommentS "TODO: max-finding circuit" From d8b125785f5c9e37c8bde531214497a59db1c1f2 Mon Sep 17 00:00:00 2001 From: Anurudh Peduri Date: Tue, 24 Feb 2026 11:24:28 +0000 Subject: [PATCH 21/28] fix --- src/Traq/Primitives/Max/QMax.hs | 32 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/src/Traq/Primitives/Max/QMax.hs b/src/Traq/Primitives/Max/QMax.hs index ae3edaf..b6849ce 100644 --- a/src/Traq/Primitives/Max/QMax.hs +++ b/src/Traq/Primitives/Max/QMax.hs @@ -18,7 +18,7 @@ module Traq.Primitives.Max.QMax ( _WQMax, ) where -import Control.Monad (forM, forM_, replicateM, when) +import Control.Monad (forM, when) import Control.Monad.Except (throwError) import Text.Parsec.Token (GenTokenParser (..)) import Text.Printf (printf) @@ -82,7 +82,7 @@ instance (Eq size) => TypeCheckPrim (QMax size prec) size where throwError $ printf "`max` fun arg must return a single value, got %d values" (length ret_types) - return [arg_ty, res_ty] + return [res_ty, arg_ty] {- | Evaluate an `any` call by evaluating the predicate on each element of the search space and or-ing the results. @@ -189,7 +189,7 @@ instance quantumExpExprCosts = Alg.zero instance (P.TypingReqs size, Integral size, RealFloat prec, Show prec, A.SizeToPrec size prec) => QuantumCompilePrim (QMax size prec) size prec where - compileQPrim QMax{arg_ty} eps = do + compileQPrim QMax{arg_ty, res_ty} eps = do -- Return variables and their types rets <- view $ to ret_vars ret_tys <- forM rets $ \x -> do @@ -197,31 +197,23 @@ instance (P.TypingReqs size, Integral size, RealFloat prec, Show prec, A.SizeToP maybeWithError "" mty -- Function argument: unitary call builder and aux types - -- f :: arg_ty -> ret_tys + -- f :: arg_ty -> res_ty QMaxFunArg call_ufun <- view $ to mk_ucall QMaxFunArg fun_aux_tys <- view $ to uproc_aux_types - -- Build cmp :: (arg_ty, arg_ty) -> Bool + -- Build cmp :: (res_ty, arg_ty) -> Bool x <- Compiler.newIdent "x" - prevs <- replicateM (length ret_tys) (Compiler.newIdent "x") + prev <- Compiler.newIdent "y" b <- Compiler.newIdent "b" - cmp <- Compiler.buildUProc "Compare" [] (zip prevs ret_tys ++ [(x, arg_ty), (b, P.tbool)]) $ do - outs <- mapM (Compiler.allocLocalWithPrefix "out") ret_tys + cmp <- Compiler.buildUProc "Compare" [] [(prev, res_ty), (x, arg_ty), (b, P.tbool)] $ do + out <- Compiler.allocLocalWithPrefix "out" res_ty aux <- mapM Compiler.allocLocal fun_aux_tys - Compiler.addUStmt $ call_ufun $ map CQPL.Arg (x : outs ++ aux) - - lt <- Compiler.allocLocalWithPrefix "lt" (P.Arr (fromIntegral $ length prevs) P.tbool) - - forM_ (zip3 [0 ..] prevs outs) $ \(i, out_x, out_y) -> do - Compiler.addUStmt $ - CQPL.UnitaryS [CQPL.Arg out_x, CQPL.Arg out_y, CQPL.ArrElemArg (CQPL.Arg lt) (P.MetaSize i)] $ - CQPL.RevEmbedU ["a", "b"] $ - P.BinOpE P.LtOp (P.VarE "a") (P.VarE "b") + Compiler.addUStmt $ call_ufun $ map CQPL.Arg (x : out : aux) Compiler.addUStmt $ - CQPL.UnitaryS [CQPL.Arg lt, CQPL.Arg b] $ - CQPL.RevEmbedU ["a"] $ - P.UnOpE P.AllOp (P.VarE "a") + CQPL.UnitaryS [CQPL.Arg prev, CQPL.Arg out, CQPL.Arg b] $ + CQPL.RevEmbedU ["a", "b"] $ + P.BinOpE P.LtOp (P.VarE "a") (P.VarE "b") Compiler.addProc cmp From 21eb3cf6c359196ff68deb9a206c5f348ea9c3b5 Mon Sep 17 00:00:00 2001 From: Anurudh Peduri Date: Tue, 24 Feb 2026 16:03:51 +0000 Subject: [PATCH 22/28] wip --- src/Traq/Primitives/Max/QMax.hs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/Traq/Primitives/Max/QMax.hs b/src/Traq/Primitives/Max/QMax.hs index b6849ce..4090385 100644 --- a/src/Traq/Primitives/Max/QMax.hs +++ b/src/Traq/Primitives/Max/QMax.hs @@ -20,6 +20,7 @@ module Traq.Primitives.Max.QMax ( import Control.Monad (forM, when) import Control.Monad.Except (throwError) +import Control.Monad.Trans (lift) import Text.Parsec.Token (GenTokenParser (..)) import Text.Printf (printf) @@ -196,18 +197,17 @@ instance (P.TypingReqs size, Integral size, RealFloat prec, Show prec, A.SizeToP mty <- use $ P._typingCtx . Ctx.at x maybeWithError "" mty - -- Function argument: unitary call builder and aux types - -- f :: arg_ty -> res_ty - QMaxFunArg call_ufun <- view $ to mk_ucall - QMaxFunArg fun_aux_tys <- view $ to uproc_aux_types - -- Build cmp :: (res_ty, arg_ty) -> Bool x <- Compiler.newIdent "x" prev <- Compiler.newIdent "y" b <- Compiler.newIdent "b" cmp <- Compiler.buildUProc "Compare" [] [(prev, res_ty), (x, arg_ty), (b, P.tbool)] $ do + -- f :: arg_ty -> res_ty + QMaxFunArg call_ufun <- lift $ view $ to mk_ucall + QMaxFunArg aux_tys <- lift $ view $ to uproc_aux_types + out <- Compiler.allocLocalWithPrefix "out" res_ty - aux <- mapM Compiler.allocLocal fun_aux_tys + aux <- mapM Compiler.allocLocal aux_tys Compiler.addUStmt $ call_ufun $ map CQPL.Arg (x : out : aux) Compiler.addUStmt $ @@ -221,4 +221,8 @@ instance (P.TypingReqs size, Integral size, RealFloat prec, Show prec, A.SizeToP Compiler.buildProc "QMax" [] (zip rets ret_tys) $ do let _N = P.domainSize arg_ty let max_queries = ceiling (_WQMax _N eps) :: size + + fuel <- Compiler.allocLocalWithPrefix "fuel" (P.Fin (max_queries + 1)) + Compiler.addStmt $ CQPL.AssignS [fuel] $ error "const max_queries" + Compiler.addStmt $ CQPL.CommentS "TODO: max-finding circuit" From 936256a6887507988d3e7d0a00bc0941b532c69d Mon Sep 17 00:00:00 2001 From: Anurudh Peduri Date: Tue, 24 Feb 2026 16:16:16 +0000 Subject: [PATCH 23/28] wip --- examples/hillclimb/steep_max_sat.qpl | 39 ++++++++++---------- src/Traq/Primitives/Max/QMax.hs | 54 +++++++++++++++++----------- 2 files changed, 54 insertions(+), 39 deletions(-) diff --git a/examples/hillclimb/steep_max_sat.qpl b/examples/hillclimb/steep_max_sat.qpl index 5aa1803..f676141 100644 --- a/examples/hillclimb/steep_max_sat.qpl +++ b/examples/hillclimb/steep_max_sat.qpl @@ -23,16 +23,16 @@ proc good(good_x : Arr<20, Fin<2>>, good_i : Fin<20>, good_w' : Fin<1000>) { loc call Phi(good_x', good_w'); } -uproc UMax(hillclimb_iter_x : Arr<20, Fin<2>>, hillclimb_iter_i_1 : Fin<1000>, inp : AUX Arr<20, Fin<20>>, out : AUX Arr<20, Fin<1000>>, aux : AUX Arr<20, Fin<1000>>, aux_1 : AUX Arr<20, Fin<2>>, aux_2 : AUX Arr<20, Fin<2>>, aux_3 : AUX Arr<20, Arr<20, Fin<2>>>, aux_4 : AUX Arr<20, Fin<1000>>, aux_5 : AUX Arr<20, Fin<2>>, aux_6 : AUX Arr<20, Fin<2>>, aux_7 : AUX Arr<20, Arr<20, Fin<2>>>, aux_8 : AUX Arr<20, Fin<1000>>) { +uproc UMax(hillclimb_iter_x : Arr<20, Fin<2>>, hillclimb_iter_w_1 : Fin<1000>, hillclimb_iter_i_1 : Fin<20>, inp : AUX Arr<20, Fin<20>>, out : AUX Arr<20, Fin<1000>>, aux : AUX Arr<20, Fin<1000>>, aux_1 : AUX Arr<20, Fin<2>>, aux_2 : AUX Arr<20, Fin<2>>, aux_3 : AUX Arr<20, Arr<20, Fin<2>>>, aux_4 : AUX Arr<20, Fin<1000>>, aux_5 : AUX Arr<20, Fin<2>>, aux_6 : AUX Arr<20, Fin<2>>, aux_7 : AUX Arr<20, Arr<20, Fin<2>>>, aux_8 : AUX Arr<20, Fin<1000>>) { for (#x in Fin<20>) { call good_U(hillclimb_iter_x, inp[#x], out[#x], aux[#x], aux_1[#x], aux_2[#x], aux_3[#x], aux_4[#x], aux_5[#x], aux_6[#x], aux_7[#x], aux_8[#x]); } - // unitarily compute: hillclimb_iter_i_1 := max(out); + // unitarily compute: hillclimb_iter_w_1 := max(out); hillclimb_iter_i_1 := argmax(out); } -uproc hillclimb_iter_U(hillclimb_iter_x : IN Arr<20, Fin<2>>, hillclimb_iter_x' : OUT Arr<20, Fin<2>>, hillclimb_iter_i : AUX Fin<1000>, hillclimb_iter_b : AUX Fin<2>, hillclimb_iter_b' : AUX Fin<2>, hillclimb_iter_i_1 : AUX Fin<1000>, aux_prim : AUX Arr<20, Fin<20>>, aux_prim_1 : AUX Arr<20, Fin<1000>>, aux_prim_2 : AUX Arr<20, Fin<1000>>, aux_prim_3 : AUX Arr<20, Fin<2>>, aux_prim_4 : AUX Arr<20, Fin<2>>, aux_prim_5 : AUX Arr<20, Arr<20, Fin<2>>>, aux_prim_6 : AUX Arr<20, Fin<1000>>, aux_prim_7 : AUX Arr<20, Fin<2>>, aux_prim_8 : AUX Arr<20, Fin<2>>, aux_prim_9 : AUX Arr<20, Arr<20, Fin<2>>>, aux_prim_10 : AUX Arr<20, Fin<1000>>, hillclimb_iter_b_1 : AUX Fin<2>, hillclimb_iter_b'_1 : AUX Fin<2>, hillclimb_iter_x'_1 : AUX Arr<20, Fin<2>>) { - call UMax(hillclimb_iter_x, hillclimb_iter_i_1, aux_prim, aux_prim_1, aux_prim_2, aux_prim_3, aux_prim_4, aux_prim_5, aux_prim_6, aux_prim_7, aux_prim_8, aux_prim_9, aux_prim_10); - hillclimb_iter_i, hillclimb_iter_i_1 *= SWAP; +uproc hillclimb_iter_U(hillclimb_iter_x : IN Arr<20, Fin<2>>, hillclimb_iter_x' : OUT Arr<20, Fin<2>>, hillclimb_iter_w : AUX Fin<1000>, hillclimb_iter_i : AUX Fin<20>, hillclimb_iter_b : AUX Fin<2>, hillclimb_iter_b' : AUX Fin<2>, hillclimb_iter_w_1 : AUX Fin<1000>, hillclimb_iter_i_1 : AUX Fin<20>, aux_prim : AUX Arr<20, Fin<20>>, aux_prim_1 : AUX Arr<20, Fin<1000>>, aux_prim_2 : AUX Arr<20, Fin<1000>>, aux_prim_3 : AUX Arr<20, Fin<2>>, aux_prim_4 : AUX Arr<20, Fin<2>>, aux_prim_5 : AUX Arr<20, Arr<20, Fin<2>>>, aux_prim_6 : AUX Arr<20, Fin<1000>>, aux_prim_7 : AUX Arr<20, Fin<2>>, aux_prim_8 : AUX Arr<20, Fin<2>>, aux_prim_9 : AUX Arr<20, Arr<20, Fin<2>>>, aux_prim_10 : AUX Arr<20, Fin<1000>>, hillclimb_iter_b_1 : AUX Fin<2>, hillclimb_iter_b'_1 : AUX Fin<2>, hillclimb_iter_x'_1 : AUX Arr<20, Fin<2>>) { + call UMax(hillclimb_iter_x, hillclimb_iter_w_1, hillclimb_iter_i_1, aux_prim, aux_prim_1, aux_prim_2, aux_prim_3, aux_prim_4, aux_prim_5, aux_prim_6, aux_prim_7, aux_prim_8, aux_prim_9, aux_prim_10); + hillclimb_iter_w, hillclimb_iter_i, hillclimb_iter_w_1, hillclimb_iter_i_1 *= SWAP; hillclimb_iter_i, hillclimb_iter_x, hillclimb_iter_b_1 *= Embed[(hillclimb_iter_i, hillclimb_iter_x) => hillclimb_iter_x[hillclimb_iter_i]]; hillclimb_iter_b, hillclimb_iter_b_1 *= SWAP; hillclimb_iter_b, hillclimb_iter_b'_1 *= Embed[(hillclimb_iter_b) => not hillclimb_iter_b]; @@ -41,33 +41,36 @@ uproc hillclimb_iter_U(hillclimb_iter_x : IN Arr<20, Fin<2>>, hillclimb_iter_x' hillclimb_iter_x', hillclimb_iter_x'_1 *= SWAP; } -uproc Compare(hillclimb_iter_x : Arr<20, Fin<2>>, x_1 : Fin<20>, x_2 : Fin<20>, b : Fin<2>, out_1 : AUX Fin<1000>, aux_9 : AUX Fin<1000>, aux_10 : AUX Fin<2>, aux_11 : AUX Fin<2>, aux_12 : AUX Arr<20, Fin<2>>, aux_13 : AUX Fin<1000>, aux_14 : AUX Fin<2>, aux_15 : AUX Fin<2>, aux_16 : AUX Arr<20, Fin<2>>, aux_17 : AUX Fin<1000>, out_2 : AUX Fin<1000>, aux_18 : AUX Fin<1000>, aux_19 : AUX Fin<2>, aux_20 : AUX Fin<2>, aux_21 : AUX Arr<20, Fin<2>>, aux_22 : AUX Fin<1000>, aux_23 : AUX Fin<2>, aux_24 : AUX Fin<2>, aux_25 : AUX Arr<20, Fin<2>>, aux_26 : AUX Fin<1000>, lt : AUX Arr<1, Fin<2>>) { +uproc Compare(hillclimb_iter_x : Arr<20, Fin<2>>, y : Fin<1000>, x_1 : Fin<20>, b : Fin<2>, out_1 : AUX Fin<1000>, aux_9 : AUX Fin<1000>, aux_10 : AUX Fin<2>, aux_11 : AUX Fin<2>, aux_12 : AUX Arr<20, Fin<2>>, aux_13 : AUX Fin<1000>, aux_14 : AUX Fin<2>, aux_15 : AUX Fin<2>, aux_16 : AUX Arr<20, Fin<2>>, aux_17 : AUX Fin<1000>) { call good_U(hillclimb_iter_x, x_1, out_1, aux_9, aux_10, aux_11, aux_12, aux_13, aux_14, aux_15, aux_16, aux_17); - call good_U(hillclimb_iter_x, x_2, out_2, aux_18, aux_19, aux_20, aux_21, aux_22, aux_23, aux_24, aux_25, aux_26); - out_1, out_2, lt[0] *= Embed[(a, b) => (a < b)]; - lt, b *= Embed[(a) => multi_and a]; + y, out_1, b *= Embed[(a, b) => (a < b)]; } -proc QMax(hillclimb_iter_x : Arr<20, Fin<2>>, hillclimb_iter_i : Fin<1000>) { locals : () } { - // TODO: max-finding circuit +proc QMax(hillclimb_iter_x : Arr<20, Fin<2>>, hillclimb_iter_w : Fin<1000>, hillclimb_iter_i : Fin<20>) { locals : (fuel : Fin<750>, x_2 : Fin<20>, y_1 : Fin<1000>) } { + fuel := 749:Fin<750>; + x_2 :=$ uniform : Fin<20>; + call good(hillclimb_iter_x, x_2, y_1); + repeat (750) { + // TODO: loop body + } } -proc hillclimb_iter(hillclimb_iter_x : Arr<20, Fin<2>>, hillclimb_iter_x' : Arr<20, Fin<2>>) { locals : (hillclimb_iter_i : Fin<1000>, hillclimb_iter_b : Fin<2>, hillclimb_iter_b' : Fin<2>) } { - call QMax(hillclimb_iter_x, hillclimb_iter_i); +proc hillclimb_iter(hillclimb_iter_x : Arr<20, Fin<2>>, hillclimb_iter_x' : Arr<20, Fin<2>>) { locals : (hillclimb_iter_w : Fin<1000>, hillclimb_iter_i : Fin<20>, hillclimb_iter_b : Fin<2>, hillclimb_iter_b' : Fin<2>) } { + call QMax(hillclimb_iter_x, hillclimb_iter_w, hillclimb_iter_i); hillclimb_iter_b := hillclimb_iter_x[hillclimb_iter_i]; hillclimb_iter_b' := not hillclimb_iter_b; hillclimb_iter_x' := update hillclimb_iter_x[hillclimb_iter_i] = hillclimb_iter_b; } -uproc hillclimb_3_U(hillclimb_3_x_3 : OUT Arr<20, Fin<2>>, hillclimb_3_x_0 : AUX Arr<20, Fin<2>>, hillclimb_3_x_1 : AUX Arr<20, Fin<2>>, hillclimb_3_x_2 : AUX Arr<20, Fin<2>>, hillclimb_3_x_0_1 : AUX Arr<20, Fin<2>>, hillclimb_3_x_0_1_1 : AUX Arr<20, Fin<2>>, hillclimb_3_x_1_1 : AUX Arr<20, Fin<2>>, aux_27 : AUX Fin<1000>, aux_28 : AUX Fin<2>, aux_29 : AUX Fin<2>, aux_30 : AUX Fin<1000>, aux_31 : AUX Arr<20, Fin<20>>, aux_32 : AUX Arr<20, Fin<1000>>, aux_33 : AUX Arr<20, Fin<1000>>, aux_34 : AUX Arr<20, Fin<2>>, aux_35 : AUX Arr<20, Fin<2>>, aux_36 : AUX Arr<20, Arr<20, Fin<2>>>, aux_37 : AUX Arr<20, Fin<1000>>, aux_38 : AUX Arr<20, Fin<2>>, aux_39 : AUX Arr<20, Fin<2>>, aux_40 : AUX Arr<20, Arr<20, Fin<2>>>, aux_41 : AUX Arr<20, Fin<1000>>, aux_42 : AUX Fin<2>, aux_43 : AUX Fin<2>, aux_44 : AUX Arr<20, Fin<2>>, hillclimb_3_x_2_1 : AUX Arr<20, Fin<2>>, aux_45 : AUX Fin<1000>, aux_46 : AUX Fin<2>, aux_47 : AUX Fin<2>, aux_48 : AUX Fin<1000>, aux_49 : AUX Arr<20, Fin<20>>, aux_50 : AUX Arr<20, Fin<1000>>, aux_51 : AUX Arr<20, Fin<1000>>, aux_52 : AUX Arr<20, Fin<2>>, aux_53 : AUX Arr<20, Fin<2>>, aux_54 : AUX Arr<20, Arr<20, Fin<2>>>, aux_55 : AUX Arr<20, Fin<1000>>, aux_56 : AUX Arr<20, Fin<2>>, aux_57 : AUX Arr<20, Fin<2>>, aux_58 : AUX Arr<20, Arr<20, Fin<2>>>, aux_59 : AUX Arr<20, Fin<1000>>, aux_60 : AUX Fin<2>, aux_61 : AUX Fin<2>, aux_62 : AUX Arr<20, Fin<2>>, hillclimb_3_x_3_1 : AUX Arr<20, Fin<2>>, aux_63 : AUX Fin<1000>, aux_64 : AUX Fin<2>, aux_65 : AUX Fin<2>, aux_66 : AUX Fin<1000>, aux_67 : AUX Arr<20, Fin<20>>, aux_68 : AUX Arr<20, Fin<1000>>, aux_69 : AUX Arr<20, Fin<1000>>, aux_70 : AUX Arr<20, Fin<2>>, aux_71 : AUX Arr<20, Fin<2>>, aux_72 : AUX Arr<20, Arr<20, Fin<2>>>, aux_73 : AUX Arr<20, Fin<1000>>, aux_74 : AUX Arr<20, Fin<2>>, aux_75 : AUX Arr<20, Fin<2>>, aux_76 : AUX Arr<20, Arr<20, Fin<2>>>, aux_77 : AUX Arr<20, Fin<1000>>, aux_78 : AUX Fin<2>, aux_79 : AUX Fin<2>, aux_80 : AUX Arr<20, Fin<2>>) { +uproc hillclimb_3_U(hillclimb_3_x_3 : OUT Arr<20, Fin<2>>, hillclimb_3_x_0 : AUX Arr<20, Fin<2>>, hillclimb_3_x_1 : AUX Arr<20, Fin<2>>, hillclimb_3_x_2 : AUX Arr<20, Fin<2>>, hillclimb_3_x_0_1 : AUX Arr<20, Fin<2>>, hillclimb_3_x_0_1_1 : AUX Arr<20, Fin<2>>, hillclimb_3_x_1_1 : AUX Arr<20, Fin<2>>, aux_18 : AUX Fin<1000>, aux_19 : AUX Fin<20>, aux_20 : AUX Fin<2>, aux_21 : AUX Fin<2>, aux_22 : AUX Fin<1000>, aux_23 : AUX Fin<20>, aux_24 : AUX Arr<20, Fin<20>>, aux_25 : AUX Arr<20, Fin<1000>>, aux_26 : AUX Arr<20, Fin<1000>>, aux_27 : AUX Arr<20, Fin<2>>, aux_28 : AUX Arr<20, Fin<2>>, aux_29 : AUX Arr<20, Arr<20, Fin<2>>>, aux_30 : AUX Arr<20, Fin<1000>>, aux_31 : AUX Arr<20, Fin<2>>, aux_32 : AUX Arr<20, Fin<2>>, aux_33 : AUX Arr<20, Arr<20, Fin<2>>>, aux_34 : AUX Arr<20, Fin<1000>>, aux_35 : AUX Fin<2>, aux_36 : AUX Fin<2>, aux_37 : AUX Arr<20, Fin<2>>, hillclimb_3_x_2_1 : AUX Arr<20, Fin<2>>, aux_38 : AUX Fin<1000>, aux_39 : AUX Fin<20>, aux_40 : AUX Fin<2>, aux_41 : AUX Fin<2>, aux_42 : AUX Fin<1000>, aux_43 : AUX Fin<20>, aux_44 : AUX Arr<20, Fin<20>>, aux_45 : AUX Arr<20, Fin<1000>>, aux_46 : AUX Arr<20, Fin<1000>>, aux_47 : AUX Arr<20, Fin<2>>, aux_48 : AUX Arr<20, Fin<2>>, aux_49 : AUX Arr<20, Arr<20, Fin<2>>>, aux_50 : AUX Arr<20, Fin<1000>>, aux_51 : AUX Arr<20, Fin<2>>, aux_52 : AUX Arr<20, Fin<2>>, aux_53 : AUX Arr<20, Arr<20, Fin<2>>>, aux_54 : AUX Arr<20, Fin<1000>>, aux_55 : AUX Fin<2>, aux_56 : AUX Fin<2>, aux_57 : AUX Arr<20, Fin<2>>, hillclimb_3_x_3_1 : AUX Arr<20, Fin<2>>, aux_58 : AUX Fin<1000>, aux_59 : AUX Fin<20>, aux_60 : AUX Fin<2>, aux_61 : AUX Fin<2>, aux_62 : AUX Fin<1000>, aux_63 : AUX Fin<20>, aux_64 : AUX Arr<20, Fin<20>>, aux_65 : AUX Arr<20, Fin<1000>>, aux_66 : AUX Arr<20, Fin<1000>>, aux_67 : AUX Arr<20, Fin<2>>, aux_68 : AUX Arr<20, Fin<2>>, aux_69 : AUX Arr<20, Arr<20, Fin<2>>>, aux_70 : AUX Arr<20, Fin<1000>>, aux_71 : AUX Arr<20, Fin<2>>, aux_72 : AUX Arr<20, Fin<2>>, aux_73 : AUX Arr<20, Arr<20, Fin<2>>>, aux_74 : AUX Arr<20, Fin<1000>>, aux_75 : AUX Fin<2>, aux_76 : AUX Fin<2>, aux_77 : AUX Arr<20, Fin<2>>) { hillclimb_3_x_0_1 *= Distr[uniform : Arr<20, Fin<2>>]; hillclimb_3_x_0_1, hillclimb_3_x_0_1_1 *= COPY; hillclimb_3_x_0, hillclimb_3_x_0_1 *= SWAP; - call hillclimb_iter_U(hillclimb_3_x_0, hillclimb_3_x_1_1, aux_27, aux_28, aux_29, aux_30, aux_31, aux_32, aux_33, aux_34, aux_35, aux_36, aux_37, aux_38, aux_39, aux_40, aux_41, aux_42, aux_43, aux_44); + call hillclimb_iter_U(hillclimb_3_x_0, hillclimb_3_x_1_1, aux_18, aux_19, aux_20, aux_21, aux_22, aux_23, aux_24, aux_25, aux_26, aux_27, aux_28, aux_29, aux_30, aux_31, aux_32, aux_33, aux_34, aux_35, aux_36, aux_37); hillclimb_3_x_1, hillclimb_3_x_1_1 *= SWAP; - call hillclimb_iter_U(hillclimb_3_x_1, hillclimb_3_x_2_1, aux_45, aux_46, aux_47, aux_48, aux_49, aux_50, aux_51, aux_52, aux_53, aux_54, aux_55, aux_56, aux_57, aux_58, aux_59, aux_60, aux_61, aux_62); + call hillclimb_iter_U(hillclimb_3_x_1, hillclimb_3_x_2_1, aux_38, aux_39, aux_40, aux_41, aux_42, aux_43, aux_44, aux_45, aux_46, aux_47, aux_48, aux_49, aux_50, aux_51, aux_52, aux_53, aux_54, aux_55, aux_56, aux_57); hillclimb_3_x_2, hillclimb_3_x_2_1 *= SWAP; - call hillclimb_iter_U(hillclimb_3_x_2, hillclimb_3_x_3_1, aux_63, aux_64, aux_65, aux_66, aux_67, aux_68, aux_69, aux_70, aux_71, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80); + call hillclimb_iter_U(hillclimb_3_x_2, hillclimb_3_x_3_1, aux_58, aux_59, aux_60, aux_61, aux_62, aux_63, aux_64, aux_65, aux_66, aux_67, aux_68, aux_69, aux_70, aux_71, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77); hillclimb_3_x_3, hillclimb_3_x_3_1 *= SWAP; } @@ -79,4 +82,4 @@ proc hillclimb_3(hillclimb_3_x_3 : Arr<20, Fin<2>>) { locals : (hillclimb_3_x_0 } -// qubits: 5652 +// qubits: 5682 diff --git a/src/Traq/Primitives/Max/QMax.hs b/src/Traq/Primitives/Max/QMax.hs index 4090385..e7a9db5 100644 --- a/src/Traq/Primitives/Max/QMax.hs +++ b/src/Traq/Primitives/Max/QMax.hs @@ -198,31 +198,43 @@ instance (P.TypingReqs size, Integral size, RealFloat prec, Show prec, A.SizeToP maybeWithError "" mty -- Build cmp :: (res_ty, arg_ty) -> Bool - x <- Compiler.newIdent "x" - prev <- Compiler.newIdent "y" - b <- Compiler.newIdent "b" - cmp <- Compiler.buildUProc "Compare" [] [(prev, res_ty), (x, arg_ty), (b, P.tbool)] $ do - -- f :: arg_ty -> res_ty - QMaxFunArg call_ufun <- lift $ view $ to mk_ucall - QMaxFunArg aux_tys <- lift $ view $ to uproc_aux_types - - out <- Compiler.allocLocalWithPrefix "out" res_ty - aux <- mapM Compiler.allocLocal aux_tys - Compiler.addUStmt $ call_ufun $ map CQPL.Arg (x : out : aux) - - Compiler.addUStmt $ - CQPL.UnitaryS [CQPL.Arg prev, CQPL.Arg out, CQPL.Arg b] $ - CQPL.RevEmbedU ["a", "b"] $ - P.BinOpE P.LtOp (P.VarE "a") (P.VarE "b") - - Compiler.addProc cmp + cmp <- do + x <- Compiler.newIdent "x" + prev <- Compiler.newIdent "y" + b <- Compiler.newIdent "b" + cmp <- Compiler.buildUProc "Compare" [] [(prev, res_ty), (x, arg_ty), (b, P.tbool)] $ do + -- f :: arg_ty -> res_ty + QMaxFunArg call_ufun <- lift $ view $ to mk_ucall + QMaxFunArg aux_tys <- lift $ view $ to uproc_aux_types + + out <- Compiler.allocLocalWithPrefix "out" res_ty + aux <- mapM Compiler.allocLocal aux_tys + Compiler.addUStmt $ call_ufun $ map CQPL.Arg (x : out : aux) + + Compiler.addUStmt $ + CQPL.UnitaryS [CQPL.Arg prev, CQPL.Arg out, CQPL.Arg b] $ + CQPL.RevEmbedU ["a", "b"] $ + P.BinOpE P.LtOp (P.VarE "a") (P.VarE "b") + + Compiler.addProc cmp + return cmp -- Build the main algorithm Compiler.buildProc "QMax" [] (zip rets ret_tys) $ do let _N = P.domainSize arg_ty let max_queries = ceiling (_WQMax _N eps) :: size - fuel <- Compiler.allocLocalWithPrefix "fuel" (P.Fin (max_queries + 1)) - Compiler.addStmt $ CQPL.AssignS [fuel] $ error "const max_queries" + fuel <- Compiler.allocLocalWithPrefix "fuel" (P.Fin max_queries) + Compiler.addStmt $ CQPL.AssignS [fuel] (P.ConstE (P.FinV $ max_queries - 1) (P.Fin max_queries)) + + -- choose x \in arg_ty uniformly at random + x <- Compiler.allocLocalWithPrefix "x" arg_ty + Compiler.addStmt $ CQPL.RandomS [x] (P.UniformE arg_ty) + + -- set y <- f(x); + y <- Compiler.allocLocalWithPrefix "y" res_ty + QMaxFunArg call_fun <- lift $ view $ to mk_call + Compiler.addStmt $ call_fun [CQPL.Arg x, CQPL.Arg y] - Compiler.addStmt $ CQPL.CommentS "TODO: max-finding circuit" + Compiler.withStmt (CQPL.RepeatS (P.MetaSize max_queries)) $ do + Compiler.addStmt $ CQPL.CommentS "TODO: loop body" From 11be9fea69f5de4cc3052be920b013088c9382b2 Mon Sep 17 00:00:00 2001 From: Anurudh Peduri Date: Tue, 24 Feb 2026 16:33:38 +0000 Subject: [PATCH 24/28] wip --- examples/hillclimb/steep_max_sat.qpl | 12 ++++++--- src/Traq/Primitives/Max/QMax.hs | 40 ++++++++++++++++------------ 2 files changed, 31 insertions(+), 21 deletions(-) diff --git a/examples/hillclimb/steep_max_sat.qpl b/examples/hillclimb/steep_max_sat.qpl index f676141..cebd012 100644 --- a/examples/hillclimb/steep_max_sat.qpl +++ b/examples/hillclimb/steep_max_sat.qpl @@ -46,12 +46,16 @@ uproc Compare(hillclimb_iter_x : Arr<20, Fin<2>>, y : Fin<1000>, x_1 : Fin<20>, y, out_1, b *= Embed[(a, b) => (a < b)]; } -proc QMax(hillclimb_iter_x : Arr<20, Fin<2>>, hillclimb_iter_w : Fin<1000>, hillclimb_iter_i : Fin<20>) { locals : (fuel : Fin<750>, x_2 : Fin<20>, y_1 : Fin<1000>) } { +proc QSearch(hillclimb_iter_x : Arr<20, Fin<2>>, fuel : Fin<750>, y : Fin<1000>, x : Fin<20>) { locals : () } { + // TODO: QSearch body +} + +proc QMax(hillclimb_iter_x : Arr<20, Fin<2>>, hillclimb_iter_w : Fin<1000>, hillclimb_iter_i : Fin<20>) { locals : (fuel : Fin<750>) } { fuel := 749:Fin<750>; - x_2 :=$ uniform : Fin<20>; - call good(hillclimb_iter_x, x_2, y_1); + hillclimb_iter_i :=$ uniform : Fin<20>; + call good(hillclimb_iter_x, hillclimb_iter_i, hillclimb_iter_w); repeat (750) { - // TODO: loop body + call QSearch(hillclimb_iter_x, fuel, hillclimb_iter_w, hillclimb_iter_i); } } diff --git a/src/Traq/Primitives/Max/QMax.hs b/src/Traq/Primitives/Max/QMax.hs index e7a9db5..aef6635 100644 --- a/src/Traq/Primitives/Max/QMax.hs +++ b/src/Traq/Primitives/Max/QMax.hs @@ -115,15 +115,12 @@ instance unitaryExprCosts _ _ = Alg.zero instance (P.TypingReqs size, Integral size, RealFloat prec, Show prec) => UnitaryCompilePrim (QMax size prec) size prec where - compileUPrim QMax{arg_ty} _ = do + compileUPrim QMax{arg_ty, res_ty} _ = do -- Return variables and their types (res_var, argmax_var) <- view (to ret_vars) >>= \case [x, y] -> pure (x, y) _ -> throwError "typecheck failed" - res_ty <- do - mty <- use $ P._typingCtx . Ctx.at res_var - maybeWithError "" mty -- Function argument: unitary call builder and aux types QMaxFunArg call_ufun <- view $ to mk_ucall @@ -192,10 +189,10 @@ instance instance (P.TypingReqs size, Integral size, RealFloat prec, Show prec, A.SizeToPrec size prec) => QuantumCompilePrim (QMax size prec) size prec where compileQPrim QMax{arg_ty, res_ty} eps = do -- Return variables and their types - rets <- view $ to ret_vars - ret_tys <- forM rets $ \x -> do - mty <- use $ P._typingCtx . Ctx.at x - maybeWithError "" mty + (res_var, argmax_var) <- + view (to ret_vars) >>= \case + [x, y] -> pure (x, y) + _ -> throwError "typecheck failed" -- Build cmp :: (res_ty, arg_ty) -> Bool cmp <- do @@ -219,22 +216,31 @@ instance (P.TypingReqs size, Integral size, RealFloat prec, Show prec, A.SizeToP Compiler.addProc cmp return cmp - -- Build the main algorithm - Compiler.buildProc "QMax" [] (zip rets ret_tys) $ do - let _N = P.domainSize arg_ty - let max_queries = ceiling (_WQMax _N eps) :: size + let _N = P.domainSize arg_ty + let max_queries = ceiling (_WQMax _N eps) :: size + let fuel_ty = P.Fin max_queries + + -- Build: qsearch with bounded fuel + qsearch <- do + p <- Compiler.buildProc "QSearch" [] [("fuel", fuel_ty), ("y", res_ty), ("x", arg_ty)] $ do + Compiler.addStmt $ CQPL.CommentS "TODO: QSearch body" - fuel <- Compiler.allocLocalWithPrefix "fuel" (P.Fin max_queries) - Compiler.addStmt $ CQPL.AssignS [fuel] (P.ConstE (P.FinV $ max_queries - 1) (P.Fin max_queries)) + Compiler.addProc p + return p + + -- Build the main algorithm + Compiler.buildProc "QMax" [] [(res_var, res_ty), (argmax_var, arg_ty)] $ do + fuel <- Compiler.allocLocalWithPrefix "fuel" fuel_ty + Compiler.addStmt $ CQPL.AssignS [fuel] (P.ConstE (P.FinV $ max_queries - 1) fuel_ty) -- choose x \in arg_ty uniformly at random - x <- Compiler.allocLocalWithPrefix "x" arg_ty + let x = argmax_var Compiler.addStmt $ CQPL.RandomS [x] (P.UniformE arg_ty) -- set y <- f(x); - y <- Compiler.allocLocalWithPrefix "y" res_ty + let y = res_var QMaxFunArg call_fun <- lift $ view $ to mk_call Compiler.addStmt $ call_fun [CQPL.Arg x, CQPL.Arg y] Compiler.withStmt (CQPL.RepeatS (P.MetaSize max_queries)) $ do - Compiler.addStmt $ CQPL.CommentS "TODO: loop body" + Compiler.addStmt $ CQPL.CallS (CQPL.FunctionCall (CQPL.proc_name qsearch)) [] [CQPL.Arg fuel, CQPL.Arg y, CQPL.Arg x] From acad13586765c9b13b193b4a3d077e6defb4677f Mon Sep 17 00:00:00 2001 From: Anurudh Peduri Date: Tue, 24 Feb 2026 18:29:03 +0000 Subject: [PATCH 25/28] clean --- examples/cryptanalysis/grover_meets_simon.qpl | 1 - examples/hillclimb/max_sat_hillclimb.qpl | 1 - .../matrix_search/depth3_NAND_formula.qpl | 15 ++-- examples/matrix_search/matrix_search.qpl | 10 +-- src/Traq/Primitives/Search/QSearchCFNW.hs | 88 ++++++------------- 5 files changed, 37 insertions(+), 78 deletions(-) diff --git a/examples/cryptanalysis/grover_meets_simon.qpl b/examples/cryptanalysis/grover_meets_simon.qpl index 5e97849..ab32ccd 100644 --- a/examples/cryptanalysis/grover_meets_simon.qpl +++ b/examples/cryptanalysis/grover_meets_simon.qpl @@ -117,7 +117,6 @@ uproc Grover[k](x_2 : IN BitVec<20>, outerAttack_ok : OUT Fin<2>, aux_38 : AUX B outerAttack_ok *= X; } -// QSearch[5.0e-4] proc QSearch(outerAttack_ok : Fin<2>, outerAttack_k0 : BitVec<20>) { locals : (not_done : Fin<2>, Q_sum : Fin<9421>, j : Fin<9421>, j_lim : Fin<9421>) } { repeat (7) { Q_sum := 0:Fin<9421>; diff --git a/examples/hillclimb/max_sat_hillclimb.qpl b/examples/hillclimb/max_sat_hillclimb.qpl index c714eaf..43fa04f 100644 --- a/examples/hillclimb/max_sat_hillclimb.qpl +++ b/examples/hillclimb/max_sat_hillclimb.qpl @@ -82,7 +82,6 @@ uproc Grover[k](hillclimb_iter_x : Arr<20, Fin<2>>, x : IN Fin<20>, hillclimb_it hillclimb_iter_ok *= X; } -// QSearch[3.333333333333333e-4] proc QSearch(hillclimb_iter_x : Arr<20, Fin<2>>, hillclimb_iter_ok : Fin<2>, hillclimb_iter_i : Fin<20>) { locals : (not_done : Fin<2>, Q_sum : Fin<42>, j : Fin<42>, j_lim : Fin<42>) } { repeat (8) { Q_sum := 0:Fin<42>; diff --git a/examples/matrix_search/depth3_NAND_formula.qpl b/examples/matrix_search/depth3_NAND_formula.qpl index b06cefb..33ac3e2 100644 --- a/examples/matrix_search/depth3_NAND_formula.qpl +++ b/examples/matrix_search/depth3_NAND_formula.qpl @@ -66,8 +66,7 @@ uproc Grover[k](i1 : Fin<20>, j1 : Fin<10>, x : IN Fin<10>, or_1 : OUT Fin<2>, a or_1 *= X; } -// QAny[3.801194009254654e-32] -proc QAny(i1 : Fin<20>, j1 : Fin<10>, or_1 : Fin<2>) { locals : (not_done : Fin<2>, Q_sum : Fin<30>, j : Fin<30>, j_lim : Fin<30>, s_result_1 : Fin<10>) } { +proc QAny(i1 : Fin<20>, j1 : Fin<10>, or_1 : Fin<2>) { locals : (s_result_1 : Fin<10>, not_done : Fin<2>, Q_sum : Fin<30>, j : Fin<30>, j_lim : Fin<30>) } { repeat (66) { Q_sum := 0:Fin<30>; for (j_lim in [1:Fin<30>, 1:Fin<30>, 1:Fin<30>, 2:Fin<30>, 2:Fin<30>, 2:Fin<30>, 3:Fin<30>, 3:Fin<30>, 3:Fin<30>, 3:Fin<30>, 3:Fin<30>, 3:Fin<30>, 3:Fin<30>]) { @@ -85,7 +84,7 @@ proc QAny(i1 : Fin<20>, j1 : Fin<10>, or_1 : Fin<2>) { locals : (not_done : Fin< } } -proc NOR_1(i1 : Fin<20>, j1 : Fin<10>, nor_1 : Fin<2>) { locals : (or_1 : Fin<2>, s_result_1 : Fin<10>) } { +proc NOR_1(i1 : Fin<20>, j1 : Fin<10>, nor_1 : Fin<2>) { locals : (or_1 : Fin<2>) } { call QAny(i1, j1, or_1); nor_1 := not or_1; } @@ -142,8 +141,7 @@ uproc Grover_1[k](i2 : Fin<20>, x_1 : IN Fin<10>, or_2 : OUT Fin<2>, aux_29 : AU or_2 *= X; } -// QAny[1.3387056295712027e-13] -proc QAny_1(i2 : Fin<20>, or_2 : Fin<2>) { locals : (not_done_1 : Fin<2>, Q_sum_1 : Fin<30>, j_1 : Fin<30>, j_lim_1 : Fin<30>, s_result_3 : Fin<10>) } { +proc QAny_1(i2 : Fin<20>, or_2 : Fin<2>) { locals : (s_result_3 : Fin<10>, not_done_1 : Fin<2>, Q_sum_1 : Fin<30>, j_1 : Fin<30>, j_lim_1 : Fin<30>) } { repeat (27) { Q_sum_1 := 0:Fin<30>; for (j_lim_1 in [1:Fin<30>, 1:Fin<30>, 1:Fin<30>, 2:Fin<30>, 2:Fin<30>, 2:Fin<30>, 3:Fin<30>, 3:Fin<30>, 3:Fin<30>, 3:Fin<30>, 3:Fin<30>, 3:Fin<30>, 3:Fin<30>]) { @@ -161,7 +159,7 @@ proc QAny_1(i2 : Fin<20>, or_2 : Fin<2>) { locals : (not_done_1 : Fin<2>, Q_sum_ } } -proc NOR_2(i2 : Fin<20>, nor_2 : Fin<2>) { locals : (or_2 : Fin<2>, s_result_3 : Fin<10>) } { +proc NOR_2(i2 : Fin<20>, nor_2 : Fin<2>) { locals : (or_2 : Fin<2>) } { call QAny_1(i2, or_2); nor_2 := not or_2; } @@ -216,8 +214,7 @@ uproc Grover_2[k](x_2 : IN Fin<20>, or_3 : OUT Fin<2>, aux_108 : AUX Fin<2>, aux or_3 *= X; } -// QAny[5.0e-4] -proc QAny_2(or_3 : Fin<2>) { locals : (not_done_2 : Fin<2>, Q_sum_2 : Fin<42>, j_2 : Fin<42>, j_lim_2 : Fin<42>, s_result_5 : Fin<20>) } { +proc QAny_2(or_3 : Fin<2>) { locals : (s_result_5 : Fin<20>, not_done_2 : Fin<2>, Q_sum_2 : Fin<42>, j_2 : Fin<42>, j_lim_2 : Fin<42>) } { repeat (7) { Q_sum_2 := 0:Fin<42>; for (j_lim_2 in [1:Fin<42>, 1:Fin<42>, 1:Fin<42>, 2:Fin<42>, 2:Fin<42>, 2:Fin<42>, 3:Fin<42>, 4:Fin<42>, 4:Fin<42>, 4:Fin<42>, 4:Fin<42>, 4:Fin<42>, 4:Fin<42>, 4:Fin<42>]) { @@ -235,7 +232,7 @@ proc QAny_2(or_3 : Fin<2>) { locals : (not_done_2 : Fin<2>, Q_sum_2 : Fin<42>, j } } -proc Depth3Nand(or_3 : Fin<2>) { locals : (s_result_5 : Fin<20>) } { +proc Depth3Nand(or_3 : Fin<2>) { locals : () } { call QAny_2(or_3); } diff --git a/examples/matrix_search/matrix_search.qpl b/examples/matrix_search/matrix_search.qpl index 7c2170b..6410a4d 100644 --- a/examples/matrix_search/matrix_search.qpl +++ b/examples/matrix_search/matrix_search.qpl @@ -66,8 +66,7 @@ uproc Grover[k](i : Fin<20>, x : IN Fin<10>, hasZero : OUT Fin<2>, aux_4 : AUX F hasZero *= X; } -// QAny[2.6774112591424054e-13] -proc QAny(i : Fin<20>, hasZero : Fin<2>) { locals : (not_done : Fin<2>, Q_sum : Fin<30>, j : Fin<30>, j_lim : Fin<30>, s_result_1 : Fin<10>) } { +proc QAny(i : Fin<20>, hasZero : Fin<2>) { locals : (s_result_1 : Fin<10>, not_done : Fin<2>, Q_sum : Fin<30>, j : Fin<30>, j_lim : Fin<30>) } { repeat (27) { Q_sum := 0:Fin<30>; for (j_lim in [1:Fin<30>, 1:Fin<30>, 1:Fin<30>, 2:Fin<30>, 2:Fin<30>, 2:Fin<30>, 3:Fin<30>, 3:Fin<30>, 3:Fin<30>, 3:Fin<30>, 3:Fin<30>, 3:Fin<30>, 3:Fin<30>]) { @@ -85,7 +84,7 @@ proc QAny(i : Fin<20>, hasZero : Fin<2>) { locals : (not_done : Fin<2>, Q_sum : } } -proc IsRowAllOnes(i : Fin<20>, okr : Fin<2>) { locals : (hasZero : Fin<2>, s_result_1 : Fin<10>) } { +proc IsRowAllOnes(i : Fin<20>, okr : Fin<2>) { locals : (hasZero : Fin<2>) } { call QAny(i, hasZero); okr := not hasZero; } @@ -140,8 +139,7 @@ uproc Grover_1[k](x_1 : IN Fin<20>, ok : OUT Fin<2>, aux_29 : AUX Fin<2>, aux_30 ok *= X; } -// QAny[5.0e-4] -proc QAny_1(ok : Fin<2>) { locals : (not_done_1 : Fin<2>, Q_sum_1 : Fin<42>, j_1 : Fin<42>, j_lim_1 : Fin<42>, s_result_3 : Fin<20>) } { +proc QAny_1(ok : Fin<2>) { locals : (s_result_3 : Fin<20>, not_done_1 : Fin<2>, Q_sum_1 : Fin<42>, j_1 : Fin<42>, j_lim_1 : Fin<42>) } { repeat (7) { Q_sum_1 := 0:Fin<42>; for (j_lim_1 in [1:Fin<42>, 1:Fin<42>, 1:Fin<42>, 2:Fin<42>, 2:Fin<42>, 2:Fin<42>, 3:Fin<42>, 4:Fin<42>, 4:Fin<42>, 4:Fin<42>, 4:Fin<42>, 4:Fin<42>, 4:Fin<42>, 4:Fin<42>]) { @@ -159,7 +157,7 @@ proc QAny_1(ok : Fin<2>) { locals : (not_done_1 : Fin<2>, Q_sum_1 : Fin<42>, j_1 } } -proc HasAllOnesRow(ok : Fin<2>) { locals : (s_result_3 : Fin<20>) } { +proc HasAllOnesRow(ok : Fin<2>) { locals : () } { call QAny_1(ok); } diff --git a/src/Traq/Primitives/Search/QSearchCFNW.hs b/src/Traq/Primitives/Search/QSearchCFNW.hs index e0f49ac..c6ebc3f 100644 --- a/src/Traq/Primitives/Search/QSearchCFNW.hs +++ b/src/Traq/Primitives/Search/QSearchCFNW.hs @@ -31,10 +31,11 @@ module Traq.Primitives.Search.QSearchCFNW ( ) where import Control.Monad (replicateM, when) -import Control.Monad.Except (throwError) +import Control.Monad.Except (MonadError, throwError) import Control.Monad.RWS (RWST, evalRWST) +import Control.Monad.State (MonadState) import Control.Monad.Trans (lift) -import Control.Monad.Writer (WriterT (..), censor, execWriterT, listen) +import Control.Monad.Writer (censor, listen) import Data.Maybe (fromJust) import Data.String (fromString) import GHC.Generics (Generic) @@ -452,24 +453,6 @@ instance -- CQ Lowering -- ================================================================================ --- | the generated QSearch procedure: body stmts and local vars -type QSearchCompilerT ext = - WriterT - ([CQPL.Stmt (SizeType ext)], [(Ident, P.VarType (SizeType ext))]) - (Compiler.CompilerT ext) - -allocReg :: - ( m ~ QSearchCompilerT ext - , size ~ SizeType ext - ) => - Ident -> - P.VarType size -> - m Ident -allocReg prefix ty = do - reg <- lift $ Compiler.newIdent prefix - writeElemAt _2 (reg, ty) - return reg - -- | Run K grover iterations groverK :: forall size. @@ -512,14 +495,15 @@ groverK k (x, x_ty) b mk_pred = -- | Implementation of the hybrid quantum search algorithm \( \textbf{QSearch} \). algoQSearch :: - forall ext size prec. + forall size prec m. ( Integral size , RealFloat prec , size ~ SizeT , Show size , Show prec , P.TypingReqs size - , SizeType ext ~ size + , MonadError String m + , MonadState (Compiler.LoweringCtx size) m ) => -- | search elem type P.VarType size -> @@ -535,13 +519,12 @@ algoQSearch :: Ident -> -- | output value Ident -> - -- | the generated QSearch procedure: body stmts and local vars - QSearchCompilerT ext () + Compiler.ProcBuilderT size m () algoQSearch ty n_samples eps grover_k_caller pred_caller ok x = do - not_done <- allocReg "not_done" P.tbool - q_sum <- allocReg "Q_sum" j_type - j <- allocReg "j" j_type - j_lim <- allocReg "j_lim" j_type + not_done <- Compiler.allocLocalWithPrefix "not_done" P.tbool + q_sum <- Compiler.allocLocalWithPrefix "Q_sum" j_type + j <- Compiler.allocLocalWithPrefix "j" j_type + j_lim <- Compiler.allocLocalWithPrefix "j_lim" j_type -- classical sampling when (n_samples /= 0) $ do @@ -551,7 +534,7 @@ algoQSearch ty n_samples eps grover_k_caller pred_caller ok x = do [ CQPL.RandomS [x] (P.UniformE ty) , pred_caller x ok ] - writeElemAt _1 classicalSampling + Compiler.addStmt classicalSampling -- quantum search @@ -586,7 +569,7 @@ algoQSearch ty n_samples eps grover_k_caller pred_caller ok x = do let quantumSampling = CQPL.RepeatS (CQPL.MetaSize n_runs) quantumSamplingOneRound - writeElemAt _1 quantumSampling + Compiler.addStmt quantumSampling where n = P.domainSize ty @@ -630,18 +613,17 @@ instance (BooleanPredicate call_upred) <- view $ to mk_ucall (BooleanPredicate pred_aux_tys) <- view $ to uproc_aux_types - (ret, x_out) <- case search_kind of + (ret, x_out_param) <- case search_kind of SearchK -> do view (to ret_vars) >>= \case - [b, x_out] -> pure (b, x_out) + [b, x_out] -> pure (b, Just x_out) _ -> throwError "search must return (bool, T)" _ -> do b <- view (to ret_vars) >>= \case [b] -> pure b _ -> throwError "bool predicate must return single bool" - x_out <- lift $ Compiler.allocAncillaWithPref "s_result" search_ty - return (b, x_out) + return (b, Nothing) -- make the Grover_k uproc -- TODO this should ideally be done by algoQSearch, but requires a lot of aux information. @@ -682,33 +664,17 @@ instance , CQPL.args = [CQPL.Arg x, CQPL.Arg b] } - -- emit the QSearch algorithm - let qsearch_params = - case search_kind of - SearchK -> [(ret, P.tbool), (x_out, search_ty)] - _ -> [(ret, P.tbool)] - (BooleanPredicate meas_upred) <- view $ to mk_meas let pred_caller x b = meas_upred [CQPL.Arg x, CQPL.Arg b] - (qsearch_body, qsearch_local_vars) <- - lift $ - execWriterT $ - algoQSearch search_ty 0 eps grover_k_caller pred_caller ret x_out - - let prim_name = (case search_kind of AnyK -> "QAny"; AllK -> "QAll"; SearchK -> "QSearch") - qsearch_proc_name <- Compiler.newIdent prim_name - return - CQPL.ProcDef - { CQPL.info_comment = printf "%s[%s]" prim_name (show $ A.getFailProb eps) - , CQPL.proc_name = qsearch_proc_name - , CQPL.proc_meta_params = [] - , CQPL.proc_param_types = map snd qsearch_params - , CQPL.proc_body = - CQPL.ProcBodyC $ - CQPL.CProcBody - { CQPL.cproc_param_names = map fst qsearch_params - , CQPL.cproc_local_vars = qsearch_local_vars ++ [(x_out, search_ty) | search_kind /= SearchK] - , CQPL.cproc_body_stmt = CQPL.SeqS qsearch_body - } - } + -- emit the QSearch algorithm + let qsearch_params = case search_kind of + SearchK -> [(ret, P.tbool), (fromJust x_out_param, search_ty)] + _ -> [(ret, P.tbool)] + + let prim_name = case search_kind of AnyK -> "QAny"; AllK -> "QAll"; SearchK -> "QSearch" + Compiler.buildProc prim_name [] qsearch_params $ do + x_out <- case x_out_param of + Just x -> pure x + Nothing -> Compiler.allocLocalWithPrefix "s_result" search_ty + algoQSearch search_ty 0 eps grover_k_caller pred_caller ret x_out From bb40912b05e8432ebc6538b32e4a267dcf31a498 Mon Sep 17 00:00:00 2001 From: Anurudh Peduri Date: Tue, 24 Feb 2026 18:43:38 +0000 Subject: [PATCH 26/28] fix --- src/Traq/Compiler/Prelude.hs | 6 +++-- src/Traq/Primitives/Amplify/QAmplify.hs | 18 ++++++--------- src/Traq/Primitives/Class.hs | 10 ++++++-- src/Traq/Primitives/Class/Compile.hs | 4 ++-- src/Traq/Primitives/Max/QMax.hs | 19 +++++---------- src/Traq/Primitives/Search/QSearchCFNW.hs | 28 +++++++++++------------ src/Traq/Primitives/Simons/Quantum.hs | 20 ++++------------ 7 files changed, 46 insertions(+), 59 deletions(-) diff --git a/src/Traq/Compiler/Prelude.hs b/src/Traq/Compiler/Prelude.hs index 8639fc9..4ff588e 100644 --- a/src/Traq/Compiler/Prelude.hs +++ b/src/Traq/Compiler/Prelude.hs @@ -47,7 +47,7 @@ import Control.Monad.Except (MonadError (throwError)) import Control.Monad.Extra (loopM) import Control.Monad.RWS (RWST, runRWST) import Control.Monad.State (MonadState) -import Control.Monad.Writer (MonadWriter, WriterT (..), censor) +import Control.Monad.Writer (MonadWriter, WriterT (..), censor, execWriterT) import qualified Data.Map as Map import qualified Data.Set as Set import GHC.Generics (Generic) @@ -256,7 +256,9 @@ buildProcHelper :: m (CQPL.ProcDef size) buildProcHelper is_uproc proc_name_basic proc_meta_params params m = do proc_name <- newIdent proc_name_basic - ((), (local_vars, ubody, cbody)) <- runWriterT $ withSandboxOf P._typingCtx m + (local_vars, ubody, cbody) <- execWriterT $ withSandboxOf P._typingCtx $ do + P._typingCtx .= mempty + m case (ubody, cbody, is_uproc) of ([], _, False) -> diff --git a/src/Traq/Primitives/Amplify/QAmplify.hs b/src/Traq/Primitives/Amplify/QAmplify.hs index 25286f3..25bfd1d 100644 --- a/src/Traq/Primitives/Amplify/QAmplify.hs +++ b/src/Traq/Primitives/Amplify/QAmplify.hs @@ -12,7 +12,7 @@ module Traq.Primitives.Amplify.QAmplify ( _EQSearch, ) where -import Control.Monad (forM, when) +import Control.Monad (forM, replicateM, when) import Control.Monad.Trans (lift) import GHC.Generics (Generic) @@ -135,11 +135,9 @@ instance (P.EvalReqs size prec, Floating prec, Ord prec) => QuantumExpCostPrim ( instance (Floating prec, RealFrac prec) => UnitaryCompilePrim (QAmplify size prec) size prec where compileUPrim (QAmplify Amplify{p_min}) eps = do -- return vars and types - rets <- view $ to ret_vars + ret_tys <- view $ to prim_ret_types + rets <- replicateM (length ret_tys) $ Compiler.newIdent "ret" let b = head rets - ret_tys <- forM rets $ \x -> do - mty <- use $ P._typingCtx . Ctx.at x - maybeWithError "" mty -- sampler (SamplerFn call_upred) <- view $ to mk_ucall @@ -205,10 +203,9 @@ mkGroverK :: mkGroverK = do meta_k <- Compiler.newIdent "k" - rets <- view $ to ret_vars + ret_tys <- view $ to prim_ret_types + rets <- replicateM (length ret_tys) $ Compiler.newIdent "ret" let b = head rets - ret_tys <- forM rets $ \x -> - use (P._typingCtx . Ctx.at x) >>= maybeWithError "missing variable" Compiler.buildUProc "Grover" [meta_k] (zip rets ret_tys) $ do (SamplerFn mk_sampler_call) <- view $ to mk_ucall @@ -328,9 +325,8 @@ buildQAmplify n_samples rets _ret_tys eps p_min = do instance (RealFloat prec) => QuantumCompilePrim (QAmplify SizeT prec) SizeT prec where compileQPrim (QAmplify Amplify{p_min}) eps = do - rets <- view $ to ret_vars - ret_tys <- forM rets $ \x -> - use (P._typingCtx . Ctx.at x) >>= maybeWithError "missing variable" + ret_tys <- view $ to prim_ret_types + rets <- replicateM (length ret_tys) $ Compiler.newIdent "ret" Compiler.buildProc "QAmplify" [] (zip rets ret_tys) $ do buildQAmplify 0 rets ret_tys eps p_min diff --git a/src/Traq/Primitives/Class.hs b/src/Traq/Primitives/Class.hs index 8febd31..b0b522d 100644 --- a/src/Traq/Primitives/Class.hs +++ b/src/Traq/Primitives/Class.hs @@ -316,13 +316,16 @@ instance >>= maybeWithError (printf "could not find uproc `%s` for fun `%s`" uproc_name pfun_name) return $ Compiler.aux_tys sign + prim_ret_types <- forM rets $ \x -> + use (P._typingCtx . Ctx.at x) >>= maybeWithError "missing variable" + let builder = PrimCompileEnv { mk_ucall , mk_call = reshapeUnsafe $ replicate (length par_funs) (error "cannot call proc from UPrim") , mk_meas = reshapeUnsafe $ replicate (length par_funs) (error "cannot meas uproc from UPrim") , uproc_aux_types - , ret_vars = rets + , prim_ret_types } let arg_bounder = prependBoundArgs (map Compiler.mkUProcName pfun_names) bound_args prim_proc_raw <- @@ -558,13 +561,16 @@ instance , args = placeArgsWithExcess (map (fmap CQPL.Arg) pfun_args) xs } + prim_ret_types <- forM rets $ \x -> + use (P._typingCtx . Ctx.at x) >>= maybeWithError "missing variable" + let builder = PrimCompileEnv { mk_ucall , mk_call , mk_meas , uproc_aux_types - , ret_vars = rets + , prim_ret_types } let arg_bounder = prependBoundArgs diff --git a/src/Traq/Primitives/Class/Compile.hs b/src/Traq/Primitives/Class/Compile.hs index 67aa7d4..93b1ff3 100644 --- a/src/Traq/Primitives/Class/Compile.hs +++ b/src/Traq/Primitives/Class/Compile.hs @@ -41,8 +41,8 @@ data PrimCompileEnv shape size = PrimCompileEnv -- ^ helper to generate a call-and-meas to a unitary proc arg. , uproc_aux_types :: shape [P.VarType size] -- ^ auxiliary variables for each unitary function argument. - , ret_vars :: [Ident] - -- ^ return variables to store the result in. + , prim_ret_types :: [P.VarType size] + -- ^ return variables types. } reshapeBuilder :: diff --git a/src/Traq/Primitives/Max/QMax.hs b/src/Traq/Primitives/Max/QMax.hs index aef6635..7458a78 100644 --- a/src/Traq/Primitives/Max/QMax.hs +++ b/src/Traq/Primitives/Max/QMax.hs @@ -28,9 +28,6 @@ import Lens.Micro.GHC import Lens.Micro.Mtl import qualified Numeric.Algebra as Alg -import Traq.Control.Monad -import qualified Traq.Data.Context as Ctx - import qualified Traq.Analysis as A import qualified Traq.CQPL as CQPL import qualified Traq.Compiler as Compiler @@ -116,11 +113,9 @@ instance instance (P.TypingReqs size, Integral size, RealFloat prec, Show prec) => UnitaryCompilePrim (QMax size prec) size prec where compileUPrim QMax{arg_ty, res_ty} _ = do - -- Return variables and their types - (res_var, argmax_var) <- - view (to ret_vars) >>= \case - [x, y] -> pure (x, y) - _ -> throwError "typecheck failed" + -- Return variables + res_var <- Compiler.newIdent "ret" + argmax_var <- Compiler.newIdent "ret" -- Function argument: unitary call builder and aux types QMaxFunArg call_ufun <- view $ to mk_ucall @@ -188,11 +183,9 @@ instance instance (P.TypingReqs size, Integral size, RealFloat prec, Show prec, A.SizeToPrec size prec) => QuantumCompilePrim (QMax size prec) size prec where compileQPrim QMax{arg_ty, res_ty} eps = do - -- Return variables and their types - (res_var, argmax_var) <- - view (to ret_vars) >>= \case - [x, y] -> pure (x, y) - _ -> throwError "typecheck failed" + -- Return variables + res_var <- Compiler.newIdent "ret" + argmax_var <- Compiler.newIdent "ret" -- Build cmp :: (res_ty, arg_ty) -> Bool cmp <- do diff --git a/src/Traq/Primitives/Search/QSearchCFNW.hs b/src/Traq/Primitives/Search/QSearchCFNW.hs index c6ebc3f..3f5e1ca 100644 --- a/src/Traq/Primitives/Search/QSearchCFNW.hs +++ b/src/Traq/Primitives/Search/QSearchCFNW.hs @@ -376,16 +376,16 @@ instance (BooleanPredicate call_pred) <- view $ to mk_ucall (BooleanPredicate pred_aux_tys) <- view $ to uproc_aux_types + ret_tys <- view $ to prim_ret_types (ret, x_out) <- case search_kind of SearchK -> do - view (to ret_vars) >>= \case - [b, x_out] -> pure (b, x_out) - _ -> throwError "search must return (bool, T)" + when (length ret_tys /= 2) $ throwError "search must return (bool, T)" + b <- Compiler.newIdent "ret" + x_out <- Compiler.newIdent "ret" + pure (b, x_out) _ -> do - b <- - view (to ret_vars) >>= \case - [b] -> pure b - _ -> throwError "bool predicate must return single bool" + when (length ret_tys /= 1) $ throwError "bool predicate must return single bool" + b <- Compiler.newIdent "ret" x_out <- lift $ Compiler.allocAncillaWithPref "s_result" search_ty return (b, x_out) @@ -613,16 +613,16 @@ instance (BooleanPredicate call_upred) <- view $ to mk_ucall (BooleanPredicate pred_aux_tys) <- view $ to uproc_aux_types + ret_tys <- view $ to prim_ret_types (ret, x_out_param) <- case search_kind of SearchK -> do - view (to ret_vars) >>= \case - [b, x_out] -> pure (b, Just x_out) - _ -> throwError "search must return (bool, T)" + when (length ret_tys /= 2) $ throwError "search must return (bool, T)" + b <- Compiler.newIdent "ret" + x_out <- Compiler.newIdent "ret" + pure (b, Just x_out) _ -> do - b <- - view (to ret_vars) >>= \case - [b] -> pure b - _ -> throwError "bool predicate must return single bool" + when (length ret_tys /= 1) $ throwError "bool predicate must return single bool" + b <- Compiler.newIdent "ret" return (b, Nothing) -- make the Grover_k uproc diff --git a/src/Traq/Primitives/Simons/Quantum.hs b/src/Traq/Primitives/Simons/Quantum.hs index 88c7ba6..c3a8d0a 100644 --- a/src/Traq/Primitives/Simons/Quantum.hs +++ b/src/Traq/Primitives/Simons/Quantum.hs @@ -11,7 +11,7 @@ module Traq.Primitives.Simons.Quantum ( _SimonsQueries, ) where -import Control.Monad (forM) +import Control.Monad (forM, replicateM) import Control.Monad.Trans (lift) import GHC.Generics (Generic) import Text.Printf (printf) @@ -20,8 +20,6 @@ import Lens.Micro.GHC import Lens.Micro.Mtl import qualified Numeric.Algebra as Alg -import Traq.Control.Monad -import qualified Traq.Data.Context as Ctx import Traq.Data.Subtyping import qualified Traq.Analysis as A @@ -182,12 +180,8 @@ instance UnitaryCompilePrim (SimonsFindXorPeriod size prec) size prec where compileUPrim (SimonsFindXorPeriod FindXorPeriod{n, p_0}) eps = do - rets <- view $ to ret_vars - - -- arguments (types) over which we compute the period - arg_tys <- forM rets $ \x -> do - mty <- use $ P._typingCtx . Ctx.at x - maybeWithError "" mty + arg_tys <- view $ to prim_ret_types + rets <- replicateM (length arg_tys) $ Compiler.newIdent "ret" simons_uproc <- simonsOneRound arg_tys Compiler.addProc simons_uproc @@ -241,12 +235,8 @@ instance QuantumCompilePrim (SimonsFindXorPeriod size prec) size prec where compileQPrim (SimonsFindXorPeriod FindXorPeriod{n, p_0}) eps = do - rets <- view $ to ret_vars - - -- arguments (types) over which we compute the period - arg_tys <- forM rets $ \x -> do - mty <- use $ P._typingCtx . Ctx.at x - maybeWithError "" mty + arg_tys <- view $ to prim_ret_types + rets <- replicateM (length arg_tys) $ Compiler.newIdent "ret" simons_uproc <- simonsOneRound arg_tys Compiler.addProc simons_uproc From 291eb371e671f2d921b84bfc91091352a2821ad3 Mon Sep 17 00:00:00 2001 From: Anurudh Peduri Date: Tue, 24 Feb 2026 19:11:32 +0000 Subject: [PATCH 27/28] recompile --- examples/cryptanalysis/3_round_feistel.qpl | 8 +- examples/cryptanalysis/even_mansour.qpl | 8 +- examples/cryptanalysis/grover_meets_simon.qpl | 34 +-- examples/cryptanalysis/period_finding.qpl | 8 +- examples/hillclimb/max_sat_hillclimb.qpl | 26 +-- examples/hillclimb/steep_max_sat.qpl | 14 +- .../matrix_search/depth3_NAND_formula.qpl | 72 +++--- examples/matrix_search/matrix_search.qpl | 48 ++-- .../tree_generator_01_knapsack.qpl | 206 +++++++++--------- src/Traq/Primitives/Max/QMax.hs | 2 +- 10 files changed, 213 insertions(+), 213 deletions(-) diff --git a/examples/cryptanalysis/3_round_feistel.qpl b/examples/cryptanalysis/3_round_feistel.qpl index 727d006..fb8077c 100644 --- a/examples/cryptanalysis/3_round_feistel.qpl +++ b/examples/cryptanalysis/3_round_feistel.qpl @@ -82,11 +82,11 @@ uproc SimonOneRound_U(x : OUT Fin<2>, x_1 : OUT BitVec<20>, y : AUX Fin<2>, y_1 x *= Adj-Distr[uniform : Fin<2>]; } -uproc USimon(AttackThreeRoundFeistel_zero_1 : OUT Fin<2>, AttackThreeRoundFeistel_s_1 : OUT BitVec<20>, USimon_aux : AUX Arr<32, Fin<2>>, USimon_aux_1 : AUX Arr<32, BitVec<20>>, USimon_aux_2 : AUX Arr<32, Fin<2>>, USimon_aux_3 : AUX Arr<32, BitVec<20>>, USimon_aux_4 : AUX Arr<32, Fin<2>>, USimon_aux_5 : AUX Arr<32, BitVec<20>>, USimon_aux_6 : AUX Arr<32, BitVec<20>>, USimon_aux_7 : AUX Arr<32, BitVec<20>>, USimon_aux_8 : AUX Arr<32, BitVec<20>>, USimon_aux_9 : AUX Arr<32, BitVec<20>>, USimon_aux_10 : AUX Arr<32, BitVec<20>>, USimon_aux_11 : AUX Arr<32, BitVec<20>>, USimon_aux_12 : AUX Arr<32, BitVec<20>>, USimon_aux_13 : AUX Arr<32, BitVec<20>>, USimon_aux_14 : AUX Arr<32, BitVec<20>>, USimon_aux_15 : AUX Arr<32, BitVec<20>>, USimon_aux_16 : AUX Arr<32, BitVec<20>>, USimon_aux_17 : AUX Arr<32, BitVec<20>>, USimon_aux_18 : AUX Arr<32, BitVec<20>>, USimon_aux_19 : AUX Arr<32, BitVec<20>>, USimon_aux_20 : AUX Arr<32, BitVec<20>>, USimon_aux_21 : AUX Arr<32, BitVec<20>>, USimon_aux_22 : AUX Arr<32, BitVec<20>>, USimon_aux_23 : AUX Arr<32, BitVec<20>>, USimon_aux_24 : AUX Arr<32, BitVec<20>>, USimon_aux_25 : AUX Arr<32, BitVec<20>>, USimon_aux_26 : AUX Arr<32, BitVec<20>>, USimon_aux_27 : AUX Arr<32, BitVec<20>>, USimon_aux_28 : AUX Arr<32, BitVec<20>>, USimon_aux_29 : AUX Arr<32, BitVec<20>>, USimon_aux_30 : AUX Arr<32, BitVec<20>>, USimon_aux_31 : AUX Arr<32, BitVec<20>>, USimon_aux_32 : AUX Arr<32, BitVec<20>>, USimon_aux_33 : AUX Arr<32, Fin<2>>) { +uproc USimon(ret : OUT Fin<2>, ret_1 : OUT BitVec<20>, USimon_aux : AUX Arr<32, Fin<2>>, USimon_aux_1 : AUX Arr<32, BitVec<20>>, USimon_aux_2 : AUX Arr<32, Fin<2>>, USimon_aux_3 : AUX Arr<32, BitVec<20>>, USimon_aux_4 : AUX Arr<32, Fin<2>>, USimon_aux_5 : AUX Arr<32, BitVec<20>>, USimon_aux_6 : AUX Arr<32, BitVec<20>>, USimon_aux_7 : AUX Arr<32, BitVec<20>>, USimon_aux_8 : AUX Arr<32, BitVec<20>>, USimon_aux_9 : AUX Arr<32, BitVec<20>>, USimon_aux_10 : AUX Arr<32, BitVec<20>>, USimon_aux_11 : AUX Arr<32, BitVec<20>>, USimon_aux_12 : AUX Arr<32, BitVec<20>>, USimon_aux_13 : AUX Arr<32, BitVec<20>>, USimon_aux_14 : AUX Arr<32, BitVec<20>>, USimon_aux_15 : AUX Arr<32, BitVec<20>>, USimon_aux_16 : AUX Arr<32, BitVec<20>>, USimon_aux_17 : AUX Arr<32, BitVec<20>>, USimon_aux_18 : AUX Arr<32, BitVec<20>>, USimon_aux_19 : AUX Arr<32, BitVec<20>>, USimon_aux_20 : AUX Arr<32, BitVec<20>>, USimon_aux_21 : AUX Arr<32, BitVec<20>>, USimon_aux_22 : AUX Arr<32, BitVec<20>>, USimon_aux_23 : AUX Arr<32, BitVec<20>>, USimon_aux_24 : AUX Arr<32, BitVec<20>>, USimon_aux_25 : AUX Arr<32, BitVec<20>>, USimon_aux_26 : AUX Arr<32, BitVec<20>>, USimon_aux_27 : AUX Arr<32, BitVec<20>>, USimon_aux_28 : AUX Arr<32, BitVec<20>>, USimon_aux_29 : AUX Arr<32, BitVec<20>>, USimon_aux_30 : AUX Arr<32, BitVec<20>>, USimon_aux_31 : AUX Arr<32, BitVec<20>>, USimon_aux_32 : AUX Arr<32, BitVec<20>>, USimon_aux_33 : AUX Arr<32, Fin<2>>) { for (#i in 0 .. < 32) { call SimonOneRound_U(USimon_aux[#i], USimon_aux_1[#i], USimon_aux_2[#i], USimon_aux_3[#i], USimon_aux_4[#i], USimon_aux_5[#i], USimon_aux_6[#i], USimon_aux_7[#i], USimon_aux_8[#i], USimon_aux_9[#i], USimon_aux_10[#i], USimon_aux_11[#i], USimon_aux_12[#i], USimon_aux_13[#i], USimon_aux_14[#i], USimon_aux_15[#i], USimon_aux_16[#i], USimon_aux_17[#i], USimon_aux_18[#i], USimon_aux_19[#i], USimon_aux_20[#i], USimon_aux_21[#i], USimon_aux_22[#i], USimon_aux_23[#i], USimon_aux_24[#i], USimon_aux_25[#i], USimon_aux_26[#i], USimon_aux_27[#i], USimon_aux_28[#i], USimon_aux_29[#i], USimon_aux_30[#i], USimon_aux_31[#i], USimon_aux_32[#i], USimon_aux_33[#i]); } - // simon's post-processing: unitarily solve linear system: (AttackThreeRoundFeistel_zero_1, AttackThreeRoundFeistel_s_1) . (USimon_aux, USimon_aux_1) = 0 + // simon's post-processing: unitarily solve linear system: (ret, ret_1) . (USimon_aux, USimon_aux_1) = 0 } uproc AttackThreeRoundFeistel_U(AttackThreeRoundFeistel_s : OUT BitVec<20>, AttackThreeRoundFeistel_zero : AUX Fin<2>, AttackThreeRoundFeistel_zero_1 : AUX Fin<2>, AttackThreeRoundFeistel_s_1 : AUX BitVec<20>, x : AUX Fin<2>, x_1 : AUX BitVec<20>, y : AUX Fin<2>, y_1 : AUX BitVec<20>, yy : AUX Fin<2>, yy_1 : AUX BitVec<20>, aux_20 : AUX BitVec<20>, aux_21 : AUX BitVec<20>, aux_22 : AUX BitVec<20>, aux_23 : AUX BitVec<20>, aux_24 : AUX BitVec<20>, aux_25 : AUX BitVec<20>, aux_26 : AUX BitVec<20>, aux_27 : AUX BitVec<20>, aux_28 : AUX BitVec<20>, aux_29 : AUX BitVec<20>, aux_30 : AUX BitVec<20>, aux_31 : AUX BitVec<20>, aux_32 : AUX BitVec<20>, aux_33 : AUX BitVec<20>, aux_34 : AUX BitVec<20>, aux_35 : AUX BitVec<20>, aux_36 : AUX BitVec<20>, aux_37 : AUX BitVec<20>, aux_38 : AUX BitVec<20>, aux_39 : AUX BitVec<20>, aux_40 : AUX BitVec<20>, aux_41 : AUX BitVec<20>, aux_42 : AUX BitVec<20>, aux_43 : AUX BitVec<20>, aux_44 : AUX BitVec<20>, aux_45 : AUX BitVec<20>, aux_46 : AUX BitVec<20>, aux_47 : AUX Fin<2>, USimon_aux : AUX Arr<32, Fin<2>>, USimon_aux_1 : AUX Arr<32, BitVec<20>>, USimon_aux_2 : AUX Arr<32, Fin<2>>, USimon_aux_3 : AUX Arr<32, BitVec<20>>, USimon_aux_4 : AUX Arr<32, Fin<2>>, USimon_aux_5 : AUX Arr<32, BitVec<20>>, USimon_aux_6 : AUX Arr<32, BitVec<20>>, USimon_aux_7 : AUX Arr<32, BitVec<20>>, USimon_aux_8 : AUX Arr<32, BitVec<20>>, USimon_aux_9 : AUX Arr<32, BitVec<20>>, USimon_aux_10 : AUX Arr<32, BitVec<20>>, USimon_aux_11 : AUX Arr<32, BitVec<20>>, USimon_aux_12 : AUX Arr<32, BitVec<20>>, USimon_aux_13 : AUX Arr<32, BitVec<20>>, USimon_aux_14 : AUX Arr<32, BitVec<20>>, USimon_aux_15 : AUX Arr<32, BitVec<20>>, USimon_aux_16 : AUX Arr<32, BitVec<20>>, USimon_aux_17 : AUX Arr<32, BitVec<20>>, USimon_aux_18 : AUX Arr<32, BitVec<20>>, USimon_aux_19 : AUX Arr<32, BitVec<20>>, USimon_aux_20 : AUX Arr<32, BitVec<20>>, USimon_aux_21 : AUX Arr<32, BitVec<20>>, USimon_aux_22 : AUX Arr<32, BitVec<20>>, USimon_aux_23 : AUX Arr<32, BitVec<20>>, USimon_aux_24 : AUX Arr<32, BitVec<20>>, USimon_aux_25 : AUX Arr<32, BitVec<20>>, USimon_aux_26 : AUX Arr<32, BitVec<20>>, USimon_aux_27 : AUX Arr<32, BitVec<20>>, USimon_aux_28 : AUX Arr<32, BitVec<20>>, USimon_aux_29 : AUX Arr<32, BitVec<20>>, USimon_aux_30 : AUX Arr<32, BitVec<20>>, USimon_aux_31 : AUX Arr<32, BitVec<20>>, USimon_aux_32 : AUX Arr<32, BitVec<20>>, USimon_aux_33 : AUX Arr<32, Fin<2>>, aux_prim : AUX Arr<32, Fin<2>>, aux_prim_1 : AUX Arr<32, BitVec<20>>, aux_prim_2 : AUX Arr<32, Fin<2>>, aux_prim_3 : AUX Arr<32, BitVec<20>>, aux_prim_4 : AUX Arr<32, Fin<2>>, aux_prim_5 : AUX Arr<32, BitVec<20>>, aux_prim_6 : AUX Arr<32, BitVec<20>>, aux_prim_7 : AUX Arr<32, BitVec<20>>, aux_prim_8 : AUX Arr<32, BitVec<20>>, aux_prim_9 : AUX Arr<32, BitVec<20>>, aux_prim_10 : AUX Arr<32, BitVec<20>>, aux_prim_11 : AUX Arr<32, BitVec<20>>, aux_prim_12 : AUX Arr<32, BitVec<20>>, aux_prim_13 : AUX Arr<32, BitVec<20>>, aux_prim_14 : AUX Arr<32, BitVec<20>>, aux_prim_15 : AUX Arr<32, BitVec<20>>, aux_prim_16 : AUX Arr<32, BitVec<20>>, aux_prim_17 : AUX Arr<32, BitVec<20>>, aux_prim_18 : AUX Arr<32, BitVec<20>>, aux_prim_19 : AUX Arr<32, BitVec<20>>, aux_prim_20 : AUX Arr<32, BitVec<20>>, aux_prim_21 : AUX Arr<32, BitVec<20>>, aux_prim_22 : AUX Arr<32, BitVec<20>>, aux_prim_23 : AUX Arr<32, BitVec<20>>, aux_prim_24 : AUX Arr<32, BitVec<20>>, aux_prim_25 : AUX Arr<32, BitVec<20>>, aux_prim_26 : AUX Arr<32, BitVec<20>>, aux_prim_27 : AUX Arr<32, BitVec<20>>, aux_prim_28 : AUX Arr<32, BitVec<20>>, aux_prim_29 : AUX Arr<32, BitVec<20>>, aux_prim_30 : AUX Arr<32, BitVec<20>>, aux_prim_31 : AUX Arr<32, BitVec<20>>, aux_prim_32 : AUX Arr<32, BitVec<20>>, aux_prim_33 : AUX Arr<32, Fin<2>>) { @@ -105,11 +105,11 @@ uproc SimonOneRound_U_1(x_2 : OUT Fin<2>, x_3 : OUT BitVec<20>, y_2 : AUX Fin<2> x_2 *= Adj-Distr[uniform : Fin<2>]; } -proc QSimon(AttackThreeRoundFeistel_zero : Fin<2>, AttackThreeRoundFeistel_s : BitVec<20>) { locals : (QSimon__u : Arr<32, Fin<2>>, QSimon__u_1 : Arr<32, BitVec<20>>) } { +proc QSimon(ret_2 : Fin<2>, ret_3 : BitVec<20>) { locals : (QSimon__u : Arr<32, Fin<2>>, QSimon__u_1 : Arr<32, BitVec<20>>) } { for (#i_1 in 0 .. < 32) { meas SimonOneRound_U_1(QSimon__u[#i_1], QSimon__u_1[#i_1]); } - // simon's post-processing: solve linear system: (AttackThreeRoundFeistel_zero, AttackThreeRoundFeistel_s) . (QSimon__u, QSimon__u_1) = 0 + // simon's post-processing: solve linear system: (ret_2, ret_3) . (QSimon__u, QSimon__u_1) = 0 } proc AttackThreeRoundFeistel(AttackThreeRoundFeistel_s : BitVec<20>) { locals : (AttackThreeRoundFeistel_zero : Fin<2>, x_2 : Fin<2>, x_3 : BitVec<20>, y_2 : Fin<2>, y_3 : BitVec<20>, yy_2 : Fin<2>, yy_3 : BitVec<20>, aux_48 : BitVec<20>, aux_49 : BitVec<20>, aux_50 : BitVec<20>, aux_51 : BitVec<20>, aux_52 : BitVec<20>, aux_53 : BitVec<20>, aux_54 : BitVec<20>, aux_55 : BitVec<20>, aux_56 : BitVec<20>, aux_57 : BitVec<20>, aux_58 : BitVec<20>, aux_59 : BitVec<20>, aux_60 : BitVec<20>, aux_61 : BitVec<20>, aux_62 : BitVec<20>, aux_63 : BitVec<20>, aux_64 : BitVec<20>, aux_65 : BitVec<20>, aux_66 : BitVec<20>, aux_67 : BitVec<20>, aux_68 : BitVec<20>, aux_69 : BitVec<20>, aux_70 : BitVec<20>, aux_71 : BitVec<20>, aux_72 : BitVec<20>, aux_73 : BitVec<20>, aux_74 : BitVec<20>, aux_75 : Fin<2>, QSimon__u : Arr<32, Fin<2>>, QSimon__u_1 : Arr<32, BitVec<20>>) } { diff --git a/examples/cryptanalysis/even_mansour.qpl b/examples/cryptanalysis/even_mansour.qpl index d5dd02e..7b81f89 100644 --- a/examples/cryptanalysis/even_mansour.qpl +++ b/examples/cryptanalysis/even_mansour.qpl @@ -29,11 +29,11 @@ uproc SimonOneRound_U(x_1 : OUT BitVec<20>, y : AUX BitVec<20>, yy : AUX BitVec< x_1 *= Adj-Distr[uniform : BitVec<20>]; } -uproc USimon(k1_1 : OUT BitVec<20>, USimon_aux : AUX Arr<31, BitVec<20>>, USimon_aux_1 : AUX Arr<31, BitVec<20>>, USimon_aux_2 : AUX Arr<31, BitVec<20>>, USimon_aux_3 : AUX Arr<31, BitVec<20>>, USimon_aux_4 : AUX Arr<31, BitVec<20>>, USimon_aux_5 : AUX Arr<31, BitVec<20>>, USimon_aux_6 : AUX Arr<31, BitVec<20>>, USimon_aux_7 : AUX Arr<31, BitVec<20>>) { +uproc USimon(ret : OUT BitVec<20>, USimon_aux : AUX Arr<31, BitVec<20>>, USimon_aux_1 : AUX Arr<31, BitVec<20>>, USimon_aux_2 : AUX Arr<31, BitVec<20>>, USimon_aux_3 : AUX Arr<31, BitVec<20>>, USimon_aux_4 : AUX Arr<31, BitVec<20>>, USimon_aux_5 : AUX Arr<31, BitVec<20>>, USimon_aux_6 : AUX Arr<31, BitVec<20>>, USimon_aux_7 : AUX Arr<31, BitVec<20>>) { for (#i in 0 .. < 31) { call SimonOneRound_U(USimon_aux[#i], USimon_aux_1[#i], USimon_aux_2[#i], USimon_aux_3[#i], USimon_aux_4[#i], USimon_aux_5[#i], USimon_aux_6[#i], USimon_aux_7[#i]); } - // simon's post-processing: unitarily solve linear system: (k1_1) . (USimon_aux) = 0 + // simon's post-processing: unitarily solve linear system: (ret) . (USimon_aux) = 0 } uproc BreakEM_U(k1 : OUT BitVec<20>, k2 : OUT BitVec<20>, ze : AUX BitVec<20>, e_0 : AUX BitVec<20>, p_k1 : AUX BitVec<20>, ze_1 : AUX BitVec<20>, k1_1 : AUX BitVec<20>, x_1 : AUX BitVec<20>, y : AUX BitVec<20>, yy : AUX BitVec<20>, aux : AUX BitVec<20>, aux_1 : AUX BitVec<20>, aux_2 : AUX BitVec<20>, aux_3 : AUX BitVec<20>, aux_4 : AUX BitVec<20>, USimon_aux : AUX Arr<31, BitVec<20>>, USimon_aux_1 : AUX Arr<31, BitVec<20>>, USimon_aux_2 : AUX Arr<31, BitVec<20>>, USimon_aux_3 : AUX Arr<31, BitVec<20>>, USimon_aux_4 : AUX Arr<31, BitVec<20>>, USimon_aux_5 : AUX Arr<31, BitVec<20>>, USimon_aux_6 : AUX Arr<31, BitVec<20>>, USimon_aux_7 : AUX Arr<31, BitVec<20>>, aux_prim : AUX Arr<31, BitVec<20>>, aux_prim_1 : AUX Arr<31, BitVec<20>>, aux_prim_2 : AUX Arr<31, BitVec<20>>, aux_prim_3 : AUX Arr<31, BitVec<20>>, aux_prim_4 : AUX Arr<31, BitVec<20>>, aux_prim_5 : AUX Arr<31, BitVec<20>>, aux_prim_6 : AUX Arr<31, BitVec<20>>, aux_prim_7 : AUX Arr<31, BitVec<20>>, e_0_1 : AUX BitVec<20>, p_k1_1 : AUX BitVec<20>, k2_1 : AUX BitVec<20>) { @@ -57,11 +57,11 @@ uproc SimonOneRound_U_1(x_2 : OUT BitVec<20>, y_1 : AUX BitVec<20>, yy_1 : AUX B x_2 *= Adj-Distr[uniform : BitVec<20>]; } -proc QSimon(k1 : BitVec<20>) { locals : (QSimon__u : Arr<31, BitVec<20>>) } { +proc QSimon(ret_1 : BitVec<20>) { locals : (QSimon__u : Arr<31, BitVec<20>>) } { for (#i_1 in 0 .. < 31) { meas SimonOneRound_U_1(QSimon__u[#i_1]); } - // simon's post-processing: solve linear system: (k1) . (QSimon__u) = 0 + // simon's post-processing: solve linear system: (ret_1) . (QSimon__u) = 0 } proc BreakEM(k1 : BitVec<20>, k2 : BitVec<20>) { locals : (ze : BitVec<20>, e_0 : BitVec<20>, p_k1 : BitVec<20>, x_2 : BitVec<20>, y_1 : BitVec<20>, yy_1 : BitVec<20>, aux_5 : BitVec<20>, aux_6 : BitVec<20>, aux_7 : BitVec<20>, aux_8 : BitVec<20>, aux_9 : BitVec<20>, QSimon__u : Arr<31, BitVec<20>>) } { diff --git a/examples/cryptanalysis/grover_meets_simon.qpl b/examples/cryptanalysis/grover_meets_simon.qpl index ab32ccd..bdea4f9 100644 --- a/examples/cryptanalysis/grover_meets_simon.qpl +++ b/examples/cryptanalysis/grover_meets_simon.qpl @@ -33,11 +33,11 @@ uproc SimonOneRound_U(innerAttack_k : BitVec<20>, x : OUT BitVec<20>, y : AUX Bi x *= Adj-Distr[uniform : BitVec<20>]; } -uproc USimon(innerAttack_k : BitVec<20>, innerAttack_k1_1 : OUT BitVec<20>, USimon_aux : AUX Arr<79, BitVec<20>>, USimon_aux_1 : AUX Arr<79, BitVec<20>>, USimon_aux_2 : AUX Arr<79, BitVec<20>>, USimon_aux_3 : AUX Arr<79, BitVec<20>>, USimon_aux_4 : AUX Arr<79, BitVec<20>>, USimon_aux_5 : AUX Arr<79, BitVec<20>>, USimon_aux_6 : AUX Arr<79, BitVec<20>>, USimon_aux_7 : AUX Arr<79, BitVec<20>>) { +uproc USimon(innerAttack_k : BitVec<20>, ret : OUT BitVec<20>, USimon_aux : AUX Arr<79, BitVec<20>>, USimon_aux_1 : AUX Arr<79, BitVec<20>>, USimon_aux_2 : AUX Arr<79, BitVec<20>>, USimon_aux_3 : AUX Arr<79, BitVec<20>>, USimon_aux_4 : AUX Arr<79, BitVec<20>>, USimon_aux_5 : AUX Arr<79, BitVec<20>>, USimon_aux_6 : AUX Arr<79, BitVec<20>>, USimon_aux_7 : AUX Arr<79, BitVec<20>>) { for (#i in 0 .. < 79) { call SimonOneRound_U(innerAttack_k, USimon_aux[#i], USimon_aux_1[#i], USimon_aux_2[#i], USimon_aux_3[#i], USimon_aux_4[#i], USimon_aux_5[#i], USimon_aux_6[#i], USimon_aux_7[#i]); } - // simon's post-processing: unitarily solve linear system: (innerAttack_k1_1) . (USimon_aux) = 0 + // simon's post-processing: unitarily solve linear system: (ret) . (USimon_aux) = 0 } uproc innerAttack_U(innerAttack_k : IN BitVec<20>, innerAttack_res : OUT Fin<2>, innerAttack_k1 : AUX BitVec<20>, innerAttack_k1_1 : AUX BitVec<20>, x : AUX BitVec<20>, y : AUX BitVec<20>, yy : AUX BitVec<20>, aux : AUX BitVec<20>, aux_1 : AUX BitVec<20>, aux_2 : AUX BitVec<20>, aux_3 : AUX BitVec<20>, aux_4 : AUX BitVec<20>, USimon_aux : AUX Arr<79, BitVec<20>>, USimon_aux_1 : AUX Arr<79, BitVec<20>>, USimon_aux_2 : AUX Arr<79, BitVec<20>>, USimon_aux_3 : AUX Arr<79, BitVec<20>>, USimon_aux_4 : AUX Arr<79, BitVec<20>>, USimon_aux_5 : AUX Arr<79, BitVec<20>>, USimon_aux_6 : AUX Arr<79, BitVec<20>>, USimon_aux_7 : AUX Arr<79, BitVec<20>>, aux_prim : AUX Arr<79, BitVec<20>>, aux_prim_1 : AUX Arr<79, BitVec<20>>, aux_prim_2 : AUX Arr<79, BitVec<20>>, aux_prim_3 : AUX Arr<79, BitVec<20>>, aux_prim_4 : AUX Arr<79, BitVec<20>>, aux_prim_5 : AUX Arr<79, BitVec<20>>, aux_prim_6 : AUX Arr<79, BitVec<20>>, aux_prim_7 : AUX Arr<79, BitVec<20>>, innerAttack_res_1 : AUX Fin<2>) { @@ -55,11 +55,11 @@ uproc SimonOneRound_U_1(innerAttack_k : BitVec<20>, x_1 : OUT BitVec<20>, y_1 : x_1 *= Adj-Distr[uniform : BitVec<20>]; } -proc QSimon(innerAttack_k : BitVec<20>, innerAttack_k1 : BitVec<20>) { locals : (QSimon__u : Arr<79, BitVec<20>>) } { +proc QSimon(innerAttack_k : BitVec<20>, ret_1 : BitVec<20>) { locals : (QSimon__u : Arr<79, BitVec<20>>) } { for (#i_1 in 0 .. < 79) { meas SimonOneRound_U_1(QSimon__u[#i_1]); } - // simon's post-processing: solve linear system: (innerAttack_k1) . (QSimon__u) = 0 + // simon's post-processing: solve linear system: (ret_1) . (QSimon__u) = 0 } proc innerAttack(innerAttack_k : BitVec<20>, innerAttack_res : Fin<2>) { locals : (innerAttack_k1 : BitVec<20>, x_1 : BitVec<20>, y_1 : BitVec<20>, yy_1 : BitVec<20>, aux_5 : BitVec<20>, aux_6 : BitVec<20>, aux_7 : BitVec<20>, aux_8 : BitVec<20>, aux_9 : BitVec<20>, QSimon__u : Arr<79, BitVec<20>>) } { @@ -68,7 +68,7 @@ proc innerAttack(innerAttack_k : BitVec<20>, innerAttack_res : Fin<2>) { locals } // USearch[Bitvec 20, 5.0e-4] -uproc USearch(outerAttack_ok_1 : OUT Fin<2>, outerAttack_k0_1 : OUT BitVec<20>, aux_10 : AUX BitVec<20>, aux_11 : AUX BitVec<20>, aux_12 : AUX BitVec<20>, aux_13 : AUX BitVec<20>, aux_14 : AUX BitVec<20>, aux_15 : AUX BitVec<20>, aux_16 : AUX BitVec<20>, aux_17 : AUX BitVec<20>, aux_18 : AUX BitVec<20>, aux_19 : AUX BitVec<20>, aux_20 : AUX Arr<79, BitVec<20>>, aux_21 : AUX Arr<79, BitVec<20>>, aux_22 : AUX Arr<79, BitVec<20>>, aux_23 : AUX Arr<79, BitVec<20>>, aux_24 : AUX Arr<79, BitVec<20>>, aux_25 : AUX Arr<79, BitVec<20>>, aux_26 : AUX Arr<79, BitVec<20>>, aux_27 : AUX Arr<79, BitVec<20>>, aux_28 : AUX Arr<79, BitVec<20>>, aux_29 : AUX Arr<79, BitVec<20>>, aux_30 : AUX Arr<79, BitVec<20>>, aux_31 : AUX Arr<79, BitVec<20>>, aux_32 : AUX Arr<79, BitVec<20>>, aux_33 : AUX Arr<79, BitVec<20>>, aux_34 : AUX Arr<79, BitVec<20>>, aux_35 : AUX Arr<79, BitVec<20>>, aux_36 : AUX Fin<2>, aux_37 : AUX Fin<2>, ctrl : AUX Arr<16, Fin<2>>, pred_out : AUX Arr<16, Fin<2>>, n_iter : AUX Arr<16, Fin<805>>, s_arg : AUX Arr<16, BitVec<20>>) { +uproc USearch(ret_2 : OUT Fin<2>, ret_3 : OUT BitVec<20>, aux_10 : AUX BitVec<20>, aux_11 : AUX BitVec<20>, aux_12 : AUX BitVec<20>, aux_13 : AUX BitVec<20>, aux_14 : AUX BitVec<20>, aux_15 : AUX BitVec<20>, aux_16 : AUX BitVec<20>, aux_17 : AUX BitVec<20>, aux_18 : AUX BitVec<20>, aux_19 : AUX BitVec<20>, aux_20 : AUX Arr<79, BitVec<20>>, aux_21 : AUX Arr<79, BitVec<20>>, aux_22 : AUX Arr<79, BitVec<20>>, aux_23 : AUX Arr<79, BitVec<20>>, aux_24 : AUX Arr<79, BitVec<20>>, aux_25 : AUX Arr<79, BitVec<20>>, aux_26 : AUX Arr<79, BitVec<20>>, aux_27 : AUX Arr<79, BitVec<20>>, aux_28 : AUX Arr<79, BitVec<20>>, aux_29 : AUX Arr<79, BitVec<20>>, aux_30 : AUX Arr<79, BitVec<20>>, aux_31 : AUX Arr<79, BitVec<20>>, aux_32 : AUX Arr<79, BitVec<20>>, aux_33 : AUX Arr<79, BitVec<20>>, aux_34 : AUX Arr<79, BitVec<20>>, aux_35 : AUX Arr<79, BitVec<20>>, aux_36 : AUX Fin<2>, aux_37 : AUX Fin<2>, ctrl : AUX Arr<16, Fin<2>>, pred_out : AUX Arr<16, Fin<2>>, n_iter : AUX Arr<16, Fin<805>>, s_arg : AUX Arr<16, BitVec<20>>) { for (#run_ix in 0 .. < 16) { n_iter[#run_ix] *= Distr[uniform : Fin<805>]; pred_out[#run_ix] *= X; @@ -93,8 +93,8 @@ uproc USearch(outerAttack_ok_1 : OUT Fin<2>, outerAttack_k0_1 : OUT BitVec<20>, call-adj innerAttack_U(s_arg[#run_ix], aux_37, aux_10, aux_11, aux_12, aux_13, aux_14, aux_15, aux_16, aux_17, aux_18, aux_19, aux_20, aux_21, aux_22, aux_23, aux_24, aux_25, aux_26, aux_27, aux_28, aux_29, aux_30, aux_31, aux_32, aux_33, aux_34, aux_35, aux_36); ctrl[#run_ix] *= X; } - pred_out, outerAttack_ok_1 *= Embed[(a) => multi_or a]; - s_arg, pred_out, outerAttack_k0_1 *= Embed[(a, f) => (a selectOn f)]; + pred_out, ret_2 *= Embed[(a) => multi_or a]; + s_arg, pred_out, ret_3 *= Embed[(a, f) => (a selectOn f)]; } uproc outerAttack_U(outerAttack_k0 : OUT BitVec<20>, outerAttack_ok : AUX Fin<2>, outerAttack_ok_1 : AUX Fin<2>, outerAttack_k0_1 : AUX BitVec<20>, aux_10 : AUX BitVec<20>, aux_11 : AUX BitVec<20>, aux_12 : AUX BitVec<20>, aux_13 : AUX BitVec<20>, aux_14 : AUX BitVec<20>, aux_15 : AUX BitVec<20>, aux_16 : AUX BitVec<20>, aux_17 : AUX BitVec<20>, aux_18 : AUX BitVec<20>, aux_19 : AUX BitVec<20>, aux_20 : AUX Arr<79, BitVec<20>>, aux_21 : AUX Arr<79, BitVec<20>>, aux_22 : AUX Arr<79, BitVec<20>>, aux_23 : AUX Arr<79, BitVec<20>>, aux_24 : AUX Arr<79, BitVec<20>>, aux_25 : AUX Arr<79, BitVec<20>>, aux_26 : AUX Arr<79, BitVec<20>>, aux_27 : AUX Arr<79, BitVec<20>>, aux_28 : AUX Arr<79, BitVec<20>>, aux_29 : AUX Arr<79, BitVec<20>>, aux_30 : AUX Arr<79, BitVec<20>>, aux_31 : AUX Arr<79, BitVec<20>>, aux_32 : AUX Arr<79, BitVec<20>>, aux_33 : AUX Arr<79, BitVec<20>>, aux_34 : AUX Arr<79, BitVec<20>>, aux_35 : AUX Arr<79, BitVec<20>>, aux_36 : AUX Fin<2>, aux_37 : AUX Fin<2>, ctrl : AUX Arr<16, Fin<2>>, pred_out : AUX Arr<16, Fin<2>>, n_iter : AUX Arr<16, Fin<805>>, s_arg : AUX Arr<16, BitVec<20>>, aux_prim_8 : AUX BitVec<20>, aux_prim_9 : AUX BitVec<20>, aux_prim_10 : AUX BitVec<20>, aux_prim_11 : AUX BitVec<20>, aux_prim_12 : AUX BitVec<20>, aux_prim_13 : AUX BitVec<20>, aux_prim_14 : AUX BitVec<20>, aux_prim_15 : AUX BitVec<20>, aux_prim_16 : AUX BitVec<20>, aux_prim_17 : AUX BitVec<20>, aux_prim_18 : AUX Arr<79, BitVec<20>>, aux_prim_19 : AUX Arr<79, BitVec<20>>, aux_prim_20 : AUX Arr<79, BitVec<20>>, aux_prim_21 : AUX Arr<79, BitVec<20>>, aux_prim_22 : AUX Arr<79, BitVec<20>>, aux_prim_23 : AUX Arr<79, BitVec<20>>, aux_prim_24 : AUX Arr<79, BitVec<20>>, aux_prim_25 : AUX Arr<79, BitVec<20>>, aux_prim_26 : AUX Arr<79, BitVec<20>>, aux_prim_27 : AUX Arr<79, BitVec<20>>, aux_prim_28 : AUX Arr<79, BitVec<20>>, aux_prim_29 : AUX Arr<79, BitVec<20>>, aux_prim_30 : AUX Arr<79, BitVec<20>>, aux_prim_31 : AUX Arr<79, BitVec<20>>, aux_prim_32 : AUX Arr<79, BitVec<20>>, aux_prim_33 : AUX Arr<79, BitVec<20>>, aux_prim_34 : AUX Fin<2>, aux_prim_35 : AUX Fin<2>, aux_prim_36 : AUX Arr<16, Fin<2>>, aux_prim_37 : AUX Arr<16, Fin<2>>, aux_prim_38 : AUX Arr<16, Fin<805>>, aux_prim_39 : AUX Arr<16, BitVec<20>>) { @@ -103,21 +103,21 @@ uproc outerAttack_U(outerAttack_k0 : OUT BitVec<20>, outerAttack_ok : AUX Fin<2> } // Grover[...] -uproc Grover[k](x_2 : IN BitVec<20>, outerAttack_ok : OUT Fin<2>, aux_38 : AUX BitVec<20>, aux_39 : AUX BitVec<20>, aux_40 : AUX BitVec<20>, aux_41 : AUX BitVec<20>, aux_42 : AUX BitVec<20>, aux_43 : AUX BitVec<20>, aux_44 : AUX BitVec<20>, aux_45 : AUX BitVec<20>, aux_46 : AUX BitVec<20>, aux_47 : AUX BitVec<20>, aux_48 : AUX Arr<79, BitVec<20>>, aux_49 : AUX Arr<79, BitVec<20>>, aux_50 : AUX Arr<79, BitVec<20>>, aux_51 : AUX Arr<79, BitVec<20>>, aux_52 : AUX Arr<79, BitVec<20>>, aux_53 : AUX Arr<79, BitVec<20>>, aux_54 : AUX Arr<79, BitVec<20>>, aux_55 : AUX Arr<79, BitVec<20>>, aux_56 : AUX Arr<79, BitVec<20>>, aux_57 : AUX Arr<79, BitVec<20>>, aux_58 : AUX Arr<79, BitVec<20>>, aux_59 : AUX Arr<79, BitVec<20>>, aux_60 : AUX Arr<79, BitVec<20>>, aux_61 : AUX Arr<79, BitVec<20>>, aux_62 : AUX Arr<79, BitVec<20>>, aux_63 : AUX Arr<79, BitVec<20>>, aux_64 : AUX Fin<2>) { - outerAttack_ok *= X; - outerAttack_ok *= H; +uproc Grover[k](x_2 : IN BitVec<20>, ret_4 : OUT Fin<2>, aux_38 : AUX BitVec<20>, aux_39 : AUX BitVec<20>, aux_40 : AUX BitVec<20>, aux_41 : AUX BitVec<20>, aux_42 : AUX BitVec<20>, aux_43 : AUX BitVec<20>, aux_44 : AUX BitVec<20>, aux_45 : AUX BitVec<20>, aux_46 : AUX BitVec<20>, aux_47 : AUX BitVec<20>, aux_48 : AUX Arr<79, BitVec<20>>, aux_49 : AUX Arr<79, BitVec<20>>, aux_50 : AUX Arr<79, BitVec<20>>, aux_51 : AUX Arr<79, BitVec<20>>, aux_52 : AUX Arr<79, BitVec<20>>, aux_53 : AUX Arr<79, BitVec<20>>, aux_54 : AUX Arr<79, BitVec<20>>, aux_55 : AUX Arr<79, BitVec<20>>, aux_56 : AUX Arr<79, BitVec<20>>, aux_57 : AUX Arr<79, BitVec<20>>, aux_58 : AUX Arr<79, BitVec<20>>, aux_59 : AUX Arr<79, BitVec<20>>, aux_60 : AUX Arr<79, BitVec<20>>, aux_61 : AUX Arr<79, BitVec<20>>, aux_62 : AUX Arr<79, BitVec<20>>, aux_63 : AUX Arr<79, BitVec<20>>, aux_64 : AUX Fin<2>) { + ret_4 *= X; + ret_4 *= H; x_2 *= Distr[uniform : BitVec<20>]; repeat (#k) { - call innerAttack_U(x_2, outerAttack_ok, aux_38, aux_39, aux_40, aux_41, aux_42, aux_43, aux_44, aux_45, aux_46, aux_47, aux_48, aux_49, aux_50, aux_51, aux_52, aux_53, aux_54, aux_55, aux_56, aux_57, aux_58, aux_59, aux_60, aux_61, aux_62, aux_63, aux_64); + call innerAttack_U(x_2, ret_4, aux_38, aux_39, aux_40, aux_41, aux_42, aux_43, aux_44, aux_45, aux_46, aux_47, aux_48, aux_49, aux_50, aux_51, aux_52, aux_53, aux_54, aux_55, aux_56, aux_57, aux_58, aux_59, aux_60, aux_61, aux_62, aux_63, aux_64); x_2 *= Adj-Distr[uniform : BitVec<20>]; x_2 *= PhaseOnZero(3.141592653589793); x_2 *= Distr[uniform : BitVec<20>]; } - outerAttack_ok *= H; - outerAttack_ok *= X; + ret_4 *= H; + ret_4 *= X; } -proc QSearch(outerAttack_ok : Fin<2>, outerAttack_k0 : BitVec<20>) { locals : (not_done : Fin<2>, Q_sum : Fin<9421>, j : Fin<9421>, j_lim : Fin<9421>) } { +proc QSearch(ret_4 : Fin<2>, ret_5 : BitVec<20>) { locals : (not_done : Fin<2>, Q_sum : Fin<9421>, j : Fin<9421>, j_lim : Fin<9421>) } { repeat (7) { Q_sum := 0:Fin<9421>; for (j_lim in [1:Fin<9421>, 1:Fin<9421>, 1:Fin<9421>, 2:Fin<9421>, 2:Fin<9421>, 2:Fin<9421>, 3:Fin<9421>, 4:Fin<9421>, 5:Fin<9421>, 6:Fin<9421>, 7:Fin<9421>, 8:Fin<9421>, 10:Fin<9421>, 12:Fin<9421>, 15:Fin<9421>, 18:Fin<9421>, 22:Fin<9421>, 26:Fin<9421>, 31:Fin<9421>, 38:Fin<9421>, 46:Fin<9421>, 55:Fin<9421>, 66:Fin<9421>, 79:Fin<9421>, 95:Fin<9421>, 114:Fin<9421>, 137:Fin<9421>, 164:Fin<9421>, 197:Fin<9421>, 237:Fin<9421>, 284:Fin<9421>, 341:Fin<9421>, 410:Fin<9421>, 492:Fin<9421>, 590:Fin<9421>, 708:Fin<9421>, 850:Fin<9421>, 1020:Fin<9421>, 1024:Fin<9421>, 1024:Fin<9421>, 1024:Fin<9421>]) { @@ -125,9 +125,9 @@ proc QSearch(outerAttack_ok : Fin<2>, outerAttack_k0 : BitVec<20>) { locals : (n Q_sum := (Q_sum + j); not_done := (not_done && (Q_sum <= j_lim)); if (not_done) { - meas Grover[j](outerAttack_k0, outerAttack_ok); - meas innerAttack_U(outerAttack_k0, outerAttack_ok); - not_done := (not_done && outerAttack_ok); + meas Grover[j](ret_5, ret_4); + meas innerAttack_U(ret_5, ret_4); + not_done := (not_done && ret_4); } else { skip; } diff --git a/examples/cryptanalysis/period_finding.qpl b/examples/cryptanalysis/period_finding.qpl index b68f8aa..0944fc5 100644 --- a/examples/cryptanalysis/period_finding.qpl +++ b/examples/cryptanalysis/period_finding.qpl @@ -10,11 +10,11 @@ uproc SimonOneRound_U(x : OUT BitVec<20>, y : AUX BitVec<20>, yy : AUX BitVec<20 x *= Adj-Distr[uniform : BitVec<20>]; } -uproc USimon(s_1 : OUT BitVec<20>, USimon_aux : AUX Arr<31, BitVec<20>>, USimon_aux_1 : AUX Arr<31, BitVec<20>>, USimon_aux_2 : AUX Arr<31, BitVec<20>>) { +uproc USimon(ret : OUT BitVec<20>, USimon_aux : AUX Arr<31, BitVec<20>>, USimon_aux_1 : AUX Arr<31, BitVec<20>>, USimon_aux_2 : AUX Arr<31, BitVec<20>>) { for (#i in 0 .. < 31) { call SimonOneRound_U(USimon_aux[#i], USimon_aux_1[#i], USimon_aux_2[#i]); } - // simon's post-processing: unitarily solve linear system: (s_1) . (USimon_aux) = 0 + // simon's post-processing: unitarily solve linear system: (ret) . (USimon_aux) = 0 } uproc main_U(s : OUT BitVec<20>, s_1 : AUX BitVec<20>, x : AUX BitVec<20>, y : AUX BitVec<20>, yy : AUX BitVec<20>, USimon_aux : AUX Arr<31, BitVec<20>>, USimon_aux_1 : AUX Arr<31, BitVec<20>>, USimon_aux_2 : AUX Arr<31, BitVec<20>>, aux_prim : AUX Arr<31, BitVec<20>>, aux_prim_1 : AUX Arr<31, BitVec<20>>, aux_prim_2 : AUX Arr<31, BitVec<20>>) { @@ -30,11 +30,11 @@ uproc SimonOneRound_U_1(x_1 : OUT BitVec<20>, y_1 : AUX BitVec<20>, yy_1 : AUX B x_1 *= Adj-Distr[uniform : BitVec<20>]; } -proc QSimon(s : BitVec<20>) { locals : (QSimon__u : Arr<31, BitVec<20>>) } { +proc QSimon(ret_1 : BitVec<20>) { locals : (QSimon__u : Arr<31, BitVec<20>>) } { for (#i_1 in 0 .. < 31) { meas SimonOneRound_U_1(QSimon__u[#i_1]); } - // simon's post-processing: solve linear system: (s) . (QSimon__u) = 0 + // simon's post-processing: solve linear system: (ret_1) . (QSimon__u) = 0 } proc main(s : BitVec<20>) { locals : (x_1 : BitVec<20>, y_1 : BitVec<20>, yy_1 : BitVec<20>, QSimon__u : Arr<31, BitVec<20>>) } { diff --git a/examples/hillclimb/max_sat_hillclimb.qpl b/examples/hillclimb/max_sat_hillclimb.qpl index 43fa04f..8a23ed1 100644 --- a/examples/hillclimb/max_sat_hillclimb.qpl +++ b/examples/hillclimb/max_sat_hillclimb.qpl @@ -27,7 +27,7 @@ proc good(good_x : Arr<20, Fin<2>>, good_i : Fin<20>, good_ok : Fin<2>) { locals } // USearch[Fin 20, 3.333333333333333e-4] -uproc USearch(hillclimb_iter_x : Arr<20, Fin<2>>, hillclimb_iter_ok_1 : OUT Fin<2>, hillclimb_iter_i_1 : OUT Fin<20>, aux : AUX Fin<1000>, aux_1 : AUX Fin<2>, aux_2 : AUX Fin<2>, aux_3 : AUX Arr<20, Fin<2>>, aux_4 : AUX Fin<1000>, aux_5 : AUX Fin<1000>, aux_6 : AUX Fin<2>, aux_7 : AUX Fin<2>, aux_8 : AUX Arr<20, Fin<2>>, aux_9 : AUX Fin<1000>, aux_10 : AUX Fin<2>, aux_11 : AUX Fin<2>, ctrl : AUX Arr<17, Fin<2>>, pred_out : AUX Arr<17, Fin<2>>, n_iter : AUX Arr<17, Fin<4>>, s_arg : AUX Arr<17, Fin<20>>) { +uproc USearch(hillclimb_iter_x : Arr<20, Fin<2>>, ret : OUT Fin<2>, ret_1 : OUT Fin<20>, aux : AUX Fin<1000>, aux_1 : AUX Fin<2>, aux_2 : AUX Fin<2>, aux_3 : AUX Arr<20, Fin<2>>, aux_4 : AUX Fin<1000>, aux_5 : AUX Fin<1000>, aux_6 : AUX Fin<2>, aux_7 : AUX Fin<2>, aux_8 : AUX Arr<20, Fin<2>>, aux_9 : AUX Fin<1000>, aux_10 : AUX Fin<2>, aux_11 : AUX Fin<2>, ctrl : AUX Arr<17, Fin<2>>, pred_out : AUX Arr<17, Fin<2>>, n_iter : AUX Arr<17, Fin<4>>, s_arg : AUX Arr<17, Fin<20>>) { for (#run_ix in 0 .. < 17) { n_iter[#run_ix] *= Distr[uniform : Fin<4>]; pred_out[#run_ix] *= X; @@ -52,8 +52,8 @@ uproc USearch(hillclimb_iter_x : Arr<20, Fin<2>>, hillclimb_iter_ok_1 : OUT Fin< call-adj good_U(hillclimb_iter_x, s_arg[#run_ix], aux_11, aux, aux_1, aux_2, aux_3, aux_4, aux_5, aux_6, aux_7, aux_8, aux_9, aux_10); ctrl[#run_ix] *= X; } - pred_out, hillclimb_iter_ok_1 *= Embed[(a) => multi_or a]; - s_arg, pred_out, hillclimb_iter_i_1 *= Embed[(a, f) => (a selectOn f)]; + pred_out, ret *= Embed[(a) => multi_or a]; + s_arg, pred_out, ret_1 *= Embed[(a, f) => (a selectOn f)]; } uproc hillclimb_iter_U(hillclimb_iter_x : IN Arr<20, Fin<2>>, hillclimb_iter_x' : OUT Arr<20, Fin<2>>, hillclimb_iter_ok : AUX Fin<2>, hillclimb_iter_i : AUX Fin<20>, hillclimb_iter_b : AUX Fin<2>, hillclimb_iter_b' : AUX Fin<2>, hillclimb_iter_ok_1 : AUX Fin<2>, hillclimb_iter_i_1 : AUX Fin<20>, aux : AUX Fin<1000>, aux_1 : AUX Fin<2>, aux_2 : AUX Fin<2>, aux_3 : AUX Arr<20, Fin<2>>, aux_4 : AUX Fin<1000>, aux_5 : AUX Fin<1000>, aux_6 : AUX Fin<2>, aux_7 : AUX Fin<2>, aux_8 : AUX Arr<20, Fin<2>>, aux_9 : AUX Fin<1000>, aux_10 : AUX Fin<2>, aux_11 : AUX Fin<2>, ctrl : AUX Arr<17, Fin<2>>, pred_out : AUX Arr<17, Fin<2>>, n_iter : AUX Arr<17, Fin<4>>, s_arg : AUX Arr<17, Fin<20>>, aux_prim : AUX Fin<1000>, aux_prim_1 : AUX Fin<2>, aux_prim_2 : AUX Fin<2>, aux_prim_3 : AUX Arr<20, Fin<2>>, aux_prim_4 : AUX Fin<1000>, aux_prim_5 : AUX Fin<1000>, aux_prim_6 : AUX Fin<2>, aux_prim_7 : AUX Fin<2>, aux_prim_8 : AUX Arr<20, Fin<2>>, aux_prim_9 : AUX Fin<1000>, aux_prim_10 : AUX Fin<2>, aux_prim_11 : AUX Fin<2>, aux_prim_12 : AUX Arr<17, Fin<2>>, aux_prim_13 : AUX Arr<17, Fin<2>>, aux_prim_14 : AUX Arr<17, Fin<4>>, aux_prim_15 : AUX Arr<17, Fin<20>>, hillclimb_iter_b_1 : AUX Fin<2>, hillclimb_iter_b'_1 : AUX Fin<2>, hillclimb_iter_x'_1 : AUX Arr<20, Fin<2>>) { @@ -68,21 +68,21 @@ uproc hillclimb_iter_U(hillclimb_iter_x : IN Arr<20, Fin<2>>, hillclimb_iter_x' } // Grover[...] -uproc Grover[k](hillclimb_iter_x : Arr<20, Fin<2>>, x : IN Fin<20>, hillclimb_iter_ok : OUT Fin<2>, aux_12 : AUX Fin<1000>, aux_13 : AUX Fin<2>, aux_14 : AUX Fin<2>, aux_15 : AUX Arr<20, Fin<2>>, aux_16 : AUX Fin<1000>, aux_17 : AUX Fin<1000>, aux_18 : AUX Fin<2>, aux_19 : AUX Fin<2>, aux_20 : AUX Arr<20, Fin<2>>, aux_21 : AUX Fin<1000>, aux_22 : AUX Fin<2>) { - hillclimb_iter_ok *= X; - hillclimb_iter_ok *= H; +uproc Grover[k](hillclimb_iter_x : Arr<20, Fin<2>>, x : IN Fin<20>, ret_2 : OUT Fin<2>, aux_12 : AUX Fin<1000>, aux_13 : AUX Fin<2>, aux_14 : AUX Fin<2>, aux_15 : AUX Arr<20, Fin<2>>, aux_16 : AUX Fin<1000>, aux_17 : AUX Fin<1000>, aux_18 : AUX Fin<2>, aux_19 : AUX Fin<2>, aux_20 : AUX Arr<20, Fin<2>>, aux_21 : AUX Fin<1000>, aux_22 : AUX Fin<2>) { + ret_2 *= X; + ret_2 *= H; x *= Distr[uniform : Fin<20>]; repeat (#k) { - call good_U(hillclimb_iter_x, x, hillclimb_iter_ok, aux_12, aux_13, aux_14, aux_15, aux_16, aux_17, aux_18, aux_19, aux_20, aux_21, aux_22); + call good_U(hillclimb_iter_x, x, ret_2, aux_12, aux_13, aux_14, aux_15, aux_16, aux_17, aux_18, aux_19, aux_20, aux_21, aux_22); x *= Adj-Distr[uniform : Fin<20>]; x *= PhaseOnZero(3.141592653589793); x *= Distr[uniform : Fin<20>]; } - hillclimb_iter_ok *= H; - hillclimb_iter_ok *= X; + ret_2 *= H; + ret_2 *= X; } -proc QSearch(hillclimb_iter_x : Arr<20, Fin<2>>, hillclimb_iter_ok : Fin<2>, hillclimb_iter_i : Fin<20>) { locals : (not_done : Fin<2>, Q_sum : Fin<42>, j : Fin<42>, j_lim : Fin<42>) } { +proc QSearch(hillclimb_iter_x : Arr<20, Fin<2>>, ret_2 : Fin<2>, ret_3 : Fin<20>) { locals : (not_done : Fin<2>, Q_sum : Fin<42>, j : Fin<42>, j_lim : Fin<42>) } { repeat (8) { Q_sum := 0:Fin<42>; for (j_lim in [1:Fin<42>, 1:Fin<42>, 1:Fin<42>, 2:Fin<42>, 2:Fin<42>, 2:Fin<42>, 3:Fin<42>, 4:Fin<42>, 4:Fin<42>, 4:Fin<42>, 4:Fin<42>, 4:Fin<42>, 4:Fin<42>, 4:Fin<42>]) { @@ -90,9 +90,9 @@ proc QSearch(hillclimb_iter_x : Arr<20, Fin<2>>, hillclimb_iter_ok : Fin<2>, hil Q_sum := (Q_sum + j); not_done := (not_done && (Q_sum <= j_lim)); if (not_done) { - meas Grover[j](hillclimb_iter_x, hillclimb_iter_i, hillclimb_iter_ok); - meas good_U(hillclimb_iter_x, hillclimb_iter_i, hillclimb_iter_ok); - not_done := (not_done && hillclimb_iter_ok); + meas Grover[j](hillclimb_iter_x, ret_3, ret_2); + meas good_U(hillclimb_iter_x, ret_3, ret_2); + not_done := (not_done && ret_2); } else { skip; } diff --git a/examples/hillclimb/steep_max_sat.qpl b/examples/hillclimb/steep_max_sat.qpl index cebd012..2c2547a 100644 --- a/examples/hillclimb/steep_max_sat.qpl +++ b/examples/hillclimb/steep_max_sat.qpl @@ -23,11 +23,11 @@ proc good(good_x : Arr<20, Fin<2>>, good_i : Fin<20>, good_w' : Fin<1000>) { loc call Phi(good_x', good_w'); } -uproc UMax(hillclimb_iter_x : Arr<20, Fin<2>>, hillclimb_iter_w_1 : Fin<1000>, hillclimb_iter_i_1 : Fin<20>, inp : AUX Arr<20, Fin<20>>, out : AUX Arr<20, Fin<1000>>, aux : AUX Arr<20, Fin<1000>>, aux_1 : AUX Arr<20, Fin<2>>, aux_2 : AUX Arr<20, Fin<2>>, aux_3 : AUX Arr<20, Arr<20, Fin<2>>>, aux_4 : AUX Arr<20, Fin<1000>>, aux_5 : AUX Arr<20, Fin<2>>, aux_6 : AUX Arr<20, Fin<2>>, aux_7 : AUX Arr<20, Arr<20, Fin<2>>>, aux_8 : AUX Arr<20, Fin<1000>>) { +uproc UMax(hillclimb_iter_x : Arr<20, Fin<2>>, ret : Fin<1000>, ret_1 : Fin<20>, inp : AUX Arr<20, Fin<20>>, out : AUX Arr<20, Fin<1000>>, aux : AUX Arr<20, Fin<1000>>, aux_1 : AUX Arr<20, Fin<2>>, aux_2 : AUX Arr<20, Fin<2>>, aux_3 : AUX Arr<20, Arr<20, Fin<2>>>, aux_4 : AUX Arr<20, Fin<1000>>, aux_5 : AUX Arr<20, Fin<2>>, aux_6 : AUX Arr<20, Fin<2>>, aux_7 : AUX Arr<20, Arr<20, Fin<2>>>, aux_8 : AUX Arr<20, Fin<1000>>) { for (#x in Fin<20>) { call good_U(hillclimb_iter_x, inp[#x], out[#x], aux[#x], aux_1[#x], aux_2[#x], aux_3[#x], aux_4[#x], aux_5[#x], aux_6[#x], aux_7[#x], aux_8[#x]); } - // unitarily compute: hillclimb_iter_w_1 := max(out); hillclimb_iter_i_1 := argmax(out); + // unitarily compute: ret := max(out); ret_1 := argmax(out); } uproc hillclimb_iter_U(hillclimb_iter_x : IN Arr<20, Fin<2>>, hillclimb_iter_x' : OUT Arr<20, Fin<2>>, hillclimb_iter_w : AUX Fin<1000>, hillclimb_iter_i : AUX Fin<20>, hillclimb_iter_b : AUX Fin<2>, hillclimb_iter_b' : AUX Fin<2>, hillclimb_iter_w_1 : AUX Fin<1000>, hillclimb_iter_i_1 : AUX Fin<20>, aux_prim : AUX Arr<20, Fin<20>>, aux_prim_1 : AUX Arr<20, Fin<1000>>, aux_prim_2 : AUX Arr<20, Fin<1000>>, aux_prim_3 : AUX Arr<20, Fin<2>>, aux_prim_4 : AUX Arr<20, Fin<2>>, aux_prim_5 : AUX Arr<20, Arr<20, Fin<2>>>, aux_prim_6 : AUX Arr<20, Fin<1000>>, aux_prim_7 : AUX Arr<20, Fin<2>>, aux_prim_8 : AUX Arr<20, Fin<2>>, aux_prim_9 : AUX Arr<20, Arr<20, Fin<2>>>, aux_prim_10 : AUX Arr<20, Fin<1000>>, hillclimb_iter_b_1 : AUX Fin<2>, hillclimb_iter_b'_1 : AUX Fin<2>, hillclimb_iter_x'_1 : AUX Arr<20, Fin<2>>) { @@ -46,16 +46,16 @@ uproc Compare(hillclimb_iter_x : Arr<20, Fin<2>>, y : Fin<1000>, x_1 : Fin<20>, y, out_1, b *= Embed[(a, b) => (a < b)]; } -proc QSearch(hillclimb_iter_x : Arr<20, Fin<2>>, fuel : Fin<750>, y : Fin<1000>, x : Fin<20>) { locals : () } { +proc QSearch_infty(hillclimb_iter_x : Arr<20, Fin<2>>, fuel : Fin<750>, y : Fin<1000>, x : Fin<20>) { locals : () } { // TODO: QSearch body } -proc QMax(hillclimb_iter_x : Arr<20, Fin<2>>, hillclimb_iter_w : Fin<1000>, hillclimb_iter_i : Fin<20>) { locals : (fuel : Fin<750>) } { +proc QMax(hillclimb_iter_x : Arr<20, Fin<2>>, ret_2 : Fin<1000>, ret_3 : Fin<20>) { locals : (fuel : Fin<750>) } { fuel := 749:Fin<750>; - hillclimb_iter_i :=$ uniform : Fin<20>; - call good(hillclimb_iter_x, hillclimb_iter_i, hillclimb_iter_w); + ret_3 :=$ uniform : Fin<20>; + call good(hillclimb_iter_x, ret_3, ret_2); repeat (750) { - call QSearch(hillclimb_iter_x, fuel, hillclimb_iter_w, hillclimb_iter_i); + call QSearch_infty(hillclimb_iter_x, fuel, ret_2, ret_3); } } diff --git a/examples/matrix_search/depth3_NAND_formula.qpl b/examples/matrix_search/depth3_NAND_formula.qpl index 33ac3e2..416365c 100644 --- a/examples/matrix_search/depth3_NAND_formula.qpl +++ b/examples/matrix_search/depth3_NAND_formula.qpl @@ -15,7 +15,7 @@ proc NOR_0(i0 : Fin<20>, j0 : Fin<10>, k0 : Fin<10>, e' : Fin<2>) { locals : (e } // UAny[Fin 10, 3.801194009254654e-32] -uproc UAny(i1 : Fin<20>, j1 : Fin<10>, or_1_1 : OUT Fin<2>, s_result : OUT Fin<10>, aux : AUX Fin<2>, aux_1 : AUX Fin<2>, aux_2 : AUX Fin<2>, aux_3 : AUX Fin<2>, ctrl : AUX Arr<146, Fin<2>>, pred_out : AUX Arr<146, Fin<2>>, n_iter : AUX Arr<146, Fin<3>>, s_arg : AUX Arr<146, Fin<10>>) { +uproc UAny(i1 : Fin<20>, j1 : Fin<10>, ret : OUT Fin<2>, s_result : OUT Fin<10>, aux : AUX Fin<2>, aux_1 : AUX Fin<2>, aux_2 : AUX Fin<2>, aux_3 : AUX Fin<2>, ctrl : AUX Arr<146, Fin<2>>, pred_out : AUX Arr<146, Fin<2>>, n_iter : AUX Arr<146, Fin<3>>, s_arg : AUX Arr<146, Fin<10>>) { for (#run_ix in 0 .. < 146) { n_iter[#run_ix] *= Distr[uniform : Fin<3>]; pred_out[#run_ix] *= X; @@ -40,7 +40,7 @@ uproc UAny(i1 : Fin<20>, j1 : Fin<10>, or_1_1 : OUT Fin<2>, s_result : OUT Fin<1 call-adj NOR_0_U(i1, j1, s_arg[#run_ix], aux_3, aux, aux_1, aux_2); ctrl[#run_ix] *= X; } - pred_out, or_1_1 *= Embed[(a) => multi_or a]; + pred_out, ret *= Embed[(a) => multi_or a]; s_arg, pred_out, s_result *= Embed[(a, f) => (a selectOn f)]; } @@ -52,21 +52,21 @@ uproc NOR_1_U(i1 : IN Fin<20>, j1 : IN Fin<10>, nor_1 : OUT Fin<2>, or_1 : AUX F } // Grover[...] -uproc Grover[k](i1 : Fin<20>, j1 : Fin<10>, x : IN Fin<10>, or_1 : OUT Fin<2>, aux_4 : AUX Fin<2>, aux_5 : AUX Fin<2>, aux_6 : AUX Fin<2>) { - or_1 *= X; - or_1 *= H; +uproc Grover[k](i1 : Fin<20>, j1 : Fin<10>, x : IN Fin<10>, ret_1 : OUT Fin<2>, aux_4 : AUX Fin<2>, aux_5 : AUX Fin<2>, aux_6 : AUX Fin<2>) { + ret_1 *= X; + ret_1 *= H; x *= Distr[uniform : Fin<10>]; repeat (#k) { - call NOR_0_U(i1, j1, x, or_1, aux_4, aux_5, aux_6); + call NOR_0_U(i1, j1, x, ret_1, aux_4, aux_5, aux_6); x *= Adj-Distr[uniform : Fin<10>]; x *= PhaseOnZero(3.141592653589793); x *= Distr[uniform : Fin<10>]; } - or_1 *= H; - or_1 *= X; + ret_1 *= H; + ret_1 *= X; } -proc QAny(i1 : Fin<20>, j1 : Fin<10>, or_1 : Fin<2>) { locals : (s_result_1 : Fin<10>, not_done : Fin<2>, Q_sum : Fin<30>, j : Fin<30>, j_lim : Fin<30>) } { +proc QAny(i1 : Fin<20>, j1 : Fin<10>, ret_1 : Fin<2>) { locals : (s_result_1 : Fin<10>, not_done : Fin<2>, Q_sum : Fin<30>, j : Fin<30>, j_lim : Fin<30>) } { repeat (66) { Q_sum := 0:Fin<30>; for (j_lim in [1:Fin<30>, 1:Fin<30>, 1:Fin<30>, 2:Fin<30>, 2:Fin<30>, 2:Fin<30>, 3:Fin<30>, 3:Fin<30>, 3:Fin<30>, 3:Fin<30>, 3:Fin<30>, 3:Fin<30>, 3:Fin<30>]) { @@ -74,9 +74,9 @@ proc QAny(i1 : Fin<20>, j1 : Fin<10>, or_1 : Fin<2>) { locals : (s_result_1 : Fi Q_sum := (Q_sum + j); not_done := (not_done && (Q_sum <= j_lim)); if (not_done) { - meas Grover[j](i1, j1, s_result_1, or_1); - meas NOR_0_U(i1, j1, s_result_1, or_1); - not_done := (not_done && or_1); + meas Grover[j](i1, j1, s_result_1, ret_1); + meas NOR_0_U(i1, j1, s_result_1, ret_1); + not_done := (not_done && ret_1); } else { skip; } @@ -90,7 +90,7 @@ proc NOR_1(i1 : Fin<20>, j1 : Fin<10>, nor_1 : Fin<2>) { locals : (or_1 : Fin<2> } // UAny[Fin 10, 1.3387056295712027e-13] -uproc UAny_1(i2 : Fin<20>, or_2_1 : OUT Fin<2>, s_result_2 : OUT Fin<10>, aux_7 : AUX Fin<2>, aux_8 : AUX Fin<2>, aux_9 : AUX Fin<10>, aux_10 : AUX Fin<2>, aux_11 : AUX Fin<2>, aux_12 : AUX Fin<2>, aux_13 : AUX Fin<2>, aux_14 : AUX Arr<146, Fin<2>>, aux_15 : AUX Arr<146, Fin<2>>, aux_16 : AUX Arr<146, Fin<3>>, aux_17 : AUX Arr<146, Fin<10>>, aux_18 : AUX Fin<10>, aux_19 : AUX Fin<2>, aux_20 : AUX Fin<2>, aux_21 : AUX Fin<2>, aux_22 : AUX Fin<2>, aux_23 : AUX Arr<146, Fin<2>>, aux_24 : AUX Arr<146, Fin<2>>, aux_25 : AUX Arr<146, Fin<3>>, aux_26 : AUX Arr<146, Fin<10>>, aux_27 : AUX Fin<2>, aux_28 : AUX Fin<2>, ctrl_1 : AUX Arr<60, Fin<2>>, pred_out_1 : AUX Arr<60, Fin<2>>, n_iter_1 : AUX Arr<60, Fin<3>>, s_arg_1 : AUX Arr<60, Fin<10>>) { +uproc UAny_1(i2 : Fin<20>, ret_2 : OUT Fin<2>, s_result_2 : OUT Fin<10>, aux_7 : AUX Fin<2>, aux_8 : AUX Fin<2>, aux_9 : AUX Fin<10>, aux_10 : AUX Fin<2>, aux_11 : AUX Fin<2>, aux_12 : AUX Fin<2>, aux_13 : AUX Fin<2>, aux_14 : AUX Arr<146, Fin<2>>, aux_15 : AUX Arr<146, Fin<2>>, aux_16 : AUX Arr<146, Fin<3>>, aux_17 : AUX Arr<146, Fin<10>>, aux_18 : AUX Fin<10>, aux_19 : AUX Fin<2>, aux_20 : AUX Fin<2>, aux_21 : AUX Fin<2>, aux_22 : AUX Fin<2>, aux_23 : AUX Arr<146, Fin<2>>, aux_24 : AUX Arr<146, Fin<2>>, aux_25 : AUX Arr<146, Fin<3>>, aux_26 : AUX Arr<146, Fin<10>>, aux_27 : AUX Fin<2>, aux_28 : AUX Fin<2>, ctrl_1 : AUX Arr<60, Fin<2>>, pred_out_1 : AUX Arr<60, Fin<2>>, n_iter_1 : AUX Arr<60, Fin<3>>, s_arg_1 : AUX Arr<60, Fin<10>>) { for (#run_ix in 0 .. < 60) { n_iter_1[#run_ix] *= Distr[uniform : Fin<3>]; pred_out_1[#run_ix] *= X; @@ -115,7 +115,7 @@ uproc UAny_1(i2 : Fin<20>, or_2_1 : OUT Fin<2>, s_result_2 : OUT Fin<10>, aux_7 call-adj NOR_1_U(i2, s_arg_1[#run_ix], aux_28, aux_7, aux_8, aux_9, aux_10, aux_11, aux_12, aux_13, aux_14, aux_15, aux_16, aux_17, aux_18, aux_19, aux_20, aux_21, aux_22, aux_23, aux_24, aux_25, aux_26, aux_27); ctrl_1[#run_ix] *= X; } - pred_out_1, or_2_1 *= Embed[(a) => multi_or a]; + pred_out_1, ret_2 *= Embed[(a) => multi_or a]; s_arg_1, pred_out_1, s_result_2 *= Embed[(a, f) => (a selectOn f)]; } @@ -127,21 +127,21 @@ uproc NOR_2_U(i2 : IN Fin<20>, nor_2 : OUT Fin<2>, or_2 : AUX Fin<2>, or_2_1 : A } // Grover[...] -uproc Grover_1[k](i2 : Fin<20>, x_1 : IN Fin<10>, or_2 : OUT Fin<2>, aux_29 : AUX Fin<2>, aux_30 : AUX Fin<2>, aux_31 : AUX Fin<10>, aux_32 : AUX Fin<2>, aux_33 : AUX Fin<2>, aux_34 : AUX Fin<2>, aux_35 : AUX Fin<2>, aux_36 : AUX Arr<146, Fin<2>>, aux_37 : AUX Arr<146, Fin<2>>, aux_38 : AUX Arr<146, Fin<3>>, aux_39 : AUX Arr<146, Fin<10>>, aux_40 : AUX Fin<10>, aux_41 : AUX Fin<2>, aux_42 : AUX Fin<2>, aux_43 : AUX Fin<2>, aux_44 : AUX Fin<2>, aux_45 : AUX Arr<146, Fin<2>>, aux_46 : AUX Arr<146, Fin<2>>, aux_47 : AUX Arr<146, Fin<3>>, aux_48 : AUX Arr<146, Fin<10>>, aux_49 : AUX Fin<2>) { - or_2 *= X; - or_2 *= H; +uproc Grover_1[k](i2 : Fin<20>, x_1 : IN Fin<10>, ret_3 : OUT Fin<2>, aux_29 : AUX Fin<2>, aux_30 : AUX Fin<2>, aux_31 : AUX Fin<10>, aux_32 : AUX Fin<2>, aux_33 : AUX Fin<2>, aux_34 : AUX Fin<2>, aux_35 : AUX Fin<2>, aux_36 : AUX Arr<146, Fin<2>>, aux_37 : AUX Arr<146, Fin<2>>, aux_38 : AUX Arr<146, Fin<3>>, aux_39 : AUX Arr<146, Fin<10>>, aux_40 : AUX Fin<10>, aux_41 : AUX Fin<2>, aux_42 : AUX Fin<2>, aux_43 : AUX Fin<2>, aux_44 : AUX Fin<2>, aux_45 : AUX Arr<146, Fin<2>>, aux_46 : AUX Arr<146, Fin<2>>, aux_47 : AUX Arr<146, Fin<3>>, aux_48 : AUX Arr<146, Fin<10>>, aux_49 : AUX Fin<2>) { + ret_3 *= X; + ret_3 *= H; x_1 *= Distr[uniform : Fin<10>]; repeat (#k) { - call NOR_1_U(i2, x_1, or_2, aux_29, aux_30, aux_31, aux_32, aux_33, aux_34, aux_35, aux_36, aux_37, aux_38, aux_39, aux_40, aux_41, aux_42, aux_43, aux_44, aux_45, aux_46, aux_47, aux_48, aux_49); + call NOR_1_U(i2, x_1, ret_3, aux_29, aux_30, aux_31, aux_32, aux_33, aux_34, aux_35, aux_36, aux_37, aux_38, aux_39, aux_40, aux_41, aux_42, aux_43, aux_44, aux_45, aux_46, aux_47, aux_48, aux_49); x_1 *= Adj-Distr[uniform : Fin<10>]; x_1 *= PhaseOnZero(3.141592653589793); x_1 *= Distr[uniform : Fin<10>]; } - or_2 *= H; - or_2 *= X; + ret_3 *= H; + ret_3 *= X; } -proc QAny_1(i2 : Fin<20>, or_2 : Fin<2>) { locals : (s_result_3 : Fin<10>, not_done_1 : Fin<2>, Q_sum_1 : Fin<30>, j_1 : Fin<30>, j_lim_1 : Fin<30>) } { +proc QAny_1(i2 : Fin<20>, ret_3 : Fin<2>) { locals : (s_result_3 : Fin<10>, not_done_1 : Fin<2>, Q_sum_1 : Fin<30>, j_1 : Fin<30>, j_lim_1 : Fin<30>) } { repeat (27) { Q_sum_1 := 0:Fin<30>; for (j_lim_1 in [1:Fin<30>, 1:Fin<30>, 1:Fin<30>, 2:Fin<30>, 2:Fin<30>, 2:Fin<30>, 3:Fin<30>, 3:Fin<30>, 3:Fin<30>, 3:Fin<30>, 3:Fin<30>, 3:Fin<30>, 3:Fin<30>]) { @@ -149,9 +149,9 @@ proc QAny_1(i2 : Fin<20>, or_2 : Fin<2>) { locals : (s_result_3 : Fin<10>, not_d Q_sum_1 := (Q_sum_1 + j_1); not_done_1 := (not_done_1 && (Q_sum_1 <= j_lim_1)); if (not_done_1) { - meas Grover_1[j_1](i2, s_result_3, or_2); - meas NOR_1_U(i2, s_result_3, or_2); - not_done_1 := (not_done_1 && or_2); + meas Grover_1[j_1](i2, s_result_3, ret_3); + meas NOR_1_U(i2, s_result_3, ret_3); + not_done_1 := (not_done_1 && ret_3); } else { skip; } @@ -165,7 +165,7 @@ proc NOR_2(i2 : Fin<20>, nor_2 : Fin<2>) { locals : (or_2 : Fin<2>) } { } // UAny[Fin 20, 5.0e-4] -uproc UAny_2(or_3_1 : OUT Fin<2>, s_result_4 : OUT Fin<20>, aux_50 : AUX Fin<2>, aux_51 : AUX Fin<2>, aux_52 : AUX Fin<10>, aux_53 : AUX Fin<2>, aux_54 : AUX Fin<2>, aux_55 : AUX Fin<10>, aux_56 : AUX Fin<2>, aux_57 : AUX Fin<2>, aux_58 : AUX Fin<2>, aux_59 : AUX Fin<2>, aux_60 : AUX Arr<146, Fin<2>>, aux_61 : AUX Arr<146, Fin<2>>, aux_62 : AUX Arr<146, Fin<3>>, aux_63 : AUX Arr<146, Fin<10>>, aux_64 : AUX Fin<10>, aux_65 : AUX Fin<2>, aux_66 : AUX Fin<2>, aux_67 : AUX Fin<2>, aux_68 : AUX Fin<2>, aux_69 : AUX Arr<146, Fin<2>>, aux_70 : AUX Arr<146, Fin<2>>, aux_71 : AUX Arr<146, Fin<3>>, aux_72 : AUX Arr<146, Fin<10>>, aux_73 : AUX Fin<2>, aux_74 : AUX Fin<2>, aux_75 : AUX Arr<60, Fin<2>>, aux_76 : AUX Arr<60, Fin<2>>, aux_77 : AUX Arr<60, Fin<3>>, aux_78 : AUX Arr<60, Fin<10>>, aux_79 : AUX Fin<10>, aux_80 : AUX Fin<2>, aux_81 : AUX Fin<2>, aux_82 : AUX Fin<10>, aux_83 : AUX Fin<2>, aux_84 : AUX Fin<2>, aux_85 : AUX Fin<2>, aux_86 : AUX Fin<2>, aux_87 : AUX Arr<146, Fin<2>>, aux_88 : AUX Arr<146, Fin<2>>, aux_89 : AUX Arr<146, Fin<3>>, aux_90 : AUX Arr<146, Fin<10>>, aux_91 : AUX Fin<10>, aux_92 : AUX Fin<2>, aux_93 : AUX Fin<2>, aux_94 : AUX Fin<2>, aux_95 : AUX Fin<2>, aux_96 : AUX Arr<146, Fin<2>>, aux_97 : AUX Arr<146, Fin<2>>, aux_98 : AUX Arr<146, Fin<3>>, aux_99 : AUX Arr<146, Fin<10>>, aux_100 : AUX Fin<2>, aux_101 : AUX Fin<2>, aux_102 : AUX Arr<60, Fin<2>>, aux_103 : AUX Arr<60, Fin<2>>, aux_104 : AUX Arr<60, Fin<3>>, aux_105 : AUX Arr<60, Fin<10>>, aux_106 : AUX Fin<2>, aux_107 : AUX Fin<2>, ctrl_2 : AUX Arr<16, Fin<2>>, pred_out_2 : AUX Arr<16, Fin<2>>, n_iter_2 : AUX Arr<16, Fin<4>>, s_arg_2 : AUX Arr<16, Fin<20>>) { +uproc UAny_2(ret_4 : OUT Fin<2>, s_result_4 : OUT Fin<20>, aux_50 : AUX Fin<2>, aux_51 : AUX Fin<2>, aux_52 : AUX Fin<10>, aux_53 : AUX Fin<2>, aux_54 : AUX Fin<2>, aux_55 : AUX Fin<10>, aux_56 : AUX Fin<2>, aux_57 : AUX Fin<2>, aux_58 : AUX Fin<2>, aux_59 : AUX Fin<2>, aux_60 : AUX Arr<146, Fin<2>>, aux_61 : AUX Arr<146, Fin<2>>, aux_62 : AUX Arr<146, Fin<3>>, aux_63 : AUX Arr<146, Fin<10>>, aux_64 : AUX Fin<10>, aux_65 : AUX Fin<2>, aux_66 : AUX Fin<2>, aux_67 : AUX Fin<2>, aux_68 : AUX Fin<2>, aux_69 : AUX Arr<146, Fin<2>>, aux_70 : AUX Arr<146, Fin<2>>, aux_71 : AUX Arr<146, Fin<3>>, aux_72 : AUX Arr<146, Fin<10>>, aux_73 : AUX Fin<2>, aux_74 : AUX Fin<2>, aux_75 : AUX Arr<60, Fin<2>>, aux_76 : AUX Arr<60, Fin<2>>, aux_77 : AUX Arr<60, Fin<3>>, aux_78 : AUX Arr<60, Fin<10>>, aux_79 : AUX Fin<10>, aux_80 : AUX Fin<2>, aux_81 : AUX Fin<2>, aux_82 : AUX Fin<10>, aux_83 : AUX Fin<2>, aux_84 : AUX Fin<2>, aux_85 : AUX Fin<2>, aux_86 : AUX Fin<2>, aux_87 : AUX Arr<146, Fin<2>>, aux_88 : AUX Arr<146, Fin<2>>, aux_89 : AUX Arr<146, Fin<3>>, aux_90 : AUX Arr<146, Fin<10>>, aux_91 : AUX Fin<10>, aux_92 : AUX Fin<2>, aux_93 : AUX Fin<2>, aux_94 : AUX Fin<2>, aux_95 : AUX Fin<2>, aux_96 : AUX Arr<146, Fin<2>>, aux_97 : AUX Arr<146, Fin<2>>, aux_98 : AUX Arr<146, Fin<3>>, aux_99 : AUX Arr<146, Fin<10>>, aux_100 : AUX Fin<2>, aux_101 : AUX Fin<2>, aux_102 : AUX Arr<60, Fin<2>>, aux_103 : AUX Arr<60, Fin<2>>, aux_104 : AUX Arr<60, Fin<3>>, aux_105 : AUX Arr<60, Fin<10>>, aux_106 : AUX Fin<2>, aux_107 : AUX Fin<2>, ctrl_2 : AUX Arr<16, Fin<2>>, pred_out_2 : AUX Arr<16, Fin<2>>, n_iter_2 : AUX Arr<16, Fin<4>>, s_arg_2 : AUX Arr<16, Fin<20>>) { for (#run_ix in 0 .. < 16) { n_iter_2[#run_ix] *= Distr[uniform : Fin<4>]; pred_out_2[#run_ix] *= X; @@ -190,7 +190,7 @@ uproc UAny_2(or_3_1 : OUT Fin<2>, s_result_4 : OUT Fin<20>, aux_50 : AUX Fin<2>, call-adj NOR_2_U(s_arg_2[#run_ix], aux_107, aux_50, aux_51, aux_52, aux_53, aux_54, aux_55, aux_56, aux_57, aux_58, aux_59, aux_60, aux_61, aux_62, aux_63, aux_64, aux_65, aux_66, aux_67, aux_68, aux_69, aux_70, aux_71, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106); ctrl_2[#run_ix] *= X; } - pred_out_2, or_3_1 *= Embed[(a) => multi_or a]; + pred_out_2, ret_4 *= Embed[(a) => multi_or a]; s_arg_2, pred_out_2, s_result_4 *= Embed[(a, f) => (a selectOn f)]; } @@ -200,21 +200,21 @@ uproc Depth3Nand_U(or_3 : OUT Fin<2>, or_3_1 : AUX Fin<2>, s_result_4 : AUX Fin< } // Grover[...] -uproc Grover_2[k](x_2 : IN Fin<20>, or_3 : OUT Fin<2>, aux_108 : AUX Fin<2>, aux_109 : AUX Fin<2>, aux_110 : AUX Fin<10>, aux_111 : AUX Fin<2>, aux_112 : AUX Fin<2>, aux_113 : AUX Fin<10>, aux_114 : AUX Fin<2>, aux_115 : AUX Fin<2>, aux_116 : AUX Fin<2>, aux_117 : AUX Fin<2>, aux_118 : AUX Arr<146, Fin<2>>, aux_119 : AUX Arr<146, Fin<2>>, aux_120 : AUX Arr<146, Fin<3>>, aux_121 : AUX Arr<146, Fin<10>>, aux_122 : AUX Fin<10>, aux_123 : AUX Fin<2>, aux_124 : AUX Fin<2>, aux_125 : AUX Fin<2>, aux_126 : AUX Fin<2>, aux_127 : AUX Arr<146, Fin<2>>, aux_128 : AUX Arr<146, Fin<2>>, aux_129 : AUX Arr<146, Fin<3>>, aux_130 : AUX Arr<146, Fin<10>>, aux_131 : AUX Fin<2>, aux_132 : AUX Fin<2>, aux_133 : AUX Arr<60, Fin<2>>, aux_134 : AUX Arr<60, Fin<2>>, aux_135 : AUX Arr<60, Fin<3>>, aux_136 : AUX Arr<60, Fin<10>>, aux_137 : AUX Fin<10>, aux_138 : AUX Fin<2>, aux_139 : AUX Fin<2>, aux_140 : AUX Fin<10>, aux_141 : AUX Fin<2>, aux_142 : AUX Fin<2>, aux_143 : AUX Fin<2>, aux_144 : AUX Fin<2>, aux_145 : AUX Arr<146, Fin<2>>, aux_146 : AUX Arr<146, Fin<2>>, aux_147 : AUX Arr<146, Fin<3>>, aux_148 : AUX Arr<146, Fin<10>>, aux_149 : AUX Fin<10>, aux_150 : AUX Fin<2>, aux_151 : AUX Fin<2>, aux_152 : AUX Fin<2>, aux_153 : AUX Fin<2>, aux_154 : AUX Arr<146, Fin<2>>, aux_155 : AUX Arr<146, Fin<2>>, aux_156 : AUX Arr<146, Fin<3>>, aux_157 : AUX Arr<146, Fin<10>>, aux_158 : AUX Fin<2>, aux_159 : AUX Fin<2>, aux_160 : AUX Arr<60, Fin<2>>, aux_161 : AUX Arr<60, Fin<2>>, aux_162 : AUX Arr<60, Fin<3>>, aux_163 : AUX Arr<60, Fin<10>>, aux_164 : AUX Fin<2>) { - or_3 *= X; - or_3 *= H; +uproc Grover_2[k](x_2 : IN Fin<20>, ret_5 : OUT Fin<2>, aux_108 : AUX Fin<2>, aux_109 : AUX Fin<2>, aux_110 : AUX Fin<10>, aux_111 : AUX Fin<2>, aux_112 : AUX Fin<2>, aux_113 : AUX Fin<10>, aux_114 : AUX Fin<2>, aux_115 : AUX Fin<2>, aux_116 : AUX Fin<2>, aux_117 : AUX Fin<2>, aux_118 : AUX Arr<146, Fin<2>>, aux_119 : AUX Arr<146, Fin<2>>, aux_120 : AUX Arr<146, Fin<3>>, aux_121 : AUX Arr<146, Fin<10>>, aux_122 : AUX Fin<10>, aux_123 : AUX Fin<2>, aux_124 : AUX Fin<2>, aux_125 : AUX Fin<2>, aux_126 : AUX Fin<2>, aux_127 : AUX Arr<146, Fin<2>>, aux_128 : AUX Arr<146, Fin<2>>, aux_129 : AUX Arr<146, Fin<3>>, aux_130 : AUX Arr<146, Fin<10>>, aux_131 : AUX Fin<2>, aux_132 : AUX Fin<2>, aux_133 : AUX Arr<60, Fin<2>>, aux_134 : AUX Arr<60, Fin<2>>, aux_135 : AUX Arr<60, Fin<3>>, aux_136 : AUX Arr<60, Fin<10>>, aux_137 : AUX Fin<10>, aux_138 : AUX Fin<2>, aux_139 : AUX Fin<2>, aux_140 : AUX Fin<10>, aux_141 : AUX Fin<2>, aux_142 : AUX Fin<2>, aux_143 : AUX Fin<2>, aux_144 : AUX Fin<2>, aux_145 : AUX Arr<146, Fin<2>>, aux_146 : AUX Arr<146, Fin<2>>, aux_147 : AUX Arr<146, Fin<3>>, aux_148 : AUX Arr<146, Fin<10>>, aux_149 : AUX Fin<10>, aux_150 : AUX Fin<2>, aux_151 : AUX Fin<2>, aux_152 : AUX Fin<2>, aux_153 : AUX Fin<2>, aux_154 : AUX Arr<146, Fin<2>>, aux_155 : AUX Arr<146, Fin<2>>, aux_156 : AUX Arr<146, Fin<3>>, aux_157 : AUX Arr<146, Fin<10>>, aux_158 : AUX Fin<2>, aux_159 : AUX Fin<2>, aux_160 : AUX Arr<60, Fin<2>>, aux_161 : AUX Arr<60, Fin<2>>, aux_162 : AUX Arr<60, Fin<3>>, aux_163 : AUX Arr<60, Fin<10>>, aux_164 : AUX Fin<2>) { + ret_5 *= X; + ret_5 *= H; x_2 *= Distr[uniform : Fin<20>]; repeat (#k) { - call NOR_2_U(x_2, or_3, aux_108, aux_109, aux_110, aux_111, aux_112, aux_113, aux_114, aux_115, aux_116, aux_117, aux_118, aux_119, aux_120, aux_121, aux_122, aux_123, aux_124, aux_125, aux_126, aux_127, aux_128, aux_129, aux_130, aux_131, aux_132, aux_133, aux_134, aux_135, aux_136, aux_137, aux_138, aux_139, aux_140, aux_141, aux_142, aux_143, aux_144, aux_145, aux_146, aux_147, aux_148, aux_149, aux_150, aux_151, aux_152, aux_153, aux_154, aux_155, aux_156, aux_157, aux_158, aux_159, aux_160, aux_161, aux_162, aux_163, aux_164); + call NOR_2_U(x_2, ret_5, aux_108, aux_109, aux_110, aux_111, aux_112, aux_113, aux_114, aux_115, aux_116, aux_117, aux_118, aux_119, aux_120, aux_121, aux_122, aux_123, aux_124, aux_125, aux_126, aux_127, aux_128, aux_129, aux_130, aux_131, aux_132, aux_133, aux_134, aux_135, aux_136, aux_137, aux_138, aux_139, aux_140, aux_141, aux_142, aux_143, aux_144, aux_145, aux_146, aux_147, aux_148, aux_149, aux_150, aux_151, aux_152, aux_153, aux_154, aux_155, aux_156, aux_157, aux_158, aux_159, aux_160, aux_161, aux_162, aux_163, aux_164); x_2 *= Adj-Distr[uniform : Fin<20>]; x_2 *= PhaseOnZero(3.141592653589793); x_2 *= Distr[uniform : Fin<20>]; } - or_3 *= H; - or_3 *= X; + ret_5 *= H; + ret_5 *= X; } -proc QAny_2(or_3 : Fin<2>) { locals : (s_result_5 : Fin<20>, not_done_2 : Fin<2>, Q_sum_2 : Fin<42>, j_2 : Fin<42>, j_lim_2 : Fin<42>) } { +proc QAny_2(ret_5 : Fin<2>) { locals : (s_result_5 : Fin<20>, not_done_2 : Fin<2>, Q_sum_2 : Fin<42>, j_2 : Fin<42>, j_lim_2 : Fin<42>) } { repeat (7) { Q_sum_2 := 0:Fin<42>; for (j_lim_2 in [1:Fin<42>, 1:Fin<42>, 1:Fin<42>, 2:Fin<42>, 2:Fin<42>, 2:Fin<42>, 3:Fin<42>, 4:Fin<42>, 4:Fin<42>, 4:Fin<42>, 4:Fin<42>, 4:Fin<42>, 4:Fin<42>, 4:Fin<42>]) { @@ -222,9 +222,9 @@ proc QAny_2(or_3 : Fin<2>) { locals : (s_result_5 : Fin<20>, not_done_2 : Fin<2> Q_sum_2 := (Q_sum_2 + j_2); not_done_2 := (not_done_2 && (Q_sum_2 <= j_lim_2)); if (not_done_2) { - meas Grover_2[j_2](s_result_5, or_3); - meas NOR_2_U(s_result_5, or_3); - not_done_2 := (not_done_2 && or_3); + meas Grover_2[j_2](s_result_5, ret_5); + meas NOR_2_U(s_result_5, ret_5); + not_done_2 := (not_done_2 && ret_5); } else { skip; } diff --git a/examples/matrix_search/matrix_search.qpl b/examples/matrix_search/matrix_search.qpl index 6410a4d..05ab3dc 100644 --- a/examples/matrix_search/matrix_search.qpl +++ b/examples/matrix_search/matrix_search.qpl @@ -15,7 +15,7 @@ proc IsEntryZero(i0 : Fin<20>, j0 : Fin<10>, e' : Fin<2>) { locals : (e : Fin<2> } // UAny[Fin 10, 2.6774112591424054e-13] -uproc UAny(i : Fin<20>, hasZero_1 : OUT Fin<2>, s_result : OUT Fin<10>, aux : AUX Fin<2>, aux_1 : AUX Fin<2>, aux_2 : AUX Fin<2>, aux_3 : AUX Fin<2>, ctrl : AUX Arr<59, Fin<2>>, pred_out : AUX Arr<59, Fin<2>>, n_iter : AUX Arr<59, Fin<3>>, s_arg : AUX Arr<59, Fin<10>>) { +uproc UAny(i : Fin<20>, ret : OUT Fin<2>, s_result : OUT Fin<10>, aux : AUX Fin<2>, aux_1 : AUX Fin<2>, aux_2 : AUX Fin<2>, aux_3 : AUX Fin<2>, ctrl : AUX Arr<59, Fin<2>>, pred_out : AUX Arr<59, Fin<2>>, n_iter : AUX Arr<59, Fin<3>>, s_arg : AUX Arr<59, Fin<10>>) { for (#run_ix in 0 .. < 59) { n_iter[#run_ix] *= Distr[uniform : Fin<3>]; pred_out[#run_ix] *= X; @@ -40,7 +40,7 @@ uproc UAny(i : Fin<20>, hasZero_1 : OUT Fin<2>, s_result : OUT Fin<10>, aux : AU call-adj IsEntryZero_U(i, s_arg[#run_ix], aux_3, aux, aux_1, aux_2); ctrl[#run_ix] *= X; } - pred_out, hasZero_1 *= Embed[(a) => multi_or a]; + pred_out, ret *= Embed[(a) => multi_or a]; s_arg, pred_out, s_result *= Embed[(a, f) => (a selectOn f)]; } @@ -52,21 +52,21 @@ uproc IsRowAllOnes_U(i : IN Fin<20>, okr : OUT Fin<2>, hasZero : AUX Fin<2>, has } // Grover[...] -uproc Grover[k](i : Fin<20>, x : IN Fin<10>, hasZero : OUT Fin<2>, aux_4 : AUX Fin<2>, aux_5 : AUX Fin<2>, aux_6 : AUX Fin<2>) { - hasZero *= X; - hasZero *= H; +uproc Grover[k](i : Fin<20>, x : IN Fin<10>, ret_1 : OUT Fin<2>, aux_4 : AUX Fin<2>, aux_5 : AUX Fin<2>, aux_6 : AUX Fin<2>) { + ret_1 *= X; + ret_1 *= H; x *= Distr[uniform : Fin<10>]; repeat (#k) { - call IsEntryZero_U(i, x, hasZero, aux_4, aux_5, aux_6); + call IsEntryZero_U(i, x, ret_1, aux_4, aux_5, aux_6); x *= Adj-Distr[uniform : Fin<10>]; x *= PhaseOnZero(3.141592653589793); x *= Distr[uniform : Fin<10>]; } - hasZero *= H; - hasZero *= X; + ret_1 *= H; + ret_1 *= X; } -proc QAny(i : Fin<20>, hasZero : Fin<2>) { locals : (s_result_1 : Fin<10>, not_done : Fin<2>, Q_sum : Fin<30>, j : Fin<30>, j_lim : Fin<30>) } { +proc QAny(i : Fin<20>, ret_1 : Fin<2>) { locals : (s_result_1 : Fin<10>, not_done : Fin<2>, Q_sum : Fin<30>, j : Fin<30>, j_lim : Fin<30>) } { repeat (27) { Q_sum := 0:Fin<30>; for (j_lim in [1:Fin<30>, 1:Fin<30>, 1:Fin<30>, 2:Fin<30>, 2:Fin<30>, 2:Fin<30>, 3:Fin<30>, 3:Fin<30>, 3:Fin<30>, 3:Fin<30>, 3:Fin<30>, 3:Fin<30>, 3:Fin<30>]) { @@ -74,9 +74,9 @@ proc QAny(i : Fin<20>, hasZero : Fin<2>) { locals : (s_result_1 : Fin<10>, not_d Q_sum := (Q_sum + j); not_done := (not_done && (Q_sum <= j_lim)); if (not_done) { - meas Grover[j](i, s_result_1, hasZero); - meas IsEntryZero_U(i, s_result_1, hasZero); - not_done := (not_done && hasZero); + meas Grover[j](i, s_result_1, ret_1); + meas IsEntryZero_U(i, s_result_1, ret_1); + not_done := (not_done && ret_1); } else { skip; } @@ -90,7 +90,7 @@ proc IsRowAllOnes(i : Fin<20>, okr : Fin<2>) { locals : (hasZero : Fin<2>) } { } // UAny[Fin 20, 5.0e-4] -uproc UAny_1(ok_1 : OUT Fin<2>, s_result_2 : OUT Fin<20>, aux_7 : AUX Fin<2>, aux_8 : AUX Fin<2>, aux_9 : AUX Fin<10>, aux_10 : AUX Fin<2>, aux_11 : AUX Fin<2>, aux_12 : AUX Fin<2>, aux_13 : AUX Fin<2>, aux_14 : AUX Arr<59, Fin<2>>, aux_15 : AUX Arr<59, Fin<2>>, aux_16 : AUX Arr<59, Fin<3>>, aux_17 : AUX Arr<59, Fin<10>>, aux_18 : AUX Fin<10>, aux_19 : AUX Fin<2>, aux_20 : AUX Fin<2>, aux_21 : AUX Fin<2>, aux_22 : AUX Fin<2>, aux_23 : AUX Arr<59, Fin<2>>, aux_24 : AUX Arr<59, Fin<2>>, aux_25 : AUX Arr<59, Fin<3>>, aux_26 : AUX Arr<59, Fin<10>>, aux_27 : AUX Fin<2>, aux_28 : AUX Fin<2>, ctrl_1 : AUX Arr<16, Fin<2>>, pred_out_1 : AUX Arr<16, Fin<2>>, n_iter_1 : AUX Arr<16, Fin<4>>, s_arg_1 : AUX Arr<16, Fin<20>>) { +uproc UAny_1(ret_2 : OUT Fin<2>, s_result_2 : OUT Fin<20>, aux_7 : AUX Fin<2>, aux_8 : AUX Fin<2>, aux_9 : AUX Fin<10>, aux_10 : AUX Fin<2>, aux_11 : AUX Fin<2>, aux_12 : AUX Fin<2>, aux_13 : AUX Fin<2>, aux_14 : AUX Arr<59, Fin<2>>, aux_15 : AUX Arr<59, Fin<2>>, aux_16 : AUX Arr<59, Fin<3>>, aux_17 : AUX Arr<59, Fin<10>>, aux_18 : AUX Fin<10>, aux_19 : AUX Fin<2>, aux_20 : AUX Fin<2>, aux_21 : AUX Fin<2>, aux_22 : AUX Fin<2>, aux_23 : AUX Arr<59, Fin<2>>, aux_24 : AUX Arr<59, Fin<2>>, aux_25 : AUX Arr<59, Fin<3>>, aux_26 : AUX Arr<59, Fin<10>>, aux_27 : AUX Fin<2>, aux_28 : AUX Fin<2>, ctrl_1 : AUX Arr<16, Fin<2>>, pred_out_1 : AUX Arr<16, Fin<2>>, n_iter_1 : AUX Arr<16, Fin<4>>, s_arg_1 : AUX Arr<16, Fin<20>>) { for (#run_ix in 0 .. < 16) { n_iter_1[#run_ix] *= Distr[uniform : Fin<4>]; pred_out_1[#run_ix] *= X; @@ -115,7 +115,7 @@ uproc UAny_1(ok_1 : OUT Fin<2>, s_result_2 : OUT Fin<20>, aux_7 : AUX Fin<2>, au call-adj IsRowAllOnes_U(s_arg_1[#run_ix], aux_28, aux_7, aux_8, aux_9, aux_10, aux_11, aux_12, aux_13, aux_14, aux_15, aux_16, aux_17, aux_18, aux_19, aux_20, aux_21, aux_22, aux_23, aux_24, aux_25, aux_26, aux_27); ctrl_1[#run_ix] *= X; } - pred_out_1, ok_1 *= Embed[(a) => multi_or a]; + pred_out_1, ret_2 *= Embed[(a) => multi_or a]; s_arg_1, pred_out_1, s_result_2 *= Embed[(a, f) => (a selectOn f)]; } @@ -125,21 +125,21 @@ uproc HasAllOnesRow_U(ok : OUT Fin<2>, ok_1 : AUX Fin<2>, s_result_2 : AUX Fin<2 } // Grover[...] -uproc Grover_1[k](x_1 : IN Fin<20>, ok : OUT Fin<2>, aux_29 : AUX Fin<2>, aux_30 : AUX Fin<2>, aux_31 : AUX Fin<10>, aux_32 : AUX Fin<2>, aux_33 : AUX Fin<2>, aux_34 : AUX Fin<2>, aux_35 : AUX Fin<2>, aux_36 : AUX Arr<59, Fin<2>>, aux_37 : AUX Arr<59, Fin<2>>, aux_38 : AUX Arr<59, Fin<3>>, aux_39 : AUX Arr<59, Fin<10>>, aux_40 : AUX Fin<10>, aux_41 : AUX Fin<2>, aux_42 : AUX Fin<2>, aux_43 : AUX Fin<2>, aux_44 : AUX Fin<2>, aux_45 : AUX Arr<59, Fin<2>>, aux_46 : AUX Arr<59, Fin<2>>, aux_47 : AUX Arr<59, Fin<3>>, aux_48 : AUX Arr<59, Fin<10>>, aux_49 : AUX Fin<2>) { - ok *= X; - ok *= H; +uproc Grover_1[k](x_1 : IN Fin<20>, ret_3 : OUT Fin<2>, aux_29 : AUX Fin<2>, aux_30 : AUX Fin<2>, aux_31 : AUX Fin<10>, aux_32 : AUX Fin<2>, aux_33 : AUX Fin<2>, aux_34 : AUX Fin<2>, aux_35 : AUX Fin<2>, aux_36 : AUX Arr<59, Fin<2>>, aux_37 : AUX Arr<59, Fin<2>>, aux_38 : AUX Arr<59, Fin<3>>, aux_39 : AUX Arr<59, Fin<10>>, aux_40 : AUX Fin<10>, aux_41 : AUX Fin<2>, aux_42 : AUX Fin<2>, aux_43 : AUX Fin<2>, aux_44 : AUX Fin<2>, aux_45 : AUX Arr<59, Fin<2>>, aux_46 : AUX Arr<59, Fin<2>>, aux_47 : AUX Arr<59, Fin<3>>, aux_48 : AUX Arr<59, Fin<10>>, aux_49 : AUX Fin<2>) { + ret_3 *= X; + ret_3 *= H; x_1 *= Distr[uniform : Fin<20>]; repeat (#k) { - call IsRowAllOnes_U(x_1, ok, aux_29, aux_30, aux_31, aux_32, aux_33, aux_34, aux_35, aux_36, aux_37, aux_38, aux_39, aux_40, aux_41, aux_42, aux_43, aux_44, aux_45, aux_46, aux_47, aux_48, aux_49); + call IsRowAllOnes_U(x_1, ret_3, aux_29, aux_30, aux_31, aux_32, aux_33, aux_34, aux_35, aux_36, aux_37, aux_38, aux_39, aux_40, aux_41, aux_42, aux_43, aux_44, aux_45, aux_46, aux_47, aux_48, aux_49); x_1 *= Adj-Distr[uniform : Fin<20>]; x_1 *= PhaseOnZero(3.141592653589793); x_1 *= Distr[uniform : Fin<20>]; } - ok *= H; - ok *= X; + ret_3 *= H; + ret_3 *= X; } -proc QAny_1(ok : Fin<2>) { locals : (s_result_3 : Fin<20>, not_done_1 : Fin<2>, Q_sum_1 : Fin<42>, j_1 : Fin<42>, j_lim_1 : Fin<42>) } { +proc QAny_1(ret_3 : Fin<2>) { locals : (s_result_3 : Fin<20>, not_done_1 : Fin<2>, Q_sum_1 : Fin<42>, j_1 : Fin<42>, j_lim_1 : Fin<42>) } { repeat (7) { Q_sum_1 := 0:Fin<42>; for (j_lim_1 in [1:Fin<42>, 1:Fin<42>, 1:Fin<42>, 2:Fin<42>, 2:Fin<42>, 2:Fin<42>, 3:Fin<42>, 4:Fin<42>, 4:Fin<42>, 4:Fin<42>, 4:Fin<42>, 4:Fin<42>, 4:Fin<42>, 4:Fin<42>]) { @@ -147,9 +147,9 @@ proc QAny_1(ok : Fin<2>) { locals : (s_result_3 : Fin<20>, not_done_1 : Fin<2>, Q_sum_1 := (Q_sum_1 + j_1); not_done_1 := (not_done_1 && (Q_sum_1 <= j_lim_1)); if (not_done_1) { - meas Grover_1[j_1](s_result_3, ok); - meas IsRowAllOnes_U(s_result_3, ok); - not_done_1 := (not_done_1 && ok); + meas Grover_1[j_1](s_result_3, ret_3); + meas IsRowAllOnes_U(s_result_3, ret_3); + not_done_1 := (not_done_1 && ret_3); } else { skip; } diff --git a/examples/tree_generator/tree_generator_01_knapsack.qpl b/examples/tree_generator/tree_generator_01_knapsack.qpl index 5ff70a7..3a247f2 100644 --- a/examples/tree_generator/tree_generator_01_knapsack.qpl +++ b/examples/tree_generator/tree_generator_01_knapsack.qpl @@ -182,100 +182,100 @@ proc TreeGen(TreeGen_xs : Arr<10, Fin<2>>, TreeGen_pr : Fin<1000>, TreeGen_ok : TreeGen_ok := (TreeGen_pr < TreeGen_pr'); } -uproc UAmplify(KnapsackLoopBody_xs : Arr<10, Fin<2>>, KnapsackLoopBody_pr : Fin<1000>, KnapsackLoopBody_ok_1 : OUT Fin<2>, KnapsackLoopBody_xs'_1 : OUT Arr<10, Fin<2>>, aux_72 : AUX Fin<1000>, aux_73 : AUX Fin<1000>, aux_74 : AUX Fin<1000>, aux_75 : AUX Fin<1000>, aux_76 : AUX Fin<1000>, aux_77 : AUX Fin<1000>, aux_78 : AUX Arr<10, Fin<2>>, aux_79 : AUX Fin<1000>, aux_80 : AUX Fin<1000>, aux_81 : AUX Arr<10, Fin<2>>, aux_82 : AUX Arr<10, Fin<2>>, aux_83 : AUX Arr<10, Fin<2>>, aux_84 : AUX Arr<10, Fin<1000>>, aux_85 : AUX Arr<10, Fin<1000>>, aux_86 : AUX Arr<10, Fin<1000>>, aux_87 : AUX Arr<10, Fin<2>>, aux_88 : AUX Arr<10, Fin<2>>, aux_89 : AUX Arr<10, Fin<1000>>, aux_90 : AUX Arr<10, Fin<1000>>, aux_91 : AUX Arr<10, Fin<2>>, aux_92 : AUX Arr<10, Fin<2>>, aux_93 : AUX Arr<10, Fin<2>>, aux_94 : AUX Arr<10, Fin<2>>, aux_95 : AUX Arr<10, Fin<1000>>, aux_96 : AUX Arr<10, Fin<1000>>, aux_97 : AUX Arr<10, Fin<1000>>, aux_98 : AUX Arr<10, Fin<2>>, aux_99 : AUX Arr<10, Fin<2>>, aux_100 : AUX Arr<10, Arr<10, Fin<2>>>, aux_101 : AUX Arr<10, Fin<1000>>, aux_102 : AUX Arr<10, Fin<1000>>, aux_103 : AUX Arr<10, Fin<1000>>, aux_104 : AUX Arr<10, Fin<1000>>, aux_105 : AUX Arr<10, Fin<10>>, aux_106 : AUX Arr<11, Arr<10, Fin<2>>>, aux_107 : AUX Arr<11, Fin<1000>>, aux_108 : AUX Arr<11, Fin<1000>>, aux_109 : AUX Fin<2>) { - call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1 *= Rz(-0.011526049168105172); - call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(0.005737246821149794); - call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1 *= Rz(-0.0037960730984009164); - call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(0.0028167452554461367); - call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1 *= Rz(-0.0022220689602476425); - call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(0.001819622370843461); - call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1 *= Rz(-0.0015269182335347976); - call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(0.0013026936511006941); - call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1 *= Rz(-0.0011240063319286641); - call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(0.000977072800026606); - call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1 *= Rz(-0.0008531036527738527); - call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(0.0007462208791875804); - call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1 *= Rz(-0.0006523360773607303); - call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(0.000568509060304143); - call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1 *= Rz(-0.0004925625967566173); - call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(0.00042284114222675855); - call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1 *= Rz(-0.00035805416759807123); - call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(0.00029717106231432296); - call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1 *= Rz(-0.0002393484597632499); - call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(0.00018387845064632183); - call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1 *= Rz(-0.00013015048929663258); - call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(0.00007762234316309893); - call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1 *= Rz(-0.000025796959484433774); - call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(-0.000025796959484433774); - call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1 *= Rz(0.00007762234316309893); - call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(-0.00013015048929663258); - call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1 *= Rz(0.00018387845064632183); - call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(-0.0002393484597632499); - call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1 *= Rz(0.00029717106231432296); - call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(-0.00035805416759807123); - call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1 *= Rz(0.00042284114222675855); - call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(-0.0004925625967566173); - call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1 *= Rz(0.000568509060304143); - call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(-0.0006523360773607303); - call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1 *= Rz(0.0007462208791875804); - call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(-0.0008531036527738527); - call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1 *= Rz(0.000977072800026606); - call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(-0.0011240063319286641); - call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1 *= Rz(0.0013026936511006941); - call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(-0.0015269182335347976); - call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1 *= Rz(0.001819622370843461); - call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(-0.0022220689602476425); - call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1 *= Rz(0.0028167452554461367); - call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(-0.0037960730984009164); - call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1 *= Rz(0.005737246821149794); - call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); - KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(-0.011526049168105172); - call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok_1, KnapsackLoopBody_xs'_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); +uproc UAmplify(KnapsackLoopBody_xs : Arr<10, Fin<2>>, KnapsackLoopBody_pr : Fin<1000>, ret : OUT Fin<2>, ret_1 : OUT Arr<10, Fin<2>>, aux_72 : AUX Fin<1000>, aux_73 : AUX Fin<1000>, aux_74 : AUX Fin<1000>, aux_75 : AUX Fin<1000>, aux_76 : AUX Fin<1000>, aux_77 : AUX Fin<1000>, aux_78 : AUX Arr<10, Fin<2>>, aux_79 : AUX Fin<1000>, aux_80 : AUX Fin<1000>, aux_81 : AUX Arr<10, Fin<2>>, aux_82 : AUX Arr<10, Fin<2>>, aux_83 : AUX Arr<10, Fin<2>>, aux_84 : AUX Arr<10, Fin<1000>>, aux_85 : AUX Arr<10, Fin<1000>>, aux_86 : AUX Arr<10, Fin<1000>>, aux_87 : AUX Arr<10, Fin<2>>, aux_88 : AUX Arr<10, Fin<2>>, aux_89 : AUX Arr<10, Fin<1000>>, aux_90 : AUX Arr<10, Fin<1000>>, aux_91 : AUX Arr<10, Fin<2>>, aux_92 : AUX Arr<10, Fin<2>>, aux_93 : AUX Arr<10, Fin<2>>, aux_94 : AUX Arr<10, Fin<2>>, aux_95 : AUX Arr<10, Fin<1000>>, aux_96 : AUX Arr<10, Fin<1000>>, aux_97 : AUX Arr<10, Fin<1000>>, aux_98 : AUX Arr<10, Fin<2>>, aux_99 : AUX Arr<10, Fin<2>>, aux_100 : AUX Arr<10, Arr<10, Fin<2>>>, aux_101 : AUX Arr<10, Fin<1000>>, aux_102 : AUX Arr<10, Fin<1000>>, aux_103 : AUX Arr<10, Fin<1000>>, aux_104 : AUX Arr<10, Fin<1000>>, aux_105 : AUX Arr<10, Fin<10>>, aux_106 : AUX Arr<11, Arr<10, Fin<2>>>, aux_107 : AUX Arr<11, Fin<1000>>, aux_108 : AUX Arr<11, Fin<1000>>, aux_109 : AUX Fin<2>) { + call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret *= Rz(-0.011526049168105172); + call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(0.005737246821149794); + call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret *= Rz(-0.0037960730984009164); + call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(0.0028167452554461367); + call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret *= Rz(-0.0022220689602476425); + call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(0.001819622370843461); + call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret *= Rz(-0.0015269182335347976); + call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(0.0013026936511006941); + call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret *= Rz(-0.0011240063319286641); + call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(0.000977072800026606); + call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret *= Rz(-0.0008531036527738527); + call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(0.0007462208791875804); + call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret *= Rz(-0.0006523360773607303); + call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(0.000568509060304143); + call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret *= Rz(-0.0004925625967566173); + call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(0.00042284114222675855); + call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret *= Rz(-0.00035805416759807123); + call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(0.00029717106231432296); + call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret *= Rz(-0.0002393484597632499); + call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(0.00018387845064632183); + call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret *= Rz(-0.00013015048929663258); + call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(0.00007762234316309893); + call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret *= Rz(-0.000025796959484433774); + call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(-0.000025796959484433774); + call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret *= Rz(0.00007762234316309893); + call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(-0.00013015048929663258); + call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret *= Rz(0.00018387845064632183); + call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(-0.0002393484597632499); + call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret *= Rz(0.00029717106231432296); + call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(-0.00035805416759807123); + call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret *= Rz(0.00042284114222675855); + call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(-0.0004925625967566173); + call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret *= Rz(0.000568509060304143); + call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(-0.0006523360773607303); + call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret *= Rz(0.0007462208791875804); + call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(-0.0008531036527738527); + call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret *= Rz(0.000977072800026606); + call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(-0.0011240063319286641); + call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret *= Rz(0.0013026936511006941); + call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(-0.0015269182335347976); + call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret *= Rz(0.001819622370843461); + call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(-0.0022220689602476425); + call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret *= Rz(0.0028167452554461367); + call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(-0.0037960730984009164); + call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret *= Rz(0.005737246821149794); + call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); + ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109 *= PhaseOnZero(-0.011526049168105172); + call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret, ret_1, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87, aux_88, aux_89, aux_90, aux_91, aux_92, aux_93, aux_94, aux_95, aux_96, aux_97, aux_98, aux_99, aux_100, aux_101, aux_102, aux_103, aux_104, aux_105, aux_106, aux_107, aux_108, aux_109); } uproc KnapsackLoopBody_U(KnapsackLoopBody_xs : IN Arr<10, Fin<2>>, KnapsackLoopBody_i : IN Fin<3>, KnapsackLoopBody_xs_next : OUT Arr<10, Fin<2>>, KnapsackLoopBody_pr : AUX Fin<1000>, KnapsackLoopBody_ok : AUX Fin<2>, KnapsackLoopBody_xs' : AUX Arr<10, Fin<2>>, KnapsackLoopBody_pr_1 : AUX Fin<1000>, aux_54 : AUX Fin<1000>, aux_55 : AUX Arr<10, Fin<2>>, aux_56 : AUX Fin<1000>, aux_57 : AUX Arr<10, Fin<2>>, aux_58 : AUX Fin<1000>, aux_59 : AUX Arr<10, Fin<2>>, aux_60 : AUX Arr<10, Fin<1000>>, aux_61 : AUX Arr<10, Fin<1000>>, aux_62 : AUX Arr<10, Fin<1000>>, aux_63 : AUX Arr<10, Fin<2>>, aux_64 : AUX Arr<10, Fin<1000>>, aux_65 : AUX Arr<10, Fin<1000>>, aux_66 : AUX Arr<10, Fin<1000>>, aux_67 : AUX Arr<10, Fin<1000>>, aux_68 : AUX Arr<10, Arr<10, Fin<2>>>, aux_69 : AUX Arr<10, Fin<10>>, aux_70 : AUX Arr<11, Arr<10, Fin<2>>>, aux_71 : AUX Arr<11, Fin<1000>>, KnapsackLoopBody_ok_1 : AUX Fin<2>, KnapsackLoopBody_xs'_1 : AUX Arr<10, Fin<2>>, aux_72 : AUX Fin<1000>, aux_73 : AUX Fin<1000>, aux_74 : AUX Fin<1000>, aux_75 : AUX Fin<1000>, aux_76 : AUX Fin<1000>, aux_77 : AUX Fin<1000>, aux_78 : AUX Arr<10, Fin<2>>, aux_79 : AUX Fin<1000>, aux_80 : AUX Fin<1000>, aux_81 : AUX Arr<10, Fin<2>>, aux_82 : AUX Arr<10, Fin<2>>, aux_83 : AUX Arr<10, Fin<2>>, aux_84 : AUX Arr<10, Fin<1000>>, aux_85 : AUX Arr<10, Fin<1000>>, aux_86 : AUX Arr<10, Fin<1000>>, aux_87 : AUX Arr<10, Fin<2>>, aux_88 : AUX Arr<10, Fin<2>>, aux_89 : AUX Arr<10, Fin<1000>>, aux_90 : AUX Arr<10, Fin<1000>>, aux_91 : AUX Arr<10, Fin<2>>, aux_92 : AUX Arr<10, Fin<2>>, aux_93 : AUX Arr<10, Fin<2>>, aux_94 : AUX Arr<10, Fin<2>>, aux_95 : AUX Arr<10, Fin<1000>>, aux_96 : AUX Arr<10, Fin<1000>>, aux_97 : AUX Arr<10, Fin<1000>>, aux_98 : AUX Arr<10, Fin<2>>, aux_99 : AUX Arr<10, Fin<2>>, aux_100 : AUX Arr<10, Arr<10, Fin<2>>>, aux_101 : AUX Arr<10, Fin<1000>>, aux_102 : AUX Arr<10, Fin<1000>>, aux_103 : AUX Arr<10, Fin<1000>>, aux_104 : AUX Arr<10, Fin<1000>>, aux_105 : AUX Arr<10, Fin<10>>, aux_106 : AUX Arr<11, Arr<10, Fin<2>>>, aux_107 : AUX Arr<11, Fin<1000>>, aux_108 : AUX Arr<11, Fin<1000>>, aux_109 : AUX Fin<2>, aux_prim : AUX Fin<1000>, aux_prim_1 : AUX Fin<1000>, aux_prim_2 : AUX Fin<1000>, aux_prim_3 : AUX Fin<1000>, aux_prim_4 : AUX Fin<1000>, aux_prim_5 : AUX Fin<1000>, aux_prim_6 : AUX Arr<10, Fin<2>>, aux_prim_7 : AUX Fin<1000>, aux_prim_8 : AUX Fin<1000>, aux_prim_9 : AUX Arr<10, Fin<2>>, aux_prim_10 : AUX Arr<10, Fin<2>>, aux_prim_11 : AUX Arr<10, Fin<2>>, aux_prim_12 : AUX Arr<10, Fin<1000>>, aux_prim_13 : AUX Arr<10, Fin<1000>>, aux_prim_14 : AUX Arr<10, Fin<1000>>, aux_prim_15 : AUX Arr<10, Fin<2>>, aux_prim_16 : AUX Arr<10, Fin<2>>, aux_prim_17 : AUX Arr<10, Fin<1000>>, aux_prim_18 : AUX Arr<10, Fin<1000>>, aux_prim_19 : AUX Arr<10, Fin<2>>, aux_prim_20 : AUX Arr<10, Fin<2>>, aux_prim_21 : AUX Arr<10, Fin<2>>, aux_prim_22 : AUX Arr<10, Fin<2>>, aux_prim_23 : AUX Arr<10, Fin<1000>>, aux_prim_24 : AUX Arr<10, Fin<1000>>, aux_prim_25 : AUX Arr<10, Fin<1000>>, aux_prim_26 : AUX Arr<10, Fin<2>>, aux_prim_27 : AUX Arr<10, Fin<2>>, aux_prim_28 : AUX Arr<10, Arr<10, Fin<2>>>, aux_prim_29 : AUX Arr<10, Fin<1000>>, aux_prim_30 : AUX Arr<10, Fin<1000>>, aux_prim_31 : AUX Arr<10, Fin<1000>>, aux_prim_32 : AUX Arr<10, Fin<1000>>, aux_prim_33 : AUX Arr<10, Fin<10>>, aux_prim_34 : AUX Arr<11, Arr<10, Fin<2>>>, aux_prim_35 : AUX Arr<11, Fin<1000>>, aux_prim_36 : AUX Arr<11, Fin<1000>>, aux_prim_37 : AUX Fin<2>, KnapsackLoopBody_xs_next_1 : AUX Arr<10, Fin<2>>) { @@ -287,17 +287,17 @@ uproc KnapsackLoopBody_U(KnapsackLoopBody_xs : IN Arr<10, Fin<2>>, KnapsackLoopB KnapsackLoopBody_xs_next, KnapsackLoopBody_xs_next_1 *= SWAP; } -uproc Grover[k](KnapsackLoopBody_xs : Arr<10, Fin<2>>, KnapsackLoopBody_pr : Fin<1000>, KnapsackLoopBody_ok : Fin<2>, KnapsackLoopBody_xs' : Arr<10, Fin<2>>, aux_110 : AUX Fin<1000>, aux_111 : AUX Fin<1000>, aux_112 : AUX Fin<1000>, aux_113 : AUX Fin<1000>, aux_114 : AUX Fin<1000>, aux_115 : AUX Fin<1000>, aux_116 : AUX Arr<10, Fin<2>>, aux_117 : AUX Fin<1000>, aux_118 : AUX Fin<1000>, aux_119 : AUX Arr<10, Fin<2>>, aux_120 : AUX Arr<10, Fin<2>>, aux_121 : AUX Arr<10, Fin<2>>, aux_122 : AUX Arr<10, Fin<1000>>, aux_123 : AUX Arr<10, Fin<1000>>, aux_124 : AUX Arr<10, Fin<1000>>, aux_125 : AUX Arr<10, Fin<2>>, aux_126 : AUX Arr<10, Fin<2>>, aux_127 : AUX Arr<10, Fin<1000>>, aux_128 : AUX Arr<10, Fin<1000>>, aux_129 : AUX Arr<10, Fin<2>>, aux_130 : AUX Arr<10, Fin<2>>, aux_131 : AUX Arr<10, Fin<2>>, aux_132 : AUX Arr<10, Fin<2>>, aux_133 : AUX Arr<10, Fin<1000>>, aux_134 : AUX Arr<10, Fin<1000>>, aux_135 : AUX Arr<10, Fin<1000>>, aux_136 : AUX Arr<10, Fin<2>>, aux_137 : AUX Arr<10, Fin<2>>, aux_138 : AUX Arr<10, Arr<10, Fin<2>>>, aux_139 : AUX Arr<10, Fin<1000>>, aux_140 : AUX Arr<10, Fin<1000>>, aux_141 : AUX Arr<10, Fin<1000>>, aux_142 : AUX Arr<10, Fin<1000>>, aux_143 : AUX Arr<10, Fin<10>>, aux_144 : AUX Arr<11, Arr<10, Fin<2>>>, aux_145 : AUX Arr<11, Fin<1000>>, aux_146 : AUX Arr<11, Fin<1000>>, aux_147 : AUX Fin<2>) { - call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok, KnapsackLoopBody_xs', aux_110, aux_111, aux_112, aux_113, aux_114, aux_115, aux_116, aux_117, aux_118, aux_119, aux_120, aux_121, aux_122, aux_123, aux_124, aux_125, aux_126, aux_127, aux_128, aux_129, aux_130, aux_131, aux_132, aux_133, aux_134, aux_135, aux_136, aux_137, aux_138, aux_139, aux_140, aux_141, aux_142, aux_143, aux_144, aux_145, aux_146, aux_147); +uproc Grover[k](KnapsackLoopBody_xs : Arr<10, Fin<2>>, KnapsackLoopBody_pr : Fin<1000>, ret_4 : Fin<2>, ret_5 : Arr<10, Fin<2>>, aux_110 : AUX Fin<1000>, aux_111 : AUX Fin<1000>, aux_112 : AUX Fin<1000>, aux_113 : AUX Fin<1000>, aux_114 : AUX Fin<1000>, aux_115 : AUX Fin<1000>, aux_116 : AUX Arr<10, Fin<2>>, aux_117 : AUX Fin<1000>, aux_118 : AUX Fin<1000>, aux_119 : AUX Arr<10, Fin<2>>, aux_120 : AUX Arr<10, Fin<2>>, aux_121 : AUX Arr<10, Fin<2>>, aux_122 : AUX Arr<10, Fin<1000>>, aux_123 : AUX Arr<10, Fin<1000>>, aux_124 : AUX Arr<10, Fin<1000>>, aux_125 : AUX Arr<10, Fin<2>>, aux_126 : AUX Arr<10, Fin<2>>, aux_127 : AUX Arr<10, Fin<1000>>, aux_128 : AUX Arr<10, Fin<1000>>, aux_129 : AUX Arr<10, Fin<2>>, aux_130 : AUX Arr<10, Fin<2>>, aux_131 : AUX Arr<10, Fin<2>>, aux_132 : AUX Arr<10, Fin<2>>, aux_133 : AUX Arr<10, Fin<1000>>, aux_134 : AUX Arr<10, Fin<1000>>, aux_135 : AUX Arr<10, Fin<1000>>, aux_136 : AUX Arr<10, Fin<2>>, aux_137 : AUX Arr<10, Fin<2>>, aux_138 : AUX Arr<10, Arr<10, Fin<2>>>, aux_139 : AUX Arr<10, Fin<1000>>, aux_140 : AUX Arr<10, Fin<1000>>, aux_141 : AUX Arr<10, Fin<1000>>, aux_142 : AUX Arr<10, Fin<1000>>, aux_143 : AUX Arr<10, Fin<10>>, aux_144 : AUX Arr<11, Arr<10, Fin<2>>>, aux_145 : AUX Arr<11, Fin<1000>>, aux_146 : AUX Arr<11, Fin<1000>>, aux_147 : AUX Fin<2>) { + call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret_4, ret_5, aux_110, aux_111, aux_112, aux_113, aux_114, aux_115, aux_116, aux_117, aux_118, aux_119, aux_120, aux_121, aux_122, aux_123, aux_124, aux_125, aux_126, aux_127, aux_128, aux_129, aux_130, aux_131, aux_132, aux_133, aux_134, aux_135, aux_136, aux_137, aux_138, aux_139, aux_140, aux_141, aux_142, aux_143, aux_144, aux_145, aux_146, aux_147); repeat (#k) { - KnapsackLoopBody_ok *= Z; - call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok, KnapsackLoopBody_xs', aux_110, aux_111, aux_112, aux_113, aux_114, aux_115, aux_116, aux_117, aux_118, aux_119, aux_120, aux_121, aux_122, aux_123, aux_124, aux_125, aux_126, aux_127, aux_128, aux_129, aux_130, aux_131, aux_132, aux_133, aux_134, aux_135, aux_136, aux_137, aux_138, aux_139, aux_140, aux_141, aux_142, aux_143, aux_144, aux_145, aux_146, aux_147); - KnapsackLoopBody_ok, KnapsackLoopBody_xs', aux_110, aux_111, aux_112, aux_113, aux_114, aux_115, aux_116, aux_117, aux_118, aux_119, aux_120, aux_121, aux_122, aux_123, aux_124, aux_125, aux_126, aux_127, aux_128, aux_129, aux_130, aux_131, aux_132, aux_133, aux_134, aux_135, aux_136, aux_137, aux_138, aux_139, aux_140, aux_141, aux_142, aux_143, aux_144, aux_145, aux_146, aux_147 *= PhaseOnZero(3.141592653589793); - call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok, KnapsackLoopBody_xs', aux_110, aux_111, aux_112, aux_113, aux_114, aux_115, aux_116, aux_117, aux_118, aux_119, aux_120, aux_121, aux_122, aux_123, aux_124, aux_125, aux_126, aux_127, aux_128, aux_129, aux_130, aux_131, aux_132, aux_133, aux_134, aux_135, aux_136, aux_137, aux_138, aux_139, aux_140, aux_141, aux_142, aux_143, aux_144, aux_145, aux_146, aux_147); + ret_4 *= Z; + call-adj TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret_4, ret_5, aux_110, aux_111, aux_112, aux_113, aux_114, aux_115, aux_116, aux_117, aux_118, aux_119, aux_120, aux_121, aux_122, aux_123, aux_124, aux_125, aux_126, aux_127, aux_128, aux_129, aux_130, aux_131, aux_132, aux_133, aux_134, aux_135, aux_136, aux_137, aux_138, aux_139, aux_140, aux_141, aux_142, aux_143, aux_144, aux_145, aux_146, aux_147); + ret_4, ret_5, aux_110, aux_111, aux_112, aux_113, aux_114, aux_115, aux_116, aux_117, aux_118, aux_119, aux_120, aux_121, aux_122, aux_123, aux_124, aux_125, aux_126, aux_127, aux_128, aux_129, aux_130, aux_131, aux_132, aux_133, aux_134, aux_135, aux_136, aux_137, aux_138, aux_139, aux_140, aux_141, aux_142, aux_143, aux_144, aux_145, aux_146, aux_147 *= PhaseOnZero(3.141592653589793); + call TreeGen_U(KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret_4, ret_5, aux_110, aux_111, aux_112, aux_113, aux_114, aux_115, aux_116, aux_117, aux_118, aux_119, aux_120, aux_121, aux_122, aux_123, aux_124, aux_125, aux_126, aux_127, aux_128, aux_129, aux_130, aux_131, aux_132, aux_133, aux_134, aux_135, aux_136, aux_137, aux_138, aux_139, aux_140, aux_141, aux_142, aux_143, aux_144, aux_145, aux_146, aux_147); } } -proc QAmplify(KnapsackLoopBody_xs : Arr<10, Fin<2>>, KnapsackLoopBody_pr : Fin<1000>, KnapsackLoopBody_ok : Fin<2>, KnapsackLoopBody_xs' : Arr<10, Fin<2>>) { locals : (not_done : Fin<2>, Q_sum : Fin<92>, j : Fin<92>, j_lim : Fin<92>) } { +proc QAmplify(KnapsackLoopBody_xs : Arr<10, Fin<2>>, KnapsackLoopBody_pr : Fin<1000>, ret_2 : Fin<2>, ret_3 : Arr<10, Fin<2>>) { locals : (not_done : Fin<2>, Q_sum : Fin<92>, j : Fin<92>, j_lim : Fin<92>) } { not_done := 0:Fin<2>; repeat (8) { Q_sum := 0:Fin<92>; @@ -306,8 +306,8 @@ proc QAmplify(KnapsackLoopBody_xs : Arr<10, Fin<2>>, KnapsackLoopBody_pr : Fin<1 Q_sum := (Q_sum + j); not_done := (not_done && (Q_sum <= j_lim)); if (not_done) { - meas Grover[j](KnapsackLoopBody_xs, KnapsackLoopBody_pr, KnapsackLoopBody_ok, KnapsackLoopBody_xs'); - not_done := (not_done && not KnapsackLoopBody_ok); + meas Grover[j](KnapsackLoopBody_xs, KnapsackLoopBody_pr, ret_2, ret_3); + not_done := (not_done && not ret_2); } else { skip; } diff --git a/src/Traq/Primitives/Max/QMax.hs b/src/Traq/Primitives/Max/QMax.hs index 7458a78..0472968 100644 --- a/src/Traq/Primitives/Max/QMax.hs +++ b/src/Traq/Primitives/Max/QMax.hs @@ -215,7 +215,7 @@ instance (P.TypingReqs size, Integral size, RealFloat prec, Show prec, A.SizeToP -- Build: qsearch with bounded fuel qsearch <- do - p <- Compiler.buildProc "QSearch" [] [("fuel", fuel_ty), ("y", res_ty), ("x", arg_ty)] $ do + p <- Compiler.buildProc "QSearch_infty" [] [("fuel", fuel_ty), ("y", res_ty), ("x", arg_ty)] $ do Compiler.addStmt $ CQPL.CommentS "TODO: QSearch body" Compiler.addProc p From da358781eeff9500c1023017d03a6b46a5b08613 Mon Sep 17 00:00:00 2001 From: Anurudh Peduri Date: Tue, 24 Feb 2026 23:47:58 +0000 Subject: [PATCH 28/28] impl qmax --- examples/hillclimb/steep_max_sat.qpl | 43 ++++++++++++---- src/Traq/Primitives/Max/QMax.hs | 63 +++++++++++++++++++++-- src/Traq/Primitives/Search/QSearchCFNW.hs | 1 + 3 files changed, 94 insertions(+), 13 deletions(-) diff --git a/examples/hillclimb/steep_max_sat.qpl b/examples/hillclimb/steep_max_sat.qpl index 2c2547a..f7b03e7 100644 --- a/examples/hillclimb/steep_max_sat.qpl +++ b/examples/hillclimb/steep_max_sat.qpl @@ -46,16 +46,41 @@ uproc Compare(hillclimb_iter_x : Arr<20, Fin<2>>, y : Fin<1000>, x_1 : Fin<20>, y, out_1, b *= Embed[(a, b) => (a < b)]; } -proc QSearch_infty(hillclimb_iter_x : Arr<20, Fin<2>>, fuel : Fin<750>, y : Fin<1000>, x : Fin<20>) { locals : () } { - // TODO: QSearch body +uproc Grover[k](hillclimb_iter_x : Arr<20, Fin<2>>, y_1 : Fin<1000>, x_2 : Fin<20>, b_1 : Fin<2>, aux_18 : AUX Fin<1000>, aux_19 : AUX Fin<1000>, aux_20 : AUX Fin<2>, aux_21 : AUX Fin<2>, aux_22 : AUX Arr<20, Fin<2>>, aux_23 : AUX Fin<1000>, aux_24 : AUX Fin<2>, aux_25 : AUX Fin<2>, aux_26 : AUX Arr<20, Fin<2>>, aux_27 : AUX Fin<1000>) { + b_1 *= X; + b_1 *= H; + x_2 *= Distr[uniform : Fin<20>]; + repeat (#k) { + call Compare(hillclimb_iter_x, y_1, x_2, b_1, aux_18, aux_19, aux_20, aux_21, aux_22, aux_23, aux_24, aux_25, aux_26, aux_27); + x_2 *= Adj-Distr[uniform : Fin<20>]; + x_2 *= PhaseOnZero(3.141592653589793); + x_2 *= Distr[uniform : Fin<20>]; + } + b_1 *= H; + b_1 *= X; +} + +proc QSearch_infty(hillclimb_iter_x : Arr<20, Fin<2>>, fuel : Fin<750>, y_2 : Fin<1000>, x_3 : Fin<20>) { locals : (j_lim : Fin<750>, j : Fin<750>, not_done : Fin<2>, b_2 : Fin<2>) } { + not_done := 1:Fin<2>; + for (j_lim in [1:Fin<750>, 1:Fin<750>, 1:Fin<750>, 2:Fin<750>, 2:Fin<750>, 2:Fin<750>, 3:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>, 4:Fin<750>]) { + j :=$ [1 .. j_lim]; + not_done := (not_done && (j <= fuel)); + if (not_done) { + fuel := (fuel - j); + meas Grover[j](hillclimb_iter_x, y_2, x_3, b_2); + not_done := (not_done && not b_2); + } else { + skip; + } + } } -proc QMax(hillclimb_iter_x : Arr<20, Fin<2>>, ret_2 : Fin<1000>, ret_3 : Fin<20>) { locals : (fuel : Fin<750>) } { - fuel := 749:Fin<750>; +proc QMax(hillclimb_iter_x : Arr<20, Fin<2>>, ret_2 : Fin<1000>, ret_3 : Fin<20>) { locals : (fuel_1 : Fin<750>) } { + fuel_1 := 749:Fin<750>; ret_3 :=$ uniform : Fin<20>; call good(hillclimb_iter_x, ret_3, ret_2); repeat (750) { - call QSearch_infty(hillclimb_iter_x, fuel, ret_2, ret_3); + call QSearch_infty(hillclimb_iter_x, fuel_1, ret_2, ret_3); } } @@ -66,15 +91,15 @@ proc hillclimb_iter(hillclimb_iter_x : Arr<20, Fin<2>>, hillclimb_iter_x' : Arr< hillclimb_iter_x' := update hillclimb_iter_x[hillclimb_iter_i] = hillclimb_iter_b; } -uproc hillclimb_3_U(hillclimb_3_x_3 : OUT Arr<20, Fin<2>>, hillclimb_3_x_0 : AUX Arr<20, Fin<2>>, hillclimb_3_x_1 : AUX Arr<20, Fin<2>>, hillclimb_3_x_2 : AUX Arr<20, Fin<2>>, hillclimb_3_x_0_1 : AUX Arr<20, Fin<2>>, hillclimb_3_x_0_1_1 : AUX Arr<20, Fin<2>>, hillclimb_3_x_1_1 : AUX Arr<20, Fin<2>>, aux_18 : AUX Fin<1000>, aux_19 : AUX Fin<20>, aux_20 : AUX Fin<2>, aux_21 : AUX Fin<2>, aux_22 : AUX Fin<1000>, aux_23 : AUX Fin<20>, aux_24 : AUX Arr<20, Fin<20>>, aux_25 : AUX Arr<20, Fin<1000>>, aux_26 : AUX Arr<20, Fin<1000>>, aux_27 : AUX Arr<20, Fin<2>>, aux_28 : AUX Arr<20, Fin<2>>, aux_29 : AUX Arr<20, Arr<20, Fin<2>>>, aux_30 : AUX Arr<20, Fin<1000>>, aux_31 : AUX Arr<20, Fin<2>>, aux_32 : AUX Arr<20, Fin<2>>, aux_33 : AUX Arr<20, Arr<20, Fin<2>>>, aux_34 : AUX Arr<20, Fin<1000>>, aux_35 : AUX Fin<2>, aux_36 : AUX Fin<2>, aux_37 : AUX Arr<20, Fin<2>>, hillclimb_3_x_2_1 : AUX Arr<20, Fin<2>>, aux_38 : AUX Fin<1000>, aux_39 : AUX Fin<20>, aux_40 : AUX Fin<2>, aux_41 : AUX Fin<2>, aux_42 : AUX Fin<1000>, aux_43 : AUX Fin<20>, aux_44 : AUX Arr<20, Fin<20>>, aux_45 : AUX Arr<20, Fin<1000>>, aux_46 : AUX Arr<20, Fin<1000>>, aux_47 : AUX Arr<20, Fin<2>>, aux_48 : AUX Arr<20, Fin<2>>, aux_49 : AUX Arr<20, Arr<20, Fin<2>>>, aux_50 : AUX Arr<20, Fin<1000>>, aux_51 : AUX Arr<20, Fin<2>>, aux_52 : AUX Arr<20, Fin<2>>, aux_53 : AUX Arr<20, Arr<20, Fin<2>>>, aux_54 : AUX Arr<20, Fin<1000>>, aux_55 : AUX Fin<2>, aux_56 : AUX Fin<2>, aux_57 : AUX Arr<20, Fin<2>>, hillclimb_3_x_3_1 : AUX Arr<20, Fin<2>>, aux_58 : AUX Fin<1000>, aux_59 : AUX Fin<20>, aux_60 : AUX Fin<2>, aux_61 : AUX Fin<2>, aux_62 : AUX Fin<1000>, aux_63 : AUX Fin<20>, aux_64 : AUX Arr<20, Fin<20>>, aux_65 : AUX Arr<20, Fin<1000>>, aux_66 : AUX Arr<20, Fin<1000>>, aux_67 : AUX Arr<20, Fin<2>>, aux_68 : AUX Arr<20, Fin<2>>, aux_69 : AUX Arr<20, Arr<20, Fin<2>>>, aux_70 : AUX Arr<20, Fin<1000>>, aux_71 : AUX Arr<20, Fin<2>>, aux_72 : AUX Arr<20, Fin<2>>, aux_73 : AUX Arr<20, Arr<20, Fin<2>>>, aux_74 : AUX Arr<20, Fin<1000>>, aux_75 : AUX Fin<2>, aux_76 : AUX Fin<2>, aux_77 : AUX Arr<20, Fin<2>>) { +uproc hillclimb_3_U(hillclimb_3_x_3 : OUT Arr<20, Fin<2>>, hillclimb_3_x_0 : AUX Arr<20, Fin<2>>, hillclimb_3_x_1 : AUX Arr<20, Fin<2>>, hillclimb_3_x_2 : AUX Arr<20, Fin<2>>, hillclimb_3_x_0_1 : AUX Arr<20, Fin<2>>, hillclimb_3_x_0_1_1 : AUX Arr<20, Fin<2>>, hillclimb_3_x_1_1 : AUX Arr<20, Fin<2>>, aux_28 : AUX Fin<1000>, aux_29 : AUX Fin<20>, aux_30 : AUX Fin<2>, aux_31 : AUX Fin<2>, aux_32 : AUX Fin<1000>, aux_33 : AUX Fin<20>, aux_34 : AUX Arr<20, Fin<20>>, aux_35 : AUX Arr<20, Fin<1000>>, aux_36 : AUX Arr<20, Fin<1000>>, aux_37 : AUX Arr<20, Fin<2>>, aux_38 : AUX Arr<20, Fin<2>>, aux_39 : AUX Arr<20, Arr<20, Fin<2>>>, aux_40 : AUX Arr<20, Fin<1000>>, aux_41 : AUX Arr<20, Fin<2>>, aux_42 : AUX Arr<20, Fin<2>>, aux_43 : AUX Arr<20, Arr<20, Fin<2>>>, aux_44 : AUX Arr<20, Fin<1000>>, aux_45 : AUX Fin<2>, aux_46 : AUX Fin<2>, aux_47 : AUX Arr<20, Fin<2>>, hillclimb_3_x_2_1 : AUX Arr<20, Fin<2>>, aux_48 : AUX Fin<1000>, aux_49 : AUX Fin<20>, aux_50 : AUX Fin<2>, aux_51 : AUX Fin<2>, aux_52 : AUX Fin<1000>, aux_53 : AUX Fin<20>, aux_54 : AUX Arr<20, Fin<20>>, aux_55 : AUX Arr<20, Fin<1000>>, aux_56 : AUX Arr<20, Fin<1000>>, aux_57 : AUX Arr<20, Fin<2>>, aux_58 : AUX Arr<20, Fin<2>>, aux_59 : AUX Arr<20, Arr<20, Fin<2>>>, aux_60 : AUX Arr<20, Fin<1000>>, aux_61 : AUX Arr<20, Fin<2>>, aux_62 : AUX Arr<20, Fin<2>>, aux_63 : AUX Arr<20, Arr<20, Fin<2>>>, aux_64 : AUX Arr<20, Fin<1000>>, aux_65 : AUX Fin<2>, aux_66 : AUX Fin<2>, aux_67 : AUX Arr<20, Fin<2>>, hillclimb_3_x_3_1 : AUX Arr<20, Fin<2>>, aux_68 : AUX Fin<1000>, aux_69 : AUX Fin<20>, aux_70 : AUX Fin<2>, aux_71 : AUX Fin<2>, aux_72 : AUX Fin<1000>, aux_73 : AUX Fin<20>, aux_74 : AUX Arr<20, Fin<20>>, aux_75 : AUX Arr<20, Fin<1000>>, aux_76 : AUX Arr<20, Fin<1000>>, aux_77 : AUX Arr<20, Fin<2>>, aux_78 : AUX Arr<20, Fin<2>>, aux_79 : AUX Arr<20, Arr<20, Fin<2>>>, aux_80 : AUX Arr<20, Fin<1000>>, aux_81 : AUX Arr<20, Fin<2>>, aux_82 : AUX Arr<20, Fin<2>>, aux_83 : AUX Arr<20, Arr<20, Fin<2>>>, aux_84 : AUX Arr<20, Fin<1000>>, aux_85 : AUX Fin<2>, aux_86 : AUX Fin<2>, aux_87 : AUX Arr<20, Fin<2>>) { hillclimb_3_x_0_1 *= Distr[uniform : Arr<20, Fin<2>>]; hillclimb_3_x_0_1, hillclimb_3_x_0_1_1 *= COPY; hillclimb_3_x_0, hillclimb_3_x_0_1 *= SWAP; - call hillclimb_iter_U(hillclimb_3_x_0, hillclimb_3_x_1_1, aux_18, aux_19, aux_20, aux_21, aux_22, aux_23, aux_24, aux_25, aux_26, aux_27, aux_28, aux_29, aux_30, aux_31, aux_32, aux_33, aux_34, aux_35, aux_36, aux_37); + call hillclimb_iter_U(hillclimb_3_x_0, hillclimb_3_x_1_1, aux_28, aux_29, aux_30, aux_31, aux_32, aux_33, aux_34, aux_35, aux_36, aux_37, aux_38, aux_39, aux_40, aux_41, aux_42, aux_43, aux_44, aux_45, aux_46, aux_47); hillclimb_3_x_1, hillclimb_3_x_1_1 *= SWAP; - call hillclimb_iter_U(hillclimb_3_x_1, hillclimb_3_x_2_1, aux_38, aux_39, aux_40, aux_41, aux_42, aux_43, aux_44, aux_45, aux_46, aux_47, aux_48, aux_49, aux_50, aux_51, aux_52, aux_53, aux_54, aux_55, aux_56, aux_57); + call hillclimb_iter_U(hillclimb_3_x_1, hillclimb_3_x_2_1, aux_48, aux_49, aux_50, aux_51, aux_52, aux_53, aux_54, aux_55, aux_56, aux_57, aux_58, aux_59, aux_60, aux_61, aux_62, aux_63, aux_64, aux_65, aux_66, aux_67); hillclimb_3_x_2, hillclimb_3_x_2_1 *= SWAP; - call hillclimb_iter_U(hillclimb_3_x_2, hillclimb_3_x_3_1, aux_58, aux_59, aux_60, aux_61, aux_62, aux_63, aux_64, aux_65, aux_66, aux_67, aux_68, aux_69, aux_70, aux_71, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77); + call hillclimb_iter_U(hillclimb_3_x_2, hillclimb_3_x_3_1, aux_68, aux_69, aux_70, aux_71, aux_72, aux_73, aux_74, aux_75, aux_76, aux_77, aux_78, aux_79, aux_80, aux_81, aux_82, aux_83, aux_84, aux_85, aux_86, aux_87); hillclimb_3_x_3, hillclimb_3_x_3_1 *= SWAP; } diff --git a/src/Traq/Primitives/Max/QMax.hs b/src/Traq/Primitives/Max/QMax.hs index 0472968..90db887 100644 --- a/src/Traq/Primitives/Max/QMax.hs +++ b/src/Traq/Primitives/Max/QMax.hs @@ -33,6 +33,7 @@ import qualified Traq.CQPL as CQPL import qualified Traq.Compiler as Compiler import Traq.Prelude import Traq.Primitives.Class +import Traq.Primitives.Search.QSearchCFNW (groverK) import qualified Traq.ProtoLang as P import qualified Traq.Utils.Printing as PP @@ -209,14 +210,68 @@ instance (P.TypingReqs size, Integral size, RealFloat prec, Show prec, A.SizeToP Compiler.addProc cmp return cmp - let _N = P.domainSize arg_ty - let max_queries = ceiling (_WQMax _N eps) :: size + grover_k <- do + meta_k <- Compiler.newIdent "k" + x <- Compiler.newIdent "x" + prev <- Compiler.newIdent "y" + b <- Compiler.newIdent "b" + + uproc <- Compiler.buildUProc "Grover" [meta_k] [(prev, res_ty), (x, arg_ty), (b, P.tbool)] $ do + let aux_tys = CQPL.proc_param_types cmp & drop 3 + aux_vars <- mapM Compiler.allocLocal aux_tys + Compiler.addUStmt $ + groverK + (P.MetaName meta_k) + (x, arg_ty) + b + (\_ _ -> CQPL.UCallS (CQPL.proc_name cmp) False (map CQPL.Arg ([prev, x, b] ++ aux_vars))) + + Compiler.addProc uproc + return uproc + + let n = P.domainSize arg_ty + let max_queries = ceiling (_WQMax n eps) :: size let fuel_ty = P.Fin max_queries -- Build: qsearch with bounded fuel qsearch <- do - p <- Compiler.buildProc "QSearch_infty" [] [("fuel", fuel_ty), ("y", res_ty), ("x", arg_ty)] $ do - Compiler.addStmt $ CQPL.CommentS "TODO: QSearch body" + (fuel, y, x) <- forOf each ("fuel", "y", "x") Compiler.newIdent + p <- Compiler.buildProc "QSearch_infty" [] [(fuel, fuel_ty), (y, res_ty), (x, arg_ty)] $ do + -- compute the limits for sampling `j` in each iteration. + sampling_ranges <- do + let lambda = 6 / 5 + let sqrt_n = sqrt (fromIntegral n) + + let go :: size -> [size] -> [size] + go _ [] = [] + go lim (q : _) | q > lim = [] + go lim (q : qs) = q : go (lim - q) qs + + let nxt :: Float -> Float; nxt m = min (lambda * m) sqrt_n + let js_f :: [Float]; js_f = lambda : map nxt js_f + let js :: [size]; js = map floor js_f + + return $ go max_queries js + + -- body + j_lim <- Compiler.allocLocalWithPrefix "j_lim" fuel_ty + j <- Compiler.allocLocalWithPrefix "j" fuel_ty + not_done <- Compiler.allocLocalWithPrefix "not_done" P.tbool + b <- Compiler.allocLocalWithPrefix "b" P.tbool + Compiler.addStmt $ CQPL.AssignS [not_done] (P.ConstE (P.FinV 1) P.tbool) + + Compiler.withStmt (CQPL.ForInArray j_lim fuel_ty [P.ConstE (P.FinV v_j) fuel_ty | v_j <- sampling_ranges]) $ do + Compiler.addStmt $ CQPL.RandomDynS j j_lim + Compiler.addStmt $ CQPL.AssignS [not_done] (P.VarE not_done P..&&. (P.VarE j P..<=. P.VarE fuel)) + Compiler.withStmt (CQPL.ifThenS not_done) $ do + Compiler.addStmt $ CQPL.AssignS [fuel] (P.BinOpE P.SubOp (P.VarE fuel) (P.VarE j)) + Compiler.addStmt $ + CQPL.CallS + { CQPL.fun = CQPL.UProcAndMeas (CQPL.proc_name grover_k) + , CQPL.meta_params = [Right j] + , CQPL.args = map CQPL.Arg [y, x, b] + } + Compiler.addStmt $ CQPL.AssignS [not_done] (P.VarE not_done P..&&. P.notE (P.VarE b)) Compiler.addProc p return p diff --git a/src/Traq/Primitives/Search/QSearchCFNW.hs b/src/Traq/Primitives/Search/QSearchCFNW.hs index 3f5e1ca..1791373 100644 --- a/src/Traq/Primitives/Search/QSearchCFNW.hs +++ b/src/Traq/Primitives/Search/QSearchCFNW.hs @@ -23,6 +23,7 @@ module Traq.Primitives.Search.QSearchCFNW ( algoQSearchZalka, -- * CQ Implementation + groverK, -- * Cost Formulas _EQSearch,