From b199e2105e411e3a80fcd3bcb915d3aab5cd0b88 Mon Sep 17 00:00:00 2001 From: jaunatisblue Date: Tue, 19 May 2026 17:19:36 +0800 Subject: [PATCH] final first commit --- .gitignore | 1 + .../.github/workflows/rules.yml | 32 ++ qibojit-benchmarks/LICENSE | 201 +++++++ qibojit-benchmarks/README.md | 210 +++++++ qibojit-benchmarks/benchmarks/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 155 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 177 bytes .../__pycache__/logger.cpython-312.pyc | Bin 0 -> 12656 bytes .../__pycache__/logger.cpython-313.pyc | Bin 0 -> 4825 bytes .../__pycache__/scripts.cpython-312.pyc | Bin 0 -> 19818 bytes .../__pycache__/scripts.cpython-313.pyc | Bin 0 -> 19939 bytes .../benchmarks/circuits/__init__.py | 53 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2091 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 2137 bytes .../circuits/__pycache__/qasm.cpython-312.pyc | Bin 0 -> 24621 bytes .../circuits/__pycache__/qasm.cpython-313.pyc | Bin 0 -> 25037 bytes .../benchmarks/circuits/qasm.py | 394 +++++++++++++ .../benchmarks/circuits/qibo.py | 218 +++++++ .../benchmarks/libraries/__init__.py | 74 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2554 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 2586 bytes .../__pycache__/abstract.cpython-312.pyc | Bin 0 -> 9009 bytes .../__pycache__/abstract.cpython-313.pyc | Bin 0 -> 9153 bytes .../__pycache__/qibo.cpython-312.pyc | Bin 0 -> 12273 bytes .../__pycache__/qibo.cpython-313.pyc | Bin 0 -> 12445 bytes .../benchmarks/libraries/abstract.py | 173 ++++++ .../benchmarks/libraries/cirq.py | 167 ++++++ .../benchmarks/libraries/hybridq.py | 142 +++++ .../benchmarks/libraries/projectq.py | 129 +++++ .../benchmarks/libraries/qcgpu.py | 85 +++ .../benchmarks/libraries/qibo.py | 295 ++++++++++ .../benchmarks/libraries/qiskit.py | 64 +++ .../benchmarks/libraries/qulacs.py | 85 +++ qibojit-benchmarks/benchmarks/logger.py | 237 ++++++++ qibojit-benchmarks/benchmarks/scripts.py | 530 ++++++++++++++++++ .../benchmarks/tests/__init__.py | 0 .../benchmarks/tests/conftest.py | 33 ++ .../benchmarks/tests/graphs/testgraph28.json | 1 + .../benchmarks/tests/graphs/testgraph8.json | 1 + .../benchmarks/tests/test_libraries.py | 165 ++++++ .../benchmarks/tests/test_qibo_benchmarks.py | 166 ++++++ .../benchmarks/tests/test_qibo_circuits.py | 112 ++++ qibojit-benchmarks/benchmarks/utils.py | 25 + qibojit-benchmarks/compare.py | 78 +++ .../cu_tensornet_expectation.json | 1 + .../cu_tensornet_mpi_expectation.json | 1 + .../cu_tensornet_nccl_expectation.json | 1 + qibojit-benchmarks/environment.yml | 18 + qibojit-benchmarks/evolution.py | 36 ++ .../graphs/generate_random_bitstrings.py | 14 + .../graphs/generate_random_graphs.py | 10 + .../graphs/random_bitstrings.dat | 28 + .../graphs/randomgraph_3_10.json | 1 + .../graphs/randomgraph_3_12.json | 1 + .../graphs/randomgraph_3_14.json | 1 + .../graphs/randomgraph_3_16.json | 1 + .../graphs/randomgraph_3_18.json | 1 + .../graphs/randomgraph_3_20.json | 1 + .../graphs/randomgraph_3_22.json | 1 + .../graphs/randomgraph_3_24.json | 1 + .../graphs/randomgraph_3_26.json | 1 + .../graphs/randomgraph_3_28.json | 1 + .../graphs/randomgraph_3_30.json | 1 + .../graphs/randomgraph_3_4.json | 1 + .../graphs/randomgraph_3_6.json | 1 + .../graphs/randomgraph_3_8.json | 1 + qibojit-benchmarks/main.py | 59 ++ qibojit-benchmarks/plot_pathfinding_metric.py | 480 ++++++++++++++++ qibojit-benchmarks/plot_result_quad.py | 135 +++++ qibojit-benchmarks/plots/__init__.py | 0 qibojit-benchmarks/plots/barplots.py | 249 ++++++++ qibojit-benchmarks/plots/devices.py | 44 ++ qibojit-benchmarks/plots/evolution.py | 101 ++++ qibojit-benchmarks/plots/fusion.py | 145 +++++ qibojit-benchmarks/plots/libraries.py | 73 +++ qibojit-benchmarks/plots/paper-plots.ipynb | 337 +++++++++++ qibojit-benchmarks/plots/scaling.py | 56 ++ qibojit-benchmarks/plots/utils.py | 36 ++ qibojit-benchmarks/scripts/README.md | 53 ++ .../scripts/cu_tensornet_expectation.json | 1 + .../scripts/cu_tensornet_mpi_expectation.json | 1 + .../cu_tensornet_nccl_expectation.json | 1 + qibojit-benchmarks/scripts/evolution_dense.sh | 33 ++ .../scripts/evolution_trotter.sh | 45 ++ qibojit-benchmarks/scripts/fusion.sh | 34 ++ .../scripts/libraries_double.sh | 24 + .../scripts/libraries_fusion.sh | 42 ++ .../scripts/libraries_single.sh | 24 + qibojit-benchmarks/scripts/multigpu.sh | 34 ++ qibojit-benchmarks/scripts/qibo.sh | 85 +++ qibojit-benchmarks/scripts/qibojit.sh | 23 + qibojit-benchmarks/scripts/qibotn.sh | 36 ++ qibojit-benchmarks/scripts/qibotn_local.sh | 56 ++ qibojit-benchmarks/scripts/quimb/README.md | 214 +++++++ .../scripts/quimb/dense_vector_dense.json | 1 + .../scripts/quimb/dense_vector_mps.json | 1 + .../scripts/quimb/expectation_dense.json | 1 + .../scripts/quimb/expectation_dense_auto.json | 6 + .../scripts/quimb/expectation_mps.json | 1 + .../scripts/quimb/quimb_local.sh | 215 +++++++ .../scripts/quimb_mpi/README.md | 167 ++++++ .../quimb_mpi/dense_vector_dense_mpi.json | 1 + .../quimb_mpi/dense_vector_mps_mpi.json | 1 + .../quimb_mpi/expectation_dense_mpi.json | 1 + .../quimb_mpi/expectation_mps_mpi.json | 1 + .../scripts/quimb_mpi/quimb_mpi.sh | 216 +++++++ qibotn | 1 + workload-qaoa/dense_vector_mps_mpi_qaoa.json | 1 + workload-qaoa/problem2.sh | 4 + workload-qft/dense_vector_mps_mpi_qft.json | 1 + workload-qft/problem1.sh | 4 + workload-qft/qft.dat | 1 + .../dense_vector_mps_mpi_supremacy.json | 1 + workload-supremacy/problem3.sh | 4 + 114 files changed, 6844 insertions(+) create mode 100644 .gitignore create mode 100644 qibojit-benchmarks/.github/workflows/rules.yml create mode 100644 qibojit-benchmarks/LICENSE create mode 100644 qibojit-benchmarks/README.md create mode 100644 qibojit-benchmarks/benchmarks/__init__.py create mode 100644 qibojit-benchmarks/benchmarks/__pycache__/__init__.cpython-312.pyc create mode 100644 qibojit-benchmarks/benchmarks/__pycache__/__init__.cpython-313.pyc create mode 100644 qibojit-benchmarks/benchmarks/__pycache__/logger.cpython-312.pyc create mode 100644 qibojit-benchmarks/benchmarks/__pycache__/logger.cpython-313.pyc create mode 100644 qibojit-benchmarks/benchmarks/__pycache__/scripts.cpython-312.pyc create mode 100644 qibojit-benchmarks/benchmarks/__pycache__/scripts.cpython-313.pyc create mode 100644 qibojit-benchmarks/benchmarks/circuits/__init__.py create mode 100644 qibojit-benchmarks/benchmarks/circuits/__pycache__/__init__.cpython-312.pyc create mode 100644 qibojit-benchmarks/benchmarks/circuits/__pycache__/__init__.cpython-313.pyc create mode 100644 qibojit-benchmarks/benchmarks/circuits/__pycache__/qasm.cpython-312.pyc create mode 100644 qibojit-benchmarks/benchmarks/circuits/__pycache__/qasm.cpython-313.pyc create mode 100644 qibojit-benchmarks/benchmarks/circuits/qasm.py create mode 100644 qibojit-benchmarks/benchmarks/circuits/qibo.py create mode 100644 qibojit-benchmarks/benchmarks/libraries/__init__.py create mode 100644 qibojit-benchmarks/benchmarks/libraries/__pycache__/__init__.cpython-312.pyc create mode 100644 qibojit-benchmarks/benchmarks/libraries/__pycache__/__init__.cpython-313.pyc create mode 100644 qibojit-benchmarks/benchmarks/libraries/__pycache__/abstract.cpython-312.pyc create mode 100644 qibojit-benchmarks/benchmarks/libraries/__pycache__/abstract.cpython-313.pyc create mode 100644 qibojit-benchmarks/benchmarks/libraries/__pycache__/qibo.cpython-312.pyc create mode 100644 qibojit-benchmarks/benchmarks/libraries/__pycache__/qibo.cpython-313.pyc create mode 100644 qibojit-benchmarks/benchmarks/libraries/abstract.py create mode 100644 qibojit-benchmarks/benchmarks/libraries/cirq.py create mode 100644 qibojit-benchmarks/benchmarks/libraries/hybridq.py create mode 100644 qibojit-benchmarks/benchmarks/libraries/projectq.py create mode 100644 qibojit-benchmarks/benchmarks/libraries/qcgpu.py create mode 100644 qibojit-benchmarks/benchmarks/libraries/qibo.py create mode 100644 qibojit-benchmarks/benchmarks/libraries/qiskit.py create mode 100644 qibojit-benchmarks/benchmarks/libraries/qulacs.py create mode 100644 qibojit-benchmarks/benchmarks/logger.py create mode 100644 qibojit-benchmarks/benchmarks/scripts.py create mode 100644 qibojit-benchmarks/benchmarks/tests/__init__.py create mode 100644 qibojit-benchmarks/benchmarks/tests/conftest.py create mode 100644 qibojit-benchmarks/benchmarks/tests/graphs/testgraph28.json create mode 100644 qibojit-benchmarks/benchmarks/tests/graphs/testgraph8.json create mode 100644 qibojit-benchmarks/benchmarks/tests/test_libraries.py create mode 100644 qibojit-benchmarks/benchmarks/tests/test_qibo_benchmarks.py create mode 100644 qibojit-benchmarks/benchmarks/tests/test_qibo_circuits.py create mode 100644 qibojit-benchmarks/benchmarks/utils.py create mode 100644 qibojit-benchmarks/compare.py create mode 100644 qibojit-benchmarks/cu_tensornet_expectation.json create mode 100644 qibojit-benchmarks/cu_tensornet_mpi_expectation.json create mode 100644 qibojit-benchmarks/cu_tensornet_nccl_expectation.json create mode 100644 qibojit-benchmarks/environment.yml create mode 100644 qibojit-benchmarks/evolution.py create mode 100644 qibojit-benchmarks/graphs/generate_random_bitstrings.py create mode 100644 qibojit-benchmarks/graphs/generate_random_graphs.py create mode 100644 qibojit-benchmarks/graphs/random_bitstrings.dat create mode 100644 qibojit-benchmarks/graphs/randomgraph_3_10.json create mode 100644 qibojit-benchmarks/graphs/randomgraph_3_12.json create mode 100644 qibojit-benchmarks/graphs/randomgraph_3_14.json create mode 100644 qibojit-benchmarks/graphs/randomgraph_3_16.json create mode 100644 qibojit-benchmarks/graphs/randomgraph_3_18.json create mode 100644 qibojit-benchmarks/graphs/randomgraph_3_20.json create mode 100644 qibojit-benchmarks/graphs/randomgraph_3_22.json create mode 100644 qibojit-benchmarks/graphs/randomgraph_3_24.json create mode 100644 qibojit-benchmarks/graphs/randomgraph_3_26.json create mode 100644 qibojit-benchmarks/graphs/randomgraph_3_28.json create mode 100644 qibojit-benchmarks/graphs/randomgraph_3_30.json create mode 100644 qibojit-benchmarks/graphs/randomgraph_3_4.json create mode 100644 qibojit-benchmarks/graphs/randomgraph_3_6.json create mode 100644 qibojit-benchmarks/graphs/randomgraph_3_8.json create mode 100644 qibojit-benchmarks/main.py create mode 100644 qibojit-benchmarks/plot_pathfinding_metric.py create mode 100644 qibojit-benchmarks/plot_result_quad.py create mode 100644 qibojit-benchmarks/plots/__init__.py create mode 100644 qibojit-benchmarks/plots/barplots.py create mode 100644 qibojit-benchmarks/plots/devices.py create mode 100644 qibojit-benchmarks/plots/evolution.py create mode 100644 qibojit-benchmarks/plots/fusion.py create mode 100644 qibojit-benchmarks/plots/libraries.py create mode 100644 qibojit-benchmarks/plots/paper-plots.ipynb create mode 100644 qibojit-benchmarks/plots/scaling.py create mode 100644 qibojit-benchmarks/plots/utils.py create mode 100644 qibojit-benchmarks/scripts/README.md create mode 100644 qibojit-benchmarks/scripts/cu_tensornet_expectation.json create mode 100644 qibojit-benchmarks/scripts/cu_tensornet_mpi_expectation.json create mode 100644 qibojit-benchmarks/scripts/cu_tensornet_nccl_expectation.json create mode 100755 qibojit-benchmarks/scripts/evolution_dense.sh create mode 100755 qibojit-benchmarks/scripts/evolution_trotter.sh create mode 100755 qibojit-benchmarks/scripts/fusion.sh create mode 100755 qibojit-benchmarks/scripts/libraries_double.sh create mode 100755 qibojit-benchmarks/scripts/libraries_fusion.sh create mode 100755 qibojit-benchmarks/scripts/libraries_single.sh create mode 100755 qibojit-benchmarks/scripts/multigpu.sh create mode 100755 qibojit-benchmarks/scripts/qibo.sh create mode 100755 qibojit-benchmarks/scripts/qibojit.sh create mode 100755 qibojit-benchmarks/scripts/qibotn.sh create mode 100755 qibojit-benchmarks/scripts/qibotn_local.sh create mode 100644 qibojit-benchmarks/scripts/quimb/README.md create mode 100644 qibojit-benchmarks/scripts/quimb/dense_vector_dense.json create mode 100644 qibojit-benchmarks/scripts/quimb/dense_vector_mps.json create mode 100644 qibojit-benchmarks/scripts/quimb/expectation_dense.json create mode 100644 qibojit-benchmarks/scripts/quimb/expectation_dense_auto.json create mode 100644 qibojit-benchmarks/scripts/quimb/expectation_mps.json create mode 100755 qibojit-benchmarks/scripts/quimb/quimb_local.sh create mode 100644 qibojit-benchmarks/scripts/quimb_mpi/README.md create mode 100644 qibojit-benchmarks/scripts/quimb_mpi/dense_vector_dense_mpi.json create mode 100644 qibojit-benchmarks/scripts/quimb_mpi/dense_vector_mps_mpi.json create mode 100644 qibojit-benchmarks/scripts/quimb_mpi/expectation_dense_mpi.json create mode 100644 qibojit-benchmarks/scripts/quimb_mpi/expectation_mps_mpi.json create mode 100755 qibojit-benchmarks/scripts/quimb_mpi/quimb_mpi.sh create mode 160000 qibotn create mode 100644 workload-qaoa/dense_vector_mps_mpi_qaoa.json create mode 100755 workload-qaoa/problem2.sh create mode 100644 workload-qft/dense_vector_mps_mpi_qft.json create mode 100755 workload-qft/problem1.sh create mode 100644 workload-qft/qft.dat create mode 100644 workload-supremacy/dense_vector_mps_mpi_supremacy.json create mode 100755 workload-supremacy/problem3.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8d9a737 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +final/ diff --git a/qibojit-benchmarks/.github/workflows/rules.yml b/qibojit-benchmarks/.github/workflows/rules.yml new file mode 100644 index 0000000..bbe09a1 --- /dev/null +++ b/qibojit-benchmarks/.github/workflows/rules.yml @@ -0,0 +1,32 @@ +# A single CI script with github workflow +name: Tests + +on: [push] + +jobs: + build: + strategy: + matrix: + os: [ubuntu-latest] + python-version: [3.9] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Install package + run: | + python -m pip install --upgrade pip + pip install pytest + pip install qiskit openfermion qulacs hybridq + pip install tensorflow==2.7.0 + pip install tensorflow_quantum + pip install projectq + pip install qsimcirq + pip install git+https://github.com/qiboteam/qibo + pip install git+https://github.com/qiboteam/qibojit + - name: Test + run: | + pytest diff --git a/qibojit-benchmarks/LICENSE b/qibojit-benchmarks/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/qibojit-benchmarks/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/qibojit-benchmarks/README.md b/qibojit-benchmarks/README.md new file mode 100644 index 0000000..62a61e1 --- /dev/null +++ b/qibojit-benchmarks/README.md @@ -0,0 +1,210 @@ +# Benchmarking quantum simulation + +This repository contains benchmark scripts for quantum circuit simulation using +[Qibo](https://github.com/qiboteam/qibo) and multiple simulation engines. + +## Installing prerequisites + +In order to run the benchmarks, you need to install the required libraries. + +In order to set up an environment with most of the libraries available in this repository, +you can set up a **conda** environment: + ``` + conda env create -f environment.yml + ``` +This recipe doesn't include the installation of CUDA Toolkit, CuPy, cuQuantum nor HybridQ, Qulacs-GPU, qsim GPU and TensorFlow Quantum. + +## Supported simulation backends + +- [qibojit](https://github.com/qiboteam/qibojit): uses numba on CPU and cupy/cuquantum on GPU for custom operations. +- [qibotf](https://github.com/qiboteam/qibotf): uses tf primitives with custom operators on CPU and GPU. +- [tensorflow](https://www.tensorflow.org/): uses tf default primitives. +- [numpy](https://numpy.org/): single-threaded CPU implementation. + +For more details check the documentation [here](https://qibo.readthedocs.io/en/latest/installation.html). + +## Running the benchmarks + +The script in `benchmarks/main.py` executes the benchmark code following the supported configuration flags (check `python main.py -h`): + +``` +$ python main.py -h + +usage: main.py [-h] [--nqubits NQUBITS] [--backend BACKEND] + [--platform PLATFORM] [--circuit CIRCUIT] + [--circuit-options CIRCUIT_OPTIONS] [--nreps NREPS] + [--nshots NSHOTS] [--transfer] [--precision PRECISION] + [--memory MEMORY] [--threading THREADING] [--filename FILENAME] + +optional arguments: + -h, --help show this help message and exit + --nqubits NQUBITS Number of qubits in the circuit. + --backend BACKEND Qibo backend to use for simulation. + --platform PLATFORM Qibo platform to use for simulation. + --circuit CIRCUIT Type of circuit to use. See README for the list of + available circuits. + --circuit-options CIRCUIT_OPTIONS + String with options for circuit creation. It should + have the form 'arg1=value1,arg2=value2,...'. See + README for the list of arguments that are available + for each circuit. + --nreps NREPS Number of repetitions of the circuit execution. Dry + run is not included. + --nshots NSHOTS Number of measurement shots. If used the time required + to measure frequencies (no samples) is measured and + logged. If it is ``None`` no measurements are + performed. + --transfer If used the final state array is converted to numpy. + If the simulation device is GPU this requires a + transfer from GPU memory to CPU. + --precision PRECISION + Numerical precision of the simulation. Choose between + 'double' and 'single'. + --memory MEMORY Limit the GPU memory usage when using Tensorflow based + backends. The memory limit should be given in MB. + Tensorflow reserves the full available memory by + default. + --threading THREADING + Switches the numba threading layer when using the + qibojit backend on CPU. See + https://numba.pydata.org/numba- + doc/latest/user/threading-layer.html#selecting-a- + named-threading-layer for a list of available + threading layers. + --filename FILENAME Directory of file to save the logs in json format. If + not given the logs will only be printed and not saved. +``` + +Before executing the code keep in mind the following: +- GPUs are the default devices for qibojit and qibotf. If you need CPU performance numbers do `export CUDA_VISIBLES_DEVICE=""` before executing the benchmark script. +- CPU simulations by default use physical cores as number of threads with qibojit and qibotf. To control this behaviour without touching the code do `export OMP_NUM_THREADS=` (or `export NUMBA_NUM_THREADS=` for qibojit numba backend) before executing the benchmark script. +- The benchmark script provides several options, including the possibility to modify the default numba threading pooling technology, (see [docs](https://numba.pydata.org/numba-doc/latest/developer/threading_implementation.html#notes-on-numba-s-threading-implementation)) or limiting the GPU memory used be Tensorflow. See `python main.py -h` for more details. + +The `scripts/` folder contains example bash scripts that execute circuit benchmarks for different numbers of qubits. We refer to the README inside this folder for more details. + +#### Comparing simulation libraries + +In addition to the above `main.py` benchmark, we provide the `compare.py` benchmark for comparing the performance of different simulation libraries. +The usage is similar to `main.py` with the `--backend` flag replaced by the `--library` flag which can be used to select one of the available quantum simulation libraries +(check `python compare.py -h`). + +``` +$ python compare.py -h + +usage: compare.py [-h] [--nqubits NQUBITS] [--library LIBRARY] [--library-options LIBRARY_OPTIONS] [--circuit CIRCUIT] [--circuit-options CIRCUIT_OPTIONS] [--precision PRECISION] [--nreps NREPS] + [--filename FILENAME] + +optional arguments: + -h, --help show this help message and exit + --nqubits NQUBITS Number of qubits in the circuit. + --library LIBRARY Quantum simulation library to use in benchmark. See README for the list of available libraries. + --library-options LIBRARY_OPTIONS + String with options for the library. It should have the form 'arg1=value1,arg2=value2,...'. Each library supports different options. + --circuit CIRCUIT Type of circuit to use. See README for the list of available circuits. + --circuit-options CIRCUIT_OPTIONS + String with options for circuit creation. It should have the form 'arg1=value1,arg2=value2,...'. See README for the list of arguments that are available for each circuit. + --precision PRECISION + Numerical precision of the simulation. Choose between 'double' and 'single'. + --nreps NREPS Number of repetitions of the circuit execution. Dry run is not included. + --filename FILENAME Directory of file to save the logs in json format. If not given the logs will only be printed and not saved. + +``` + +Currently the available libraries (defined under `benchmarks/libraries`) are: + - [Qiskit](https://qiskit.org/), defined as ``qiskit`` and ``qiskit-gpu`` in the ``library`` option of ``compare.py``. + - [Qulacs](https://github.com/qulacs/qulacs), defined as ``qulacs`` and ``qulacs-gpu``. + - [Cirq](https://quantumai.google/cirq), defined as ``cirq``. + - [TensorFlow Quantum](https://www.tensorflow.org/quantum), defined as ``tfq``. + - [Qsim](https://quantumai.google/qsim), defined as ``qsim``, ``qsim-gpu`` and ``qsim-cuquantum``. + - [HybridQ](https://github.com/nasa/hybridq), defined as ``hybridq`` and ``hybridq-gpu``. + - [ProjectQ](https://projectq.ch/), defined as ``projectq``. + - [QCGPU](https://qcgpu.github.io/), defined as ``qcgpu``. + - [Qibo](https://qibo.science/), defined as ``qibo``. + +All the circuits described below are available for both `main.py` and `compare.py`. + +## Benchmark output + +The benchmark script prints a summary of the circuit and user selected flags together with: +- import_time: time required to import the `qibo` library and build the selected backend in seconds. +- creation_time: time required to prepare the circuit for execution in seconds. +- dry_run_execution_time: first execution performance, includes JIT timings in seconds. +- dry_run_transfer_time: time required to convert the final state to numpy array in seconds. +- simulation_times: list of timings for simulation based on `nreps` in seconds. +- transfer_times: list of timings for conversion to numpy array in seconds. +- simulation_times_mean: average simulation time for `nreps` repetitions in seconds. +- simulation_times_std: standard deviation of simulation_time in seconds. +- transfer_times_mean: average transfer time for `nreps` repetitions in seconds. +- transfer_time_std: standard deviation of transfer_times in seconds. +- measurement_time: time required to sample frequencies for `nshots` measurement shots in seconds (relevant only if the `--nshots` argument is given). + +Note that if a GPU is used for simulation then transfer times measure the time required to copy the final state from the GPU memory to CPU. + +If `--filename` is given the above logs are saved in json format in the given directory. + +## Implemented circuits + +Here is a list of the available circuits for benchmarks. As described above the circuit should be selected using the `--circuit` flag and one of the following circuit names. Additional options can be passed using the `--options` flag. The options supported by each circuit are analyzed below. Note that some circuits require additional Python libraries to work as stated below. + +- `one-qubit-gate`: circuit consisting of a single one qubit gate. The gate is applied to every qubit in the circuit. Available options: + - `gate`: String defining the one qubit gate to be benchmarked (eg. "H"). Default is "H" + - `nlayers`: Number of times that the gate is applied to each qubit. Default is 1. + - additional parameters (eg. `theta`, etc.) required for parametrized gates. +- `two-qubit-gate`: circuit consisting of a single two qubit gate. The gate is applied to every pair of adjacent qubits in the circuit (assuming one dimensional topology). + - `gate`: String defining the one qubit gate to be benchmarked. Default is CNOT. + - `nlayers`: Number of times that the gate is applied to each qubit. Default is 1. + - additional parameters (eg. `theta`, etc.) required for parametrized gates. +- `qft`: [quantum fourier transform](https://en.wikipedia.org/wiki/Quantum_Fourier_transform) + - `swaps`: Boolean controling if swaps are applied after the main QFT circuit. Default is True. +- `variational`: variational quantum circuit consisting a layer of RY rotations followed be a layer of CZ entangling gates. Can be created using either standard qibot gates or the optimized [VariationalLayer](https://qibo.readthedocs.io/en/latest/qibo.html#variational-layer) gate. + - `nlayers`: Number of times that the gate is applied to each qubit. + - `varlayer`: Boolean controling whether the VariationalLayer or standard gates are used. Default is False. +- `bernstein-vazirani` (`bv`): circuit that applies the [Bernstein-Vazirani algorithm](https://qiskit.org/textbook/ch-algorithms/bernstein-vazirani.html#example) based on the related [OpenQASM example](https://github.com/Qiskit/openqasm/tree/0af8b8489f32d46692b3a3a1421e98c611cd86cc/benchmarks/bv). +- `hidden-shift` (`hs`): circuit that solves the [Hidden shift problem](https://en.wikipedia.org/wiki/Hidden_shift_problem), based on the [Cirq implementation](https://github.com/quantumlib/Cirq/blob/master/examples/hidden_shift_algorithm.py). + - `shift`: The hidden bitstring for which the two oracle functions in the hidden shift problem differ. If not given this bitstring will be generated randomly using `np.random.randint`. +- `qaoa`: Example implementation of the [Quantum Approximate Optization Algorithm (QAOA)](https://arxiv.org/abs/1411.4028) for solving the MaxCut problem. Follows the [Cirq example](https://github.com/quantumlib/Cirq/blob/master/examples/qaoa.py). Requirements: [networkx](https://networkx.org/). + - `nparams`: Number of variational parameters. + - `graph`: Name of json file to load the problem graph structure. The graph will be loaded using `networkx.readwrite.json_graph.node_link_graph`. If not given the graph will be generated randomly using `networkx.random_regular_graph`. +- `qasm`: Creates benchmark circuit using [OpenQASM](https://github.com/Qiskit/openqasm) code. + - `qasm`: OpenQASM code that generates the circuit as a Python string. +- `supremacy`: Random circuit [proposed for demonstrating quantum supremacy](https://arxiv.org/abs/1807.10749). Based on Cirq's [`generate_boixo_2018_supremacy_circuits_v2`](https://github.com/quantumlib/Cirq/blob/v0.11.0/cirq-core/cirq/experiments/google_v2_supremacy_circuit.py) method. *Requirements: [Cirq](https://quantumai.google/cirq).* + - `depth`: Number of layers with CZ gates. + - `seed`: Seed for random circuit instance generator. +- `basis-change` (`bc`): Basis transformations that implement exact evolution under a random one-body fermionic Hamiltonian. See [OpenFermion's tutorial](https://quantumai.google/openfermion/tutorials/circuits_1_basis_change) for more details. *Requirements: [Cirq](https://quantumai.google/cirq), [OpenFermion](https://github.com/quantumlib/OpenFermion).* + - `simulation_time`: Evolution time. + - `seed`: Seed to use for the random Hamiltonian generation. +- `quantum-volume` (`qv`): [Quantum volume](https://qiskit.org/documentation/stubs/qiskit.circuit.library.QuantumVolume.html) circuit model from Qiskit. *Requirements: [Qiskit](https://qiskit.org/).* + - `depth`: Layers of SU(4) operations in circuit. + - `seed`: Seed for random gate generator. + +## QiboTN + +Command to call QiboTN calculation. + +### Single Node +```bash +python compare.py --circuit qft --nqubits 4 --filename test.dat --library-options backend=qibotn,platform=cutensornet --nreps 5 --precision complex128 +``` +where precision is 'complex128', 'complex64','float64', 'float32' + +Another example for the case with runcard input and output expectation. Note that user will need to store the runcard settings as json file. +```bash +python compare.py --circuit variational --circuit-options nlayers=3 --nqubits 4 --filename test.dat --library-options backend=qibotn,platform=cutensornet,computation_settings=cu_tensornet_expectation.json --nreps 5 --precision complex128 +``` + +Instructions for Qibojit expectation +```bash +python compare.py --circuit variational --circuit-options nlayers=3 --nqubits 4 --filename test.dat --library-options backend=qibojit,platform=numba,expectation="XXXZ" --nreps 5 --precision complex128 +``` + +Instructions for Qibojit no expectation +```bash +python compare.py --circuit variational --circuit-options nlayers=3 --nqubits 4 --filename test.dat --library-options backend=qibojit,platform=numba --nreps 5 --precision complex128 +``` + +### Multi Node + +In Docker environment, need to add `--allow-run-as-root` +```bash +mpirun --allow-run-as-root -np 2 python compare.py --circuit variational --circuit-options nlayers=3 --nqubits 4 --filename test.dat --library-options backend=qibotn,platform=cutensornet,computation_settings=cu_tensornet_expectation.json --nreps 1 --precision complex128 +``` \ No newline at end of file diff --git a/qibojit-benchmarks/benchmarks/__init__.py b/qibojit-benchmarks/benchmarks/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/qibojit-benchmarks/benchmarks/__pycache__/__init__.cpython-312.pyc b/qibojit-benchmarks/benchmarks/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9181cb74d2f52ea74cc4e7b400865c49051da296 GIT binary patch literal 155 zcmX@j%ge<81bb?^vOx4>5P=Rpvj9b=GgLBYGWxA#C}INgK7-W!veM7U&rQ`Y%uLGH zPs_|p%mFjAGD~!mQuC5CaubWPi}jJ1@$s2?nI-Y@dIgoYIBatBQ%ZAE?TT1|Mlk|$ QF^KVznURsPh#ANN0A+V2n*aa+ literal 0 HcmV?d00001 diff --git a/qibojit-benchmarks/benchmarks/__pycache__/__init__.cpython-313.pyc b/qibojit-benchmarks/benchmarks/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c5c53b4b09801b9240908b0630cadb15d871e2e0 GIT binary patch literal 177 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 Je}$p)zXBX9k){9u literal 0 HcmV?d00001 diff --git a/qibojit-benchmarks/benchmarks/__pycache__/logger.cpython-313.pyc b/qibojit-benchmarks/benchmarks/__pycache__/logger.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f3cfaffbe73bb2e947f787f3f17c41f702471dc8 GIT binary patch literal 4825 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 literal 0 HcmV?d00001 diff --git a/qibojit-benchmarks/benchmarks/__pycache__/scripts.cpython-312.pyc b/qibojit-benchmarks/benchmarks/__pycache__/scripts.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a0b1bded02e788aa23cadd2878441f2f5e360a1 GIT binary patch literal 19818 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 literal 0 HcmV?d00001 diff --git a/qibojit-benchmarks/benchmarks/circuits/__init__.py b/qibojit-benchmarks/benchmarks/circuits/__init__.py new file mode 100644 index 0000000..c8303c8 --- /dev/null +++ b/qibojit-benchmarks/benchmarks/circuits/__init__.py @@ -0,0 +1,53 @@ +def parse(options): + """Parse options from string. + + Args: + options (str): String with options. + It should have the form 'arg1=value1,arg2=value2,...'. + + Returns: + dict: {'arg1': value1, 'arg2': value2, ...} + + """ + kwargs = {} + if options is not None: + for parameter in options.split(","): + if "=" in parameter: + k, v = parameter.split("=") + kwargs[k] = v + else: + raise ValueError(f"Cannot parse parameter {parameter}.") + return kwargs + + +def get(circuit_name, nqubits, options=None, qibo=False): + if qibo: + from benchmarks.circuits import qibo as module + else: + from benchmarks.circuits import qasm as module + + if circuit_name in ("qft", "QFT"): + circuit = module.QFT + elif circuit_name == "one-qubit-gate": + circuit = module.OneQubitGate + elif circuit_name == "two-qubit-gate": + circuit = module.TwoQubitGate + elif circuit_name in ("variational", "variational-circuit"): + circuit = module.VariationalCircuit + elif circuit_name in ("bernstein-vazirani", "bv"): + circuit = module.BernsteinVazirani + elif circuit_name in ("hidden-shift", "hs"): + circuit = module.HiddenShift + elif circuit_name == "qaoa": + circuit = module.QAOA + elif circuit_name == "supremacy": + circuit = module.SupremacyCircuit + elif circuit_name in ("basis-change", "bc"): + circuit = module.BasisChange + elif circuit_name in ("quantum-volume", "qv"): + circuit = module.QuantumVolume + else: + raise NotImplementedError(f"Cannot find circuit {circuit_name}.") + + kwargs = parse(options) + return circuit(nqubits, **kwargs) diff --git a/qibojit-benchmarks/benchmarks/circuits/__pycache__/__init__.cpython-312.pyc b/qibojit-benchmarks/benchmarks/circuits/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..02662d93da21753994241d0b4b76aec9ef7e9954 GIT binary patch literal 2091 zcmaKt&2QX96u@V^AI@e!5}Y<^+J?H2v~{x|N~9KuTB&PWNI^HzHKc?T?k2v5uVX2k#{mjo@J1o{ z+r0zBCelz1JLuy}4q9rbV2z4`zw@ncp!c%~)i{N7xC$bN9qze27x3>vRJBko?1UZc zgwDZUpB=a9xlELh!+nXA@K>RL{{)ATgJ+Qxss8!4Oe|G2S8UBREU`dLU9@bX8H?G@ zP7&lHS+vI3jA{XQ3K(fjoMoiArrE_{DZ9r~zD=fV(JGqdk|Gx6iYnSgRVJ0abCn)DQULXIY)zelMs_g5s&wC_M*#c5T515 z_S`(Y?BR+Pfoo=oJ{ivyOKc8K>?nPK|Bn7+Ddaz^|*3nKcN_DSKH2GA6KiupWzaF?ZaNqj5fB4o^vrDLJ zZr8D9pSXEr1&7%YLXnplgY`a%%ygat`+Sc%cna1(Uk9sE?-IF_U zbU3|}KnY>}tz9?-P3Ob(;|ooT74MG_#wKz?gjcY_m5`2WVT_C@Xd%!zsyR?#P^w8M zyhMwBpVT78_drCJPoWmmu@3+hm@j~d?lG(hpXGqL1q|<>lz4WPYCx<3(cu&H688xZ z1t4NR(Y0F&@f>U}OD0+IBIL(e6;>?46) zNjV5wxvRaE?SWv`*?SObQ4To~2N$r0oai_BbK30P(|=J?!d{pbDErEm4s{<|E!bXY zX5wl!Wg2Q`wY&foyC~agHD#}vZ91^=icB<_z7}$++S8_F{9=~4s<5C!x7w;^WGZr1 zBeJ1++(HFb5=Bi>R3l>*H8_$hS`dqD%3jPWuMkz2^Vcb~AX}Q1$roi~Q3c05*ix%y z*|5ucrec=LI#^dL)dPMrL#HXCf4WF$*-Bkr&(k)`25m;@4@r9Ha1aJBam7$)XtI|f zS1)mO&3vi}b5HXeZ?&oS!lfXuxgf3hBui+PBxhQg z%(W8fnKtbyeWj%8s$r`Ndv#dvOT3rx1D`kGneupp{V*1x&BIdhqPnS+OR(gFBnC?s z4}<^kk|fPDw5Zx74YNMF`~-$|^q7zT+Hv-ejX>)j^ z<#_kV!`L8WBv+99z5eUh=pS)oBaA!Y3MX#!+o|J?!B@AAZlxZ`jh7}LrKTDkQ`rBxtWP|S!^Djb-7Ub-2oI4iNMGWnCnSztGrN~>5i_@LtK(ejR$nLZPq_62Q=gp> R#`tfp2MhnCU&JSv!@r|lAJPB- literal 0 HcmV?d00001 diff --git a/qibojit-benchmarks/benchmarks/circuits/__pycache__/__init__.cpython-313.pyc b/qibojit-benchmarks/benchmarks/circuits/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..540d58b2fdc4b4002bf0ed175ecd92bbf2eff068 GIT binary patch literal 2137 zcmaKs&2Jk;6u@WKU-3trux^tkZRj>6O}Ft!6Pf^lQl%|v0%}6)I;s>ww6-_)HukJD zyLMC~Xt+^vNd#5HiQW+ZLBy&50k$lGnL~v{IUsQ;L|hOD-i&wKZK!yXXXnlPy_tFA z_ufHwcL;&RmjBVIAE95E;)rNZ4vxU&9!jG@L{Qq376;KSfd~ab@#X{vhA;Rd5Bv`H zV7Q0QAuME2_6kB7bluH?l}TEdvR7khK7|k#(_%(^6D;Zg_=qp`5gnf@+^%x|=4{3@ z1|HXj5n5$ub4hzLVicvluX-F>6T(PF8DRt|zWVp?tHjh~qhjd>Hsy659DH4~ss!6-=k=U5BY(tw#%5&Oi|;Y%=#z07Tt5zls1T>Z zg?j&G6=TDaD?B^HlZltiDH*n#0N;Pwn)17f`UB_xEwW()~Te_9VYB*Oc zt7O9jx2MybPI6V7s1DUa^sbm{Wtc< zA1*geU2XNvH+tv)2&2LHlL(4P+t&`@0JNC%vX3n+RGz-S!xiqKjOUDPPy;Mk)8c#R zT>*P#wB!fP1DeRR3?v#)+HOc%?{!uLhXnhUz5~iPa}!d#Lvp!_b1m*(>% zP+tNSaGe-=o?seKp90n8qS(_O5}+_pK^N6~2muwSRiHwydr2>(=79>kDAqL&3G6im zRK#^+-ysB4poW3!c2UP(NcF59ch=L<41$vHahLq+kYmj}Z5!C1@eM;GI4_(-8UGbw znze-9#orjI2-M4Rmw#2W3{~UVT(_uadG1C%YG5s~SiN8e6J}9|BgLW#cTo+M2F+@P zXk|5bn?YIC)XhY$sN#YKjyYJ1ZdO%nRm+K*QL2_n)|OeYS0Pp!xv^zD)1;MWabE5eGkxij6W59pR(PHVl;-hx zmuHt|X>Zzz#qkSYVgX(5#M8apiDab{NNmxt7Rr^9R@Shk<$2HI9YP7vh<))j3{8#( zF#lsr!pe$=Lj7eUUoC;j21yW1CKPg~o5?bPLPXS4&@2*%SwA!X4Z}8i6bL`+n*OzG z`sYAw=aW`ov@IRGe|Gom-9S5dv@xKxf(oqsD2+Cy(f?Vy*a}|c+;~$Ox4EfSaEh;; zZA#95sa7z>*G8Js243lPfbZ;GohIf?oK=_KdIH!pG qnfbeXi}-TqwYuKwyz1K|2`F#W%;$+m5QIO)m>~TXe_1%q9sUJ1uMkoI literal 0 HcmV?d00001 diff --git a/qibojit-benchmarks/benchmarks/circuits/__pycache__/qasm.cpython-312.pyc b/qibojit-benchmarks/benchmarks/circuits/__pycache__/qasm.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c029dc2ea1216b4cdb5287aec5442527f05a4ec1 GIT binary patch literal 24621 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