Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion examples/cryptanalysis/grover_meets_simon.qpl
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ uproc USearch(ret_2 : OUT Fin<2>, ret_3 : OUT BitVec<20>, aux_10 : AUX 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, ret_2 *= Embed[(a) => multi_or a];
pred_out, ret_2 *= NamedGate("any");
s_arg, pred_out, ret_3 *= Embed[(a, f) => (a selectOn f)];
}

Expand Down
2 changes: 1 addition & 1 deletion examples/hillclimb/max_sat_hillclimb.qpl
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ uproc USearch(x : Arr<20, Fin<2>>, ret : OUT Fin<2>, ret_1 : OUT Fin<20>, aux :
call-adj good_U(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, ret *= Embed[(a) => multi_or a];
pred_out, ret *= NamedGate("any");
s_arg, pred_out, ret_1 *= Embed[(a, f) => (a selectOn f)];
}

Expand Down
2 changes: 0 additions & 2 deletions examples/matrix_search/demo.hs
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,6 @@ import Traq.Primitives.Search.RandomSearch (RandomSearch (..))

import Lens.Micro.GHC

import qualified Traq.Data.Symbolic as Sym

data Options = Options
{ optCompareCosts :: Bool
, optDemo :: Bool
Expand Down
6 changes: 3 additions & 3 deletions examples/matrix_search/depth3_NAND_formula.qpl
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ uproc UAny(i1 : Fin<20>, j1 : Fin<10>, ret : OUT Fin<2>, s_result : OUT Fin<10>,
call-adj NOR_0_U(i1, j1, s_arg[#run_ix], aux_3, aux, aux_1, aux_2);
ctrl[#run_ix] *= X;
}
pred_out, ret *= Embed[(a) => multi_or a];
pred_out, ret *= NamedGate("any");
s_arg, pred_out, s_result *= Embed[(a, f) => (a selectOn f)];
}

Expand Down Expand Up @@ -112,7 +112,7 @@ uproc UAny_1(i2 : Fin<20>, ret_2 : 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, ret_2 *= Embed[(a) => multi_or a];
pred_out_1, ret_2 *= NamedGate("any");
s_arg_1, pred_out_1, s_result_2 *= Embed[(a, f) => (a selectOn f)];
}

Expand Down Expand Up @@ -185,7 +185,7 @@ uproc UAny_2(ret_4 : 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, ret_4 *= Embed[(a) => multi_or a];
pred_out_2, ret_4 *= NamedGate("any");
s_arg_2, pred_out_2, s_result_4 *= Embed[(a, f) => (a selectOn f)];
}

Expand Down
4 changes: 2 additions & 2 deletions examples/matrix_search/matrix_search.qpl
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ uproc UAny(i : Fin<20>, ret : OUT Fin<2>, s_result : OUT Fin<10>, aux : AUX Fin<
call-adj IsEntryZero_U(i, s_arg[#run_ix], aux_2, aux, aux_1);
ctrl[#run_ix] *= X;
}
pred_out, ret *= Embed[(a) => multi_or a];
pred_out, ret *= NamedGate("any");
s_arg, pred_out, s_result *= Embed[(a, f) => (a selectOn f)];
}

Expand Down Expand Up @@ -112,7 +112,7 @@ uproc UAny_1(ret_2 : OUT Fin<2>, s_result_2 : OUT Fin<20>, aux_5 : AUX Fin<2>, a
call-adj IsRowAllOnes_U(s_arg_1[#run_ix], aux_24, aux_5, aux_6, 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);
ctrl_1[#run_ix] *= X;
}
pred_out_1, ret_2 *= Embed[(a) => multi_or a];
pred_out_1, ret_2 *= NamedGate("any");
s_arg_1, pred_out_1, s_result_2 *= Embed[(a, f) => (a selectOn f)];
}

Expand Down
4 changes: 3 additions & 1 deletion examples/primitives/Makefile
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
PROJ_DEPS=../../src ../../tools ../../traq.cabal

all: any.qpl max.qpl
all: any.qpl max.qpl \
amplify.qpl camplify.qpl \
any_det.qpl any_rand.qpl

full: all any-qiskit.py

Expand Down
107 changes: 107 additions & 0 deletions examples/primitives/amplify.qpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
ext uproc sampler_U(Fin<16>, Fin<2>, Fin<8>);

ext proc sampler(Fin<16>, Fin<2>, Fin<8>);

uproc UAmplify(x : Fin<16>, ret : OUT Fin<2>, ret_1 : OUT Fin<8>) {
call sampler_U(x, ret, ret_1);
ret *= Rz(-0.45880404720437845);
call-adj sampler_U(x, ret, ret_1);
ret, ret_1 *= PhaseOnZero(0.23007762205118054);
call sampler_U(x, ret, ret_1);
ret *= Rz(-0.15107941343907155);
call-adj sampler_U(x, ret, ret_1);
ret, ret_1 *= PhaseOnZero(0.11055632715919277);
call sampler_U(x, ret, ret_1);
ret *= Rz(-0.08551175610269639);
call-adj sampler_U(x, ret, ret_1);
ret, ret_1 *= PhaseOnZero(0.06820693287363513);
call sampler_U(x, ret, ret_1);
ret *= Rz(-0.05530726879787692);
call-adj sampler_U(x, ret, ret_1);
ret, ret_1 *= PhaseOnZero(0.045136695082362434);
call sampler_U(x, ret, ret_1);
ret *= Rz(-0.03675728103029493);
call-adj sampler_U(x, ret, ret_1);
ret, ret_1 *= PhaseOnZero(0.02959972860863297);
call sampler_U(x, ret, ret_1);
ret *= Rz(-0.023294806002161352);
call-adj sampler_U(x, ret, ret_1);
ret, ret_1 *= PhaseOnZero(0.017588592502775145);
call sampler_U(x, ret, ret_1);
ret *= Rz(-0.012296334270558974);
call-adj sampler_U(x, ret, ret_1);
ret, ret_1 *= PhaseOnZero(0.007275450120649902);
call sampler_U(x, ret, ret_1);
ret *= Rz(-0.002408512345023363);
call-adj sampler_U(x, ret, ret_1);
ret, ret_1 *= PhaseOnZero(-0.002408512345023363);
call sampler_U(x, ret, ret_1);
ret *= Rz(0.007275450120649902);
call-adj sampler_U(x, ret, ret_1);
ret, ret_1 *= PhaseOnZero(-0.012296334270558974);
call sampler_U(x, ret, ret_1);
ret *= Rz(0.017588592502775145);
call-adj sampler_U(x, ret, ret_1);
ret, ret_1 *= PhaseOnZero(-0.023294806002161352);
call sampler_U(x, ret, ret_1);
ret *= Rz(0.02959972860863297);
call-adj sampler_U(x, ret, ret_1);
ret, ret_1 *= PhaseOnZero(-0.03675728103029493);
call sampler_U(x, ret, ret_1);
ret *= Rz(0.045136695082362434);
call-adj sampler_U(x, ret, ret_1);
ret, ret_1 *= PhaseOnZero(-0.05530726879787692);
call sampler_U(x, ret, ret_1);
ret *= Rz(0.06820693287363513);
call-adj sampler_U(x, ret, ret_1);
ret, ret_1 *= PhaseOnZero(-0.08551175610269639);
call sampler_U(x, ret, ret_1);
ret *= Rz(0.11055632715919277);
call-adj sampler_U(x, ret, ret_1);
ret, ret_1 *= PhaseOnZero(-0.15107941343907155);
call sampler_U(x, ret, ret_1);
ret *= Rz(0.23007762205118054);
call-adj sampler_U(x, ret, ret_1);
ret, ret_1 *= PhaseOnZero(-0.45880404720437845);
call sampler_U(x, ret, ret_1);
}

uproc main_U(x : IN Fin<16>, b : OUT Fin<2>, y : OUT Fin<8>, b_1 : AUX Fin<2>, y_1 : AUX Fin<8>) {
call UAmplify(x, b_1, y_1);
b, y, b_1, y_1 *= SWAP;
}

uproc Grover[k](x : Fin<16>, ret_4 : Fin<2>, ret_5 : Fin<8>) {
call sampler_U(x, ret_4, ret_5);
repeat (#k) {
ret_4 *= Z;
call-adj sampler_U(x, ret_4, ret_5);
ret_4, ret_5 *= PhaseOnZero(3.141592653589793);
call sampler_U(x, ret_4, ret_5);
}
}

proc QAmplify(x : Fin<16>, ret_2 : Fin<2>, ret_3 : Fin<8>) { locals : (not_done : Fin<2>, Q_sum : Fin<92>, j : Fin<92>, j_lim : Fin<92>) } {
not_done := const 0:Fin<2>;
repeat (5) {
Q_sum := const 0:Fin<92>;
for (j_lim in [const 1:Fin<92>, const 1:Fin<92>, const 1:Fin<92>, const 2:Fin<92>, const 2:Fin<92>, const 2:Fin<92>, const 3:Fin<92>, const 4:Fin<92>, const 5:Fin<92>, const 6:Fin<92>, const 7:Fin<92>, const 8:Fin<92>, const 10:Fin<92>, const 10:Fin<92>, const 10:Fin<92>, const 10:Fin<92>, const 10:Fin<92>]) {
j :=$ [1 .. j_lim];
Q_sum := (Q_sum + j);
not_done := (not_done && (Q_sum <= j_lim));
if (not_done) {
meas Grover[j](x, ret_2, ret_3);
not_done := (not_done && not ret_2);
} else {
skip;
}
}
}
}

proc main(x : Fin<16>, b : Fin<2>, y : Fin<8>) { locals : () } {
call QAmplify(x, b, y);
}


// qubits: 12
6 changes: 6 additions & 0 deletions examples/primitives/amplify.traq
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
ext fn sampler(Fin<16>) -> (Bool, Fin<8>) end

fn main(x: Fin<16>) -> (Bool, Fin<8>) do
b, y <- @amplify<0.01>[sampler(x)];
return b, y
end
2 changes: 1 addition & 1 deletion examples/primitives/any.qpl
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ uproc UAny(ret : OUT Fin<2>, s_result : OUT Fin<20>, aux : AUX Fin<2>, ctrl : AU
call-adj Oracle_U(s_arg[#run_ix], aux);
ctrl[#run_ix] *= X;
}
pred_out, ret *= Embed[(a) => multi_or a];
pred_out, ret *= NamedGate("any");
s_arg, pred_out, s_result *= Embed[(a, f) => (a selectOn f)];
}

Expand Down
34 changes: 34 additions & 0 deletions examples/primitives/any_det.qpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
ext uproc Oracle_U(Fin<20>, Fin<2>);

ext proc Oracle(Fin<20>, Fin<2>);

uproc UDetSearch(ok_2 : Fin<2>, x_1 : AUX Fin<20>, tmp_flag : AUX Arr<20, Fin<2>>, tmp_x : AUX Arr<20, Fin<20>>) {
for (#i in Fin<20>) {
tmp_x[#i] *= Embed[() => #i];
call Oracle_U(tmp_x[#i], tmp_flag[#i]);
}
tmp_flag, tmp_x, ok_2, x_1 *= NamedGate("SelectOnTrue");
}

uproc main_U(ok : OUT Fin<2>, ok_1 : AUX Fin<2>, aux_prim : AUX Fin<20>, aux_prim_1 : AUX Arr<20, Fin<2>>, aux_prim_2 : AUX Arr<20, Fin<20>>) {
call UDetSearch(ok_1, aux_prim, aux_prim_1, aux_prim_2);
ok, ok_1 *= SWAP;
}

proc DetSearch(ok_3 : Fin<2>) { locals : (x_3 : Fin<20>) } {
for (#i_1 in 0 .. < 20) {
if (ok_3) {
skip;
} else {
x_3 := #i_1;
call Oracle(ok_3, x_3);
}
}
}

proc main(ok : Fin<2>) { locals : () } {
call DetSearch(ok);
}


// qubits: 127
6 changes: 6 additions & 0 deletions examples/primitives/any_det.traq
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
ext fn Oracle(Fin<20>) -> Bool end

fn main() -> Bool do
ok <- @any_det<Fin<20>>[Oracle(_)];
return ok
end
34 changes: 34 additions & 0 deletions examples/primitives/any_rand.qpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
ext uproc Oracle_U(Fin<20>, Fin<2>);

ext proc Oracle(Fin<20>, Fin<2>);

uproc UDetSearch(ok_2 : Fin<2>, x_1 : AUX Fin<20>, tmp_flag : AUX Arr<20, Fin<2>>, tmp_x : AUX Arr<20, Fin<20>>) {
for (#i in Fin<20>) {
tmp_x[#i] *= Embed[() => #i];
call Oracle_U(tmp_x[#i], tmp_flag[#i]);
}
tmp_flag, tmp_x, ok_2, x_1 *= NamedGate("SelectOnTrue");
}

uproc main_U(ok : OUT Fin<2>, ok_1 : AUX Fin<2>, aux_prim : AUX Fin<20>, aux_prim_1 : AUX Arr<20, Fin<2>>, aux_prim_2 : AUX Arr<20, Fin<20>>) {
call UDetSearch(ok_1, aux_prim, aux_prim_1, aux_prim_2);
ok, ok_1 *= SWAP;
}

proc RandSearch(ok_3 : Fin<2>) { locals : (x_3 : Fin<20>) } {
repeat (93) {
if (ok_3) {
skip;
} else {
x_3 :=$ uniform : Fin<20>;
call Oracle(ok_3, x_3);
}
}
}

proc main(ok : Fin<2>) { locals : () } {
call RandSearch(ok);
}


// qubits: 127
6 changes: 6 additions & 0 deletions examples/primitives/any_rand.traq
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
ext fn Oracle(Fin<20>) -> Bool end

fn main() -> Bool do
ok <- @any_rand<Fin<20>>[Oracle(_)];
return ok
end
32 changes: 32 additions & 0 deletions examples/primitives/camplify.qpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
ext uproc sampler_U(Fin<16>, Fin<2>, Fin<8>);

ext proc sampler(Fin<16>, Fin<2>, Fin<8>);

uproc UCAmplify(x : Fin<16>, ret : Fin<2>, ret_1 : Fin<8>, aux : AUX Arr<459, Fin<2>>, aux_1 : AUX Arr<459, Fin<8>>) {
for (#i in Fin<459>) {
call sampler_U(x, aux[#i], aux_1[#i]);
}
aux, aux_1, ret, ret_1 *= NamedGate("Select");
}

uproc main_U(x : IN Fin<16>, b : OUT Fin<2>, y : OUT Fin<8>, b_1 : AUX Fin<2>, y_1 : AUX Fin<8>, aux_prim : AUX Arr<459, Fin<2>>, aux_prim_1 : AUX Arr<459, Fin<8>>) {
call UCAmplify(x, b_1, y_1, aux_prim, aux_prim_1);
b, y, b_1, y_1 *= SWAP;
}

proc CAmplify(x : Fin<16>, b_2 : Fin<2>, y_2 : Fin<8>) { locals : () } {
repeat (459) {
if (b_2) {
skip;
} else {
call sampler(x, b_2, y_2);
}
}
}

proc main(x : Fin<16>, b : Fin<2>, y : Fin<8>) { locals : () } {
call CAmplify(x, b, y);
}


// qubits: 1848
6 changes: 6 additions & 0 deletions examples/primitives/camplify.traq
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
ext fn sampler(Fin<16>) -> (Bool, Fin<8>) end

fn main(x: Fin<16>) -> (Bool, Fin<8>) do
b, y <- @camplify<0.01>[sampler(x)];
return b, y
end
2 changes: 1 addition & 1 deletion examples/search/clustering.qpl
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ uproc USearch(dmax : Fin<100>, ret : OUT Fin<2>, ret_1 : OUT Tup<Fin<10>, Fin<10
call-adj check_U(dmax, 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, ret *= Embed[(a) => multi_or a];
pred_out, ret *= NamedGate("any");
s_arg, pred_out, ret_1 *= Embed[(a, f) => (a selectOn f)];
}

Expand Down
4 changes: 2 additions & 2 deletions examples/search/triangle_finding.qpl
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ uproc UAny(i : Fin<10>, j : Fin<10>, ret : OUT Fin<2>, s_result : OUT Fin<10>, a
call-adj CompletesTriangle_U(i, j, s_arg[#run_ix], aux_23, aux, aux_1, aux_2, aux_3, aux_4, aux_5, aux_6, 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);
ctrl[#run_ix] *= X;
}
pred_out, ret *= Embed[(a) => multi_or a];
pred_out, ret *= NamedGate("any");
s_arg, pred_out, s_result *= Embed[(a, f) => (a selectOn f)];
}

Expand Down Expand Up @@ -151,7 +151,7 @@ uproc UAny_1(ret_2 : OUT Fin<2>, s_result_2 : OUT Tup<Fin<10>, Fin<10>>, aux_47
call-adj HasTriangleCycle_U(s_arg_1[#run_ix], aux_114, 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, 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, aux_107, aux_108, aux_109, aux_110, aux_111, aux_112, aux_113);
ctrl_1[#run_ix] *= X;
}
pred_out_1, ret_2 *= Embed[(a) => multi_or a];
pred_out_1, ret_2 *= NamedGate("any");
s_arg_1, pred_out_1, s_result_2 *= Embed[(a, f) => (a selectOn f)];
}

Expand Down
2 changes: 1 addition & 1 deletion experiments/matrixsearch.hs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ symbolicEx = do
let m = Sym.var "M" :: Sym.Sym SizeT
let CPL.Program ex_fs = mkMatrixExample (\t f -> CPL.PrimCallE $ Primitive [f] $ QSearchSym $ PrimSearch AnyK t) n m

forM_ (tail $ inits ex_fs) $ \fs -> do
forM_ (drop 1 $ inits ex_fs) $ \fs -> do
let eps = A.failProb (Sym.var "ε" :: Sym.Sym Double)

putStrLn $ printf "Worst case cost of %s" (CPL.fun_name $ last fs)
Expand Down
3 changes: 2 additions & 1 deletion experiments/matrixsearchqcost.hs
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,8 @@ instance MatrixType (SizeT, SizeT, Value -> Value -> Bool) where

instance MatrixType [[Value]] where
nRows = length
nCols = length . head
nCols [] = 0
nCols (r : _) = length r

toValueFun mat [CPL.FinV i, CPL.FinV j] = [mat !! fromIntegral i !! fromIntegral j]
toValueFun _ _ = error "unsupported"
Expand Down
2 changes: 1 addition & 1 deletion src/Traq/CPL/Lenses.hs
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ instance MapPrec (DistrExpr prec size) where
instance (MapPrec ext) => MapPrec (Expr ext) where
type MappedPrec (Expr ext) prec' = Expr (MappedPrec ext prec')

mapPrec f (BasicExprE e) = BasicExprE e
mapPrec _ (BasicExprE e) = BasicExprE e
mapPrec f (RandomSampleE e) = RandomSampleE (mapPrec f e)
mapPrec f (PrimCallE prim) = PrimCallE (mapPrec f prim)
mapPrec _ FunCallE{..} = FunCallE{..}
Expand Down
Loading
Loading