From 37739a8da5fe35957391a81c88f560bb1574c73e Mon Sep 17 00:00:00 2001 From: Calum Holker Date: Mon, 4 Dec 2023 15:52:43 +0000 Subject: [PATCH 01/14] cflow-opt --- .DS_Store | Bin 0 -> 8196 bytes benchmark.py | 139 - benchmarking.py | 409 +++ circuits/.DS_Store | Bin 0 -> 8196 bytes circuits/Fast/QFT16_before | 590 ---- circuits/benchmarking_circuits/.DS_Store | Bin 0 -> 6148 bytes circuits/benchmarking_circuits/Fast/.DS_Store | Bin 0 -> 6148 bytes .../Fast/before/.DS_Store | Bin 0 -> 6148 bytes .../Fast/before/Adder8} | 0 .../Fast/before/QFT8} | 0 .../Fast/before/QFTAdd8} | 0 .../Fast/before/adder_8} | 0 .../Fast/before/barenco_tof_10} | 0 .../Fast/before/barenco_tof_3} | 0 .../Fast/before/barenco_tof_4} | 0 .../Fast/before/barenco_tof_5} | 0 .../Fast/before/csla_mux_3_original} | 0 .../Fast/before/csum_mux_9_corrected} | 0 .../Fast/before/gf2^4_mult} | 0 .../Fast/before/gf2^5_mult} | 0 .../Fast/before/gf2^6_mult} | 0 .../Fast/before/gf2^7_mult} | 0 .../Fast/before/gf2^8_mult} | 0 .../Fast/before}/grover_5.qc | 0 .../Fast/before}/ham15-low.qc | 0 .../Fast/before}/hwb6.qc | 0 .../Fast/before/mod5_4} | 0 .../Fast/before/mod_mult_55} | 0 .../Fast/before/mod_red_21} | 0 .../Fast/before/qcla_adder_10} | 0 .../Fast/before/qcla_com_7} | 0 .../Fast/before/qcla_mod_7} | 0 .../Fast/before}/qft_4.qc | 0 .../Fast/before/rc_adder_6} | 0 .../Fast/before/tof_10} | 0 .../Fast/before/tof_3} | 0 .../Fast/before/tof_4} | 0 .../Fast/before/tof_5} | 0 .../Fast/before/vbe_adder_3} | 0 .../Fast/nrscm/Adder8} | 0 .../Fast/nrscm/QFT16} | 0 .../Fast/nrscm/QFT8} | 0 .../Fast/nrscm/QFTAdd8} | 0 .../Fast/nrscm/adder_8} | 0 .../Fast/nrscm/barenco_tof_10} | 0 .../Fast/nrscm/barenco_tof_3} | 0 .../Fast/nrscm/barenco_tof_4} | 0 .../Fast/nrscm/barenco_tof_5} | 0 .../Fast/nrscm/csla_mux_3_original} | 0 .../Fast/nrscm/csum_mux_9_corrected} | 0 .../Fast/nrscm/gf2^4_mult} | 0 .../Fast/nrscm/gf2^5_mult} | 0 .../Fast/nrscm/gf2^6_mult} | 0 .../Fast/nrscm/gf2^7_mult} | 0 .../Fast/nrscm/gf2^8_mult} | 0 .../Fast/nrscm/mod5_4} | 0 .../Fast/nrscm/mod_mult_55} | 0 .../Fast/nrscm/mod_red_21} | 0 .../Fast/nrscm/qcla_adder_10} | 0 .../Fast/nrscm/qcla_com_7} | 0 .../Fast/nrscm/qcla_mod_7} | 0 .../Fast/nrscm/rc_adder_6} | 0 .../Fast/nrscm/tof_10} | 0 .../Fast/nrscm/tof_3} | 0 .../Fast/nrscm/tof_4} | 0 .../Fast/nrscm/tof_5} | 0 .../Fast/nrscm/vbe_adder_3} | 0 .../Fast/tpar/adder_8.qc} | 0 .../Fast/tpar/barenco_tof_10.qc} | 0 .../Fast/tpar/barenco_tof_3.qc} | 0 .../Fast/tpar/barenco_tof_4.qc} | 0 .../Fast/tpar/barenco_tof_5.qc} | 0 .../Fast/tpar/csla_mux_3.qc} | 0 .../Fast/tpar/csum_mux_9.qc} | 0 .../Fast/tpar/gf2^4_mult.qc} | 0 .../Fast/tpar/gf2^5_mult.qc} | 0 .../Fast/tpar/gf2^6_mult.qc} | 0 .../Fast/tpar/gf2^7_mult.qc} | 0 .../Fast/tpar/gf2^8_mult.qc} | 0 .../Fast/tpar/grover_5.qc} | 0 .../Fast/tpar/mod5_4.qc} | 0 .../Fast/tpar/mod_mult_55.qc} | 0 .../Fast/tpar/mod_red_21.qc} | 0 .../Fast/tpar/qcla_adder_10.qc} | 0 .../Fast/tpar/qcla_com_7.qc} | 0 .../Fast/tpar/qcla_mod_7.qc} | 0 .../Fast/tpar/rc_adder_6.qc} | 0 .../Fast/tpar/tof_10.qc} | 0 .../Fast/tpar/tof_3.qc} | 0 .../Fast/tpar/tof_4.qc} | 0 .../Fast/tpar/tof_5.qc} | 0 .../Fast/tpar/vbe_adder_3.qc} | 0 circuits/benchmarking_circuits/Slow/.DS_Store | Bin 0 -> 6148 bytes .../Slow/before/Adder16} | 0 .../Slow/before/Adder32} | 0 .../Slow/before/Adder64} | 0 .../Slow/before/QFT32} | 0 .../Slow/before/QFTAdd16} | 0 .../Slow/before/QFTAdd32} | 0 .../Slow/before/gf2^10_mult} | 0 .../Slow/before/gf2^16_mult} | 0 .../Slow/before/gf2^9_mult} | 0 .../Slow/before}/ham15-high.qc | 0 .../Slow/before}/ham15-med.qc | 0 .../Slow/before}/hwb8.qc | 0 .../Slow/before/mod_adder_1024} | 0 .../Slow/before}/nth_prime6.tfc | 0 .../Slow/before}/nth_prime8.tfc | 0 .../Slow/nrscm/Adder16} | 0 .../Slow/nrscm/Adder32} | 0 .../Slow/nrscm/Adder64} | 0 .../Slow/nrscm/QFT32} | 0 .../Slow/nrscm/QFTAdd16} | 0 .../Slow/nrscm/QFTAdd32} | 0 .../Slow/nrscm/gf2^10_mult} | 0 .../Slow/nrscm/gf2^16_mult} | 0 .../Slow/nrscm/gf2^9_mult} | 0 .../Slow/nrscm/mod_adder_1024} | 0 .../Slow/tpar/gf2^10_mult.qc} | 0 .../Slow/tpar/gf2^16_mult.qc} | 0 .../Slow/tpar/gf2^9_mult.qc} | 0 .../Slow/tpar/mod_adder_1024.qc} | 0 demos/.DS_Store | Bin 0 -> 6148 bytes demos/circuit_optimisation/.DS_Store | Bin 0 -> 6148 bytes .../benchmark/circuit_groups.pkl | Bin 0 -> 413 bytes .../benchmark/circuits.pkl | Bin 0 -> 1031888 bytes .../circuit_optimisation/benchmark/funcs.pkl | Bin 0 -> 1526 bytes .../benchmark/rand_data.pkl | Bin 0 -> 1472 bytes .../benchmark/routines.pkl | Bin 0 -> 24 bytes demos/circuit_optimisation/benchmarking.ipynb | 2976 +++++++++++++++++ demos/circuit_optimisation/qft-opt.ipynb | 773 +++++ doc/.DS_Store | Bin 0 -> 6148 bytes doc/api.rst | 113 +- misc/.DS_Store | Bin 0 -> 6148 bytes pyzx/.DS_Store | Bin 0 -> 8196 bytes pyzx/__init__.py | 2 + pyzx/extract.py | 192 +- pyzx/flow.py | 295 ++ pyzx/gflow.py | 117 - pyzx/graph/base.py | 299 +- pyzx/graph/graph_s.py | 42 +- pyzx/heuristics.py | 125 + pyzx/rules.py | 892 +++-- pyzx/simplify.py | 598 ++-- 144 files changed, 6090 insertions(+), 1472 deletions(-) create mode 100644 .DS_Store delete mode 100644 benchmark.py create mode 100644 benchmarking.py create mode 100644 circuits/.DS_Store delete mode 100644 circuits/Fast/QFT16_before create mode 100644 circuits/benchmarking_circuits/.DS_Store create mode 100644 circuits/benchmarking_circuits/Fast/.DS_Store create mode 100644 circuits/benchmarking_circuits/Fast/before/.DS_Store rename circuits/{Fast/Adder8_before => benchmarking_circuits/Fast/before/Adder8} (100%) rename circuits/{Fast/QFT8_before => benchmarking_circuits/Fast/before/QFT8} (100%) rename circuits/{Fast/QFTAdd8_before => benchmarking_circuits/Fast/before/QFTAdd8} (100%) rename circuits/{Fast/adder_8_before => benchmarking_circuits/Fast/before/adder_8} (100%) rename circuits/{Fast/barenco_tof_10_before => benchmarking_circuits/Fast/before/barenco_tof_10} (100%) rename circuits/{Fast/barenco_tof_3_before => benchmarking_circuits/Fast/before/barenco_tof_3} (100%) rename circuits/{Fast/barenco_tof_4_before => benchmarking_circuits/Fast/before/barenco_tof_4} (100%) rename circuits/{Fast/barenco_tof_5_before => benchmarking_circuits/Fast/before/barenco_tof_5} (100%) rename circuits/{Fast/csla_mux_3_original_before => benchmarking_circuits/Fast/before/csla_mux_3_original} (100%) rename circuits/{Fast/csum_mux_9_corrected_before => benchmarking_circuits/Fast/before/csum_mux_9_corrected} (100%) rename circuits/{Fast/gf2^4_mult_before => benchmarking_circuits/Fast/before/gf2^4_mult} (100%) rename circuits/{Fast/gf2^5_mult_before => benchmarking_circuits/Fast/before/gf2^5_mult} (100%) rename circuits/{Fast/gf2^6_mult_before => benchmarking_circuits/Fast/before/gf2^6_mult} (100%) rename circuits/{Fast/gf2^7_mult_before => benchmarking_circuits/Fast/before/gf2^7_mult} (100%) rename circuits/{Fast/gf2^8_mult_before => benchmarking_circuits/Fast/before/gf2^8_mult} (100%) rename circuits/{Fast => benchmarking_circuits/Fast/before}/grover_5.qc (100%) rename circuits/{Fast => benchmarking_circuits/Fast/before}/ham15-low.qc (100%) rename circuits/{Fast => benchmarking_circuits/Fast/before}/hwb6.qc (100%) rename circuits/{Fast/mod5_4_before => benchmarking_circuits/Fast/before/mod5_4} (100%) rename circuits/{Fast/mod_mult_55_before => benchmarking_circuits/Fast/before/mod_mult_55} (100%) rename circuits/{Fast/mod_red_21_before => benchmarking_circuits/Fast/before/mod_red_21} (100%) rename circuits/{Fast/qcla_adder_10_before => benchmarking_circuits/Fast/before/qcla_adder_10} (100%) rename circuits/{Fast/qcla_com_7_before => benchmarking_circuits/Fast/before/qcla_com_7} (100%) rename circuits/{Fast/qcla_mod_7_before => benchmarking_circuits/Fast/before/qcla_mod_7} (100%) rename circuits/{Fast => benchmarking_circuits/Fast/before}/qft_4.qc (100%) rename circuits/{Fast/rc_adder_6_before => benchmarking_circuits/Fast/before/rc_adder_6} (100%) rename circuits/{Fast/tof_10_before => benchmarking_circuits/Fast/before/tof_10} (100%) rename circuits/{Fast/tof_3_before => benchmarking_circuits/Fast/before/tof_3} (100%) rename circuits/{Fast/tof_4_before => benchmarking_circuits/Fast/before/tof_4} (100%) rename circuits/{Fast/tof_5_before => benchmarking_circuits/Fast/before/tof_5} (100%) rename circuits/{Fast/vbe_adder_3_before => benchmarking_circuits/Fast/before/vbe_adder_3} (100%) rename circuits/{Fast/Adder8_after_heavy => benchmarking_circuits/Fast/nrscm/Adder8} (100%) rename circuits/{Fast/QFT16_after => benchmarking_circuits/Fast/nrscm/QFT16} (100%) rename circuits/{Fast/QFT8_after => benchmarking_circuits/Fast/nrscm/QFT8} (100%) rename circuits/{Fast/QFTAdd8_after => benchmarking_circuits/Fast/nrscm/QFTAdd8} (100%) rename circuits/{Fast/adder_8_after_heavy => benchmarking_circuits/Fast/nrscm/adder_8} (100%) rename circuits/{Fast/barenco_tof_10_after_heavy => benchmarking_circuits/Fast/nrscm/barenco_tof_10} (100%) rename circuits/{Fast/barenco_tof_3_after_heavy => benchmarking_circuits/Fast/nrscm/barenco_tof_3} (100%) rename circuits/{Fast/barenco_tof_4_after_heavy => benchmarking_circuits/Fast/nrscm/barenco_tof_4} (100%) rename circuits/{Fast/barenco_tof_5_after_heavy => benchmarking_circuits/Fast/nrscm/barenco_tof_5} (100%) rename circuits/{Fast/csla_mux_3_original_after_heavy => benchmarking_circuits/Fast/nrscm/csla_mux_3_original} (100%) rename circuits/{Fast/csum_mux_9_corrected_after_heavy => benchmarking_circuits/Fast/nrscm/csum_mux_9_corrected} (100%) rename circuits/{Fast/gf2^4_mult_after_heavy => benchmarking_circuits/Fast/nrscm/gf2^4_mult} (100%) rename circuits/{Fast/gf2^5_mult_after_heavy => benchmarking_circuits/Fast/nrscm/gf2^5_mult} (100%) rename circuits/{Fast/gf2^6_mult_after_heavy => benchmarking_circuits/Fast/nrscm/gf2^6_mult} (100%) rename circuits/{Fast/gf2^7_mult_after_heavy => benchmarking_circuits/Fast/nrscm/gf2^7_mult} (100%) rename circuits/{Fast/gf2^8_mult_after_heavy => benchmarking_circuits/Fast/nrscm/gf2^8_mult} (100%) rename circuits/{Fast/mod5_4_after_heavy => benchmarking_circuits/Fast/nrscm/mod5_4} (100%) rename circuits/{Fast/mod_mult_55_after_heavy => benchmarking_circuits/Fast/nrscm/mod_mult_55} (100%) rename circuits/{Fast/mod_red_21_after_heavy => benchmarking_circuits/Fast/nrscm/mod_red_21} (100%) rename circuits/{Fast/qcla_adder_10_after_heavy => benchmarking_circuits/Fast/nrscm/qcla_adder_10} (100%) rename circuits/{Fast/qcla_com_7_after_heavy => benchmarking_circuits/Fast/nrscm/qcla_com_7} (100%) rename circuits/{Fast/qcla_mod_7_after_heavy => benchmarking_circuits/Fast/nrscm/qcla_mod_7} (100%) rename circuits/{Fast/rc_adder_6_after_heavy => benchmarking_circuits/Fast/nrscm/rc_adder_6} (100%) rename circuits/{Fast/tof_10_after_heavy => benchmarking_circuits/Fast/nrscm/tof_10} (100%) rename circuits/{Fast/tof_3_after_heavy => benchmarking_circuits/Fast/nrscm/tof_3} (100%) rename circuits/{Fast/tof_4_after_heavy => benchmarking_circuits/Fast/nrscm/tof_4} (100%) rename circuits/{Fast/tof_5_after_heavy => benchmarking_circuits/Fast/nrscm/tof_5} (100%) rename circuits/{Fast/vbe_adder_3_after_heavy => benchmarking_circuits/Fast/nrscm/vbe_adder_3} (100%) rename circuits/{Fast/adder_8_tpar.qc => benchmarking_circuits/Fast/tpar/adder_8.qc} (100%) rename circuits/{Fast/barenco_tof_10_tpar.qc => benchmarking_circuits/Fast/tpar/barenco_tof_10.qc} (100%) rename circuits/{Fast/barenco_tof_3_tpar.qc => benchmarking_circuits/Fast/tpar/barenco_tof_3.qc} (100%) rename circuits/{Fast/barenco_tof_4_tpar.qc => benchmarking_circuits/Fast/tpar/barenco_tof_4.qc} (100%) rename circuits/{Fast/barenco_tof_5_tpar.qc => benchmarking_circuits/Fast/tpar/barenco_tof_5.qc} (100%) rename circuits/{Fast/csla_mux_3_tpar.qc => benchmarking_circuits/Fast/tpar/csla_mux_3.qc} (100%) rename circuits/{Fast/csum_mux_9_tpar.qc => benchmarking_circuits/Fast/tpar/csum_mux_9.qc} (100%) rename circuits/{Fast/gf2^4_mult_tpar.qc => benchmarking_circuits/Fast/tpar/gf2^4_mult.qc} (100%) rename circuits/{Fast/gf2^5_mult_tpar.qc => benchmarking_circuits/Fast/tpar/gf2^5_mult.qc} (100%) rename circuits/{Fast/gf2^6_mult_tpar.qc => benchmarking_circuits/Fast/tpar/gf2^6_mult.qc} (100%) rename circuits/{Fast/gf2^7_mult_tpar.qc => benchmarking_circuits/Fast/tpar/gf2^7_mult.qc} (100%) rename circuits/{Fast/gf2^8_mult_tpar.qc => benchmarking_circuits/Fast/tpar/gf2^8_mult.qc} (100%) rename circuits/{Fast/grover_5_tpar.qc => benchmarking_circuits/Fast/tpar/grover_5.qc} (100%) rename circuits/{Fast/mod5_4_tpar.qc => benchmarking_circuits/Fast/tpar/mod5_4.qc} (100%) rename circuits/{Fast/mod_mult_55_tpar.qc => benchmarking_circuits/Fast/tpar/mod_mult_55.qc} (100%) rename circuits/{Fast/mod_red_21_tpar.qc => benchmarking_circuits/Fast/tpar/mod_red_21.qc} (100%) rename circuits/{Fast/qcla_adder_10_tpar.qc => benchmarking_circuits/Fast/tpar/qcla_adder_10.qc} (100%) rename circuits/{Fast/qcla_com_7_tpar.qc => benchmarking_circuits/Fast/tpar/qcla_com_7.qc} (100%) rename circuits/{Fast/qcla_mod_7_tpar.qc => benchmarking_circuits/Fast/tpar/qcla_mod_7.qc} (100%) rename circuits/{Fast/rc_adder_6_tpar.qc => benchmarking_circuits/Fast/tpar/rc_adder_6.qc} (100%) rename circuits/{Fast/tof_10_tpar.qc => benchmarking_circuits/Fast/tpar/tof_10.qc} (100%) rename circuits/{Fast/tof_3_tpar.qc => benchmarking_circuits/Fast/tpar/tof_3.qc} (100%) rename circuits/{Fast/tof_4_tpar.qc => benchmarking_circuits/Fast/tpar/tof_4.qc} (100%) rename circuits/{Fast/tof_5_tpar.qc => benchmarking_circuits/Fast/tpar/tof_5.qc} (100%) rename circuits/{Fast/vbe_adder_3_tpar.qc => benchmarking_circuits/Fast/tpar/vbe_adder_3.qc} (100%) create mode 100644 circuits/benchmarking_circuits/Slow/.DS_Store rename circuits/{Slow/Adder16_before => benchmarking_circuits/Slow/before/Adder16} (100%) rename circuits/{Slow/Adder32_before => benchmarking_circuits/Slow/before/Adder32} (100%) rename circuits/{Slow/Adder64_before => benchmarking_circuits/Slow/before/Adder64} (100%) rename circuits/{Slow/QFT32_before => benchmarking_circuits/Slow/before/QFT32} (100%) rename circuits/{Slow/QFTAdd16_before => benchmarking_circuits/Slow/before/QFTAdd16} (100%) rename circuits/{Slow/QFTAdd32_before => benchmarking_circuits/Slow/before/QFTAdd32} (100%) rename circuits/{Fast/gf2^10_mult_before => benchmarking_circuits/Slow/before/gf2^10_mult} (100%) rename circuits/{Slow/gf2^16_mult_before => benchmarking_circuits/Slow/before/gf2^16_mult} (100%) rename circuits/{Fast/gf2^9_mult_before => benchmarking_circuits/Slow/before/gf2^9_mult} (100%) rename circuits/{Slow => benchmarking_circuits/Slow/before}/ham15-high.qc (100%) rename circuits/{Slow => benchmarking_circuits/Slow/before}/ham15-med.qc (100%) rename circuits/{Slow => benchmarking_circuits/Slow/before}/hwb8.qc (100%) rename circuits/{Slow/mod_adder_1024_before => benchmarking_circuits/Slow/before/mod_adder_1024} (100%) rename circuits/{Fast => benchmarking_circuits/Slow/before}/nth_prime6.tfc (100%) rename circuits/{Slow => benchmarking_circuits/Slow/before}/nth_prime8.tfc (100%) rename circuits/{Slow/Adder16_after_heavy => benchmarking_circuits/Slow/nrscm/Adder16} (100%) rename circuits/{Slow/Adder32_after_heavy => benchmarking_circuits/Slow/nrscm/Adder32} (100%) rename circuits/{Slow/Adder64_after_heavy => benchmarking_circuits/Slow/nrscm/Adder64} (100%) rename circuits/{Slow/QFT32_after => benchmarking_circuits/Slow/nrscm/QFT32} (100%) rename circuits/{Slow/QFTAdd16_after => benchmarking_circuits/Slow/nrscm/QFTAdd16} (100%) rename circuits/{Slow/QFTAdd32_after => benchmarking_circuits/Slow/nrscm/QFTAdd32} (100%) rename circuits/{Fast/gf2^10_mult_after_heavy => benchmarking_circuits/Slow/nrscm/gf2^10_mult} (100%) rename circuits/{Slow/gf2^16_mult_after_heavy => benchmarking_circuits/Slow/nrscm/gf2^16_mult} (100%) rename circuits/{Fast/gf2^9_mult_after_heavy => benchmarking_circuits/Slow/nrscm/gf2^9_mult} (100%) rename circuits/{Slow/mod_adder_1024_after_heavy => benchmarking_circuits/Slow/nrscm/mod_adder_1024} (100%) rename circuits/{Fast/gf2^10_mult_tpar.qc => benchmarking_circuits/Slow/tpar/gf2^10_mult.qc} (100%) rename circuits/{Slow/gf2^16_mult_tpar.qc => benchmarking_circuits/Slow/tpar/gf2^16_mult.qc} (100%) rename circuits/{Fast/gf2^9_mult_tpar.qc => benchmarking_circuits/Slow/tpar/gf2^9_mult.qc} (100%) rename circuits/{Slow/mod_adder_1024_tpar.qc => benchmarking_circuits/Slow/tpar/mod_adder_1024.qc} (100%) create mode 100644 demos/.DS_Store create mode 100644 demos/circuit_optimisation/.DS_Store create mode 100644 demos/circuit_optimisation/benchmark/circuit_groups.pkl create mode 100644 demos/circuit_optimisation/benchmark/circuits.pkl create mode 100644 demos/circuit_optimisation/benchmark/funcs.pkl create mode 100644 demos/circuit_optimisation/benchmark/rand_data.pkl create mode 100644 demos/circuit_optimisation/benchmark/routines.pkl create mode 100644 demos/circuit_optimisation/benchmarking.ipynb create mode 100644 demos/circuit_optimisation/qft-opt.ipynb create mode 100644 doc/.DS_Store create mode 100644 misc/.DS_Store create mode 100644 pyzx/.DS_Store create mode 100644 pyzx/flow.py delete mode 100644 pyzx/gflow.py create mode 100644 pyzx/heuristics.py diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..526143a6c5c53be71eb7e35abe4377ba365b8300 GIT binary patch literal 8196 zcmeHMziSjh6n=Ae(SvKw2+7$km^4O=i6BorMXTr`~=DnHk+i!Me?rn%jEe+apL^UER z<6>K_pvoxh=POkTw&fzMLVsHC&aJefu%C+b4PF7SfLFjP;1%!+92W&}W^*a$ocqS> zYp;M;;J;LW_lE!%+q$(wWA)a7N~Zv@B{b`T`zqhS2G-WC9U2P{iZWecO;=@83}w2b zJ+N_gYlp^~?xbw;p)9hp8H&>A7(dYAr0T}{+AH7{NGrg(dxuJ!+z@JpboHHf{*yrjJj-sCF`N++Oxh&QH-r*@yX5b}C= z{1O|!al58QViE>77Po4Q- z_LH1(CBws`C12ItXTD?Li8o|)rIK3Z=@VYbt8(r6gyrQ#ByUJ|gv7VM{g{I@YfYkrN&BQ2{1OdP62YR9pJi!iwnmMjn!RH>2w@cr{l2k xKMZjnAe8&mtsNSR7L None: + """Saves the benchmark data to dirpath""" + if not os.path.isdir(dirpath): raise Exception(f'{dirpath} is not a directory.') + with open(dirpath+'/funcs.pkl', 'wb') as f: + dill.dump(self.funcs,f) + with open(dirpath+'/circuit_groups.pkl', 'wb') as f: + dill.dump(self.circuit_groups,f) + with open(dirpath+'/circuits.pkl', 'wb') as f: + dill.dump(self.circuits,f) + with open(dirpath+'/rand_data.pkl', 'wb') as f: + dill.dump(self.rand_data,f) + with open(dirpath+'/routines.pkl', 'wb') as f: + dill.dump(self.routines,f) + + def show_attributes(self): + """Displays which functions/circuit groups have been loaded, and a table for which have been run""" + atts = ['Qubits','Gates','2Q Count','T Count','t_opt'] + print(f'Circuit attributes: {atts}') + if len(self.funcs) == 0: print('No loaded functions') + else: print(f'Loaded functions: {list(self.funcs.keys())}') + if len(self.circuit_groups.keys()) == 0: print('No loaded routines') + else: print(f'Loaded routines: {list(self.routines)}') + if len(self.circuits) == 0: + print('No circuits added') + return + if len(self.circuit_groups) == 0: print('No loaded unsimplified circuit groups') + else: + print(f'Loaded circuit groups: {list(self.circuit_groups.keys())}') + groups = list(self.circuit_groups.keys()) + strats = ['Original'] + sorted(list(self.funcs.keys())+list(self.routines)) + df = pd.DataFrame(index = groups, columns = strats) + for g in groups: + for s in strats: + run = '-' + for c in self.circuit_groups[g]: + if s in self.circuits[c].keys(): + run = 'Y' + break + df.at[g, s] = run + display(df) + + def load_circuits(self, dirname: str, group_name: Optional[str] = None, simp_strategy: str ='Original', extension: Optional[str] = None) -> None: + """Loads circuits from a directory, for either the original circuits or pre-simplified versions + + Args: + dirname (str): directory in which circuits are located + group_name (str, optional): the name for the group of circuits being loaded. Defaults to dirname. + simp_strategy (str, optional): if circuits have been pre-simplified the name of the simplification strategy. Defaults to 'Original'. + extension (str, optional): extension of circuits in directory. Defaults to None. + """ + if not group_name: group_name = str(dirname) + if simp_strategy == 'Original': self.circuit_groups[group_name] = [] + else: self.routines.add(simp_strategy) + + for c in [f for f in os.listdir(dirname) if not f.startswith('.')]: + if not os.path.isfile(os.path.join(dirname,c)): continue + if not extension or c.find(extension) != -1: + try: + circ = Circuit.load(os.path.join(dirname, c)).to_basic_gates() + except: + print(f'Circuit {c} failed to load') + continue + circ_name = os.path.splitext(c)[0] + if simp_strategy == 'Original': + self.circuit_groups[group_name].append(circ_name) + if circ_name not in self.circuits.keys(): self.circuits[circ_name] = dict() + self.circuits[circ_name][simp_strategy] = [circ, circ.qubits, len(circ.gates), circ.twoqubitcount(), circ.tcount(), None] + + def add_simplification_func(self, func: Callable[..., Circuit], name: str, groups_to_run: Optional[List[str]] = ['all'], verify=False, rerun = False) -> None: + """Loads a simplification function + + Args: + func (Callable[Circuit]): callable function should take a Circuit as an input and output either a Circuit or a tuple (Circuit, t_simp, t_opt) + name (str): name for the function + groups_to_run (List[str], optional): groups of circuits to immediately run the function on. Defaults to 'all'. + """ + self.funcs[name] = func + if groups_to_run: self.run(funcs_to_run = [name], groups_to_run=groups_to_run, verify=verify, rerun=rerun) + + def del_simplification_funcs(self, funcs: List[str]) -> None: + """Deletes simplification functions + + Args: + funcs (List[str]): list of simplification function names + """ + for func_name in funcs: + if func_name in self.funcs.keys(): del self.funcs[func_name] + for circuit_name, value in self.circuits.items(): + if func_name in value.keys(): del self.circuits[circuit_name][func_name] + for parameters, value2 in self.rand_data.items(): + if func_name in value2[1].keys(): # type: ignore + del self.rand_data[parameters][1][func_name] # type: ignore + + def run(self, funcs_to_run: List[str] = ['all'], groups_to_run: List[str] = ['all'], verify: bool = False, rerun: bool = False) -> None: + """Runs a series of functions on a series of groups of circuits + + Args: + funcs_to_run (List[str], optional): names of loaded functions to run. Defaults to 'all'. + groups_to_run (List[str], optional): names of loaded groups of circuits to run. Defaults to 'all'. + rerun (bool, optional): rerun circuit even if function has already been run on it. Defaults to False. + """ + if funcs_to_run == ['all']: funcs_to_run = list(self.funcs.keys()) + if groups_to_run == ['all']: groups_to_run = list(self.circuit_groups.keys()) + for group_name in groups_to_run: + if group_name not in self.circuit_groups.keys(): + print(f'The group of circuits {group_name} has not been added. Call benchmark.show_attributes() to see loaded group names.') + continue + + groups = [g for gn, g in self.circuit_groups.items() if gn in groups_to_run] + circuits = [c for g in groups for c in g] + pbar = tqdm(circuits) + for circ_name in pbar: + for func_name in funcs_to_run: + if func_name not in self.funcs.keys(): + print(f'The function {func_name} has not been added. Call benchmark.show_attributes() to see loaded functions.') + continue + if func_name in self.circuits[circ_name].keys() and not rerun: continue + pbar.set_description("{:<70}".format(f'Processing {func_name} on {circ_name}')) + t0 = perf_counter() + opt_circ = self.funcs[func_name](self.circuits[circ_name]['Original'][0]) + t_opt = round(perf_counter() - t0,2) + if verify: + c_id = self.circuits[circ_name]['Original'][0].adjoint() # type: ignore + c_id.add_circuit(opt_circ) + g = c_id.to_graph() + zx.simplify.full_reduce(g) + if g.num_vertices() != 2*len(g.inputs()): + print(f'Circuit resulting from {func_name} on {circ_name} not verified',flush=True) + continue + self.circuits[circ_name][func_name] = [opt_circ, opt_circ.qubits, len(opt_circ.gates), opt_circ.twoqubitcount(), opt_circ.tcount(), t_opt] + + @staticmethod + def generate_cliffordT_circuit(qubits: int, depth: int, p_cnot: float, p_t: float) -> Circuit: + """Generates a random clifford + T circuit + + Args: + qubits (int): number of qubits + depth (int): depth of circuit + p_cnot (float): probabilitiy of a CNOT gate + p_t (float): probability of a T gate + + Returns: + Circuit: Random circuit + """ + p_s = 0.5*(1.0-p_cnot-p_t) + p_had = 0.5*(1.0-p_cnot-p_t) + c = Circuit(qubits) + for _ in range(depth): + r = random.random() + if r > 1-p_had: c.add_gate("HAD",random.randrange(qubits)) + elif r > 1-p_had-p_s: c.add_gate("S",random.randrange(qubits)) + elif r > 1-p_had-p_s-p_t: c.add_gate("T",random.randrange(qubits)) + else: + tgt = random.randrange(qubits) + while True: + ctrl = random.randrange(qubits) + if ctrl!=tgt: break + c.add_gate("CNOT",tgt,ctrl) + return c + + def generate_data(self, qubits: int, depth: int, cnot_prob: float, t_prob: float, funcs_to_run: List[str] = ['all'], reps: int = 50, overwrite: bool = False, random_seed: Optional[int] = None, pbar: tqdm = None) -> None: + """Runs a series of functions on randomly generated Clifford + T circuits and stores the average result for each function + + Args: + qubits (int): number of qubits + depth (int): depth of circuit + cnot_prob (float): probaility of a CNOT gate + t_prob (float): probability of a T gate + funcs_to_run (List[str], optional): names of loaded functions to run. Defaults to 'all'. + reps (int, optional): number of repeats for each parameter set. Defaults to 50. + overwrite (bool, optional): overwrite current data if it exists. Defaults to False. + random_seed (int, optional): random.random seed. Defaults to None. + pbar (tqdm, optional): tqdm progress bar. Defaults to None. + """ + params = f'{qubits}_{depth}_{cnot_prob}_{t_prob}_{reps}' + if params in self.rand_data.keys() and not overwrite: + seed = self.rand_data[params][0] + if random_seed and random_seed != seed: + seed = random_seed + self.rand_data[params] = [seed, dict()] + run = [] + else: + run = list(self.rand_data[params][1].keys()) # type: ignore + else: + if random_seed: seed = random_seed + else: seed = random.randrange(sys.maxsize) + self.rand_data[params] = [seed, dict()] + run = [] + + random.seed(seed) # type: ignore + circuits = [self.generate_cliffordT_circuit(qubits, depth, cnot_prob, t_prob) for _ in range(reps)] + + if 'Original' not in run: + count = [0, 0, 0] + for c in circuits: + count[0] += len(c.gates) + count[1] += c.twoqubitcount() + count[2] += c.tcount() + count = [x/reps for x in count] # type: ignore + self.rand_data[params][1]['Original'] = count # type: ignore + + if funcs_to_run == ['all']: funcs_to_run = self.funcs.keys() # type: ignore + for func_name in funcs_to_run: + if func_name not in self.funcs.keys(): + print(f'The function {func_name} has not been added. Call benchmark.show_attributes() to see loaded functions.') + continue + if func_name in run and not overwrite: continue + + if pbar: pbar.set_description("{:<50}".format(f'Processing {func_name} on P_t = {t_prob}')) + count = [0, 0, 0] + for c in circuits: + c = self.generate_cliffordT_circuit(qubits, depth, cnot_prob, t_prob) + res = self.funcs[func_name](c) + if not isinstance(res, tuple): c2 = res + else: c2 = res[0] + count[0] += len(c2.gates) + count[1] += c2.twoqubitcount() + count[2] += c2.tcount() + count = [x/reps for x in count] # type: ignore + self.rand_data[params][1][func_name] = count # type: ignore + + def Pt_graphs(self, funcs: List[str], qubits: int, depth: int, cnot_prob: float, t_probs: List[float], ys: List[str] = ['Gates','2Q Count','T Count'], reps: int = 50, overwrite: bool = False, figsize: List[int] = [7,5], random_seed: Optional[int] = None) -> plt.figure: + """Produces a series of graphs for circuit simplification metrics for random circuits with a range of T gate probabilites + + Args: + funcs (List[str]): names of loaded functions to display on graphs + qubits (int): number of qubits + depth (int): depth of circuits + cnot_prob (float): probability of CNOT gates + t_probs (List[float]): range of T gate probabilites + ys (List[str], optional): which metrics to print out. Defaults to ['Gates','2Q Count','T Count']. Options limited to subsets of this set. + reps (int, optional): number of repeats for each parameter set. Defaults to 50. + overwrite (bool, optional): overwrite current data if it exists. Defaults to False. + figsize (List[int, int], optional): figure size for each plot. Defaults to [7,5]. + random_seed (int, optional): random.random seed. Defaults to None. + + Returns: + plt.figure: matplotlib.pyplot figure with a subplot for each metric in ys + """ + for func_name in funcs[:]: + if func_name not in self.funcs.keys(): + print(f'The function {func_name} has not been added. Call benchmark.show_attributes() to see loaded functions.') + funcs.remove(func_name) + + g_count = np.empty((len(funcs)+1, 0)).tolist() + two_count = np.empty((len(funcs)+1, 0)).tolist() + t_count = np.empty((len(funcs)+1, 0)).tolist() + + pbar = tqdm(t_probs) + for t_prob in pbar: + self.generate_data(qubits, depth, cnot_prob, t_prob, funcs_to_run=funcs, reps=reps, overwrite=overwrite, random_seed=random_seed, pbar=pbar) + params = f'{qubits}_{depth}_{cnot_prob}_{t_prob}_{reps}' + for i,func_name in enumerate(['Original']+funcs): + count = self.rand_data[params][1][func_name] # type: ignore + g_count[i].append(count[0]) + two_count[i].append(count[1]) + t_count[i].append(count[2]) + + stats = [y for y in ys if y in ['Gates','2Q Count','T Count']] + fs = figsize[:] + fs[0] *= len(stats) + fig = plt.figure(figsize=fs) + + if 'Gates' in stats: + ax1 = fig.add_subplot(1,len(stats),stats.index('Gates')+1) + ax1.set_ylabel("Total Gate Count") + ax1.set_xlabel("$P_t$") + ax1.grid(color='#EEEEEE') + if '2Q Count' in stats: + ax2 = fig.add_subplot(1, len(stats),stats.index('2Q Count')+1) + ax2.set_ylabel("2-Qubit Gate Count") + ax2.set_xlabel("$P_t$") + ax2.grid(color='#EEEEEE') + if 'T Count' in stats: + ax3 = fig.add_subplot(1, len(stats),stats.index('T Count')+1) + ax3.set_ylabel("T Gate Count") + ax3.set_xlabel("$P_t$") + ax3.grid(color='#EEEEEE') + + for i, func_name in enumerate(['Originial']+funcs): + if 'Gates' in stats: ax1.plot(t_probs, g_count[i], marker="o" ,markersize=3, linestyle=':', label=func_name) + if '2Q Count' in stats: ax2.plot(t_probs, two_count[i], marker="o" ,markersize=3, linestyle=':', label=func_name) + if 'T Count' in stats: ax3.plot(t_probs, t_count[i], marker="o" ,markersize=3, linestyle=':', label=func_name) + + plt.legend(bbox_to_anchor=(0.11, -0.19), loc="lower left", + bbox_transform=fig.transFigure, ncol=3*len(stats), fancybox=True) + return fig + + @staticmethod + def table_style(styler: plt.style , cols: List[Tuple[str]]) -> plt.style: + styler.set_properties(**{'width':'8ch', 'text-align':'center'}).set_table_styles([dict(selector="th.col_heading.level1",props=[('text-align', 'center')])]) + styler.set_table_styles([{'selector': 'tr:hover', 'props': [('background-color', '#e1f7d5'),('color', 'black'),('font-weight', 'bold')]}, #cell_hover + {'selector': '.index_name', 'props': 'background-color: #232b2b; font-style: italic; color: white; font-weight:bold;'}, #index_names + {'selector': 'th:not(.index_name)', 'props': 'background-color: #232b2b; color: white;'}, #headers + {'selector': 'th.col_heading.level0', 'props': 'text-align: center; font-size: 1.2em; padding: 0.7em'}, + {'selector': 'td', 'props': 'text-align: center; font-size: 1em'}], overwrite=False) + if any('Gates' in col for col in cols): border_col = 'Gates' + elif any('2Q Count' in col for col in cols): border_col = '2Q Count' + elif any('T Count' in col for col in cols): border_col = 'T Count' + styler.set_table_styles(dict.fromkeys([col for col in cols if border_col in col or ('Original' in col and 'Qubits' in col)], [{'selector': 'th', 'props': 'border-left: 1px solid white !important'}, + {'selector': 'td', 'props': 'border-left: 1px solid white !important'}]), overwrite=False, axis=0) + styler.apply(lambda s: np.where(s==np.nanmin(s.values),'color:green',''), axis=1, subset=[col for col in cols if 'Gates' in col]) + styler.apply(lambda s: np.where(s==np.nanmin(s.values),'color:green',''), axis=1, subset=[col for col in cols if '2Q Count' in col]) + styler.apply(lambda s: np.where(s==np.nanmin(s.values),'color:green',''), axis=1, subset=[col for col in cols if 'T Count' in col]) + styler.format(subset=[col for col in cols if 't_opt' or 't_simp' in col],precision=2, na_rep='-', thousands=",") + styler.format(subset=[col for col in cols if 't_opt' not in col and 't_simp' not in col],precision=0, na_rep='-', thousands=",") + return(styler) + + def df(self, groups: List[str] = ['all'], routines: List[str] = ['all'], funcs: List[str] = ['all'], atts: List[str] = ['all']) -> pd.DataFrame: + """Produces a pandas dataframe of metrics over benchmark circuits. + + Args: + groups (List[str], optional): group names for circuits for index. Defaults to 'all'. + routines (List[str], optional): names for routines for columns. Defaults to 'all'. + funcs (List[str], optional): names for functions for columns. Defaults to 'all'. + atts (List[str], optional): names for attributes to show for each function/routine. Defaults to 'all'. + + Returns: pd.DataFrame + """ + if groups==['all']: groups=list(self.circuit_groups.keys()) + if routines==['all']: routines=sorted(list(self.routines)) + else: + for r in routines[:]: + if r not in self.routines: + print(f'The routine {r} has not been added. Call .show_attributes() to see loaded routines.') + routines.remove(r) + if funcs==['all']: funcs=sorted(list(self.funcs)) + else: + for f in funcs[:]: + if f not in self.funcs.keys(): + print(f'The function {f} has not been added. Call .show_attributes() to see loaded functions.') + funcs.remove(f) + + all_atts = ['Qubits','Gates','2Q Count','T Count','t_opt','na'] + if atts == ['all']: atts = all_atts + match_atts = [True if att in atts else False for att in all_atts] + + heads = ['Original'] + routines + funcs + circs = [] + data = [] + for g in groups: + if g not in self.circuit_groups.keys(): + print(f'The group of circuits {g} has not been added. Call .show_attributes() to see loaded groups.') + continue + for c in self.circuit_groups[g]: + c_data = [] + for f in heads: + try: d = self.circuits[c][f][1:] + except: d = [np.nan]*6 + c_data.extend([x for i,x in enumerate(d) if match_atts[i]]) + circs.append(c) + data.append(c_data) + + df = pd.DataFrame(data=data, columns=pd.MultiIndex.from_product([heads,atts])) + df['Circuits'] = circs + df = df.set_index('Circuits') + df = df.sort_index() + df=df[[col for col in df.columns if 'Qubits' not in col or 'Original' in col]] + df=df.dropna(axis=1, how='all') + display(df.style.pipe(self.table_style, cols=df.columns)) + return df \ No newline at end of file diff --git a/circuits/.DS_Store b/circuits/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..c2071d41f955fd0b29d60af9e294a3950a3a95f7 GIT binary patch literal 8196 zcmeHMyKWOf6g>kbF$5t9QWVj!QiPDe5(J6fj!Y00Ag4EWY?3J6tmBvhs{H{Z{s0O} z_yq_O^eL#Q;R~oJkT~fD)v39PtbMD+TXJ==8#{ksQqs}5Q51`CT+p{yQ z3W{#mSFRj$cPg}s{=hn7bTPyRR&(fZBPb9Q2nqxRf&xK-KS2TR*}9ZH`@U@rbx>Uecx?U)gl_+NBS*qxaGIg+B?X*D zo2M6BJiE~67%ghDNmaJ6CdPcRrTKcXa(p=N#y0_<9m~OZ!F$0xhAHwM@ab%7_JS*} z?vbl#m;6Thk72T$iZOx*u50~HagKEHn2I&`l@xrwHZJ&Z9$tlg#z`T+LagBV?V09z zl3Ml6DOJqp`-Gf3g5~thkHsht$AbPm3=5EgU-^aRcLI0KyV%7*@IvxgwtDzv{5?D} z2oWE8x^QQ{hh-7@&G$P$?|WhzA5S#XCgSXx=TO2n-?AOVBG%iduNZ68=82bSFPsab zb`keo#IA7$_p!`XZGVNUah>aM9t^M}xSYGaauD9bZ(qd?Oicz?^r)sc7BxLV}E5$kxjx+n~da|S-J6?Y(#sOOJ*M!!xTPS zfe}0^DZ_+vNCl2t+`P{JZ~4#v57}FQ1qFfvf1?7bRBzOm$lT@DxiRQmJL2_#mo6HY uT5DWbnRJ}iq~o-sKMeUjB2@cSolULf9hTp45HN9{4f}uC|INhw$EzO`7uMAP literal 0 HcmV?d00001 diff --git a/circuits/Fast/QFT16_before b/circuits/Fast/QFT16_before deleted file mode 100644 index 0aba6fcd..00000000 --- a/circuits/Fast/QFT16_before +++ /dev/null @@ -1,590 +0,0 @@ -Inputs: 0:Qbit, 1:Qbit, 2:Qbit, 3:Qbit, 4:Qbit, 5:Qbit, 6:Qbit, 7:Qbit, 8:Qbit, 9:Qbit, 10:Qbit, 11:Qbit, 12:Qbit, 13:Qbit, 14:Qbit, 15:Qbit -Comment["ENTER: qft_big_endian"](0:"qs[0]", 1:"qs[1]", 2:"qs[2]", 3:"qs[3]", 4:"qs[4]", 5:"qs[5]", 6:"qs[6]", 7:"qs[7]", 8:"qs[8]", 9:"qs[9]", 10:"qs[10]", 11:"qs[11]", 12:"qs[12]", 13:"qs[13]", 14:"qs[14]", 15:"qs[15]") -QGate["H"](0) with nocontrol -QGate["not"](0) with controls=[+1] with nocontrol -QRot["exp(-i%Z)",-3.926990816987241e-1](0) -QGate["not"](0) with controls=[+1] with nocontrol -QRot["exp(-i%Z)",3.9269908169872414e-1](0) -QRot["exp(-i%Z)",3.9269908169872414e-1](1) -QGate["H"](1) with nocontrol -QGate["not"](0) with controls=[+2] with nocontrol -QRot["exp(-i%Z)",-1.963495408493621e-1](0) -QGate["not"](0) with controls=[+2] with nocontrol -QRot["exp(-i%Z)",1.9634954084936207e-1](0) -QRot["exp(-i%Z)",1.9634954084936207e-1](2) -QGate["not"](1) with controls=[+2] with nocontrol -QRot["exp(-i%Z)",-3.926990816987241e-1](1) -QGate["not"](1) with controls=[+2] with nocontrol -QRot["exp(-i%Z)",3.9269908169872414e-1](1) -QRot["exp(-i%Z)",3.9269908169872414e-1](2) -QGate["H"](2) with nocontrol -QGate["not"](0) with controls=[+3] with nocontrol -QRot["exp(-i%Z)",-9.817477042468103e-2](0) -QGate["not"](0) with controls=[+3] with nocontrol -QRot["exp(-i%Z)",9.8174770424681035e-2](0) -QRot["exp(-i%Z)",9.8174770424681035e-2](3) -QGate["not"](1) with controls=[+3] with nocontrol -QRot["exp(-i%Z)",-1.963495408493621e-1](1) -QGate["not"](1) with controls=[+3] with nocontrol -QRot["exp(-i%Z)",1.9634954084936207e-1](1) -QRot["exp(-i%Z)",1.9634954084936207e-1](3) -QGate["not"](2) with controls=[+3] with nocontrol -QRot["exp(-i%Z)",-3.926990816987241e-1](2) -QGate["not"](2) with controls=[+3] with nocontrol -QRot["exp(-i%Z)",3.9269908169872414e-1](2) -QRot["exp(-i%Z)",3.9269908169872414e-1](3) -QGate["H"](3) with nocontrol -QGate["not"](0) with controls=[+4] with nocontrol -QRot["exp(-i%Z)",-4.908738521234052e-2](0) -QGate["not"](0) with controls=[+4] with nocontrol -QRot["exp(-i%Z)",4.9087385212340517e-2](0) -QRot["exp(-i%Z)",4.9087385212340517e-2](4) -QGate["not"](1) with controls=[+4] with nocontrol -QRot["exp(-i%Z)",-9.817477042468103e-2](1) -QGate["not"](1) with controls=[+4] with nocontrol -QRot["exp(-i%Z)",9.8174770424681035e-2](1) -QRot["exp(-i%Z)",9.8174770424681035e-2](4) -QGate["not"](2) with controls=[+4] with nocontrol -QRot["exp(-i%Z)",-1.963495408493621e-1](2) -QGate["not"](2) with controls=[+4] with nocontrol -QRot["exp(-i%Z)",1.9634954084936207e-1](2) -QRot["exp(-i%Z)",1.9634954084936207e-1](4) -QGate["not"](3) with controls=[+4] with nocontrol -QRot["exp(-i%Z)",-3.926990816987241e-1](3) -QGate["not"](3) with controls=[+4] with nocontrol -QRot["exp(-i%Z)",3.9269908169872414e-1](3) -QRot["exp(-i%Z)",3.9269908169872414e-1](4) -QGate["H"](4) with nocontrol -QGate["not"](0) with controls=[+5] with nocontrol -QRot["exp(-i%Z)",-2.454369260617026e-2](0) -QGate["not"](0) with controls=[+5] with nocontrol -QRot["exp(-i%Z)",2.4543692606170259e-2](0) -QRot["exp(-i%Z)",2.4543692606170259e-2](5) -QGate["not"](1) with controls=[+5] with nocontrol -QRot["exp(-i%Z)",-4.908738521234052e-2](1) -QGate["not"](1) with controls=[+5] with nocontrol -QRot["exp(-i%Z)",4.9087385212340517e-2](1) -QRot["exp(-i%Z)",4.9087385212340517e-2](5) -QGate["not"](2) with controls=[+5] with nocontrol -QRot["exp(-i%Z)",-9.817477042468103e-2](2) -QGate["not"](2) with controls=[+5] with nocontrol -QRot["exp(-i%Z)",9.8174770424681035e-2](2) -QRot["exp(-i%Z)",9.8174770424681035e-2](5) -QGate["not"](3) with controls=[+5] with nocontrol -QRot["exp(-i%Z)",-1.963495408493621e-1](3) -QGate["not"](3) with controls=[+5] with nocontrol -QRot["exp(-i%Z)",1.9634954084936207e-1](3) -QRot["exp(-i%Z)",1.9634954084936207e-1](5) -QGate["not"](4) with controls=[+5] with nocontrol -QRot["exp(-i%Z)",-3.926990816987241e-1](4) -QGate["not"](4) with controls=[+5] with nocontrol -QRot["exp(-i%Z)",3.9269908169872414e-1](4) -QRot["exp(-i%Z)",3.9269908169872414e-1](5) -QGate["H"](5) with nocontrol -QGate["not"](0) with controls=[+6] with nocontrol -QRot["exp(-i%Z)",-1.227184630308513e-2](0) -QGate["not"](0) with controls=[+6] with nocontrol -QRot["exp(-i%Z)",1.2271846303085129e-2](0) -QRot["exp(-i%Z)",1.2271846303085129e-2](6) -QGate["not"](1) with controls=[+6] with nocontrol -QRot["exp(-i%Z)",-2.454369260617026e-2](1) -QGate["not"](1) with controls=[+6] with nocontrol -QRot["exp(-i%Z)",2.4543692606170259e-2](1) -QRot["exp(-i%Z)",2.4543692606170259e-2](6) -QGate["not"](2) with controls=[+6] with nocontrol -QRot["exp(-i%Z)",-4.908738521234052e-2](2) -QGate["not"](2) with controls=[+6] with nocontrol -QRot["exp(-i%Z)",4.9087385212340517e-2](2) -QRot["exp(-i%Z)",4.9087385212340517e-2](6) -QGate["not"](3) with controls=[+6] with nocontrol -QRot["exp(-i%Z)",-9.817477042468103e-2](3) -QGate["not"](3) with controls=[+6] with nocontrol -QRot["exp(-i%Z)",9.8174770424681035e-2](3) -QRot["exp(-i%Z)",9.8174770424681035e-2](6) -QGate["not"](4) with controls=[+6] with nocontrol -QRot["exp(-i%Z)",-1.963495408493621e-1](4) -QGate["not"](4) with controls=[+6] with nocontrol -QRot["exp(-i%Z)",1.9634954084936207e-1](4) -QRot["exp(-i%Z)",1.9634954084936207e-1](6) -QGate["not"](5) with controls=[+6] with nocontrol -QRot["exp(-i%Z)",-3.926990816987241e-1](5) -QGate["not"](5) with controls=[+6] with nocontrol -QRot["exp(-i%Z)",3.9269908169872414e-1](5) -QRot["exp(-i%Z)",3.9269908169872414e-1](6) -QGate["H"](6) with nocontrol -QGate["not"](0) with controls=[+7] with nocontrol -QRot["exp(-i%Z)",-6.135923151542565e-3](0) -QGate["not"](0) with controls=[+7] with nocontrol -QRot["exp(-i%Z)",6.1359231515425647e-3](0) -QRot["exp(-i%Z)",6.1359231515425647e-3](7) -QGate["not"](1) with controls=[+7] with nocontrol -QRot["exp(-i%Z)",-1.227184630308513e-2](1) -QGate["not"](1) with controls=[+7] with nocontrol -QRot["exp(-i%Z)",1.2271846303085129e-2](1) -QRot["exp(-i%Z)",1.2271846303085129e-2](7) -QGate["not"](2) with controls=[+7] with nocontrol -QRot["exp(-i%Z)",-2.454369260617026e-2](2) -QGate["not"](2) with controls=[+7] with nocontrol -QRot["exp(-i%Z)",2.4543692606170259e-2](2) -QRot["exp(-i%Z)",2.4543692606170259e-2](7) -QGate["not"](3) with controls=[+7] with nocontrol -QRot["exp(-i%Z)",-4.908738521234052e-2](3) -QGate["not"](3) with controls=[+7] with nocontrol -QRot["exp(-i%Z)",4.9087385212340517e-2](3) -QRot["exp(-i%Z)",4.9087385212340517e-2](7) -QGate["not"](4) with controls=[+7] with nocontrol -QRot["exp(-i%Z)",-9.817477042468103e-2](4) -QGate["not"](4) with controls=[+7] with nocontrol -QRot["exp(-i%Z)",9.8174770424681035e-2](4) -QRot["exp(-i%Z)",9.8174770424681035e-2](7) -QGate["not"](5) with controls=[+7] with nocontrol -QRot["exp(-i%Z)",-1.963495408493621e-1](5) -QGate["not"](5) with controls=[+7] with nocontrol -QRot["exp(-i%Z)",1.9634954084936207e-1](5) -QRot["exp(-i%Z)",1.9634954084936207e-1](7) -QGate["not"](6) with controls=[+7] with nocontrol -QRot["exp(-i%Z)",-3.926990816987241e-1](6) -QGate["not"](6) with controls=[+7] with nocontrol -QRot["exp(-i%Z)",3.9269908169872414e-1](6) -QRot["exp(-i%Z)",3.9269908169872414e-1](7) -QGate["H"](7) with nocontrol -QGate["not"](0) with controls=[+8] with nocontrol -QRot["exp(-i%Z)",-3.067961575771282e-3](0) -QGate["not"](0) with controls=[+8] with nocontrol -QRot["exp(-i%Z)",3.0679615757712823e-3](0) -QRot["exp(-i%Z)",3.0679615757712823e-3](8) -QGate["not"](1) with controls=[+8] with nocontrol -QRot["exp(-i%Z)",-6.135923151542565e-3](1) -QGate["not"](1) with controls=[+8] with nocontrol -QRot["exp(-i%Z)",6.1359231515425647e-3](1) -QRot["exp(-i%Z)",6.1359231515425647e-3](8) -QGate["not"](2) with controls=[+8] with nocontrol -QRot["exp(-i%Z)",-1.227184630308513e-2](2) -QGate["not"](2) with controls=[+8] with nocontrol -QRot["exp(-i%Z)",1.2271846303085129e-2](2) -QRot["exp(-i%Z)",1.2271846303085129e-2](8) -QGate["not"](3) with controls=[+8] with nocontrol -QRot["exp(-i%Z)",-2.454369260617026e-2](3) -QGate["not"](3) with controls=[+8] with nocontrol -QRot["exp(-i%Z)",2.4543692606170259e-2](3) -QRot["exp(-i%Z)",2.4543692606170259e-2](8) -QGate["not"](4) with controls=[+8] with nocontrol -QRot["exp(-i%Z)",-4.908738521234052e-2](4) -QGate["not"](4) with controls=[+8] with nocontrol -QRot["exp(-i%Z)",4.9087385212340517e-2](4) -QRot["exp(-i%Z)",4.9087385212340517e-2](8) -QGate["not"](5) with controls=[+8] with nocontrol -QRot["exp(-i%Z)",-9.817477042468103e-2](5) -QGate["not"](5) with controls=[+8] with nocontrol -QRot["exp(-i%Z)",9.8174770424681035e-2](5) -QRot["exp(-i%Z)",9.8174770424681035e-2](8) -QGate["not"](6) with controls=[+8] with nocontrol -QRot["exp(-i%Z)",-1.963495408493621e-1](6) -QGate["not"](6) with controls=[+8] with nocontrol -QRot["exp(-i%Z)",1.9634954084936207e-1](6) -QRot["exp(-i%Z)",1.9634954084936207e-1](8) -QGate["not"](7) with controls=[+8] with nocontrol -QRot["exp(-i%Z)",-3.926990816987241e-1](7) -QGate["not"](7) with controls=[+8] with nocontrol -QRot["exp(-i%Z)",3.9269908169872414e-1](7) -QRot["exp(-i%Z)",3.9269908169872414e-1](8) -QGate["H"](8) with nocontrol -QGate["not"](0) with controls=[+9] with nocontrol -QRot["exp(-i%Z)",-1.533980787885641e-3](0) -QGate["not"](0) with controls=[+9] with nocontrol -QRot["exp(-i%Z)",1.5339807878856412e-3](0) -QRot["exp(-i%Z)",1.5339807878856412e-3](9) -QGate["not"](1) with controls=[+9] with nocontrol -QRot["exp(-i%Z)",-3.067961575771282e-3](1) -QGate["not"](1) with controls=[+9] with nocontrol -QRot["exp(-i%Z)",3.0679615757712823e-3](1) -QRot["exp(-i%Z)",3.0679615757712823e-3](9) -QGate["not"](2) with controls=[+9] with nocontrol -QRot["exp(-i%Z)",-6.135923151542565e-3](2) -QGate["not"](2) with controls=[+9] with nocontrol -QRot["exp(-i%Z)",6.1359231515425647e-3](2) -QRot["exp(-i%Z)",6.1359231515425647e-3](9) -QGate["not"](3) with controls=[+9] with nocontrol -QRot["exp(-i%Z)",-1.227184630308513e-2](3) -QGate["not"](3) with controls=[+9] with nocontrol -QRot["exp(-i%Z)",1.2271846303085129e-2](3) -QRot["exp(-i%Z)",1.2271846303085129e-2](9) -QGate["not"](4) with controls=[+9] with nocontrol -QRot["exp(-i%Z)",-2.454369260617026e-2](4) -QGate["not"](4) with controls=[+9] with nocontrol -QRot["exp(-i%Z)",2.4543692606170259e-2](4) -QRot["exp(-i%Z)",2.4543692606170259e-2](9) -QGate["not"](5) with controls=[+9] with nocontrol -QRot["exp(-i%Z)",-4.908738521234052e-2](5) -QGate["not"](5) with controls=[+9] with nocontrol -QRot["exp(-i%Z)",4.9087385212340517e-2](5) -QRot["exp(-i%Z)",4.9087385212340517e-2](9) -QGate["not"](6) with controls=[+9] with nocontrol -QRot["exp(-i%Z)",-9.817477042468103e-2](6) -QGate["not"](6) with controls=[+9] with nocontrol -QRot["exp(-i%Z)",9.8174770424681035e-2](6) -QRot["exp(-i%Z)",9.8174770424681035e-2](9) -QGate["not"](7) with controls=[+9] with nocontrol -QRot["exp(-i%Z)",-1.963495408493621e-1](7) -QGate["not"](7) with controls=[+9] with nocontrol -QRot["exp(-i%Z)",1.9634954084936207e-1](7) -QRot["exp(-i%Z)",1.9634954084936207e-1](9) -QGate["not"](8) with controls=[+9] with nocontrol -QRot["exp(-i%Z)",-3.926990816987241e-1](8) -QGate["not"](8) with controls=[+9] with nocontrol -QRot["exp(-i%Z)",3.9269908169872414e-1](8) -QRot["exp(-i%Z)",3.9269908169872414e-1](9) -QGate["H"](9) with nocontrol -QGate["not"](0) with controls=[+10] with nocontrol -QRot["exp(-i%Z)",-7.669903939428206e-4](0) -QGate["not"](0) with controls=[+10] with nocontrol -QRot["exp(-i%Z)",7.6699039394282058e-4](0) -QRot["exp(-i%Z)",7.6699039394282058e-4](10) -QGate["not"](1) with controls=[+10] with nocontrol -QRot["exp(-i%Z)",-1.533980787885641e-3](1) -QGate["not"](1) with controls=[+10] with nocontrol -QRot["exp(-i%Z)",1.5339807878856412e-3](1) -QRot["exp(-i%Z)",1.5339807878856412e-3](10) -QGate["not"](2) with controls=[+10] with nocontrol -QRot["exp(-i%Z)",-3.067961575771282e-3](2) -QGate["not"](2) with controls=[+10] with nocontrol -QRot["exp(-i%Z)",3.0679615757712823e-3](2) -QRot["exp(-i%Z)",3.0679615757712823e-3](10) -QGate["not"](3) with controls=[+10] with nocontrol -QRot["exp(-i%Z)",-6.135923151542565e-3](3) -QGate["not"](3) with controls=[+10] with nocontrol -QRot["exp(-i%Z)",6.1359231515425647e-3](3) -QRot["exp(-i%Z)",6.1359231515425647e-3](10) -QGate["not"](4) with controls=[+10] with nocontrol -QRot["exp(-i%Z)",-1.227184630308513e-2](4) -QGate["not"](4) with controls=[+10] with nocontrol -QRot["exp(-i%Z)",1.2271846303085129e-2](4) -QRot["exp(-i%Z)",1.2271846303085129e-2](10) -QGate["not"](5) with controls=[+10] with nocontrol -QRot["exp(-i%Z)",-2.454369260617026e-2](5) -QGate["not"](5) with controls=[+10] with nocontrol -QRot["exp(-i%Z)",2.4543692606170259e-2](5) -QRot["exp(-i%Z)",2.4543692606170259e-2](10) -QGate["not"](6) with controls=[+10] with nocontrol -QRot["exp(-i%Z)",-4.908738521234052e-2](6) -QGate["not"](6) with controls=[+10] with nocontrol -QRot["exp(-i%Z)",4.9087385212340517e-2](6) -QRot["exp(-i%Z)",4.9087385212340517e-2](10) -QGate["not"](7) with controls=[+10] with nocontrol -QRot["exp(-i%Z)",-9.817477042468103e-2](7) -QGate["not"](7) with controls=[+10] with nocontrol -QRot["exp(-i%Z)",9.8174770424681035e-2](7) -QRot["exp(-i%Z)",9.8174770424681035e-2](10) -QGate["not"](8) with controls=[+10] with nocontrol -QRot["exp(-i%Z)",-1.963495408493621e-1](8) -QGate["not"](8) with controls=[+10] with nocontrol -QRot["exp(-i%Z)",1.9634954084936207e-1](8) -QRot["exp(-i%Z)",1.9634954084936207e-1](10) -QGate["not"](9) with controls=[+10] with nocontrol -QRot["exp(-i%Z)",-3.926990816987241e-1](9) -QGate["not"](9) with controls=[+10] with nocontrol -QRot["exp(-i%Z)",3.9269908169872414e-1](9) -QRot["exp(-i%Z)",3.9269908169872414e-1](10) -QGate["H"](10) with nocontrol -QGate["not"](0) with controls=[+11] with nocontrol -QRot["exp(-i%Z)",-3.834951969714103e-4](0) -QGate["not"](0) with controls=[+11] with nocontrol -QRot["exp(-i%Z)",3.8349519697141029e-4](0) -QRot["exp(-i%Z)",3.8349519697141029e-4](11) -QGate["not"](1) with controls=[+11] with nocontrol -QRot["exp(-i%Z)",-7.669903939428206e-4](1) -QGate["not"](1) with controls=[+11] with nocontrol -QRot["exp(-i%Z)",7.6699039394282058e-4](1) -QRot["exp(-i%Z)",7.6699039394282058e-4](11) -QGate["not"](2) with controls=[+11] with nocontrol -QRot["exp(-i%Z)",-1.533980787885641e-3](2) -QGate["not"](2) with controls=[+11] with nocontrol -QRot["exp(-i%Z)",1.5339807878856412e-3](2) -QRot["exp(-i%Z)",1.5339807878856412e-3](11) -QGate["not"](3) with controls=[+11] with nocontrol -QRot["exp(-i%Z)",-3.067961575771282e-3](3) -QGate["not"](3) with controls=[+11] with nocontrol -QRot["exp(-i%Z)",3.0679615757712823e-3](3) -QRot["exp(-i%Z)",3.0679615757712823e-3](11) -QGate["not"](4) with controls=[+11] with nocontrol -QRot["exp(-i%Z)",-6.135923151542565e-3](4) -QGate["not"](4) with controls=[+11] with nocontrol -QRot["exp(-i%Z)",6.1359231515425647e-3](4) -QRot["exp(-i%Z)",6.1359231515425647e-3](11) -QGate["not"](5) with controls=[+11] with nocontrol -QRot["exp(-i%Z)",-1.227184630308513e-2](5) -QGate["not"](5) with controls=[+11] with nocontrol -QRot["exp(-i%Z)",1.2271846303085129e-2](5) -QRot["exp(-i%Z)",1.2271846303085129e-2](11) -QGate["not"](6) with controls=[+11] with nocontrol -QRot["exp(-i%Z)",-2.454369260617026e-2](6) -QGate["not"](6) with controls=[+11] with nocontrol -QRot["exp(-i%Z)",2.4543692606170259e-2](6) -QRot["exp(-i%Z)",2.4543692606170259e-2](11) -QGate["not"](7) with controls=[+11] with nocontrol -QRot["exp(-i%Z)",-4.908738521234052e-2](7) -QGate["not"](7) with controls=[+11] with nocontrol -QRot["exp(-i%Z)",4.9087385212340517e-2](7) -QRot["exp(-i%Z)",4.9087385212340517e-2](11) -QGate["not"](8) with controls=[+11] with nocontrol -QRot["exp(-i%Z)",-9.817477042468103e-2](8) -QGate["not"](8) with controls=[+11] with nocontrol -QRot["exp(-i%Z)",9.8174770424681035e-2](8) -QRot["exp(-i%Z)",9.8174770424681035e-2](11) -QGate["not"](9) with controls=[+11] with nocontrol -QRot["exp(-i%Z)",-1.963495408493621e-1](9) -QGate["not"](9) with controls=[+11] with nocontrol -QRot["exp(-i%Z)",1.9634954084936207e-1](9) -QRot["exp(-i%Z)",1.9634954084936207e-1](11) -QGate["not"](10) with controls=[+11] with nocontrol -QRot["exp(-i%Z)",-3.926990816987241e-1](10) -QGate["not"](10) with controls=[+11] with nocontrol -QRot["exp(-i%Z)",3.9269908169872414e-1](10) -QRot["exp(-i%Z)",3.9269908169872414e-1](11) -QGate["H"](11) with nocontrol -QGate["not"](0) with controls=[+12] with nocontrol -QRot["exp(-i%Z)",-1.917475984857051e-4](0) -QGate["not"](0) with controls=[+12] with nocontrol -QRot["exp(-i%Z)",1.9174759848570515e-4](0) -QRot["exp(-i%Z)",1.9174759848570515e-4](12) -QGate["not"](1) with controls=[+12] with nocontrol -QRot["exp(-i%Z)",-3.834951969714103e-4](1) -QGate["not"](1) with controls=[+12] with nocontrol -QRot["exp(-i%Z)",3.8349519697141029e-4](1) -QRot["exp(-i%Z)",3.8349519697141029e-4](12) -QGate["not"](2) with controls=[+12] with nocontrol -QRot["exp(-i%Z)",-7.669903939428206e-4](2) -QGate["not"](2) with controls=[+12] with nocontrol -QRot["exp(-i%Z)",7.6699039394282058e-4](2) -QRot["exp(-i%Z)",7.6699039394282058e-4](12) -QGate["not"](3) with controls=[+12] with nocontrol -QRot["exp(-i%Z)",-1.533980787885641e-3](3) -QGate["not"](3) with controls=[+12] with nocontrol -QRot["exp(-i%Z)",1.5339807878856412e-3](3) -QRot["exp(-i%Z)",1.5339807878856412e-3](12) -QGate["not"](4) with controls=[+12] with nocontrol -QRot["exp(-i%Z)",-3.067961575771282e-3](4) -QGate["not"](4) with controls=[+12] with nocontrol -QRot["exp(-i%Z)",3.0679615757712823e-3](4) -QRot["exp(-i%Z)",3.0679615757712823e-3](12) -QGate["not"](5) with controls=[+12] with nocontrol -QRot["exp(-i%Z)",-6.135923151542565e-3](5) -QGate["not"](5) with controls=[+12] with nocontrol -QRot["exp(-i%Z)",6.1359231515425647e-3](5) -QRot["exp(-i%Z)",6.1359231515425647e-3](12) -QGate["not"](6) with controls=[+12] with nocontrol -QRot["exp(-i%Z)",-1.227184630308513e-2](6) -QGate["not"](6) with controls=[+12] with nocontrol -QRot["exp(-i%Z)",1.2271846303085129e-2](6) -QRot["exp(-i%Z)",1.2271846303085129e-2](12) -QGate["not"](7) with controls=[+12] with nocontrol -QRot["exp(-i%Z)",-2.454369260617026e-2](7) -QGate["not"](7) with controls=[+12] with nocontrol -QRot["exp(-i%Z)",2.4543692606170259e-2](7) -QRot["exp(-i%Z)",2.4543692606170259e-2](12) -QGate["not"](8) with controls=[+12] with nocontrol -QRot["exp(-i%Z)",-4.908738521234052e-2](8) -QGate["not"](8) with controls=[+12] with nocontrol -QRot["exp(-i%Z)",4.9087385212340517e-2](8) -QRot["exp(-i%Z)",4.9087385212340517e-2](12) -QGate["not"](9) with controls=[+12] with nocontrol -QRot["exp(-i%Z)",-9.817477042468103e-2](9) -QGate["not"](9) with controls=[+12] with nocontrol -QRot["exp(-i%Z)",9.8174770424681035e-2](9) -QRot["exp(-i%Z)",9.8174770424681035e-2](12) -QGate["not"](10) with controls=[+12] with nocontrol -QRot["exp(-i%Z)",-1.963495408493621e-1](10) -QGate["not"](10) with controls=[+12] with nocontrol -QRot["exp(-i%Z)",1.9634954084936207e-1](10) -QRot["exp(-i%Z)",1.9634954084936207e-1](12) -QGate["not"](11) with controls=[+12] with nocontrol -QRot["exp(-i%Z)",-3.926990816987241e-1](11) -QGate["not"](11) with controls=[+12] with nocontrol -QRot["exp(-i%Z)",3.9269908169872414e-1](11) -QRot["exp(-i%Z)",3.9269908169872414e-1](12) -QGate["H"](12) with nocontrol -QGate["not"](1) with controls=[+13] with nocontrol -QRot["exp(-i%Z)",-1.917475984857051e-4](1) -QGate["not"](1) with controls=[+13] with nocontrol -QRot["exp(-i%Z)",1.9174759848570515e-4](1) -QRot["exp(-i%Z)",1.9174759848570515e-4](13) -QGate["not"](2) with controls=[+13] with nocontrol -QRot["exp(-i%Z)",-3.834951969714103e-4](2) -QGate["not"](2) with controls=[+13] with nocontrol -QRot["exp(-i%Z)",3.8349519697141029e-4](2) -QRot["exp(-i%Z)",3.8349519697141029e-4](13) -QGate["not"](3) with controls=[+13] with nocontrol -QRot["exp(-i%Z)",-7.669903939428206e-4](3) -QGate["not"](3) with controls=[+13] with nocontrol -QRot["exp(-i%Z)",7.6699039394282058e-4](3) -QRot["exp(-i%Z)",7.6699039394282058e-4](13) -QGate["not"](4) with controls=[+13] with nocontrol -QRot["exp(-i%Z)",-1.533980787885641e-3](4) -QGate["not"](4) with controls=[+13] with nocontrol -QRot["exp(-i%Z)",1.5339807878856412e-3](4) -QRot["exp(-i%Z)",1.5339807878856412e-3](13) -QGate["not"](5) with controls=[+13] with nocontrol -QRot["exp(-i%Z)",-3.067961575771282e-3](5) -QGate["not"](5) with controls=[+13] with nocontrol -QRot["exp(-i%Z)",3.0679615757712823e-3](5) -QRot["exp(-i%Z)",3.0679615757712823e-3](13) -QGate["not"](6) with controls=[+13] with nocontrol -QRot["exp(-i%Z)",-6.135923151542565e-3](6) -QGate["not"](6) with controls=[+13] with nocontrol -QRot["exp(-i%Z)",6.1359231515425647e-3](6) -QRot["exp(-i%Z)",6.1359231515425647e-3](13) -QGate["not"](7) with controls=[+13] with nocontrol -QRot["exp(-i%Z)",-1.227184630308513e-2](7) -QGate["not"](7) with controls=[+13] with nocontrol -QRot["exp(-i%Z)",1.2271846303085129e-2](7) -QRot["exp(-i%Z)",1.2271846303085129e-2](13) -QGate["not"](8) with controls=[+13] with nocontrol -QRot["exp(-i%Z)",-2.454369260617026e-2](8) -QGate["not"](8) with controls=[+13] with nocontrol -QRot["exp(-i%Z)",2.4543692606170259e-2](8) -QRot["exp(-i%Z)",2.4543692606170259e-2](13) -QGate["not"](9) with controls=[+13] with nocontrol -QRot["exp(-i%Z)",-4.908738521234052e-2](9) -QGate["not"](9) with controls=[+13] with nocontrol -QRot["exp(-i%Z)",4.9087385212340517e-2](9) -QRot["exp(-i%Z)",4.9087385212340517e-2](13) -QGate["not"](10) with controls=[+13] with nocontrol -QRot["exp(-i%Z)",-9.817477042468103e-2](10) -QGate["not"](10) with controls=[+13] with nocontrol -QRot["exp(-i%Z)",9.8174770424681035e-2](10) -QRot["exp(-i%Z)",9.8174770424681035e-2](13) -QGate["not"](11) with controls=[+13] with nocontrol -QRot["exp(-i%Z)",-1.963495408493621e-1](11) -QGate["not"](11) with controls=[+13] with nocontrol -QRot["exp(-i%Z)",1.9634954084936207e-1](11) -QRot["exp(-i%Z)",1.9634954084936207e-1](13) -QGate["not"](12) with controls=[+13] with nocontrol -QRot["exp(-i%Z)",-3.926990816987241e-1](12) -QGate["not"](12) with controls=[+13] with nocontrol -QRot["exp(-i%Z)",3.9269908169872414e-1](12) -QRot["exp(-i%Z)",3.9269908169872414e-1](13) -QGate["H"](13) with nocontrol -QGate["not"](2) with controls=[+14] with nocontrol -QRot["exp(-i%Z)",-1.917475984857051e-4](2) -QGate["not"](2) with controls=[+14] with nocontrol -QRot["exp(-i%Z)",1.9174759848570515e-4](2) -QRot["exp(-i%Z)",1.9174759848570515e-4](14) -QGate["not"](3) with controls=[+14] with nocontrol -QRot["exp(-i%Z)",-3.834951969714103e-4](3) -QGate["not"](3) with controls=[+14] with nocontrol -QRot["exp(-i%Z)",3.8349519697141029e-4](3) -QRot["exp(-i%Z)",3.8349519697141029e-4](14) -QGate["not"](4) with controls=[+14] with nocontrol -QRot["exp(-i%Z)",-7.669903939428206e-4](4) -QGate["not"](4) with controls=[+14] with nocontrol -QRot["exp(-i%Z)",7.6699039394282058e-4](4) -QRot["exp(-i%Z)",7.6699039394282058e-4](14) -QGate["not"](5) with controls=[+14] with nocontrol -QRot["exp(-i%Z)",-1.533980787885641e-3](5) -QGate["not"](5) with controls=[+14] with nocontrol -QRot["exp(-i%Z)",1.5339807878856412e-3](5) -QRot["exp(-i%Z)",1.5339807878856412e-3](14) -QGate["not"](6) with controls=[+14] with nocontrol -QRot["exp(-i%Z)",-3.067961575771282e-3](6) -QGate["not"](6) with controls=[+14] with nocontrol -QRot["exp(-i%Z)",3.0679615757712823e-3](6) -QRot["exp(-i%Z)",3.0679615757712823e-3](14) -QGate["not"](7) with controls=[+14] with nocontrol -QRot["exp(-i%Z)",-6.135923151542565e-3](7) -QGate["not"](7) with controls=[+14] with nocontrol -QRot["exp(-i%Z)",6.1359231515425647e-3](7) -QRot["exp(-i%Z)",6.1359231515425647e-3](14) -QGate["not"](8) with controls=[+14] with nocontrol -QRot["exp(-i%Z)",-1.227184630308513e-2](8) -QGate["not"](8) with controls=[+14] with nocontrol -QRot["exp(-i%Z)",1.2271846303085129e-2](8) -QRot["exp(-i%Z)",1.2271846303085129e-2](14) -QGate["not"](9) with controls=[+14] with nocontrol -QRot["exp(-i%Z)",-2.454369260617026e-2](9) -QGate["not"](9) with controls=[+14] with nocontrol -QRot["exp(-i%Z)",2.4543692606170259e-2](9) -QRot["exp(-i%Z)",2.4543692606170259e-2](14) -QGate["not"](10) with controls=[+14] with nocontrol -QRot["exp(-i%Z)",-4.908738521234052e-2](10) -QGate["not"](10) with controls=[+14] with nocontrol -QRot["exp(-i%Z)",4.9087385212340517e-2](10) -QRot["exp(-i%Z)",4.9087385212340517e-2](14) -QGate["not"](11) with controls=[+14] with nocontrol -QRot["exp(-i%Z)",-9.817477042468103e-2](11) -QGate["not"](11) with controls=[+14] with nocontrol -QRot["exp(-i%Z)",9.8174770424681035e-2](11) -QRot["exp(-i%Z)",9.8174770424681035e-2](14) -QGate["not"](12) with controls=[+14] with nocontrol -QRot["exp(-i%Z)",-1.963495408493621e-1](12) -QGate["not"](12) with controls=[+14] with nocontrol -QRot["exp(-i%Z)",1.9634954084936207e-1](12) -QRot["exp(-i%Z)",1.9634954084936207e-1](14) -QGate["not"](13) with controls=[+14] with nocontrol -QRot["exp(-i%Z)",-3.926990816987241e-1](13) -QGate["not"](13) with controls=[+14] with nocontrol -QRot["exp(-i%Z)",3.9269908169872414e-1](13) -QRot["exp(-i%Z)",3.9269908169872414e-1](14) -QGate["H"](14) with nocontrol -QGate["not"](3) with controls=[+15] with nocontrol -QRot["exp(-i%Z)",-1.917475984857051e-4](3) -QGate["not"](3) with controls=[+15] with nocontrol -QRot["exp(-i%Z)",1.9174759848570515e-4](3) -QRot["exp(-i%Z)",1.9174759848570515e-4](15) -QGate["not"](4) with controls=[+15] with nocontrol -QRot["exp(-i%Z)",-3.834951969714103e-4](4) -QGate["not"](4) with controls=[+15] with nocontrol -QRot["exp(-i%Z)",3.8349519697141029e-4](4) -QRot["exp(-i%Z)",3.8349519697141029e-4](15) -QGate["not"](5) with controls=[+15] with nocontrol -QRot["exp(-i%Z)",-7.669903939428206e-4](5) -QGate["not"](5) with controls=[+15] with nocontrol -QRot["exp(-i%Z)",7.6699039394282058e-4](5) -QRot["exp(-i%Z)",7.6699039394282058e-4](15) -QGate["not"](6) with controls=[+15] with nocontrol -QRot["exp(-i%Z)",-1.533980787885641e-3](6) -QGate["not"](6) with controls=[+15] with nocontrol -QRot["exp(-i%Z)",1.5339807878856412e-3](6) -QRot["exp(-i%Z)",1.5339807878856412e-3](15) -QGate["not"](7) with controls=[+15] with nocontrol -QRot["exp(-i%Z)",-3.067961575771282e-3](7) -QGate["not"](7) with controls=[+15] with nocontrol -QRot["exp(-i%Z)",3.0679615757712823e-3](7) -QRot["exp(-i%Z)",3.0679615757712823e-3](15) -QGate["not"](8) with controls=[+15] with nocontrol -QRot["exp(-i%Z)",-6.135923151542565e-3](8) -QGate["not"](8) with controls=[+15] with nocontrol -QRot["exp(-i%Z)",6.1359231515425647e-3](8) -QRot["exp(-i%Z)",6.1359231515425647e-3](15) -QGate["not"](9) with controls=[+15] with nocontrol -QRot["exp(-i%Z)",-1.227184630308513e-2](9) -QGate["not"](9) with controls=[+15] with nocontrol -QRot["exp(-i%Z)",1.2271846303085129e-2](9) -QRot["exp(-i%Z)",1.2271846303085129e-2](15) -QGate["not"](10) with controls=[+15] with nocontrol -QRot["exp(-i%Z)",-2.454369260617026e-2](10) -QGate["not"](10) with controls=[+15] with nocontrol -QRot["exp(-i%Z)",2.4543692606170259e-2](10) -QRot["exp(-i%Z)",2.4543692606170259e-2](15) -QGate["not"](11) with controls=[+15] with nocontrol -QRot["exp(-i%Z)",-4.908738521234052e-2](11) -QGate["not"](11) with controls=[+15] with nocontrol -QRot["exp(-i%Z)",4.9087385212340517e-2](11) -QRot["exp(-i%Z)",4.9087385212340517e-2](15) -QGate["not"](12) with controls=[+15] with nocontrol -QRot["exp(-i%Z)",-9.817477042468103e-2](12) -QGate["not"](12) with controls=[+15] with nocontrol -QRot["exp(-i%Z)",9.8174770424681035e-2](12) -QRot["exp(-i%Z)",9.8174770424681035e-2](15) -QGate["not"](13) with controls=[+15] with nocontrol -QRot["exp(-i%Z)",-1.963495408493621e-1](13) -QGate["not"](13) with controls=[+15] with nocontrol -QRot["exp(-i%Z)",1.9634954084936207e-1](13) -QRot["exp(-i%Z)",1.9634954084936207e-1](15) -QGate["not"](14) with controls=[+15] with nocontrol -QRot["exp(-i%Z)",-3.926990816987241e-1](14) -QGate["not"](14) with controls=[+15] with nocontrol -QRot["exp(-i%Z)",3.9269908169872414e-1](14) -QRot["exp(-i%Z)",3.9269908169872414e-1](15) -QGate["H"](15) with nocontrol -Comment["EXIT: qft_big_endian"](0:"qs[15]", 1:"qs[14]", 2:"qs[13]", 3:"qs[12]", 4:"qs[11]", 5:"qs[10]", 6:"qs[9]", 7:"qs[8]", 8:"qs[7]", 9:"qs[6]", 10:"qs[5]", 11:"qs[4]", 12:"qs[3]", 13:"qs[2]", 14:"qs[1]", 15:"qs[0]") -Outputs: 0:Qbit, 1:Qbit, 2:Qbit, 3:Qbit, 4:Qbit, 5:Qbit, 6:Qbit, 7:Qbit, 8:Qbit, 9:Qbit, 10:Qbit, 11:Qbit, 12:Qbit, 13:Qbit, 14:Qbit, 15:Qbit diff --git a/circuits/benchmarking_circuits/.DS_Store b/circuits/benchmarking_circuits/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..a657b567cc444f0f84b95fb185c92ea0b2039702 GIT binary patch literal 6148 zcmeHKK}y6x5bV|n0WW*p<9uO%FfQ>0`vF-O^pG$MB3^UzV}ifYFIe3@F1y4CUIe8Y zdMeZ1l}YN5PK$`HA9pK}g^09pLwUAkYL+*j*jbGu`L@eu%MzwvIk_E`d$EC9?E$3R428dP9VwT>7Xbi`Aw z%N57Kpo{v+xKBM<>x80yI^xO8MROomDnJEJ6*!OW!utO;d}jVXC2>ausKCEcK$~vU zt?^2=w@zNpdToN=z&{POUXI0EG0s(SIKPjfdqC;N1d9X!yS zs=z7gS^IlG4+D?Q4#FOR{1H7;LpQVzWbbVK+#mVXx#aHIHw+U?SLhgau-J zDA0!*X)%ls$GR22M6mVf!^ueVVI;GW4#l|axW9GoWD<`$Dg(;EkbymaIpz9)`FsCA z4ALuQKpEI6227OYS&B!J+B$kTuC*3=4P{}!)?*ifi7UnMH1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T05QOrPTp@2OfiGK|(@Eu<#JP2%i(H z*U}(1bUN9R^QEy}r(dJGCL%L_n2m^rM3h1q2m2Tz!gki43}odHX#71^G+$niCeyO0 zdfvLQi45?&+oPQ3w4jpW@2_Jo$}G#5WsbP?`Rw@R{QdRh=RJyY_NPyE(>o`-bc-F_ z(UgkFDQa2Ud${=ee3LzNJk~pidqnalbWass(JGR?v9)tQx~C7x-LkJU$Lx{3n|LmC zPs)HYu-y!xX0xOR0d-UclmTU+VSv967Ru-Z>wx~#fx))`zy!-)Fy~%^W2~SPtOLRV zF(DKfLXET-CWK?%ik}m#1BP%i(tH@nY@|amK0EGjy*n8fP)B7z8R#;w6E25b|4)DK z|GPnYr3@$oTg8A$vPm|^BS~%TJsj6s3%!K0uwNap3BkmdV)$|?K7x9|y5$Mb3DyCz Q0?{7n+a literal 0 HcmV?d00001 diff --git a/circuits/Slow/Adder16_before b/circuits/benchmarking_circuits/Slow/before/Adder16 similarity index 100% rename from circuits/Slow/Adder16_before rename to circuits/benchmarking_circuits/Slow/before/Adder16 diff --git a/circuits/Slow/Adder32_before b/circuits/benchmarking_circuits/Slow/before/Adder32 similarity index 100% rename from circuits/Slow/Adder32_before rename to circuits/benchmarking_circuits/Slow/before/Adder32 diff --git a/circuits/Slow/Adder64_before b/circuits/benchmarking_circuits/Slow/before/Adder64 similarity index 100% rename from circuits/Slow/Adder64_before rename to circuits/benchmarking_circuits/Slow/before/Adder64 diff --git a/circuits/Slow/QFT32_before b/circuits/benchmarking_circuits/Slow/before/QFT32 similarity index 100% rename from circuits/Slow/QFT32_before rename to circuits/benchmarking_circuits/Slow/before/QFT32 diff --git a/circuits/Slow/QFTAdd16_before b/circuits/benchmarking_circuits/Slow/before/QFTAdd16 similarity index 100% rename from circuits/Slow/QFTAdd16_before rename to circuits/benchmarking_circuits/Slow/before/QFTAdd16 diff --git a/circuits/Slow/QFTAdd32_before b/circuits/benchmarking_circuits/Slow/before/QFTAdd32 similarity index 100% rename from circuits/Slow/QFTAdd32_before rename to circuits/benchmarking_circuits/Slow/before/QFTAdd32 diff --git a/circuits/Fast/gf2^10_mult_before b/circuits/benchmarking_circuits/Slow/before/gf2^10_mult similarity index 100% rename from circuits/Fast/gf2^10_mult_before rename to circuits/benchmarking_circuits/Slow/before/gf2^10_mult diff --git a/circuits/Slow/gf2^16_mult_before b/circuits/benchmarking_circuits/Slow/before/gf2^16_mult similarity index 100% rename from circuits/Slow/gf2^16_mult_before rename to circuits/benchmarking_circuits/Slow/before/gf2^16_mult diff --git a/circuits/Fast/gf2^9_mult_before b/circuits/benchmarking_circuits/Slow/before/gf2^9_mult similarity index 100% rename from circuits/Fast/gf2^9_mult_before rename to circuits/benchmarking_circuits/Slow/before/gf2^9_mult diff --git a/circuits/Slow/ham15-high.qc b/circuits/benchmarking_circuits/Slow/before/ham15-high.qc similarity index 100% rename from circuits/Slow/ham15-high.qc rename to circuits/benchmarking_circuits/Slow/before/ham15-high.qc diff --git a/circuits/Slow/ham15-med.qc b/circuits/benchmarking_circuits/Slow/before/ham15-med.qc similarity index 100% rename from circuits/Slow/ham15-med.qc rename to circuits/benchmarking_circuits/Slow/before/ham15-med.qc diff --git a/circuits/Slow/hwb8.qc b/circuits/benchmarking_circuits/Slow/before/hwb8.qc similarity index 100% rename from circuits/Slow/hwb8.qc rename to circuits/benchmarking_circuits/Slow/before/hwb8.qc diff --git a/circuits/Slow/mod_adder_1024_before b/circuits/benchmarking_circuits/Slow/before/mod_adder_1024 similarity index 100% rename from circuits/Slow/mod_adder_1024_before rename to circuits/benchmarking_circuits/Slow/before/mod_adder_1024 diff --git a/circuits/Fast/nth_prime6.tfc b/circuits/benchmarking_circuits/Slow/before/nth_prime6.tfc similarity index 100% rename from circuits/Fast/nth_prime6.tfc rename to circuits/benchmarking_circuits/Slow/before/nth_prime6.tfc diff --git a/circuits/Slow/nth_prime8.tfc b/circuits/benchmarking_circuits/Slow/before/nth_prime8.tfc similarity index 100% rename from circuits/Slow/nth_prime8.tfc rename to circuits/benchmarking_circuits/Slow/before/nth_prime8.tfc diff --git a/circuits/Slow/Adder16_after_heavy b/circuits/benchmarking_circuits/Slow/nrscm/Adder16 similarity index 100% rename from circuits/Slow/Adder16_after_heavy rename to circuits/benchmarking_circuits/Slow/nrscm/Adder16 diff --git a/circuits/Slow/Adder32_after_heavy b/circuits/benchmarking_circuits/Slow/nrscm/Adder32 similarity index 100% rename from circuits/Slow/Adder32_after_heavy rename to circuits/benchmarking_circuits/Slow/nrscm/Adder32 diff --git a/circuits/Slow/Adder64_after_heavy b/circuits/benchmarking_circuits/Slow/nrscm/Adder64 similarity index 100% rename from circuits/Slow/Adder64_after_heavy rename to circuits/benchmarking_circuits/Slow/nrscm/Adder64 diff --git a/circuits/Slow/QFT32_after b/circuits/benchmarking_circuits/Slow/nrscm/QFT32 similarity index 100% rename from circuits/Slow/QFT32_after rename to circuits/benchmarking_circuits/Slow/nrscm/QFT32 diff --git a/circuits/Slow/QFTAdd16_after b/circuits/benchmarking_circuits/Slow/nrscm/QFTAdd16 similarity index 100% rename from circuits/Slow/QFTAdd16_after rename to circuits/benchmarking_circuits/Slow/nrscm/QFTAdd16 diff --git a/circuits/Slow/QFTAdd32_after b/circuits/benchmarking_circuits/Slow/nrscm/QFTAdd32 similarity index 100% rename from circuits/Slow/QFTAdd32_after rename to circuits/benchmarking_circuits/Slow/nrscm/QFTAdd32 diff --git a/circuits/Fast/gf2^10_mult_after_heavy b/circuits/benchmarking_circuits/Slow/nrscm/gf2^10_mult similarity index 100% rename from circuits/Fast/gf2^10_mult_after_heavy rename to circuits/benchmarking_circuits/Slow/nrscm/gf2^10_mult diff --git a/circuits/Slow/gf2^16_mult_after_heavy b/circuits/benchmarking_circuits/Slow/nrscm/gf2^16_mult similarity index 100% rename from circuits/Slow/gf2^16_mult_after_heavy rename to circuits/benchmarking_circuits/Slow/nrscm/gf2^16_mult diff --git a/circuits/Fast/gf2^9_mult_after_heavy b/circuits/benchmarking_circuits/Slow/nrscm/gf2^9_mult similarity index 100% rename from circuits/Fast/gf2^9_mult_after_heavy rename to circuits/benchmarking_circuits/Slow/nrscm/gf2^9_mult diff --git a/circuits/Slow/mod_adder_1024_after_heavy b/circuits/benchmarking_circuits/Slow/nrscm/mod_adder_1024 similarity index 100% rename from circuits/Slow/mod_adder_1024_after_heavy rename to circuits/benchmarking_circuits/Slow/nrscm/mod_adder_1024 diff --git a/circuits/Fast/gf2^10_mult_tpar.qc b/circuits/benchmarking_circuits/Slow/tpar/gf2^10_mult.qc similarity index 100% rename from circuits/Fast/gf2^10_mult_tpar.qc rename to circuits/benchmarking_circuits/Slow/tpar/gf2^10_mult.qc diff --git a/circuits/Slow/gf2^16_mult_tpar.qc b/circuits/benchmarking_circuits/Slow/tpar/gf2^16_mult.qc similarity index 100% rename from circuits/Slow/gf2^16_mult_tpar.qc rename to circuits/benchmarking_circuits/Slow/tpar/gf2^16_mult.qc diff --git a/circuits/Fast/gf2^9_mult_tpar.qc b/circuits/benchmarking_circuits/Slow/tpar/gf2^9_mult.qc similarity index 100% rename from circuits/Fast/gf2^9_mult_tpar.qc rename to circuits/benchmarking_circuits/Slow/tpar/gf2^9_mult.qc diff --git a/circuits/Slow/mod_adder_1024_tpar.qc b/circuits/benchmarking_circuits/Slow/tpar/mod_adder_1024.qc similarity index 100% rename from circuits/Slow/mod_adder_1024_tpar.qc rename to circuits/benchmarking_circuits/Slow/tpar/mod_adder_1024.qc diff --git a/demos/.DS_Store b/demos/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..269cca17bdab9732c29231abd0e2f86ae1fab4da GIT binary patch literal 6148 zcmeHK!Ab)$5S_HuwusP!f_Mset=MW06)#KGv*3yzRO+rRy13nx-K{;8!hV4MkRRgr zIFn?>QUx!Hl^K}4$z&#JUP@*I0HQPMH34b>P(dXuRI&L)XqYXVS`nm1-=Rtqmt*srZDD{G^nBZ(5g={oO`gw)S_Y(`sdXYva`G zYB7grG`_v#M>mc_72RP@K3_f$BQwAZFawLrfW6TwD~r1Y{^iU7Gw?$U(ET7$2_1`> zL49>#L!XZ{ULqtxo8A(H(xPKAGl(N7!lWXaRAHYO!la{L+BnBzX3(UA&@1CSc4c8- zC_=A}eyPJjI0m_82AF|a28yOzqxygR_4|J|iF?cdGw`n%5TzscsDoRwwRLWDRBI*b r4Jrx6Wd`3<(9oqAW2qExplU(CBm>d0m>EP53V#S_8n|HwewBeYA^260 literal 0 HcmV?d00001 diff --git a/demos/circuit_optimisation/.DS_Store b/demos/circuit_optimisation/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..dc160f9ecb340eed1b78acfa0acda4904e2fe87a GIT binary patch literal 6148 zcmeHKJx{|h5IvVv3b2#`i7^{<8R#0Ku(BXFP`}k88d6bM5JLtAW;Qn1m|577_znC8 zMs|e6JKLg;(pH55A#^95pJU(I&rgXR6OoF}I#r?y5&3XNZwbW&<9_ynm23+qD?LV^ z5^B;39SwSgXlW1yM1jAi0DrrS)S@mOQ=6Rcx4PR-lcA=&`Mx?iDoNwGHAq|N^&hSd zqTBBC*0jjZoRP!6GjlD(aNyU|{OVwMh~1@4qe0J!^7d~gN4fm2%dan&7nWaPyd)j- zn;n_sS7v&&LMaXD6x6T7jqN)xdJ$|+5BaLQi=ki zfGF^#0Phb0oH4YR8Pr<`3Vj6tdT7>$I{#8|PGB*#m>EP5Oqo=mNmcfWp-ej30~;4w z%nX`zQugwp?99sEP?Vk>;|DsNRA^92Q9u;PE3jZ5D}4TMPrv`?ljKPh5C#5~0?Lbb z;|NQ#XKP_`eAWi=2AqxKGJ`q=g*}dSg^%JjxHj|!Tmgm_GlOV>$&Y}RK?+geR~7gK DRnDv# literal 0 HcmV?d00001 diff --git a/demos/circuit_optimisation/benchmark/circuit_groups.pkl b/demos/circuit_optimisation/benchmark/circuit_groups.pkl new file mode 100644 index 0000000000000000000000000000000000000000..92aa2a5c517f33ef42a79fd26b4db229aca6efdc GIT binary patch literal 413 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 literal 0 HcmV?d00001 diff --git a/demos/circuit_optimisation/benchmark/funcs.pkl b/demos/circuit_optimisation/benchmark/funcs.pkl new file mode 100644 index 0000000000000000000000000000000000000000..7e02d3a0064c07a11d494f91a431002633929abb GIT binary patch literal 1526 zcmb`HTWcFf6vua^k*$>!OSHCI*%(Zo6o|c+P^y$bh%IOzL}ii&3Qb^G?~XOw?9IEg zu~Tdify8kcs3B9TN7DyWupjzSRzl!D)SsYVqGzSZvYpW8p|iJhnHy(*|81jR{!U4Q zwkJwFyBS*6l243KCxT}T)3TOv{1&``b)RUA;LXs{ndv&>ttin1&yC``YmhirPbcJ( zd{=%di-z2g;7T@7BU%6JS7}!|8m@KieGLA|MQl%Ii3>+Mx@3=|yRsplCXOL@a*>y% zE8~*m-eU{KB~Q`SaYtyJA6wV=EAvpFwHU;I@3tqk<=X+!4c4<58*eWQX~h&aiI!dT27ir=b6a7MMD2LDd5Y3_aIl zrfmiUCgrjYPYWj0D`H>pZ`9|SuWq`QLHt0y^M$%?{7`Yqt)Qw0W#6vQExT22tvL1y zw3eejR!#54GvYhM!nJC(Qc-IwD_`EN)$UZ6y%&NOXrVD#|E?|lnO1(z{FFJ!@mzcL z98K&uUp5cRooc(;MT>p37@@^;C3~jK_muh0>hCj=GT&9yzM`Hf_j}6yuJWL-JZP_- zXN#Si-Rwd?yAYuTQJ2K6TTDC>I>sBJX))8mID@gR4GdanHskCbTs)7l<~T0XV)6ov zAr`zA8&E~d-Cly4EI|n4R zyoITe=wjC*f__3jg(+v~Ed6X>&>~L{`U72p-fP^bzkOc`XK1#EW)HWzsMtrv2o*sc zXK1>IrVk(fF%zNbE~@oWEkdb3o=o zuzGigC}m?1aCcAvIT`2$j36)}E(nZ1gAIbYAjJXZ!(gzuyMw+Y)QONF$V!2RQ4~z2 zz7O05s6k*xR1jD!gZdB>2dR6Y=En#_9bg1g0C7OJG*mnatS`;o!363;j36*4E(q*- zARd6Gg7h8GAc)I>I>oF3ECP#!?3>^a0Y(DM1s0pZZo*6jmP7@CQv%d{NDyQ$0CU|P z5(1$XS$>9?4^4(SFngn7pf0ol%Nt{)0z(7hg23es*dSOc$b!4z56psRU^`(!kORvg zQ8iEnc2FmxX9PndqJqF3=0ivj;#Lzf*`jJ>>yw&013~W2Nnmp lEzponS`77}BS-*LT0t^GZZ}js3SzIjgVP#_g3{DdJpio*?+yR} literal 0 HcmV?d00001 diff --git a/demos/circuit_optimisation/benchmark/routines.pkl b/demos/circuit_optimisation/benchmark/routines.pkl new file mode 100644 index 0000000000000000000000000000000000000000..ff14d8e163fc1f9b4f4b07af61cd500242eeb8bf GIT binary patch literal 24 bcmZo*naaxm0sT`ndRYB}f}MS*Owa=WJP-xg literal 0 HcmV?d00001 diff --git a/demos/circuit_optimisation/benchmarking.ipynb b/demos/circuit_optimisation/benchmarking.ipynb new file mode 100644 index 00000000..e2b8453f --- /dev/null +++ b/demos/circuit_optimisation/benchmarking.ipynb @@ -0,0 +1,2976 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import sys, os, time\n", + "sys.path.append('../..')\n", + "import pyzx as zx\n", + "from benchmarking import benchmark" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To use the benchmarking class, we first create our benchmark object. \n", + "\n", + "If a previous object has been saved (using ``b.save('dirpath')``), we can load this directly from the directory." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "b = benchmark()\n", + "# b = benchmark(dirpath='benchmark')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can then load the set of circuits which we want to benchmark. \n", + "\n", + "If we have a set of already optimised circuits via a different routine, we can also load these. \n", + "\n", + "Here we load a set of optimised circuits using the routine from [Nam, Ross, Su, Childs, Maslov - Automated optimization of large quantum circuits with continuous parameters](https://www.nature.com/articles/s41534-018-0072-4)." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Circuit attributes: ['Qubits', 'Gates', '2Q Count', 'T Count', 't_opt']\n", + "No loaded functions\n", + "Loaded routines: ['NRSCM']\n", + "Loaded circuit groups: ['fast']\n" + ] + }, + { + "data": { + "text/html": [ + "

\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
OriginalNRSCM
fastYY
\n", + "
" + ], + "text/plain": [ + " Original NRSCM\n", + "fast Y Y" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "b.load_circuits(dirname=os.path.join('..', '..', 'circuits', 'benchmarking_circuits', 'Fast', 'before'), group_name='fast')\n", + "b.load_circuits(dirname=os.path.join('..', '..', 'circuits', 'benchmarking_circuits', 'Fast', 'nrscm'), group_name='fast', simp_strategy='NRSCM')\n", + "b.show_attributes()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can then define the optimisation functions which we want to benchmark. These should take a circuit as input and output the optimised circuit." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def basic_optimise(c):\n", + " c1 = zx.basic_optimization(c.copy(), do_swaps=False).to_basic_gates()\n", + " c2 = zx.basic_optimization(c.copy(), do_swaps=True).to_basic_gates()\n", + " if c2.twoqubitcount() < c1.twoqubitcount(): return c2 # As this optimisation algorithm is targetted at reducting H-gates, we use the circuit with the smaller 2-qubit gate count here, either using SWAP rules or not.\n", + " return c1\n", + "\n", + "def full_reduce(c):\n", + " g = c.to_graph()\n", + " zx.full_reduce(g,quiet=True)\n", + " c2 = zx.extract_circuit(g,up_to_perm=False).to_basic_gates()\n", + " return basic_optimise(c2)\n", + "\n", + "def flow_opt(c):\n", + " g = c.to_graph()\n", + " zx.teleport_reduce(g)\n", + " zx.to_graph_like(g, assert_bound_connections=False)\n", + " zx.flow_2Q_simp(g, cFlow=True, rewrites=['id_fuse','lcomp','pivot'], max_lc_unfusions=2, max_p_unfusions=2)\n", + " c2 = zx.extract_simple(g, up_to_perm=False).to_basic_gates()\n", + " return basic_optimise(c2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "These functions can then be added to the benchmark object. If desired they can also be deleted using ``b.del_simplification_funcs(['func'])``.\n", + "\n", + "They can either be run immediately on a group of circuits (default is all), or run afterwards.\n", + "\n", + "The optimised circuits can optionally be verified to equal the original circuit (by using full_reduce on the original + adjoint)." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Processing full-reduce on tof_3 : 0%| | 0/31 [00:00\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
OriginalNRSCMflow-opt-c2full-reduce
fastYYYY
\n", + "" + ], + "text/plain": [ + " Original NRSCM flow-opt-c2 full-reduce\n", + "fast Y Y Y Y" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "b.add_simplification_func(func=full_reduce, name='full-reduce', groups_to_run=['fast'], verify=True, rerun=False)\n", + "\n", + "b.add_simplification_func(func=flow_opt, name='flow-opt-c2', groups_to_run=None)\n", + "b.run(funcs_to_run=['flow-opt-c2'], groups_to_run=['fast'], verify=True, rerun=False)\n", + "\n", + "b.show_attributes()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can then view the results in a dataframe." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
 OriginalNRSCMflow-opt-c2full-reduce
 Qubits2Q CountT Count2Q CountT Count2Q CountT Countt_opt2Q CountT Countt_opt
Circuits           
Adder8232432669456111561.25160560.41
QFT885684564256420.1678420.02
QFTAdd8161842521841121751120.572631120.10
adder_8244093992912152761734.034281730.79
barenco_tof_10191922241301001461000.372011000.29
barenco_tof_352428181620160.0124160.01
barenco_tof_474856342837280.0357280.02
barenco_tof_597284504055400.0774400.03
csla_mux_3_original158070706473620.04164620.04
csum_mux_9_corrected3016819614084140840.35313840.18
gf2^4_mult1299112996894680.07341680.06
gf2^5_mult151541751541151461150.135461150.10
gf2^6_mult182212522211502091500.251,0171500.23
gf2^7_mult213003433002172832170.461,4372170.38
gf2^8_mult244054484052643832640.812,0672640.65
grover_59288336--2231661.262841660.17
ham15-low17236161--214972.43342970.19
hwb67116105--101750.27140750.05
mod5_45282828162080.022780.00
mod_mult_5594849403540350.0493350.02
mod_red_2111105119777383730.22159730.06
qcla_adder_10362332381831621821620.453621620.53
qcla_com_72418620313295133950.78251950.59
qcla_mod_7263824132922352962373.116232372.94
qft_454669--44670.0353670.02
rc_adder_6149377714771470.11122470.04
tof_1019102119707178710.14137710.08
tof_351821141515150.0121150.01
tof_473035222324230.0246230.01
tof_594249303133310.0355310.02
vbe_adder_3107070502440240.1970240.02
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df = b.df(groups=['fast'], routines=['all'], funcs=['all'], atts=['Qubits','2Q Count','T Count', 't_opt'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also generate graphs based on optimisations of randomly generated circuits." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 0%| | 0/11 [00:00\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2023-12-04T15:50:58.522289\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.7.2, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig = b.Pt_graphs(funcs=['full-reduce', 'flow-opt-c2'], qubits=8, depth=400, cnot_prob=0.3, t_probs=[0.015*i for i in range(11)], ys=['2Q Count', 'T Count', 'Gates'], reps=20, overwrite=True, random_seed=42)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# b.save('benchmark')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "pyzx", + "language": "python", + "name": "pyzx" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/demos/circuit_optimisation/qft-opt.ipynb b/demos/circuit_optimisation/qft-opt.ipynb new file mode 100644 index 00000000..3d0fb56a --- /dev/null +++ b/demos/circuit_optimisation/qft-opt.ipynb @@ -0,0 +1,773 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import sys, os, time\n", + "sys.path.append('../..')\n", + "import pyzx as zx\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2Q-count = 56\n", + "Non-Clifford gate count = 84\n" + ] + } + ], + "source": [ + "c_i = zx.Circuit.load(\"../../circuits/benchmarking_circuits/Fast/before/QFT8\")\n", + "zx.draw(c_i)\n", + "print(f'2Q-count = {c_i.twoqubitcount()}')\n", + "print(f'Non-Clifford gate count = {c_i.tcount()}')" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2Q-count = 42\n", + "Non-Clifford gate count = 42\n" + ] + } + ], + "source": [ + "g = c_i.to_graph()\n", + "zx.to_graph_like(g)\n", + "zx.teleport_reduce(g)\n", + "zx.id_fuse_simp(g, quiet=True)\n", + "c_f = zx.extract_circuit(g)\n", + "c_f = zx.basic_optimization(c_f)\n", + "zx.draw(c_f)\n", + "print(f'2Q-count = {c_f.twoqubitcount()}')\n", + "print(f'Non-Clifford gate count = {c_f.tcount()}')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "These two circuits are equal as evidenced by equal matrices. Note that the way the matrices are calculated introduces some rounding errors (e.g. see the 0,0 element below)." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(3.191891195797325e-16+0j)" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "c_i.to_matrix()[0,0] - c_f.to_matrix()[0,0]" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.allclose(c_i.to_matrix(), c_f.to_matrix(), atol=1e-10)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "pyzx", + "language": "python", + "name": "pyzx" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/doc/.DS_Store b/doc/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5c8fff28e9e702df676aac89ad6ea29f86d6dc7c GIT binary patch literal 6148 zcmeHK%}T>S5S~p7R=gB@@wgYy(l>}DK0zNqZ7Wu2NTKn*FXzqI=p%Udn;$~Mw&F>o z%)soonVs34d`*DBFYxN7S?V8^fJ8clLjpWnP znqH`e?(}^!kL$0`+~bFQ4)&>=lldHY_41h{&d0?Wa0Z-#b7KHCn`LyR=%X{>3^)TF z1N?o6P{z_QDaxk|-Yf>rjH64to@L3ZJ literal 0 HcmV?d00001 diff --git a/doc/api.rst b/doc/api.rst index 2139c27e..2dcbd93e 100644 --- a/doc/api.rst +++ b/doc/api.rst @@ -1,6 +1,5 @@ Full API documentation ====================== - Below is listed the documentation for all the supported functions, classes and methods in PyZX. Some functionality of PyZX is still experimental or not well-tested (like the ZH-diagram interface and rewrite rules), so it is not listed here. @@ -21,7 +20,6 @@ Below you can find full documentation of all the functions supplied by a Graph i .. autoclass:: pyzx.graph.base.BaseGraph :members: - Circuit API ----------- @@ -32,20 +30,16 @@ Circuit API .. autoclass:: pyzx.circuit.Circuit :members: - .. _generate: Generating Circuits ------------------- - - The following are some methods to generate (random) quantum circuits. .. automodule:: pyzx.generate :members: :undoc-members: - .. _extract: Circuit extraction and matrices over Z2 @@ -53,37 +47,105 @@ Circuit extraction and matrices over Z2 .. module:: extract -There is basically a single function that is needed for the most general extraction of a circuit from a ZX-diagram: +There is a single function that performs the most general extraction of a circuit from a ZX-diagram: .. autofunction:: pyzx.extract.extract_circuit -This function uses some reasoning over matrices over the field Z2. This functionality is implemented in the following class. +For graphs which admit a causal flow there is a simpler function for circuit extraction: + +.. autofunction:: pyzx.extract.extract_simple + +The function :func:`~pyzx.extract.extract_circuit` uses some reasoning over matrices over the field Z2. This functionality is implemented in the following class. .. autoclass:: pyzx.linalg.Mat2 :members: +The function :func:`~pyzx.extract.extract_simple` uses a phase polynomial synthesis algorithm based on https://arxiv.org/abs/2004.06052 to extract phase gadgets fufilling causal flow conditons. This is implemented in the following function. + +.. autofunction:: pyzx.extract.phase_poly_synth .. _simplify: List of simplifications ----------------------- - Below is listed the content of ``simplify.py``. .. module:: simplify .. automodule:: pyzx.simplify - :members: - :undoc-members: + + The following functions iteratively apply a single rewrite rule frum rules_ using the helper function :func:`~pyzx.simplify.simp` .. autofunction:: simp + .. autofunction:: id_simp + + .. autofunction:: spider_simp + + .. autofunction:: id_fuse_simp + + .. autofunction:: pivot_simp + + .. autofunction:: pivot_boundary_simp + + .. autofunction:: pivot_gadget_simp + + .. autofunction:: lcomp_simp + + .. autofunction:: biagl_simp + + .. autofunction:: gadget_simp + + .. autofunction:: supplementarity_simp + + .. autofunction:: copy_simp + + The following functions iteratively apply a combination of the above functions: + + .. autofunction:: basic_simp + + .. autofunction:: phase_free_simp + + .. autofunction:: interior_clifford_simp + + .. autofunction:: clifford_simp + + .. autofunction:: full_reduce + + .. autofunction:: reduce_scalar + + The following function implements phase teleportation of non-Clifford phases: + + .. autofunction:: teleport_reduce + + The following implements a more selective simplification strategy using the helper function :func:`~pyzx.simplify.selective_simp` + + .. autofunction:: selective_simp + + .. autofunction:: flow_2Q_simp + + .. autofunction:: match_score_2Q_simp + + .. autofunction:: update_2Q_simp_matches + + The following functions perform various useful actions on ZX-diagrams: + + .. autofunction:: to_gh + + .. autofunction:: to_rg + + .. autofunction:: to_graph_like + + .. autofunction:: is_graph_like + + .. autofunction:: to_clifford_normal_form_graph + + .. autofunction:: tcount .. _rules: List of rewrite rules --------------------- - Below is listed the content of ``rules.py``. .. module:: rules @@ -92,13 +154,33 @@ Below is listed the content of ``rules.py``. :members: :undoc-members: +.. _heuristics: + +List of heuristic functions +--------------------------- +Below is listed the content of ``heuristics.py``. +.. module:: heuristics + +.. automodule:: pyzx.heuristics + :members: + :undoc-members: + +.. _flow: + +List of flow functions +---------------------- +Below is listed the content of ``flow.py``. + +.. module:: flow + +.. automodule:: pyzx.flow + :members: .. _optimize: List of optimization functions ------------------------------ - Below is listed the content of ``optimize.py``. .. module:: optimize @@ -107,12 +189,10 @@ Below is listed the content of ``optimize.py``. :members: :undoc-members: - .. _routing: List of routing functions ------------------------------ - Below is listed the content of ``routing.py``. .. module:: routing @@ -126,7 +206,6 @@ Below is listed the content of ``routing.py``. Functions for dealing with tensors ---------------------------------- - Below is listed the content of ``tensor.py``. .. module:: tensor @@ -140,7 +219,6 @@ Below is listed the content of ``tensor.py``. Drawing ------- - Below is listed the content of ``drawing.py``. .. module:: drawing @@ -152,7 +230,6 @@ Below is listed the content of ``drawing.py``. Tikz and Quantomatic functionality ---------------------------------- - .. _tikz: Below is listed the content of ``tikz.py``. diff --git a/misc/.DS_Store b/misc/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0hGRTqIxu%w zTD0M0Y&aP=vvC=Uk=YTK37t%CQCoFD9jH6Nx%(Wl^(GDIILP0dz0T@(yXX%jXd(F+ zXZDLmW4BlAf|2fjTRGW$`Frgq_TDYngRZAy@imJ{p!0w}pgjT(1D!M9FX{|m-;dKL z%jYYiuX3G!G1e7l1$t&bvz{61Kurq{c0(;ETj8j$!T!VwAGH}OWA3oD$X(nor!Y{@e>Oym zI&g;^xM#I4asIy%fB%1n?ntGo1M0wS9Wc|4?Z!Hy Mat2: @@ -710,75 +711,160 @@ def extract_circuit( return graph_to_swaps(g, up_to_perm) + c -def extract_simple(g: BaseGraph[VT, ET], up_to_perm: bool = True) -> Circuit: - """A simplified circuit extractor that works on graphs with a causal flow (e.g. graphs arising - from circuits via spider fusion). +def extract_simple(g: BaseGraph[VT, ET], up_to_perm: bool = True, phase_poly_synth: bool = False) -> Circuit: + """A simplified circuit extractor that only works on graphs with causal flow. + Also works with an extension of causal flow that allows phase gadgets under certain conditions. + Phase gadgets are extracted using :func:`phase_poly_synth` - Args: - g: The graph to extract - up_to_perm: If true, returns a circuit that is equivalent to the given graph up to a permutation of the inputs. + :param g: The ZX-diagram to be extracted as a circuit + :param up_to_perm: If True, returns a circuit that is equivalent to the given graph up to a permutation of the inputs, defaults to True + :param phase_poly_synth: If True, synthesises any extractable phase gadgets as phase polynmolials + :return: """ - - progress = True + n_qubits = g.qubit_count() + circ = Circuit(n_qubits) outputs = g.outputs() - circ = Circuit(len(outputs)) - while progress: - progress = False + inputs = g.inputs() + phases = g.phases() + + while True: + progress_made = False + # Extracting output nodes for q, o in enumerate(outputs): - if g.vertex_degree(o) != 1: + on = list(g.neighbors(o)) + if len(on) != 1: raise ValueError("Bad output degree") - v = list(g.neighbors(o))[0] + + v = on[0] e = g.edge(o, v) if g.edge_type(e) == EdgeType.HADAMARD: - progress = True circ.prepend_gate(HAD(q)) g.set_edge_type(e, EdgeType.SIMPLE) - elif (g.type(v) == VertexType.Z or g.type(v) == VertexType.X) and g.vertex_degree(v) == 2: - ns = list(g.neighbors(v)) - w = ns[0] if ns[1] == o else ns[1] - progress = True - - if g.phase(v) != 0: - gate = (ZPhase(q, g.phase(v)) if g.type(v) == VertexType.Z else - XPhase(q, g.phase(v))) - circ.prepend_gate(gate) - - g.add_edge(g.edge(w,o), edgetype=g.edge_type(g.edge(w,v))) + progress_made = True + elif g.type(v) in [VertexType.Z, VertexType.X] and g.vertex_degree(v) == 2: + vn = list(g.neighbors(v)) + w = vn[0] if vn[1] == o else vn[1] + if g.phase(v) != 0: circ.prepend_gate(ZPhase(q, g.phase(v)) if g.type(v) == VertexType.Z else XPhase(q, g.phase(v))) + g.add_edge(g.edge(w, o), edgetype=g.edge_type(g.edge(w, v))) g.remove_vertex(v) + progress_made = True + + if progress_made: continue + + # Extracting pairs of output nodes + for q1, o1 in enumerate(outputs): + for q2, o2 in [(q, o) for q, o in enumerate(outputs) if q > q1]: + v1, v2 = list(g.neighbors(o1))[0], list(g.neighbors(o2))[0] + + if not g.connected(v1, v2): continue + + gate_map = { + (VertexType.Z, VertexType.Z, EdgeType.HADAMARD): CZ, + (VertexType.X, VertexType.X, EdgeType.HADAMARD): XCX, + (VertexType.Z, VertexType.X, EdgeType.SIMPLE): CNOT + } + + gate = gate_map.get((g.type(v1), g.type(v2), g.edge_type(g.edge(v1, v2)))) - if progress: continue + if gate: + circ.prepend_gate(gate(control=q1, target=q2)) + g.remove_edge(g.edge(v1, v2)) + progress_made = True + else: raise ValueError("ZX-diagram is not unitary") + + if progress_made: continue + if not phase_poly_synth: break + + # Extracting phase gadgets + front = {list(g.neighbors(o))[0]: q for q, o in enumerate(outputs)} + gadgets, zphases = [], [] + parity_matrix_T: List[List[Literal[0,1]]] = [] + + for v in g.vertices(): + if v in outputs or v in inputs or g.vertex_degree(v) != 1: continue + + n = list(g.neighbors(v))[0] + if not (g.type(v) == VertexType.Z and g.type(n) == VertexType.Z): continue + if phases[n] not in (0,1): continue + if n in gadgets: continue + if n in outputs or n in inputs: continue + + connected_vertices = set(g.neighbors(n)).difference({v}) + if not connected_vertices.issubset(front): continue + + gadgets.extend([n, v]) + zphases.append(-phases[v] if phases[n] == 1 else phases[v]) + connected_qubits = [front[vertex] for vertex in connected_vertices] + parity_matrix_T.append([1 if q in connected_qubits else 0 for q in range(n_qubits)]) + progress_made = True - for q1,o1 in enumerate(outputs): - for q2,o2 in enumerate(outputs): - if o1 == o2: continue - v1 = list(g.neighbors(o1))[0] - v2 = list(g.neighbors(o2))[0] - if g.connected(v1,v2): - if ((g.type(v1) == g.type(v2) and g.edge_type(g.edge(v1,v2)) == EdgeType.SIMPLE) or - (g.type(v1) != g.type(v2) and g.edge_type(g.edge(v1,v2)) == EdgeType.HADAMARD)): - raise ValueError("ZX diagram is not unitary") - - if g.type(v1) == VertexType.Z and g.type(v2) == VertexType.X: - # CNOT - progress = True - circ.prepend_gate(CNOT(control=q1,target=q2)) - g.remove_edge(g.edge(v1,v2)) - elif g.type(v1) == VertexType.Z and g.type(v2) == VertexType.Z: - # CZ - progress = True - circ.prepend_gate(CZ(control=q1,target=q2)) - g.remove_edge(g.edge(v1,v2)) - elif g.type(v1) == VertexType.X and g.type(v2) == VertexType.X: - # conjugate CZ - progress = True - circ.prepend_gate(XCX(control=q1, target=q2)) - g.remove_edge(g.edge(v1,v2)) + if gadgets: + phase_poly_circ = phase_poly_synth(n_qubits, parity_matrix_T, zphases) + g.remove_vertices(gadgets) + circ = phase_poly_circ + circ + if not progress_made: break return graph_to_swaps(g, up_to_perm) + circ +def phase_poly_synth(n_qubits: int, parity_matrix_T: List[List[Literal[0, 1]]], zphases: List[FractionLike]) -> Circuit: + """Converts a series of phase polynomials into a circuit, utilising Gray codes. + Based on pseudocode in https://arxiv.org/abs/2004.06052. + + :param n_qubits: Number of qubits + :param parity_matrix_T: Transpose of parity matrix describing support of phase polynomials + :param zphases: List of phases belonging to each phase polynomial + :return: + """ + circ = Circuit(n_qubits) + undo_circ = Circuit(n_qubits) + parity_matrix = [list(e) for e in zip(*parity_matrix_T)] + + def reduce_columns(columns: List[int]) -> List[int]: + reduced_cols = [] + for col in columns: + if len([row for row in parity_matrix if row[col]==1])==1: + qubit = max(range(len(parity_matrix)), key=lambda q: parity_matrix[q][col]) + circ.add_gate(ZPhase(qubit, zphases[col])) + else: reduced_cols.append(col) + return reduced_cols + + def base_recursion_step(cols: List[int], rows: List[int]) -> None: + if not cols or not rows: return + chosen_row = max(rows, key=lambda row: max([len([col for col in cols if parity_matrix[row][col]==0]),len([col for col in cols if parity_matrix[row][col]==1])])) + cols0 = [col for col in cols if parity_matrix[chosen_row][col]==0] + cols1 = [col for col in cols if parity_matrix[chosen_row][col]==1] + base_recursion_step(cols0, [row for row in rows if row != chosen_row]) + ones_recursion_step(cols1, rows, chosen_row) + + def ones_recursion_step(cols: List[int], rows: List[int], chosen_row: int) -> None: + if not cols: return + if len(rows)==1 and chosen_row in rows: return + other_rows = [row for row in rows if row != chosen_row] + n = max(other_rows, key=lambda row: len([col for col in cols if parity_matrix[row][col]==1])) + if len([col for col in cols if parity_matrix[n][col]==1]) > 0: + place_CNOT(chosen_row, n) + cols = reduce_columns(cols) + else: + place_CNOT(n, chosen_row) + place_CNOT(chosen_row, n) + cols0 = [col for col in cols if parity_matrix[chosen_row][col]==0] + cols1 = [col for col in cols if parity_matrix[chosen_row][col]==1] + base_recursion_step(cols0, other_rows) + ones_recursion_step(cols1, rows, chosen_row) + + def place_CNOT(control: int, target: int) -> None: + circ.add_gate(CNOT(control, target)) + undo_circ.prepend_gate(CNOT(control, target)) + parity_matrix[control] = [sum(x)%2 for x in zip(parity_matrix[control], parity_matrix[target])] + + columns = reduce_columns(list(range(len(parity_matrix[0])))) + base_recursion_step(columns, list(range(n_qubits))) + return circ + undo_circ + + def graph_to_swaps(g: BaseGraph[VT, ET], no_swaps: bool = False) -> Circuit: """Converts a graph containing only normal and Hadamard edges (i.e., no vertices other than inputs and outputs) into a circuit of Hadamard and SWAP gates. If 'no_swaps' is True, only add diff --git a/pyzx/flow.py b/pyzx/flow.py new file mode 100644 index 00000000..ddedb3f2 --- /dev/null +++ b/pyzx/flow.py @@ -0,0 +1,295 @@ +# PyZX - Python library for quantum circuit rewriting +# and optimization using the ZX-calculus +# Copyright (C) 2018 - Aleks Kissinger and John van de Wetering + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""This module contains functions to calculate flows of graph-like ZX-diagrams.""" + +from typing import Dict, Set, Tuple, Optional, List, FrozenSet, Sequence, Union +from math import comb + +from .linalg import Mat2 +from .graph.base import BaseGraph, VertexType, VT, ET + +def gflow(g: BaseGraph[VT, ET]) -> Optional[Tuple[Dict[VT, int], Dict[VT, Set[VT]], int]]: + """Computes the maximally delayed gflow of a diagram in graph-like form. + Based on an algorithm by Perdrix and Mhalla. + See dx.doi.org/10.1007/978-3-540-70575-8_70 + + :param g: A graph-like ZX-diagram. + :return: Returns None if a gflow does not exist. + Otherwise returns A 3-tuple containing an order labelling, the successor function of the gflow, and the maximum depth reached. + """ + order: Dict[VT, int] = {} + gflow: Dict[VT, Set[VT]] = {} + + inputs = set(g.inputs()) + processed = set(g.outputs()) | g.grounds() + vertices = set(g.vertices()) + pattern_inputs = {inp if g.type(inp) != VertexType.BOUNDARY else n for inp in inputs for n in g.neighbors(inp)} + + depth = 1 + order.update({v: 0 for v in processed}) + + while True: + neighbors_not_processed = {v: {w for w in g.neighbors(v) if w not in processed} for v in processed} + processed_prime = list(set(v for v, neighbors in neighbors_not_processed.items() if neighbors).difference(pattern_inputs)) + candidates = [v for v in vertices - processed if any(w in processed_prime for w in g.neighbors(v))] + + zerovec = Mat2([[0] for _ in candidates]) + m = Mat2([[1 if g.connected(v,w) else 0 for v in processed_prime] for w in candidates]) + + for idx, u in enumerate(candidates): + vu = zerovec.copy() + vu.data[idx] = [1] + x = m.solve(vu) + if x: + gflow[u] = {processed_prime[i] for i in range(x.rows()) if x.data[i][0]} + order[u] = depth + + if not order.keys() - processed: + if vertices.difference(processed) == inputs.difference(pattern_inputs): + return order, gflow, depth + else: + processed.update(order.keys()) + depth += 1 + +def cflow(g: BaseGraph[VT, ET], full_path_info: bool = False) -> Union[Optional[Tuple[Dict[VT, int], Dict[VT,VT], int]],Optional[Tuple[Dict[VT,VT], Dict[VT,VT], Dict[VT,int], Dict[Tuple[VT,VT], int]]]]: + """Computes the causal flow of a diagram in graph-like form. + If ``full_path_info`` is False (the default) the flow is calculated based on an algorithm by + Perdrix and Mhalla (see dx.doi.org/10.1007/978-3-540-70575-8_70) in O(kn) for n=|V| and k=|I|=|O|. This will output an order + labelling, a successor function and the maximum depth reached. + + If ``full_path_info`` is set to True, then the flow is calculated based + on an extended version of the algorithm by Niel de Beaudrap (see https://doi.org/10.48550/arXiv.quant-ph/0603072) in O(k^2n). + This will output an order labelling, a successor function, a path labelling and a supremum function. This characterises the full + chain decomposition of the Dipaths. + + If the diagram has phase gadgets ``full_path_info`` is required to be True in order for causal flow to be calculated and checked. + + :param g: A graph-like ZX-diagram. + :param full_path_info: Whether to calculate the full chain decomposition of the flow. + :return: Returns None if a causal flow does not exist. + If ``full_path_info`` is False returns a 3-tuple containing an order labelling, the successor function of the flow, and the maximum depth reached. + If ``full_path_info`` is True returns a 4-tuple containing an order labelling, a successor function, a path labelling and a supremum function. + """ + if full_path_info: + return full_cflow(g) + + inputs = set(g.inputs()) + processed = set(g.outputs()) + vertices = set(g.vertices()) + num_vertices = len(vertices) + non_inputs = vertices - inputs + correctors = processed - inputs + + order: Dict[VT, int] = {v:0 for v in processed} + flow: Dict[VT, VT] = {} + + neighbor_sets = {v: set(g.neighbors(v)) for v in vertices} + + depth = 1 + while True: + out_prime = set() + c_prime = set() + + for v in correctors: + ns = neighbor_sets[v] - processed + if len(ns) == 1: + u = ns.pop() + if v != u: + flow[u] = v + order[v] = depth + out_prime.add(u) + c_prime.add(v) + + if not out_prime: + if len(processed) == num_vertices: + return order, flow, depth + return None + + processed.update(out_prime) + correctors.difference_update(c_prime) + correctors.update(out_prime & non_inputs) + depth += 1 + +def full_cflow(g: BaseGraph[VT, ET]) -> Optional[Tuple[Dict[VT,VT], Dict[VT,VT], Dict[VT,int], Dict[Tuple[VT,VT],int]]]: + """Calculates the full chain decomposition for causal flow as per https://doi.org/10.48550/arXiv.quant-ph/0603072. + This has been extended to check for phase gadgets in an extentsion to the definition of causal flow which allows self loops on gadgets.""" + + gadgets = {} + gadget_connections = {} + phases = g.phases() + + inputs = g.inputs() + outputs = g.outputs() + + for v in g.vertices(): + if v in inputs or v in outputs or g.vertex_degree(v) != 1: continue + + n = next(iter(g.neighbors(v))) + + if g.type(v) != VertexType.Z or g.type(n) != VertexType.Z: continue + if phases[n] not in (0,1): continue + if n in gadgets or n in inputs or n in outputs: continue + + gadgets[n] = v + gadget_connections[n] = frozenset(set(g.neighbors(n)) - {v}) + + g_without_gadgets = g.clone() + g_without_gadgets.remove_vertices(set(gadgets.keys()).union(set(gadgets.values()))) + + for v in inputs: + if v in outputs: + g_without_gadgets.remove_vertex(v) + + if not g_without_gadgets.vertices(): return None + + num_inputs = g_without_gadgets.num_inputs() + num_vertices = g_without_gadgets.num_vertices() + if g_without_gadgets.num_edges() > (num_inputs * num_vertices - comb(num_inputs+1, 2)): return None # Prerequisite for causal flow + + path_cover = build_path_cover(g_without_gadgets) + if not path_cover: return None + + successor_function, P, L = get_chain_decomp(g_without_gadgets, path_cover) + sup = compute_suprema(g_without_gadgets, successor_function, P, L) + if not sup: return None + + for n in gadgets.keys(): + connecting = gadget_connections[n] + for m in gadgets.keys(): + connecting_m = gadget_connections[m] + first = None + for v_n in connecting: + for v_m in connecting_m: + if v_n == v_m: continue + if v_n not in P.keys() or v_m not in P.keys(): return None # gadgets are connected + if n == m and P[v_n] == P[v_m]: return None + if v_n in g.inputs() or v_m in g.inputs(): continue + if sup[(P[path_cover.prev(v_m)], v_n)] <= L[path_cover.prev(v_m)]: #v_n < F.prev(v_m) + if first == 'm': return None + first = 'n' + if sup[(P[path_cover.prev(v_n)], v_m)] <= L[path_cover.prev(v_n)]: #v_m < F.prev(v_n) + if first == 'n': return None + first = 'm' + return successor_function, P, L, sup + +class Dipaths: + """Class for handling dipaths, used for calculating causal flow""" + def __init__(self, vertices: Sequence[VT]) -> None: + self.vertices: Dict[VT, bool] = {v: False for v in vertices} + self.arcs: Dict[VT, List[List[VT]]] = {v: [[],[]] for v in vertices} + def prev(self, v): + return next(iter(self.arcs[v][0]), []) + def next(self, v): + return next(iter(self.arcs[v][1]), []) + def add_arc(self, v, w): + self.arcs[v][1].append(w) + self.arcs[w][0].append(v) + self.vertices[v] = True + self.vertices[w] = True + def del_arc(self, v, w): + self.arcs[v][1].remove(w) + if not self.arcs[v][0]: self.vertices[v] = False + self.arcs[w][0].remove(v) + if not self.arcs[w][1]: self.vertices[w] = False + +def build_path_cover(g: BaseGraph[VT, ET]) -> Optional[Dipaths]: + """Tries to build a path cover for g""" + F = Dipaths(g.vertices()) # Collection of vertex disjoint Dipaths in G + visited = {v: 0 for v in g.vertices()} + i = 0 + for inp in g.inputs(): + i += 1 + F, visited, success = augment_search(g, F, i, visited, inp) + if not success: return None + if len([v for v in g.vertices() if not F.vertices[v]]) == 0: return F + else: return None + +def augment_search(g: BaseGraph[VT, ET], F: Dipaths, iter: int, visited: Dict[VT,int], v: VT) -> Tuple[Dipaths, Dict[VT, int], bool]: + """Searches for an output vertex along pre-alternating walks for F starting at v, subject to limitations on the end-points of the search paths""" + visited[v] = iter + if v in g.outputs(): return(F, visited, True) + if F.vertices[v] and v not in g.inputs() and visited[F.prev(v)] < iter: + F, visited, success = augment_search(g, F, iter, visited, F.prev(v)) + if success: + F.del_arc(F.prev(v),v) + return F, visited, True + for w in g.neighbors(v): + if visited[w] < iter and w not in g.inputs() and F.next(v) != w: + if not F.vertices[w]: + F, visited, success = augment_search(g, F, iter, visited, w) + if success: + F.add_arc(v,w) + return F, visited, True + elif visited[F.prev(w)] < iter: + F, visited, success = augment_search(g, F, iter, visited, F.prev(w)) + if success: + F.del_arc(F.prev(w),w) + F.add_arc(v,w) + return F, visited, True + return F, visited, False + +def get_chain_decomp(g: BaseGraph[VT, ET], C: Dipaths) -> Tuple[Dict[VT,VT], Dict[VT,VT], Dict[VT,int]]: + """Obtain the successor function f of the path cover C, and obtain functions describing the chain decomposition of the influencing digraph""" + P: Dict[VT, VT] = {} + L: Dict[VT, int] = {v:0 for v in g.vertices()} + f: Dict[VT, VT] = {} + for inp in g.inputs(): + l = 0 + v = inp + while v not in g.outputs(): + try: f[v] = C.next(v) + except: raise Exception(f'Vertex: {v}') + P[v] = inp + L[v] = l + if C.next(v)==None: print(v) + v = C.next(v) + l += 1 + P[v] = inp + L[v] = l + return f, P, L + +def compute_suprema(g: BaseGraph[VT, ET], f: Dict[VT,VT], P: Dict[VT,VT], L: Dict[VT,int]) -> Optional[Dict[Tuple[VT, VT], int]]: + """Compute the natural pre-order for successor function f in the form of a supremum function and functions characterising C""" + sup, status = init_status(g,P,L) + for v in [v for v in g.vertices() if v not in g.outputs()]: + if not status[v]: sup, status = traverse_infl_walk(g,f,sup,status,v) + if status[v] == 'pending': return None + return sup + +def init_status(g: BaseGraph[VT, ET], P: Dict[VT,VT], L: Dict[VT,int]) -> Tuple[Dict[Tuple[VT, VT], int],Dict[VT, Optional[Union[bool, str]]]]: + """Initialise the supremum function, and the status of each vertex""" + sup: Dict[Tuple[VT,VT],int] = {} + status: Dict[VT,Optional[Union[bool,str]]] = {v:None for v in g.vertices()} + for v in g.vertices(): + for inp in g.inputs(): + if inp == P[v]: sup[(inp,v)] = L[v] + else: sup[(inp,v)]=g.num_vertices() + if v in g.outputs(): status[v]=True + return sup, status + +def traverse_infl_walk(g: BaseGraph[VT, ET], f: Dict[VT,VT], sup: Dict[Tuple[VT, VT], int], status: Dict[VT, Optional[Union[bool, str]]], v: VT) -> Tuple[Dict[Tuple[VT, VT], int], Dict[VT, Optional[Union[bool, str]]]]: + """Compute the suprema of v and all of it's descedants, by traversing influencing walks from v""" + status[v] = 'pending' + for w in list(g.neighbors(f[v]))+[f[v]]: + if w != v: + if not status[w]: sup, status = traverse_infl_walk(g,f,sup,status,w) + if status[w] == 'pending': return sup, status + else: + for inp in g.inputs(): + if sup[(inp,v)] > sup[(inp,w)]: sup[(inp,v)] = sup[(inp,w)] + status[v] = True + return sup, status \ No newline at end of file diff --git a/pyzx/gflow.py b/pyzx/gflow.py deleted file mode 100644 index d8956c54..00000000 --- a/pyzx/gflow.py +++ /dev/null @@ -1,117 +0,0 @@ -# PyZX - Python library for quantum circuit rewriting -# and optimization using the ZX-calculus -# Copyright (C) 2018 - Aleks Kissinger and John van de Wetering - -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at - -# http://www.apache.org/licenses/LICENSE-2.0 - -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -""" - Based on algorithm by Perdrix and Mhalla. Here is the pseudocode from -dx.doi.org/10.1007/978-3-540-70575-8_70 - -``` -input : An open graph -output: A generalised flow - -gFlow (V,Gamma,In,Out) = -begin - for all v in Out do - l(v) := 0 - end - return gFlowaux (V,Gamma,In,Out,1) -end - -gFlowaux (V,Gamma,In,Out,k) = -begin - C := {} - for all u in V \ Out do - Solve in F2 : Gamma[V \ Out, Out \ In] * I[X] = I[{u}] - if there is a solution X0 then - C := C union {u} - g(u) := X0 - l(u) := k - end - end - if C = {} then - return (Out = V,(g,l)) - else - return gFlowaux (V, Gamma, In, Out union C, k + 1) - end -end -``` -""" - -from typing import Dict, Set, Tuple, Optional - -from .extract import bi_adj -from .linalg import Mat2 -from .graph.base import BaseGraph, VertexType, VT, ET - - -def gflow( - g: BaseGraph[VT, ET] -) -> Optional[Tuple[Dict[VT, int], Dict[VT, Set[VT]], int]]: - """Compute the maximally delayed gflow of a diagram in graph-like form. - - Based on algorithm by Perdrix and Mhalla. - See dx.doi.org/10.1007/978-3-540-70575-8_70 - """ - l: Dict[VT, int] = {} - gflow: Dict[VT, Set[VT]] = {} - - inputs: Set[VT] = set(g.inputs()) - processed: Set[VT] = set(g.outputs()) | g.grounds() - vertices: Set[VT] = set(g.vertices()) - pattern_inputs: Set[VT] = set() - for inp in inputs: - if g.type(inp) == VertexType.BOUNDARY: - pattern_inputs |= set(g.neighbors(inp)) - else: - pattern_inputs.add(inp) - k: int = 1 - - for v in processed: - l[v] = 0 - - while True: - correct = set() - # unprocessed = list() - processed_prime = [ - v - for v in processed.difference(pattern_inputs) - if any(w not in processed for w in g.neighbors(v)) - ] - candidates = [ - v - for v in vertices.difference(processed) - if any(w in processed_prime for w in g.neighbors(v)) - ] - - zerovec = Mat2([[0] for i in range(len(candidates))]) - # print(unprocessed, processed_prime, zerovec) - m = bi_adj(g, processed_prime, candidates) - for u in candidates: - vu = zerovec.copy() - vu.data[candidates.index(u)] = [1] - x = m.solve(vu) - if x: - correct.add(u) - gflow[u] = {processed_prime[i] for i in range(x.rows()) if x.data[i][0]} - l[u] = k - - if not correct: - if vertices.difference(processed) == inputs.difference(pattern_inputs): - return l, gflow, k - return None - else: - processed.update(correct) - k += 1 diff --git a/pyzx/graph/base.py b/pyzx/graph/base.py index ee80e403..f05b2fdf 100644 --- a/pyzx/graph/base.py +++ b/pyzx/graph/base.py @@ -23,6 +23,7 @@ from typing_extensions import Literal, GenericMeta # type: ignore # https://github.com/python/mypy/issues/5753 import numpy as np +import random from ..utils import EdgeType, VertexType, get_z_box_label, set_z_box_label, toggle_edge, vertex_is_z_like, vertex_is_zx, toggle_vertex, vertex_is_w, get_w_partner, vertex_is_zx_like from ..utils import FloatInt, FractionLike @@ -65,7 +66,7 @@ def pack_indices(lst: List[FloatInt]) -> Mapping[FloatInt,int]: return d VT = TypeVar('VT', bound=int) # The type that is used for representing vertices (e.g. an integer) -ET = TypeVar('ET') # The type used for representing edges (e.g. a pair of integers) +ET = TypeVar('ET', bound=Tuple[int,int]) # The type used for representing edges (e.g. a pair of integers) class BaseGraph(Generic[VT, ET], metaclass=DocstringMeta): """Base class for letting graph backends interact with PyZX. @@ -77,18 +78,21 @@ class BaseGraph(Generic[VT, ET], metaclass=DocstringMeta): def __init__(self) -> None: self.scalar: Scalar = Scalar() - # self.inputs: List[VT] = [] - # self.outputs: List[VT] = [] - #Data necessary for phase tracking for phase teleportation - self.track_phases: bool = False - self.phase_index : Dict[VT,int] = dict() # {vertex:index tracking its phase for phase teleportation} - self.phase_master: Optional['simplify.Simplifier'] = None - self.phase_mult: Dict[int,Literal[1,-1]] = dict() - self.max_phase_index: int = -1 - self._vdata: Dict[VT,Dict[str,Any]] = dict() + + # Tracker for phase teleportation and simplifications + self.phase_tracking: bool = False + self.phase_teleporter: Optional['simplify.PhaseTeleporter'] = None + self.parent_vertex: Dict[VT, VT] = {} + self.vertex_groups: Dict[VT, int] = {} + self.group_data: Dict[int, Set[VT]] = {} + self.phase_sum: Dict[int, FractionLike] = {} + self.phase_mult: Dict[VT, int] = {} + self.vertex_rank: Dict[VT, int] = {} + self.vertices_to_update: List[VT] = [] # merge_vdata(v0,v1) is an optional, custom function for merging # vdata of v1 into v0 during spider fusion etc. + self._vdata: Dict[VT,Dict[str,Any]] = dict() self.merge_vdata: Optional[Callable[[VT,VT], None]] = None self.variable_types: Dict[str,bool] = dict() # mapping of variable names to their type (bool or continuous) @@ -136,13 +140,11 @@ def copy(self, adjoint:bool=False, backend:Optional[str]=None) -> 'BaseGraph': if (backend is None): backend = type(self).backend g = Graph(backend = backend) - g.track_phases = self.track_phases g.scalar = self.scalar.copy() g.merge_vdata = self.merge_vdata mult:int = 1 if adjoint: mult = -1 - #g.add_vertices(self.num_vertices()) ty = self.types() ph = self.phases() qs = self.qubits() @@ -182,14 +184,10 @@ def adjoint(self) -> 'BaseGraph': def clone(self) -> 'BaseGraph': """ - This method should return an identical copy of the graph, without any relabeling - - FIXME: this currently *does* change lables. - - Used in lookahead extraction. + Returns an identical copy of the graph, without any relabeling """ - return self.copy() - + raise NotImplementedError("Not implemented on backend " + type(self).backend) + def map_qubits(self, qubit_map:Mapping[int,Tuple[float,float]]) -> None: for v in self.vertices(): q = self.qubit(v) @@ -671,10 +669,6 @@ def add_vertex(self, self.set_phase(v, phase) if ground: self.set_ground(v, True) - if self.track_phases: - self.max_phase_index += 1 - self.phase_index[v] = self.max_phase_index - self.phase_mult[self.max_phase_index] = 1 return v def add_vertex_indexed(self,v:VT) -> None: @@ -825,38 +819,241 @@ def add_edge_smart(self, e: ET, edgetype: EdgeType.Type): """Like add_edge, but does the right thing if there is an existing edge.""" self.add_edge_table({e : [1,0] if edgetype == EdgeType.SIMPLE else [0,1]}) - def set_phase_master(self, m: 'simplify.Simplifier') -> None: - """Points towards an instance of the class :class:`~pyzx.simplify.Simplifier`. - Used for phase teleportation.""" - self.phase_master = m - - def update_phase_index(self, old:VT, new:VT) -> None: - """When a phase is moved from a vertex to another vertex, - we need to tell the phase_teleportation algorithm that this has happened. - This function does that. Used in some of the rules in `simplify`.""" - if not self.track_phases: return - i = self.phase_index[old] - self.phase_index[old] = self.phase_index[new] - self.phase_index[new] = i - - def fuse_phases(self, p1: VT, p2: VT) -> None: - if p1 not in self.phase_index or p2 not in self.phase_index: + def set_phase_teleporter(self, teleporter: 'simplify.PhaseTeleporter', fusing_mode: bool = True) -> None: + """Used for phase teleportation. + If ``fusing_mode`` is True then phases will be tracked as the graph is simplified. + Otherwise info about previously teleported phases from ``teleporter`` is stored, but not placed on the graph yet. + They will then be placed throughout simplification when required, or through the function :func:`place_tracked_phases` + + :param teleporter: Instance of the class :class:`~pyzx.simplify.PhaseTeleporter` + :param fusing_mode: Defaults to True + """ + self.phase_tracking = True + + if fusing_mode: + self.phase_teleporter = teleporter return - if self.phase_master is not None: - self.phase_master.fuse_phases(self.phase_index[p1],self.phase_index[p2]) - self.phase_index[p2] = self.phase_index[p1] + + for group_num, group in enumerate(teleporter.get_vertex_groups()): + if len(group) == 1: continue + self.group_data[group_num] = set(group) # Groups of vertices fused throughout teleportation + phase_sum = Fraction(0) + for v in group: + self.vertex_rank[v] = teleporter.vertex_rank[v] + self.vertex_groups[v] = group_num + mult = teleporter.phase_mult[v] + self.phase_mult[v] = mult # Associated teleportation phase multiplier + phase_sum += self.phase(v) * mult + self.set_phase(v, 0) # Set all stored phases to zero for now + self.phase_sum[group_num] = phase_sum # Phase sum for each group + + def remove_vertex_from_group(self, v: VT, group: int) -> None: + """Used for post phase teleportation simplifications. + Removes ``v`` from ``group`` then updates group when required. + + :param v: + :param group: + """ + del self.vertex_groups[v] + del self.phase_mult[v] + + group_data = self.group_data[group] + group_data.remove(v) + group_len = len(group_data) + + if group_len == 1: + u = next(iter(group_data)) + phase = self.phase_sum[group] * self.phase_mult[u] + child_u = self.leaf_vertex(u) + + self.add_to_phase(child_u, phase) + + del self.vertex_groups[u] + del self.phase_mult[u] + del self.phase_sum[group] + del self.group_data[group] + self.vertices_to_update.append(child_u) + + if not self.group_data: self.phase_tracking = False # Turn off phase tracking + + elif group_len == 2: + self.vertices_to_update.extend(self.leaf_vertex(u) for u in group_data) # Some pivots may need to be rechecked + + def place_tracked_phases(self, allow_jumping=False) -> None: + """Used for phase teleportation. + Places any stored phases onto the graph. + ``allow_jumping`` defines whether any additional phases are permitted to teleport around during simplification. + """ + for group, vertices in list(self.group_data.items()): + v = max(vertices, key = self.vertex_rank.__getitem__) + phase = self.phase_sum[group] * self.phase_mult[v] + child_v = self.leaf_vertex(v) + if not allow_jumping: + self.add_to_phase(child_v, phase) + continue + current_phase = self.phase(child_v) + self.fix_phase(child_v, current_phase, current_phase + phase) + + if allow_jumping: return + self.vertex_groups.clear() + self.group_data.clear() + self.phase_sum.clear() + self.phase_mult.clear() + self.phase_tracking = False + + def root_vertex(self, v: VT) -> VT: + """Used for phase teleportation. + Returns the root vertex from the original graph. + + :param v: + :return: Either the vertex itself or the vertex from the original graph which it points to. + """ + while v in self.parent_vertex: v = self.parent_vertex[v] + return v + + def leaf_vertex(self, v: VT) -> VT: + """Used for phase teleportation. + Returns the child vertex of a vertex in the current graph. - def phase_negate(self, v: VT) -> None: - if v not in self.phase_index: return - index = self.phase_index[v] - mult = self.phase_mult[index] - if mult == 1: self.phase_mult[index] = -1 - else: self.phase_mult[index] = 1 - #self.phase_mult[index] = -1*mult + :param v: + :return: Either the vertex itself or the vertex in the current graph which points to it. + """ + for child, parent in self.parent_vertex.items(): + if parent == v: return self.leaf_vertex(child) + return v + + def fuse_phases(self, v1: VT, v2: VT) -> None: + """Used for phase teleportation. + Tracks the fusing of vertex ``v2`` into ``v1``. - def vertex_from_phase_index(self, i: int) -> VT: - return list(self.phase_index.keys())[list(self.phase_index.values()).index(i)] + :param v1: Surviving vertex + :param v2: Vertex to be deleted + """ + root_v1 = self.root_vertex(v1) + root_v2 = self.root_vertex(v2) + + if self.phase_teleporter: # Fusing mode + if root_v2 in self.phase_teleporter.non_clifford_vertices: + if root_v1 in self.phase_teleporter.non_clifford_vertices: + self.phase_teleporter.fuse_phases(root_v1,root_v2) + else: self.parent_vertex[v1] = v2 # v1 now points to v2 (a non-Clifford vertex) + return + + group_1 = self.vertex_groups.get(root_v1) + group_2 = self.vertex_groups.get(root_v2) + if group_2 is not None: + if group_1 is not None: + if group_1 == group_2: self.remove_vertex_from_group(root_v2, group_2) + # The below handling of the case when group_1 != group_2 is not optimal + elif len(self.group_data[group_1]) <= len(self.group_data[group_2]): + print('group_1 != group_2') + self.remove_vertex_from_group(root_v2, group_2) + else: + print('group_1 != group_2') + self.remove_vertex_from_group(root_v1, group_1) + rem_v = v1 + while rem_v in self.parent_vertex: + parent = self.parent_vertex[rem_v] + del self.parent_vertex[rem_v] + rem_v = parent + self.parent_vertex[v1] = v2 + else: + self.parent_vertex[v1] = v2 # v1 now points to v2 (a phase variable) + + def unfuse_vertex(self, new_vertex: VT, old_vertex: VT) -> None: + """Used for phase teleportation. + Tracks the unfusing of ``old_vertex`` onto ``new_vertex``. + + :param new_vertex: + :param old_vertex: + """ + root_old_vertex = self.root_vertex(old_vertex) + if root_old_vertex in (self.phase_teleporter.non_clifford_vertices if self.phase_teleporter else self.vertex_groups): + self.parent_vertex[new_vertex] = old_vertex + + def phase_negate(self, v: VT) -> None: + """Used for phase teleportation. + Tracks when the sign of a phase has been negated (usually as a gadget). + :param v: Vertex whose sign has been negated + """ + root_v = self.root_vertex(v) + + if self.phase_teleporter: # Fusing mode + if root_v in self.phase_teleporter.non_clifford_vertices: + self.phase_teleporter.phase_negate(root_v) + return + + if root_v in self.vertex_groups: + self.phase_mult[root_v] *= -1 + + def fix_phase(self, v: VT, current_phase: FractionLike, target_phase: FractionLike) -> None: + """Used for post phase teleportation simplifications. + Sets the phase of ``v`` to ``target_phase``, updating the rest of the vertex_group where necessary + + :param v: + :param current_phase: + :param target_phase: + """ + root_v = self.root_vertex(v) + + if root_v not in self.vertex_groups: + assert current_phase == target_phase # In this case the current phase should be the target phase + return + + group = self.vertex_groups[root_v] + self.phase_sum[group] -= self.phase_mult[root_v] * (target_phase - current_phase) + self.set_phase(v, target_phase) + self.remove_vertex_from_group(root_v, group) + + def check_phase(self, v: VT, current_phase: FractionLike, target_phase: FractionLike) -> bool: + """Used for post phase teleportation simplifications. + Returns a boolean representing whether ``v`` can be fixed to have a phase of ``target_phase``. + + :param v: + :param current_phase: The current phase of ``v`` in the graph + :param target_phase: + :return: + """ + root_v = self.root_vertex(v) + if root_v not in self.vertex_groups: return current_phase == target_phase + return True + + def check_two_pauli_phases(self, v1: VT, v1p: FractionLike, v2: VT, v2p: FractionLike) -> Optional[List[Optional[FractionLike]]]: + """Used for post phase teleportation simplifications. + Checks whether both ``v1`` and ``v2`` can have their phases fixed to a Pauli phase (i.e. for pivoting) + + :param v1: + :param v1p: The current phase of ``v1`` in the graph + :param v2: + :param v2p: The current phase of ``v2`` in the graph + :return: List of the two Pauli phases which the vertices can be fixed to. + If either cannot be fixed then the value of that list element is None. + If either `but only one` vertex can be fixed to Pauli then returns None. + """ + PAULI = {0,1} + + root_v1 = self.root_vertex(v1) + root_v2 = self.root_vertex(v2) + group_1 = self.vertex_groups.get(root_v1) + group_2 = self.vertex_groups.get(root_v2) + + if not group_1 and not group_2: return [v1p if v1p in PAULI else None, v2p if v2p in PAULI else None] + if not group_1: return [v1p if v1p in PAULI else None, 0] + if not group_2: return [0, v2p if v2p in PAULI else None] + + if group_1 == group_2: + if len(self.group_data[group_1]) > 2: return [0,0] # Can place phase on another vertex in group + else: # Calculate the resultant phase v2 would have if v1 was fixed to 0 + new_phase_v2 = v2p + self.phase_mult[root_v2] * (self.phase_sum[group_1] + self.phase_mult[root_v1] * v1p) + if new_phase_v2 in PAULI: return [0, new_phase_v2] + else: return None # Will get identical result if v2 was fixed to 0 and the resultant phase of v1 was calculated + + return [0,0] + + def replace(self, g2) -> None: + """Replaces the metadata in the current graph object with the metadata of ``g2``""" + raise NotImplementedError("Not implemented on backend " + type(self).backend) def remove_vertices(self, vertices: Iterable[VT]) -> None: """Removes the list of vertices from the graph.""" diff --git a/pyzx/graph/graph_s.py b/pyzx/graph/graph_s.py index 3c7477cb..e04093c9 100644 --- a/pyzx/graph/graph_s.py +++ b/pyzx/graph/graph_s.py @@ -60,14 +60,44 @@ def clone(self) -> 'GraphS': cpy.scalar = self.scalar.copy() cpy._inputs = tuple(list(self._inputs)) cpy._outputs = tuple(list(self._outputs)) - cpy.track_phases = self.track_phases - cpy.phase_index = self.phase_index.copy() - cpy.phase_master = self.phase_master + cpy.phase_teleporter = self.phase_teleporter + cpy.phase_tracking = self.phase_tracking + cpy.parent_vertex = self.parent_vertex.copy() + cpy.vertex_groups = self.vertex_groups.copy() + cpy.group_data = {group: set(vertices) for group, vertices in self.group_data.items()} + cpy.phase_sum = self.phase_sum.copy() cpy.phase_mult = self.phase_mult.copy() - cpy.max_phase_index = self.max_phase_index + cpy.vertex_rank = self.vertex_rank.copy() + cpy.vertices_to_update = self.vertices_to_update.copy() return cpy - - def vindex(self): return self._vindex + + def replace(self, g: 'GraphS') -> None: + self.graph = g.graph.copy() + self._vindex = g._vindex + self.nedges = g.nedges + self.ty = g.ty.copy() + self._phase = g._phase.copy() + self._qindex = g._qindex.copy() + self._maxq = g._maxq + self._rindex = g._rindex.copy() + self._maxr = g._maxr + self._vdata = g._vdata.copy() + self.scalar = g.scalar.copy() + self._inputs = tuple(list(g._inputs)) + self._outputs = tuple(list(g._outputs)) + self.phase_teleporter = g.phase_teleporter + self.phase_tracking = g.phase_tracking + self.parent_vertex = g.parent_vertex.copy() + self.vertex_groups = g.vertex_groups.copy() + self.group_data = {group: set(vertices) for group, vertices in g.group_data.items()} + self.phase_sum = g.phase_sum.copy() + self.phase_mult = g.phase_mult.copy() + self.vertex_rank = g.vertex_rank.copy() + self.vertices_to_update = g.vertices_to_update.copy() + + def vindex(self): + return self._vindex + def depth(self): if self._rindex: self._maxr = max(self._rindex.values()) else: self._maxr = -1 diff --git a/pyzx/heuristics.py b/pyzx/heuristics.py new file mode 100644 index 00000000..575bc27e --- /dev/null +++ b/pyzx/heuristics.py @@ -0,0 +1,125 @@ +# PyZX - Python library for quantum circuit rewriting +# and optimization using the ZX-calculus +# Copyright (C) 2018 - Aleks Kissinger and John van de Wetering + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""This module contains heuristics and helper functions for some of the rewrite rules in the rules_ module.""" + +from typing import TYPE_CHECKING, List, Callable, Optional, Union, Generic, Tuple, Dict, Iterator, Any +from typing_extensions import Literal + +from .utils import EdgeType, VertexType, toggle_edge, vertex_is_zx, toggle_vertex +from .graph.base import BaseGraph, VT, ET +from .rules import MatchIdFuseType, MatchLcompUnfuseType, MatchPivotUnfuseType + +def pivot_statistics(g: BaseGraph[VT,ET], v0: VT, v1: VT, neighbours_to_unfuse: Tuple[Tuple[VT,...],...] = ((),())) -> Tuple[int,int]: + """Returns the number of edges and vertices which would be removed under a pivot. + + :param g: The graph on which the pivot would be performed. + :param v0: The first vertex of the pivot. + :param v1: The second vertex of the pivot. + :param neighbours_to_unfuse: 2-tuple containing the neighbours to unfuse onto for the respecive vertices, defaults to ((),()) + :return: 2-tuple containing the number of edges removed and number of vertices removed. + """ + unfuse0, unfuse1 = set(neighbours_to_unfuse[0]), set(neighbours_to_unfuse[1]) + + v0n = set(g.neighbors(v0)) - {v1} - unfuse0 + v1n = set(g.neighbors(v1)) - {v0} - unfuse1 + + shared_n = v0n & v1n + num_shared_n = len(shared_n) + + v0n -= shared_n + v1n -= shared_n + + num_v0n = len(v0n) + bool(unfuse0) + num_v1n = len(v1n) + bool(unfuse1) + + max_new_connections = num_v0n * num_v1n + num_v0n * num_shared_n + num_v1n * num_shared_n + + num_edges_between_neighbours = sum(1 for v in v0n for n in g.neighbors(v) if n in v1n or n in shared_n) + num_edges_between_neighbours += sum(1 for v in v1n for n in g.neighbors(v) if n in shared_n) + + num_unfusions = bool(unfuse0) + bool(unfuse1) + + edges_removed = 2*num_edges_between_neighbours - max_new_connections + num_v0n + 2*num_shared_n + num_v1n + 1 - 2*num_unfusions + vertices_removed = 2 - (2*num_unfusions) + return edges_removed, vertices_removed + +def lcomp_statistics(g: BaseGraph[VT,ET], v: VT, vn: Tuple[VT,...], neighbours_to_unfuse: Tuple[VT,...]) -> Tuple[int,int]: + """Returns the number of edges and vertices which would be removed under a local complementation. + + :param g: The graph on which the local complementation would be performed. + :param v: The vertex of the local complementation. + :param vn: The neighbours of the vertex ``v``. + :param neighbours_to_unfuse: The neighbours to unfuse from the vertex. + :return: 2-tuple containing the number of edges removed and number of vertices removed. + """ + unfuse = set(neighbours_to_unfuse) + vns = set(vn) - unfuse + num_vns = len(vns) + bool(unfuse) + + max_new_connections = (num_vns * (num_vns-1)) // 2 + num_edges_between_neighbours = sum(1 for v1 in vns for v2 in vns if v1 < v2 and g.connected(v1, v2)) + num_unfusions = bool(unfuse) + + edges_removed = 2*num_edges_between_neighbours - max_new_connections + num_vns - (2*num_unfusions) + vertices_removed = 1 - (2*num_unfusions) + return edges_removed, vertices_removed + +def id_fuse_statistics(g: BaseGraph[VT,ET], v: VT, v0: VT, v1: VT) -> Tuple[int,int]: + """Returns the number of edges and vertices which would be removed under an identity fusion. + + :param g: The graph on which identity fusion would be performed. + :param v: The central identity fusion. + :param v0: The first vertex of the fusion. + :param v1: The second vertex of the fusion. + :return: 2-tuple containing the number of edges removed and number of vertices removed. + """ + v0n = set(g.neighbors(v0)) - {v} + v1n = set(g.neighbors(v1)) - {v} + shared_n = v0n & v1n + + same_edge_type_removed = sum(1 for n in shared_n if g.edge_type(g.edge(n,v0)) == g.edge_type(g.edge(n,v1))) + extra_vertices_removed = sum(1 for n in shared_n if g.edge_type(g.edge(n,v0)) == g.edge_type(g.edge(n,v1)) and len(g.neighbors(n)) == 2) + + edges_removed = 2 + same_edge_type_removed + len(shared_n) + if g.connected(v0,v1): edges_removed += 1 + + vertices_removed = 2 + extra_vertices_removed + + return edges_removed, vertices_removed + +def lcomp_2Q_simp_heuristic(g: BaseGraph[VT,ET], match: MatchLcompUnfuseType, weight: float) -> Optional[float]: + """Returns the score heuristic for a local complementation match""" + edges_removed, vertices_removed = lcomp_statistics(g, match[0], match[1], match[2]) + twoQ_removed = edges_removed - vertices_removed + if twoQ_removed > 0: return weight*twoQ_removed + if twoQ_removed == 0 and vertices_removed > 0: return weight*twoQ_removed + return None + +def pivot_2Q_simp_heuristic(g: BaseGraph[VT,ET], match: MatchPivotUnfuseType, weight: float) -> Optional[float]: + """Returns the score heuristic for a pivot match""" + edges_removed, vertices_removed = pivot_statistics(g, match[0], match[1], match[2]) + twoQ_removed = edges_removed - vertices_removed + if twoQ_removed > 0: return weight*twoQ_removed + if twoQ_removed == 0 and vertices_removed > 0: return weight*twoQ_removed + return None + +def id_fuse_2Q_reduce_heuristic(g: BaseGraph[VT,ET], match: MatchIdFuseType, weight: float) -> float: + """Returns the score heuristic for a identity fusion match""" + edges_removed, vertices_removed = id_fuse_statistics(g, match[0], match[1], match[2]) + twoQ_removed = edges_removed - vertices_removed + assert(twoQ_removed >= 0) + return weight*twoQ_removed \ No newline at end of file diff --git a/pyzx/rules.py b/pyzx/rules.py index 6d6b600f..4d63df45 100644 --- a/pyzx/rules.py +++ b/pyzx/rules.py @@ -68,6 +68,7 @@ def apply_rule( m: List[MatchObject], check_isolated_vertices:bool=True ) -> None: + """Applies a given match of a rule onto a graph""" etab, rem_verts, rem_edges, check_isolated_vertices = rewrite(g, m) g.add_edge_table(etab) g.remove_edges(rem_edges) @@ -81,12 +82,11 @@ def match_bialg(g: BaseGraph[VT,ET]) -> List[MatchBialgType[VT]]: """Does the same as :func:`match_bialg_parallel` but with ``num=1``.""" return match_bialg_parallel(g, num=1) - #TODO: make it be hadamard edge aware def match_bialg_parallel( g: BaseGraph[VT,ET], - matchf:Optional[Callable[[ET],bool]]=None, - num: int=-1 + matchf: Optional[Callable[[ET],bool]] = None, + num: int = -1 ) -> List[MatchBialgType[VT]]: """Finds noninteracting matchings of the bialgebra rule. @@ -128,7 +128,6 @@ def match_bialg_parallel( m.append((v0,v1,v0n,v1n)) return m - def bialg(g: BaseGraph[VT,ET], matches: List[MatchBialgType[VT]]) -> RewriteOutputType[ET,VT]: """Performs a certain type of bialgebra rewrite given matchings supplied by ``match_bialg(_parallel)``.""" @@ -144,6 +143,7 @@ def bialg(g: BaseGraph[VT,ET], matches: List[MatchBialgType[VT]]) -> RewriteOutp return (etab, rem_verts, [], True) + MatchSpiderType = Tuple[VT,VT] def match_spider(g: BaseGraph[VT,ET]) -> List[MatchSpiderType[VT]]: @@ -152,57 +152,59 @@ def match_spider(g: BaseGraph[VT,ET]) -> List[MatchSpiderType[VT]]: def match_spider_parallel( g: BaseGraph[VT,ET], - matchf:Optional[Callable[[ET],bool]]=None, - num:int=-1 + matchf: Optional[Callable[[ET],bool]] = None, + num: int = -1, + allow_interacting_matches: bool = False ) -> List[MatchSpiderType[VT]]: - """Finds non-interacting matchings of the spider fusion rule. - + """Finds matches of the spider fusion rule. + :param g: An instance of a ZX-graph. :param matchf: An optional filtering function for candidate edge, should return True if the edge should be considered for matchings. Passing None will consider all edges. :param num: Maximal amount of matchings to find. If -1 (the default) tries to find as many as possible. + :param allow_interacting_matches: Whether or not to allow matches which overlap, + hence can not all be applied at once. Defaults to False. :rtype: List of 2-tuples ``(v1, v2)`` """ if matchf is not None: candidates = set([e for e in g.edges() if matchf(e)]) else: candidates = g.edge_set() + types = g.types() i = 0 - m = [] + m: List[MatchSpiderType[VT]] = [] while (num == -1 or i < num) and len(candidates) > 0: e = candidates.pop() if g.edge_type(e) != EdgeType.SIMPLE: continue + v0, v1 = g.edge_st(e) - v0t = types[v0] - v1t = types[v1] - if (v0t == v1t and vertex_is_zx(v0t)) or \ - (vertex_is_z_like(v0t) and vertex_is_z_like(v1t)): - i += 1 - for v in g.neighbors(v0): - for c in g.incident_edges(v): candidates.discard(c) - for v in g.neighbors(v1): - for c in g.incident_edges(v): candidates.discard(c) - m.append((v0,v1)) + v0t, v1t = types[v0], types[v1] + if not ((v0t == v1t and vertex_is_zx(v0t)) or \ + (vertex_is_z_like(v0t) and vertex_is_z_like(v1t))): continue + + m.append((v0,v1)) + i += 1 + + if allow_interacting_matches: continue + for n in g.neighbors(v0): + for ne in g.incident_edges(n): candidates.discard(ne) + for n in g.neighbors(v1): + for ne in g.incident_edges(n): candidates.discard(ne) + return m - def spider(g: BaseGraph[VT,ET], matches: List[MatchSpiderType[VT]]) -> RewriteOutputType[ET,VT]: '''Performs spider fusion given a list of matchings from ``match_spider(_parallel)`` ''' rem_verts = [] etab: Dict[ET,List[int]] = dict() - for m in matches: - if g.row(m[0]) == 0: - v0, v1 = m[1], m[0] - else: - v0, v1 = m[0], m[1] - - ground = g.is_ground(v0) or g.is_ground(v1) + for v0, v1 in matches: + if g.row(v0) == 0: v0, v1 = v1, v0 - if ground: + if g.is_ground(v0) or g.is_ground(v1): g.set_phase(v0, 0) g.set_ground(v0) elif g.type(v0) == VertexType.Z_BOX or g.type(v1) == VertexType.Z_BOX: @@ -215,18 +217,16 @@ def spider(g: BaseGraph[VT,ET], matches: List[MatchSpiderType[VT]]) -> RewriteOu else: g.add_to_phase(v0, g.phase(v1)) - if g.track_phases: - g.fuse_phases(v0,v1) + if g.phase_tracking: g.fuse_phases(v0,v1) - # always delete the second vertex in the match - rem_verts.append(v1) + rem_verts.append(v1) # always delete the second vertex in the match - # edges from the second vertex are transferred to the first - for w in g.neighbors(v1): - if v0 == w: continue - e = g.edge(v0,w) + for n in g.neighbors(v1): # edges from the second vertex are transferred to the first + if v0 == n: continue + e = g.edge(v0,n) if e not in etab: etab[e] = [0,0] - etab[e][g.edge_type(g.edge(v1,w))-1] += 1 + etab[e][g.edge_type(g.edge(v1,n))-1] += 1 + return (etab, rem_verts, [], True) def unspider(g: BaseGraph[VT,ET], m: List[Any], qubit:FloatInt=-1, row:FloatInt=-1) -> VT: @@ -366,21 +366,21 @@ def w_fusion(g: BaseGraph[VT,ET], matches: List[MatchSpiderType[VT]]) -> Rewrite return (etab, rem_verts, [], True) -MatchPivotType = Tuple[VT,VT,List[VT],List[VT]] +MatchPivotType = Tuple[VT,VT,Tuple[VT,...],Tuple[VT,...]] def match_pivot(g: BaseGraph[VT,ET]) -> List[MatchPivotType[VT]]: """Does the same as :func:`match_pivot_parallel` but with ``num=1``.""" return match_pivot_parallel(g, num=1, check_edge_types=True) - def match_pivot_parallel( g: BaseGraph[VT,ET], - matchf:Optional[Callable[[ET],bool]]=None, - num:int=-1, - check_edge_types:bool=True + matchf: Optional[Callable[[ET],bool]] = None, + num: int = -1, + check_edge_types: bool = True, + allow_interacting_matches: bool = False ) -> List[MatchPivotType[VT]]: - """Finds non-interacting matchings of the pivot rule. - + """Finds matches of the pivot rule. + :param g: An instance of a ZX-graph. :param num: Maximal amount of matchings to find. If -1 (the default) tries to find as many as possible. @@ -389,184 +389,153 @@ def match_pivot_parallel( :param matchf: An optional filtering function for candidate edge, should return True if a edge should considered as a match. Passing None will consider all edges. + :param allow_interacting_matches: Whether or not to allow matches which overlap, + hence can not all be applied at once. Defaults to False. :rtype: List of 4-tuples. See :func:`pivot` for the details. """ if matchf is not None: candidates = set([e for e in g.edges() if matchf(e)]) else: candidates = g.edge_set() + types = g.types() phases = g.phases() i = 0 - m = [] + m: List[MatchPivotType[VT]] = [] while (num == -1 or i < num) and len(candidates) > 0: e = candidates.pop() if check_edge_types and g.edge_type(e) != EdgeType.HADAMARD: continue + v0, v1 = g.edge_st(e) - if not (types[v0] == VertexType.Z and types[v1] == VertexType.Z): continue - - v0a = phases[v0] - v1a = phases[v1] - if not ((v0a in (0,1)) and (v1a in (0,1))): continue - if g.is_ground(v0) or g.is_ground(v1): - continue - + if any(phases[v] not in (0,1) for v in (v0,v1)): continue + if g.is_ground(v0) or g.is_ground(v1): continue + invalid_edge = False - v0n = list(g.neighbors(v0)) v0b = [] for n in v0n: - et = g.edge_type(g.edge(v0,n)) - if types[n] == VertexType.Z and et == EdgeType.HADAMARD: pass + if types[n] == VertexType.Z and g.edge_type(g.edge(v0,n)) == EdgeType.HADAMARD: pass elif types[n] == VertexType.BOUNDARY: v0b.append(n) else: invalid_edge = True break - if invalid_edge: continue v1n = list(g.neighbors(v1)) v1b = [] for n in v1n: - et = g.edge_type(g.edge(v1,n)) - if types[n] == VertexType.Z and et == EdgeType.HADAMARD: pass + if types[n] == VertexType.Z and g.edge_type(g.edge(v1,n)) == EdgeType.HADAMARD: pass elif types[n] == VertexType.BOUNDARY: v1b.append(n) else: invalid_edge = True break - if invalid_edge: continue if len(v0b) + len(v1b) > 1: continue - + + m.append((v0,v1,tuple(v0b),tuple(v1b))) i += 1 - for v in v0n: - for c in g.incident_edges(v): candidates.discard(c) - for v in v1n: - for c in g.incident_edges(v): candidates.discard(c) - b0 = list(v0b) - b1 = list(v1b) - m.append((v0,v1,b0,b1)) + + if allow_interacting_matches: continue + for n in v0n: + for ne in g.incident_edges(n): candidates.discard(ne) + for n in v1n: + for ne in g.incident_edges(n): candidates.discard(ne) + return m def match_pivot_gadget( - g: BaseGraph[VT,ET], - matchf:Optional[Callable[[ET],bool]]=None, - num:int=-1) -> List[MatchPivotType[VT]]: + g: BaseGraph[VT,ET], + matchf: Optional[Callable[[ET],bool]] = None, + num: int = -1, + allow_interacting_matches: bool = False + ) -> List[MatchPivotType[VT]]: """Like :func:`match_pivot_parallel`, but except for pairings of Pauli vertices, it looks for a pair of an interior Pauli vertex and an interior non-Clifford vertex in order to gadgetize the non-Clifford vertex.""" if matchf is not None: candidates = set([e for e in g.edges() if matchf(e)]) else: candidates = g.edge_set() + types = g.types() phases = g.phases() - rs = g.rows() - - edge_list = [] + i = 0 m: List[MatchPivotType[VT]] = [] while (num == -1 or i < num) and len(candidates) > 0: e = candidates.pop() v0, v1 = g.edge_st(e) - - if not (types[v0] == VertexType.Z and types[v1] == VertexType.Z): continue - - v0a = phases[v0] - v1a = phases[v1] - - if v0a not in (0,1): - if v1a in (0,1): - v0, v1 = v1, v0 - v0a, v1a = v1a, v0a + if not all(types[v] == VertexType.Z for v in (v0,v1)): continue + + if phases[v0] not in (0,1): + if phases[v1] in (0,1): v0, v1 = v1, v0 else: continue - elif v1a in (0,1): continue - # Now v0 has a Pauli phase and v1 has a non-Pauli phase - - if g.is_ground(v0): - continue - + elif phases[v1] in (0,1): continue # Now v0 has a Pauli phase and v1 has a non-Pauli phase + + if g.is_ground(v0): continue + v0n = list(g.neighbors(v0)) v1n = list(g.neighbors(v1)) if len(v1n) == 1: continue # It is a phase gadget + if any(types[n] != VertexType.Z for vn in (v0n,v1n) for n in vn): continue + bad_match = False - discard_edges = [] - for i,l in enumerate((v0n, v1n)): - for n in l: + edges_to_discard = [] + for i, neighbors in enumerate((v0n, v1n)): + for n in neighbors: if types[n] != VertexType.Z: bad_match = True break ne = list(g.incident_edges(n)) - if i==0 and len(ne) == 1 and not (e == ne[0]): # v0 is a phase gadget + if i == 0 and len(ne) == 1 and not (e == ne[0]): # v0 is a phase gadget bad_match = True break - discard_edges.extend(ne) + edges_to_discard.extend(ne) if bad_match: break if bad_match: continue - - if any(types[w]!=VertexType.Z for w in v0n): continue - if any(types[w]!=VertexType.Z for w in v1n): continue - # Both v0 and v1 are interior - - v = g.add_vertex(VertexType.Z,-2,rs[v0],v1a) - g.set_phase(v1, 0) - g.set_qubit(v0,-1) - g.update_phase_index(v1,v) - edge_list.append(g.edge(v,v1)) - - m.append((v0,v1,[],[v])) + + m.append((v0,v1,tuple(),tuple())) i += 1 - for c in discard_edges: candidates.discard(c) - g.add_edges(edge_list,EdgeType.SIMPLE) + + if allow_interacting_matches: continue + for c in edges_to_discard: candidates.discard(c) + return m - def match_pivot_boundary( - g: BaseGraph[VT,ET], - matchf:Optional[Callable[[VT],bool]]=None, - num:int=-1) -> List[MatchPivotType[VT]]: + g: BaseGraph[VT,ET], + matchf: Optional[Callable[[VT],bool]] = None, + num: int=-1, + allow_interacting_matches: bool = False + ) -> List[MatchPivotType[VT]]: """Like :func:`match_pivot_parallel`, but except for pairings of Pauli vertices, it looks for a pair of an interior Pauli vertex and a boundary non-Pauli vertex in order to gadgetize the non-Pauli vertex.""" if matchf is not None: candidates = set([v for v in g.vertices() if matchf(v)]) else: candidates = g.vertex_set() - types = g.types() + phases = g.phases() - rs = g.rows() - - edge_list = [] - consumed_vertices : Set[VT] = set() + types = g.types() + i = 0 + consumed_vertices: Set[VT] = set() m: List[MatchPivotType[VT]] = [] - inputs = g.inputs() while (num == -1 or i < num) and len(candidates) > 0: v = candidates.pop() - if types[v] != VertexType.Z or phases[v] not in (0,1) or g.is_ground(v): - continue - + if types[v] != VertexType.Z or phases[v] not in (0,1) or g.is_ground(v): continue + good_vert = True w = None bound = None for n in g.neighbors(v): - if types[n] != VertexType.Z: - good_vert = False - break - if len(g.neighbors(n)) == 1: # v is a phase gadget - good_vert = False - break - if n in consumed_vertices: - good_vert = False - break - if g.is_ground(n) in consumed_vertices: + if types[n] != VertexType.Z or len(g.neighbors(n)) == 1 or n in consumed_vertices or g.is_ground(n): good_vert = False break + boundaries = [] wrong_match = False for b in g.neighbors(n): - if types[b] == VertexType.BOUNDARY: - boundaries.append(b) - elif types[b] != VertexType.Z: - wrong_match = True - if len(boundaries) != 1 or wrong_match: # n is not on the boundary, - continue # has too many boundaries or has neighbors of wrong type + if types[b] == VertexType.BOUNDARY: boundaries.append(b) + elif types[b] != VertexType.Z: wrong_match = True + if len(boundaries) != 1 or wrong_match: continue # n is not on the boundary or has too many boundaries or has neighbors of wrong type if phases[n] and hasattr(phases[n], 'denominator') and phases[n].denominator == 2: w = n bound = boundaries[0] @@ -574,23 +543,19 @@ def match_pivot_boundary( w = n bound = boundaries[0] if not good_vert or w is None: continue - if bound in inputs: mod = 0.5 - else: mod = -0.5 - v1 = g.add_vertex(VertexType.Z,-2,rs[w]+mod,phases[w]) - v2 = g.add_vertex(VertexType.Z,-1,rs[w]+mod,0) - g.set_phase(w, 0) - g.update_phase_index(w,v1) - edge_list.append(g.edge(w,v2)) - edge_list.append(g.edge(v1,v2)) - for n in g.neighbors(v): consumed_vertices.add(n) - for n in g.neighbors(w): consumed_vertices.add(n) assert bound is not None - m.append((v,w,[],[bound])) + + m.append((v,w,tuple(),tuple([bound]))) i += 1 - for n in g.neighbors(v): candidates.discard(n) - for n in g.neighbors(w): candidates.discard(n) - - g.add_edges(edge_list, EdgeType.HADAMARD) + + if allow_interacting_matches: continue + for n in g.neighbors(v): + consumed_vertices.add(n) + candidates.discard(n) + for n in g.neighbors(w): + consumed_vertices.add(n) + candidates.discard(n) + return m def pivot(g: BaseGraph[VT,ET], matches: List[MatchPivotType[VT]]) -> RewriteOutputType[ET,VT]: @@ -605,21 +570,19 @@ def pivot(g: BaseGraph[VT,ET], matches: List[MatchPivotType[VT]]) -> RewriteOutp rem_verts: List[VT] = [] rem_edges: List[ET] = [] etab: Dict[ET,List[int]] = dict() - + + phases = g.phases() for m in matches: - # compute: - # n[0] <- non-boundary neighbors of m[0] only - # n[1] <- non-boundary neighbors of m[1] only - # n[2] <- non-boundary neighbors of m[0] and m[1] - g.update_phase_index(m[0],m[1]) n = [set(g.neighbors(m[0])), set(g.neighbors(m[1]))] for i in range(2): n[i].remove(m[1-i]) # type: ignore # Really complex typing situation if len(m[i+2]) == 1: n[i].remove(m[i+2][0]) # type: ignore - n.append(n[0] & n[1]) - n[0] = n[0] - n[2] - n[1] = n[1] - n[2] + + n.append(n[0] & n[1]) # n[2] <- non-boundary neighbors of m[0] and m[1] + n[0] = n[0] - n[2] # n[0] <- non-boundary neighbors of m[0] only + n[1] = n[1] - n[2] # n[1] <- non-boundary neighbors of m[1] only + es = ([g.edge(s,t) for s in n[0] for t in n[1]] + [g.edge(s,t) for s in n[1] for t in n[2]] + [g.edge(s,t) for s in n[0] for t in n[2]]) @@ -627,62 +590,87 @@ def pivot(g: BaseGraph[VT,ET], matches: List[MatchPivotType[VT]]) -> RewriteOutp g.scalar.add_power(k0*k2 + k1*k2 + k0*k1) for v in n[2]: - if not g.is_ground(v): - g.add_to_phase(v, 1) - - if g.phase(m[0]) and g.phase(m[1]): g.scalar.add_phase(Fraction(1)) - if not m[2] and not m[3]: - g.scalar.add_power(-(k0+k1+2*k2-1)) - elif not m[2]: - g.scalar.add_power(-(k1+k2)) + if not g.is_ground(v): g.add_to_phase(v, 1) + + if phases[m[0]] and phases[m[1]]: g.scalar.add_phase(Fraction(1)) + if not m[2] and not m[3]: g.scalar.add_power(-(k0+k1+2*k2-1)) + elif not m[2]: g.scalar.add_power(-(k1+k2)) else: g.scalar.add_power(-(k0+k2)) - for i in range(2): - # if m[i] has a phase, it will get copied on to the neighbors of m[1-i]: - a = g.phase(m[i]) # type: ignore + for i in range(2): # if m[i] has a phase, it will get copied on to the neighbors of m[1-i]: + a = phases[m[i]] # type: ignore if a: for v in n[1-i]: - if not g.is_ground(v): - g.add_to_phase(v, a) + if not g.is_ground(v): g.add_to_phase(v, a) for v in n[2]: - if not g.is_ground(v): - g.add_to_phase(v, a) + if not g.is_ground(v): g.add_to_phase(v, a) - if not m[i+2]: - # if there is no boundary, the other vertex is destroyed - rem_verts.append(m[1-i]) # type: ignore + if not m[i+2]: rem_verts.append(m[1-i]) # type: ignore # if there is no boundary, the other vertex is destroyed else: - # if there is a boundary, toggle whether it is an h-edge or a normal edge - # and point it at the other vertex - e = g.edge(m[i], m[i+2][0]) # type: ignore - new_e = g.edge(m[1-i], m[i+2][0]) # type: ignore + e = g.edge(m[i], m[i+2][0]) # type: ignore # if there is a boundary, toggle whether it is an h-edge or a normal edge + new_e = g.edge(m[1-i], m[i+2][0]) # type: ignore # and point it at the other vertex ne,nhe = etab.get(new_e, [0,0]) if g.edge_type(e) == EdgeType.SIMPLE: nhe += 1 elif g.edge_type(e) == EdgeType.HADAMARD: ne += 1 etab[new_e] = [ne,nhe] rem_edges.append(e) - - + for e in es: nhe = etab.get(e, (0,0))[1] etab[e] = [0,nhe+1] - + return (etab, rem_verts, rem_edges, True) -MatchLcompType = Tuple[VT,List[VT]] +def pivot_gadget(g: BaseGraph[VT,ET], matches: List[MatchPivotType[VT]]) -> RewriteOutputType[ET,VT]: + """Performs the gadgetizations required before applying pivots. + ``m[0]`` : interior pauli vertex + ``m[1]`` : interior non-pauli vertex to gadgetize + ``m[2]`` : list of zero or one boundaries adjacent to ``m[0]``. + ``m[3]`` : list of zero or one boundaries adjacent to ``m[1]``. + """ + vertices_to_gadgetize = [m[1] for m in matches] + gadgetize(g, vertices_to_gadgetize) + return pivot(g, matches) + +def gadgetize(g: BaseGraph[VT,ET], vertices: List[VT]) -> None: + """Helper function which pulls out a list of vertices into gadgets""" + edge_list = [] + + inputs = g.inputs() + phases = g.phases() + + for v in vertices: + if any(n in inputs for n in g.neighbors(v)): mod = 0.5 + else: mod = -0.5 + + vp = g.add_vertex(VertexType.Z,-2,g.row(v)+mod,phases[v]) + v0 = g.add_vertex(VertexType.Z,-1,g.row(v)+mod,0) + g.set_phase(v, 0) + + edge_list.append(g.edge(v,v0)) + edge_list.append(g.edge(v0,vp)) + + if g.phase_tracking: g.unfuse_vertex(vp,v) + + g.add_edges(edge_list, EdgeType.HADAMARD) + return + + +MatchLcompType = Tuple[VT,Tuple[VT,...]] def match_lcomp(g: BaseGraph[VT,ET]) -> List[MatchLcompType[VT]]: """Same as :func:`match_lcomp_parallel`, but with ``num=1``""" return match_lcomp_parallel(g, num=1, check_edge_types=True) def match_lcomp_parallel( - g: BaseGraph[VT,ET], - vertexf:Optional[Callable[[VT],bool]]=None, - num:int=-1, - check_edge_types:bool=True + g: BaseGraph[VT,ET], + vertexf: Optional[Callable[[VT],bool]] = None, + num: int = -1, + check_edge_types: bool = True, + allow_interacting_matches: bool = False ) -> List[MatchLcompType[VT]]: - """Finds noninteracting matchings of the local complementation rule. - + """Finds matches of the local complementation rule. + :param g: An instance of a ZX-graph. :param num: Maximal amount of matchings to find. If -1 (the default) tries to find as many as possible. @@ -691,36 +679,37 @@ def match_lcomp_parallel( :param vertexf: An optional filtering function for candidate vertices, should return True if a vertex should be considered as a match. Passing None will consider all vertices. + :param allow_interacting_matches: Whether or not to allow matches which overlap, + hence can not all be applied at once. Defaults to False. :rtype: List of 2-tuples ``(vertex, neighbors)``. """ if vertexf is not None: candidates = set([v for v in g.vertices() if vertexf(v)]) else: candidates = g.vertex_set() - types = g.types() + phases = g.phases() - + types = g.types() + i = 0 - m = [] + m: List[MatchLcompType[VT]] = [] while (num == -1 or i < num) and len(candidates) > 0: v = candidates.pop() - vt = types[v] - va = g.phase(v) - - if vt != VertexType.Z: continue - if not (va == Fraction(1,2) or va == Fraction(3,2)): continue - - if g.is_ground(v): - continue + + if types[v] != VertexType.Z: continue + if phases[v] not in (Fraction(1,2), Fraction(3,2)): continue + if g.is_ground(v): continue if check_edge_types and not ( all(g.edge_type(e) == EdgeType.HADAMARD for e in g.incident_edges(v)) ): continue vn = list(g.neighbors(v)) - - if not all(types[n] == VertexType.Z for n in vn): continue - + if any(types[n] != VertexType.Z for n in vn): continue + + m.append((v,tuple(vn))) + i += 1 + + if allow_interacting_matches: continue for n in vn: candidates.discard(n) - m.append((v,vn)) return m def lcomp(g: BaseGraph[VT,ET], matches: List[MatchLcompType[VT]]) -> RewriteOutputType[ET,VT]: @@ -730,24 +719,31 @@ def lcomp(g: BaseGraph[VT,ET], matches: List[MatchLcompType[VT]]) -> RewriteOutp for more details on the rewrite""" etab: Dict[ET,List[int]] = dict() rem = [] - for m in matches: - a = g.phase(m[0]) - rem.append(m[0]) - assert isinstance(a,Fraction) # For mypy - if a.numerator == 1: g.scalar.add_phase(Fraction(1,4)) + + phases = g.phases() + + for v, vn in matches: + p = phases[v] + rem.append(v) + assert isinstance(p,Fraction) + + if p.numerator == 1: g.scalar.add_phase(Fraction(1,4)) else: g.scalar.add_phase(Fraction(7,4)) - n = len(m[1]) + + n = len(vn) g.scalar.add_power((n-2)*(n-1)//2) + for i in range(n): - if not g.is_ground(m[1][i]): - g.add_to_phase(m[1][i], -a) + if not g.is_ground(vn[i]): + g.add_to_phase(vn[i], -p) for j in range(i+1, n): - e = g.edge(m[1][i],m[1][j]) + e = g.edge(vn[i],vn[j]) he = etab.get(e, [0,0])[1] etab[e] = [0, he+1] return (etab, rem, [], True) + MatchIdType = Tuple[VT,VT,VT,EdgeType.Type] def match_ids(g: BaseGraph[VT,ET]) -> List[MatchIdType[VT]]: @@ -755,45 +751,52 @@ def match_ids(g: BaseGraph[VT,ET]) -> List[MatchIdType[VT]]: return match_ids_parallel(g, num=1) def match_ids_parallel( - g: BaseGraph[VT,ET], - vertexf:Optional[Callable[[VT],bool]]=None, - num:int=-1 + g: BaseGraph[VT,ET], + vertexf: Optional[Callable[[VT],bool]] = None, + num: int = -1, + allow_interacting_matches: bool = False ) -> List[MatchIdType[VT]]: - """Finds non-interacting identity vertices. - + """Finds matches of identity vertices. + :param g: An instance of a ZX-graph. :param num: Maximal amount of matchings to find. If -1 (the default) tries to find as many as possible. :param vertexf: An optional filtering function for candidate vertices, should return True if a vertex should be considered as a match. Passing None will consider all vertices. + :param allow_interacting_matches: Whether or not to allow matches which overlap, + hence can not all be applied at once :rtype: List of 4-tuples ``(identity_vertex, neighbor1, neighbor2, edge_type)``. """ if vertexf is not None: candidates = set([v for v in g.vertices() if vertexf(v)]) else: candidates = g.vertex_set() + types = g.types() phases = g.phases() - + i = 0 - m:List[MatchIdType[VT]] = [] - + m: List[MatchIdType[VT]] = [] while (num == -1 or i < num) and len(candidates) > 0: v = candidates.pop() - if phases[v] != 0 or not vertex_is_zx(types[v]) or g.is_ground(v): - continue - neigh = g.neighbors(v) - if len(neigh) != 2: continue - v0, v1 = neigh + if phases[v] != 0 or not vertex_is_zx(types[v]) or g.is_ground(v): continue + + vn = g.neighbors(v) + if len(vn) != 2: continue + v0, v1 = vn + if (g.is_ground(v0) and types[v1] == VertexType.BOUNDARY or - g.is_ground(v1) and types[v0] == VertexType.BOUNDARY): - # Do not put ground spiders on the boundary + g.is_ground(v1) and types[v0] == VertexType.BOUNDARY): # Do not put ground spiders on the boundary continue - candidates.discard(v0) - candidates.discard(v1) + if g.edge_type(g.edge(v,v0)) != g.edge_type(g.edge(v,v1)): #exactly one of them is a hadamard edge m.append((v,v0,v1,EdgeType.HADAMARD)) else: m.append((v,v0,v1,EdgeType.SIMPLE)) i += 1 + + if allow_interacting_matches: continue + candidates.discard(v0) + candidates.discard(v1) + return m def remove_ids(g: BaseGraph[VT,ET], matches: List[MatchIdType[VT]]) -> RewriteOutputType[ET,VT]: @@ -807,15 +810,17 @@ def remove_ids(g: BaseGraph[VT,ET], matches: List[MatchIdType[VT]]) -> RewriteOu if not e in etab: etab[e] = [0,0] if et == EdgeType.SIMPLE: etab[e][0] += 1 else: etab[e][1] += 1 + return (etab, rem, [], False) -MatchGadgetType = Tuple[VT,VT,FractionLike,List[VT],List[VT]] + +MatchGadgetType = Tuple[VT, int, List[VT], Dict[VT,VT]] def match_phase_gadgets(g: BaseGraph[VT,ET],vertexf:Optional[Callable[[VT],bool]]=None) -> List[MatchGadgetType[VT]]: """Determines which phase gadgets act on the same vertices, so that they can be fused together. :param g: An instance of a ZX-graph. - :rtype: List of 5-tuples ``(axel,leaf, total combined phase, other axels with same targets, other leafs)``. + :rtype: List of 4-tuples ``(leaf, parity_length, other axels with same targets, leaf dictionary)``. """ if vertexf is not None: candidates = set([v for v in g.vertices() if vertexf(v)]) else: candidates = g.vertex_set() @@ -844,37 +849,42 @@ def match_phase_gadgets(g: BaseGraph[VT,ET],vertexf:Optional[Callable[[VT],bool] for par, gad in parities.items(): if len(gad) == 1: n = gad[0] - v = gadgets[n] - if phases[n] != 0: # If the phase of the axel vertex is pi, we change the phase of the gadget - g.scalar.add_phase(phases[v]) - g.phase_negate(v) - m.append((v,n,-phases[v],[],[])) + if phases[n] != 0: + m.append((n, len(par), [], gadgets)) else: - totphase = sum((1 if phases[n]==0 else -1)*phases[gadgets[n]] for n in gad)%2 - for n in gad: - if phases[n] != 0: - g.scalar.add_phase(phases[gadgets[n]]) - g.phase_negate(gadgets[n]) - g.scalar.add_power(-((len(par)-1)*(len(gad)-1))) n = gad.pop() - v = gadgets[n] - m.append((v,n,totphase, gad, [gadgets[n] for n in gad])) + m.append((n, len(par), gad, gadgets)) return m def merge_phase_gadgets(g: BaseGraph[VT,ET], matches: List[MatchGadgetType[VT]]) -> RewriteOutputType[ET,VT]: """Given the output of :func:``match_phase_gadgets``, removes phase gadgets that act on the same set of targets.""" rem = [] - for v, n, phase, othergadgets, othertargets in matches: + phases = g.phases() + for n, par_num, gad, gadgets in matches: + v = gadgets[n] + if len(gad) == 0: + if phases[n] != 0: + g.scalar.add_phase(phases[v]) + if g.phase_tracking: g.phase_negate(v) + phase = -phases[v] + else: + phase = sum((1 if phases[w]==0 else -1)*phases[gadgets[w]] for w in gad+[n])%2 + for w in gad+[n]: + if phases[w] != 0: + g.scalar.add_phase(phases[gadgets[w]]) + if g.phase_tracking: g.phase_negate(gadgets[w]) + g.scalar.add_power(-((par_num-1)*len(gad))) g.set_phase(v, phase) g.set_phase(n, 0) - rem.extend(othergadgets) + othertargets = [gadgets[w] for w in gad] + rem.extend(gad) rem.extend(othertargets) for w in othertargets: - g.fuse_phases(v,w) - if g.merge_vdata is not None: - g.merge_vdata(v, w) + if g.phase_tracking: g.fuse_phases(v,w) + if g.merge_vdata is not None: g.merge_vdata(v, w) return ({}, rem, [], False) + MatchSupplementarityType = Tuple[VT,VT,Literal[1,2],FrozenSet[VT]] def match_supplementarity(g: BaseGraph[VT,ET], vertexf:Optional[Callable[[VT],bool]]=None) -> List[MatchSupplementarityType[VT]]: @@ -950,10 +960,11 @@ def apply_supplementarity( else: raise Exception("Shouldn't happen") return ({}, rem, [], True) + MatchCopyType = Tuple[VT,VT,FractionLike,FractionLike,List[VT]] def match_copy( - g: BaseGraph[VT,ET], + g: BaseGraph[VT,ET], vertexf:Optional[Callable[[VT],bool]]=None ) -> List[MatchCopyType[VT]]: """Finds spiders with a 0 or pi phase that have a single neighbor, @@ -975,7 +986,6 @@ def match_copy( m.append((v,w,phases[v],phases[w],neigh)) candidates.discard(w) candidates.difference_update(neigh) - return m def apply_copy(g: BaseGraph[VT,ET], matches: List[MatchCopyType[VT]]) -> RewriteOutputType[ET,VT]: @@ -997,8 +1007,8 @@ def apply_copy(g: BaseGraph[VT,ET], matches: List[MatchCopyType[VT]]) -> Rewrite g.add_to_phase(n, a) return ({}, rem, [], True) -MatchPhasePolyType = Tuple[List[VT], Dict[FrozenSet[VT],Union[VT,Tuple[VT,VT]]]] +MatchPhasePolyType = Tuple[List[VT], Dict[FrozenSet[VT],Union[VT,Tuple[VT,VT]]]] def match_gadgets_phasepoly(g: BaseGraph[VT,ET]) -> List[MatchPhasePolyType[VT]]: """Finds groups of phase-gadgets that act on the same set of 4 vertices in order to apply a rewrite based on @@ -1104,3 +1114,369 @@ def apply_gadget_phasepoly(g: BaseGraph[VT,ET], matches: List[MatchPhasePolyType phase = 0 g.add_edges([g.edge(n,v)]+[g.edge(n,w) for w in group],EdgeType.HADAMARD) g.set_phase(v, phase + Fraction(7,4)) + + +MatchIdFuseType = Tuple[VT,VT,VT] + +def match_id_fuse( + g: BaseGraph[VT,ET], + matchf: Optional[Callable[[VT], bool]] = None, + num: int = -1, + allow_interacting_matches: bool = False + ) -> List[MatchIdFuseType[VT]]: + """Finds matches of the identity fusion rule (identity removal followed immediately by spider fusion) + + :param g: An instance of a ZX-graph + :param matchf: An optional filtering function for candidate edge, should + return True if a edge should considered as a match. Defaults to None + :param num: Maximal amount of matchings to find. If -1 (the default) + tries to find as many as possible., defaults to -1 + :param allow_interacting_matches: Whether or not to allow matches which overlap, + hence can not all be applied at once. Defaults to False. + :return: List of 3-tuples. See :func:`id_fuse` for the details. + """ + if matchf is not None: candidates = {v for v in g.vertices() if matchf(v)} + else: candidates = g.vertex_set() + + phases = g.phases() + types = g.types() + + i = 0 + m: List[MatchIdFuseType] = [] + while candidates and (num == -1 or i < num): + v = candidates.pop() + phase = phases[v] + + if not vertex_is_zx(types[v]) or g.is_ground(v): continue + if g.phase_tracking: + if g.check_phase(v, phase, 0) is False: continue + elif phase != 0: continue + + ns = g.neighbors(v) + if len(ns) != 2: continue + v0, v1 = ns + + if not (vertex_is_zx(types[v0]) and types[v0] == types[v1]): continue + if g.edge_type(g.edge(v,v0)) != g.edge_type(g.edge(v,v1)): continue # Do not put ground spiders on the boundary + if any(len(g.neighbors(u)) == 1 for u in (v0,v1)): continue # Phase gadget + + m.append((v,v0,v1)) + i += 1 + + if allow_interacting_matches: continue + candidates.discard(v0) + candidates.discard(v1) + for n in g.neighbors(v0): + candidates.discard(n) + for n2 in g.neighbors(n): candidates.discard(n2) + for n in g.neighbors(v1): + candidates.discard(n) + for n2 in g.neighbors(n): candidates.discard(n2) + return m + +def id_fuse(g: BaseGraph[VT,ET], matches: List[MatchIdFuseType[VT]]) -> RewriteOutputType[ET,VT]: + """Perform a identity fusion rewrite, given a list of matches as returned by + ``match_id_fuse``. A match is itself a tuple where: + + ``m[0]`` : The central identity vertex to be removed. + ``m[1]`` : The first neighbour of the central vertex. + ``m[2]`` : The second neighbour of the central vertex. + """ + rem_verts = [] + etab: Dict[ET,List[int]] = dict() + + phases = g.phases() + + for id_v, v0, v1 in matches: + rem_verts.append(id_v) + + if g.is_ground(v0) or g.is_ground(v1): + g.set_phase(v0, 0) + g.set_ground(v0) + else: g.add_to_phase(v0, phases[v1]) + + if g.phase_tracking: + g.fix_phase(id_v, phases[id_v], 0) + g.fuse_phases(v0, v1) + + rem_verts.append(v1) # always delete the second vertex in the match + + for w in g.neighbors(v1): # edges from the second vertex are transferred to the first + if w in [id_v, v0]: continue + e = g.edge(v0,w) + etab.setdefault(e, [0,0])[g.edge_type(g.edge(v1,w)) - 1] += 1 + + return (etab, rem_verts, [], True) + + +def unfuse_neighbours(g: BaseGraph[VT,ET], v: VT, neighbours_to_unfuse: Tuple[VT,...], desired_phase: FractionLike) -> Tuple[VT,VT]: + """Helper function which unfuses a vertex onto a set of neighbours, leaving it with a desired phase.""" + unfused_phase = g.phase(v) - desired_phase + + vp = g.add_vertex(VertexType.Z, -2, g.row(v), unfused_phase) + v0 = g.add_vertex(VertexType.Z, -1, g.row(v)) + + g.set_phase(v, desired_phase) + g.add_edge(g.edge(v,v0), EdgeType.HADAMARD) + g.add_edge(g.edge(v0,vp), EdgeType.HADAMARD) + + for n in neighbours_to_unfuse: + g.add_edge(g.edge(vp, n), g.edge_type(g.edge(v, n))) + g.remove_edge(g.edge(v, n)) + + if g.phase_tracking: g.unfuse_vertex(vp, v) + + return v0, vp + + +MatchLcompUnfuseType = Tuple[VT,Tuple[VT,...],Tuple[VT,...]] + +def match_lcomp_unfuse( + g: BaseGraph[VT,ET], + matchf: Optional[Callable[[VT], bool]] = None, + num: int = -1, + allow_interacting_matches: bool = True, + max_unfusions: int = 0, + **kwargs: Any + ) -> List[MatchLcompUnfuseType]: + """Finds matches of the local complementation rule including unfusions onto (a set maximum) number of neighbours. + Increasing ``max_unfusions`` scales the number of matches exponentially. + Note that the different unfusion match variations cannot be applied at once. + + :param g: An instance of a ZX-graph + :param matchf: An optional filtering function for candidate edge, should + return True if a edge should considered as a match. Defaults to None + :param num: Maximal amount of matchings to find. If -1 (the default) + tries to find as many as possible., defaults to -1 + :param allow_interacting_matches: Whether or not to allow matches which overlap, + hence can not all be applied at once. Defaults to True. + :param max_unfusions: The maximum number of neighours to unfuse onto. + :return: List of 3-tuples. See :func:`lcomp_unfuse` for the details. + """ + if matchf is not None: candidates = {v for v in g.vertices() if matchf(v)} + else: candidates = g.vertex_set() + + phases = g.phases() + types = g.types() + + i = 0 + m: List[MatchLcompUnfuseType] = [] + while candidates and (num == -1 or i < num): + v = candidates.pop() + + if types[v] != VertexType.Z or g.is_ground(v) or g.vertex_degree(v) == 1: continue + + vn = list(g.neighbors(v)) + + vb = [n for n in vn if types[n] == VertexType.BOUNDARY] + if any(types[n] != VertexType.Z or g.edge_type(g.edge(v, n)) != EdgeType.HADAMARD for n in vn if n not in vb): continue + + for subset_size in range(min(len(vn)-1, max_unfusions+1)): + for neighbours_to_unfuse in itertools.combinations(vn, subset_size): + if not set(vb).issubset(set(neighbours_to_unfuse)): continue + + if len(neighbours_to_unfuse) == 0: + phase = phases[v] + if g.phase_tracking: + if not (g.check_phase(v, phase, Fraction(1,2)) or g.check_phase(v, phase, Fraction(3,2))): continue + elif phase not in (Fraction(1,2), Fraction(3,2)): continue + + m.append((v,tuple(vn),neighbours_to_unfuse)) + + i += 1 + + if allow_interacting_matches: continue + candidates.difference_update(vn) + return m + +def lcomp_unfuse(g: BaseGraph[VT,ET], matches: List[MatchLcompUnfuseType[VT]]) -> RewriteOutputType[ET,VT]: + """Perform a local complemntation unfusion rewrite, given a list of matches as returned by + ``match_lcomp_unfuse``. A match is itself a tuple where: + + ``m[0]`` : The central identity vertex to be removed. + ``m[1]`` : The first neighbour of the central vertex. + ``m[2]`` : The second neighbour of the central vertex. + """ + updated_matches: List[MatchLcompType] = [] + + phases = g.phases() + + for v, vn, neighbours_to_unfuse in matches: + if not neighbours_to_unfuse: + if g.phase_tracking: + phase = phases[v] + if g.check_phase(v, phase, Fraction(1,2)): g.fix_phase(v, phase, Fraction(1,2)) + else: g.fix_phase(v, phase, Fraction(3,2)) + updated_matches.append((v,tuple(vn))) + else: + v0, vp = unfuse_neighbours(g, v, neighbours_to_unfuse, Fraction(1,2)) + updated_matches.append((v, tuple(v for v in vn if v not in neighbours_to_unfuse) + (v0,))) + + return lcomp(g, updated_matches) + + +MatchPivotUnfuseType = Tuple[VT,VT,Tuple[Tuple[VT,...],...]] + +def match_pivot_unfuse( + g: BaseGraph[VT,ET], + matchf: Optional[Callable[[ET], bool]] = None, + num: int = -1, + allow_interacting_matches: bool = False, + max_unfusions: int = 0, + **kwargs: Any + ) -> List[MatchPivotUnfuseType[VT]]: + """Finds matches of the pivot rule including unfusions onto (a set maximum) number of neighbours from each vertex. + Increasing ``max_unfusions`` scales the number of matches exponentially. + Note that the different unfusion match variations cannot be applied at once. + + :param g: An instance of a ZX-graph + :param matchf: An optional filtering function for candidate edge, should + return True if a edge should considered as a match. Defaults to None + :param num: Maximal amount of matchings to find. If -1 (the default) + tries to find as many as possible., defaults to -1 + :param allow_interacting_matches: Whether or not to allow matches which overlap, + hence can not all be applied at once. Defaults to True. + :param max_unfusions: The maximum number of neighours to unfuse onto for each vertex. + :return: List of 3-tuples. See :func:`pivot_unfuse` for the details. + """ + if matchf: candidates = {e for e in g.edges() if matchf(e) and g.edge_type(e) == EdgeType.HADAMARD} + else: candidates = {e for e in g.edges() if g.edge_type(e) == EdgeType.HADAMARD} + + phases = g.phases() + types = g.types() + + i = 0 + m: List[MatchPivotUnfuseType] = [] + while (num == -1 or i < num) and len(candidates) > 0: + e = candidates.pop() + + v0, v1 = g.edge_st(e) + if types[v0] != VertexType.Z or types[v1] != VertexType.Z or g.is_ground(v0) or g.is_ground(v1): continue + + v0n = list(g.neighbors(v0)) + v1n = list(g.neighbors(v1)) + if len(v0n) == 1 or len(v1n) == 1: continue + + v0b = set() + for n in v0n: + ty = types[n] + if ty == VertexType.BOUNDARY: + v0b.add(n) + continue + if ty != VertexType.Z or g.edge_type(g.edge(v0, n)) != EdgeType.HADAMARD: continue + + v1b = set() + for n in v1n: + ty = types[n] + if ty == VertexType.BOUNDARY: + v1b.add(n) + continue + if ty != VertexType.Z or g.edge_type(g.edge(v1, n)) != EdgeType.HADAMARD: continue + + if g.phase_tracking: pivot_phases = g.check_two_pauli_phases(v0, phases[v0], v1, phases[v1]) + else: pivot_phases = [p if p in {0, 1} else None for p in (phases[v0], phases[v1])] + + max_subset_v0 = min(len(v0n) - 1, max_unfusions + 1) + max_subset_v1 = min(len(v1n) - 1, max_unfusions + 1) + for subset_size_v0 in range(max_subset_v0): + for neighbours_to_unfuse_0 in itertools.combinations(v0n, subset_size_v0): + if v1 in neighbours_to_unfuse_0: continue + if v0b and not v0b.issubset(neighbours_to_unfuse_0): continue + + for subset_size_v1 in range(max_subset_v1): + for neighbours_to_unfuse_1 in itertools.combinations(v1n, subset_size_v1): + if v0 in neighbours_to_unfuse_1: continue + if v1b and not v1b.issubset(neighbours_to_unfuse_1): continue + + if (pivot_phases is None and not (neighbours_to_unfuse_0 or neighbours_to_unfuse_1)) or \ + (pivot_phases == [None, None] and (not neighbours_to_unfuse_0 or not neighbours_to_unfuse_1)) or \ + (pivot_phases and pivot_phases[0] is None and not neighbours_to_unfuse_0) or \ + (pivot_phases and pivot_phases[1] is None and not neighbours_to_unfuse_1): + continue + + m.append((v0, v1, (tuple(neighbours_to_unfuse_0), tuple(neighbours_to_unfuse_1)))) + + i += 1 + + if allow_interacting_matches: continue + for n in v0n + v1n: + candidates -= set(g.incident_edges(n)) + return m + +def pivot_unfuse(g: BaseGraph[VT,ET], matches: List[MatchPivotUnfuseType[VT]]) -> RewriteOutputType[ET,VT]: + """Perform a pivot unfusion rewrite, given a list of matches as returned by + ``match_pivot_unfuse``. A match is itself a tuple where: + + ``m[0]`` : The first pivot vertex + ``m[1]`` : The second pivot vertex + ``m[2]`` : 2-tuple containing tuples of the neighbours to unfuse from each respective vertex + """ + updated_matches: List[MatchPivotType[VT]] = [] + + phases = g.phases() + + for v0, v1, (neighbours_to_unfuse_0, neighbours_to_unfuse_1) in matches: + len_n0, len_n1 = len(neighbours_to_unfuse_0), len(neighbours_to_unfuse_1) + + if g.phase_tracking: + v0p, v1p = phases[v0], phases[v1] + pivot_phases = g.check_two_pauli_phases(v0, v0p, v1, v1p) + + if len_n0 == 0: + p0 = pivot_phases[0] if pivot_phases else 0 + assert p0 is not None + g.fix_phase(v0, v0p, p0) + if len_n1 == 0 and pivot_phases: + assert pivot_phases[1] is not None + g.fix_phase(v1, v1p, pivot_phases[1]) + elif len_n1 == 0: + p1 = pivot_phases[1] if pivot_phases else 0 + assert p1 is not None + g.fix_phase(v1, v1p, p1) + + if len_n0 > 0: unfuse_neighbours(g, v0, neighbours_to_unfuse_0, 0) + if len_n1 > 0: unfuse_neighbours(g, v1, neighbours_to_unfuse_1, 0) + + updated_matches.append((v0, v1, tuple(), tuple())) + + return pivot(g, updated_matches) + + +MatchUnfuseType = Union[Tuple[MatchLcompUnfuseType, None, None],Tuple[None, MatchPivotUnfuseType, None], Tuple[None,None,MatchIdFuseType]] + +def match_2Q_simp( + g: BaseGraph[VT,ET], + matchf: Optional[Callable[[Union[VT,ET]],bool]] = None, + rewrites: List[str] = ['id_fuse','lcomp','pivot'], + max_lc_unfusions: int = 0, + max_p_unfusions: int = 0, + **kwargs: Any + ) -> List[MatchUnfuseType]: + """Finds matches of :func:`lcomp_unfuse`, :func:`pivot_unfuse` and :func:`id_fuse`. + Increasing ``max_lc_unfusions`` or ``max_p_unfusions`` scales the number of matches exponentially. + + :param g: An instance of a ZX-graph + :param matchf: An optional filtering function for candidate edge, should + return True if a edge should considered as a match. Defaults to None + :param rewrites: A list containing which rewrites to apply. Defaults to ['id_fuse','lcomp','pivot'] + :param max_lc_unfusions: The maximum number of neighours to unfuse onto for each local complementation. + :param max_p_unfusions: The maximum number of neighours to unfuse onto for each pivot vertex. + :return: List of 3-tuples. See :func:`rewrite_2Q_simp` for the details. + """ + m: List[MatchUnfuseType] = [] + if 'lcomp' in rewrites: m.extend([(match,None,None) for match in match_lcomp_unfuse(g, matchf, allow_interacting_matches=True, max_unfusions=max_lc_unfusions)]) + if 'pivot' in rewrites: m.extend([(None,match,None) for match in match_pivot_unfuse(g, matchf, allow_interacting_matches=True, max_unfusions=max_p_unfusions)]) + if 'id_fuse' in rewrites: m.extend([(None,None,match) for match in match_id_fuse(g, matchf, allow_interacting_matches=True)]) + return m + +def rewrite_2Q_simp(g: BaseGraph[VT,ET], match: List[MatchUnfuseType]) -> RewriteOutputType[ET,VT]: + """Perform a 2Q_simp rewrite, given a list of matches as returned by + ``match_2Q_simp``. A match is itself a tuple where: + + ``m[0]`` : ``lcomp_unfuse`` match, otherwise None. + ``m[1]`` : ``pivot_unfuse`` match, otherwise None. + ``m[2]`` : ``id_fuse`` match, otherwise None. + """ + if match[0][0]: return lcomp_unfuse(g,[match[0][0]]) + if match[0][1]: return pivot_unfuse(g,[match[0][1]]) + if match[0][2]: return id_fuse(g,[match[0][2]]) \ No newline at end of file diff --git a/pyzx/simplify.py b/pyzx/simplify.py index d2225f0a..313c85b8 100644 --- a/pyzx/simplify.py +++ b/pyzx/simplify.py @@ -24,13 +24,17 @@ __all__ = ['bialg_simp','spider_simp', 'id_simp', 'phase_free_simp', 'pivot_simp', 'pivot_gadget_simp', 'pivot_boundary_simp', 'gadget_simp', 'lcomp_simp', 'clifford_simp', 'tcount', 'to_gh', 'to_rg', - 'full_reduce', 'teleport_reduce', 'reduce_scalar', 'supplementarity_simp', + 'full_reduce', 'teleport_reduce', 'reduce_scalar', 'supplementarity_simp', + 'id_fuse_simp', 'to_graph_like', 'is_graph_like', 'basic_simp', 'flow_2Q_simp', 'to_clifford_normal_form_graph'] -from typing import List, Callable, Optional, Union, Generic, Tuple, Dict, Iterator, cast +from typing import List, Callable, Optional, Union, Generic, Tuple, Dict, Iterator, Any, cast +from collections import defaultdict from .utils import EdgeType, VertexType, toggle_edge, vertex_is_zx, toggle_vertex from .rules import * +from .heuristics import * +from .flow import * from .graph.base import BaseGraph, VT, ET from .circuit import Circuit @@ -56,94 +60,120 @@ def simp( g: BaseGraph[VT,ET], name: str, match: Callable[..., List[MatchObject]], - rewrite: Callable[[BaseGraph[VT,ET],List[MatchObject]],RewriteOutputType[ET,VT]], - matchf:Optional[Union[Callable[[ET],bool], Callable[[VT],bool]]]=None, - quiet:bool=False, - stats:Optional[Stats]=None) -> int: - """Helper method for constructing simplification strategies based on the rules present in rules_. - It uses the ``match`` function to find matches, and then rewrites ``g`` using ``rewrite``. - If ``matchf`` is supplied, only the vertices or edges for which matchf() returns True are considered for matches. - - Example: - ``simp(g, 'spider_simp', rules.match_spider_parallel, rules.spider)`` - - Args: - g: The graph that needs to be simplified. - str name: The name to display if ``quiet`` is set to False. - match: One of the ``match_*`` functions of rules_. - rewrite: One of the rewrite functions of rules_. - matchf: An optional filtering function on candidate vertices or edges, which - is passed as the second argument to the match function. - quiet: Suppress output on numbers of matches found during simplification. - - Returns: - Number of iterations of ``rewrite`` that had to be applied before no more matches were found.""" - - i = 0 - new_matches = True - while new_matches: - new_matches = False - if matchf is not None: - m = match(g, matchf) - else: - m = match(g) - if len(m) > 0: - i += 1 - if i == 1 and not quiet: print("{}: ".format(name),end='') - if not quiet: print(len(m), end='') - #print(len(m), end='', flush=True) #flush only supported on Python >3.3 - etab, rem_verts, rem_edges, check_isolated_vertices = rewrite(g, m) - g.add_edge_table(etab) - g.remove_edges(rem_edges) - g.remove_vertices(rem_verts) - if check_isolated_vertices: g.remove_isolated_vertices() - if not quiet: print('. ', end='') - #print('. ', end='', flush=True) - new_matches = True - if stats is not None: stats.count_rewrites(name, len(m)) - if not quiet and i>0: print(' {!s} iterations'.format(i)) - return i - -def pivot_simp(g: BaseGraph[VT,ET], matchf:Optional[Callable[[ET],bool]]=None, quiet:bool=False, stats:Optional[Stats]=None) -> int: + rewrite: Callable[[BaseGraph[VT, ET], List[MatchObject]], RewriteOutputType[ET, VT]], + matchf: Union[Optional[Callable[[VT], bool]], Optional[Callable[[ET], bool]]] = None, + num: Optional[int] = None, + quiet: bool = False, + stats: Optional[Stats] = None + ) -> int: + """Helper method for constructing simplification strategies based on the rules present in rules_. + It uses the ``match`` function to find matches, then rewrites ``g`` using ``rewrite``. + + :param g: The graph to be simplified + :param name: The name to display if ``quiet`` is set to False. + :param match: One of the match functions of rules_. + :param rewrite: One of the rewrite functions of rules_. + :param matchf: An optional filtering function on candidate vertices or edges, passed as a second argument to the match function. + If it is supplied only vertices or edges whih return True are considered for matches. Defaults to None. + :param num: The maximum number of rewrites to perform, defaults to None. + :param quiet: Supress output on numbers of matches found during simplification, defaults to False. + :return: Number of iterations of ``rewrite`` that had to be applied before no more matches were found. + """ + num_iterations = 0 + total_rewrites = 0 + while True: + if matchf: + if num: + matches = match(g, matchf, num = -1 if num == -1 else num-total_rewrites) + else: + matches = match(g, matchf) + elif num: + matches = match(g, num = -1 if num == -1 else num-total_rewrites) + else: + matches = match(g) + + num_rewrites = len(matches) + if num_rewrites == 0: break + + num_iterations += 1 + total_rewrites += num_rewrites + + if num_iterations == 1 and not quiet: print(f'{name}: ',end='') + if not quiet: print(num_rewrites, end='') + + apply_rule(g,rewrite,matches) + + if not quiet: print('. ', end='') + if stats is not None: stats.count_rewrites(name, num_rewrites) + + if total_rewrites == num: break + + if not quiet and num_iterations > 0: print(f' {num_iterations} iterations') + return num_iterations + +def pivot_simp(g: BaseGraph[VT,ET], matchf: Optional[Callable[[ET], bool]] = None, quiet: bool = False, stats: Optional[Stats] = None) -> int: + """Iteratively applies the pivot rule until there are no more matches""" return simp(g, 'pivot_simp', match_pivot_parallel, pivot, matchf=matchf, quiet=quiet, stats=stats) -def pivot_gadget_simp(g: BaseGraph[VT,ET], matchf:Optional[Callable[[ET],bool]]=None, quiet:bool=False, stats:Optional[Stats]=None) -> int: - return simp(g, 'pivot_gadget_simp', match_pivot_gadget, pivot, matchf=matchf, quiet=quiet, stats=stats) +def pivot_gadget_simp(g: BaseGraph[VT,ET], matchf: Optional[Callable[[ET],bool]] = None, quiet: bool = False, stats: Optional[Stats] = None) -> int: + """Iteratively applies the pivot_gadget rule until there are no more matches""" + return simp(g, 'pivot_gadget_simp', match_pivot_gadget, pivot_gadget, matchf=matchf, quiet=quiet, stats=stats) -def pivot_boundary_simp(g: BaseGraph[VT,ET], matchf:Optional[Callable[[ET],bool]]=None, quiet:bool=False, stats:Optional[Stats]=None) -> int: - return simp(g, 'pivot_boundary_simp', match_pivot_boundary, pivot, matchf=matchf, quiet=quiet, stats=stats) +def pivot_boundary_simp(g: BaseGraph[VT,ET], matchf: Optional[Callable[[ET], bool]]=None, quiet: bool = False, stats: Optional[Stats] = None) -> int: + """Iteratively applies the pivot boundary rule until there are no more matches""" + return simp(g, 'pivot_boundary_simp', match_pivot_boundary, pivot_gadget, matchf=matchf, quiet=quiet, stats=stats) -def lcomp_simp(g: BaseGraph[VT,ET], matchf:Optional[Callable[[VT],bool]]=None, quiet:bool=False, stats:Optional[Stats]=None) -> int: +def lcomp_simp(g: BaseGraph[VT,ET], matchf:Optional[Callable[[VT],bool]] = None, quiet: bool = False, stats: Optional[Stats] = None) -> int: + """Iteratively applies the local complementation rule until there are no more matches""" return simp(g, 'lcomp_simp', match_lcomp_parallel, lcomp, matchf=matchf, quiet=quiet, stats=stats) -def bialg_simp(g: BaseGraph[VT,ET], quiet:bool=False, stats: Optional[Stats]=None) -> int: +def bialg_simp(g: BaseGraph[VT,ET], quiet:bool = False, stats: Optional[Stats] = None) -> int: + """Iteratively applies the bialgebra rule until there are no more matches""" return simp(g, 'bialg_simp', match_bialg_parallel, bialg, quiet=quiet, stats=stats) -def spider_simp(g: BaseGraph[VT,ET], matchf:Optional[Callable[[VT],bool]]=None, quiet:bool=False, stats:Optional[Stats]=None) -> int: +def spider_simp(g: BaseGraph[VT,ET], matchf: Optional[Callable[[VT],bool]] = None, quiet:bool = False, stats: Optional[Stats] = None) -> int: + """Iteratively applies the spider fusion boundary rule until there are no more matches""" return simp(g, 'spider_simp', match_spider_parallel, spider, matchf=matchf, quiet=quiet, stats=stats) -def id_simp(g: BaseGraph[VT,ET], matchf:Optional[Callable[[VT],bool]]=None, quiet:bool=False, stats:Optional[Stats]=None) -> int: +def id_simp(g: BaseGraph[VT,ET], matchf: Optional[Callable[[VT],bool]] = None, quiet: bool = False, stats: Optional[Stats] = None) -> int: + """Iteratively applies the identity removal rule until there are no more matches""" return simp(g, 'id_simp', match_ids_parallel, remove_ids, matchf=matchf, quiet=quiet, stats=stats) -def gadget_simp(g: BaseGraph[VT,ET], quiet:bool=False, stats:Optional[Stats]=None) -> int: +def id_fuse_simp(g: BaseGraph[VT,ET], matchf: Optional[Callable[[VT], bool]] = None, quiet :bool = False, stats: Optional[Stats] = None) -> int: + """Iteratively applies the identity fusion rule (identity removal followed by spider fusion) until there are no more matches""" + return simp(g, 'id_fuse', match_id_fuse, id_fuse, matchf=matchf, quiet=quiet, stats=stats) + +def gadget_simp(g: BaseGraph[VT,ET], quiet: bool = False, stats:Optional[Stats] = None) -> int: + """Iteratively applies the gadget fusion rule until there are no more matches""" return simp(g, 'gadget_simp', match_phase_gadgets, merge_phase_gadgets, quiet=quiet, stats=stats) -def supplementarity_simp(g: BaseGraph[VT,ET], quiet:bool=False, stats:Optional[Stats]=None) -> int: +def supplementarity_simp(g: BaseGraph[VT,ET], quiet: bool = False, stats: Optional[Stats] = None) -> int: + """Iteratively applies the supplementarity rule until there are no more matches""" return simp(g, 'supplementarity_simp', match_supplementarity, apply_supplementarity, quiet=quiet, stats=stats) -def copy_simp(g: BaseGraph[VT,ET], quiet:bool=False, stats:Optional[Stats]=None) -> int: +def copy_simp(g: BaseGraph[VT,ET], quiet: bool = False, stats: Optional[Stats] = None) -> int: """Copies 1-ary spiders with 0/pi phase through neighbors. WARNING: only use on maximally fused diagrams consisting solely of Z-spiders.""" return simp(g, 'copy_simp', match_copy, apply_copy, quiet=quiet, stats=stats) -def phase_free_simp(g: BaseGraph[VT,ET], quiet:bool=False, stats:Optional[Stats]=None) -> int: +def phase_free_simp(g: BaseGraph[VT,ET], quiet: bool = False, stats: Optional[Stats] = None) -> int: '''Performs the following set of simplifications on the graph: spider -> bialg''' i1 = spider_simp(g, quiet=quiet, stats=stats) i2 = bialg_simp(g, quiet=quiet, stats=stats) return i1+i2 -def interior_clifford_simp(g: BaseGraph[VT,ET], quiet:bool=False, stats:Optional[Stats]=None) -> int: +def basic_simp(g: BaseGraph[VT,ET], quiet: bool = True, stats: Optional[Stats] = None) -> int: + """Keeps doing the simplifications ``id_simp``, ``spider_simp`` until none of them can be applied anymore.""" + j = 0 + while True: + i1 = id_simp(g, quiet=quiet, stats=stats) + i2 = spider_simp(g, quiet=quiet, stats=stats) + if i1 + i2 == 0: break + j += 1 + return j + +def interior_clifford_simp(g: BaseGraph[VT,ET], quiet: bool = False, stats: Optional[Stats] = None) -> int: """Keeps doing the simplifications ``id_simp``, ``spider_simp``, ``pivot_simp`` and ``lcomp_simp`` until none of them can be applied anymore.""" spider_simp(g, quiet=quiet, stats=stats) @@ -158,7 +188,7 @@ def interior_clifford_simp(g: BaseGraph[VT,ET], quiet:bool=False, stats:Optional i += 1 return i -def clifford_simp(g: BaseGraph[VT,ET], quiet:bool=True, stats:Optional[Stats]=None) -> int: +def clifford_simp(g: BaseGraph[VT,ET], quiet: bool = True, stats: Optional[Stats] = None) -> int: """Keeps doing rounds of :func:`interior_clifford_simp` and :func:`pivot_boundary_simp` until they can't be applied anymore.""" i = 0 @@ -169,7 +199,7 @@ def clifford_simp(g: BaseGraph[VT,ET], quiet:bool=True, stats:Optional[Stats]=No break return i -def reduce_scalar(g: BaseGraph[VT,ET], quiet:bool=True, stats:Optional[Stats]=None) -> int: +def reduce_scalar(g: BaseGraph[VT,ET], quiet: bool = True, stats: Optional[Stats] = None) -> int: """Modification of ``full_reduce`` that is tailered for scalar ZX-diagrams. It skips the boundary pivots, and it additionally does ``supplementarity_simp``.""" i = 0 @@ -191,9 +221,7 @@ def reduce_scalar(g: BaseGraph[VT,ET], quiet:bool=True, stats:Optional[Stats]=No i += 1 return i - - -def full_reduce(g: BaseGraph[VT,ET], quiet:bool=True, stats:Optional[Stats]=None) -> None: +def full_reduce(g: BaseGraph[VT,ET], quiet: bool = True, stats: Optional[Stats] = None) -> None: """The main simplification routine of PyZX. It uses a combination of :func:`clifford_simp` and the gadgetization strategies :func:`pivot_gadget_simp` and :func:`gadget_simp`.""" interior_clifford_simp(g, quiet=quiet, stats=stats) @@ -203,74 +231,215 @@ def full_reduce(g: BaseGraph[VT,ET], quiet:bool=True, stats:Optional[Stats]=None i = gadget_simp(g, quiet=quiet, stats=stats) interior_clifford_simp(g,quiet=quiet, stats=stats) j = pivot_gadget_simp(g,quiet=quiet, stats=stats) - if i+j == 0: + if i+j == 0: break -def teleport_reduce(g: BaseGraph[VT,ET], quiet:bool=True, stats:Optional[Stats]=None) -> BaseGraph[VT,ET]: - """This simplification procedure runs :func:`full_reduce` in a way - that does not change the graph structure of the resulting diagram. - The only thing that is different in the output graph are the location and value of the phases.""" - s = Simplifier(g) - s.full_reduce(quiet=quiet, stats=stats) - return s.mastergraph - -class Simplifier(Generic[VT, ET]): - """Class used for :func:`teleport_reduce`.""" +class PhaseTeleporter(Generic[VT, ET]): + """Class used for phase teleportation.""" def __init__(self, g: BaseGraph[VT,ET]) -> None: - g.track_phases = True - self.mastergraph = g.copy() - self.simplifygraph = g.copy() - self.simplifygraph.set_phase_master(self) - self.phantom_phases: Dict[VT, Tuple[VT,int]] = dict() - - def fuse_phases(self,i1:int, i2: int) -> None: - try: - v1 = self.mastergraph.vertex_from_phase_index(i1) - v2 = self.mastergraph.vertex_from_phase_index(i2) - except ValueError: return - #self.mastergraph.phase_index[v2] = i1 - p1 = self.mastergraph.phase(v1) - p2 = self.mastergraph.phase(v2) - m1 = self.simplifygraph.phase_mult[i1] - m2 = self.simplifygraph.phase_mult[i2] - if (p2 == 0 or p2.denominator <= 2): # Deleted vertex contains Clifford phase - if v2 in self.phantom_phases: - v3,i3 = self.phantom_phases[v2] - m2 = cast(Literal[1, -1], m2*self.simplifygraph.phase_mult[i3]) - v2,i2 = v3,i3 - p2 = self.mastergraph.phase(v2) - else: return - if (p1 == 0 or p1.denominator <= 2): # Need to save non-Clifford location - self.simplifygraph.phase_mult[i1] = 1 - if v1 in self.phantom_phases: # Already fused with non-Clifford before - v3,i3 = self.phantom_phases[v1] - self.mastergraph.phase_index[v3] = i1 - del self.mastergraph.phase_index[v1] - p1 = self.mastergraph.phase(v3) - if (p1+p2).denominator <= 2: - del self.phantom_phases[v1] - v1,i1 = v3,i3 - m1 = cast(Literal[1, -1], m1*self.simplifygraph.phase_mult[i3]) - else: - self.phantom_phases[v1] = (v2,i2) - self.simplifygraph.phase_mult[i2] = m2 - return - if p1.denominator <= 2 or p2.denominator <= 2: raise Exception("Clifford phases here??") - # Both have non-Clifford phase - if m1*m2 == 1: phase = (p1 + p2)%2 - else: phase = p1 - p2 - self.mastergraph.set_phase(v1,phase) - self.mastergraph.set_phase(v2,0) - - self.simplifygraph.phase_mult[i2] = 1 - - def full_reduce(self, quiet:bool=True, stats:Optional[Stats]=None) -> None: - full_reduce(self.simplifygraph,quiet=quiet, stats=stats) - - - -def to_gh(g: BaseGraph[VT,ET],quiet:bool=True) -> None: + self.original_graph: BaseGraph[VT,ET] = g.copy() + self.parent_vertex: Dict[VT,VT] = {} + self.vertex_rank: Dict[VT,int] = {} + self.phase_mult: Dict[VT,int] = {} + self.non_clifford_vertices: Set[VT] = set() + for v in self.original_graph.vertices(): + if self.original_graph.phase(v).denominator > 2: + self.parent_vertex[v] = v + self.vertex_rank[v] = 0 + self.phase_mult[v] = 1 + self.non_clifford_vertices.add(v) + + def parent(self, v: VT) -> VT: + if self.parent_vertex[v] != v: + self.parent_vertex[v] = self.parent(self.parent_vertex[v]) + return self.parent_vertex[v] + + def get_vertex_groups(self) -> List[List[VT]]: + vertex_groups: defaultdict[VT,List[VT]] = defaultdict(list) + for v in self.non_clifford_vertices: + root = self.parent(v) + vertex_groups[root].append(v) + return list(vertex_groups.values()) + + def fuse_phases(self, v1: VT, v2: VT) -> None: + if not all(v in self.non_clifford_vertices for v in (v1, v2)): return + self.parent_vertex[v2] = v1 + self.vertex_rank[v2] = self.vertex_rank[v1] + self.vertex_rank[v1] += 1 + + def phase_negate(self, v: VT) -> None: + root = self.parent(v) + verts = [vert for vert in self.non_clifford_vertices if self.parent(vert) == root] + for vert in verts: + self.phase_mult[vert] *= -1 + + def init_simplify_graph(self, fusing_mode: bool = True) -> None: + self.simplify_graph = self.original_graph.clone() + self.simplify_graph.set_phase_teleporter(self, fusing_mode) + + def teleport_phases(self, store:bool = False) -> None: + self.init_simplify_graph() + full_reduce(self.simplify_graph) + self.init_simplify_graph(fusing_mode = False) + if not store: self.simplify_graph.place_tracked_phases() + +def teleport_reduce(g: BaseGraph[VT,ET], store: bool = False) -> None: + """This simplification procedure performs phase teleportation, running :func:`full_reduce` + to find simplifications which do not change the graph structure of the resulting diagram. + The only thing that is different in the output graph are the location and value of the non-Clifford phases. + ``store`` provides an option to store the different possiblities for the phases and locations without placing them on the graph `yet`, + giving more flexibility for future simplifications. + Currently this is only of use when using :func:`flow_2Q_simp`. + The phases can be placed at any time using ``g.place_tracked_phases()`` + + :param g: The graph to be simplified + :param store: Whether or not to store the phases rather than placing them onto the graph, defaults to False + + Warning: + If ``store`` is True, the resulting graph will not represent the same graph as the original graph. Only once all phases have been placed will the graph be equal. + """ + s = PhaseTeleporter(g) + s.teleport_phases(store = store) + g.replace(s.simplify_graph) + + +def selective_simp( + g: BaseGraph[VT,ET], + get_matches: Callable[..., List[MatchObject]], + match_score: Callable[..., Optional[float]], + update_matches: Callable[..., Dict[MatchObject, float]], + rewrite: Callable[[BaseGraph[VT, ET],List[MatchObject]], RewriteOutputType[ET, VT]], + matchf: Union[Optional[Callable[[VT], bool]], Optional[Callable[[ET], bool]]] = None, + condition: Callable[..., bool] = lambda *args: True, + num: int = -1, + **kwargs: Any + ) -> int: + """Helper method for constructing simplification strategies in which each match is assigned a score, and + the highest score is iteratively chosen, updating the matches each time a rewrite has been performed. + + :param g: The graph to be simplified + :param get_matches: A match function which takes ``g``, ``matchf`` and any ``**kwargs`` as inputs, + and returns a list of matches (MatchObjects). + :param heuristic: A heuristic function which takes in the graph, a MatchObject and any **kwargs, and outputs the score (a float) + of that match, and None if the match should be ignored. + :param update_matches: Function which updates the dictionary of matches. Should take as inputs: + - The graph before the rewrite was applied + - The graph after the rewrite was applied + - The dictionary containing the current matches + - The ``get_matches`` function + - The ``heuristic`` function + - ``matchf`` + - Any ``**kwargs`` + The function should then return the updated dictionary of matches. + :param rewrite: The rewrite function which accepts a match and performs the rewrite on the graph. + This is passed into ::func::`~pyzx.rules.apply_rule` + :param matchf: An optional filtering function for candidate vertices or edges. + If provided should return False if a candidate should not be considered for a match. Defaults to None. + :param condition: A function which accepts the graph after a rewrite has been applied as well as the associated ``MatchObject``. + Should return True if the condition is fufilled, defaults to a lambda function which always returns True. + :param num: The maximum number of successful rewrites to perform, defaults to -1. + :return: The number of successful rewrites performed. + """ + num_rewrites = 0 + matches = {} + for match in get_matches(g, matchf, **kwargs): + score = match_score(g=g, match=match, **kwargs) + if score is None: continue + matches[match] = score + while matches and num_rewrites != num: + match = max(matches, key=matches.__getitem__) + check_g = g.clone() + apply_rule(check_g, rewrite, [match]) + if condition(check_g, match): + num_rewrites += 1 + matches = update_matches(g, check_g, matches, get_matches, match_score, matchf, **kwargs) + g.replace(check_g) + continue + del matches[match] + return num_rewrites + +def flow_2Q_simp( + g: BaseGraph[VT, ET], + matchf: Union[Optional[Callable[[VT], bool]], Optional[Callable[[ET], bool]]] = None, + cFlow: bool = True, + rewrites: List[str] = ['id_fuse','lcomp','pivot'], + score_weights: List[float] = [1,1,1], + max_lc_unfusions: int = 0, + max_p_unfusions: int = 0 + ) -> int: + """Simplification strategy which aims to minimise the number of two qubit gates in the extracted circuit by selecting matches based on the heuristic |edges removed| - |vertices removed|. + + :param g: The graph to be simplified, for optimal performance should be put into graph-like form prior using ::func::`to_graph_like`. + :param matchf: An optional filtering function for candidate vertices and edges. + If provided should return False if a candidate should not be considered for a match. Defaults to None. + :param cFlow: Whether the existence of a causal flow should be preserved throughout simplification, defaults to True + :param rewrites: Which rewrites to apply, defaults to ['id_fuse','lcomp','pivot'] + :param score_weights: Weighting factor for each of the three rewrites, defaults to [1,1,1] + :param max_lc_unfusions: Maximum number of neighbours to unfuse for local complementation, defaults to 0 + :param max_p_unfusions: Maximum number of neighbours to unfuse on each vertex for pivoting, defaults to 0 + :return: The number of succeessful rewrites performed. + """ + g.vertices_to_update = [] + + if cFlow: + flow_condition = lambda graph, match: True if match[2] else cflow(graph) is not None + else: + def flow_condition(graph, match): + if match[0] and len(match[0][2]) != 0: + return gflow(graph) is not None + if match[1] and (len(match[1][2][0]) != 0 or len(match[1][2][1]) != 0): + return gflow(graph) is not None + return True + + return selective_simp(g, match_2Q_simp, match_score_2Q_simp, update_2Q_simp_matches, rewrite_2Q_simp, matchf, flow_condition, rewrites=rewrites, score_weights=score_weights, max_lc_unfusions=max_lc_unfusions, max_p_unfusions=max_p_unfusions) #type:ignore + +def match_score_2Q_simp(g: BaseGraph[VT, ET], match: MatchUnfuseType, score_weights: List[float] = [1,1,1], **kwargs) -> Optional[float]: + """Function which returns the score for a ``UnfuseMatchType``.""" + if match[0]: return lcomp_2Q_simp_heuristic(g, match[0], score_weights[0]) + if match[1]: return pivot_2Q_simp_heuristic(g, match[1], score_weights[1]) + if match[2]: return id_fuse_2Q_reduce_heuristic(g, match[2], score_weights[2]) + +def update_2Q_simp_matches( + g_before: BaseGraph[VT, ET], + g_after: BaseGraph[VT, ET], + current_matches: Dict[MatchUnfuseType, float], + get_matches: Callable[..., List[MatchUnfuseType]], + match_score: Callable[..., Optional[float]], + matchf: Union[Optional[Callable[[VT], bool]], Optional[Callable[[ET], bool]]] = None, + **kwargs: Any + ) -> Dict[MatchUnfuseType, float]: + """Function which updates matches for ::func::`flow_2Q_simp`, rechecking any candidate vertices and edges which have been effected by the rewrite performed""" + before_vertices = set(g_before.vertices()) + after_vertices, after_edges = set(g_after.vertices()), set(g_after.edges()) + + removed_vertices = before_vertices - after_vertices + changed_vertices = {v for v in after_vertices if v in g_after.vertices_to_update or g_after.neighbors(v) != g_before.graph.get(v, {}).keys()} # type: ignore + + vertices_to_update = changed_vertices | {n for v in changed_vertices for n in g_after.neighbors(v)} + edges_to_update = {(v1,v2) for v1 in vertices_to_update for v2 in vertices_to_update if v1 < v2 and (v1, v2) in after_edges} + + matches_to_update = vertices_to_update | edges_to_update + update_matchf = lambda candidate: candidate in matches_to_update and (not matchf or matchf(candidate)) + new_matches = get_matches(g_after, update_matchf, **kwargs) + + updated_matches_dict = {} + for m, score in current_matches.items(): + if m[0] and m[0][0] in vertices_to_update | removed_vertices: continue + elif m[1] and (all(v in vertices_to_update for v in [m[1][0],m[1][1]]) or any(v in removed_vertices for v in [m[1][0],m[1][1]])): continue + elif m[2] and m[2][0] in vertices_to_update | removed_vertices: continue + updated_matches_dict[m] = score + + for m in new_matches: + m_score = match_score(g=g_after, match=m, **kwargs) + if m_score is None: continue + updated_matches_dict[m] = m_score + + g_after.vertices_to_update = [] + return updated_matches_dict + + +def to_gh(g: BaseGraph[VT,ET], quiet: bool = True) -> None: """Turns every red node into a green node by changing regular edges into hadamard edges""" ty = g.types() for v in g.vertices(): @@ -280,7 +449,7 @@ def to_gh(g: BaseGraph[VT,ET],quiet:bool=True) -> None: et = g.edge_type(e) g.set_edge_type(e, toggle_edge(et)) -def to_rg(g: BaseGraph[VT,ET], select:Optional[Callable[[VT],bool]]=None) -> None: +def to_rg(g: BaseGraph[VT,ET], select: Optional[Callable[[VT], bool]] = None) -> None: """Turn green nodes into red nodes by color-changing vertices which satisfy the predicate ``select``. By default, the predicate is set to greedily reducing the number of Hadamard-edges. :param g: A ZX-graph. @@ -298,18 +467,65 @@ def to_rg(g: BaseGraph[VT,ET], select:Optional[Callable[[VT],bool]]=None) -> Non for e in g.incident_edges(v): g.set_edge_type(e, toggle_edge(g.edge_type(e))) +def to_graph_like(g: BaseGraph[VT,ET], assert_bound_connections: bool = True) -> None: + """Puts a ZX-diagram in graph-like form. + If ``assert_bound_connections`` is False, the conditions on inputs/output connections are not enforced.""" + to_gh(g) + spider_simp(g, quiet=True) + + if not assert_bound_connections: return + + for b in [v for v in g.vertices() if g.type(v) == VertexType.BOUNDARY]: + for n in list(g.neighbors(b)): + if g.edge_type(g.edge(b,n)) == EdgeType.HADAMARD: + z = g.add_vertex(VertexType.Z) + g.add_edge(g.edge(b,z), edgetype=EdgeType.SIMPLE) + g.add_edge(g.edge(z,n), edgetype=EdgeType.HADAMARD) + g.remove_edge(g.edge(b,n)) + elif g.type(n) == VertexType.BOUNDARY: + z1 = g.add_vertex(VertexType.Z) + z2 = g.add_vertex(VertexType.Z) + z3 = g.add_vertex(VertexType.Z) + g.add_edge(g.edge(b,z1), edgetype=EdgeType.SIMPLE) + g.add_edge(g.edge(z1,z2), edgetype=EdgeType.HADAMARD) + g.add_edge(g.edge(z2,z3), edgetype=EdgeType.HADAMARD) + g.add_edge(g.edge(z3,n), edgetype=EdgeType.SIMPLE) + g.remove_edge(g.edge(b,n)) + + for v in [v for v in g.vertices() if g.type(v) == VertexType.Z]: + boundary_ns = [n for n in g.neighbors(v) if g.type(n)==VertexType.BOUNDARY] + if len(boundary_ns) <= 1: continue + for b in boundary_ns[:-1]: + z1 = g.add_vertex(VertexType.Z) + z2 = g.add_vertex(VertexType.Z) + g.add_edge(g.edge(b,z1), edgetype=EdgeType.SIMPLE) + g.add_edge(g.edge(z1,z2), edgetype=EdgeType.HADAMARD) + g.add_edge(g.edge(z2,v), edgetype=EdgeType.HADAMARD) + g.remove_edge(g.edge(b,v)) + +def is_graph_like(g, assert_bound_connections: bool = True): + """Returns True if a ZX-diagram is graph-like. + If ``assert_bound_connections`` is False, the conditions on inputs/output connections are not enforced.""" + for v in g.vertices(): + if g.type(v) not in [VertexType.Z, VertexType.BOUNDARY]: return False + if assert_bound_connections and g.type(v) == VertexType.Z and len([n for n in g.neighbors(v) if g.type(n)==VertexType.BOUNDARY]) > 1: return False + + for e in g.edges(): + if not assert_bound_connections: + if g.type(e[0]) == g.type(e[1]) == VertexType.Z and g.edge_type(e) != EdgeType.HADAMARD: return False + elif g.edge_type(e) == EdgeType.SIMPLE and g.type(e[0]) == g.type(e[1]): return False + elif g.edge_type(e) == EdgeType.HADAMARD and (g.type(e[0]) != VertexType.Z or g.type(e[1]) != VertexType.Z): return False + + return True + def tcount(g: Union[BaseGraph[VT,ET], Circuit]) -> int: """Returns the amount of nodes in g that have a non-Clifford phase.""" - if isinstance(g, Circuit): - return g.tcount() - count = 0 + if isinstance(g, Circuit): return g.tcount() phases = g.phases() - for v in g.vertices(): - if phases[v]!=0 and phases[v].denominator > 2: - count += 1 - return count + return len([v for v in g.vertices() if phases[v] != 0 and phases[v].denominator > 2]) + -#The functions below haven't been updated in a while. Use at your own risk. +# THE FUNCTIONS BELOW HAVEN'T BEEN UPDATED IN A WHILE. USE AT YOUR OWN RISK. def simp_iter( g: BaseGraph[VT,ET], @@ -404,104 +620,6 @@ def full_reduce_iter(g: BaseGraph[VT,ET]) -> Iterator[Tuple[BaseGraph[VT,ET],str ok = True yield g, f"pivot_gadget -> {step}" -def is_graph_like(g: BaseGraph[VT,ET]) -> bool: - """Checks if a ZX-diagram is graph-like.""" - - # checks that all spiders are Z-spiders - for v in g.vertices(): - if g.type(v) not in [VertexType.Z, VertexType.BOUNDARY]: - return False - - for v1, v2 in itertools.combinations(g.vertices(), 2): - if not g.connected(v1, v2): - continue - - # Z-spiders are only connected via Hadamard edges - if g.type(v1) == VertexType.Z and g.type(v2) == VertexType.Z \ - and g.edge_type(g.edge(v1, v2)) != EdgeType.HADAMARD: - return False - - # FIXME: no parallel edges - - # no self-loops - for v in g.vertices(): - if g.connected(v, v): - return False - - # every I/O is connected to a Z-spider - bs = [v for v in g.vertices() if g.type(v) == VertexType.BOUNDARY] - for b in bs: - if g.vertex_degree(b) != 1 or g.type(list(g.neighbors(b))[0]) != VertexType.Z: - return False - - # every Z-spider is connected to at most one I/O - zs = [v for v in g.vertices() if g.type(v) == VertexType.Z] - for z in zs: - b_neighbors = [n for n in g.neighbors(z) if g.type(n) == VertexType.BOUNDARY] - if len(b_neighbors) > 1: - return False - - return True - - -def to_graph_like(g: BaseGraph[VT,ET]) -> None: - """Puts a ZX-diagram in graph-like form.""" - - # turn all red spiders into green spiders - to_gh(g) - - # simplify: remove excess HAD's, fuse along non-HAD edges, remove parallel edges and self-loops - spider_simp(g, quiet=True) - - # ensure all I/O are connected to a Z-spider - bs = [v for v in g.vertices() if g.type(v) == VertexType.BOUNDARY] - for v in bs: - - # if it's already connected to a Z-spider, continue on - if any([g.type(n) == VertexType.Z for n in g.neighbors(v)]): - continue - - # have to connect the (boundary) vertex to a Z-spider - ns = list(g.neighbors(v)) - for n in ns: - # every neighbor is another boundary or an H-Box - assert(g.type(n) in [VertexType.BOUNDARY, VertexType.H_BOX]) - if g.type(n) == VertexType.BOUNDARY: - z1 = g.add_vertex(ty=VertexType.Z) - z2 = g.add_vertex(ty=VertexType.Z) - z3 = g.add_vertex(ty=VertexType.Z) - g.remove_edge(g.edge(v, n)) - g.add_edge(g.edge(v, z1), edgetype=EdgeType.SIMPLE) - g.add_edge(g.edge(z1, z2), edgetype=EdgeType.HADAMARD) - g.add_edge(g.edge(z2, z3), edgetype=EdgeType.HADAMARD) - g.add_edge(g.edge(z3, n), edgetype=EdgeType.SIMPLE) - else: # g.type(n) == VertexType.H_BOX - z = g.add_vertex(ty=VertexType.Z) - g.remove_edge(g.edge(v, n)) - g.add_edge(g.edge(v, z), edgetype=EdgeType.SIMPLE) - g.add_edge(g.edge(z, n), edgetype=EdgeType.SIMPLE) - - # each Z-spider can only be connected to at most 1 I/O - vs = list(g.vertices()) - for v in vs: - if not g.type(v) == VertexType.Z: - continue - boundary_ns = [n for n in g.neighbors(v) if g.type(n) == VertexType.BOUNDARY] - if len(boundary_ns) <= 1: - continue - - # add dummy spiders for all but one - for b in boundary_ns[:-1]: - z1 = g.add_vertex(ty=VertexType.Z) - z2 = g.add_vertex(ty=VertexType.Z) - - g.remove_edge(g.edge(v, b)) - g.add_edge(g.edge(z1, z2), edgetype=EdgeType.HADAMARD) - g.add_edge(g.edge(b, z1), edgetype=EdgeType.SIMPLE) - g.add_edge(g.edge(z2, v), edgetype=EdgeType.HADAMARD) - - assert(is_graph_like(g)) - def to_clifford_normal_form_graph(g: BaseGraph[VT,ET]) -> None: """Converts a graph that is Clifford into the form described by the right-hand side of eq. (11) of *Graph-theoretic Simplification of Quantum Circuits with the ZX-calculus* (https://arxiv.org/abs/1902.03178). From f7959c30f2eb8038aba787cfc9a32aa66ba212ea Mon Sep 17 00:00:00 2001 From: Calum Holker Date: Tue, 5 Dec 2023 13:23:24 +0000 Subject: [PATCH 02/14] Removed .DS_Store files --- .DS_Store | Bin 8196 -> 0 bytes circuits/.DS_Store | Bin 8196 -> 0 bytes circuits/benchmarking_circuits/.DS_Store | Bin 6148 -> 0 bytes circuits/benchmarking_circuits/Fast/.DS_Store | Bin 6148 -> 0 bytes .../benchmarking_circuits/Fast/before/.DS_Store | Bin 6148 -> 0 bytes circuits/benchmarking_circuits/Slow/.DS_Store | Bin 6148 -> 0 bytes demos/.DS_Store | Bin 6148 -> 0 bytes demos/circuit_optimisation/.DS_Store | Bin 6148 -> 0 bytes doc/.DS_Store | Bin 6148 -> 0 bytes misc/.DS_Store | Bin 6148 -> 0 bytes pyzx/.DS_Store | Bin 8196 -> 0 bytes 11 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .DS_Store delete mode 100644 circuits/.DS_Store delete mode 100644 circuits/benchmarking_circuits/.DS_Store delete mode 100644 circuits/benchmarking_circuits/Fast/.DS_Store delete mode 100644 circuits/benchmarking_circuits/Fast/before/.DS_Store delete mode 100644 circuits/benchmarking_circuits/Slow/.DS_Store delete mode 100644 demos/.DS_Store delete mode 100644 demos/circuit_optimisation/.DS_Store delete mode 100644 doc/.DS_Store delete mode 100644 misc/.DS_Store delete mode 100644 pyzx/.DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 526143a6c5c53be71eb7e35abe4377ba365b8300..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHMziSjh6n=Ae(SvKw2+7$km^4O=i6BorMXTr`~=DnHk+i!Me?rn%jEe+apL^UER z<6>K_pvoxh=POkTw&fzMLVsHC&aJefu%C+b4PF7SfLFjP;1%!+92W&}W^*a$ocqS> zYp;M;;J;LW_lE!%+q$(wWA)a7N~Zv@B{b`T`zqhS2G-WC9U2P{iZWecO;=@83}w2b zJ+N_gYlp^~?xbw;p)9hp8H&>A7(dYAr0T}{+AH7{NGrg(dxuJ!+z@JpboHHf{*yrjJj-sCF`N++Oxh&QH-r*@yX5b}C= z{1O|!al58QViE>77Po4Q- z_LH1(CBws`C12ItXTD?Li8o|)rIK3Z=@VYbt8(r6gyrQ#ByUJ|gv7VM{g{I@YfYkrN&BQ2{1OdP62YR9pJi!iwnmMjn!RH>2w@cr{l2k xKMZjnAe8&mtsNSR7LkbF$5t9QWVj!QiPDe5(J6fj!Y00Ag4EWY?3J6tmBvhs{H{Z{s0O} z_yq_O^eL#Q;R~oJkT~fD)v39PtbMD+TXJ==8#{ksQqs}5Q51`CT+p{yQ z3W{#mSFRj$cPg}s{=hn7bTPyRR&(fZBPb9Q2nqxRf&xK-KS2TR*}9ZH`@U@rbx>Uecx?U)gl_+NBS*qxaGIg+B?X*D zo2M6BJiE~67%ghDNmaJ6CdPcRrTKcXa(p=N#y0_<9m~OZ!F$0xhAHwM@ab%7_JS*} z?vbl#m;6Thk72T$iZOx*u50~HagKEHn2I&`l@xrwHZJ&Z9$tlg#z`T+LagBV?V09z zl3Ml6DOJqp`-Gf3g5~thkHsht$AbPm3=5EgU-^aRcLI0KyV%7*@IvxgwtDzv{5?D} z2oWE8x^QQ{hh-7@&G$P$?|WhzA5S#XCgSXx=TO2n-?AOVBG%iduNZ68=82bSFPsab zb`keo#IA7$_p!`XZGVNUah>aM9t^M}xSYGaauD9bZ(qd?Oicz?^r)sc7BxLV}E5$kxjx+n~da|S-J6?Y(#sOOJ*M!!xTPS zfe}0^DZ_+vNCl2t+`P{JZ~4#v57}FQ1qFfvf1?7bRBzOm$lT@DxiRQmJL2_#mo6HY uT5DWbnRJ}iq~o-sKMeUjB2@cSolULf9hTp45HN9{4f}uC|INhw$EzO`7uMAP diff --git a/circuits/benchmarking_circuits/.DS_Store b/circuits/benchmarking_circuits/.DS_Store deleted file mode 100644 index a657b567cc444f0f84b95fb185c92ea0b2039702..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKK}y6x5bV|n0WW*p<9uO%FfQ>0`vF-O^pG$MB3^UzV}ifYFIe3@F1y4CUIe8Y zdMeZ1l}YN5PK$`HA9pK}g^09pLwUAkYL+*j*jbGu`L@eu%MzwvIk_E`d$EC9?E$3R428dP9VwT>7Xbi`Aw z%N57Kpo{v+xKBM<>x80yI^xO8MROomDnJEJ6*!OW!utO;d}jVXC2>ausKCEcK$~vU zt?^2=w@zNpdToN=z&{POUXI0EG0s(SIKPjfdqC;N1d9X!yS zs=z7gS^IlG4+D?Q4#FOR{1H7;LpQVzWbbVK+#mVXx#aHIHw+U?SLhgau-J zDA0!*X)%ls$GR22M6mVf!^ueVVI;GW4#l|axW9GoWD<`$Dg(;EkbymaIpz9)`FsCA z4ALuQKpEI6227OYS&B!J+B$kTuC*3=4P{}!)?*ifi7UnMH1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T05QOrPTp@2OfiGK|(@Eu<#JP2%i(H z*U}(1bUN9R^QEy}r(dJGCL%L_n2m^rM3h1q2m2Tz!gki43}odHX#71^G+$niCeyO0 zdfvLQi45?&+oPQ3w4jpW@2_Jo$}G#5WsbP?`Rw@R{QdRh=RJyY_NPyE(>o`-bc-F_ z(UgkFDQa2Ud${=ee3LzNJk~pidqnalbWass(JGR?v9)tQx~C7x-LkJU$Lx{3n|LmC zPs)HYu-y!xX0xOR0d-UclmTU+VSv967Ru-Z>wx~#fx))`zy!-)Fy~%^W2~SPtOLRV zF(DKfLXET-CWK?%ik}m#1BP%i(tH@nY@|amK0EGjy*n8fP)B7z8R#;w6E25b|4)DK z|GPnYr3@$oTg8A$vPm|^BS~%TJsj6s3%!K0uwNap3BkmdV)$|?K7x9|y5$Mb3DyCz Q0?{7n+a diff --git a/demos/.DS_Store b/demos/.DS_Store deleted file mode 100644 index 269cca17bdab9732c29231abd0e2f86ae1fab4da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK!Ab)$5S_HuwusP!f_Mset=MW06)#KGv*3yzRO+rRy13nx-K{;8!hV4MkRRgr zIFn?>QUx!Hl^K}4$z&#JUP@*I0HQPMH34b>P(dXuRI&L)XqYXVS`nm1-=Rtqmt*srZDD{G^nBZ(5g={oO`gw)S_Y(`sdXYva`G zYB7grG`_v#M>mc_72RP@K3_f$BQwAZFawLrfW6TwD~r1Y{^iU7Gw?$U(ET7$2_1`> zL49>#L!XZ{ULqtxo8A(H(xPKAGl(N7!lWXaRAHYO!la{L+BnBzX3(UA&@1CSc4c8- zC_=A}eyPJjI0m_82AF|a28yOzqxygR_4|J|iF?cdGw`n%5TzscsDoRwwRLWDRBI*b r4Jrx6Wd`3<(9oqAW2qExplU(CBm>d0m>EP53V#S_8n|HwewBeYA^260 diff --git a/demos/circuit_optimisation/.DS_Store b/demos/circuit_optimisation/.DS_Store deleted file mode 100644 index dc160f9ecb340eed1b78acfa0acda4904e2fe87a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKJx{|h5IvVv3b2#`i7^{<8R#0Ku(BXFP`}k88d6bM5JLtAW;Qn1m|577_znC8 zMs|e6JKLg;(pH55A#^95pJU(I&rgXR6OoF}I#r?y5&3XNZwbW&<9_ynm23+qD?LV^ z5^B;39SwSgXlW1yM1jAi0DrrS)S@mOQ=6Rcx4PR-lcA=&`Mx?iDoNwGHAq|N^&hSd zqTBBC*0jjZoRP!6GjlD(aNyU|{OVwMh~1@4qe0J!^7d~gN4fm2%dan&7nWaPyd)j- zn;n_sS7v&&LMaXD6x6T7jqN)xdJ$|+5BaLQi=ki zfGF^#0Phb0oH4YR8Pr<`3Vj6tdT7>$I{#8|PGB*#m>EP5Oqo=mNmcfWp-ej30~;4w z%nX`zQugwp?99sEP?Vk>;|DsNRA^92Q9u;PE3jZ5D}4TMPrv`?ljKPh5C#5~0?Lbb z;|NQ#XKP_`eAWi=2AqxKGJ`q=g*}dSg^%JjxHj|!Tmgm_GlOV>$&Y}RK?+geR~7gK DRnDv# diff --git a/doc/.DS_Store b/doc/.DS_Store deleted file mode 100644 index 5c8fff28e9e702df676aac89ad6ea29f86d6dc7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%}T>S5S~p7R=gB@@wgYy(l>}DK0zNqZ7Wu2NTKn*FXzqI=p%Udn;$~Mw&F>o z%)soonVs34d`*DBFYxN7S?V8^fJ8clLjpWnP znqH`e?(}^!kL$0`+~bFQ4)&>=lldHY_41h{&d0?Wa0Z-#b7KHCn`LyR=%X{>3^)TF z1N?o6P{z_QDaxk|-Yf>rjH64to@L3ZJ diff --git a/misc/.DS_Store b/misc/.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0hGRTqIxu%w zTD0M0Y&aP=vvC=Uk=YTK37t%CQCoFD9jH6Nx%(Wl^(GDIILP0dz0T@(yXX%jXd(F+ zXZDLmW4BlAf|2fjTRGW$`Frgq_TDYngRZAy@imJ{p!0w}pgjT(1D!M9FX{|m-;dKL z%jYYiuX3G!G1e7l1$t&bvz{61Kurq{c0(;ETj8j$!T!VwAGH}OWA3oD$X(nor!Y{@e>Oym zI&g;^xM#I4asIy%fB%1n?ntGo1M0wS9Wc|4?Z!Hy Date: Tue, 5 Dec 2023 13:23:38 +0000 Subject: [PATCH 03/14] Add .DS_Store to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index bddcc82b..dc1a6fca 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ pyzx.egg-info *.ipynb_checkpoints pyzx/js/d3.v5.js *~ +.DS_Store \ No newline at end of file From 0a3d1e6b07edb01bea3f0e5c0ea77a331c2145d4 Mon Sep 17 00:00:00 2001 From: Calum Holker Date: Thu, 7 Dec 2023 12:25:57 +0000 Subject: [PATCH 04/14] Included arxiv link --- pyzx/simplify.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pyzx/simplify.py b/pyzx/simplify.py index 313c85b8..06683752 100644 --- a/pyzx/simplify.py +++ b/pyzx/simplify.py @@ -369,6 +369,7 @@ def flow_2Q_simp( max_p_unfusions: int = 0 ) -> int: """Simplification strategy which aims to minimise the number of two qubit gates in the extracted circuit by selecting matches based on the heuristic |edges removed| - |vertices removed|. + See https://arxiv.org/abs/2312.02793 for details. :param g: The graph to be simplified, for optimal performance should be put into graph-like form prior using ::func::`to_graph_like`. :param matchf: An optional filtering function for candidate vertices and edges. From 334fb5e28744657764413aa253f47e84db879537 Mon Sep 17 00:00:00 2001 From: Calum Holker Date: Wed, 17 Jan 2024 13:03:34 +0000 Subject: [PATCH 05/14] bug fixes --- benchmarking.py | 2 +- demos/circuit_optimisation/benchmarking.ipynb | 6 +++--- pyzx/extract.py | 6 +++--- pyzx/graph/base.py | 2 +- pyzx/simplify.py | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/benchmarking.py b/benchmarking.py index ec526073..9628ec38 100644 --- a/benchmarking.py +++ b/benchmarking.py @@ -17,7 +17,7 @@ pd.set_option('display.max_rows', None) pd.set_option('display.max_colwidth', None) -class benchmark: +class Benchmark: """Class for benchmarking circuit simplification functions""" def __init__(self, dirpath: Optional[str] = None): # callable functions which take simplify a circuit: {func_name: func} diff --git a/demos/circuit_optimisation/benchmarking.ipynb b/demos/circuit_optimisation/benchmarking.ipynb index e2b8453f..498e111f 100644 --- a/demos/circuit_optimisation/benchmarking.ipynb +++ b/demos/circuit_optimisation/benchmarking.ipynb @@ -9,7 +9,7 @@ "import sys, os, time\n", "sys.path.append('../..')\n", "import pyzx as zx\n", - "from benchmarking import benchmark" + "from benchmarking import Benchmark" ] }, { @@ -27,8 +27,8 @@ "metadata": {}, "outputs": [], "source": [ - "b = benchmark()\n", - "# b = benchmark(dirpath='benchmark')" + "b = Benchmark()\n", + "# b = Benchmark(dirpath='benchmark')" ] }, { diff --git a/pyzx/extract.py b/pyzx/extract.py index 7dbd9ac1..7d7a2f3b 100644 --- a/pyzx/extract.py +++ b/pyzx/extract.py @@ -711,14 +711,14 @@ def extract_circuit( return graph_to_swaps(g, up_to_perm) + c -def extract_simple(g: BaseGraph[VT, ET], up_to_perm: bool = True, phase_poly_synth: bool = False) -> Circuit: +def extract_simple(g: BaseGraph[VT, ET], up_to_perm: bool = True, synth_phase_polys: bool = False) -> Circuit: """A simplified circuit extractor that only works on graphs with causal flow. Also works with an extension of causal flow that allows phase gadgets under certain conditions. Phase gadgets are extracted using :func:`phase_poly_synth` :param g: The ZX-diagram to be extracted as a circuit :param up_to_perm: If True, returns a circuit that is equivalent to the given graph up to a permutation of the inputs, defaults to True - :param phase_poly_synth: If True, synthesises any extractable phase gadgets as phase polynmolials + :param synth_phase_polys: If True, synthesises any extractable phase gadgets as phase polynmolials :return: """ n_qubits = g.qubit_count() @@ -775,7 +775,7 @@ def extract_simple(g: BaseGraph[VT, ET], up_to_perm: bool = True, phase_poly_syn else: raise ValueError("ZX-diagram is not unitary") if progress_made: continue - if not phase_poly_synth: break + if not synth_phase_polys: break # Extracting phase gadgets front = {list(g.neighbors(o))[0]: q for q, o in enumerate(outputs)} diff --git a/pyzx/graph/base.py b/pyzx/graph/base.py index f05b2fdf..0c333638 100644 --- a/pyzx/graph/base.py +++ b/pyzx/graph/base.py @@ -837,7 +837,7 @@ def set_phase_teleporter(self, teleporter: 'simplify.PhaseTeleporter', fusing_mo for group_num, group in enumerate(teleporter.get_vertex_groups()): if len(group) == 1: continue self.group_data[group_num] = set(group) # Groups of vertices fused throughout teleportation - phase_sum = Fraction(0) + phase_sum: FractionLike = Fraction(0) for v in group: self.vertex_rank[v] = teleporter.vertex_rank[v] self.vertex_groups[v] = group_num diff --git a/pyzx/simplify.py b/pyzx/simplify.py index 06683752..c5276bf2 100644 --- a/pyzx/simplify.py +++ b/pyzx/simplify.py @@ -28,7 +28,7 @@ 'id_fuse_simp', 'to_graph_like', 'is_graph_like', 'basic_simp', 'flow_2Q_simp', 'to_clifford_normal_form_graph'] -from typing import List, Callable, Optional, Union, Generic, Tuple, Dict, Iterator, Any, cast +from typing import List, Callable, Optional, Union, Generic, Tuple, Dict, Iterator, Any, cast, DefaultDict from collections import defaultdict from .utils import EdgeType, VertexType, toggle_edge, vertex_is_zx, toggle_vertex @@ -256,7 +256,7 @@ def parent(self, v: VT) -> VT: return self.parent_vertex[v] def get_vertex_groups(self) -> List[List[VT]]: - vertex_groups: defaultdict[VT,List[VT]] = defaultdict(list) + vertex_groups: DefaultDict[VT,List[VT]] = defaultdict(list) for v in self.non_clifford_vertices: root = self.parent(v) vertex_groups[root].append(v) From 0fccc82c8cc659d9b599dd86b5de44150144e7b1 Mon Sep 17 00:00:00 2001 From: Calum Holker Date: Wed, 17 Jan 2024 15:16:47 +0000 Subject: [PATCH 06/14] added unit tests --- tests/test_extract.py | 16 ++++++++++- tests/test_phase_gadget_graph.json | 1 + tests/test_simplify.py | 45 +++++++++++++++++++++++++++++- 3 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 tests/test_phase_gadget_graph.json diff --git a/tests/test_extract.py b/tests/test_extract.py index a3c267a3..f41c170d 100644 --- a/tests/test_extract.py +++ b/tests/test_extract.py @@ -18,21 +18,26 @@ import unittest import random import sys +import json if __name__ == '__main__': sys.path.append('..') sys.path.append('.') +mydir = os.path.dirname(__file__) + try: import numpy as np from pyzx.tensor import tensorfy, compare_tensors except ImportError: np = None +from pyzx.graph import Graph from pyzx.circuit import Circuit from pyzx.circuit.gates import CNOT from pyzx.generate import cliffordT, cliffords from pyzx.simplify import clifford_simp -from pyzx.extract import extract_circuit +from pyzx.extract import extract_circuit, extract_simple +from pyzx.flow import cflow, full_cflow SEED = 1337 @@ -68,6 +73,15 @@ def test_cz_optimize_extract(self): self.assertTrue(cnot_count==4) self.assertTrue(c.verify_equality(c2)) + def test_extract_simple_phase_poly_synth(self): + with open(os.path.join(mydir,"test_phase_gadget_graph.json"), 'r') as file: + g_json = json.load(file) + g = Graph.from_json(g_json) + self.assertTrue(cflow(g) is None) + self.assertTrue(full_cflow(g) is not None) + c = extract_circuit(g.copy()) + c2 = extract_simple(g.copy(), synth_phase_polys=True) + self.assertTrue(c.verify_equality(c2)) if __name__ == '__main__': diff --git a/tests/test_phase_gadget_graph.json b/tests/test_phase_gadget_graph.json new file mode 100644 index 00000000..71c97cdf --- /dev/null +++ b/tests/test_phase_gadget_graph.json @@ -0,0 +1 @@ +"{\"wire_vertices\": {\"b0\": {\"annotation\": {\"boundary\": true, \"coord\": [-1, 0], \"input\": 0}}, \"b1\": {\"annotation\": {\"boundary\": true, \"coord\": [-1, -1], \"input\": 1}}, \"b2\": {\"annotation\": {\"boundary\": true, \"coord\": [-1, -2], \"input\": 2}}, \"b3\": {\"annotation\": {\"boundary\": true, \"coord\": [-1, -3], \"input\": 3}}, \"b4\": {\"annotation\": {\"boundary\": true, \"coord\": [6, 0], \"output\": 0}}, \"b5\": {\"annotation\": {\"boundary\": true, \"coord\": [6, -1], \"output\": 1}}, \"b6\": {\"annotation\": {\"boundary\": true, \"coord\": [6, -2], \"output\": 2}}, \"b7\": {\"annotation\": {\"boundary\": true, \"coord\": [6, -3], \"output\": 3}}}, \"node_vertices\": {\"v0\": {\"annotation\": {\"coord\": [0.5, 1]}, \"data\": {\"type\": \"Z\"}}, \"v1\": {\"annotation\": {\"coord\": [0.5, 2]}, \"data\": {\"type\": \"Z\", \"value\": \"\\u03c0\"}}, \"v2\": {\"annotation\": {\"coord\": [1.5, 1]}, \"data\": {\"type\": \"Z\"}}, \"v3\": {\"annotation\": {\"coord\": [1.5, 2]}, \"data\": {\"type\": \"Z\", \"value\": \"\\u03c0\"}}, \"v4\": {\"annotation\": {\"coord\": [1, 0]}, \"data\": {\"type\": \"Z\"}}, \"v5\": {\"annotation\": {\"coord\": [2.5, 1]}, \"data\": {\"type\": \"Z\"}}, \"v6\": {\"annotation\": {\"coord\": [2.5, 2]}, \"data\": {\"type\": \"Z\", \"value\": \"\\u03c0\"}}, \"v7\": {\"annotation\": {\"coord\": [2, -3]}, \"data\": {\"type\": \"Z\"}}, \"v8\": {\"annotation\": {\"coord\": [3.5, 1]}, \"data\": {\"type\": \"Z\"}}, \"v9\": {\"annotation\": {\"coord\": [3.5, 2]}, \"data\": {\"type\": \"Z\", \"value\": \"\\u03c0\"}}, \"v10\": {\"annotation\": {\"coord\": [3, -1]}, \"data\": {\"type\": \"Z\"}}, \"v11\": {\"annotation\": {\"coord\": [4.5, 1]}, \"data\": {\"type\": \"Z\"}}, \"v12\": {\"annotation\": {\"coord\": [4.5, 2]}, \"data\": {\"type\": \"Z\", \"value\": \"\\u03c0\"}}, \"v13\": {\"annotation\": {\"coord\": [5.5, 1]}, \"data\": {\"type\": \"Z\"}}, \"v14\": {\"annotation\": {\"coord\": [5.5, 2]}, \"data\": {\"type\": \"Z\", \"value\": \"\\u03c0\"}}, \"v15\": {\"annotation\": {\"coord\": [5, -2]}, \"data\": {\"type\": \"Z\"}}, \"v16\": {\"annotation\": {\"coord\": [-1, 1]}, \"data\": {\"type\": \"Z\"}}, \"v17\": {\"annotation\": {\"coord\": [-1, 1]}, \"data\": {\"type\": \"Z\"}}, \"v18\": {\"annotation\": {\"coord\": [-1, 1]}, \"data\": {\"type\": \"Z\"}}, \"v19\": {\"annotation\": {\"coord\": [-1, 1]}, \"data\": {\"type\": \"Z\"}}, \"v20\": {\"annotation\": {\"coord\": [-1, 1]}, \"data\": {\"type\": \"Z\"}}, \"v21\": {\"annotation\": {\"coord\": [-1, 1]}, \"data\": {\"type\": \"Z\"}}, \"v22\": {\"annotation\": {\"coord\": [-1, 1]}, \"data\": {\"type\": \"Z\"}}, \"v23\": {\"annotation\": {\"coord\": [-1, 1]}, \"data\": {\"type\": \"Z\"}}, \"v24\": {\"annotation\": {\"coord\": [0.5, 1.5]}, \"data\": {\"type\": \"hadamard\", \"is_edge\": \"true\"}}, \"v25\": {\"annotation\": {\"coord\": [1.75, 0.0]}, \"data\": {\"type\": \"hadamard\", \"is_edge\": \"true\"}}, \"v26\": {\"annotation\": {\"coord\": [2.75, -0.5]}, \"data\": {\"type\": \"hadamard\", \"is_edge\": \"true\"}}, \"v27\": {\"annotation\": {\"coord\": [1.5, 1.5]}, \"data\": {\"type\": \"hadamard\", \"is_edge\": \"true\"}}, \"v28\": {\"annotation\": {\"coord\": [1.25, 0.5]}, \"data\": {\"type\": \"hadamard\", \"is_edge\": \"true\"}}, \"v29\": {\"annotation\": {\"coord\": [1.75, 0.5]}, \"data\": {\"type\": \"hadamard\", \"is_edge\": \"true\"}}, \"v30\": {\"annotation\": {\"coord\": [2.25, 0.5]}, \"data\": {\"type\": \"hadamard\", \"is_edge\": \"true\"}}, \"v31\": {\"annotation\": {\"coord\": [2.75, 0.5]}, \"data\": {\"type\": \"hadamard\", \"is_edge\": \"true\"}}, \"v32\": {\"annotation\": {\"coord\": [3.25, 0.5]}, \"data\": {\"type\": \"hadamard\", \"is_edge\": \"true\"}}, \"v33\": {\"annotation\": {\"coord\": [0.0, 0.5]}, \"data\": {\"type\": \"hadamard\", \"is_edge\": \"true\"}}, \"v34\": {\"annotation\": {\"coord\": [2.5, 1.5]}, \"data\": {\"type\": \"hadamard\", \"is_edge\": \"true\"}}, \"v35\": {\"annotation\": {\"coord\": [2.25, -1.0]}, \"data\": {\"type\": \"hadamard\", \"is_edge\": \"true\"}}, \"v36\": {\"annotation\": {\"coord\": [2.75, -1.0]}, \"data\": {\"type\": \"hadamard\", \"is_edge\": \"true\"}}, \"v37\": {\"annotation\": {\"coord\": [0.5, -1.0]}, \"data\": {\"type\": \"hadamard\", \"is_edge\": \"true\"}}, \"v38\": {\"annotation\": {\"coord\": [3.5, 1.5]}, \"data\": {\"type\": \"hadamard\", \"is_edge\": \"true\"}}, \"v39\": {\"annotation\": {\"coord\": [3.25, 0.0]}, \"data\": {\"type\": \"hadamard\", \"is_edge\": \"true\"}}, \"v40\": {\"annotation\": {\"coord\": [3.75, 0.0]}, \"data\": {\"type\": \"hadamard\", \"is_edge\": \"true\"}}, \"v41\": {\"annotation\": {\"coord\": [4.25, 0.0]}, \"data\": {\"type\": \"hadamard\", \"is_edge\": \"true\"}}, \"v42\": {\"annotation\": {\"coord\": [1.0, 0.0]}, \"data\": {\"type\": \"hadamard\", \"is_edge\": \"true\"}}, \"v43\": {\"annotation\": {\"coord\": [4.5, 1.5]}, \"data\": {\"type\": \"hadamard\", \"is_edge\": \"true\"}}, \"v44\": {\"annotation\": {\"coord\": [5.5, 1.5]}, \"data\": {\"type\": \"hadamard\", \"is_edge\": \"true\"}}, \"v45\": {\"annotation\": {\"coord\": [5.25, -0.5]}, \"data\": {\"type\": \"hadamard\", \"is_edge\": \"true\"}}, \"v46\": {\"annotation\": {\"coord\": [2.0, -0.5]}, \"data\": {\"type\": \"hadamard\", \"is_edge\": \"true\"}}, \"v47\": {\"annotation\": {\"coord\": [-1.0, 1.0]}, \"data\": {\"type\": \"hadamard\", \"is_edge\": \"true\"}}, \"v48\": {\"annotation\": {\"coord\": [-1.0, 1.0]}, \"data\": {\"type\": \"hadamard\", \"is_edge\": \"true\"}}, \"v49\": {\"annotation\": {\"coord\": [-1.0, 1.0]}, \"data\": {\"type\": \"hadamard\", \"is_edge\": \"true\"}}, \"v50\": {\"annotation\": {\"coord\": [-1.0, 1.0]}, \"data\": {\"type\": \"hadamard\", \"is_edge\": \"true\"}}}, \"undir_edges\": {\"e0\": {\"src\": \"b0\", \"tgt\": \"v16\"}, \"e1\": {\"src\": \"b1\", \"tgt\": \"v20\"}, \"e2\": {\"src\": \"b2\", \"tgt\": \"v15\"}, \"e3\": {\"src\": \"b3\", \"tgt\": \"v18\"}, \"e4\": {\"src\": \"v0\", \"tgt\": \"v24\"}, \"e5\": {\"src\": \"v1\", \"tgt\": \"v24\"}, \"e6\": {\"src\": \"v0\", \"tgt\": \"v25\"}, \"e7\": {\"src\": \"v10\", \"tgt\": \"v25\"}, \"e8\": {\"src\": \"v0\", \"tgt\": \"v26\"}, \"e9\": {\"src\": \"v15\", \"tgt\": \"v26\"}, \"e10\": {\"src\": \"v2\", \"tgt\": \"v27\"}, \"e11\": {\"src\": \"v3\", \"tgt\": \"v27\"}, \"e12\": {\"src\": \"v2\", \"tgt\": \"v28\"}, \"e13\": {\"src\": \"v4\", \"tgt\": \"v28\"}, \"e14\": {\"src\": \"v4\", \"tgt\": \"v29\"}, \"e15\": {\"src\": \"v5\", \"tgt\": \"v29\"}, \"e16\": {\"src\": \"v4\", \"tgt\": \"v30\"}, \"e17\": {\"src\": \"v8\", \"tgt\": \"v30\"}, \"e18\": {\"src\": \"v4\", \"tgt\": \"b4\"}, \"e19\": {\"src\": \"v4\", \"tgt\": \"v31\"}, \"e20\": {\"src\": \"v11\", \"tgt\": \"v31\"}, \"e21\": {\"src\": \"v4\", \"tgt\": \"v32\"}, \"e22\": {\"src\": \"v13\", \"tgt\": \"v32\"}, \"e23\": {\"src\": \"v4\", \"tgt\": \"v33\"}, \"e24\": {\"src\": \"v17\", \"tgt\": \"v33\"}, \"e25\": {\"src\": \"v5\", \"tgt\": \"v34\"}, \"e26\": {\"src\": \"v6\", \"tgt\": \"v34\"}, \"e27\": {\"src\": \"v5\", \"tgt\": \"v35\"}, \"e28\": {\"src\": \"v7\", \"tgt\": \"v35\"}, \"e29\": {\"src\": \"v7\", \"tgt\": \"b7\"}, \"e30\": {\"src\": \"v7\", \"tgt\": \"v36\"}, \"e31\": {\"src\": \"v8\", \"tgt\": \"v36\"}, \"e32\": {\"src\": \"v7\", \"tgt\": \"v37\"}, \"e33\": {\"src\": \"v19\", \"tgt\": \"v37\"}, \"e34\": {\"src\": \"v8\", \"tgt\": \"v38\"}, \"e35\": {\"src\": \"v9\", \"tgt\": \"v38\"}, \"e36\": {\"src\": \"v8\", \"tgt\": \"v39\"}, \"e37\": {\"src\": \"v10\", \"tgt\": \"v39\"}, \"e38\": {\"src\": \"v10\", \"tgt\": \"v40\"}, \"e39\": {\"src\": \"v11\", \"tgt\": \"v40\"}, \"e40\": {\"src\": \"v10\", \"tgt\": \"b5\"}, \"e41\": {\"src\": \"v10\", \"tgt\": \"v41\"}, \"e42\": {\"src\": \"v13\", \"tgt\": \"v41\"}, \"e43\": {\"src\": \"v10\", \"tgt\": \"v42\"}, \"e44\": {\"src\": \"v21\", \"tgt\": \"v42\"}, \"e45\": {\"src\": \"v11\", \"tgt\": \"v43\"}, \"e46\": {\"src\": \"v12\", \"tgt\": \"v43\"}, \"e47\": {\"src\": \"v13\", \"tgt\": \"v44\"}, \"e48\": {\"src\": \"v14\", \"tgt\": \"v44\"}, \"e49\": {\"src\": \"v13\", \"tgt\": \"v45\"}, \"e50\": {\"src\": \"v15\", \"tgt\": \"v45\"}, \"e51\": {\"src\": \"v15\", \"tgt\": \"v46\"}, \"e52\": {\"src\": \"v23\", \"tgt\": \"v46\"}, \"e53\": {\"src\": \"b6\", \"tgt\": \"v22\"}, \"e54\": {\"src\": \"v16\", \"tgt\": \"v47\"}, \"e55\": {\"src\": \"v17\", \"tgt\": \"v47\"}, \"e56\": {\"src\": \"v18\", \"tgt\": \"v48\"}, \"e57\": {\"src\": \"v19\", \"tgt\": \"v48\"}, \"e58\": {\"src\": \"v20\", \"tgt\": \"v49\"}, \"e59\": {\"src\": \"v21\", \"tgt\": \"v49\"}, \"e60\": {\"src\": \"v22\", \"tgt\": \"v50\"}, \"e61\": {\"src\": \"v23\", \"tgt\": \"v50\"}}, \"variable_types\": {}, \"scalar\": \"{\\\"power2\\\": 0, \\\"phase\\\": \\\"0\\\"}\"}" \ No newline at end of file diff --git a/tests/test_simplify.py b/tests/test_simplify.py index 46d1a340..b52cecd7 100644 --- a/tests/test_simplify.py +++ b/tests/test_simplify.py @@ -66,6 +66,9 @@ def test_spider_simp(self): def test_id_simp(self): self.func_test(id_simp) + + def test_id_fuse_simp(self): + self.func_test(id_fuse_simp) def test_to_gh(self): self.func_test(to_gh) @@ -96,11 +99,51 @@ def test_supplementarity_simp(self): def test_teleport_reduce(self): """Tests whether teleport_reduce preserves semantics on a set of circuits that have been broken before.""" + for i,s in enumerate([qasm_1,qasm_2,qasm_3,qasm_4]): + with self.subTest(i=i): + c = qasm(s) + g = c.to_graph() + teleport_reduce(g) + c2 = Circuit.from_graph(g) + self.assertTrue(c.verify_equality(c2)) + + def test_teleport_reduce_phase_storing(self): + """Tests whether teleport_reduce preserves semantics with phases being stored then randomly placed.""" + for i,s in enumerate([qasm_1,qasm_2,qasm_3,qasm_4]): + with self.subTest(i=i): + c = qasm(s) + g = c.to_graph() + teleport_reduce(g, store=True) + for group, vertices in list(g.group_data.items()): + v = random.choice(list(vertices)) # Choose a random vertex to place the phase on + phase = g.phase_sum[group] * g.phase_mult[v] + child_v = g.leaf_vertex(v) + g.add_to_phase(child_v, phase) + c2 = Circuit.from_graph(g) + self.assertTrue(c.verify_equality(c2)) + + def test_flow_opt(self): + """Tests whether flow_2Q_simp preserves semantics.""" + for i,g in enumerate(self.circuits): + with self.subTest(i=i): + c = Circuit.from_graph(g) + teleport_reduce(g) + to_graph_like(g, assert_bound_connections=False) + flow_2Q_simp(g, cFlow=True, rewrites=['id_fuse','lcomp','pivot'], max_lc_unfusions=2, max_p_unfusions=2) + c2 = extract_simple(g, up_to_perm=False).to_basic_gates() + self.assertTrue(c.verify_equality(c2)) + + def test_flow_opt_with_phase_jumping(self): + """Tests whether flow_2Q_simp preserves semantics when phase jumping is allowed.""" for i,s in enumerate([qasm_1,qasm_2,qasm_3,qasm_4]): with self.subTest(i=i): c = qasm(s) g = c.to_graph() - c2 = Circuit.from_graph(teleport_reduce(g)) + teleport_reduce(g, store=True) + to_graph_like(g, assert_bound_connections=False) + flow_2Q_simp(g, cFlow=True, rewrites=['id_fuse','lcomp','pivot'], max_lc_unfusions=2, max_p_unfusions=2) + g.place_tracked_phases() + c2 = extract_simple(g, up_to_perm=False).to_basic_gates() self.assertTrue(c.verify_equality(c2)) qasm_1 = """OPENQASM 2.0; From 547ab6a65c5c71831e4636b3f5ea84ac811cdbf4 Mon Sep 17 00:00:00 2001 From: Calum Holker Date: Wed, 17 Jan 2024 23:52:52 +0000 Subject: [PATCH 07/14] updated teleport_reduce usage --- pyzx/scripts/circ2circ.py | 2 +- pyzx/scripts/circuit_router.py | 4 ++-- tests/long_test.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pyzx/scripts/circ2circ.py b/pyzx/scripts/circ2circ.py index 18cd3029..640fd449 100644 --- a/pyzx/scripts/circ2circ.py +++ b/pyzx/scripts/circ2circ.py @@ -73,7 +73,7 @@ def main(args): g = c.to_graph() if options.verbose: print("Running simplification algorithm...") if options.simp == 'tele': - g = simplify.teleport_reduce(g,quiet=(not options.verbose)) + simplify.teleport_reduce(g) c2 = Circuit.from_graph(g) c2 = c2.split_phase_gates() else: diff --git a/pyzx/scripts/circuit_router.py b/pyzx/scripts/circuit_router.py index 10c0f15e..d104e219 100644 --- a/pyzx/scripts/circuit_router.py +++ b/pyzx/scripts/circuit_router.py @@ -413,7 +413,7 @@ def route_circuit( compiled_circuit.compile() else: g = c.to_graph() - g = teleport_reduce(g) + teleport_reduce(g) interior_clifford_simp(g) g = g.copy() # reduces the number of gates when extracting. if type(architecture) == type(""): @@ -486,7 +486,7 @@ def fitness(permutation): for gate in reversed(c.gates): rev_c.add_gate(gate) rev_g = rev_c.to_graph() - rev_g = teleport_reduce(rev_g) + teleport_reduce(rev_g) interior_clifford_simp(rev_g) rev_g = rev_g.copy() # reduces the number of gates when extracting. diff --git a/tests/long_test.py b/tests/long_test.py index a3b10b6b..d8b9e3b5 100644 --- a/tests/long_test.py +++ b/tests/long_test.py @@ -77,7 +77,7 @@ def do_tests(qubits, depth, iterations, test_clifford_graph=True): #to_gh(g) #id_simp(g,quiet=True) #spider_simp(g,quiet=True) - g = teleport_reduce(g) + teleport_reduce(g) steps.append("teleport_reduce") compare(t,g, False) #c1 = zx.Circuit.from_graph(g,split_phases=True).to_basic_gates() From 5a381a017d88d3694060f210bb7b2a2765cfe16a Mon Sep 17 00:00:00 2001 From: Calum Holker Date: Thu, 18 Jan 2024 00:21:06 +0000 Subject: [PATCH 08/14] fixed broken demo notebooks --- demos/Challenge_circuit_extraction.ipynb | 15 +--- demos/LocalSearch.ipynb | 18 ++++- demos/Time Benchmark.ipynb | 12 +-- demos/ZXW_demo.ipynb | 29 +++---- demos/hyperpivot.ipynb | 98 ++++++++++-------------- 5 files changed, 77 insertions(+), 95 deletions(-) diff --git a/demos/Challenge_circuit_extraction.ipynb b/demos/Challenge_circuit_extraction.ipynb index 27617b20..18ae79bf 100644 --- a/demos/Challenge_circuit_extraction.ipynb +++ b/demos/Challenge_circuit_extraction.ipynb @@ -44,7 +44,7 @@ } ], "source": [ - "c = zx.Circuit.load('../circuits/Fast/tof_3_before').to_basic_gates()\n", + "c = zx.Circuit.load('../circuits/benchmarking_circuits/Fast/before/tof_3').to_basic_gates()\n", "g = c.to_graph()\n", "g1 = g.copy()\n", "zx.simplify.full_reduce(g1)\n", @@ -674,20 +674,13 @@ "source": [ "zx.draw(g2)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "pyzx", "language": "python", - "name": "python3" + "name": "pyzx" }, "language_info": { "codemirror_mode": { @@ -699,7 +692,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.4" + "version": "3.11.3" } }, "nbformat": 4, diff --git a/demos/LocalSearch.ipynb b/demos/LocalSearch.ipynb index efc93086..e88d40d2 100644 --- a/demos/LocalSearch.ipynb +++ b/demos/LocalSearch.ipynb @@ -1,5 +1,15 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "86c623f0", + "metadata": {}, + "source": [ + "\n", + "WARNING: This notebook is currently broken.\n", + "" + ] + }, { "cell_type": "code", "execution_count": 1, @@ -76,7 +86,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -206,9 +216,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "pyzx", "language": "python", - "name": "python3" + "name": "pyzx" }, "language_info": { "codemirror_mode": { @@ -220,7 +230,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.11.3" } }, "nbformat": 4, diff --git a/demos/Time Benchmark.ipynb b/demos/Time Benchmark.ipynb index 6f278dc3..53685aed 100644 --- a/demos/Time Benchmark.ipynb +++ b/demos/Time Benchmark.ipynb @@ -16,7 +16,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -31,7 +31,7 @@ "x,y = [],[]\n", "for i in range(1,101):\n", " gate_count = 100+i*23; x.append(gate_count)\n", - " g = zx.generate.CNOT_HAD_PHASE_circuit(qubits=20, gates=gate_count, p_had=0.1, p_t=0.15,clifford=True).to_graph()\n", + " g = zx.generate.CNOT_HAD_PHASE_circuit(qubits=20, depth=gate_count, p_had=0.1, p_t=0.15,clifford=True).to_graph()\n", " t = time.time(); zx.simplify.clifford_simp(g,quiet=True)\n", " y.append(time.time()-t)\n", " if i%10 == 0: print(i,end='. ')" @@ -39,7 +39,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -1277,9 +1277,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "pyzx", "language": "python", - "name": "python3" + "name": "pyzx" }, "language_info": { "codemirror_mode": { @@ -1291,7 +1291,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.4" + "version": "3.11.3" } }, "nbformat": 4, diff --git a/demos/ZXW_demo.ipynb b/demos/ZXW_demo.ipynb index 3812a573..053ae0aa 100644 --- a/demos/ZXW_demo.ipynb +++ b/demos/ZXW_demo.ipynb @@ -21,12 +21,14 @@ "metadata": {}, "outputs": [], "source": [ - "import pyzx as zx" + "import sys; sys.path.append('..')\n", + "import pyzx as zx\n", + "from fractions import Fraction" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -381,7 +383,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -1091,7 +1093,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -1446,7 +1448,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -2140,7 +2142,7 @@ ], "source": [ "# the z spider is a special case of the z box and it can be converted using the z to zbox method\n", - "z_spider = zx.generate.spider(\"Z\", 4, 5, 1/2)\n", + "z_spider = zx.generate.spider(\"Z\", 4, 5, Fraction(1,2))\n", "zx.draw(z_spider)\n", "zx.rules.z_to_z_box(z_spider, zx.rules.match_z_to_z_box(z_spider))\n", "zx.draw(z_spider)" @@ -2148,7 +2150,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -2855,20 +2857,13 @@ "zx.spider_simp(zbox_diag)\n", "zx.draw(zbox_diag)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { "kernelspec": { - "display_name": ".venv", + "display_name": "pyzx", "language": "python", - "name": "python3" + "name": "pyzx" }, "language_info": { "codemirror_mode": { @@ -2880,7 +2875,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.0" + "version": "3.11.3" }, "orig_nbformat": 4 }, diff --git a/demos/hyperpivot.ipynb b/demos/hyperpivot.ipynb index e180ec5a..1e95649f 100644 --- a/demos/hyperpivot.ipynb +++ b/demos/hyperpivot.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 8, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -15,7 +15,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -253,7 +253,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -1349,7 +1349,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -3146,7 +3146,7 @@ "source": [ "h = g.copy()\n", "zx.simplify.spider_simp(h, quiet=True)\n", - "zx.hsimplify.to_hbox(h)\n", + "zx.hsimplify.to_hypergraph_form(h)\n", "m = zx.hrules.match_hpivot(h)\n", "print(m)\n", "display(zx.draw(h,labels=True))\n", @@ -3156,7 +3156,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -3863,7 +3863,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -3885,60 +3885,51 @@ "cell_type": "code", "execution_count": 9, "metadata": {}, - "outputs": [], - "source": [ - "dir_fast_circuits = os.path.join('..', 'circuits', 'Fast')" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Circuit qubits gates Z H reduced\n", - "tof_3_before 5 9 10 2 True\n", - "qcla_adder_10_before 36 113 72 85 True\n", - "tof_10_before 19 51 38 9 True\n", - "gf2^4_mult_before 12 51 24 20 True\n", - "barenco_tof_4_before 7 18 14 1 True\n", - "qcla_com_7_before 24 95 48 4117 True\n", - "barenco_tof_10_before 19 66 38 1 True\n", - "gf2^7_mult_before 21 153 42 67 True\n", - "gf2^9_mult_before 27 251 54 101 True\n", - "barenco_tof_3_before 5 10 10 1 True\n", - "mod5_4_before 5 15 10 4 True\n", - "QFT16_before 16 586 32 114 True\n", - "vbe_adder_3_before 10 30 20 15 True\n", - "gf2^5_mult_before 15 79 30 31 True\n", - "csum_mux_9_corrected_before 30 56 60 28 True\n", - "adder_8_before 24 216 48 101 True\n", - "QFT8_before 8 148 16 28 True\n", - "mod_red_21_before 11 74 22 51 True\n", - "gf2^8_mult_before 24 213 48 113 True\n", - "rc_adder_6_before 14 68 28 415 True\n", - "gf2^10_mult_before 30 309 60 127 True\n", - "tof_5_before 9 21 18 4 True\n", - "Adder8_before 23 105 46 44 True\n", - "mod_mult_55_before 9 35 18 13 True\n", - "tof_4_before 7 15 14 3 True\n", - "csla_mux_3_original_before 15 50 30 35 True\n", - "qcla_mod_7_before 26 176 52 2057 True\n", - "barenco_tof_5_before 9 26 18 1 True\n", - "gf2^6_mult_before 18 113 36 47 True\n" + "tof_3 5 9 10 2 True\n", + "tof_4 7 15 14 3 True\n", + "csum_mux_9_corrected 30 56 60 28 True\n", + "rc_adder_6 14 68 28 411 True\n", + "tof_5 9 21 18 4 True\n", + "hwb6.qc 7 79 19 144 False\n", + "mod5_4 5 15 10 4 True\n", + "Adder8 23 105 46 44 True\n", + "qcla_adder_10 36 113 72 85 True\n", + "mod_mult_55 9 35 18 13 True\n", + "qcla_com_7 24 95 48 4117 True\n", + "QFT8 8 148 16 28 True\n", + "gf2^6_mult 18 113 36 47 True\n", + "barenco_tof_4 7 18 14 1 True\n", + "barenco_tof_3 5 10 10 3 True\n", + "barenco_tof_10 19 66 38 9 True\n", + "barenco_tof_5 9 26 18 1 True\n", + "grover_5.qc 9 255 18 20 True\n", + "gf2^7_mult 21 153 42 67 True\n", + "csla_mux_3_original 15 50 30 35 True\n", + "gf2^4_mult 12 51 24 20 True\n", + "qcla_mod_7 26 176 52 2057 True\n", + "gf2^8_mult 24 213 48 113 True\n", + "adder_8 24 216 48 101 True\n", + "gf2^5_mult 15 79 30 31 True\n", + "vbe_adder_3 10 30 20 15 True\n", + "ham15-low.qc 17 167 34 192 True\n", + "mod_red_21 11 74 22 51 True\n", + "tof_10 19 51 38 9 True\n", + "qft_4.qc 5 155 37 25 False\n" ] } ], "source": [ - "d = os.path.join('..', 'circuits', 'Fast')\n", + "d = os.path.join('..', 'circuits', 'benchmarking_circuits', 'Fast', 'before')\n", "print('Circuit'.ljust(30) + ' qubits' + ' gates' + ' Z' + ' H' + ' reduced')\n", "for f in os.listdir(d):\n", " f1 = os.path.join(d,f)\n", " if f.find('QFTAdd8') != -1: continue # takes too long\n", - " if not os.path.isfile(f1) or f.find('before') == -1: continue\n", " print(f.ljust(30), end='')\n", " \n", " c = zx.Circuit.load(f1)\n", @@ -3958,20 +3949,13 @@ " \n", " print(g.qubit_count() * 2 == z)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "pyzx", "language": "python", - "name": "python3" + "name": "pyzx" }, "language_info": { "codemirror_mode": { @@ -3983,7 +3967,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.4" + "version": "3.11.3" } }, "nbformat": 4, From 19ba5960718b3d8169b718137c7f406f19b6b0ff Mon Sep 17 00:00:00 2001 From: Calum Holker Date: Thu, 18 Jan 2024 00:27:31 +0000 Subject: [PATCH 09/14] updated features demo notebook --- demos/AllFeatures.ipynb | 265 +++++++++++++++++++++++++++++++++------- pyzx/extract.py | 4 +- pyzx/simplify.py | 8 +- 3 files changed, 228 insertions(+), 49 deletions(-) diff --git a/demos/AllFeatures.ipynb b/demos/AllFeatures.ipynb index af029675..5875ffa8 100644 --- a/demos/AllFeatures.ipynb +++ b/demos/AllFeatures.ipynb @@ -16,7 +16,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -40,11 +40,11 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ - "fname = os.path.join('..','circuits','Fast', 'mod5_4_before')\n", + "fname = os.path.join('..','circuits','benchmarking_circuits', 'Fast', 'before', 'mod5_4')\n", "circ = zx.Circuit.load(fname)\n", "# Alternatively we could have done:\n", "# circ = zx.Circuit.from_quipper_file(fname)\n", @@ -60,7 +60,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -76,7 +76,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -92,7 +92,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -108,7 +108,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -124,7 +124,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -143,7 +143,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -152,7 +152,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -161,7 +161,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -181,7 +181,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -200,7 +200,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -217,7 +217,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -239,7 +239,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -305,11 +305,11 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ - "fname = os.path.join('..','circuits','Fast', 'mod5_4_before')\n", + "fname = os.path.join('..','circuits','benchmarking_circuits', 'Fast', 'before', 'mod5_4')\n", "circ = zx.Circuit.load(fname).to_basic_gates()\n", "print(\"original T-count:\", zx.tcount(circ))\n", "zx.draw(circ)" @@ -324,7 +324,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -350,7 +350,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ @@ -374,7 +374,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ @@ -392,7 +392,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -413,7 +413,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": {}, "outputs": [], "source": [ @@ -434,7 +434,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "metadata": {}, "outputs": [], "source": [ @@ -459,7 +459,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "metadata": {}, "outputs": [], "source": [ @@ -488,18 +488,18 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "For extracting circuits out of ZX-graphs there is only a single method in PyZX that you have to call: ``zx.extract_circuit``. This method should always work *when dealing with graphs produced by ``full_reduce``.* There is no guarantee that it can extract circuits from arbitrary ZX-diagrams.\n", + "For extracting circuits out of ZX-graphs there is a method in PyZX called: ``zx.extract_circuit``. This method should always work *when dealing with graphs produced by ``full_reduce``.* There is no guarantee that it can extract circuits from arbitrary ZX-diagrams.\n", "\n", "Let's see what this method does when applied to the circuit from the previous section:" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ - "fname = os.path.join('..','circuits','Fast', 'mod5_4_before')\n", + "fname = os.path.join('..','circuits','benchmarking_circuits', 'Fast', 'before', 'mod5_4')\n", "circ = zx.Circuit.load(fname).to_basic_gates()\n", "print(\"The original circuit:\")\n", "zx.draw(circ)\n", @@ -526,7 +526,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 24, "metadata": {}, "outputs": [], "source": [ @@ -545,7 +545,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "metadata": {}, "outputs": [], "source": [ @@ -568,7 +568,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": {}, "outputs": [], "source": [ @@ -589,7 +589,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "metadata": {}, "outputs": [], "source": [ @@ -608,7 +608,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 28, "metadata": {}, "outputs": [], "source": [ @@ -624,7 +624,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "metadata": {}, "outputs": [], "source": [ @@ -650,15 +650,16 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, "metadata": {}, "outputs": [], "source": [ - "fname = os.path.join('..','circuits','Fast', 'mod5_4_before')\n", + "fname = os.path.join('..','circuits','benchmarking_circuits', 'Fast', 'before', 'mod5_4')\n", "circ = zx.Circuit.load(fname).to_basic_gates()\n", "print(\"The original circuit:\")\n", "zx.draw(circ)\n", - "g = zx.simplify.teleport_reduce(circ.to_graph(),quiet=True)\n", + "g = circ.to_graph()\n", + "zx.simplify.teleport_reduce(g)\n", "print(\"Circuit after phase teleportation:\")\n", "zx.draw(g)" ] @@ -672,26 +673,204 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "zx.compare_tensors(circ, g)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "# Two-qubit gate count optimisation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To illustrate how the previous strategy can in fact worsen the optimised circuit in terms of total gate count and two-qubit gate count, let's look at another, bigger, circuit:" + ] + }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The original circuit:\n", + "Circuit csum_mux_9_corrected on 30 qubits with 448 gates.\n", + " 196 is the T-count\n", + " 252 Cliffords among which\n", + " 168 2-qubit gates (168 CNOT, 0 other) and\n", + " 56 Hadamard gates.\n", + "\n", + "The optimised circuit:\n", + "Circuit on 30 qubits with 496 gates.\n", + " 84 is the T-count\n", + " 412 Cliffords among which\n", + " 349 2-qubit gates (314 CNOT, 35 other) and\n", + " 28 Hadamard gates.\n" + ] + } + ], + "source": [ + "fname = os.path.join('..','circuits','benchmarking_circuits', 'Fast', 'before', 'csum_mux_9_corrected')\n", + "circ = zx.Circuit.load(fname).to_basic_gates()\n", + "print(\"The original circuit:\")\n", + "print(circ.stats(), end='\\n\\n')\n", + "\n", + "g = circ.to_graph()\n", + "zx.simplify.full_reduce(g,quiet=True)\n", + "g.normalize()\n", + "new_circ = zx.extract_circuit(g)\n", + "optimized_circ = zx.optimize.basic_optimization(new_circ.to_basic_gates(),do_swaps=False).to_basic_gates()\n", + "print(\"The optimised circuit:\")\n", + "print(optimized_circ.stats())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As you can see the both the total gate count and two-qubit gate counts have in fact *increased* from the original. The T-count has been significantly reduced, but we could have achieved this by using phase teleportation. Let's see if using ``phase_block_optimize`` can help us here:" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Circuit on 30 qubits with 539 gates.\n", + " 74 is the T-count\n", + " 465 Cliffords among which\n", + " 391 2-qubit gates (319 CNOT, 72 other) and\n", + " 28 Hadamard gates.\n" + ] + } + ], + "source": [ + "final_circ = zx.optimize.phase_block_optimize(optimized_circ).to_basic_gates()\n", + "final_circ = zx.optimize.basic_optimization(final_circ) # We call this again, as it does some extra processing\n", + "print(final_circ.stats())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As demonstrated here, ``phase_block_optimize`` always attempts to reduce T-count, but at the cost of many additional two-qubit gates. \n", + "\n", + "Let's look at a different strategy we can use, specifically with the goal of minimising the number of two-qubit gates (while maintaining the same T-count reductions).\n", + "\n", + "The first step is to apply phase teleportation to our circuit. This allows us to reap the rewards of ``full_reduce`` without the downside of increased gates after extraction." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Circuit on 30 qubits with 364 gates.\n", + " 84 is the T-count\n", + " 280 Cliffords among which\n", + " 168 2-qubit gates (168 CNOT, 0 other) and\n", + " 56 Hadamard gates.\n" + ] + } + ], + "source": [ + "fname = os.path.join('..','circuits','benchmarking_circuits', 'Fast', 'before', 'csum_mux_9_corrected')\n", + "circ = zx.Circuit.load(fname).to_basic_gates()\n", + "g = circ.to_graph()\n", + "zx.simplify.teleport_reduce(g)\n", + "print(zx.Circuit.from_graph(g).stats())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can then apply a method which *selectively* applies only the transformations of ``full_reduce`` which reduce the two-qubit gate count of the resulting circuit. To do this we must first transform the diagram into what is called graph-like form. This allows us to evaluate graph theoretic properties of the diagram. In particular if we assert that all transformations preserve a property called *cflow*, then instead of the usual extraction function we can use a method called ``simple_extract``. \n", + "\n", + "The method which applies the selective simplification of our ZX-diagram is called ``flow_2Q_simp``. The full details can be found in [Causal flow preserving optimisation of quantum circuits in the ZX-calculus](https://arxiv.org/abs/2312.02793).\n", + "\n", + "Let's apply it and see how it does:" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Circuit on 30 qubits with 288 gates.\n", + " 84 is the T-count\n", + " 204 Cliffords among which\n", + " 140 2-qubit gates (125 CNOT, 15 other) and\n", + " 28 Hadamard gates.\n" + ] + } + ], + "source": [ + "zx.to_graph_like(g)\n", + "zx.flow_2Q_simp(g)\n", + "g.normalize()\n", + "new_circ = zx.extract_simple(g)\n", + "optimized_circ = zx.optimize.basic_optimization(new_circ.to_basic_gates(),do_swaps=False).to_basic_gates()\n", + "print(optimized_circ.stats())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As you can see this significantly reduces the number of gates. This method will *never* increase the number of two-qubit gates. Let us finally confirm its equality:" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "circ.verify_equality(optimized_circ)" + ] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "pyzx", "language": "python", - "name": "python3" + "name": "pyzx" }, "language_info": { "codemirror_mode": { @@ -703,7 +882,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.11.3" } }, "nbformat": 4, diff --git a/pyzx/extract.py b/pyzx/extract.py index 7d7a2f3b..a038b8ce 100644 --- a/pyzx/extract.py +++ b/pyzx/extract.py @@ -711,13 +711,13 @@ def extract_circuit( return graph_to_swaps(g, up_to_perm) + c -def extract_simple(g: BaseGraph[VT, ET], up_to_perm: bool = True, synth_phase_polys: bool = False) -> Circuit: +def extract_simple(g: BaseGraph[VT, ET], up_to_perm: bool = False, synth_phase_polys: bool = False) -> Circuit: """A simplified circuit extractor that only works on graphs with causal flow. Also works with an extension of causal flow that allows phase gadgets under certain conditions. Phase gadgets are extracted using :func:`phase_poly_synth` :param g: The ZX-diagram to be extracted as a circuit - :param up_to_perm: If True, returns a circuit that is equivalent to the given graph up to a permutation of the inputs, defaults to True + :param up_to_perm: If True, returns a circuit that is equivalent to the given graph up to a permutation of the inputs, defaults to False :param synth_phase_polys: If True, synthesises any extractable phase gadgets as phase polynmolials :return: """ diff --git a/pyzx/simplify.py b/pyzx/simplify.py index c5276bf2..6ed0d99d 100644 --- a/pyzx/simplify.py +++ b/pyzx/simplify.py @@ -365,8 +365,8 @@ def flow_2Q_simp( cFlow: bool = True, rewrites: List[str] = ['id_fuse','lcomp','pivot'], score_weights: List[float] = [1,1,1], - max_lc_unfusions: int = 0, - max_p_unfusions: int = 0 + max_lc_unfusions: int = 2, + max_p_unfusions: int = 2 ) -> int: """Simplification strategy which aims to minimise the number of two qubit gates in the extracted circuit by selecting matches based on the heuristic |edges removed| - |vertices removed|. See https://arxiv.org/abs/2312.02793 for details. @@ -377,8 +377,8 @@ def flow_2Q_simp( :param cFlow: Whether the existence of a causal flow should be preserved throughout simplification, defaults to True :param rewrites: Which rewrites to apply, defaults to ['id_fuse','lcomp','pivot'] :param score_weights: Weighting factor for each of the three rewrites, defaults to [1,1,1] - :param max_lc_unfusions: Maximum number of neighbours to unfuse for local complementation, defaults to 0 - :param max_p_unfusions: Maximum number of neighbours to unfuse on each vertex for pivoting, defaults to 0 + :param max_lc_unfusions: Maximum number of neighbours to unfuse for local complementation, defaults to 2 + :param max_p_unfusions: Maximum number of neighbours to unfuse on each vertex for pivoting, defaults to 2 :return: The number of succeessful rewrites performed. """ g.vertices_to_update = [] From 6f744a788aeeb8eefd351a9ac5a24ac03cb0afd3 Mon Sep 17 00:00:00 2001 From: Calum Holker Date: Thu, 18 Jan 2024 00:28:06 +0000 Subject: [PATCH 10/14] benchmarking demos --- benchmarking.py | 5 +- .../benchmarking_demo.ipynb} | 1457 ++++++++------- .../circuit_groups.pkl | Bin .../benchmarking_demo_results/circuits.pkl | Bin 0 -> 1647661 bytes .../benchmarking_demo_results/funcs.pkl | Bin 0 -> 1774 bytes .../benchmarking_demo_results/rand_data.pkl | Bin 0 -> 1469 bytes .../benchmarking_demo_results/routines.pkl | Bin 0 -> 31 bytes .../flow_opt_benchmarking.ipynb | 1615 +++++++++++++++++ .../flow_opt_results/circuit_groups.pkl | Bin 0 -> 413 bytes .../flow_opt_results/circuits.pkl | Bin 0 -> 2045789 bytes .../flow_opt_results/funcs.pkl | Bin 0 -> 1515 bytes .../flow_opt_results/rand_data.pkl | 1 + .../flow_opt_results}/routines.pkl | Bin .../qft-opt.ipynb | 67 +- .../benchmark/circuits.pkl | Bin 1031888 -> 0 bytes .../circuit_optimisation/benchmark/funcs.pkl | Bin 1526 -> 0 bytes .../benchmark/rand_data.pkl | Bin 1472 -> 0 bytes {demos => scratchpads}/CNOT-Benchmark.ipynb | 0 .../T-count Benchmark.ipynb | 0 19 files changed, 2502 insertions(+), 643 deletions(-) rename demos/{circuit_optimisation/benchmarking.ipynb => Circuit Optimisation/benchmarking_demo.ipynb} (58%) rename demos/{circuit_optimisation/benchmark => Circuit Optimisation/benchmarking_demo_results}/circuit_groups.pkl (100%) create mode 100644 demos/Circuit Optimisation/benchmarking_demo_results/circuits.pkl create mode 100644 demos/Circuit Optimisation/benchmarking_demo_results/funcs.pkl create mode 100644 demos/Circuit Optimisation/benchmarking_demo_results/rand_data.pkl create mode 100644 demos/Circuit Optimisation/benchmarking_demo_results/routines.pkl create mode 100644 demos/Circuit Optimisation/flow_opt_benchmarking.ipynb create mode 100644 demos/Circuit Optimisation/flow_opt_results/circuit_groups.pkl create mode 100644 demos/Circuit Optimisation/flow_opt_results/circuits.pkl create mode 100644 demos/Circuit Optimisation/flow_opt_results/funcs.pkl create mode 100644 demos/Circuit Optimisation/flow_opt_results/rand_data.pkl rename demos/{circuit_optimisation/benchmark => Circuit Optimisation/flow_opt_results}/routines.pkl (100%) rename demos/{circuit_optimisation => Circuit Optimisation}/qft-opt.ipynb (96%) delete mode 100644 demos/circuit_optimisation/benchmark/circuits.pkl delete mode 100644 demos/circuit_optimisation/benchmark/funcs.pkl delete mode 100644 demos/circuit_optimisation/benchmark/rand_data.pkl rename {demos => scratchpads}/CNOT-Benchmark.ipynb (100%) rename {demos => scratchpads}/T-count Benchmark.ipynb (100%) diff --git a/benchmarking.py b/benchmarking.py index 9628ec38..d564292d 100644 --- a/benchmarking.py +++ b/benchmarking.py @@ -345,13 +345,14 @@ def table_style(styler: plt.style , cols: List[Tuple[str]]) -> plt.style: if any('Gates' in col for col in cols): border_col = 'Gates' elif any('2Q Count' in col for col in cols): border_col = '2Q Count' elif any('T Count' in col for col in cols): border_col = 'T Count' + elif any('t_opt' in col for col in cols): border_col = 't_opt' styler.set_table_styles(dict.fromkeys([col for col in cols if border_col in col or ('Original' in col and 'Qubits' in col)], [{'selector': 'th', 'props': 'border-left: 1px solid white !important'}, {'selector': 'td', 'props': 'border-left: 1px solid white !important'}]), overwrite=False, axis=0) styler.apply(lambda s: np.where(s==np.nanmin(s.values),'color:green',''), axis=1, subset=[col for col in cols if 'Gates' in col]) styler.apply(lambda s: np.where(s==np.nanmin(s.values),'color:green',''), axis=1, subset=[col for col in cols if '2Q Count' in col]) styler.apply(lambda s: np.where(s==np.nanmin(s.values),'color:green',''), axis=1, subset=[col for col in cols if 'T Count' in col]) - styler.format(subset=[col for col in cols if 't_opt' or 't_simp' in col],precision=2, na_rep='-', thousands=",") - styler.format(subset=[col for col in cols if 't_opt' not in col and 't_simp' not in col],precision=0, na_rep='-', thousands=",") + styler.format(subset=[col for col in cols if 't_opt' in col],precision=2, na_rep='-', thousands=",") + styler.format(subset=[col for col in cols if 't_opt' not in col],precision=0, na_rep='-', thousands=",") return(styler) def df(self, groups: List[str] = ['all'], routines: List[str] = ['all'], funcs: List[str] = ['all'], atts: List[str] = ['all']) -> pd.DataFrame: diff --git a/demos/circuit_optimisation/benchmarking.ipynb b/demos/Circuit Optimisation/benchmarking_demo.ipynb similarity index 58% rename from demos/circuit_optimisation/benchmarking.ipynb rename to demos/Circuit Optimisation/benchmarking_demo.ipynb index 498e111f..d121c80c 100644 --- a/demos/circuit_optimisation/benchmarking.ipynb +++ b/demos/Circuit Optimisation/benchmarking_demo.ipynb @@ -16,9 +16,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "To use the benchmarking class, we first create our benchmark object. \n", + "The ``Benchmark`` class provides a convenient wrapper in order to compare different circuit optimisation methods. To use it, we first create our benchmark object. \n", "\n", - "If a previous object has been saved (using ``b.save('dirpath')``), we can load this directly from the directory." + "If a previous object has been saved (using ``Benchmark.save('dirpath')``), we can load this directly from the directory." ] }, { @@ -28,7 +28,7 @@ "outputs": [], "source": [ "b = Benchmark()\n", - "# b = Benchmark(dirpath='benchmark')" + "# b = Benchmark(dirpath='benchmarking_demo_results')" ] }, { @@ -39,7 +39,10 @@ "\n", "If we have a set of already optimised circuits via a different routine, we can also load these. \n", "\n", - "Here we load a set of optimised circuits using the routine from [Nam, Ross, Su, Childs, Maslov - Automated optimization of large quantum circuits with continuous parameters](https://www.nature.com/articles/s41534-018-0072-4)." + "Here we load sets of optimised circuits by the following two routines:\n", + "\n", + "* NRSCM - [Nam, Ross, Su, Childs, Maslov - Automated optimization of large quantum circuits with continuous parameters](https://www.nature.com/articles/s41534-018-0072-4).\n", + "* TPar - [Amy, Maslov, Mosca - Polynomial-time T-depth Optimization of Clifford+T circuits via Matroid Partitioning](https://arxiv.org/abs/1303.2042)" ] }, { @@ -53,7 +56,7 @@ "text": [ "Circuit attributes: ['Qubits', 'Gates', '2Q Count', 'T Count', 't_opt']\n", "No loaded functions\n", - "Loaded routines: ['NRSCM']\n", + "Loaded routines: ['TPar', 'NRSCM']\n", "Loaded circuit groups: ['fast']\n" ] }, @@ -80,6 +83,7 @@ " \n", " Original\n", " NRSCM\n", + " TPar\n", " \n", " \n", " \n", @@ -87,14 +91,15 @@ " fast\n", " Y\n", " Y\n", + " Y\n", " \n", " \n", "\n", "" ], "text/plain": [ - " Original NRSCM\n", - "fast Y Y" + " Original NRSCM TPar\n", + "fast Y Y Y" ] }, "metadata": {}, @@ -104,6 +109,7 @@ "source": [ "b.load_circuits(dirname=os.path.join('..', '..', 'circuits', 'benchmarking_circuits', 'Fast', 'before'), group_name='fast')\n", "b.load_circuits(dirname=os.path.join('..', '..', 'circuits', 'benchmarking_circuits', 'Fast', 'nrscm'), group_name='fast', simp_strategy='NRSCM')\n", + "b.load_circuits(dirname=os.path.join('..', '..', 'circuits', 'benchmarking_circuits', 'Fast', 'tpar'), group_name='fast', simp_strategy='TPar')\n", "b.show_attributes()" ] }, @@ -126,18 +132,24 @@ " if c2.twoqubitcount() < c1.twoqubitcount(): return c2 # As this optimisation algorithm is targetted at reducting H-gates, we use the circuit with the smaller 2-qubit gate count here, either using SWAP rules or not.\n", " return c1\n", "\n", + "def clifford_simp(c):\n", + " g = c.to_graph()\n", + " zx.clifford_simp(g, quiet=True)\n", + " c2 = zx.extract_circuit(g).to_basic_gates()\n", + " return basic_optimise(c2)\n", + "\n", "def full_reduce(c):\n", " g = c.to_graph()\n", - " zx.full_reduce(g,quiet=True)\n", - " c2 = zx.extract_circuit(g,up_to_perm=False).to_basic_gates()\n", + " zx.full_reduce(g, quiet=True)\n", + " c2 = zx.extract_circuit(g).to_basic_gates()\n", " return basic_optimise(c2)\n", "\n", "def flow_opt(c):\n", " g = c.to_graph()\n", " zx.teleport_reduce(g)\n", - " zx.to_graph_like(g, assert_bound_connections=False)\n", - " zx.flow_2Q_simp(g, cFlow=True, rewrites=['id_fuse','lcomp','pivot'], max_lc_unfusions=2, max_p_unfusions=2)\n", - " c2 = zx.extract_simple(g, up_to_perm=False).to_basic_gates()\n", + " zx.to_graph_like(g)\n", + " zx.flow_2Q_simp(g)\n", + " c2 = zx.extract_simple(g).to_basic_gates()\n", " return basic_optimise(c2)" ] }, @@ -168,8 +180,9 @@ "name": "stderr", "output_type": "stream", "text": [ - "Processing full-reduce on qft_4 : 100%|██████████| 31/31 [00:17<00:00, 1.74it/s]\n", - "Processing flow-opt-c2 on qft_4 : 100%|██████████| 31/31 [00:23<00:00, 1.31it/s]" + "Processing full-reduce on qft_4 : 100%|██████████| 31/31 [00:17<00:00, 1.73it/s]\n", + "Processing cliff-simp on qft_4 : 100%|██████████| 31/31 [00:08<00:00, 3.55it/s]\n", + "Processing flow-opt on qft_4 : 100%|██████████| 31/31 [00:28<00:00, 1.07it/s]" ] }, { @@ -177,8 +190,8 @@ "output_type": "stream", "text": [ "Circuit attributes: ['Qubits', 'Gates', '2Q Count', 'T Count', 't_opt']\n", - "Loaded functions: ['full-reduce', 'flow-opt-c2']\n", - "Loaded routines: ['NRSCM']\n", + "Loaded functions: ['full-reduce', 'cliff-simp', 'flow-opt']\n", + "Loaded routines: ['TPar', 'NRSCM']\n", "Loaded circuit groups: ['fast']\n" ] }, @@ -212,7 +225,9 @@ " \n", " Original\n", " NRSCM\n", - " flow-opt-c2\n", + " TPar\n", + " cliff-simp\n", + " flow-opt\n", " full-reduce\n", " \n", " \n", @@ -223,14 +238,16 @@ " Y\n", " Y\n", " Y\n", + " Y\n", + " Y\n", " \n", " \n", "\n", "" ], "text/plain": [ - " Original NRSCM flow-opt-c2 full-reduce\n", - "fast Y Y Y Y" + " Original NRSCM TPar cliff-simp flow-opt full-reduce\n", + "fast Y Y Y Y Y Y" ] }, "metadata": {}, @@ -239,9 +256,10 @@ ], "source": [ "b.add_simplification_func(func=full_reduce, name='full-reduce', groups_to_run=['fast'], verify=True, rerun=False)\n", + "b.add_simplification_func(func=clifford_simp, name='cliff-simp', groups_to_run=['fast'], verify=True, rerun=False)\n", "\n", - "b.add_simplification_func(func=flow_opt, name='flow-opt-c2', groups_to_run=None)\n", - "b.run(funcs_to_run=['flow-opt-c2'], groups_to_run=['fast'], verify=True, rerun=False)\n", + "b.add_simplification_func(func=flow_opt, name='flow-opt', groups_to_run=None)\n", + "b.run(funcs_to_run=['flow-opt'], groups_to_run=['fast'], verify=True, rerun=False)\n", "\n", "b.show_attributes()" ] @@ -262,95 +280,114 @@ "data": { "text/html": [ "\n", - "\n", + "
\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -365,448 +402,608 @@ " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
 OriginalNRSCMflow-opt-c2full-reduceOriginalNRSCMTParcliff-simpflow-optfull-reduce
 Qubits2Q CountT Count2Q CountT Count2Q CountT Countt_opt2Q CountT Countt_optQubits2Q CountT Count2Q CountT Count2Q CountT Count2Q CountT Countt_opt2Q CountT Countt_opt2Q CountT Countt_opt
Circuits        
Adder8232432669456111561.25160560.41Adder8232432669456--2882280.21112561.47160560.39
QFT885684564256420.1678420.02QFT8856845642--72530.0256420.1978420.02
QFTAdd8161842521841121751120.572631120.10QFTAdd816184252184112--2211740.121751120.752631120.10
adder_8244093992912152761734.034281730.79adder_8244093992912158852155203510.432771734.134281730.79
barenco_tof_10191922241301001461000.372011000.29barenco_tof_10191922241301003281002281920.161461000.582011000.29
barenco_tof_352428181620160.0124160.01barenco_tof_3524281816541639240.0120160.0224160.01
barenco_tof_474856342837280.0357280.02barenco_tof_4748563428902867480.0137280.0657280.02
barenco_tof_597284504055400.0774400.03barenco_tof_59728450401324093720.0255400.1374400.03
csla_mux_3_original158070706473620.04164620.04csla_mux_3_original1580707064--124640.0373620.05164620.04
csum_mux_9_corrected3016819614084140840.35313840.18csum_mux_9_corrected3016819614084--1891680.12140840.40313840.21
gf2^4_mult1299112996894680.07341680.06gf2^4_mult1299112996832468112960.0394680.16341680.07
gf2^5_mult151541751541151461150.135461150.10gf2^5_mult151541751541155351111701550.061461150.285461150.10
gf2^6_mult182212522211502091500.251,0171500.23gf2^6_mult182212522211506491502462160.112091500.721,0171500.23
gf2^7_mult213003433002172832170.461,4372170.38gf2^7_mult213003433002179922173293010.192832171.311,4372170.35
gf2^8_mult244054484052643832640.812,0672640.65gf2^8_mult244054484052641,2562644483840.283832642.771,9622640.61
grover_59288336--2231661.262841660.17grover_59288336--317523322900.132231661.352841660.17
ham15-low17236161--214972.43342970.19ham15-low17236161----3841470.13214973.22342970.18
hwb67116105--101750.27140750.05hwb67116105----142950.03101750.29140750.05
mod5_45282828162080.022780.00mod5_4528282816481633220.012180.032780.01
mod_mult_5594849403540350.0493350.02mod_mult_559484940351613765430.0140350.0493350.02
mod_red_2111105119777383730.22159730.06mod_red_21111051197773290731431070.0483730.30159730.06
qcla_adder_10362332381831621821620.453621620.53qcla_adder_10362332381831627371622932120.391821620.533621620.49
qcla_com_72418620313295133950.78251950.59qcla_com_72418620313295496952361690.22133950.79251950.55
qcla_mod_7263824132922352962373.116232372.94qcla_mod_7263824132922351,1502495093510.602962373.286232372.92
qft_454669--44670.0353670.02qft_454669----58670.0244670.0353670.02
rc_adder_6149377714771470.11122470.04rc_adder_6149377714723063126550.0471470.11122470.05
tof_1019102119707178710.14137710.08tof_10191021197071232711561030.0778710.17137710.07
tof_351821141515150.0121150.01tof_3518211415351525190.0015150.0121150.01
tof_473035222324230.0246230.01tof_4730352223632348310.0124230.0246230.01
tof_594249303133310.0355310.02tof_5942493031943166430.0133310.0555310.01
vbe_adder_3107070502440240.1970240.02vbe_adder_310707050241142481560.0239240.1670240.02
\n" ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -826,21 +1023,14 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - " 0%| | 0/11 [00:00\n", " \n", " \n", - " 2023-12-04T15:50:58.522289\n", + " 2024-01-17T21:37:10.001497\n", " image/svg+xml\n", " \n", " \n", @@ -890,7 +1080,7 @@ " \n", " \n", + "\" clip-path=\"url(#p9b506aef86)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -941,7 +1131,7 @@ " \n", " \n", + "\" clip-path=\"url(#p9b506aef86)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -985,7 +1175,7 @@ " \n", " \n", + "\" clip-path=\"url(#p9b506aef86)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -1023,7 +1213,7 @@ " \n", " \n", + "\" clip-path=\"url(#p9b506aef86)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -1075,7 +1265,7 @@ " \n", " \n", + "\" clip-path=\"url(#p9b506aef86)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -1134,7 +1324,7 @@ " \n", " \n", + "\" clip-path=\"url(#p9b506aef86)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -1165,7 +1355,7 @@ " \n", " \n", + "\" clip-path=\"url(#p9b506aef86)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -1182,7 +1372,7 @@ " \n", " \n", + "\" clip-path=\"url(#p9b506aef86)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -1256,7 +1446,7 @@ " \n", " \n", + "\" clip-path=\"url(#p9b506aef86)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -1272,7 +1462,7 @@ " \n", " \n", + "\" clip-path=\"url(#p9b506aef86)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -1315,7 +1505,7 @@ " \n", " \n", + "\" clip-path=\"url(#p9b506aef86)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -1331,7 +1521,7 @@ " \n", " \n", + "\" clip-path=\"url(#p9b506aef86)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -1347,7 +1537,7 @@ " \n", " \n", + "\" clip-path=\"url(#p9b506aef86)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -1398,7 +1588,7 @@ " \n", " \n", + "\" clip-path=\"url(#p9b506aef86)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -1414,7 +1604,7 @@ " \n", " \n", + "\" clip-path=\"url(#p9b506aef86)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -1693,9 +1883,9 @@ "L 1133.999248 19.8 \n", "L 1165.330799 19.8 \n", "L 1196.66235 19.8 \n", - "\" clip-path=\"url(#p68fbeb6eb1)\" style=\"fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #1f77b4; stroke-width: 1.5\"/>\n", + "\" clip-path=\"url(#p9b506aef86)\" style=\"fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #1f77b4; stroke-width: 1.5\"/>\n", " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1733,9 +1923,9 @@ "L 1133.999248 159.473186 \n", "L 1165.330799 154.70347 \n", "L 1196.66235 150.052997 \n", - "\" clip-path=\"url(#p68fbeb6eb1)\" style=\"fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #ff7f0e; stroke-width: 1.5\"/>\n", + "\" clip-path=\"url(#p9b506aef86)\" style=\"fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #ff7f0e; stroke-width: 1.5\"/>\n", " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1836,7 +2026,7 @@ " \n", " \n", + "\" clip-path=\"url(#p1d05ab1cf1)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -1853,7 +2043,7 @@ " \n", " \n", + "\" clip-path=\"url(#p1d05ab1cf1)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -1870,7 +2060,7 @@ " \n", " \n", + "\" clip-path=\"url(#p1d05ab1cf1)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -1887,7 +2077,7 @@ " \n", " \n", + "\" clip-path=\"url(#p1d05ab1cf1)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -1904,7 +2094,7 @@ " \n", " \n", + "\" clip-path=\"url(#p1d05ab1cf1)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -1921,7 +2111,7 @@ " \n", " \n", + "\" clip-path=\"url(#p1d05ab1cf1)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -1938,7 +2128,7 @@ " \n", " \n", + "\" clip-path=\"url(#p1d05ab1cf1)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -1955,7 +2145,7 @@ " \n", " \n", + "\" clip-path=\"url(#p1d05ab1cf1)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -1981,7 +2171,7 @@ " \n", " \n", + "\" clip-path=\"url(#p1d05ab1cf1)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -1996,7 +2186,7 @@ " \n", " \n", + "\" clip-path=\"url(#p1d05ab1cf1)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -2011,7 +2201,7 @@ " \n", " \n", + "\" clip-path=\"url(#p1d05ab1cf1)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -2027,7 +2217,7 @@ " \n", " \n", + "\" clip-path=\"url(#p1d05ab1cf1)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -2043,7 +2233,7 @@ " \n", " \n", + "\" clip-path=\"url(#p1d05ab1cf1)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -2171,19 +2361,19 @@ "L 306.846307 97.235407 \n", "L 338.177858 97.235407 \n", "L 369.509408 97.235407 \n", - "\" clip-path=\"url(#pe822177b3f)\" style=\"fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #1f77b4; stroke-width: 1.5\"/>\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + "\" clip-path=\"url(#p1d05ab1cf1)\" style=\"fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #1f77b4; stroke-width: 1.5\"/>\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -2198,46 +2388,46 @@ "L 306.846307 33.866986 \n", "L 338.177858 22.077512 \n", "L 369.509408 19.8 \n", - "\" clip-path=\"url(#pe822177b3f)\" style=\"fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #ff7f0e; stroke-width: 1.5\"/>\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + "\" clip-path=\"url(#p1d05ab1cf1)\" style=\"fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #ff7f0e; stroke-width: 1.5\"/>\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + "L 181.520104 135.417225 \n", + "L 212.851654 135.819139 \n", + "L 244.183205 135.819139 \n", + "L 275.514756 135.149282 \n", + "L 306.846307 136.756938 \n", + "L 338.177858 134.345455 \n", + "L 369.509408 133.273684 \n", + "\" clip-path=\"url(#p1d05ab1cf1)\" style=\"fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #2ca02c; stroke-width: 1.5\"/>\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -2275,7 +2465,7 @@ " \n", " \n", + "\" clip-path=\"url(#pf853ef52bc)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -2292,7 +2482,7 @@ " \n", " \n", + "\" clip-path=\"url(#pf853ef52bc)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -2309,7 +2499,7 @@ " \n", " \n", + "\" clip-path=\"url(#pf853ef52bc)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -2326,7 +2516,7 @@ " \n", " \n", + "\" clip-path=\"url(#pf853ef52bc)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -2343,7 +2533,7 @@ " \n", " \n", + "\" clip-path=\"url(#pf853ef52bc)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -2360,7 +2550,7 @@ " \n", " \n", + "\" clip-path=\"url(#pf853ef52bc)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -2377,7 +2567,7 @@ " \n", " \n", + "\" clip-path=\"url(#pf853ef52bc)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -2394,7 +2584,7 @@ " \n", " \n", + "\" clip-path=\"url(#pf853ef52bc)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -2420,7 +2610,7 @@ " \n", " \n", + "\" clip-path=\"url(#pf853ef52bc)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -2434,7 +2624,7 @@ " \n", " \n", + "\" clip-path=\"url(#pf853ef52bc)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -2449,7 +2639,7 @@ " \n", " \n", + "\" clip-path=\"url(#pf853ef52bc)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -2464,7 +2654,7 @@ " \n", " \n", + "\" clip-path=\"url(#pf853ef52bc)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -2479,7 +2669,7 @@ " \n", " \n", + "\" clip-path=\"url(#pf853ef52bc)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -2494,7 +2684,7 @@ " \n", " \n", + "\" clip-path=\"url(#pf853ef52bc)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -2509,7 +2699,7 @@ " \n", " \n", + "\" clip-path=\"url(#pf853ef52bc)\" style=\"fill: none; stroke: #eeeeee; stroke-width: 0.8; stroke-linecap: round\"/>\n", " \n", " \n", " \n", @@ -2550,19 +2740,19 @@ "L 720.422777 71.288372 \n", "L 751.754328 46.590698 \n", "L 783.085879 19.8 \n", - "\" clip-path=\"url(#p0c73dd8933)\" style=\"fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #1f77b4; stroke-width: 1.5\"/>\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + "\" clip-path=\"url(#pf853ef52bc)\" style=\"fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #1f77b4; stroke-width: 1.5\"/>\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -2577,19 +2767,19 @@ "L 720.422777 139.311628 \n", "L 751.754328 131.776744 \n", "L 783.085879 122.776744 \n", - "\" clip-path=\"url(#p0c73dd8933)\" style=\"fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #ff7f0e; stroke-width: 1.5\"/>\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + "\" clip-path=\"url(#pf853ef52bc)\" style=\"fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #ff7f0e; stroke-width: 1.5\"/>\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -2604,19 +2794,19 @@ "L 720.422777 133.24186 \n", "L 751.754328 123.613953 \n", "L 783.085879 115.451163 \n", - "\" clip-path=\"url(#p0c73dd8933)\" style=\"fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #2ca02c; stroke-width: 1.5\"/>\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + "\" clip-path=\"url(#pf853ef52bc)\" style=\"fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #2ca02c; stroke-width: 1.5\"/>\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -2646,7 +2836,7 @@ "L 46.848125 377.795312 \n", "\" style=\"fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #1f77b4; stroke-width: 1.5\"/>\n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2746,7 +2936,7 @@ "L 131.52625 377.795312 \n", "\" style=\"fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #ff7f0e; stroke-width: 1.5\"/>\n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2844,11 +3034,11 @@ "L 226.212187 377.795312 \n", "\" style=\"fill: none; stroke-dasharray: 1.5,2.475; stroke-dashoffset: 0; stroke: #2ca02c; stroke-width: 1.5\"/>\n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2939,16 +3126,16 @@ } ], "source": [ - "fig = b.Pt_graphs(funcs=['full-reduce', 'flow-opt-c2'], qubits=8, depth=400, cnot_prob=0.3, t_probs=[0.015*i for i in range(11)], ys=['2Q Count', 'T Count', 'Gates'], reps=20, overwrite=True, random_seed=42)" + "fig = b.Pt_graphs(funcs=['full-reduce', 'flow-opt'], qubits=8, depth=400, cnot_prob=0.3, t_probs=[0.015*i for i in range(11)], ys=['2Q Count', 'T Count', 'Gates'], reps=20, overwrite=True, random_seed=42)" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ - "# b.save('benchmark')" + "# b.save('benchmarking_demo_results')" ] } ], diff --git a/demos/circuit_optimisation/benchmark/circuit_groups.pkl b/demos/Circuit Optimisation/benchmarking_demo_results/circuit_groups.pkl similarity index 100% rename from demos/circuit_optimisation/benchmark/circuit_groups.pkl rename to demos/Circuit Optimisation/benchmarking_demo_results/circuit_groups.pkl diff --git a/demos/Circuit Optimisation/benchmarking_demo_results/circuits.pkl b/demos/Circuit Optimisation/benchmarking_demo_results/circuits.pkl new file mode 100644 index 0000000000000000000000000000000000000000..fe83d1639a78b13ff7ef22a1e10f36fe92ff532f GIT binary patch literal 1647661 zcmeFaTgYx%b{%#ub?Vgpe(OtBUrHw34r)tCveXHrqR6CzKdNlWdJ<|E)m5i;>ZjGM zuC9ue77~_`L@OLDkdFd(h;c+h?1wZ2Oe92Pg78Bul0Zxdi60DYf*}#fOHh)xWRJDK zwZ|N5UiSVje^*s^ormuF_gZt!Imf)Lxh{KufBl}{xq9X575w|9rra zi~qduFTMTN&%O1P*S~!C3)5c@{ldTZjbHrS8*jb+#=CF5bN9~8pVSx!2#h_4P*ogr)!7{QS=Kf9J>l!rlD{ckX@X^|ycS z);o81_k8_}w;#E4&riJimwvi8e&+U*yL;~3eB-NMdFSn~e);b1>bvN2b!flw3%6hY z`mMWn?*G!;ufOrmTVMUk*YDoB@8914_cYXB{QstZyL*1)?oUk$y#D6JSKs=|J9oc1 z4fXV_1DM=?Zg*vR@=^2T`P-k|U7g8pzxbQ3J7gKU8%DQZTw`$cwqr01mvO)9guPOY z)fg3`_2C|Cx&w^K5X&Fer$30(^@;U8qWE>NE=C8%HBXW0b`A#jRA@ALGwyH$74}*+ zR%2A?-iH$~mp=eAkwxEAT`ExgybRvgK6~rVJzshK=chcdPiF6aad%_){ktc2PrrKW z&W%@p>aYC7D@aMVZ|-CKf!&SU5ALqqeh3dg$W{r=F6u0Qd;nwlz;N9fk!7Z3V-WoU z=JLm;Sgx{8F!`(`mLOT2%D}2~>-OK1Kzeca$nMc8knZ{Ezx?{!2glKs{k*|+gjq*t zlE95=i8jMIMA#lra%>MQNm=^ruTKClpY&N$pFjgX=~|L)pcA|2Y!^dZ&8OmPZo(+D za}Y=rv!UbArKC{)x~PgLm?_z(PxO3}Na*;i$-(wO39|D-LI4%p3yCMN^a44Oq^9d}jfmj+LPEXV?_Hwd=it2KBg51GA-3j%HI&)WqoCC2rK+bjn>WTo>38q^8 zuh?4NMCmn@<71V)r@Q#=X=Soh;$5^o#Z-xFdyg@;8#KD6l`_7M#}Iu&oRKH*YpbWv zeeI3At>*aGcQ3Y7`QVq{{qmQ;|Lt3EzWc_lJYzm`=h{#FjDj?=x^v^Lue^Ed7w>}U z#Xq!gG#9@3z3EXCXtqFGDDmMVckca}zuXo@eVx|UIA+1YzC@I&0}O416_e01)>q4V%P`z&eoddctu|O$9(mMwz%WJ1q zYh!R|)Il~z-F{9(q9D%3DzLMkE2qik;`^>$xq>WrWzKGYcK7t|(U)KPwQqd;AwE#8y@;BdYmk(-gX_6FbglN&<9u6%I(?jyS=Uv6gv z)BoJMbKjS~{MEnq{a^isck(l6m$!oGylhi3iE=x+4QyGXl%O9H( zZ^jyFRFmSCG#Vt{QyExw#?<$tyJvRKzIyB8q3Mk2(Cp_A=i2tkG|{lk?dIZ>KD+1> z1*-JS_-vM*8&}?J5Aq=!1GlH3PzHkP6Ft%O3VWD51a37T_YE|}uuX)Tl~RCOtJo62 zR$aRgBL*>mWCs=X$^o7z3=m2CbRjuTSA?7cvDrOmyEwR@rj1QSa9T2+O^5_+ zuQz@0L}vk?;k%F=rz=9v-6UrFh~0Cxix25dAMeK)V$IjPW0JA=e%~jazZ50k$D@Qk zA(E(4+FhO>-rwc9x%<-YrB%<$O=$1bt2%r19yE8&}i3ew-65vJSYP3L#`-kdh6kjiW9T)Mj$tB!`PXD=hC`%$yRVIFc@>)yF65eAjlX>`LoccNSFqg z(r^?%l@-D=Y6Rn`>cAj7`ipH~h!rH|JnLL=ZUx*Tc8sv-yNV)44E-K%nW31-$&`8^ zA>(s3E6xRF6>xL%8?&>qfTniSpy(cGnpMfCjevEr$DFP4GGs5}&4@loogym%3rSL?)hH8yzhI*GWVD=ugJy$;pV<%rMo6bg4GGOr`Fx+%p3y@8GoRr|TPEEK2; z5?Pfj)>a0WVH-v&5mc_LKtZjH_!2NNh6m>`!SJE#l1zV$DWr_7KvgSY@C7MTV_O=j(wc3^uj-QqZ)T{>x?qthH`kO!1PpN}sG%(z_`rZR zhzyETKVv+>coVCW=DDMlRO@P(cj&ctHbCg!k7>}d$TT31nPE3XTwmvJEGkri)%jKx zP~y%x)jlm};2*T6QIh^4wd)slKd}3Rsa^k|s9kkcq9UmLabPRG#z!cr4*EX!WJNs^ zdnJjOX_O(&hdSbF&Q(v3h@Cj(N=NbbV)*zrrhy^m%z%=aE<+7Y1i*kf-?$eaDll>J zVRSj7yd$c$EuA^22e@X$mn$-XG9Um}&aaB#CW9JcnJzIfJ;m57Q+^XSYz1cCa>Z1wrwbJ%IQyMKN1-8)ac@%49q{0cYFYqe-BX_P3U&-pbC0FrU{j|gL`TNWp^f&h(F$xL#F?tQq~ zSJv;~<1}?Rzb!^b*z1jxIn5-zY|vWZ$_VOj0$A?a0{{kbNS;z zLH5Ck^?icVgDc2_;-;s_kUa;3`zmCcyczfVoUlE=hE{5f3S|3m0_O6^6N2m$6YIwX zrzcjB1;rztBGc_03?8qLZSrQ^A9un&QjOIZ70CAC1kB}+Ck5FjC)SS%PEW2N3yMcQ zMW)+17(7;?(d5mzKjwt((|+i)jZuMYA5Oqr{&-H1eQsj?tl;$A3bLSh%2Q;zorA%% z6|zmCDiSwGAOIdvTjE?ctG90rMkp$iwCW|#-uBvRtFdUc|_fQDuZ%GRMzcS!ssHS z$43~OTUJDJy?do@*Xr^T>h@C^l+|Tfx1$`?MMh69A+lSlOANR8>`L9PE22xN+fQXs zu87LI9ZMKpWc17&BD-Zpgy9xsu?SlJ@O8UZmzPktpUR-DF3Y+d<)AJy`m`1zyQR9s za02G?hp*dpMRW;u`>71d6;WBYV+o^+j9wFj$ZlB?VK@PE`NP-kT3ud3-F_;Avbrqm zc9es<$mj)Ci0qc?62l3Y%OAdO*A>wv)a|D-C|5*f-Hs)UE;4#G8X~)8MTFrjmjTHSMS-(9r0rkM78TS((T3Nq=Lchq;D6$pQIT!@R z${=sX9s8duY_~<|2V1H*47d0Jz+C=#Sde{qV*Q{X`|t{~pwQR58bzktIT!@R3Xv_j zWB*fy4T^P+wWW%~a02G?$43R(k4~(g6J$TSf-ESW@Dv%c=U@;dexlLj&A4MPNrml! z9{TK-84<$?n9Cm@6J$R&vHpnQ^syCWLGh%g$aFgggCOw}*(Pts9eYVCY*6@ctSvJl zhO=Pmtk9E9n4x>TgpJ+gVPlut<#wNeG`C+u20E2NncK?@gxr2W2HKL_^9 zFl(O5pv>*%oQ>Rmz^u6?x978_&p?{nFChb+%Am~cWd=fSKOh5b$?anXVmk7(rsnob zm^DvjQ0De>)z;+e@3k+YhkG7H=PI zLIe3cqTYT9dE`_ErMH)P1m1o?9@*mUV;)g&9~>GV?1=AAP9Io&;g$dT>hACF{;~hU zqPa=A1eQM-)zh`MoG6a(+WmRSQhfnpQmWp61OqO4qJ|av6FuGt7EYA7-=X4@ei4Z}Y}u%nBM^V;p~pSJf`j~zysE?j`h6cNu;mN~Ck-3} zN&VF8D_bUxiHCmBtj`_o?YZ$Xyua2GT#=y?y?Zj%A@A!{*H%|WfFChaObk>(!(*=_ zzK=$s{RNZYvWoA%=%`a6wyRFP(y?U^YvQ45_8qp+j{d4gaBYM-_U?<0I$L7uIQ4Qx zux&;Ddj_hY*?$V{=r3Ia7dXhHcVBeW*%VWYCh{XEqr$uQJXFoTB^=t(Uw;U$Qc%a< zebG@TT+BW?;kL=DkobuCYGR-Y8Xln?{Y8Y}QUi7D-4`8oLdJBXbHS1GS%J!)hpO2p z!O)KWNi;g;HV*=ATd&|C;9-ObvkP`z{(C`TD=nv@B+ny00H>Xi(yQ49X||XwpPcXoOC| zG2jX6{73rEinmQXG~oM=NSM+5FO4GG=7eBzXFv#4^^}KY-mSBnYwtN$U-~z?u#8Y#1QlvVq3O6HOg1B z%EUkwG(18(BBqqb>g*?J1bJ{#*zdyX_H((bdE`+JlYu{8G0KMtrBf^l_zim9<-LRr zdN804a8lhg-x3I*;21cHQQVIdy9lN|5B0Tv91sQ*uvX1ho!M>oQ%5+9n&xtL_*Fr} zBMc^3PdDa!ehCvs@4mR-6hA9_>knMr-P!&0^b;Qb%h+yvT|azm90aR;ekWlczUckH z^653x8;e8JFbj*`Pei@31ThWl{an-=g)STP3l*lKX<$e6_!JVq3u1)EH-^}t1J7F; z<45uIyEJWkCgO;%s@xwnV4r{u%5h$N*BskAKN|RvY2e4B2CQh=pd9CAV)0SirzYZO zqfxQGVuOwh`xxd=PbxjN zFfa{mS7&L^QRnR-_f=sghqmWLVhJj=W$A3L=103KBuHn^Bx9q^Xv2X0$US-*C=*)^ciCK45xOLYCd`^9A7I#C7zwBAciw#`FzV{ zi9Gsff@hpZjoO;IRr2|jt}zvAE&9p_#F$CACNvFNFq#HX99@QDehS&OE#$=w3_C3`O@l5vRqZ(m zjoxU8F=d6}j|OHSLy@K*%_J(vT>KOc40d6*LBmHQJWwu$lA|G%91S54G%#@)UBR3U zs?uDN70@Cq!tdoGERLQm(@hO{e;A&K7Zy*dL_h3E%LR-|CpXaOa?Uhpax@L;;z^e> zh5~ugY*29(0Upeih5`m-gX%gb(ZXQ5onl5!lPF?=>`Wr(G^{er%a|e!ZC`m9Zj2A* zHt*UNQHNa5JZv=9d2?vUe79$AbtV;QQ#}_>x>&E!jg3fHHPA(MrY)2ALrYpw8Rsdy zFp}1cMijU>9acx3i^6dgWOYL8O3LFqJd39vmTTK<;IOvYHP=3OqqfV;J{> zLvqxi!OXkPv>_2}P9hVDOjRoQYLN-Ek=TsLQcy>nckqgu0C_MRk;@gGceL% z(v=qyZzzeGxCM6*(79C-xoNjVwrT?U47d4gpojs@-Nq8k3M$c@&{v$YPSNABm@-)1 z;)ipSfpKmWykR(KoG80q+Ya%}WT3fIpAPtA(`GK+0yRYB(chhh=0s1p}He-N7zq`jZ-? z-?mV1Q6*aTTiFi>w9HIK4>V*5#z%6>d@h0tqoy+voGT0Zc}Z4`IwU>%GBQ0ApHUR~ zmkp{!ob?PbOcdGU1cFpDQaRWzPx41*Lt0G`HXC@Yi*DF97~ zS;`zJhj|F8nW1C!K*RH#za*ws7juxDGirojQ5ZmpFw%fv*Z^6{&P<6^S!I}~ka1Qs z+T$);XcGWwSTStS5CVy;6;hxfR0j=&-bgj%ps3Q;*$zUHg<{aRj>D+NYB=APp)uc69OpXYN;ILO(PJS+BaLF1+4vZB zBN8e555kUl?k{DyXfx%8$!)SF&=x%d_B*fuj|L{!w%nwSUR>dp{e7)?>piZQI6PlHm8n%(|5#smh9N>c1#_ATRXN@v2+9u)B6b* z|ABUdZ{f8CjtJ6^PaXe`c5DerI>O%p_}`s6nxFl9;gx@U^_91Pr{9|B6?>7bh~Dc@X1Jc5`fs1fmqpNV7WQga@Ol|j7kq(+CoYTi!3h?7__?4H~rZwzI)IDfv55^<|KmzXxA>MbnQC%(I4h*5cF&KhTva}lRURhnQ_ zpLlOT`^2vv8nK6BQL^KzL$60eks45GWmV@H3dHvjXJ+uMAYR@0AId>7(`uZq2YCS& zYAL1;^{z9NfbUz*=4^!a<3j~vKFlmqW!qO+5>`Y!0-=3Y&+&#*QygS9@vUdgQ96@B zP^V=z>!u1Zn?g2Kh~G)h^nzoU;L0oe#jK9v=5i`kz7v)e9Wp&A>a*D(TUVQ~eZ4+-r4aD3Qiiit%*Ez2c z*PI=^Ofu`73u06}*@}EqxkO@<66$@lLLBH~u4vMS_)zV#dQlE1PISNniBXJXx?FB0 zgUz+9l8KM8j3X0LDSiq*@I z>+{wM=WO0O!;JYp;>_S>g-Q~ZbCrm$&xh)Z^Bt|CB*5JX z#?67msMWK|dNnJbM2wW4ao&{DNo@QP#eO!+oT1n+%&^Y6@W;dVBu&oYPN)F_^-)&M ztR|zAh>^)M&YLnBiH(wVSyw=d$}CH7XQ<2yk67otB6gP2S9iDCb*d#@M=7D;yq-@A zV(82Zk;Z;}sN&4`u?rM&F)sn^7^9W_f(mJbWNA zr=EHXwt%VKmF`4{X}x=N^wrJrmbhzaOsZs?>c0YQRyj?v>`yN3hmA4hHM&`oX51eC~Xy z)H897wO(O05@j1fo0g0`TTqEM5p#8DroEHztY-Om^@6}KJ@EKu$kJ>$=`t%O=`2yr zsk5lUG;b>QJ4sXvI>9sEq*EP^Mdks39)fo3r_)vjZJ*9&< zTv;0D<3k;Bbqib5q7h#2Wtaw}v+TCVB~)HU$-3Sv+!cwIo5YIH8Lqh&5yp+Xi0de_ z_L;w)Rd}{e6UIbaE}N#aEQqrkBdgV(-VacHRxcMIsq=!L5^t)4>cn3Z2kR-gAU^5p z0}^JIVCHJdc^B)1A*o6wk2X$8CW`76s!M0gTJ=KG`Lal(N!Yk58nS69USt|#T$iAZ z>M*Oh6vV{BjC#b`8chP?45&F7k3bpDCtX}X!sg921!GftZUV(Tue zIOnBoks49!a+#)^SJ+`?MQS1=+biF+?V4r!)w4HEnZ_G59hwGBIHp09iD}SepuVwb z*~JhwqauPbU*8mdb?myt$5d1oP=&W4JQ?%~#A>ayo*0}*Qe;+W20;yY)1bj@8cw=} zq#Je0~A~Ij! zG|4^qJJ+vVy@G$qzV;k$V~*Cmr@n9U9{2W)OQ6hWgDTwj?X-qeZdyi~fz@411F+9H zUPcP0uhogaNGIwQMi-PdnZ@TtQt=Tjjd3$74ykI_9z9?n=Cr2Xpw6l^td5i=0moVha!`B23od#)s+&XjD)g6FM^1jKR^66)%^2H2`{M zDxCpg=cilkIs$3HQqx3EF{TGYtf6HZU;;Yt&~PT(m{HqRgJjmejC4fY>m*p2E+adn-FH9%-H}@y{59}Vf z{owA(?T7G?$#j34#5}?7&AoD)1Ha0mU--k)NWajBDOx|phn3iLPi3D2rW*yxIy*BMvJ%W-^v{E>A(AB48eSX z?4ZI1rlBT{QK5SuZoyi?#NG_@%+h?HVBHSR1i5x2so>W(dpt#k^*I>yi&O?q;?r+X znMPvWei>7Q4NSwa8lyt@K3oDOR$s{AOY;MQHJb7DR`P2L^@1NLFl`JJ8P?}u&@Y=A zI5%>~jHbc{rr}tPQK5SuE&&sp2l$@t=kL36Wtsna0&F+##>O78VPki(u(4yZZ=`)6 z7W+b^>07+UT5Sif(6Q}+c#6!v=U^~z@5qEtoAd(#V|>OE>JwxVc9(soF$XqAh3-JoK5DTTbA5=T449Hms4tpVX83eK38jfxQ56h;+Qpr8lwA5pO)1l zQHm_7>BEI{Zir(R&T5FE>@pG2SJgC4-_zie_G7%0vH0Z7J1Wzjk8JF``^DWOyZ>hQ zh21N!-n#v}@4*faQ&mun5rz)c2ic2*ZG=Rf?kY?32QYaCGf$!p=1j>@AHX>~n3fl9 zRUJ1megI3wU@^OBtLnIV>;t&u2$pt>wor#DEa=G;wqK=lBGyITITp0#n)Q+xEKsOA z=U%fCvg{ZUqp|N$I-N#I~WOOGf(E!Cw z*%XQQPZM=qs?fZNSwgppgPcoYl7(2NZ8CbHZNk7&EZV9%ZW{1YydFXX^C`7WPE0aw z(LEU5$-c_KQ7qc3Isi+i_)UwDO#I~N&Iv>DlheCX87$hWI=y^T{%~GCd2cHHJG+;6 zf9};=7Y|Jr);1LTz3QgeXI_qQGE{%@=-`Qle|ZAhmto-^N?$C8jeScaZ0s9PVPm;~ z@fyW5B*Kz#V^>$7U{_b4;4oK_2~q{8&jyqf6B=*V_NNOZaRF&=7Zj)x3}5{geSgx(EVgKI4}2kUyWgGees zERsUih2%J(3dGJ_;AEK!x(I6v-ePLlG@+|?sA6ZwClE;?_u%DxC!U z$7|{h)OBB+;(l?8{Vq{`sIbuLo(q`a(glry6MwyC6BMb0HP}C5V~n}-^1q6#Kz9i_ zYP_4n_LwW%1Cc9{Ai$cC`;9U+L9bN8OEE3)P9YLDc1P|iT2`qLOiG)xyTT$9H;kR&z$@98Iije_t4 zEqd@oO%0v=6ZN@{1UUy{)1SaZOIOdfi?(2|6(oGRxPZ9_*{F(wRnR_wlJ*w^nGAR-F{F z6mR+w9AK&7;ECU6(>`9Ou6HT+VQdk?nt}JganiXW6|^Tnyy@FSJvmYod@mtnqZ4ws z0%t>Q?`0y}O@{R-!{JmiJkhMyoszO5y(m>rIP8PjLHnTo@K3Z@LJ_Kc@I-L|QYs;y zXhZ{X?Sm)U2R6_?c%pq^OMT*PiCm#Fd+WkewGT$tC&1ZzyyhI=2TwFAeD?Ky{FH${ zIxqP?(98Ex3;I6r1m8!?6W<3m^?ejE-^W`Aebj$^pEzRGH+&!1-S<&%@qK*GiZk7m zt8rKEVZH?Uxv#x(7uV%pdG+eHKAP2C`^QhX%Fb93ce1?7es)C2z(2E1WB%uR@=1@DS zCcT_&<-&rYN`ja&1J6|t+%2@R8eh51i%h4tSasfca(zVqw)K)o+v2onBW|iC=;-Du z_dK1C&Z2$hl5Ff_90D+!&(DZLNXKk5LgfvD~3E^Wpx$aEaoaHG=7ZT8Z_(m*q_Mx39GIPhPuPh^qY@^aQ3$R;qM^Z1FdOg_ zDJuSa7&3})Mud->5xHE1^Mo=eTE;QhTV;qLG%~2VN<1r2I61`OXARA$uu2BYEYkSF zCFLAfCq`d#jR*_OH3b|&OoK(lPA%tjl-%G2Ac>c0fO+_(9RolnMm&9*5v#-$o5m2Y zqqhz~=Bl&gh3PaaD*DOH%OE9JqmE)>8dj&ZU6B$25>vmiS!jABfv`b~93!0KV8+jq z_zX@VaatOs0HwmAm^xaHbX2v6QQ6?E=`(ClJ=KHeg+&2UrCGebGjg)2Ns@=SdDv}9CC9a{R z3@a=HDV(yJtx(L8P&s53qN}hgtA4tyYa=5(*(hOORi@i0t2SLJk$8 zUPq0w&;oGST#~tXV9J?-lIUSjkMVvO#C+3+l7s5zFVkt#{eMP&#}6ID?dgk$eMi6F zJMDg7Jgyz#TYlRW$C*!SM@&k7w|cstbny}Gh>F8sTbgd^Ts%K@G+(KEWcN>Y-`M@R zmtXn^`;XLJeAfNmA3sYM8&CbQGM)*>!K$+4Fvp!b_CTNQ9w7SY0ES3+S5%ws8Ol-n zv>;dsA~0uNXPCop*q{UVg0Ese7XV{c)^W_;3?0hIq0?|czZ)~InzY)Y=<9c7t~^?O zx&opuk(58$SQrFjd-=t?%=NfIOi3+RTZZ)}f{@j`@}Iv;J=!SD?ZzVOrw+~{qS3tN zI!<0HS)9KWSrm$9T4y$0b6cItbkLUEl1&S=aYi;UaZ*(+dJI$y;onAJG3wy^u8qQ| z61tJ4ZScoT-gyZ;TE>_j0~==&fm#w@kTXQ-dXlS8g)QF1&_44CQ6cL32~kmZ4_oM* zc9AYw9T+8tBu;1K7N086b5G?PnpX@rEkjL1b#@R}FNQeP!OUC|$$b)19n6Rjhr}jg z!iSs$)n(UBIr@Rp4|>s>7&y!z<{^7y7&fRilQT!U0d+GdWTW*AsR`fUI%pKJiR2qs zUJ4WPsS%Tk116>@BY*giLqsCfmP$n!a=psNG-zZq57`^TupyFfoVv`2RLnfgM(Yz; zYQjO)^Oz7blo6AP!-UNGM*i?2hln7mO_+)>%$_P6DM$9yxH^4{#G~l9s;)tq;y!?_CU)<`Ah#l6{ ze5CAG!PPlDx=5r-jbxKG_7vNC4^>Nt+`EaduH--H0@7J#A3nXc-1p zwCcKMn_)4ULFI7YC-kgAIO1T2pv0}W9EY`C>gfdOcm5SQ4ns%(hQM?{cJa5hW5Ym3 z1nG1@cJUu+$EKEaZ1FdB{ExL`3nJ+VQk#1M5b@2zAPuTjceckiW zsOnXL_Ay@4P>xnIdKzXZ8r%_u9$^^@;BICgx>3V98Va~>sGcU(nRAga{ymaEdk(abbL zp_r0%(94}dRGiD_yj9=vJW(a`DhErZ^FC z;q6CoCeXFM&fDd1W?r|rK5}NK2aKkCV|G+^=grhYU5uDXJrfr|t2md>nLyY2)*jur zHY$%EPV&f@lZvW4@97jkW5i7AWJ8D^t>Roh=dJpVzM+!M8-%Wpcr+$a?spoG=60kG z8Xq>Bi5w$lR=WJ{*8@2dXzFWpS-o;MeU+zjW1Vu$z$mq{Suj2dD>FVlRac&By1si< zNvtWwNUXaiI`ACPb?Vd*G6SQ&%dB?%7I!w{rckf*#7dIkW|4w)2^mU#Vz|;o*Ur@0 zG{4l7Q-Otgl45bW)1sz&lhf!F#{b&NZYgz4?@aS#BaAV)UcwZxX)UL)U2fT?rHBE7 z{$pSpmVWfMEUm3>@gP}d%d<@@1Fkg`woSw}=W!A>K&Z71Z1f+~dst%=wv7LG>%x?7 zV$jh&3r%n89)@VR+_esAzYC}HpxxEk{fGGM`^zu=SD*RQKl-ho{p|GH-Z$R)>X%;o zk?3c=@8{2Y&#b4<0q7T~U~}xD@f$yFik~mZwmpOPl{%vmDDY*KfkM9l$b@qa27RMx zFVFN&&kVM@NN{S^P=PEc@TLiMlge%M*>f-mOt+Cc?5e`b#6Kdt z#j7x!fVuqfq0i>O%y^p5ewb%-WKYYpAJzsrvd7d0_~_WaI-5Q=cK`0J-Jjk4p#N>o z?~*btC?=L{2+vyn_y7iQFrAA!%O4-Wv>!~UqR#Ti2e4Qus}WxhY@PC1a0KA7F(@wt z%;k?wUXv}clIpgo+L8kIR0g8X^2erV&sZmGqC&T1S#&A`QD^yM(}bC^PFB)|ZpmW$ zR0dX^amw25Uf6vi{E@l!Sqr-#`pH!+p!Eq<@*gzSK5$pP=z}M^t`8<3#$j9ZJ6zcw z&+TkKG|0J>>^9aXs*HyKzU(FyEj&kEsg`( zbsY5ZlIm7LX{a2TG8g7ZL)f*j`9H0gQt3@`q0)>J_l~ z0Y+%0N{l>hhINP58 z5kCsk18h$p|7gsNI9V9{yrdl)Cp%q4y~0leNPY)+MZ9l8+r*QC%BQmz%;Ph?_US@$ zoURBtuX=?J+1W1PqrV`!A3yMcsff!A*v~Ao_AX-9Zos7js0iMNjDvJg7M-;0h5slB zz3?N7<&1A)V80*#O-br;`KCtGatRXq&;M(mE+oh4ij-orJDBK@o$UgY{+Na5*au(RmTnID0d|(pyIqFJ>RPwbqQoHo3<+2Xb-40!U^z zxmybCOTC4Gk-Rxm*1(s%B9#h}U`hkj?Aqyf<(s=KGAOH_rdo_IeT)KtK9jR2C?(co z_~zl!z<|~0K(7R3yxkDGhUyS|fYAXXhPNwPXf49&s0|r2L$jN>mU@R_3e>5ejy)!S zjxDYk<7;@puS2N#dYCev7tQ162@J*@O$ldF93icyc2;6JD_wLodH^emY#OS-H8WI| zahl|j9Sxh4ga@&?^2A`|Lk)>`;JUz|P|Yg|7y2ADyR;Nztc(@SL4RJbQHkb(M~My? zm@pWQZNXDw;I2>+1CFSoCg9OY!8P;nO~iE4h_e&<5Y8j9B3$7WTgZS752blcgXRzA zh&GcniGBuPoUIh6*h`H>!(1h)78ua|P14HzVU}ogT|;O_qp37;o8DzMcb^$FN@4!V z=Fm-(S5|(^#7;r#as+1@n)(`D1_K52RUytgaUBKfuf{a=Nh4~Tnq^m_6*JRYnb$ri zFRi8(_Qk#0u_aI$5ur5|`4DT)Ep#F=i zEV+$xtCn4v^0fTYDD73PPOFD7_dl3Ix5^@6=301N-e?F98!{B5-CgU@{ROsyK7y zU6`olmZTz@iB~*^IZ!!onj~ss$C|U@81F zaRCHeiG_#~Z*t{h7E(0fUm_HfYPLyj7{x z@|ps=$BX<#MRYF)6%l#7?Zh8x5%kPB*P%LYDh4j(ug#Tgcv zhi+nZQfYg%l4@ObjShY48hVCc5K3!!xG{}oT!VP34E;NeDPg6d_cp`2NO8C3aDfr(cFCShrv7ZDez*0ywn)I(Q15!WJfpCmGY zG9bX9EOu3#O$If@;zH^v#$GjYh4M#40by5hj?k0g5D`0rGpkWw1A+-kiJ{BSOq`8X zkIUdp5U8&KArs}hYq})})K?0jS9hPnzJ33tw0G~^bNjD-@y|zZ{NG&O_}5>b>*b>V z^*NM!^5(T(Om0gMxsBDT-+9Ns6`$h=0zjd6^LxF#?~eEP8FuGj&<_y|1K!~(xwk@5 z)ayuvV>L#F?tQq~qSF;41rzH{y(x$KO5P#X>w*|hFM)5BfcgjE5dCv72ms#5-MdPO z{#MUh(3e*t^wJ`LS7cjGDQw&7XmOP}3+)s8_^SIk7?jAC+%Fs12~15eT~wc7;Plf) zTHO4fuf%|MOHeMLEk9~Ge&8pJv2txj!QUJV^nx(A1(nC zo1~h3db(mh*q>UP{0u6+O1r00gO2uJWYAmj5K+T!t5P&*fHxI52ZOFlZiLL8{A5-d zv@t3S+J{TPM2c~d)g8`7mQF<&8qPpiw+N$O&j@g$Ak=BG;*gVJY9?(kU^HZTN{-Qu$tPQYCL_|RwbPkkKav-G02 zc|HNpCzzCU4(-`-v4^jFG|0AC`@p*AR0d_-2Vp=w`n*PG4g!OXjZqQheYgZnq!@i& z263)WU^7YZ-X5CMx7Z^9I4d0de04a3GN+gJ=t+2hT!m%h!SSJBcHgHzbnO=d`l3~U&%5ki?k{Zd zD(G&()KyR)z8BwgaX7uu`d0(h1KUtV((5a=QaAGN32x|q5QEaiyXvM^C-=*CaRn1t z!>boN`7%;dbBnhEiv5b$ES7=@rMBpPDuZ%zExC738!VkA^DUFBIIe=(-H_VvCld{f zu1*{nNLL)7qs=E6Qs-+#_Ef1Wlb#FqOz^JhO>C6!Up2k?%Jr+ecXn@0U$gP=nsVdZ zNCM@uV`ae1+a-Hn!+Vj2Kn`wZ2#Q~-Z@F^0ho)yQO|{uW_1=YcGf6|c>Odv zR`4KmM}{%5uA@6)B(aJUI;(+Gdq;K}h4*k~Q6SSqhMchlby)YFQ7WU7x{j)}DpJd+ zk*pY%#?nz|7jYs*R#w7UoFa^nCk$5!ks*h;w#+O&b!zwx0ET8!j)nqBo9CIP0q(^H zReqLZR9^ec06ApoDF_uRYB(QZFOJ$Kp~wr=9)_L9(a^xuV#1LRRprE)D4b@nh`7iO z(2TZK;<@JAVvvGCX^@QbYK~1uP2&{}^gLq_HK8If&rHRfcsTZ&E){+w75v9si=ef! z158&j6lgFCZcR3$aw?zBJcb(tH;G6lx!G^V-`z39K+T9sQ`D0qMuelD zMjZ73)1Y!jqZXM6qnhhaf>5053}+STK+dTr(4llh*=x?yTbcYjW|!A1uPgb%`2J9u8x{&k8DL*4PI&xf$#t%M;&~J2ooe_ zwQ5X^n3X20pN8h4F1m>#%Of*lnzhrp z1`UM8421@QZ5k8{GmEmfs*(UiRZOVK`YG8bBcbsmiBW|?rI~GA%;_5y*T@GbS;m?5 zA5E!Jt?qcOt5mqJCKF>aW*B2& zpmmrYPnAlo35h9~`p@bC_Oh%#VV+=xZbi~y;o#s`-RZ-M8lsMVnmy|uILLF1s!7t|Vi&TSiW_Zjhxe1T+2JLP})X0j&DXIeGEsA4CRp@lo*v)ccXA=`^u8pbBrzPqi z3FM}4nc|bGi$0;Hh|vZOI;=ZD zk%9+eXJo>u;?ABmMu7G?10F>{s23c;Ia6&GyTELn^9nIJ|IW25SFhmT7WvgZks0ZU z#viIQGsl)gm5GZZ9xf4l$pj1oRwXi##NNtn7IRD!gO1FG5piJxh;w8l7087nBEPUf z4XB}KltV*ihju?#WIN@9doHyi3=>1s!6`_ep$asm>m*k=*+?wrdN9y z%-cd`VW*P!HJxr{88;>z2aQmW?QN8&n1(>6$k}~I z14UxGsYRxyA^DMU=GJpb=ny9%)le1TF$8_EFVzgeGQ9`KBVP`oD9lK?AdUzPn{+W! zmCG?J6(>1Dpg6=x341L*1P}9xnld6D-NopeT1SD1MlGPNoyZYVmmzG~pgRI8&T3e~ zcFcH2`+*&eQ9G5xGa@u>zC*q{u*tv+BTW&F9XcdDUCpzhnMF{X+Ko0O9JDbFG%+74 zXa_`i%EqV8&~IUB(?How5|(KrnSs?sSWFsh$VRnY4LZaY^MDzVY;?r9wAMZ|*CK%+ z)H4QsgEq~i5Sa)LMxrh%(x#HBCLU*1WpF&we< zY|@WriNGlwLZvb|K-YRyS3wCL@vdCTz%;0vMfwyek@09ogiQ_fft({k%5_d%&JA6~ zNE4cP&KzbgTt*NFsYz@aPBXU`C}3e5i)rw11S@1EQKX$wqOqkC=}c%V05VhtVEq zbTPwDJvx%L$TN_YV3>@+hdN?Xt!7FZIpI5WDjhX0u8cUfC#)DF(`Dvbpo57kA-c#CwbZV(ZVSv9ncQ4+ckI(y{*%JWxue{=WR%P;-i z-~Y)!`Sllm|JH^7DmTykRhABVS|jU(HONEnGY#ovnGOZ8IFz3h>23xjLm(MvHHiaA zPP0bvBc@PBDTpbjf;@{Db|vQgM(-#jUsIATtP z)Iqt%GnN5B1Mxs&;7!jRMrDJJx*DWv#faFYDgsf%KRTWczG;!jtY!2?mLO--0C?-d zXEf>&B9U`MJTge7GYzVbj=HH{Ga^Z~i``IMCn` z4h6c^l)JiQ0B1&!G0l2*EkqiK#WXnCGcyU%tGAQKkTRme`HdsU#MWait&i3d(`fL> zJcV@YwjGK6TuzVNJavqN8oXc~T0qs=H0x5FBZv>=O#h&p#$46J9z-%WSPbXP;ydv% z;y}z%RjN(InMwy7Eks<$+@@Fz0mv+bP{`ETG{GBU33-h%jQqN5V;T^$%uc3ZnA#;_CcAlb%5~zayCIDWgN|OhG8-}t zIcsh+`oR1qZwb432{G1fu|ZRjkZnTj72;^rk+ZSpN&ZEB4G?ezT3p4M%gE93Qeq=# zHe#Ce}Dm&-QJmV3fHEblJ2N!=PhBZi6q&7y5uIbGeHHqyvf*aW1U7 zUb?!xdIo)gUU;aHl~$u-b8$foC~lRCME!$(gBwrah*?6~R3~TRoK`1iqs|5^ zl!UcOJQysS);7t?QPqbIs2zXoJe6FOPhGlkv%xVwed2>XS@=Lvr?l>1&GjOh45?Uuo_=y#>jyqc+0g>t$y}BG_+A9Xy99s_W6-k+MG6uf9jtdR91Q+If_)cr;09f7;%ahya=4brcG2qF>p-6Z{4Q`}9~OFfD7lU|@S}OSYG@ z^;*`4S}Gu(s9Ik2t_0Qcs(X04kxAwA=^7Y8ni`NOkUSg=2&nLQi*_Zb)?U$z-=3Us zKmSc%fWQ5G`+2Ii&DRPcZSR_8?LEV1?cEKs_8xz1H(t5dGmvP8b5Hb5apew95wyju z0FYv6Y0$2-Sr@S}wkF%xQgokWXt&s{HSu`+cSXoK5L=n(ke%&6pDrZF>57zMvwO~V0m_#lYcjx=n*6{<&E@+*a^FXJ z?fYQDx_{mY+5d#ejomA|A82!y{{<7)%qCWwM9Z7grlBRGr9n4-=IkJOcL&s zHjS5o4aa7KtbrRtD$4AP>!NT2%y5J#+yWdLNTD3()VI!&5}UnX9vK*JE%hymD>sS$ zrH>&_;Y0)3>8L$@r`!FdTNuqWf@p7L7yFA*0?rbSs@mzOl7}*AD3W0Zz-iv0A#{kA zU?LtT*{<|>+Rg|#05vBk{3J}+Tm9SYsNUH9ncc^B_r3hmuYKd&FMsQ)U%C~1n2qT| zVVBZlfkgYv1|K)8%LEarqJz$%P#nzw99l0Tc83e}Ul7w-BH}UR2eTZ_`S46@IIk0* zr1J{e45A3I(f&s4lhLj@7h-GdtJra#D&1Bch*B9{t3({9ca>^R)&-cVlHsgbTt|&3 zPD89>n+Dj9it4DdK1HOgi!|EK!%yaeRN)k|&ar@2Gqmcu2|>!L#Bmj2^wHcM5syF_ z;&q*ite`rZ;w6VyR&tPhDtj;f&3{8aFWTHjI)c%(XuJ3eQ%9Mc{HoM+V}J&@blc9|88Nud7GQ-p@xxkg=|I|>(5;z1-r7ok+#`_ojW z#B+8o9Cw{~kQ8> z*BQ*%k4{W)PMP!b_nAGxNB4Vz?t;T(a>3!TiT2Sc4|8YaF%Y_)PF6Ocn7EA;*#W{i z7<662J*Fma#(fWs5%%UDmvF4csL;I+w`>DVVAik`w?`)2?v)u2PaYfX_DE*8$Hi`s zPqdGS6&_!)8z{h^mTnXoa_3;sbqTR9xp%NAtX#z(5BnRV!ft)I#cmUrYPT+`3l|Uj zWU>*&g7p!wpUNPJ2;x}6j$lO zdmrvSf<1_j%G(czT^XDPyN=b}F^rrouw%IGuro_NG|ha?DZ>W?AYf$x=^Ev=2(SJhhUgKmq=A*hZ1r?HmlcE+N(>_YM|? zl^wn@OEpGCxb)!`yG>wfmg=IqEahRJOg4g8us#CzQyBz_h&Yz8Bc-a3l(08Oh3M zE>EvyDNukv9kx+qb~^`yu1kn@$-RR`VddV*n57z{B3$}#i`^zLHA{6-U6%5&PbM2d zELa}_`>70qL_{1**pX7zM@rZmqeAyS+i#TCJtJA_nThs(372P9vJ@!5pAOq7GP|9FLDwb3y5!!$qOfws zZ_HASQ4ubExW#T0n3|=!s4h!+*e8>XAQr5Tfc;bkK_ViKCG1G4>LVrWjZvX{AMQPZ zJ&2FW+Yg6b8Jq^Yj@8{UjGQg7W4P_GGfUk!d4S%{#*=4G$Wo`mS~@JE>r@6GV7plh zn*)#IP|?7@1lX0qX|U^9@1HECVcbA0666t+!>J6)%u*V?PokVlO4!dnC+mdW>o_-I zpJQ2}C1c>JOqiJCzK84EB?FxUc3mJ{0_@7*v}J{k_5NAS1-@Hkpd%L1r!we~o7Xm3 zmDV>Kn1M>z8>2$^KAiR8GRbIT-|uo6=p5Uxy0sQ~Dl-uF0=|d$0T=6?19sg=z698n z!D-vCI@bGV*E{gtA_|WOdmqmFaG7MZv7ZaN40MiT zYCVDsJe3&;XC~jn=cSAF&H=j~xL*S7%HXtPY8~tSb2}jL-69H)xRh}!gC4nI1}cr- zFRw5Im9RHPh3%(P|(Z+s%%4MK)T<6oPT7joB1L1DT_wc>4#d_y}T`wkH0_@7* zwCj92*8ArcW#GF-6drMT^;8Bua>EQ%8ogigWd`7%`b@QhEcQ|Xb{`)^DAO) zx3WO&JiDtIVtsTXwinX)n2|8_F;D~>y2^4vOgH(X6C8us{%lqeYsZQOV&^##Q}KyU zA6=iEdVm}pl`e?s!E8UoUz%~hjdfIc0bqZvMBy}79KvbgJXahtIQ!^?b1&qm(`@k2 z0Rai_5D6q4Fuf6_1P5R^UEv5YoK)Nc_?we33SFnCXM%QQ zGA^90^B@X)ISpuC$i1D^ztKI&{{>6TlQ{4eoR&XyPR+}V%+q=mK+sH85_%dajyn(_ zXnQ#gXhGee-4A1latx)6;I#aqrQ5zxR8Q-Bf}yANVw0d9Sy~om?>vaYUQPpA7c%rT zbPuZ8f+ebc94iP;%OAQz$QMnSr}Z@rK{IQt(9=M1+_nor+skP{3syne{VS#MMn*7Lt<%A zj%NFA;7I)*TWAe8eCvu0I_SLTJAMaEzZch{EgBdN4=)W$)RN57whscB;7LBDZvrVc zsEG3fFp6kKd^#EtMrDJJI2SMDh$=sdN4k)23%?BqBD$C|ov-^jrt&+B^Kp3b-O`&A zgGU#2mBGCKIx^Vk2lL0&#?Si&45G+WbXuNSWHkH-;pM}eXv==PJC@B1tQ@^G9M}-S zd2doo#?a%-LsfsC9vr?TM!7LJ6Rr!N%d1eL*(% zUL70hk9-ZLm?+qw29c9%YC zw2K2JzAu6Tqq3AWA!k$!>{vt&Hju*+`A~(ISM(?&ZAihD@V@r#fH4k@si0g&+#p+t zkwF#0iG^nd(5y~j3lLK(19=Tlp(i3FBR2cSscWrASfS2I#K3}?#$dsRYIAv;YH=1# zLkRCIMWvenNV^%+d73GFUWttdLceDgF--$9g^A{4vxv}vnMuE{EnLe2kZhuh*RnhqUHU1F#Vso@*{(v_6gDO5xs!mMWijHeUT$>jSH<1!_{I0)B(v3f4E=ofC8oOlf zoYd|zz0Gq=3=Ns`Lyb+vLXUTgBYmR*Xb@@r~$$l);&}OXW0J`aL|@* zRiMp)Dn^~xxudHnxU)rF9MD1OhbcZo14T6r@JeGNqJ=GTZZmB*-U|L?6{%bNI87=i z8jPG&06TizjyDRhx5|)gJnD$quCN?xMbo5;a~fyy!eQr9JS~<=JzNFbfYa=nn+W%EVthl=CH?rw5{Vb4A zAn|lsdGW`8QGVSElkk1hAtpPbj=^`3{(J4%){D{+6XJBC;o_hAj<_7c5m79n9YM{FKkL(}n5X-`oAz z%P;-UfBHwi^|PP(zoQ@0G#H~BzEI-CRG=>G9wv$nD{g(zX{#u2s8e4<&zGHjfQylDnGj9Bv;YBIA2Lo8U6sXG1G zFwL~XI!&_6Ok7~0;zXQRh_m{1lh~P=H;MfLqP^)LKGS(7F7g`YuZ(z8f~bkd zh&1604?D@uj1~oKlath(SH!M4JK`vo4G<`-4-0bDcixaH!VxykMBY?p97e2ptu3E8 z9TN*~3aUE&C_l|>s~d;A0t*!<;=Dqf?QU%nJ2Uf4{N2Y{*NlpGzp9Yhd7Ze(YsfB{ zsWv5un%KoSmlN=?lkChbP6cd}lhmA7#I89z;wY9)Uc*kpVL`6?uHG(yjWdxql^KT- zYhKg)GG-mhgGp6KUe94dq~l;j?z}|AMS@Uqjv%f%JKL++nVFM|QcC;*OkCtO6({1nLTqj#1e~4inVP_v_W$1C ztfvC1b9@DAh>HyEnYhSnn7=aOO$nkVzDzr3*S9wLcI{y+V%MAT4gFe1;^BH|)7sW?Xv*PNa0 znb*KMGxMzTir61O&Uy^0Xeal83D`Puk=HPbWPoi-5H;~-+L_U!fNgS;+QU}Ft~nRP zKszIjQ<%vxClPB@#py-vcYuJ$`7wbMESq4@l;1@BowOO}A_D?r?j&2BM68B9!t=9$ zolQ_U?|aL+_M8>5Yn@l-6T{g>NLC)rU>29Lu1?{_nSF@zumNeF4QlxLCzy&fzdlEd z2x@hL>V_Z=;<7=B;O7}Y2hJ@6N8(@-Q z&7d4yDQv*{o(-Dg<{x<~a@^sY1DdX|twm!G;<7=B5Kyl zO~kd5MVbOaHRpmjbs;sjf$lrJIcYeb>K-KH9kJoL9s)oF&I$ z;OwAr2D8XEv&1^*e$ zBFAawHL+&`k~!|i#EL;_ya9d~HsDS)8#KqwKZRA~xWg}0Yr4X#05tX>E*q2xs$_5; zc$a$MNE{5#nI~^zmA$I4iMUp>NK-(l=3Ee`E~Lgb(0zwr=rEj5c7^P9p-uO-Yx@+* z0%D)U`Do*=b6yeKaF!g0f%&eerjZ%UBFAawHL+&`k~!|)i4}v=cmw<}Y``mNY*69m zAKNN&-1_@$V=!sD!kd^h_8=}BlnAP1a31&`+`y4I7@RXt-t;+^4eET+&t^9H&5eE72;xpHMc{*$}@JLT=02pmWH^k2~%`p98_|JcNUT6Aiz@u^<| zPzCyzrG`P7z;x3$A|ACj=F(YMiRahQYIx0W)ujTeuPBfH=D89pI-0#gm(oGs$9YD> zW0Tl)ABK>zAQBWCHX_H2GmI2Aq=_rs7^${$SNEB94@U8s-xV(=ew~<&W>COjBtg4c zPN?=OQZMY(eGlTiQXx_7VN_E(1^T$WPcI5hj6A@GElOTUdhGAJ4(U;fI@D!c)S5VE zU8aot)YrX?_9ld^$Px>I+=dF zVp7U%pbCVWHt^So0};sCKpk*)#$(x_$`7cli8NfVrc2a@T(JdpG2&o4$wpm$*-+;q zGb-kpY}8FB|K?awaPKpm8co9>J;H)i=J+-kxXA0_WQ^jF4JroCba^4hL?h31H75GC zBGt{Hs;9&eap90EPDEU|4~UJPg4`^2u_j*^yQrYo#ony*fMl(Yn}ZmHw4WIf_utr{ z@XojCM|jm+aLb98K8?5VmXi*;dV5)K(Z5FCMT;VD zl-Gt@q!lkA@nEY1WsTr90cZ?C;nx$Q!;@?Xhx*c#NiY7hpSlu$v~WES7T&KJ*r0Xt zsB1|y%@OOI3+pTKppUsVDKU~yz+te+`37a}9(8uwZS88NpMA}MkpuFIn$51b%U zVUJ7J$8o03XdYv;tn!Q(9cr_(Zf6CpfxBrPVpe9%BPXwJD3b9nRpJO)>jjESZK@9y z-Nc#3q}_}$si2P5cQ16Uq{h^(1_KZp%(`4A-;JyMNE+v;1m^NaHF`+C>j0&RMA6x# z4{c@4B0E)`tL{`8duF>g^Il(pAT|o?UAe+9x9l>iCmCe~!nA93?d#@O zh;P_G?z4Z~Z~u76{_&{&1HW9n42@qIU;e=Fv@d@=YyWu8{_!#U#|!q4PuM>`J^jIy zh4&z?PT%h4k3_fAzWIlmTCm)H@tg8(Z%|zE6#4_k=VdS-QtrL*_KWy|_d(u_J6>f| zVXw3wu}a2jj0)ZRa8wU>bM6s&+7+#03{YJ66qyF+U@+f|O>~~Glu0Ai!}UrPwjcEF zeM4>07!|tr;m80R7&irtwrx?20g8J)MTXxw7|11p(f{N#3UedX!vz5qwjY9r_%%j_ z?tM5iz~=q*k$)2pZOgtG0~Gk707j5}kZ{!C91P^kU?YAdcWm>ju<|vYajeFu(7g{w z{4js%@6WgSqZk7e4-0;M#xW*6F9Z3)_o#Ep9mlyUY(Hf*!qO8OqeAyS9M!|B@CiYq zEt-olKr#I`gz-OFW{>`N4hFqm4RtQLw~Ahb?Z?&OSdCGkdmoPYJvX5-{p^Q9<2g)F z#TcM?+EZlt?;H&JW^kx;lQ-kuHhM+aegG1V)fg4J_u+`&$0jsBDhxihf*&Y8;wdr> z&cWcLRn5`l&A5Nm3Hy<1tj4IouMbE3J~1(PUeNf&3VxvYxTnZ8I0u90E1jFX8TaR% zuph6+YK#i}`f$YW(-VVF2^ybX!4DLl^c0x}=V0)uO6MkT#{E-H*iTktHAV$~eK_Lh zD?(r6_*vV}Lq4A=hmqA$}l-%KXDr{M;ZK)729MyYvVxTkJ zvnv?}6k1a>iY&&@!JwSsO6~|s6}GH4w#;xCj`+PWG0+VC!U}$%&^fVDWcZzfL7AaT z?nqcFY&lzQ$

X*>93fu6$oB-^$82tlSt~l!Unqt#Ba-_h2eM62G{~Qd0x`;Z< zb%SwJ3?-Wi8`P*AYfHh1;g(5X4zt`@6k*0JfS<7?tCqG4m_c#FQ)DoogF&$T8RX5l zV`Zko1~mo8+OjUhaKsN;Ox<+L?$z{Ly$10zQJsT9>82%jxTy*o%u2*>i<@G&#ZBcf z6{n<%?2{g+!ZQICe(sp^l)9n&sSJV`-^jgP{t;n=dWmCgNq+iM&!|r{!!*+s_<=(4 z3ye(zor6J{^h)m7Vo+gA{2HS|_deX>nQ|5{=l60OK+gQ-Fkg=Bk%5WaaVMIZ$AWVC zybQ`sq>?-K|5VsA>25hP)uemek)L`?P%aa{b1*13kxK5^8&zRT*WPmEhvBH+aVJVT z4+Q1%c^Q_HECShvba%6?!sNQiWA|I1%AC$}IWl(M+mE5tXuEGZMDDm5J zsU}3R~j0WiwOpJIB%`s9b2Eb1*22 z&XW6OuZ@nGz;WkpsSRX3B|ECJi7NZ1*eWH!=QuG6Rz>G!Q10%P+&?^$!aLFB?p{#& z(s~~rNddodcP~gU#P7o+Dd1P`?gi5u@w=oWDKdC*nj&#&nNO}wPjC&FPjJAa2hmtJ z;i@G2V0TFmTT!~>u$q0aPSpcN)W0~8WgqMX;Lwau`k5e~KxW)T=9Bm9)rV!G+CDc; zx9i6{^zVLg_kFM2e{J`_?f%bKZ{7ag^fo=KqV=2Ex=%;S^*hNK<@#;hjB@=RYDT$! z12dyszk8TbuHU-LDA(_sWt8hTtuo5>J4Q;mcq|U98DK~X@B4QfuKD{^)ZpqqY0%ZL zuH0Sd6bmHS%IAQ`9ed*qfOCwo2!$G&10J`brPu1qEu~9hu&9H5XsUx*<+v;P=NMxV z3VVwj@VGrGy*gfQJ6#fkMIGJV$E>WE%C>AzCXvs_YN5`#q@6wVYrs7aTevM59y zN3x&>TgYT<6Qv2sg0f;ElTA>}wj`@2GIz6-WI=AGTlVr;pXg1^;51UZAO1S<#6WXj z=dn+Gc*&MLdVQ%+^g3j4bK(3^ba;ns1rir($R#IG#3-Va>T zie9KV$9YwGBy~v)7Io_Dddz)mYoz41oo=?!_UNuRHCoy!76|8Ikjdk(>jm`{#ZS5y z;v;H<>w1|y=&m;jwk)8IU_hPxjl0zLHRF>?~`x|wADm1U55U+mAjSjH&Ufe*TKCn2KyEI3#K(2-C9Gi)n z#)3kYC>*z$xXNHr=N$WX>ZU<~O?8gjw_9bfsB?}jGEGrI;ZJpr+k;zWu&A?XH%k4R z!eR4DulBUnh|3^Kq07W_{c<=16lCwu%T!vU_o~v==*$kiG0a;2KGl}Bxtb|hn=c-* zsg}$<0#lGq3T+B1JR+$jPi3&EbN=g1^yXwwE|VSI_0{xN&lTWY5`zVtO?z^gI+#B7 zP4O+$r><{<9X7(dmBFIUraie#9h92-;&xm+QodwQ?or|_4w z14jn=r55VcHs%Wd@0VUk(RPvwiu_Ux$5>m{<(FnS#@f;|zf{99$}N)b$@?|Gb#?c9 zyWf5F*2P29$w_*}W(g4N@-BbKrh(hlUAoCTR&Ez}=_Z$2<%Jiwg}cy5z3;Ycmu`Au zc5O;KFUo!>es@qeC-I9NdeaNvVMUS0aQn#gL~n6ngG_Hqe{y<)(>YT0{VRQ<=W(Dy zNyR>RqW8n_1c#FB(+@WJ1Pf@Duot)N11+#&z$g7wTc7xoZ&V%Z1H?Rrc(qge=#4s1 z;Ti_}^u-aM_$_rrs(!7Yr#^=I@pr*miqt8E!@d~ao?-j(7s=v0%aP0Xq1r7pm!wJD z)}uwcziO?;bKj>4i|5{Gif3{@{;pcE=;W~F-R5@7t^sPZW(HqA8LuHtWbl$-e?3GYLJkh+0C-}yx_EC9o+@^i- zL`TN&59(Jq@I>!7<1|a>K@@K~7od+m!B27M9cVn!<0Z_nO6BKVyjrJJSQ7XfLpq~j zUe+gg#Z2dAJkdE9Pjp`X`1C|ilF&z=;A~09>DNqX9n93q9m`I&4whnyb39WkVyFsq zP+Qs3lE^2j8F?g^cPRYuOtE_v<(qpYCYI9d1bNpg6#a^4i%F^eg0;YU7xm7oX zTEXr&bvmhlDa(wt8s)(1N9)s8!%V&z)~CHOtWV=hCj=zkFl2kHQVX=p8fdMIDQlp3 zdy0~^GN+KNJgV#qDyB0OMp_2>5+^QdPIY*qMGu~6iQ`KpJkfFRM90As9S4b9 zpZMa*PYIYdbOP`tjxV12#UEnmzbNa=AV1Ax8LuS{3L1TaNnHyOOwT&0qkPfQ1W$a4 zqf@vq?@$UTm7l`>)Vrmmz{skFFJHVC7+Ll58!HqNSVP3h~8(FCajrMf}z2iN-0OXmQ|+IqzfrLie(ZcGd3v-E052Y5$NNzK3l~ zzK{1w+wJ4i9}F1?ud61%j)JJVAJnf2aU7TccRlopt_u3e82iL-qkC%JA@StX!V49) zf1*zN>8X!@q9F{!=@YoRR@gA5K7rfldNp=7T`?jF>k1Z6)D}QqD^cv$=@U@l31=pA zF@HZNe^c7a&!V<6w3yafFLu<2nSsuklz6881LdrK-;~JR( z;vK*TBc7-u`30vB5V*~C2_mEd9ml(=L>)8=TY^GZD0QYc}4Y8(-W-$;2WA4;Za(p z;K`@PYuSCp%2k1`8v3F%Ywy`0Ywvf;viAPAb=KZ@xU=@Y%rousLv?+z)_$mNRK73s z46(c&)fa17d;fk@)^0v2z3+k~&djjIL;Sh#aUKHeZ}A!RBA;PUT4*eIPxG;`_dTOK z$_AZ+{aOGeicZR?_b>%Z#YI4o{&d0PA;u8e$EOKjMEcN0d8$RNHx*RUQ$ZBannrzi ze|qYpX7J$+h_zZmYSSeLAlAf+WTz<-hEWOeMD@ZGUD~0b*C)_apY&T-w2rShVGFH< zkk<7HtfRHjT9Hxic$I}y+m0#)Oj`Fmo?cR)HYaZ`A8BA5C z*zAoITZwxT4T*ariOtBZsv0FT?Q4~4Tw4+FvM`IUN|AVNUn@8SBXKJ>on~})q$1tb z@!8B*Q0SxX@52#^$A_#29|Baj^?fSx8QAZcAQfp9;S-M!bf0E=-X=Z>Yu$-L=<5^g zTIf>FSA9O6`=ruS2)X+->=(a24f}-ZcQ$-#^l8r@ZebG8RPB!g`}DHReR3U0wh^!o zL1q2K3X|z9geSUg^<@SePpLeNeyt4$Rw}P797Y}3s}Ek<2P5l#MTdyG_X382Tjr~^ zl(9BJl(S2`1f{GV1+O8VXoB#;2Bg%Mu$(^eBV#F|BO@gA36h#3jwd>@_X%*7*yKB?}gb4;*v{8Ba8cfTuoz zq`Ff2lzS4N9BBECf?UVJe5Oy(M{zQJdYo_^A4^ycc(2tb zh-5u5#S^``<>S`JHlC=rd9U@}?>%x$T>1F)QH?&jp!2?db?T!z6w#;=g2>mXM!rDI zED1(mvVsB%F`j6WgJJZEPcW!rG*!fg(cO6{pilgQ2Pt3Ei8m*p(LMlFNA~p*`l##R ziMki6MNNv(9g`%3sYP-YiRJf7*TQt|@>Q9A%8N>C_ovqCkaB6bw)9(D-C^@U4ddes zebo28<9g@z5#zH3HZ!ymfLkap^wC)K(dmm(zZlsv=OVOx*{$yGgJg?yqmKrO4@lsn zeGq=i-3Kj#U#XBpw6^Srt4n5j#MVJi+dt&8h+OZGjU8Mg;S7U$NoOkLLOmq$eg!#o zPv2Y3`yTYwBO31^TX5@3Hfpg)Nf-2Hua~D~+Qq!Jl65ib>#R!)^Lgtw>(XEL*|-1Z zcyicR9Bel>>a!E|#S^_!=dI>_2~Ttr*W1ziB%bJ2qPL^BzOQDzty4Q1-MtriZ|pw2 z#E873DC>E>=;VRLP`b_Iw4C-(Lr9(J{Z^uf+TSMd;Q$zQA?d07!oi!v0}FGg z%t(Ej3h+en=?9sd>B}>ew$5_ncz=(5Y@W)f;?(3M737*KvfqGh-$ww&?JjE*LvB<9*P4k z=6ofNT%gM_*g^{|M80MRANj}^YEz#tP%7!jJ`)bT_i#uIg1@7z8Bwv6Ms`v5>iubSeCYKkYSsSg{BtQdMKxT%ig zL(7Ms4=p^=@be=hNHl@si3S^l+`U zK8)cBYa!})aJB?3!dQdWhcSFZ;{vgRpk=jD?md>J#@fZ>wbgxlGcel@DK8$kUCE+C zif=WuF!4U&%U2)ypz>=~%^;xCyaP{CDj(!jxUU=r~YjZS>N&nG7;-$$r5fM#2Y8!<_%o`@W_3#UI+AnVG+jbA8u#ftEh| zi35c9^C1&H+%IfEl(Iot&8J6>6-PzoNjZ%S4@EM-nZpJQ!-k80Xw_|5e;LiUk-f@3 zAL`%8VR~#C)Xa;Bldz#x5DSH}>hIMI79mWnI82D;<4{Wo%p?m4>& zhR6rcEN#Y2&n^#j-1*9%1CJWD_+5yNv}njioiFXXQR(s@TSinnW0v5cM*dGM1V)55 zJ46krK}n$+_d|%(hN!BpE~6@OI}6?29DR*&A;@kf#Pd?CAV%oY%Z;K4n+KCo=R=n< zbXDy68b`qyPXF-2z;H%+#0DL8H5%a1AB{#`^&NB06wzZUGA<-pb6!@Cx~iMOaVVH- zHNT!#)5E_Ey@VjPB0s(et$f=y<{e!f34dZy7BVL`Vv4JV~E^&*p#S|)JuI5?s4xzKMYJ~H4T^(*q|WJ-sn=l zsEev9qhEC>P2kErPD|Qno-T_#fh3a|bJKL01*%+!BH&C!2NE(_!3DCpIF4{*%^|$S zQrKJzYoF&9`4!#%B6eEIv>l^`*oc7!mN=$CqfXh)!L<^yCaFqf$u=`ZqCHI2O02Pk z!UoNh@J*9x1xmCr%sic`XdK;Pw$-s=Ldt7!MP17VB|_Vi3nYs9eAZuJUIkE`4UJSF zrol|ZFd@@Qk1leW-Y6c~pbE%^$c0z|fR!_g0Gw>>d7c@wi}IJxCNKPr@CxA2aL+=a zqqYm#RT%(C9$$#fs8}ExeZ>3FW^j=Bna^-WM^GGr6`88UTju0hs}WBlJPh^7qLng7 z$YpI1jBRGXblI^HKQk1-WA;?#SIwm!Xhv0yO#^OX5^GZwWsxkezaQA{&bySYu-!~qlMU}_*53jXZ5V@;)fVsMOP@Q0@s$qd})A*T)Op|e3* z&7W2o1Ie%&j36NN@3QEO>jQ!4`Zgn&L_g*ZVrT>!!di&XR?RC}=`hbLqfrd5^eBaI zHI&-<#bPNXoa&Ts=3Hc3BG0vOVWCt70k50S#2F zm(&;L?TEsWAR_Bkg9uJdS*)6d6vH7K5(eZhBQ+azFU0WBjS$lSimVjwc1oAI>q(&S zdnm#5b2Rj7o_S?IE|rbGSSM$;HP?Alm8*63d_pn$hMyWjFM!`<3;5XSbYN9%&^Q}- zmbfrdx{-kf`i)@+Js5_j0Ro1BfrfA>G!QE_^bAR1=rr8YPyj_JN4uc4q(y}tnT7sj z)J0%rn-8mAs<5l(oAxF{JrvJD)=&v-f@Hok%i(GZCL^#Tu?cXxhiVqbkC9V7B_b|d z8TrPDLpjkvH#6)sl`FesLiqU(DpT@W&v z_xIO_Qeub`RvQSmaNa`$cf!u65r3`cRMpp`Zpv$4&15n?Edh~(A;0}ucjV&RB3S1Z9 zD)gc>%^nyrjpeXGvxk8aix>*0a>Q#U?ITy8BU{1q%^|Ybp?^O$Ra8%)4RkLotW=!& zGl^q;YV^ewsf>8Wy+~MPc+i@L9Ts04md#6Z4Q+^HbWJ4ek2eGK@Obr}3kP{r-Q_XVrg@MMJx( zn`k0J8!H!;O1{IeNM&p?cnUKWO{*i$@m$0J&?B*71@u0($e^RPcOceI8A8W}e`ea7 z&qk$-Sx6O%i`4STMBFy;uBiJF93&nlXZDS;+A$2EPX@+JTx50- z8|>*n^tL0!VE{zLg*Y%QiH(v70Q$L(I$OL*As97OvL127T)D`o2{ z!p|vE30JR4K-Y|T2Fh{OxC-GPyqj{;v;Tkg-Zo^{Ex!+X_TDpd&YYKdPo@cpnRZ$@ zr$QQosp*GuB7!G)a|Rmvq0}VD&U7c6$Bc108Po~mWH3o*#)RPXq@_x!O%*A^1Z**q zw2Y)m3$0qQXg(+=AXKr~elSI`5U=00?sfnEzx97v>%Q;jIr~g{_Lt4G*80D{u63>J zx(CU_2|Q=ugi01Se+DZ`3sZIkTu63)ccJDpd|)C=ck#1k1B`s9WF1$03}RG^CsaHSG85+qJhl_u{i_huoA2oE*o+!Jw0%{q z(`Wa{7Fh|26N8})VD@X;<73Vo>w6EsU`poZKX9IlICfn=f@k z%rWE)!gE`k5ypL*!S(eir9FKM#+{rP{j-@d{0%NFA=^$9 zMvJP(^$f*ZFLNKGY4svBdGJ&0jb zkE|5qeY6r}hYgGooKa%u(=3Pv2yZtscT{*o@- zAA88c{b|;=@KIdF<>B%!Mf8mYKZT~-a z_}x#QKioWdVH?!wzX?yoO zOSx{Z{}wvG>fK>w=l&_v+O@p3wc{Q{xo@|iM?5A4ATOI;n^*~Tf&H$r(s@U3hMIQ3 z%4&SyeE=pq5pdxj=TlY!@dp)jO*>T_m92SBuW1;avYAq(OD$a1LQPMDl%4yhOwX_7 zbxM@nKYgfL?RMh(5Gs0n?LjT6r(edBX74Usw=B)0obRuZv*@>vlwJk8*;LJI^T7+uKH~S0(wnW)RFxmD> za@Lw<5MzhQ-RCgDqN^S4ey&><~F9-vlz;xg&Gvn=?cd=( zSfB@G+x?c`3OnwHZHWi<Y)lTE&;MJf&*s2$)}E}Pxhipb?JjE{CbYj&iS8lQOYeu3riwI!&k}D zmn1NeweXnB9^|*Pu`v}HSv4uB9Mjhr5&KyjO#AOS@Tfs;FSXq;m5?pAiqk%;Sm**6 zvnx^!xaMfs+0jM$7+N`M4;2fJfRPW!BVfmoY|!HxsCbfsLhdu)YOe|v+zwSMp2YBh$O+R2CbDcc4XG=z7MA$!!4h3EOFGj-^>hoa zv2V<*TWB+(v1umK&x57qSnHobg^8@b#Z^XQ`#wUHR;Uw05!+h-l;yU~EPPq>z5?Gv ziZ|B4#xE-_OZ(OAgm`Jc`X*9VrB3gSY28!cdnj?nBG`Ur#dT@dnVs}5ZG4{&Wwhw5 zJF4xa@3qwlrHDL)Eg$9@Ga##Gjnnkl2*7+^XZpD8fM$vj86pd{r3_I67l{qUBJ0G=!p8qKYbxSt3pEEGxiXaXC|@ZrbwSwy z*isjixyk)g&cZvUta@oqJcfpv8hbPz`kFdeAI-YF!mxswGi5LNNDW;02$BxjHqHYf zvtUg=#>2#uu`@j>#>oIxtEQQ5k?@2(13vTCol(TqSZkKXE>2x-I5Ctbb(kY=!?F6O zDls|Mpy@(qzyp6yD8}ipW9V&x2zb%G9C>0I?YYokt=@ zPF#jEKyvbRzc;B+B{B^!CHnKyt&tg&LuKF^4Lw`!)~?YMxpWTv;GivrVM+6kN$puG zoF*kb9aUMDj#k5iQZ#6p(OP#`#FPRX>2WV8Gzi+hj9lE3X&Qsu(@hLT1R0xZGl8o; z;RMWko-vdaq;tX>ikfQ8gbHtbf)c4&V~q?Lv%C~HsY+m)_@KQko3x8jg?lLQz&5)& zGoi*(URSQYrB~Zv6Z1SkQmK|dH8SS1UDMK@Gkq){hKFvKRQ{5!+=>b;HBee9>f_T73(lTFHl~mBiUfpoMk4E%+Irw1{XS6 z!W+ama;4gaiA=yavnWN}PhdJQh*7!C1lx1Er()95r>b7LP>jT42r_wMf*x#G)KsM0 zV2(YIauc79>ze7~Af!7g-f*SYlof0IHh^-j&zVfjQ8|iqsb|eD)W$wy#DTB#@|u}Y zUpEulmnyG&ewf^E#yxTRy28glyl9Befr|s3ABZBZfF8Oj@L~h6O~=NQ}lzl9Vk15@<-bOvmBPO{B`qPwqE@ zH2jS67Jb@4z}d|Oa?#a%Z%`y1IFZTDf_Q#=u-J;-N4j*ppJz$oT9KHR@&PDz8(b>@?#$EXsX>%d0NNfwME< zrAO%oBNYu&*_E8@ux5_4^i=#pUPtpRtFAZ!hlVm)-u~dm_MX)6*&m$Jaf7YSA3t=| zHJ5)kLxTvJ*gPs=gfr7C;rJo0u6g^L8{Xh3x2$ZculQN0uDSfv8ESB}MrKn>gR|pR z!toPNUGw&*CcMG1?O>~^`idXT>YDhA5xQpOr4?*JE;z^>dln`9_7^FKh;WH=nVe=CO2k6H!+H}Z}8Hq1iEKZ88OGboS);) z&2Xa$U%82M`v4s7;L?pW&PaF^qC8@bM>Kwp2Qr2Q&0orYd^K+XCO2k6_xp;qe@Z8{ zQFS1Kx$2xTJWtS&Rc@xy31A-27#SDeQ&MutzL8mkfuw-^S-yBJGAySlV*bl*h+Q#?`Jl(MwLKq#7Z*%tIX}VLHBs z-1Ls4Uc`xjN5|0s(I&*GqV5q!(|e?0)PdV9xZ(pJhJaRPvXCf_C^^EPLsxt_| zc1Afl^AMlW8$(8iGT||oljYHfrFV$?0d*^M%i_49n+)H7n+AG za+i7`0vmR+y~WCIMo)(ft4K1LoJ$!ht9(njv8G(qTiz&BZ|qd{cu5@!B9m*Q;B4zL z-O$W$)D_O6X?}=vn~csXpPrNHfxMAwel4uX#&h7}6vw1t=`@g{O?OJ+^gS(A*HZ2d%}o_&+EMG_SOi??;(W>~ z5^5Q1p$UxnCGCQ%Ij{>1DibGKS?XHa`x{`1EIjcr3DwPI_g~|SQ);ODO?FJN#zK0% zQrTHLv&v#9e&0a-MxXGRYLImyOBpIl2@QA*PNNH?gz$h__qvA9Y$v(YQj(Oay#YHu znSH`gLs|(>!SoTO5f@z-z12u%+*^*3m*R#PRjLN;q|%5DkG|3eDtn7zjV4`HTp>-()VB1jP1Zo<>D-_jxqXT@aA>wnwFw)ZtCath@p- z;#zS|pkw{Qwo(0WZ|4gA0YV*IHmsxm?t(z+;3f6$k@Vs2WMQzJ?ci|6lV`$BsaYHv zyi0VA4+-lC%!}WPl^E$3K8Ar#c2{yS@+jv7F1%40J-)E<1u=3hfxwJ3S{Wnourp$0 z#lJO1U^mS%`|B}<{s5sY$qO}OjNAo*?iit8m(=em$4FS5{@C199eVI~6F~UryM_xa zjUQY-VSA@_dMyn5nVmTOzLzbG1_(8pyx=n$?JfwEMk}e`lhK&I?jmmoF@3iLzD^3m z=BDcOy$CI(cvacv|65C}eed>@&hI|_8;9>W{4*bW{Nxw12AE;vdt5E(fm@OZc%F6) z)8zs7A`TM*1q6PdePikNE8B(tQ=`7?xB=}?aayC!nqua|M*fIYwRXxpTI-W0F>Csh z@>)oE?*x24nOaqI<-XiWaMG71=Onpg`oePcp?l9PahD+Coc>T>IHT{QZz&2`JLsn} z^(5|8Ef26e+cD%50tEytrv4Etlr&Z$PFhF9OYo$H%5-oy4cb-MPlCYqr$1Dx#TJNa zNP3vUQg_kDl$}aKKy;^>+oTecxlbzk?U71`LL}-iJGFR6D!MrRfo_Fxy>+T&+_N{5(kT2S`a}#dYeCgEyG22fQAf#;OO>4vX{mTt5Cvbij zxR~!U8|G<_2b=QIA94id&=D9~M_^VzGIKNUim}6}Y3Cf z!)y9Nmx*FbZ6Q!pZfI23KuTTXD}~n$L_Csr-9u!cu}yj&QY@d;36oO=}$=rNWv=l3cJxE${sWP-?^OcY}XtJl%#c8mLIuU_@07r%))kxsE{j3WYTu zvp0}BgLfEE#~Rw9>_KKd#FCKr&x@rKVU?myd5#3R`Yhm zh^9SQ){iLl?rEnKgOj?`A2*U>AhCJ@ct_GX0U#%x{?MJJPZk(aoq}UcVkio_1{`}C z6bkxM?>uU-Ox-%!bHo_QZ&;iEXabu|}z5M5$v$F~ctu4@MLZMidYHUe{p6uTfg?cU|LS0{*U;eFXTp zIeNFLGLY2AgpTy+rT+!a%fb~KTm|wja8$X*R;SZ@rc=t0eTz0EvFE6UL2R>TNlYhu zMe0#52l_ptj$7XCnv3p=yBOJgZ|Jl6-XLc4ojJ}M3qv0ok-m?Br)X>)HDvI>ztk^) zS(_v~dNiO{Tkof!y*yGfZ-na=)gIrek}D-mfmO~iV#z1f z3gK#AolRQieQCRfn5oq4fc88T5k~Z7@GXgrgw>h$I6NWNIb;a)bzMq}3G)dtN|Jp+ zQw|YHP3~?t*B>27Ioh)i;hhhWzA+kHKAceb)WKFbZoyV_yyvilWAqNRo#7Zj=9OnE z9uOvao%|s-4Ta+-0e(jls_eb^4#7n;lQ#wIjr#yd{?&d)VoVt3Ns7{%)q@%WH!5!N z&m+cJR0uR7$EY&gLEmB6q>iZ4mo6`?#MQ#E0>qiIrodpAzy>Qc$beE8kgY!bUf6DV zY5Zj#6&ofFm6!$%)NWjePNxPpatygoc$~%nNks}M+yiQ5`8Vuff+1-plut8(Iz>a6 z37`ri2dKgcpb95|ij~dK0IG08^G&3kB051Xv^%UAdLw+CN;s1ogvczJxBwjsf`$e= zUkJ5JB*d7Mj3u;=nTa$cpflP|$xXYX)bQ{jVjcLPQO_i&%2eRE0vpQO$tm!(W1Tz4 z#3=ME!;&U@GXXO)1eMomvM%G7x;NyYR})YyxeO+=dOy)*K9|k|j2lc05Rjlmrt{#S zW_>uUAy1x+TX8T{?`||X(gznfn)suiySXtE?G;8A?kQ$l_=CD|4|7?#N5Ho5<9?y; z`9Wjb&)@!#U+A~qSa`cFG;cw@`|z`eA2@vU)mPs5>~FmK)ersn%mW z3xH`m%ArbV`=LVpT7)9tf@Mv8CP<-LW-rCMyfn&0koDZzro$J8jE$~k&DMDOmSe;ver#=i|D%_YS zW2bekg`cV{#c@>$KGbu<0zAri@DHB7?3t0W>DM#I$q% z3S9y?D;rA*!*C_~jy0pclk88ZB%?X%0!re9VvG;Hj4=V68FLAk713b5%Oo#aoJQAh zk|B-(S!o`_E?m7XlSMK>Lq#R1`ujsCJwDT>3u%xR7`WnuBA$8*lZnBImY)-faeC6X zch^xqzy!5t$U!oObwsWRL{+Q7s=hT$kPju-{ARSGu4x*Wutb9x%Bq0~>qvP3X2vlS z>dIyUG}7@4gM^O}jwYTDGSPQ3tV{DaBuLFw&( z_HPe6v48XM&maEjS6}(bz7zAmc6j|x%qg77oRMgRrD`-wKwgu(h$TxsvBwV@q~ED& zr)gH%xd6DP?6gLw0%hY7cc2J$QZe1MQjx6n7i`?_)QEX6)kCRSq0`h z+cDsjz?t1{1U%|a*DPh~%)t_1Iv9(K@fAJLHxp?qtzn@8+=B^BabWMGRL|_eBjC~S zgCdxj3_IZleM!`mNB2I#?XJ8`&s>t0__2;4&)AoMo4F29z590iPD z{*tZK_^BG~1C`nCI{UH0h-)WQ$llRWJmd%5ex)|{Ff4EY0-LM>BGcbp5ZJH#D}hDo z`>BU8+oLPgU;JJHwbjvaWd8vPA+Z1EM4>-G;O;IZkYA}7J>V_~$bNA2nUeax;}T|j z0t)rF6Dnly=%~N_=lq1g{xdxV4nRETA=EwYmca8*zV*pRlmM+KzezM&Z~uh5Fxzu< zsK1?1A$vzh@%A6)5CZ#ec@#JR@uG)N@$QyD|5?^hX8G-rQGfdvMTOa3#zI^>p+feK zj^g1P%pVW}`!{t99DsPghsgAI7X&^~`JepW~p z5ZJ#rT;Kr2H+YCle|JIP8!P?E=dVZo?LWjT%=Ts|)Zb31kiDa${(MF8InqbH_hWAv zPYZj(=S7%(H(T%v2wZJpwv+wusI9voQ0Cf_I@F}hmUV9>*Xp&N{cFymjr|+Th5i8X z9uJZE`dttxbA^1cdbA!~NSQ73_DZe*y3;m5b_@9iq23cPa`2IS%{==z*b8d_;=N)G z`9%MykGmjHW}cEd!dICMjK{cK$vi+u{ax0W;|(`bm7|nVe|JIPy3Svj4K`YoWTo@h zxBD(D?C%r(m9_gW2$b2Nq>gN$%m$4b^|z7@fbNtHWP>kf2iWb?O)uLZyj#>5wd>JtEQ;gfOx?}WX^aO z1cI_m1(eD}$Dqsxu}@qp{R+^Xl!>Fy(;sq>D%sR0&}-u}5Q9ejZJq$`q6`NyMg83c zfwx?pr+9bKMh78zw*<-rT2jBKKK&Ht`tgpt=&6GONoC#zfwyqeeizN&G#Tm{%SyYY z9pGE8n>;z=rCWIV*IgVD1>NG^5-1H&Qh)ml3ZEhp-TNE>O^NdZqaWc_A6T9WxAf@!^xh& z!pR<;;beEcaI)()oa_&@!^wW!b)3Yf`s|g*?K6G9(0p8wQ8;joE!$bD5jC5OUzC<_m@uOKs0!+HN{?>xF!S~#7UgHIHAzD zwk|t_0FDz=xN}M^B$wzi9Vb`xoC@xpz)2iEM!)P71DEE=@#Q#9OyR;V5hgd$G94$^ z&UBdTf5#sVpvrQ6-n-I5DNSoiBSMn5ftqZaCW}G9vz2r!5m^ji~ z0FLxqOD6^BkFI=O93KTIL??03Q&8HwxbRb+r`!{PlQ`EO2)>0M5717%AnAx+FS(y% zb^TCwrxAY0x@Q|Qi4ncSQ8wfq0UNS?d6ANj1eD26!!UXB7kN%8Jvp-PKsYNMy>wAf zjOZD9x%2G^NN@F!UP-<+AFHZ0x+07<2C*|W_d-FLF`}0R`u@PQxw>3$=xIS z2|A5Xf<75C;4e2^bbsLteZ565H_#^jio)tG1ZpAJ!<_z6dXpyF==zJ zgrrRRNkPtZjOBVyb;Y4HEd&mw{Hzc-*v+|&Grao2)oWxn`wKH*& ztNVralV1Do2)v2AuB9WYLKmxtNVM+#9)n#Fo=ZnknQ=ky{PUFx+zP{fxGn=*kw4+u^Qm94yN&F=Ye$y@zY zU!Otr4M+7vd%bc6hFZkz{wx=@t~^e8hjW?*I-0ntH61ujy&g}FoOHrzjiU%Ve4-QMnAr3V^EF=A) z7}sD#b%+tAjuEAf5v7jYuTZ{TVZ=izbyOZ*<7*lYl9U!Im_i+EkeG!pbZ^CENgcIesl!<=m_}H5%8lU;73Qm zkB)#J9YHK(gt@o(uwicXl~xbw`bkxI%HJnL%(F@sT;e0odyOsX#eR>cm=8(@k%u)@ z#qO0d6uVD`VwVMYR%2(~Ls^4^C(e|4FR)HwOid_%njCzIL_yS_oW&YV)JWYL!f|?6 zTKyP-{J@QM4Yv9kdRU{W3E`knJ}o1Nv`NQ^htd%QqmCe8bp%1}N3_@>#pwu=gF<1% zmjKl&sA~c8iQ1QStkKksWUg9;y>v6=la!Bg=3lX!5(q;Ug}(-HW)O5wfIw`t%|^8rp=HD^E@Is!@cC#Zo(M?hUifM**~ z|LWx|^pak2x|c9JmPtF=Z~pwv&GrM>+rO8;uzzFpgNND1vwQ(_R?*5G(ro)x){R-w zDQjt5(dcW47|m1gEN@BmHAI#E_&cnvapwII(V&N~SflabW5_qJSfjCsys6E-k1Fr` zh;rT7fFF%B9}Uo$MzGHW(2uS`CDswhr6c{YoYsNHbWK0+<{F0_~xCKf)eL z=lk(bHou3{c21tn_XFx|zK2^j-*ZJa-^)=p-_N$P`Q9C8^F1A9^S$C_^ZhP+Hs4?O z%;v*85NaaR!ymDHQ7Xyho~a#%uYSHG#EAN8?9X~g>nkMuS@HOe5dN%dd|mZ%0X!Pr zzEAQs6LM+I^t}|0hqjujwXVlUSnIm;g_GSgdLcX=?!RMeeHi(ms(BEc>4>+J*CsTj zQ2s~^deJTzYjgy7wh`4r&my6q{lZN++4D!AlnX+8@@o4fdcFonr<}!Cuh`jqXD*vJ zN5vTnW}BQX>GxeSD&{miLorJIm>?;6PFxId1nglzPE-Y2p2n z7LfF{%|a8S+f$5a>w^|bp^#E_1TB=}!H713XsUDsc+ftwou75I-66vRoF2B}q)7|M zc@#ua-h1WZn8mk*UQ@oYg~oLY=WPJ}Y7_0Pg4TP}xLSSKJL_auhI0w*rRnf6fil>Q z!Zi@x_t46+7Xl+%iJ=}H@q1N_C_hk`Qpboo8+v*j0d>6-*|n8>hu-Xc-o_%k3?L5w#3-qe0fQh0z3!?V0stVaQFn>TrFt*^9FL1V`D_bjvtbmBSr5 z1Cm?O?-7rN<#m^e5%nOSu6)QL8LLlWf2VjbqKOb`UhN3|>l$x;C{!^6N~Hj;Ei$x| z2@3Gwx0zG#2MaFW5qQtE#e6rnaUufm<}QFu_hXVVoiHvQT9&XzyKir2*ihHNKEBiU zn$~g--76jxW^FGp;@7Azpe@i5?;U<;4=CjaBg!+V>xlPpe_rCf9+E=Ov}Jd((9pB9 zuf7uwfqRJxC*!0_w&Hrt`I&$Bj1&@24h~P}g{Hwj!lRj>|H6jaB4R{sh)k{R5JuF4 zye}YAXnll7D`u=w-#jL4!y#ft*I-1?`{0{O3-RQ=OnHXiX>%S&kH!JkC_g^JKwWbH zc-GwNl>C?P-0w`-!s8-U&O+J!<-l@ijx)k<2dSu@( zZqr%)F39hButv=T%ot(B%?{DKSYgDO&1@J^URZz9j1kYIDg<~`A%NP{s3z!p@35Ka zXY%1>KN|=q`+nSYIv?0tnA2H~bUN|@6={3)iwxdEIGCBK1Hx;tdbMKLu50|R{kSVN z2?kJpcdH|a8O3~z2ZINRL81J<89}e<7946r<e#~EVk^LAo zyd zPi8Tqc#y_5Lt>3$#)x8uiz$Z~QQ0w~crc=PkTz7SSfjxN2UngkqIi%Jlor^HJX0IGT~2brU>niEQ@ zWp<}30`CWHC#<)BWmC`Th;Xlxocn8bt{npuhy{n*=db2 z6td!j(}e27?8j0=@9jbbe<+CWWsSh1Pk7)>F_-y!YZD4}A+J0`#9}DvVoz&~x{x;C z!3jFs3ml}spm>B6dmcSOsMg!=ViZ8vw3Ep~v+&gSkbr0wb6E(qBl?lJQGg;g6X-49 zPl}?}9c$Y>s3Z9hA_{|h>fs@7VZod|3@pg9c5*VxuWat6>LjVjq)d1ffLgMjEoy)& zJlyDACxU)1^XC0Lriwqf;d3X%M&X#qq`_R4tlRyfM|rvdaK^5=8acR`ELL;oClFtT&?1? z5F3-Q0mfrMVpU+drx57^z19a$6AIjKrc~J&LC40#aJ6sS6U63rg}SBEZ-y)+-%oH( zGz@VhIA$GnE9`(whs^#2J!?1tTYh6i2Ex+|4SfyhVS>RrOfU+~gf?hq0^5WzyX*eJ zxL#JLS|pEpR;{7x65g-@QNymTin10yMP-D_>6V5ZjKoMW6X1giR7aXNvS?xmY_Mu_ z944NRd_rrwfq(`Hq1r_{GxXU=(;ro$r5wiyFl=aOm8h1|#?k{T>sc>+Yw-QoyDs2gsUL@|dZlvEv*~`k*Q0!4PB#8Jd)hqH)m32^F+iX)Hko z7&_0i6w5OJhfxcxjGO_&WG6}o2vc=eZ9kEW0jO$Ol8geJ35*m>U?cs|K~Q>3go?xj zi`%ki7ixiLn+|}A{?IA%R9v~qaav=ff@6jy5uM6iVO{03i0L$d%Hk7xE2%T9B5PzKEervlQ}`8r(uHqrgGkDTH!m|3mR{v?<&St_s5KA1W^B0;HJoe zoz#`--->a%YeP%MF8EAf_!kSF0xt#8#lWZl8SwO}z#MqApNe*_*U%T|#vdsg&q@1j z-Bs#-K#OZ6M?rD$ewBkUWq4EpO}wz;n$`F0e3Q&b|1o?rdmBD+IL`@HFk&D((`+$N zob3QO+n6l@XQA6%v`_$ga#m~=Nw=!%Gi_f~hy*XCK8zAk8(B0JtGvMwRa{u$1JMM0 z{~MwS?GcTI**F^JhW3rMH>@>yIL8T99x(A3OT|pOcg7Wfc~EKi!x@;NC=GVp+9_9n z=b^MgJUl8C#M4K9`Yh4tn1xssFvWHb8jv!3pKRJ*aTmovv-dUzD@7(WlCl>a_o< z8p-LQ35;zzFFD8`9ul~@Y-iM-trZzfj~|Wpk?NR~R1ZnxMeVa=GZ;0X6yr2@0BoE= z6o5GU%IW`1fmE2u5#Cx&KhstgE0W;J6neO9=T z16z2Faj7QhFB<3}pP`B~F~KMpu$kmaRdP`In?6rL%$P2K7@6V>eb|@@ z#Z2gxfD3q_IStmKWfSFLjxlY35bVUJti;`xI*>M8#!tdNdfmRtNmAHEMD$XO5yOe; z&IDj6W;7-}&|opBSr3r{{FTt{3h(WwzH)P8)V#-;yaNi*?f&iUXZ%8cDHsd?EnS%2 zfV};jU+AxQZdWdEzn}~EmP2?1jqSGP?N8}K2;;BMg2ylUh5n8x7XGX*^f%4-NZS_v zd%6%d^Y?wXd&9RsuM5$T_)ExmLH^I`LSWQ)ME7mcw(!sCLP)KzyMhLU`3rubzYB_m z|M9kPyV`mC(!-nWn&kFV-aq@`@c$iNfAy8$__O%;??1kMd7H_ub!te++fAo>p~0!Q z^^7xz=}Ir0D7E-nsIF->(^UY8Iiy5WZ^D>kc5wRq*P8QNAba%uGv#-^rT9c^_QC~#`ThhVVosX zkxp-J=>3HYfU|>yMtSsAld$KM$Bs+6%kMCXKlJxmDzy%^n=zBs?RLa6hK3Pt&w0!l z!qE~iTM3oA0T*hWQyzhpKzs_h&TqMQQ1O!@Awki0@P!1!4qkxcoNu^8 z4<5FcIETr)SIn8CUKULpjnfeg8MG^OGBcrt-%M!#pla*4O*L~FU@hKeV(0n7%zw-I6~4{T5{~eeb}S@BC~z z0CRt<#Lc_rsdna>bnJ^v9Ap6$ztv#4#zxdcrli+BH%ASufj>Vzt7evBEeojzJgP+< zd*7~}Ix@pK`cU?HMwc8^Oz;kKTq>$cc4)HZOj{UMVI=NE%!KAuGXb*@LREg(NtG>L zmO$d&h-z08kP!t{H%s$zLuzc9*(=`T8>%R!8Su)1?3u<^UBG%gcU9}Po~I}y@M}|? zXdN@invhCFP30H|j7Y!anAU6yQc$uXnA zI3ks=*pjY**fPLY?F&E9#HUoJz-ct5ZgEwZvUyfMllZ1PM777wlN!hM@7~gWRTLmRo!RA#S$QmjK-K$4J%n}Btb=t za2sM&c9xD5_%QYY;F|KdAvdWPY-gb|WgGdBErHRZ8Kj1^fe2Tt%qc5L7c z8H%A8oBZPy5d)anZ{@MN+TUmc6Jh%bHHBVo1}SYC6I`v*whnmAD@IxZ4%~7=F~$$@ z3`Xj2z-T7uZ5)iqxN>zdAa#iSE~y&EGl`R31Tms=8jPGk+gd-F7zI=%Oy3>?0aA{D z$MXwgldB58%BYc7jAMoSDR6?q}r4YN-rzZxkrhlJWxcp-j5hFP~ZV;efjocYdb))qYY4`-a-}t zXDm0vE(04y%vqYqQ?s-TY~tVa##9|zMDA}@b@BZkBjh|W6siL-A7mRovnXpP->$i) zEc2&y1v?6Cgv3O6H*Wr1udtE=8*&J(%=YoKnnmE2GaXB;nd}4%M(psz2~8~OIMZho zs_d(PL&q_LWM0W6>Yz7iWEhMLmqAZvf?DOE(!aM;C&QFJeOsZgYgz&*f@YoooWD`Q zc-)iqByDS6PzJEc9>j`%gHK(J*|I%*;s~^0=0Ve~8`RGy)W$AlQ1RAJWQ=jkrE8Yd zMx7g$Qhnm=jrvq_?RrI#kpY~^6W`4+EGh6XQL|KdonnpTSq3)F#V7A(Fms&PtoR zsGTEoku#w%zEWshX1I*O)JH!uZq4IVgF=rQBdI3F$gW~e-@-;RWtLUS?aD!spa7gv zp59kbV55vVONBBNYb4JyurXS8b)e;X7K}J%#JgJmonIKg)b&4X3+1J*|Leiw?;rlstFQd+ zmwxkCfA0HVeti4O)k|G+$T;kkKKxDQi}8JZyYgX;&_E>f0MIbSNLIpe64W*A z6^EL+el%Gzw}<)3dkk|~S&iRnGafQ88k35{vnmz&%!;!F%(R-x+g|mk72V(Hs1&^? zwMfzIvy|ibkU-b8_n>R$dh1>>hiu4QmGJ`hdrEj|vzhJwmVn7lMA?Np+hoX6Q+B}g zf=u4_<(^v6{fS1UXcQtIMi@nN6RG0HJ7rz-)_nDId;7=)O2untRcTrhbpfxyMj9#Z4Y;tHQZ@?4L{?DZygmSDTec-& zQZ`tt1DaMM3Y(+R=83Cb$`~H7 zrj&;X@*1&Jc+y-R7ytBO0F$y|3AcE7MMBMnITjrQgbk0mLP0Xv8*xGfT)HbmR!reD z=|T)K-F9P_ndOruV8)nXhX>>;V0F%56$Hx&F)aPb(_mG!9_U40w7m zd+rUR$0~PACOXr;)QRybNl0*-tXyjGGNwf~HweW|mlCp}7yuWU>H^BtLA|jUscLo@ z2#XFemq~OVVM2*aa0*9Sf{f+#@|Zf{^lhRv5hCB3L@2Bvtr|AP+)ET|;L&O(bMYo( zB233gYzv{V(2Ye3XGC4VfrhD;Qr(SL5cMOU{YS?wcZ;R&Z!!RcpX#nz*0@Q@ND{# zaV~nCvXXR{G}!%=P~DjrKC{LmJ`*=8)58uGatWAcH-??8?Yocel{!b4Nme!Nj6hM^{nwAj^!Z9+{{| z+(*1nEJmqu&dk-@7NyAC^PT(z*c|XPrm;t1r(@h?IEkotpq>Tk`vO zE=UWraNo*9@cvA2cnB_u@jeVr&WxK0XMHEEoEf_h2eM-Kx1Yzo@wqo%dh$VYtSMJ2 ze&>V3PvJYc|HrFe{m^HB<9i=}=4amVhyKMs{M|dyBmG|PvrnEs+&p;!gUx6g)|*d% z+!$j2b%E`Mhd9mtWw0+l^WX;me*MeO?*HHX#LZ8?@qKT|{g52G{|51hx?kMbv-F1R z#MT4H*7hywkgea^|NVmrTQT&;*0W6tMcpr894C!}`c)!P&@RP_f^z6gL7fw)podOD zk3t2t&*8i;v{ekTv2t9lO6k8Y;c-DMhwG@6xp{Kv%sibFZysEXah&WrTrp1$otdX| z;>`2NnFn7!7q2lN-1|sqo)}_d<+xnY_3Jkt7ZmJp?dHjxBZtVGqf__J0i`TrQ4jN0m)*PO{u$O$^GAo6yJil(aT1o5 z&WU$TY@D1PcK=y%%^Z5;&1=n=A zjB9?6qn<--)Q`(!>K+#y%~3b5`4LAwhuEkem&epSE;yH?zPn}?7&*j7Jq(Plc^?>X zC`bM1j`P6Cp*K##!04R#z`$nPak9tJN?_#B8z*64bWU7gyvqd!E{Z1w{k5BYtK*vE z807Hav|bS&FRh+thd$I{GqLd#&N~qsF~p{ePbBK-lad}ML zLxZm;;82k8};Mzn7YRW?{?Jp*vKL?huElxk=bu6`^bbxJL<=Hm`7#~y>Svo zX6M95Cca4SIN8HzB{Fm9jgv4kJ0~tOpZWC1w+-=e*Sr06%(I6#4&QzF!ykM6N-gAduq z;oId|(MAZp=bOVbJ$`A|JKFgf?jeucL780dv&0d?;D8Jc$58`wjUJ&5K4esf@7Oxe z4~jx)=`X(Z%g?l9rk?&!-gZZuCnF2A<(hA!Uta@`5C#V{->yWx?}LM!V$vYfQ}swV-;`NBZR>L zy*eDG+whh>LKqx*NBrey=9WD|8+>_RyOPgB=+^kYa%%QY@pg}m?@{=#ecKr9YE#!` z7%%t<*XzLxVu&NT&lluieg|wE#yedOabTEG9{7eMV7$qDWDe1N$K^_r%UjP2npGA% z639Es&RumfpF^8IgT(TtamDR(Xtrn3CgAhjf1QHD_nfy|&-r^l_W1UzTlLG@PQCmD zN6jAm?;hUSitY@;?fCkrNeyrpGtoH4#~E($%W!N2)}n)4GRe zTaEd}o4G|GBAGUd!=w4^)`K|_Ocg(AAYMGl3gPQG9t;Tw)WoW z@Zr|eM_8eR40u<}j%jy2q@lO0EHyv=eA{y+;`L+eR5o}QuPYhZ z;LjQ5R;7;B;~y+!rlCv)u3ChnW-pDb)le0RE#!Xd*uEv2YtGYqywf71p&^8r&=~=0 z{kFwELv8y8FCsmS8dqI(ZTTY*3U+P_fTe27}ZfrAHlio}d2N=)M zSXu)#$r+yJZeFAf0Ec!^FI1sgz8rJvz*35p4rw4DUG^b?My_aA!7H&wydFfg zmrWhAlp?EtyUt(xLcdXQk~N^+EwgegqQPM_3NL5Wmq-nsR zvWJML4asZ2wW6=>IC6jVo9J|R6@O$&A0uySjJ8=idiO`>-mRJqa7Dgn^b7;AbvF|* zKsW)-rbZ@&veI(X?;AGJYBE&r48Fz3X!3zwa;3zNaeI8Ww6JqiKUQST`HIr9s!{qv zCUk4**L^`PqipZECcXe)${OFEpsE7YoxTc;=HF*-IcQj8ap;-cnhAJrIFYv8!#04s zy-Fjkl)gTeQh8kmy%$+gi!_ZEy}YJb1#YS?;$g*wD?7D-owzwg%hgXe=W3Ou^~~#T zu4W8yP23#TW_N8khqXDOh`aw+%~kjRDn{bkH84ScS0-9QI3sv8BN!@h4~l9g;B?`H zZpsV<%n?Fdr02G=_}W7EUhG%rkyC`-JaQflWy~m}D#tCP9_8o%YArQ=%QnaRW~ZjZ zP}Zn06RW0XpwgPkL$i(hzyQ;w`bYpgiOgZEO2iP3+f^eRR2ELa5S&m}S}Z>re9T~- z`_H2x?Hk~^|BTM3+%-2DQ@gHdDRY(x6lS;HIR^(2geo)=LOtQcw6{LEBNl^JO=c!i zBd2bmj-+~M*8i=+`nslN@*=~m>V`o@g_##tpFMo}@V$rcGKU}j6W~1j&~~|U(q66f zct+tN0{6v{{A0FJc$h2ODYq);j>@Drf>pC!P>X@_)K}@l_*v)NvgNl8L8|cZk*p= zG-AOhhX&)IN^{(0oM$kq#wZghKAeCh!-+-p4>XvD%>-zK6QB`Jz{H$Tr8E9H(}!<~X%;-QD)W=n^@`7?RG#LDkCHn-Nf;iVbOP z_02@OIe0S-zxXi0b(-?TtCxlE!S(*r-d`2kOz%2o!P89dx^h_)pED?})*TmTgM+c? z4z!?RJZ9JNa+2(n_B-XTzVbK!(Es^U|I~l+ecP9Pp8Me+`pzHx{jY!WGe7cU(f55m z5PaX~1$l27Ut-)|KX~%ZFMr|qRiXWhn(dHc-#R_{=ojS~_WoH*578g=Jo)IC-12J) zw5`NZ*^R)!Z$=#(l#K$llR4Yi{@bpiKFL=QYsNvqE}Bv)e0lhS~OY zQ(^XQ3CO4C&eAMC!>G)*&=O{8rJYcr*^W+>DSxQo+i$IndMdEP7I*=a{7f}_ErI^= zwPOq+C>E*XD|E_iOKgc|cS42i9i1ps{!q<6=Q%B~L$lj!#jCPm`LzVvk4`1pDDC>3 zW44u*1lLZekiDZ5Wy&9_S^R9@-~$DAsOo`-$TA(4UrV6>RM+`Fi*K(gv#p;?G`kZj zWbf!inWsNqlnVCZMq2ai{=;7dc0g!RXg?Ju%+hpsL7>dDCH4JB8N?0B3bvAGA-gD3 z{!qa+4X$Wbi$W6D*+BBFX!gC5 z4e%XsajBnwaMO-S5BtZRi?jexjkNwb=rAofN*53)owuY8=T&CQw6Nm5k`|!VQ(EvU zR^M9DtVUWX8#H?@fzo+P>Tq6VwoD5v&MRp_H2XerUVK4Z1>b*lxA0j&s2jB3=}oo_ zcR`@kY)KuORc1?{UD2%gtSa;U8#Vv)@$cQb3YKx%b+X)r2cXX%J0%gh{G!6vU z6WSHcYUq}--35X22)Lw;Ssn$@F;70qfzFJ*&fuO(0(O_bDeG@;Cv z?Z?W|gtQ+M&FW@kMYFndDrJLauO(1!MoQ|~j3~3^Hg9D!BHO%)W~H$^tY}ux{z}=P z*=q@u{ai^M{hTse9#pRMb3iAlRsPUCt6j&6W^be@l(Ipy*AghZj*>dM4rR7I(Ufw_ zLA#~B!Ad`;MWO7d?t(zs81y%L=yA8%PD4XjV)2ie|Mal(Ipy*AggugOWOW z17)_XU@N_WR4~!3KkLy7wsO{^sjEC~!4CXd0%Zj&siT4^vt^!LsbG?4<*dhRRtwCE zW;Jz{vO%-g5-2NJNgWkTnJx3|N(GZVJJGBbm=(=x>MCV}X0IhsR&q_9s2SQ%6ng&-is{vNZ2F+eepvvxPw#)`Ac~-K)M6;R( zS2U{uR>}s=UQ3|Nvn6%pS!K4&1}k}1vVmyUUmeq6UAZixZctv=z%z|&36$BOq>gN$ z%$7d8k`2UXq0G~{f!C}C>xyR84NBRd*=q@u*`TD3Y@p1RKD&|)#Aijb{=&Yx)XKGT zWwyK|i;JY!5-5GPqz<1|W=qYk_^fDlQzm{J%Dy+T{X*0SUi+O75C6;IAN!w(y7&!> z>YlDXm0Yo(x_YTW*bfAF@C){b&TFBcFXhd72&lEIOVU(OMTsLw&B zB5Ijj5%GKiw_n*VNJXz%?ceBbuUYZ=$czU(Zc(m-M>o_-Uw*3B^5&8+-WrW%F+?fW z^s-XxFCai^5bjEH8t$4B!Lvr=3eTEhrb@Yt0Hs8@E6J5`2Ly3IP>seZ+nQlk^l||K za)@wOlGAY4j0O=k8drGM3^P^AWdtZC;!jDgJOBm6DPpB5^qX(>wv{cSMo_s)!xr%} z0#pIqSxK(Av&Jp>P;Z;Etr4`MmkS6`O1QIeVy?}t)UrA2wuPzRr)jTUatIJK5av1?i2@@;Hm2?J( zla=L^7LUe=9ghK(!S zhy(i6O?7#>3Cq>rSMF|IK!6-#*RCX|yLK!m0`RO|_Ebd8+AAVnK!6;gjaQP>HXh4~ z03vEzvcj|WVN<1CMu1GB?@^K~eGedr1A=Nw_eucSTlv|uckzbN z5#sj4-((Iod&+-s{1NU`Qv3S6`bG;QscEdQBsGn7Z0t1WOt)zocq{wB3kXn3WHco? zZ8;X7}kN7GceD7DGph6vi592!v#Di`@F(bX{*BQ|6D~C7= z(KU!)#oW(yNDEL(t3STgHOe!fR8m0c8qo4<5bnebC_M*;eslzQ^fUqmP}e{|x&|ET z2sEZ01N5w00tB2U);NW+j+yLnEM;HZB;@@5W~eJ%oZsKODdzY4;>Enl;UWDXVUT!y zR>t|b>T*7AVmTl0SvkLdQlk(qXc7nFgjW{fC@-WI;EKxS4v$oZ-tjHq0|qa(=Y zI)WUlo`AZbn0+lneNjBVuK>@A8Edp^V?_0gI;A6VozgX+<+ZB50a`i&{U{Wu>l#qk z5#I|z^STBerM?Oe*SrCKbOg505nqu(OV_}obR_OZbPc>tM|?$w6xs`+{^|%g)ZPpu zT9JLkfoELW_*aG3dUyER6+AJS}u9${|LSLu4J* zA+)NrutrCay%aM>6fIky3LLmq12r7w=ppqyaUrDe=dG>i4YgBf~ zaubGHAUDGQh>(O4!^jQigXT_?lbh9#A9-Pj0&a=(s ztWqvjx=byzZU3wc_NP(dnZs<`J3DNjZF^^Ba8~BvLK;wTGfhEQqlp3|nv^i2DG23B zH#!*6&;XRS|0tl!4?;}&@g)Nznv{S?IrK#hBbq3DiANZE>RK|eMrnZ`9YOk49r{w} zQ$0qM7NGQq7b#I`A(`kJjHoRzqAAgrLab5hNL*@Vj3_OnI~_st*Mmj*IG2-c`pu|`M0p^kvMY79D5y91B*xqB5NWg#RrlzjLDv-0DMGH9uFAiE|X z$fYAbL4lU8fqpP@y5aJ!PY*{fCg6DFqS0*nj%>u*I zkQ;ej7oMhN*Oz$so<<^kPm3e+09r)rd;H@J)=miCEqtPEX*?oAwTNSla)mW|Hi`V8 zjVsE!Y5;2#3i(Q@V?@^=Kd6>ae02obKzWXvTg8kvRY#CR6f;J2jnCB>QT@Pkh#joJ&e)E2<3jTt1>HQ-s-U_={f(9-M;JlbAD z&sqgwK^=h<+G3Sm(4GjTzcT%kNrCwxcm_N>s-1N)Cb@>hXQu<@xr9l0A@aTX%Oo>7 zJp?vYESxW&*w2nz;zJAiHS&kX5VD0v14h)Z0i_;_%%qVQ=OOi3;8DLu7St%mh^|47 zQGSrmG!_A+Q3WVH7{G|;7>uY~z@sCGY2^nay2fVV8D=V2$d~YZVzqp)lgJj_Mg}RL`h>y2jT-R3ydhYl6?yKAU2V$_`pO0w^5; zbsd2=)H*(w1GCx-m=y|`bp+X6M_>!JDMr-mKwbR@)O7^Zbp+IP1aj#J_|Xwi*Ad@| zAa)Sl+^n0fIZSM(lMUxhV;;_zm8#s;E)|O`pU*0hKcv>~x)%#}*G6Z3@+k0^M4_`X zG^-@#F~Y2pn2tWQM&D5w&Z{!xQ$I%3$>4UHZjg>OaR5rw1fX=&iZvQwz@sC8(n5$4 z4LOYXu+%hxHJSqALZ}=9O63BSj-X&Db&M!=j3{*kyyC%#QU{buittv=`yz)jqnI(G zw!nze!ib)|1GA3A4Y2ZqbfdBZN@*eeDL)v|HAsJo*=sB=a*D@eMmkpgU_?u-FJKr^ zegLH-z6^u9u7O-$KdNUy=?G-k5m-mP4o5&5r@*6YfJaAQFCFo1B_!3T^evGu!@hjN zdle6kn{)&jK$}sl(Gf(YjzIG|0)NKHdfA(w^cFW#W;Jm?`jN_|#m8*3%()DiH}heZ zH|J^LeEDp6wn5y>vM_JdIxB9o`ZYVCpB2|x+27AAGv==f>PIDMAsl~=otpmk3wNYp^$!5he#4S z;uAmcsGfbdj1i^f6QnPmNLorA{AlWh?5abIXp;hM=!j2sz3iNhE4L#~%?b+##=S8O z4~+W}g=uL|#2(7oD0HLNgE#32yi&ahy3rB%vT6$+=hx^6yg)}_a~*-L{D^W0zt9oy zl|ClmDGG%Vr3Jsx5!hTk1r}C+2Ocf|z@z2X7ji&pI|5o5VLh0o?D9ZxR!n9oeQBF^ zZLuui`*RSprJ-hK$9l7RR8~s!@GC5{vogF??6g>Mv*zOuBkFO8ByEHck?L`XNFDKQ zAtGDX_?qPX9loqF;j;+Vc<MMQ??C00`nAA0K+-fEDYv4V8jn*>127QNL zqZ@L+2HxxsBQ*Q?HU2adYxLCFuR%WYYcx*$8pN$%qgms)2EPIH;t&7OcmCk-fBlo6 z`H>&{_D_A{js0hU{-sB+ed*!;F_5p$KL+yBlMf!=b^A-(!lBiJvp;*9xcw{kcRyf` z=TCFTSO%sSImna`rwk_`M>v6y2`8XsPAF5zOWEAs8J>8%{cBbj^YCtOF;C0P8}Fzj z#BC-Z8?|I6AVN5S&*&Ixs%|R^A8P+lJzKC^Ign@we-b091y5R01nmsyCtJRLC zwMu;r@FC+!XODE^u1DL`I_=J&GGy$J5B!~^>4JRO_$!3Ir%Z3yCrkC0l`e2&oQ}KtKDpqRGPwEhd z`pA&thTNPps(tT?QDY>?98N%HPIwY8MA)E@3W$7pgeLWfKIG0sL=;g;qDD3tniS0h z{QQ{+75pij00ccyW4S$w8^g*ANO;4_UieR}C}Oj7O_K!RDWej_980>N%OVGGnKgEv z`kpS~+dPs@`G!Ktw^0aO=$#c}Ph7$dJ*mNJDFPWXV44#in@K(rP;w?fO^c?g9t!SZ=nC%fjPHcr@C_}5`4^^t?gXI% z0m%5IFgqB@Gjyo4DY7x?nv5CR0~s@%fIk>CEFWm-2%&NTD2q{bFwG6^)acPr%N4h} zl+Gd3Wjw+7*&K||Ib&5MTS~9Yng;G7Wv zz8(fQCTQOQf{rsxge3x~Sn!o;%+Xa0HdVO-VUE1{ISQnH-5*y}z6ULarbfVo6A&Tu zNX!{-#6K{XNdey>F_jR$lg+_*vN@y)&KXs!04ARrsU%+ZQ*2k)4MqfT=K56zh4Kwi zQ5Rg8bA}iU!wJurPtu7)5!0bE+tf4gl5xOEWEg_T-^Q12o5bz-@n4p^|;&w;1 z5D;n)OC}Ee!kh*O>eHwM6Cs0`AcF%$=*RF92D*x5?kACi;1wH=qZ|t+s=^-(*i4<%8&zAPAJy6n&_IA6J69v zhH5SUxW+J%c7R};eT;#Ce}#I*@j*HfDja=H3K3cY5a9%Jd^iCJwn#<}B(zXK$Pp$T zpb96Tt8fBbg%gOZZ~{)j2{m|2vxTdH96id&s(pbbW+c5(4*&`?416Y>Ku#j_hCUdp z_f*HvcqIF-cKS3XU)9dE7(=yb3SkeU+JR}qOa*KNGO{8*IH5eo&y@`@Tr4HW7*ee5 zo_OIGICu$T0R2JOVPYZ-CrpG4rmY4h$hnafnVa6CYEKWopxw}0VGmBIf?5_F-N&$! zZfP(<~(t$QmfR(ha>e8mn^vBtI1C<^YA0k?ax1xwHwfeltzGM(U_PkC+OT#!Ta z8#)yxLTe+(hlLgpY%i6M*6|j6z!IT!m>^c8k1`xW&QYa9AHqba1WZu1hBzh|a%KYB zNhiWs04mlqg9;Upo^2-JA|V7U5KbU(azagGt`w)KCvD&mCv*ly+>Y7{n}b~f8v#+` z!x{t0!wH}YC(wX#LK&26+^25A@Bz~h*i1klp)u3o03Wn~L8Vq!2A7VASyBe9A?F|$ za*jqUbaj;0Ffz~IErCX8aAeFdY5);VK%cB2sP#am-2q`Dv>;+RR3aeAypbwxfRIANmQBOjpgP~?setMXsRp{LCgm41H!wGmoNCOigS8$OK0uvzw(rgHUi4X#*CoB+fhHxTn z1KuN_2(lyhEp%6QiPQ6UAPLEH3m0DJNBBCggQ5%3leS#Ghp#dUnd7#gb22e4a4Jsr6 z+Dye=d1?;kiC85@8sMBE3ZT#*FcJC#8kf*qmqZ{8)QVnnhlLr#HTl9@xkjArRA{&HzDj1_BeI*eMOzEJTGqHavqW z(;QW+=0{Folc5S~9m>k(gCgW$fzT6lTWfTs-fAX*DoxiE&_JNzF`<|VIoAGLOyg26kJj?tN;~lW+s3toInhP#4!;p0D&*);wU`K<0uw2NVRHZmIiU>pPF~-2GKvClmZVhH+riaXL5ynBBB1S+ zfdH?eY5);VAXs^vZ%`pf!i_0tgcGnNCsfwyi76NiZI{+HK+vd$bGRD$Fca{oa61M6 z2q6#|ERiZw{IpQlOkX~LiNgqk*x_~r5Meff`ojq{WSme2<2Fy%OdrpJKea&<%hpv^L5RQ=+jp+<;=630OO9P(g#%HV{y4H~~4r3AkD~0j@ZqieB-kmafLb zSi>vy5tbncLGM?}D=%+BR>B*K2*i*gSYZZNiftEIoT#A33dyC-7gQVa0SMMNB-ipaq7BFq{C9>8f9E(GEk!j-SRD z%8)KhY?uh+6%(nV!sH2vP;BU&5X$-V@+7dP>JRfDTGP;nq2*Bh2pLW&gVPQa%?4AU z0`HY*vI|4C3rz#A!VMu*l1`*H3tcs}879JXjR~qa!hij@v_BGrg$|eT0_8L}tlp9tUvfpXi`NyI>;aBh*>CV}&xw`Jm-601?Ysl9+BG zK`x9QOoW`ns3C*kgKnVF3m|rZYUSn$(Tby*mf_6DH6#CaNm12TQFkXTQs&tsh0%&?>kv96MSz%7WM0kjRi7*AC z5eqE83d;PtRmH-uRqblCrGgOh3e{#TwdSfw;ZT1D+|N&S zJ8FUi^3Vs(L|Sezk#5-1i7+Q3Ldm%y4x@$;2$_%utR14l1R>O5@nMqT13ge^Fl~+o zh_L1ZA`}Vw3?ZPMZ~~1aCsd@?o)&2e$&bK>bC6@r)f@|;Oo{Dus0bO@jNP=M2-AeD zAeDwrnf8LnG$8~sO*jFFY-bE0mLkJ3jA(%5Qgk~TDNgI))FCTX12;X;fUd&E2WgJ> zG(y0bp*>(IBc0stg}Ueg1{+cryA*ZC=>ewNQ-P@WVgD)CJ!Q zClDuL06`8;C@a&Z8+;JhXa{_R6KHutMPnlL9fW@9=P*quE1W6}K+s4hLWhAd!~PwS z84|}tC^_VyUl?7%0xW52f%y8Hu9-GD>3&8tg<%P~B@_Y^VK)frD1<=;$79GT=X)Se zTph7Yc!L-e!wK*hS{cR+Autg#56y)(0}W27RP88cA;=F!iB3-ez*4x&KsbaGKo$Bh z%pXobwc!K;D4c*k!U>o!oB&s$mB3Xvk%l!O!st!U_tFzVL~qD0BQ1BfhHgah8QLOPbn#V5<;FQ)(K-D2Z_#~6L5}f*5T00P?p}#?+G@z2( z0V2~}Y@-e-~4n<|at#%d} z6Ltwrtea?Msg<8c2i?sXc@S@8$xMJ;Xd+C6Iz#IcLO_`z4fMmINXU3Zr6RTbRfvRg zoRSOu6numbKozDY5YSFYBi(-?|Ag#fB1DD66cUHcLR5&1Z~_TBoPfg&hYCM` zbF=+M?Dp?-Z{UYM;g7?LHi6g)C!o!60s+Gb^@Fw%8&9T;2Sc$0HWM&KH~~iuC!ldo zC?74GkN&7@T5ykR3`=Qa3}v#-H4so{I00pb6Hq26l)%5BZX1nH5qV!c%qb*K>Ykz*Yq>>3Qs#z9~o6VtpgrU zVYDHFFEU*#e0=F#*G#W>!)2&2<7Aki0}K-kOf!M}6{5mKhzb+zt(5a5*YG!|LLLwr z+2PdmvENV@NQyifaghx&)AU2l!A0cxE2xESA`qKO?0_<&D^Ekx?Mo_qrp?}YsfgjP zs+qx1U~P!h4SJSL$%KxD+lKWZ|g#I%5c&BTS%^II-fiKp=|Uudjga9H%sjU({GWB3(=20FAI?^-m@+I-~GZ3-e3d`Ed2X^;bsT35Vpd?f2a!~%r#2pMLd~ z|K?x+i~rMefACX}Z(rV~eqd|!o_YBTZ=kDt?(l&p&mV4{ys!;wu=MJs!J=zcdZ(2N z7stQSTB(9@pQd3w!6?J8^Ff-?HN%;#HGEo7bpkCfGI(Gs#A z7`NpipGM*IBpetsw{5^9N5*ZHoj03uRwR~W&H`ph=BGzFD-ugGXC-+_=BGzFD-ugG zXK}tH^V6Zc@2F2dhNDrnl+UwxjyD)4o{^HXz?j~7nFAM@M9=e7=B0d|`F6Y+GBP72 zXHK$|&uidOX3gi=xiguVe9mXns*CBfdSJ}#-+)Jsj4qU&H=A;nVU}dh+;&Okr$;%< zFiSFLKEEXM)1%B@#kd}_N9MOnsiy`moF1ts^PZ*DQv(;2k$N&4E~TCtc%-bU2WNrw zdy{(j6k8L(^s7w3m|39#j~p5MD?4vCq`aQ#4!{~}AXSYX zfhoE8(xTDpRel0sK5D&ya+U+89{O}C^W^3NnX_8IB=ggw%-zieGG|+>C7GWdWwuop z$ef)mF3J4#D6_0yAaiz$V@c+VDdWUG%Op!D_BC)(0&v2U#q-h$PYqm9#x^U9s-_VIjew6GBePlkStORk^zB-EK##G!5Z$;u>Z(1 zz|!WW1}<1a&CD{uQq8P^3(BaOSsX6a%o@0$jGCE6!&1$xfeXs0nRF}l$)%b}VB?cG z#N1A|tP=fu+N_t0-sXYKd~@Z%Z;iJ<3_RT9P^Q^d*^}9_6fD zEy>Ini`=t_ZiE{t4{>-E*0gA3(XdoBYT!ap6pbtzmWoCVTu?^Q$b53CXw<+3WfYCf zhD$|*z{WFh;fCpOn8=dRs=To!5wl2sF_InKtN>4Wa(l; zrh%o43FK8h^!_PlA-zPIx{uf{tPV4f@?f8~P*=H%RYT!ap1Xd=`QeY9-Xi42$ zb-(mN3b97Og*>24;ImkoU=0n2XICVryiO0waX=Abg%IHc@_je~e+?(l&zcFoFJuPw z0crq7K69&LFlHP3Gf&J6#_%~b+$Mg% z@w5N+@RH%LKREoO!>_&i%3poyH-Gi#zW?RNx4(SmJBH&oB~|%v&36oIo?ArJZ|t`m zTCZtsM7^eMPwF-8^r>Fco~^hw?u~I%{FpPcSX_$k>|)3LzhlVWe5eOCOT}FiBN23YbHwkQlJv!Tg0T}#_I z>RVl)0T=$G>_otY{{Wc5WVDBgnxzR=S~_BBA`e-LfG3n0OoKc%OB1a0v52LKJY*>X zzKU{Dj1aAv4VR*oz($jZ)=ZO2(Mn*0715fhcqv*9utY14o9Ip^TC)R)K zc{Zh*Tw>dJjC?0+%J%&IqC#N`Y$8Cn$z}qfk*RnoGze_4B7raj%mkb)bBCqa$n@HP zC$VucW%$xn?!djLQ3kMP@+>)-DUatl87Pyb3*6hZ%6zN?tTju8>jKy`=jY2qmM)No z)qAi{&C*03b2xIoJY?wtc}!7K`_wE=^EaM z?L_YIp0!~Kc{mICrQ^yhzNXuM>>Dy?p6(mamSvtZZOc$%GBYfd7y=tjVlT^X-%OzP zWQl%h8<44ZX&Z1cWmLwj#4J_DjO}S(6=k6?bYTW75)vMhq^Nb~*%iJgvaSD>R_Y1QK{=@udV#V1pH#olJ=7W=DYy)~j7R^UkHX$mCgyi`un|XH^I) zQVt)}7!AS9G>F!|rMyXCgB5v`JSf&_-c(?N6^&<>sFoVfjHPMg2|v0=S8#tt`a zYBZxE#AYVsG&U93V4dsT9RX7SZXwhSy3W(HAW+R@X~4xP6f~3pPu*I9<>y#_^1eh@%Uf+#E-uIV?X*sum7|AFS0z+pJ#dI^z$soVBCJ8 z?_Hm^zy5+GjGy%RX7jbQZ+-HS_B*@#*WaFe^o#O)G5hg>hd3M!@#Ldla?7tJ(0^L` z$PWk%{ASeg`$UgqdHb~(VV1adLWS%dUGuR`neP;3Vj4fBbRI(dn9~4JiE}N1_ER{O z0y66Tm#4^V`+1%O*G{NVW=D5Y<~u~0n8puck=hDE{MOb0QHgUc0r@rG=K71&@#|j7 zZ2QfmM43CGLYW<1qRh8F)44^VOy`*z=5OartIV@=CJNBWO;xjRyQ$UeO1?w!I4Se( z1p4G7n(dj4-%g-Uw!Tia!$-wE<56FCTiUlU- zE15dCcR5AIQ)+st;NCe>mb3HbQ%aST!8^%62^lKzxszLI!hO@K*NMKm#GBTa&?OSL z&eBY>+_hpS0pAL}!igERcCtUoM8|UN_g8`^*q>ZWAQ9(Hb6z@6l20lDb*~(2@FZYS zbiViSyAI#-vB$SBJQ#n`c79}X{JCXwN`>E5*55_;p;(?_?1vIA3Ro-lv-Dy<$Wa8| zE4c%v8G2Cai2i&tB-D{^JVJTB^rIrK>3ZQv*B$u{G{xne*^`kUxkCf}acuC36Ck1h zpL!+~Yls{L>Q!|9*Rz#mSJsJZO(po9bwz>gydLxfJdnZt=)jqn^Rwm`{2@6}DvbD_ zBiA*ZNkVl&NI77e%X6|PMLiJn!gR`2HztvSE7d++OcQCW4{{weze+%T%roH`^|FG| z4bSaYwj89VuUiJ(&!+bSC7m~2<8jG$I;%@M^BD>we1>ATTJxuDNk2y=72`cV%+FAW z!GmZ=+DY62WYis?Q_aLcp~esL3oSp(v_^U1>3HXu?$R0H2$e=oZBxeEJM46L4 zsZLrcA66PN-dsM2W<{&}p*giD!$9YQXfu@hau=FjcKhLPGU3v_@WD^N@qKTMz&-aE zV2QPU;F`^wvT$7DVr_Q^30LF2JuRF}@KBN&GJ>iA=@TO~dZ0s2nkY5C$oaS`&<5a7 z%ML~~$M=j*sLmuux*((+u+8N;*^{DfL{ab+&y^2+tRWBGG{*fnIrH6_>JYFRF&Obo z>Kdp{+4fNtuuavikUg%^I5KIAu54VjBR*L`+bT?}tHOvXieCf2@N3lL{2K3ZSmRZz zc%Vq1_*MPKH8_ZRpFBGK_D_9cOCH-<)XyIN=)NuZYOyWQXUSuZIQ^EZQSR>WrwN7c zIcoRP(;5Se%%0t_ZQ0Si#L6sMc1^1?O0X< z8FxL~4+P{DO*jknl`8VsQb0-JYS@eukqi?hWp90?4inHY9oR|bMk0vHyMqd!_!V7) z{27dU?43yI59+C6SE%WlR&5K*BY|WWCnPH-4DPw~G-ss3M5d?iQhQd6fWcL$t34}4 z5POzCO`NF&wSW-<6O0SvzM0B;ccZ~FV9Z>6YAnPDDKE1#nqOTEhB8Q*6jb;~rN_tS zC$$?nkwJ-7f#Z}l02{R{OMDkL!aB-olvD$bnMIYP;tZ^2_H1&x>zxz_SWS#bO2uA; z3N&IE#W1lLEbQHPSi?Oxm!vqfR(aQo6(TySz{_v zKtW9nXxw66u?wtVDf6kGIyJ$lvm!}`*E9#NL=TzI zdl8U>vps=tJJBEhZ*OkQLdfJh=&e7!{a1D2USH0c{m_p;zJ1w!W0j}gs+C?uQgy3=6*yL@nq)ucIEAMP z66O{~x^%5PbJ+%5)Cy(i&7_?68L)FEPt))izsh#pIvLljOc=M3YCUB4#=^gm_{PV5kh5*1I1{T&B+oVdl2|_1{}w~ zk!1)NvFX(P-fYUOwRM6RJ;})X^z!%ll+_RJA;OGau8Nd7aA6U2FRbN;C3qJnG_aw} z%;$RtIBPqZvInA^P@-46I}r~QDW*vXwT~Bx>+33}na9)-)cLzj%Qn+wdf6_(J+rzs ztpe)X#ypw(Enz&fN>E8x%W@`VrrcWIBEYW>8)Mh2>XSGHxXPTO6~6J5#l$Sqj|pZf z$pkWOhSr6_Y|y}%oX}*W{fnYNw zy&o>#goK3|M#}b5=W2k(pqg@wlIS`YP@|Vdz%E@dE7VlSAA1=>Aj`WwNvUHR;H#3r z04&latu)5R|VjlC-eQ8o=wP|e3E(&VRN4$3phAVBQo|Nq&0yO3?S?Y?Whdu3(s z^|3$KE@_G_!62@U8nhpl3T1n?i;pYVAd1p7m~>s)z^`>_HF_tJtF=cwnFh9(ez+>zUVo{N@~U%wYX1Q!0^vgzVX?6#S&l*+pVli#(Xk`U=GW7EC9aEfhp8T>9dg1-i5u z(aj59XIG1pEgtkt-4hP+`jdjQBSn54oX_f8bm(2OzYZ*V4D~%##J{V{Dmu`A>+YY@ zW0YV2jX(a6{_^kpjs6E1{y_Ev4DTdAz`%FEWgNYx%5%T=Gbx946~uXWt%UK^uA_qN?06?%DRcvDbsoSEC14f)<+qN}kN|63XChphW} z?ZGU$ZwDEu*PhR%U~Y^GFxz$$FrPj1T1V0Y-UCd9`SFiuH+6&CyZl4kRPS)&=WqUi zUf_J^?q9n5-Fktu|Cl(W;Vv~WYaaIcjB+#+4POO6lgZ$K--SMxWWU2CROiW()6yjL zpyl)-A0G-{pD-%cNl_bEQ`n@g-OAw5?P9!H$bNM9wY#sRpJIlnJvL%s>ei9(c#nRO z_>^*^Ja@axOg?H1u5v$R_|Pf@s;7jTgr=P3 zpUUR0Ool$JK4um|eE(u!I9u$;{YfJq1io+1^)q_LJ`W#@pXUe$LvwwvYC?KMFh~(| zPQ>=~IokuM%g0&QnYS^VnZL!W>78L|2#H8vm+?7AIE-^f^f+f!zM)qElt<&3$SxA9 z2IAABKXCu)(K~lParZB7WpMoTD3n2qA;H2WAMSKoxNUxSTqpDDX2-n0*W-2U2FJ1f zK2r3>%Kn8X8e6Dbw0kjlTIM|^w9ShTF z@ysFe>=YDSbM7q=K$z*<0(c6m(!xyNJ+c=8z=nHsqs#mHfA;U=ef@Xt{@~>n<167+ zhw**=v?j>v7B8Sx#W#AuBeR9Y+?7Udh|!VDbY!=)FLKj8-xr?4Dv~W8jPFXL#Re%` z{JJ>H3NzO`lk;haU?FZC9DSx|&aK;V7Mr=l(B=%!urYPuBGG2}EOWImu*88QeLoPy z&MW8$xnBol-8GzANcWp9e*KPr9cQZc8k{CrLmuOV5C}4p3G|pQmeC>61*yuiuywA8 zjYXRU*3wP6@l?&zo>t^4vAWW~?WQ*=Nn7U7mo?UI8W5TWGRr}LF1QWa%~q;ewK`Ta z=$2u?vjeqnoTu7P(-^H8lr&c1S@k=2-@5y!?|ye^A;z~Q-9j*^C<5hgfkXK@C(oVa zA(L6~pv}x=uQxR^Dl>J8IO}v_4261DB#{7sQMpnKI!Ly-Xo_wM_Xlux6Ikn8h)me2 z@9Xdui(LC?e*!2S-_F7$mZ>wm3FXB%`ER%Q*-d>2vd!(L$g=<3-Pd(cYadpB`&Ygc ze^=;V_~)}%f<8=M3Hln|V)@!7JAM^cwqMh4cMp#c>;PKv?zm$1`0gkz29qNROsHe+l_U(&iE?86!|NF=FEm)7*|y4+{yrdd@u!I#(nz( zpAdHcV@ne-H%0}RZMy@^uK-MuzYK0?HvIg!qEhEp2KXa-J(vm74x{Z4YC_ok4>nD} z+!z&Lw(SluzYH)%{t~#I*-$?m>1R2Ku2kn%2Ka+5%)rziL8Y*J!#D}^jZpz++wK7K1Ar;=`vCLIhI%k* z&rEbRn2*8W{qc{3oaFxgMLi0O17L5MjZpz++wK7KeSj(Qdw}N5hJ33f(bZr+27~>N zhEBYxzNGm$4F`4$2pS)=rM}z_i;66 zYxEdx;P-K#$)^4J1Qbi@nF9;{7y^%z&u8-p=9#0k?j??D&Wn!cTcZf(nM)qsm>pp9 z3hptk8_OHT$6)a0-e>A^c!KP+o8IK6jQQsT8o|6efwCGsm-Yze)uo+%(sR=p!8~&p zsk_o6XR?ETJ`P1N&)h}ouJiztXUpeSftd}SEVWt(l}5f4dUZx)d3dr~YaP@p@mtQXV#(J3pt;Dx7;LIhw%lWt-KYt zVQs~cTY2a37%z_{6_ygehS%RF>O9#M%EA9Lx^+1CGpwF0H5~kznw~7Z9{ic!pR7b3 z{8=KOtjr($*=9Uht90;ZtM(Z02%LHe!3k#4Zq8mypG+Sz=%L`7@M6Fr46Xh2-bQbK z`e2n3y6g^oBYz2jB za$7i4a58Kk+0}6g6FhI^GHiB9%=d1Bkjt}BV(LA+~eur<8gF({Kb=! zck!+1sINwdiQ-TrMtbGfNl+M?F|0?HO{^meF=LN5(Fk*e@(F+cV--+IG+OF0J&i1z zSclXsq@&+xggH-M!XMgLMRJk`EcNJgBg-b%AvOCO&G5*`vX#9Lj<&(SeUh z^2ZC7G5Lhw619_vM@E*dSRXR-ueXeOOe6d;c4apHut1)7Ep?K#E#sIdN0v>jLu#Ia z^~-+jN%T!Pe~uuL!2)jIpAUt@^wlTml8?VDuaWUr?MES#%LO(n2C6YRK;WOl5RR0g z8OmD-78+Cjz-KMFuErwyyqpYl+V{vP#3*Qs1Fw>x+^6Ln&uJ0vk(Tj2(z2;X?rRzU zP(u60Z2S4d?Y9g_-wN#RANNzfbNPAbU%k9m@r_^HeoE}ayY^FAvn@i!oNdvH=4^{l zzGhpr3O3s!)RNg2t(?rZ2&sOyMa%ZHEkY)qZPAkPY>SX6XInH!oox{ueYVAxG-|uI zjBGB!`NzYFT2P()?2zhobky~Tx(J=_Ju-&Om|w<_8N+G}nK7)!kQu|OHH4P19l9pT zNun@0jlxL*)<+f8>ylG)wy=z1z=P^2L=*JTBfpOHrX!@#4 z&|fD9EVC2?911al95NKQHUn!p$E@pN^jgEPk2m$?LcTfHaQDDTD48}kc>RQjzTm+4?TD) zZf9&8x!n|4#zY1aSGPu?qX-UXc9M_BevOP*U(~Z@Vat&SNhaK~u{~hXv-;y7ya^P{ zw4+8Sv@EL;3l#dGpt$L!hc-vC3M0!=tg*0+DSAwHW7<%BFaYo6VJCQ^uUIump*+l5 zlU17*GV^SU_Op*}U8qP%inA@+&v4GR2>EEXMKkzpi{LP`E!zE;w+OvcE57!bR>nNi z3W7&kYW2wISEDzM9x{5-=xNOxk2w1R?lwkIG{VReV~seD0`h5`HOr+Lbkt*H*~B`e z{yd}}A=L=ON8o70QU{kyrEV^pNN9$lkdj@c1pKt6m6v6f2RVl|a| z^oNmU6YG$AyrE-bJ6@p4$#`cMl1wUfOH!%S&1VhE$g)M=AvN#pl$O~iw<|UK!|GYW zmTPAhChhoO8Aq05ZBPwm3!^)d%Vh+UV=JuAIj?@`hr@k9OKUHF>C>OM{0VFlTRWK& zThE*l+rc0uw$o2aY$xiJ*v`t0h^viubrw_wz5ROQj2@op+)w#Vk7l#uY>Ut?&9>O; z#Kjf7MJNLICJZCZ%!hN1w`sg78_(e5-C58y4XFlm8d9T-BTJ1)tV3%4?O@#s@Y+mQ zqZ)BYB{G;8E<92N@{3XjnB?QNr$%_~nG4C=+C<1ROb%Ese+o6&TF6qW?GMIXVDY9( z1iXxGJ{gQsxpgKEWNs09gxMCYO_*&F3ifP^R@iwVJf?euTZFS|VO2soh{dF?!PIH=|FCe$zU>BT)JHNt@DP)kA2ci#(Qm69c4a z{@P43+$-2;6>{uJG&0^wjzaP|Ub9=s9c02S8`}dGJ~@;yhq9!qz(3*!`)@H8Z-?ZqKY1iB?| zZ8=BAyT(ySo*xn+t1TPb0~VfP6!W7D%mVGGWL;a=nF1A_JOv=UI0w=?GMmLwd9SDLnQy7IJD3!f)pc$Tn{d}^w>>uO z^PxFYS}39nVq59_O$f z8Rw|{jdNI`#yJWTwmxIH$>igl(fK)Ne9o(Vc(p#xk;jg6Mz7|a=GDef`-~~#vX9;X z{wn|Q*^m9XpSj#dTz(MaozH#z$6jo20ss2tHHM%3^rM%bzkiqEy*s}Jocz7J&}|-n zkd4zqleP7=$F$IxZpXrd!1e9EVM`^)oUmB!()$O2i}yQ_#h-=zV6u3>T`3kTe7@+# z_?vtRfZ4`-;dC*UEM`20a29_^}$ocYHOB(z9EDrL(wn`@clc7P;?WvrZ zW064kf@!en{>IV36m!}YBTW~WE6Kb&VX&9Fowkg5Vl_PSV4{x-Q5al*O}L}#RNB`7%vRssN$PIadrTP>H=`LJFtm5 zXBwrgi9Xf`!GvsOwb@@oUbZ6aV>*s*yE=l|bp-!~-UPfXjfM5P0CGze2%THm`9pJt zbby|NrT>badzyek|)i;NmM?otgYl^hLV2f%v=$Btlj!Mm?RChW*= zJM3sSOzV}#;kii(vy~qAb|ZEQ&CEH1dTQ-zYzq7E7!!8Y={)QTj}V~NAuJMbCX9-| zI1HXCUNldZByiJpfeG1;z2cnH9{YBM$j+;KjkhKu@6WAz20=Pu;l+U2*!7)Fx7e}yUkHVEz9RhUDM;^>}Eaa4X z7`AM2;f?BO%=t8Iy%p&m-KK_={Zp{8S~ZJ79rjkO&_PXNXiJe^)x3M-z;W8u3r_DA zR!GKhzJwRHbitGo;Pj4}a)rN$YdA82YinYsNq2gt(XPHMI4x&k1fH-v*nITNwC|ni zv^WdczIvpCjO${t(a9DU;V5X$Iq2d+?uhTr4v_elX6f%1lO{lfVZIn z`JHXIW18ZW7wcVz7_i;L!XcrC;y2JN$(3rT$eU@WUqH;@vzm}yei{$EcI>RUt;V9J z1+&&>$xXeTH}1p;a3a0$yB6NZ>xAG-W|g5*B(JrSh0B<0P>`Baoc!?&VdwcVY|JwO zH{OoYi|Ygl=JQq9SPi;6W^TMoTmabZYPYI)98k5FYscA1CI>L+qQyQqJwTV5^8yHm zODB?d4TPmZ+xxuEw`bv9$Z0po5L(#A7cbf3B6{g6^m@^ZUbgX2(Tv4RqUEDhdH#&+ zzIebQ;~H$Ld}47zhVmeldoyJW8tLfkL`UKGggs#7SZ2cJ;{9=R?=N%auF4G<;LfxYE9vC>Xp$r7=8V;$DpLa#HNVD_w=pu94&eW0q zJkn;FYhE)+3^l%UcX{LQ)o+gz z`6}M_rp#sH|9Y8tdDrgMN1uD^@(I!9<+_(I?*50nKlQC|{?C8qPki({zx7u>dG(D8 z<=i`VlP4AUwy=F2wSBF3w8s3zu)RT5&1t!~nzPrd7kAa1mR_ql?beBNg7@(u38O7P zgK^H@O!eW+IcJ^%=Wp9_pGmADhwd+_)bg}@KsIoUYx$?|5g#kn&Mp^EB}I!vSWYGR z2Xj_3@);s{PIp;~Rz$SWrock^J9yKL1N1WhPVE@#(IDy!oZL}5QG=dWZd}x{>Lxjt ziayaElhDP3JsF8@ez+l#{Q4N~>6b3=! z>!i{-BrJxyqWPwdQtgGYunad2mI)X@)Kfe9Ak4Z*ZkecsWjZ|v3<5qkNt`S$q*50= zQ&%+K*ihY5uaSA93;L@D&69R#gIz0 z*;W7YgA#5WEHkt9sU5>T$RKJ^0~qA}bFfUO=am~5meIyR;_Ia9uFWBpXtNueQ_oQ> zRj|y=)~9w1&m9I)&5hxmpMHX6Iz6x4xUh^i4idvMOR3ba&lc}pVb7UqgpFZPmm3Gm z%xs-=>vo(yGs_!Tin@LGc^t&U#?*m}M4RC=dGzA`R2W#|z;Sv?5<9P;hfVryUt0Ox zb!wsIln2cgUmGyjx!+TBHdu9nDC&QgVWID}c|TeF25~l6b)73j?ivN?du{uYEPjJH z8?3rrD@5-4UFdsl7oIGBgE$+k`qWW~eDm>ic6!LK4MXyNYR(3$K0Fs-b+-?2j%)8k zlErTjXMa|=x&T&w6Bj(|sW}_0`mVG9ix=PQJ6`Wi^Yxr5-DlfxKDejs z8d4l1M4O#YCfy^Oz}ezcO<-6Isnp}m&a=z&36I{i;HhpaaE4Uc*tad&#)a44e8&+u zLn>`ND@@Bmc59X|p z3l8jFDLAi<*=0G{{Wr99lKARoGn#AxIUW}9xqWt zg@?y4>!lXoq|1XjcU=v9_~wfoOBE2F>G{2NHRLSOb+bVD=6gkVx&h((=C1Hzi4!_{ z`0%w)p_0X~i?a?JL2Mv=^JTL)4hYv5$%UR0XLbx+o{MhQ<-wd+2hiE`o#oRKZX6Jv zJ(@VR;|LOw`i6=JEwSR&IYRvzXGhA^R2T1d-pdkI~uII8WdpN zT>f302-fma%4Zf~S2kDN^;93_elhH-vOg<>S3WZcyLP9f z>rW3ZHeuK9bc$Nuz-c_l|mpMV zWS9TKZntcYj%85k_7z9GwX;s80eVqvGc zQz{Io9bGXff9~*|sBUOeal-6JtZWP@cJo0D%SOdc)zMjL&r?Ov^QOL_)5QVR?FzTx z*)IT4AI%E4(2j0;h+dvgI{;=U=za0q`(FV)o@#fC%{dSrv5BMm@R}i@H`C!%%jiaw z=;alw({pxNvo9{tlP=~Qc74Rgn&|N^Euc5k;nb@;vy(;M69hePI+k?0IQY6<5q!M= z3;@*ElSS}pN1wUqK6&HR0pMHYRGcvT5zmHn3tpiIF)SMuJ9QGh@?PBrq&S})=MH+i zNI=Mglyf(I5&Sp%&6Q5)i<%(v5F6e!D9=cvp06W8SkyW#^*=$>iR`o#2&^B}p5;}p@OPxG$`$P?f-q=Wqh_dan=2IoPYd%_xx5j*pV5Ou|;mdk-ZafY1bpn*PQbR)ugz& zVjb)Byt2#~xlm5=q+~DfMR8-jB@m~&1NSUJ7w#JD;@M>Nl*jWRXLs~Ao^{7r;Hf6r z9VeAs9)#Ip2RXTGz%w-Qu=}Z}dG7Kl=j6OTy>7+jTuVB;!QfNGEOLU2redoE7jq7 zlZ#(R;3#@roCGO#z=BEpN_BW3<>J>-ER987qH8QDb-;p!_DXfwig58GG(kna zs2}na`C=_{oiDWBO;!L>o#afaM`(HrEb3OZz+x?OjYZcyJ9p~DF_Y@ld2IG%ww+4& z>0@XI9(;0t#5?ie6sj(>X6{r$_2RIra=CBn7Cew@O#_pZ{tHb#Z+ZMy@^&jU=6^*iYn?#za7k1Hy5Ze`G37@Gqy0TS7 z0?fAE0p>dZQ)K<|0E2mE!^_X*_bV!OZe@Vq@_YHC$|Ie;Gw$09o0#5ys6PdBV^o0I zwwr+Y?3sgM3NQ!HWSBqa%n0V06sHt?cqR+bb2X1(o+-X+4h}HY8Xf;2vd?ZBk-geY z8S~ExG=h1i601`&p`Il{b%X}X^OKq6;7^x$vLt-)XIMSik;E=JNe#22 zIGH{iX%7Y8gk!=X46Xh2-bQbq+%wIf*YxC)X@K6geN7AwIH}H)!AS*qFPP+-<@5o; zLqYn>lVt}>EKGTeycNBfi%h1^6)f7Omv_Ja?xP?70Uz9zpQ~xGW!~(ukT(Zy`C^ey-q6Y{Tv7OC!rB z)*&@RSq{oAlq>nPC~wV-T5=k+jM`3_$s;4n7A1#_p98Y`)5hFFSM5x9i3}ESyVf7v z(Dc>uU-GHoP>1o)DsxT~(yN*x=A4M_>2tORP%i*fD|6nW8Pg+@iUya5@F7f&how$p zo(!1sMj=K)M_nZ-_qmUrSHF5m#C-64DFfRZ)!XAA(!=@ge#+&+G^ezOyR$7qjLx=b zh|IPKh|abMxpFq8B?EH_E}7>y)lA#w3Y5btB|c@~!|T}YD2>uk8X;pDoFg)(R&`!g zL}@cqcsOUx#DKYW6ru@w=)nX&mJBUmWo|XVQYR(D#8u_ZE4Q_3$a7@Wll5^FyZMGC zOT;DD-6uXKg9eOatoR%3mrQ~`;=YCX zB^hmh5WP<`E!T&gk;&S_=NWyA{yjeKrwo~_f#fYh7&pu-kXkL^oJ-^qq>WE4N{d#D z!Y$II8l*jAz%j&|j)$KzRgJ}OtTKXti75bo?|m2GL*i;yPhE3FbY$7YI;3VMis?!kSXai!@@6 zEy{wiOk7zy_Y&1 zu=elN2f;QZy)hQ=ZB6kRfZrePb~J%do%!j%z2)geCS;pG9#RM9n;RSiGH+d4hb2_r zJCH$T`q@mo*1mKM24kh~!qX7<=cbP?Z&7SF~JVf5$Ql!>)eYS7Hik^6O}5AHZa2J%ewB(gfflILy(qEA&F*Axi2oh0G3Ca zbLuS*5XS&ziwkj>{Z5P1@5t;ltyjwWR-U5f^(r`m7SC$Yq;@ll%@&_Bc=|n)M6xFY z^gR2FlAN=NlltyVoxr%(u}@Ys8?DnJKl899^4itaE{N(u>Yo?gAWm1!ukUDr$qcD> zbzd3e^dRNjo7Ez7UEk>jCAD~#>hm_aTRf|Ir^L3kyIt+rfuQ_8W7n=Px~kzcT*F%@ z8iEug62blz2rB3`$KIec`rh&MQUwM#Ij6+7bCPp2`V`37!n_}3=qqD;eNabu+2)jJ ziG>#1ld{DF*f>29%OF)3s}5p{8-n;c9ZrHHbB%Wim%FT2Kk++ny%pr$;Jw_jQP9g} z!K;6R6F0xb#7))9#DDuTF?_cA?%jWU_pjW2^sR6H=fCmC|IuImeZTR^t8Way!tZx4 z2z}nj@tVH%G21o0yC*9kNoV<~-I;YKLnP|F+!OfinT(k`XUwYHe&Ft%>et?S>v9Ql z`7hwVJ;^$@CO+-hPVu|NGl$AW=oULQUCCLQ*6Azk$|_43MVp1;!^`&!fKxj<*Nmdh zz{x$P!yxF1RMO#-xMJ@$-Nr%UWN}{*Xx3H(rw&yGQ_K6)#mwErQ?xot3$?j%NTvZ~ zV6n&jV#m<`!$Ran0P}gK^S@vk?oLt7D$}+*QToI{U)g<7 zREzWaIlGhxeJg-0D&eN6%S!M7FR`e#Z}zW31ov8VEq-X0xq|xc*=e!Z1uk2>NDEgk zHdu8g>$$Q%bSlFynCJq?OvF_6_0|t^4zXO9v%+Dtx-4uyTf8i1f;TK4pmz)e zJ!@MRNt?!`&GJSf7@S_x5$v}?P76;~uOn?-lduM3I*dYk#P!SfK{-hD?bAjudRJ_d z#f2Zf=9)5`>}=oKC5seslgJDm2E(Zo;qb~94`#Byb*kv~t;#~M{W^^d5$5ou z@J!EB8N-WlR{Zzx{;=M&`OUxf+wc9+Kl|4|`S!1T;phJR&;NU${Q1=n!@v3?UkKme zxAWTlXRr5J?(!D0KF{0nzWhTUH6H)aFFYLocsu?>-$5Oe%jcV9)sBzt3tPz1-u+35 z``yIxZLWFn2Qh>+Kds#G-CtSV9uoIIZLbylf^E0Rz31&eNo^ZH27{){y*&KQ>yrC+ z#6SN*xiJAiro<1v0nQ6KnOx4o5{`0UnIj?)YAwSo*1@J@2yQYyH&i>4IWGhQXp0Os)z zelV_ttY1Q~q+6~l6xRxU>DjGlAHMWH`xp!o)1BnL_4W|9<<}J1jZvX{+YVqJ|9JM< z{wH>ArQ3Y=InU0KJyX4vwhuQIn8!b!dxJT$59tkFdo%aIj`KCi#cf+ZkhZ6-qzygv zvkN}13p%);)8-u6+tMa~%R;YV@sD|JT}IJJXa&2+q%ZN2>M+;#>JUd7B4J!4IQBvQmCcy>i*##fh1&!=;+MFYMTd99O)z6W=?NtAK6E#Qn`6epf zFeVp(ZjN7fdx~Fzea^FUpS>;5KKBN5WZ$6n)Gf!G)nqgUMb zmNuVnqUOk6UFvbFf4+&DBl~<4^?Va`dAa%f=-t!j-e8^$-k|o>EytVHWIjgQ{Op2{ z>w@-`=k|1t>}~Do^G(zo*{j>r=bNbKn<)L6i}Bm5tpf9F3q!RgQ?mAuecSpG*B5+1pC}^G(zo*{e(a^G%csQt}?UiO)At z&o@!eH&M|C&SdfDFZX}((_i>ht@IQ8)WVz9WIjgQ{M??-OZ{_u8k5o1_{`3p?bjY$ z&0pjDCC@iebDzDsJ$=53dJ>;~&a-o$eMp{V?Q7?X^vm>i3ziZ$-j}SF5?c;SiPI0> zAJ`=5&&9vre!Z&wrTCA(`S!;@^5Wxv?ZuCO^6G=?kHtUw??~yd8DIVeUib|!-7oSF z>S=^?^m8!dh<=aC_mrBm>{=a^oB4)stxeCp$Mp8&Uf~kdvb6hGk8FR%8S;*LO9SfE z?q0pmh{TB2J;wCqcE_7KUFYb&48xC;@n%dq>hpEWroRWpkz6Cr+5Xlu_GvmA?4(IB zF+a|jev>8J3k=p$decg+OYt0OK%dT$7=4=9$hI80N1e9q63WDU>~FR|-UZn86YNw> zKOiuU=!c)EDo6BlM_ko@0Ew&gb5I@;_YpFUbe3eVXkzlUmx&ufMYQKXU*+{%fDG#` zy)>ls!fqTPQgRB8$SNEeZO~lF(j}@>w9yB_6E6~F+;C{+?E`IbwKODB`>kQVnqB+}tv*;dX z-oFEgY6uQOFN1MpG>>2=;lYG;-Tx9YYOw+J29Y|7{lL9Wq|!ho_%W13_{Mf!2oy~csph|`GW zy#;96)|uR!*4E?8!P13tYJ@I0M*kS=qYG+|EbM9!g6KXoUV=2xo5*R}6azZU=;Kpm z2u({S12lB(rhpytJ~ajNjGd)M*g(i&9BIFQ42|^ zt7bF=O=`Tnk)ei^er)v4U?-~(&Cv!eM66w+Iz^*v-S;+ho34O3qUbg<6C-MLn=x8O z_Z}l(b5u{Q)~Y*fA_t3GZ82bZmY@v%QS?#0Tp8{>@=~la`8BIqLd_ZXp@f=q8DWNR zde4eP$V9UW(5l~Ti?rhinIXrLjxi!PVxSSO%Cj7?Y_4J~wa*1hx^ydZY5nh-1N*yv z{@WYNv^0t85zVF%&XG9d2-})_)oI$+ThHtgLSkmxvn>L;jG*yoHeo>7$Btk`Mf!2o zy~csph|`GWy#;96hSN~wbX{lbNte-em<{F1oHM3{F`QcfI9r8~NlQo*In7r0ao&ke zH=8O$Xj*m{prKoY4kaC44P?qB=zz&2bTpZqs^*h1-I|=V z{&&rR>p%NlnU*F|J)+q(!Z{LW9ATq#uR3vWC!CpSLrBa_d$vV@^+Vwq%_a;e``8hT zs7ODqy4N`H8gUx2yte>N+i)7P6<>ChE~D!(8_JbAXG{xYIJW?BwhAGWmXIcLnyv2R zJU}!0_*5A})3U<=4IR5F;20WDnqwoR5!P)Pj3cU8bpEjxY89)axQ}6_5ks6nXkxqf z2>6<~fl}1}5HzXr^8UftNkd96q{a~E0CSB%82 z!n=s`taGnX5JyFY$ZKS@*Eqs%rP<4_)(jC`$;3^WA`OM|o~EJFPe(wdH{~7mmImV- zCXCUSN3C1|{H&Um!a9H!rKjuai| z5U_F17{;12rUUMys@)2|Ee^|6S^^m4BKgiic-I8dA+FGRHZ%n$FC<~i&fZTQKs0PCtt&)MjqAb9?8mb1N?PA1n@rR8ad*Sq3;gn~Jqd z=Z=*X^KNv+EioPLz)kmx)7yyar;^qt=r;|zZ=LEPQPACgBRR~LVN!wwo5`@FRs4a{ zEje2TTTF1xY_OR-Tx}fdGgJq!NKJ(Z-pw&Av~XKBop9X?e7|_KrT_SG0GU_@0yzeP zaI#r40E%Ry#g^j%i_JN>Pl$l)V5N&woaRYg+}S2m=+=Q(Q~)h@)_Dvi~ zror)-tmG439PpagcUSdAWSPo z7f?XH^q@-)P_KJnY-zZEzHkK1>%*qjhMVTyR#@oWN=}AoY62O}1vX~^hh666pcLGr z3qkv1SO89wCdUgua}Jg$W=&k z`{KTN3FtCk5Q{zB?%(9Ts#lRn&bt9250cd+8CyvuJRgU{jy42$%r&PWiCjRXv#`aW zVj0KYbxw=AaF4XZVeZbvDR$M7dWK$phz|$}2#b_)E}V{>r@NkpZisUl%zl%}Ss)}O zy*S7zZ=6B5bmcRr{AsX@vol3NsE(}OD;WorsMFJ_B@mQ*YmS9Yq=V~j*tII1dk!sj z?V5VKz#~Bxh(*mNm^y%J$Lcd#;Hm(c8Dq~7#bW7_mhq|fRI-!9>9`|Uz+jp>XB4r-EJUDB zB}L1bEiMuUIR_=X%x=5RSmhO}+tCOG*qnbU{IZ@=crM;yD-JZ%+AN2tMJn*ruE95) z{Y40lX*}!FHMqJL)-nzYDawrNhIv+qf+49RVc%_5FfZe9rcx^%kKHO4=Yg_Mp5?Y( z`(oFr7tAzY#(;KoLClO%_$*}k21)i+P)c(}9a4L=mx#M29 ziXd5wb6S^xjw>P0=c;KlQJ3A178~|pJyr9-5y!?Q09u^xDrB4i0y`0$R|28S{tgxI zPwVXVURcL*767&vbH_>J>O`XW@#3lQ*{(%YN^_^DAg2epsXHcAV9vsR(JY@);@E)NBa!vaRc6wD8Nee-Q>0 zl~V1U|KMo`$U0^V`v4DNBB@jBiQs79t}P|-6wEox3rBLkX>q5|Oza7YG@%!VUG?lR zpmY}Z!ZD@&%m+_F=a2|qZ5jD1cld-Td#GOZA*W!gbr}+u5wsq3fxPSF5oP*Fmv<)I zcyi{oM2@B40Rm{2B6Cr@#cmY>LDegic*{_u()$%rq4I&72s0gaREioQ0IUNc-2v#O z3Y@jrdS;7@6eW<1N7z-3MdGDrpYP#?sh&Ad45DrimMuC1Y%J{`Z+E)x_jHW`GHTEjc! z67Fby0}#SJc%?0AV-TGk^MV!QBna=|3H+5(OdzW(uVu5vb$~2O1(N|8?9tUb-mFDWzoYuHz!jo)5hzL0+Pmo9%#AxxA2 z{Jvj}s(#hrJDj-XvC9ul*xxrNyiEKRPTX2&Ox#{5xJ>*{I8kmnexZH&uKU%emx-6p zv|oMnxwkG~OW(cw@gMr!$N$8OyT9?RZ~k|`^;iDHN5AuTKY8_y3+X2>zX|>M``?Cs z@9y1~@87-k@&gST^w1yU=6Uard&dgODLn)mSZld!Fr`^}Hhr*Fh|Z0?(7SQrqzCcB zS^8M!zD@@#r~bjaPT@EsC+93h5@#d$)SN?L84USnI2sst&!&=l!Wf*&3mj1sk9+xLQ2JajBJ@#fyWpXjfOdK$v!6o=tG_`!~+n z19VW*_P)|=Ug(@oj(aif3vSSJiVOkZuA8o@BOqr^@{w)2)so|~fjmyNk--@F>Po`T zJZ%EWBVegQHZuf%U*=Fb7=jl_#NyQAn)Bdvw!)fov6ulwv6nF|`@7%FF3l9Q zcC3DVU{0yHu{sk6Y3Lhf=wIu`2%w3p+H`9@3)5+F2%zgYcNRkQi8hPArB86um;ZSRR7mH_{bDs!y@4A0i${GCEoM4bS zI!;b>BFyApaaA@BZrq+CcD0xr&(vOCu~4dD1(_#^i%uqYNp^LzqNSQ{985RkHa!`I zwdO?da!EUBYBwJek&$Q2hg~1w!rrwimrE}@8C3zgnf7NI4QFD)zE|u%_&H}cO+P0H zHVcS{GV;fiG zZX!;uxwml6@=`?%+*Eh4rsz~bytC`=O_84Rt~R)+m83X1LY$KaeE>_jX~y8%M2(2! z?I@+1q#671V@j1&$s&Q&MQd1Sk=IugeXkO%ptyC;4}|LO;*87gH!DS$uEp+SB1m_G z*gcYTkjaIR^I3fj)o&g|e!jb8OIY0?FXLa%^H}$q2-DpDl$@R$OiZb`h$o7WWNU{i zVnEzxU2?8QC+aNY?2BI)XJyzRHd6P^+1DEfggwYuf4KFp^!$0a>@ zTbHh#O=sNB95>AAjHI13ZlbfrMH=rKU68?|@-Dl$D{dtJxV05@%$H`{7{xlG{SM~xAgxs( z|K%~y3j=>8XcJEDXc-kDvw+_#e&L7WTrV#CkYWdYsoQEW2 z-UZ z%iy9`@(e>kMsuzpU6iTWC9SZL??-n-ZQwHI$){wmz% zzq|dl(868{_R!HGUY{>Gf8p}s$A{Awc3#HI;zrN0xT_U;e`Yt*Jclg=jUaingbS<;Ho(G?TLX(DS z(s6SAz5ZAbGKa+sgGM80+PQ@_^=x7{>Fu+Hb2e6!HV)ES1@d2>_q;IhSAsU-)Q*<% z`GPYbDZg|FP9$I7q2c+0lYdLPYerBCb}RG^$9T=-6I?JaHxBVwHY3j$oLftrU)OZ# zI(PzsQ59hKY=+wN1?TU5`6G8jyY4a+vi(qSUE2cEVFAKvV$_UNFzAW8Hl0mNFAHAK z#x?78)^*A^>HjRsx|8WUF*4X&y?#zWPYm2&1wsdcMY{f)ks?i+AT#L9Z^HGQgNs^8 zijz10oU;`9<}++aRfxFt1?LdP#_KVqLRi1PUgf4M3OSB}48C05UF`NBDn9gG-fw(X zV)w?U+fKxG_Ipeg8!*BHqU);U;rB8q2)9fRAwuS5^pD#q; zoD0#D31bpfOuO#*=er`&U!SY9SntzVU`{U#1SZE&F@p|{0v~+HKR-By-JELzZwcj$ zo$c6XxNh;Rs!znBksi#Mg@$5J>IsakM#ho{mAG+0Zzk%Qql`Iak`@575qrSmw7Xt+ zalIFl^Q0NGi<)b;aB=N9JIUl`?Myf0ye}>|cU`!3nTfMJSOufQ^*T-ti1kTh@RUr< z;Il?!3R5~evs&*G>B2c1t4W^@+tf&()7@;8*sk2sixnZWfZr2a;Y#b2x>#(n1D^7Z zTBIH!T5)m^x6Ty%CeFdAb+zh64qPAS&a^mp^QF+hSwQ$R9-?^Wb=3T9#;#M=G&F&^ z+R>Ciak*Rd4(tB7wZ|dTsy7CCNMfTBB&MM{LfXN2n@o%$(bz@B$}tdF$z*25T_=r* zQ>WqP!raz@tHeoTbt-2S#5=p*2!UNyw)g1ntsE9Vrbvd)+7r4-vdI<(8K0;!bZqQi z1UMwI?=3YuSFlk+XnD{*1WkNJ6WE#9I|hh7_*&UG^#q}G#W()8t$twk|M@z81XmL; zKY1IL>gcA4|1T#hA^!j-3UvLf?mr$UUe<>l#X}SSzsp4Yw(aNN{`g;g@$o?&8r*uM9gY ztTby@bf{%&3W9S-6He{O#aD{M#c5!Akm76y(z~LHZti|ulVyvCB9z+XZ(iO6j;K5x#BiC~zRPbKu zEkPGMCSlvJZin-)^UKU}Uw=Ayt%-<#5Gw$cmf)EvliFotKA`Y%vC}l|HsNf$d0}vM ziDN>xW06q1?!v5GN;_62WUPjw_DGtqjMbT*Tx*fvzT;vh#y7F#7WV9F8OqWg-GhZ} zbEk!1a~@=9^L@wuKuiE7k>ii+_xwI2DqBy?XIbvl%|WV?M4Ih70m&kDi-&H(o*EL6 z#UKEWkZ>Q@8K|f27Ig6-by*f`8Z+!@$hhMqA6mwBCN9uf=glHioN$94_Nfp*Yc_?9 zkDZ=-Rt(kdL`j^jab~1G2Lx1V>-O2VL+*Pmbq_9OkRK^^(>g7kvBU+CtMr^Nrq6Uz z59u(CiAQXQsqU#>dX|hQi(Mb<16JY5(l-TSeQfIki|AKCF27*p;fX*l7xRF{#mllz z&cPeGYe*t1=%+u5Oz0`+#NZCe3f_Hj5zlMRgU8s_>@5^|Kic(aJODLw?iR~apw@|C z;A)_{EO4gnx}E+>UO*3H6Vaa{oyi?1tW0R(dmgJCyh+{dioHqcWe=P(Gy zhMtnh-oc#MNjt0yfLg^zbYKSTskjSjCZW@pfZzvpv=8}(`WnD41Fv>v4xzrw+|N@$ zwz$YMT5Rcp*s|X&XPz=aSPYM$W1NP*&_O#IdIGSEx>#I$OOc1jIp{JIXE)~He|94p zGwe8%aX-=(3U<+pa5%Nt;Z0~yEe?4#;XM3dVJ9kc4IqTw;8R_e_AYk9;MzjO+hTzA5S6Rtbq!H=x&n)8rN46=_6!C@Zx&;#YhbX5u_I#rm1G}kW4utiI zZE^aXy`9)ZVo1|BUhlDuss)_|Mi3hwL&pdSv4*|~NkUHma*#SvXOXopeq7F(s|64o zOVnd|oV)U;4=lz^`Ic7bUIDpvS}Bn0a!S&u4ngYlK+XX@mx3@@7pFqTb#W?Wd_X0) zO)PTIBeWKVf@d`5ZHf?f^7eGHy<887SguqAvdMN_z~uJm)MATM>rq@oo)MXueni&3 zHqxw77cVo3A0gNZkk`RBoYxIUyV_#$Q~GJPe z-TkhY@87-k@&gU-`dohI{Y!r#ep~sai;*thR=)f_$7gF_(iP4A`=1-YFMsqq_!?6y zesEmTe!B7HkN)y7{Zi60h6}q?W04DxHWZxTcDs~rC`uO;y*J%2! z4BmS%vhNMT;-;}jc4JiN-nIjn_y>`Ff5fTST~O)!?<AZ+Up?yIxPt$k!;ROsHe1DMA@zKq`B%NN$HU|*IR#qL_c za=WdVA^R8%$_iF;SIMEUWp8k%f@wQ|iGSErh;iZfQf$)Sr(Wx$g(#mbrZ6; zGAJup$z3If!j`?knF^-u04DxHWLaR&Aj{sM)J@3V%Al-ZC3lq^3S0IDXDXPs1DMA@ zzJdz&l?!X;*{>`rm{zbTY%69J>@gUWdA8)PJWFBA3U(&XqJjy`0$HZPGsvyfIJIizlLn^wZWynw#Wur!2sJ<%(B5_FerVtSoqI~%kjHsXb zGDdWg{nBORh>x$siejwaj`e-$*B4gQ3IemOm|5{L7~s{H{${-7zP&dA^-3#ljEdXZ zwjIF4KWsoL&d0cCkYzBJx;+Mi@;PzIT@Q9CY?*n^JSRrxk((CC@|OJ!vMlYTZbJ4} z2IVb#$z8YX6t?U`&fK!24_P3~+n+PY@(5MxCS-4AP~QHO+;#gyVaxO0ncE+n_ZGaSMN+= z%cq%VdS`8i)QW$wg0ZzdgRK5abJtB&y}_*v$_}qYRvjLNZLgU<_&Kq*1DMA@*zT#h zW7l=2cV@XQyVu8HPvNtHXt2dyqWd%Fa8=!(MkY(vU zgDi_eshg0!l|k7Xl-$)DP}s79o#_ow!GP@e1fB)v%yVLp(23ZDJshg0!l|h+jOYX|E6t>I;XYwqv0gxTPJ!3XF^GyWZ zp!_O9Z<5@~pv(p(cVz<#Tl(yoYyh7Xn8!1P5m^T78D!}OrEWs@Rt9A@D7h;eP}tIE z&twDmERY?4OMxzR=C>3mZ28T-zC^v1LFuz4clj)ZEs;Irvq1I&=H=He@RJtb{^`5l z_3=Oa+{gdyi;w@!7eD^V%fI?aKW{O6ge!pgHrN>p(%DN48w0mJ@>jA{pySGqiI2^?T0G&pC$9Fd4Zn(Y?(40r9PAC zv;xWP_{Vs~!uTu?);iWR=bX7WcmM!~7+6b%K3Sd# zedahR%E(-b&1`c9mj^JgmWq3_T=pi+Zc>pkc}8ZYnk6U?V_+>6v1EBBVzmN6di-O2 z_(X3zbCJ&oDzDOYk^e9ThCuF2mS^0VaVt6KZD$l^5G@sb7y~ORk0#4Am5gyKMd@>A z6lEMO6@3r`R8Zo@IZIl!dl=n`N%*`%WB%i6;BgK+esAoRR zVT6>Q#yp&Xh14}IS)O@vpcURja`3j|jG|2VOGO{Xz(VRege=cohiHZOkfJ=SoKcj$ z-cr$rF|d$25Rv7X>kzH*9#WJ&-Wf%C3|%VvFa{PKX(F}4dq`21?lX$=W^t+L z!x&gdwFhK*ris)F?;%B59?vMs$6`xGAB92jVZSOQMLJU<qC_Z5wI}ARhT=omh ztY;dM2QaXaRno{Zc`7$606=BwV9chxIT=5HCNRm%QIDv z#XyR(C@sZiT0Voz0~lCKl{~WCO5W@tahvW9q$11F8JU@rm!Le1frV7PBg-@Oj%7fK zvK%eNWkcuosXJlsXT!Qj21{PA4jx5hqx?}}$IkNkA z=LcQJM+u&J>&%(uvVu9jean^J)HGsxQ=^LpCf_p`4NOAIi-w0WFiOhqWO*jLYlZia zqD;PL6lES-D*7-67E&3TEYF;2nEIqBQ}7u@nTnQ*K8%4CRgNdiGdW%>yoVHJ3O=JK zbIVfE2Qgr92C32pEYQ;iOsStzpE(v?R#1$vC>0~ngBVAqz5c@^rfl0y*WZlhGuPkj zqs!ap#=tCAI88CDaVrKnH?iQ?4b8!>qN zkt@DCKb|puN*9cUGhNwb1vAF>-Ar-v4)l<5EruR`Gpx@%{HA*^AAUcKfrV7wAj>m( zgFz)l8P;bMrH3ySeGmg0wDCv-q7g$t7$xN$%6q1<8zQnLt5kqS3<4YxdHn}0v+Awa zuxRhq3r$+V>b-moi|(OtB+F&>=Je!~6`MxlF$m5mL}M-$dKd!>sVF1MGf_79Pgr#C zLf^Tx)PATR=piE=Ui97mNlE#Zvb>BCpGo>$v3+MU+;R z9#Kx@h~7jWe@2-<$E@cb;|N!24tLgBk#pMXq?Sjm9raRO(gDzOBq24G7SvSSIU??q zN8CB0efT_EbNF0V67tSkJM#fS{uIbAxIN)6Tr^JsUZ0;#+XJJQ5sRdz@3$7Il^ekGY+{cT6DJZKFUhuu3W}B8etaD-!IqAxc3<|pw3`i z_4cqzbNEB@pSz3@AKm_Njz*Zv^caVF6b65j3!u+mPj5Nu^5#2Mf4rSIH%6vvb%^_lA zj#KUD9F35dMu_Uz4XE?r9AzSEp%J305u&P$Mq4NkvW_Z$aUYFvALUAN*FGFk&Sj6K z5$diHu2LN(FZG4v2(?farp&5j>uaJx%f)%8OSG)2d*v3jV60S~WDQ zhUs-TJgbIp)v&D^rd30;YKR`A;bCG|JHf=Rc7nl@w?KT6anQf$!EqN&+(_6--NF(H~eYmsca6}Svl?n}8 zAdPU2N)Pu@p`pwwsgzmeiF3rAIExoY#+FswiJ>&*h&1JhtV}-?FZ!W)F?Qrp^k-?x zk+Bd<9_}Mv9FaU6k<1*CZxBNv#yJ`pV~{yP5^|0t3ZDU!K5y zq$&3q+X=N&+*uibBjUv?67k}QcyUC$I3f%=B2VCmoQO?wedx}*} z8yljqc-75p4GAB;oAauhDO;h{-N)7n%s8+5fK?x}UChijUo`=%CT!~g z1HQFyvz@ozY(`u)E_vhRn;Nwa48rkFK_g7Q8e!7Z2%j^KDPU|<6c`M61qS8O2zhCQ zytEHfw&Y<#)G8)utzt3I2sKqOle4x%Xgz{(~ za@QOd49%hL;>Ddc!ktIGG(rhSnU#*YkCHEWDM52&T&1R#&n{GWsHut*=cs`3DTIpL zIEVXa6>X|w$r0^Cy(A&E&^{c|K158KazuJ@M7+k4(Sr0JH6@%QoH;V$GagGMAu-IG z0CJa)v9Xgp^h5a%N5*DCBaGb97Nfls?`#XSiX&RZEHNIOq&ruQO`Bqwb0jlIl>OK) zi#tcOGe@L_MqDdam3>v^wzgtcPPQsGBd*$lRpl?+hSd$h>XFOVIm{$qwGFH5kJa@} zS=>*x6~)84)!ojj1$fwtIBpS?GU$|JF;lr^7;6<1mgX=)Xb#h^<}h7q4wJ0rFdb+P zN5(5p1tcZZ97?D;lu&ahq2^FR&7p*2xfNpES#y|DHNs@15pvfEd5tZL=1?!CCytD* zhDOL;Bjm0Ta@Wp8Ri&M)G(z2#^r^d=26ER3_Ziy}jc^~OORiE%rM<>BLW!8CF(qrZ z2pXa88sW|=ZyZs{;fQ!~9~BtNtP!H2eK=<$Lm2;(b>d_>eP zJ<_il8Zms;;HGQUeXMHyss^v_Jys8|@)t5J|Ed96^%$$Ba@B*Zt|8>ZY?oD4nFBS4 zSz05^0~%rO(mu?A8evY>DvqefU`&lYk4BhJG(wrjenxXBvqmVhMkupJsJnLN$XJWj zt56=zp{5$4JQ|@q8lgPedF0NKyq_88ke62Rr{|Ovd5lypr92wpD;vtL+(-GJx@!(c zRMWY$M!2(hQ43{zYM~MCqY>_-szC`=SvW`4nR7J4oz?wvm8u4x)#x`oDB)N`$9_hu zh>s-Xh~(jjcIJq5=ZJP@Zy;OHSI3S*5^|2@;fUnnh$<#WBq2wH7)K;CM}#v+g&UC5?Nqibp(`iACkM04l~(u-D>790_GjtE1(pdy($A`7x9)Et%{$-`17 zc~~H&1sf500!QQt8gUZd&XBXK+|@~`e3V+AE>~4=I|I$cS{=|<*W0Ue^{Ql+xB9E= z>-=ZAEp|mYs#Z=BX^CEyH=6A3IVxm71N_eh=%r|?kYNzP$Qf(o{%*{2{pp-*FKb4 zBTUyCq0CAw=m!BwLzgc#?H z=PMz`IkFB%BoF;Z@^EBq8^oP+#GNDJ&Jl6vi11+skRNi6qKT2KomrH%N+ZtHtLnJA zo?Vrp@}0A-x)yiKt4qXHjVw!hJCLN;x2x(|7P$OOXw0|10R@alt#*zIM1MxBr``OGe;ydN0hZVBE;BT zi5Ex2izDL25%J=PcyUBGyBcvDudkJskfH+p1$MuWVNLJzLW_gLUf|i(Yqi>#=I>R^40K`rXvp$vGJsV~HOdIjv$6 z&??^aX@sd>BTVDkhpAp8OxohkhnbqgWHPp+W3#6b@=`%(nbSVxt~q>AqkWj7wTdHS z3nbmiODU1OG(uil#e}Rm92t3Ogve`zt&7qfxoZw3yl-MZ`6&D%mGI!+V_P)hsu6Ni z<3?RIhaRLk98tQZ9x6Vxsz%65BjlwKYN6E5eKf*-RCw74jE5B!4XzT>*9nR4{Y*97B ztSL=tcWKHINyt@_ha<8nN0bp+Rm6)U;>8h3$Pw}4$k^OTcg~SK98n(Sh-wJiG)c%h zBMCVo2{|GOIU)%;A_+Mn2{|IfI3k%f;{NCLwT-L0yz&{{sx4bx$F17RRa>}vB(=JT z9B=dj=Bu7~)fsM`->j`%z1*^D3s-ID?QP@G^ZHUy5yV`o5oTcZZp=dC)tyF|bJSt6 z8fs@&y1Xl7j4Oipa*TGSJQ`tz(g@`lI}?pi)3FB}D~qC@`G4%)v@;*&sNvUAc?+ zPxT`HULZi zSBLx6gRa&2ynGh5%EGHGzA7QB`nM`k`74rkiaEfZGn!Yc7@9ITn^3t4=g5^fGA0JO zB22|N^^mAs~an6{Z$1FO| zQEehLn#1fj&QZ=B=kRPh&Qb1V4i^xtXyY7J^KlOQ^Kp*q`#6Ugdz>TVjdMoF_7^gKz4{9oj%h{1JFouMW%70fv`79&FF(Bdk_SC|>jpD|GV6yKL6P)z z6TE*I^!|$Rl(02b$2PD2=0)Cb{Nks-@Tnx-vid>0?{hYS2hC#3g9qW&f5V-A@5>*# z`~2N@lYh(!8Bme=c1BQ^P6=9(YD873k#_rX#zvl&?xxU63EPY zBDX*NDUg%8?`3jGKohv@{^Y0Ml~`>p@UbyzDiC3Bc#Xo(v|wWqzH)3B-07b_f98J zSSfu$HoP*D2_vW<9I}(9gy?mF zy)wH~2tf@m8F#o?${;$WObN;)DM6VeB`8o+f;`;>YD=)GR68~@+j6~vakjVIdPZXg zCEswj)`4l<1dojotR&Y@34+H2YN6z3TG(ythz>^y1nu^PjG%mD0@-Lcdp4Ec@AUe} z2pqRIE90n6YQ|BqY+Be&K4Fb1O1MFs;;;2V6{IE6oB#q-+2)If3dBZ>ENLRpU4e}< zLs$%H_ChZK z=6YdlDQTn4ltZ26dZ9C0zuCB5@@KYErup1KAoFl{Mfrni1X@@R9~W%~nrJ^z@vVf` zan?+OGz#IApiG3SnDXpMrdkw)9hnYRBq05rwB?81s;uGo>H;q7RUYO=lv`P7MpG6FH0TsA zJf}d)aV%2+lE-QSv2ENg*AEoJV(scu+Yy|7I)e4+2(xUePHwu$wJhu=C{3VN`%}K5 zSi!c+es3Kb(@a%z+F$9b_g01a!DH_rv`k?FnTi&g64-x#6|X+3>MmfWkh0#4uV~e} zcMnAf^4Zf=>LjZ`2uxu$x#LU`(VR&r?C$5i)q-V&UV14dNoQWGoI8U~G;0w!X+xiT z=>tlpGxgL|q#KH0(Yc{$4qsvtp0Y5hj9YxoJ^*uQ`&qFPZ3diZ4)>AY3?Hov#Rjsd zdkt+A;wQY#K~;lY|8+2ZGKmA)FxK^jJ-wo)-4NMp(~c;*6t6%+!cV zK&eSYNIgh|=~k%`Rkl)8aooNVdA∋x% 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 z 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%0AwmXPz~b@ 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 hNsFOgbp#23N-Ibl\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
OriginalNRSCMflow-opt-c0flow-opt-c1flow-opt-c2flow-opt-c3flow-opt-c4flow-opt-c5flow-opt-g0
fastYYYYYYYYY
\n", + "" + ], + "text/plain": [ + " Original NRSCM flow-opt-c0 flow-opt-c1 flow-opt-c2 flow-opt-c3 \\\n", + "fast Y Y Y Y Y Y \n", + "\n", + " flow-opt-c4 flow-opt-c5 flow-opt-g0 \n", + "fast Y Y Y " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "b.load_circuits(dirname=os.path.join('..', '..', 'circuits', 'benchmarking_circuits', 'Fast', 'before'), group_name='fast')\n", + "b.load_circuits(dirname=os.path.join('..', '..', 'circuits', 'benchmarking_circuits', 'Fast', 'nrscm'), group_name='fast', simp_strategy='NRSCM')\n", + "b.show_attributes()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 31/31 [00:00<00:00, 100326.72it/s]\n", + "100%|██████████| 31/31 [00:00<00:00, 677205.33it/s]\n", + "100%|██████████| 31/31 [00:00<00:00, 673696.50it/s]\n", + "100%|██████████| 31/31 [00:00<00:00, 274890.96it/s]\n", + "100%|██████████| 31/31 [00:00<00:00, 812646.40it/s]\n", + "100%|██████████| 31/31 [00:00<00:00, 935420.32it/s]\n", + "100%|██████████| 31/31 [00:00<00:00, 333393.39it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Circuit attributes: ['Qubits', 'Gates', '2Q Count', 'T Count', 't_opt']\n", + "Loaded functions: ['flow-opt-g0', 'flow-opt-c0', 'flow-opt-c1', 'flow-opt-c2', 'flow-opt-c3', 'flow-opt-c4', 'flow-opt-c5']\n", + "Loaded routines: ['NRSCM']\n", + "Loaded circuit groups: ['fast']\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "text/html": [ + "

\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
OriginalNRSCMflow-opt-c0flow-opt-c1flow-opt-c2flow-opt-c3flow-opt-c4flow-opt-c5flow-opt-g0
fastYYYYYYYYY
\n", + "
" + ], + "text/plain": [ + " Original NRSCM flow-opt-c0 flow-opt-c1 flow-opt-c2 flow-opt-c3 \\\n", + "fast Y Y Y Y Y Y \n", + "\n", + " flow-opt-c4 flow-opt-c5 flow-opt-g0 \n", + "fast Y Y Y " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def basic_optimise(c):\n", + " c1 = zx.basic_optimization(c.copy(), do_swaps=False).to_basic_gates()\n", + " c2 = zx.basic_optimization(c.copy(), do_swaps=True).to_basic_gates()\n", + " if c2.twoqubitcount() < c1.twoqubitcount(): return c2 # As this optimisation algorithm is targetted at reducting H-gates, we use the circuit with the smaller 2-qubit gate count here, either using SWAP rules or not.\n", + " return c1\n", + "\n", + "for flow,smax in [('g',0), ('c',0), ('c',1), ('c',2), ('c',3), ('c',4), ('c',5)]:\n", + " def flow_opt(c):\n", + " g = c.to_graph()\n", + " zx.teleport_reduce(g)\n", + " zx.to_graph_like(g)\n", + " zx.flow_2Q_simp(g, cFlow=flow=='c', max_lc_unfusions=smax, max_p_unfusions=smax)\n", + " if flow == 'c': c2 = zx.extract_simple(g).to_basic_gates()\n", + " else: c2 = zx.extract_circuit(g).to_basic_gates()\n", + " return basic_optimise(c2)\n", + " \n", + " b.add_simplification_func(func=flow_opt, name=f'flow-opt-{flow}{smax}', groups_to_run=['fast'], verify=True, rerun=False)\n", + "\n", + "b.show_attributes()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
 OriginalNRSCMflow-opt-c0flow-opt-c1flow-opt-c2flow-opt-c3flow-opt-c4flow-opt-c5flow-opt-g0
 Qubits2Q CountT Count2Q CountT Count2Q CountT Count2Q CountT Count2Q CountT Count2Q CountT Count2Q CountT Count2Q CountT Count2Q CountT Count
Circuits                   
Adder823243266945612456115561125610856108561085612456
QFT88568456425642564256425642484245424242
QFTAdd816184252184112176112176112175112174112149112135112165112
adder_824409399291215295173284173277173269173267173268173296173
barenco_tof_1019192224130100159100151100146100146100146100146100159100
barenco_tof_35242818162116211620162016201620162116
barenco_tof_47485634284228372837283728372837284228
barenco_tof_59728450406340574055405540554055406340
csla_mux_3_original15807070647462736273627362736273627462
csum_mux_9_corrected301681961408415284150841408414084140841408415184
gf2^4_mult129911299689968996894689468946894689868
gf2^5_mult15154175154115154115154115146115146115146115146115153115
gf2^6_mult18221252221150221150221150209150209150209150209150217150
gf2^7_mult21300343300217300217300217283217283217283217283217293217
gf2^8_mult24405448405264405264405264383264383264383264383264395264
grover_59288336--228166228166223166219166220166212166228166
ham15-low17236161--23097224972149720897212972139723097
hwb67116105--987510275101759875987598759775
mod5_4528282816258238218218218218238
mod_mult_559484940354035403540354035403540354035
mod_red_211110511977738773867383738373837383738573
qcla_adder_1036233238183162200162189162182162180162174162175162200162
qcla_com_7241862031329513695134951339513395131951319513695
qcla_mod_726382413292235312237310237296237293237293237292237312237
qft_454669--4567446744674467446744674567
rc_adder_614937771477147714771477147714771477147
tof_101910211970717871787178717871787178717871
tof_35182114151515151515151515151515151515
tof_47303522232423242324232423242324232423
tof_59424930313331333133313331333133313331
vbe_adder_310707050244624442439244024362436244624
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df = b.df(groups=['fast'], routines=['all'], funcs=['all'], atts=['Qubits','2Q Count','T Count'])" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
 Originalflow-opt-c0flow-opt-c1flow-opt-c2flow-opt-c3flow-opt-c4flow-opt-c5flow-opt-g0
 Qubitst_optt_optt_optt_optt_optt_optt_opt
Circuits        
Adder8230.440.651.495.1613.0530.530.28
QFT880.020.030.161.5217.2470.570.02
QFTAdd8160.140.180.794.9718.8447.900.12
adder_8240.571.034.2020.0772.87207.770.46
barenco_tof_10190.200.290.622.147.5921.570.18
barenco_tof_350.010.010.020.030.050.080.01
barenco_tof_470.020.030.060.180.651.920.02
barenco_tof_590.040.060.130.481.744.960.03
csla_mux_3_original150.030.040.050.100.290.730.03
csum_mux_9_corrected300.160.220.410.600.800.950.15
gf2^4_mult120.050.070.130.512.277.930.05
gf2^5_mult150.090.120.291.8210.3247.290.08
gf2^6_mult180.160.220.756.1742.76227.310.14
gf2^7_mult210.270.361.3613.59106.82686.690.23
gf2^8_mult240.470.622.7933.13309.612,343.700.40
grover_590.430.561.333.175.988.150.30
ham15-low170.200.463.2817.7854.04579.600.17
hwb670.060.130.300.922.043.900.09
mod5_450.010.020.030.050.080.160.01
mod_mult_5590.020.020.040.060.140.160.02
mod_red_21110.070.120.310.812.666.460.06
qcla_adder_10360.160.240.542.058.6011.860.17
qcla_com_7240.150.230.822.898.0117.260.13
qcla_mod_7260.460.703.2323.73223.861,463.860.36
qft_450.020.020.040.090.070.110.02
rc_adder_6140.040.060.110.260.390.470.04
tof_10190.060.080.170.461.001.400.07
tof_350.010.010.010.020.020.030.01
tof_470.010.010.020.080.080.110.02
tof_590.020.020.050.130.270.400.02
vbe_adder_3100.030.060.200.430.630.820.03
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df = b.df(groups=['fast'], routines=['all'], funcs=['all'], atts=['Qubits','t_opt'])" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "b.save('flow_opt_results')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "pyzx", + "language": "python", + "name": "pyzx" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/demos/Circuit Optimisation/flow_opt_results/circuit_groups.pkl b/demos/Circuit Optimisation/flow_opt_results/circuit_groups.pkl new file mode 100644 index 0000000000000000000000000000000000000000..92aa2a5c517f33ef42a79fd26b4db229aca6efdc GIT binary patch literal 413 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%0D|k2vgYzE!L}^GkdRxA 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 Rr@Q~X`*-i0zyIX({~yE+S`q*N literal 0 HcmV?d00001 diff --git a/demos/Circuit Optimisation/flow_opt_results/funcs.pkl b/demos/Circuit Optimisation/flow_opt_results/funcs.pkl new file mode 100644 index 0000000000000000000000000000000000000000..10607bcadd4e358f2b9b0150ebb18c5c39ff5dba GIT binary patch literal 1515 zcmbtU?@QZ27*1l{&RWezCO9RC457m8FRNYgizw`ab;49wza43sHkoNslk3!>;HTNi zfrH&xzYNM?GSGiv|3gzUItGRPDZ5l^TQ`uccjWGUpZ9&9dvmW0v)W|zU0oS%Eh%3t?DmqYp$o(yB)2Lb+gtg z=)^kKjeFya$34nJoy?B)f68dAOM&aX`z?lSU{)r0P<~4Li1tiD+K0LfOGd6_)0VLb z<~^v`g`AKR+IRq&FmFjkm0<4mK21Z4t`toRK}*S&WQE|7b_Ue79qI?XR)w+W(AEk? zf_Vt5K)IP zo2LcIFw70V7UEQa^8FJneDZ^vajY87JYZXqAdM~p&*j=T}x4r|4O z9mO&f9meDFNId*xJ{e8Kl8MDo@ql2^`T=?zQKwR1_41hc5g0jJJ6(Ibj@Qd<6Zjio zq7Ei1Q3r@F5NkkeVdHf$Ub*jpNf%7kz$C@a_*1^ZetA%}KR^7o{eA02nRh_i1?d_{ zH;4Im^QTMYrB9m;F;o{rUw0ib>Wa~ZxLg;P9dX4KS1MeEYYJlxVWuw3R3%3Ux^CIS_1MS}qWXgBqua&Q;Gg7ZKjc_H\n", + "
\n", "" @@ -362,7 +392,7 @@ { "data": { "text/html": [ - "
\n", + "
\n", "" @@ -705,6 +758,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "This results in exactly one non-Clifford gate per two-qubit gate.\n", + "\n", "These two circuits are equal as evidenced by equal matrices. Note that the way the matrices are calculated introduces some rounding errors (e.g. see the 0,0 element below)." ] }, diff --git a/demos/circuit_optimisation/benchmark/circuits.pkl b/demos/circuit_optimisation/benchmark/circuits.pkl deleted file mode 100644 index 981f54e1a05e4d68eab10bf3108fe1fedf28650f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1031888 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 diff --git a/demos/circuit_optimisation/benchmark/funcs.pkl b/demos/circuit_optimisation/benchmark/funcs.pkl deleted file mode 100644 index 7e02d3a0064c07a11d494f91a431002633929abb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1526 zcmb`HTWcFf6vua^k*$>!OSHCI*%(Zo6o|c+P^y$bh%IOzL}ii&3Qb^G?~XOw?9IEg zu~Tdify8kcs3B9TN7DyWupjzSRzl!D)SsYVqGzSZvYpW8p|iJhnHy(*|81jR{!U4Q zwkJwFyBS*6l243KCxT}T)3TOv{1&``b)RUA;LXs{ndv&>ttin1&yC``YmhirPbcJ( zd{=%di-z2g;7T@7BU%6JS7}!|8m@KieGLA|MQl%Ii3>+Mx@3=|yRsplCXOL@a*>y% zE8~*m-eU{KB~Q`SaYtyJA6wV=EAvpFwHU;I@3tqk<=X+!4c4<58*eWQX~h&aiI!dT27ir=b6a7MMD2LDd5Y3_aIl zrfmiUCgrjYPYWj0D`H>pZ`9|SuWq`QLHt0y^M$%?{7`Yqt)Qw0W#6vQExT22tvL1y zw3eejR!#54GvYhM!nJC(Qc-IwD_`EN)$UZ6y%&NOXrVD#|E?|lnO1(z{FFJ!@mzcL z98K&uUp5cRooc(;MT>p37@@^;C3~jK_muh0>hCj=GT&9yzM`Hf_j}6yuJWL-JZP_- zXN#Si-Rwd?yAYuTQJ2K6TTDC>I>sBJX))8mID@gR4GdanHskCbTs)7l<~T0XV)6ov zAr`zA8&E~d-Cly4EI|n4R zyoITe=wjC*f__3jg(+v~Ed6X>&>~L{`U72p-fP^bzkOc`XK1#EW)HWzsMtrv2o*sc zXK1>IrVk(fF%zNbE~@oWEkdb3o=o zuzGigC}m?1aCcAvIT`2$j36)}E(nZ1gAIbYAjJXZ!(gzuyMw+Y)QONF$V!2RQ4~z2 zz7O05s6k*xR1jD!gZdB>2dR6Y=En#_9bg1g0C7OJG*mnatS`;o!363;j36*4E(q*- zARd6Gg7h8GAc)I>I>oF3ECP#!?3>^a0Y(DM1s0pZZo*6jmP7@CQv%d{NDyQ$0CU|P z5(1$XS$>9?4^4(SFngn7pf0ol%Nt{)0z(7hg23es*dSOc$b!4z56psRU^`(!kORvg zQ8iEnc2FmxX9PndqJqF3=0ivj;#Lzf*`jJ>>yw&013~W2Nnmp lEzponS`77}BS-*LT0t^GZZ}js3SzIjgVP#_g3{DdJpio*?+yR} diff --git a/demos/CNOT-Benchmark.ipynb b/scratchpads/CNOT-Benchmark.ipynb similarity index 100% rename from demos/CNOT-Benchmark.ipynb rename to scratchpads/CNOT-Benchmark.ipynb diff --git a/demos/T-count Benchmark.ipynb b/scratchpads/T-count Benchmark.ipynb similarity index 100% rename from demos/T-count Benchmark.ipynb rename to scratchpads/T-count Benchmark.ipynb From a9cb318b49a3e364c94d232f6d3837ad4b1353fb Mon Sep 17 00:00:00 2001 From: Calum Holker Date: Wed, 7 Feb 2024 13:36:03 +0000 Subject: [PATCH 11/14] fixed unittest imports --- tests/test_extract.py | 1 + tests/test_simplify.py | 1 + 2 files changed, 2 insertions(+) diff --git a/tests/test_extract.py b/tests/test_extract.py index f41c170d..402e7a38 100644 --- a/tests/test_extract.py +++ b/tests/test_extract.py @@ -18,6 +18,7 @@ import unittest import random import sys +import os import json if __name__ == '__main__': sys.path.append('..') diff --git a/tests/test_simplify.py b/tests/test_simplify.py index b52cecd7..98e5b70e 100644 --- a/tests/test_simplify.py +++ b/tests/test_simplify.py @@ -35,6 +35,7 @@ from pyzx.generate import cliffordT from pyzx.simplify import * from pyzx.simplify import supplementarity_simp +from pyzx.extract import extract_simple SEED = 1337 From 28f1f724aedeeace087683bc49aa3cd479765915 Mon Sep 17 00:00:00 2001 From: Calum Holker Date: Thu, 22 Feb 2024 15:44:30 +0000 Subject: [PATCH 12/14] Class Poly phases as non-Clifford for phase teleportation --- pyzx/simplify.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pyzx/simplify.py b/pyzx/simplify.py index 6ed0d99d..394bd96a 100644 --- a/pyzx/simplify.py +++ b/pyzx/simplify.py @@ -30,6 +30,7 @@ from typing import List, Callable, Optional, Union, Generic, Tuple, Dict, Iterator, Any, cast, DefaultDict from collections import defaultdict +from .symbolic import Poly from .utils import EdgeType, VertexType, toggle_edge, vertex_is_zx, toggle_vertex from .rules import * @@ -244,7 +245,7 @@ def __init__(self, g: BaseGraph[VT,ET]) -> None: self.phase_mult: Dict[VT,int] = {} self.non_clifford_vertices: Set[VT] = set() for v in self.original_graph.vertices(): - if self.original_graph.phase(v).denominator > 2: + if self.original_graph.phase(v).denominator > 2 or isinstance(self.original_graph.phase(v), Poly): self.parent_vertex[v] = v self.vertex_rank[v] = 0 self.phase_mult[v] = 1 From 2493f2ecdc7b3b0fb8e4f8eb554e8fdaed43c455 Mon Sep 17 00:00:00 2001 From: Calum Holker Date: Thu, 22 Feb 2024 17:27:34 +0000 Subject: [PATCH 13/14] added vertex alignment in to_graph_like --- pyzx/simplify.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pyzx/simplify.py b/pyzx/simplify.py index 394bd96a..58874755 100644 --- a/pyzx/simplify.py +++ b/pyzx/simplify.py @@ -480,14 +480,14 @@ def to_graph_like(g: BaseGraph[VT,ET], assert_bound_connections: bool = True) -> for b in [v for v in g.vertices() if g.type(v) == VertexType.BOUNDARY]: for n in list(g.neighbors(b)): if g.edge_type(g.edge(b,n)) == EdgeType.HADAMARD: - z = g.add_vertex(VertexType.Z) + z = g.add_vertex(ty=VertexType.Z,row=0.5*g.row(n)+0.5*g.row(b),qubit=0.5*g.qubit(n)+0.5*g.qubit(b)) g.add_edge(g.edge(b,z), edgetype=EdgeType.SIMPLE) g.add_edge(g.edge(z,n), edgetype=EdgeType.HADAMARD) g.remove_edge(g.edge(b,n)) elif g.type(n) == VertexType.BOUNDARY: - z1 = g.add_vertex(VertexType.Z) - z2 = g.add_vertex(VertexType.Z) - z3 = g.add_vertex(VertexType.Z) + z1 = g.add_vertex(ty=VertexType.Z,row=0.25*g.row(n)+0.75*g.row(b),qubit=0.25*g.qubit(n)+0.75*g.qubit(b)) + z2 = g.add_vertex(ty=VertexType.Z,row=0.5*g.row(n)+0.5*g.row(b),qubit=0.5*g.qubit(n)+0.5*g.qubit(b)) + z3 = g.add_vertex(ty=VertexType.Z,row=0.75*g.row(n)+0.25*g.row(b),qubit=0.75*g.qubit(n)+0.25*g.qubit(b)) g.add_edge(g.edge(b,z1), edgetype=EdgeType.SIMPLE) g.add_edge(g.edge(z1,z2), edgetype=EdgeType.HADAMARD) g.add_edge(g.edge(z2,z3), edgetype=EdgeType.HADAMARD) @@ -498,8 +498,8 @@ def to_graph_like(g: BaseGraph[VT,ET], assert_bound_connections: bool = True) -> boundary_ns = [n for n in g.neighbors(v) if g.type(n)==VertexType.BOUNDARY] if len(boundary_ns) <= 1: continue for b in boundary_ns[:-1]: - z1 = g.add_vertex(VertexType.Z) - z2 = g.add_vertex(VertexType.Z) + z1 = g.add_vertex(ty=VertexType.Z,row=0.3*g.row(v)+0.7*g.row(b),qubit=0.3*g.qubit(v)+0.7*g.qubit(b)) + z2 = g.add_vertex(ty=VertexType.Z,row=0.7*g.row(v)+0.3*g.row(b),qubit=0.7*g.qubit(v)+0.3*g.qubit(b)) g.add_edge(g.edge(b,z1), edgetype=EdgeType.SIMPLE) g.add_edge(g.edge(z1,z2), edgetype=EdgeType.HADAMARD) g.add_edge(g.edge(z2,v), edgetype=EdgeType.HADAMARD) From 55ded336782c272010e7dad4d07ab86f7d23f41e Mon Sep 17 00:00:00 2001 From: Calum Holker Date: Thu, 22 Feb 2024 17:57:03 +0000 Subject: [PATCH 14/14] handle hboxes in to_graph_like as error --- pyzx/simplify.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pyzx/simplify.py b/pyzx/simplify.py index 58874755..df71d39e 100644 --- a/pyzx/simplify.py +++ b/pyzx/simplify.py @@ -471,7 +471,12 @@ def to_rg(g: BaseGraph[VT,ET], select: Optional[Callable[[VT], bool]] = None) -> def to_graph_like(g: BaseGraph[VT,ET], assert_bound_connections: bool = True) -> None: """Puts a ZX-diagram in graph-like form. + The graph should contain no hboxes, only hadamard edges. Convert arity-2 hboxes to hadamard edges using ``hsimplify.from_hypergraph_form(g)``. If ``assert_bound_connections`` is False, the conditions on inputs/output connections are not enforced.""" + + if any(g.type(v) == VertexType.H_BOX for v in g.vertices()): + raise ValueError("Graph contains hboxes. Try converting arity-2 hboxes to hadamard edges first by running hsimplify.from_hypergraph_form(g).") + to_gh(g) spider_simp(g, quiet=True) @@ -504,6 +509,8 @@ def to_graph_like(g: BaseGraph[VT,ET], assert_bound_connections: bool = True) -> g.add_edge(g.edge(z1,z2), edgetype=EdgeType.HADAMARD) g.add_edge(g.edge(z2,v), edgetype=EdgeType.HADAMARD) g.remove_edge(g.edge(b,v)) + + assert(is_graph_like(g)) def is_graph_like(g, assert_bound_connections: bool = True): """Returns True if a ZX-diagram is graph-like.