uniqc-cppsimulator 1.0.0__tar.gz → 1.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- uniqc_cppsimulator-1.1.0/.github/workflows/docs-pages.yml +83 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/.gitignore +10 -0
- uniqc_cppsimulator-1.1.0/CHANGELOG.md +45 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/CMakeLists.txt +1 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/PKG-INFO +81 -4
- uniqc_cppsimulator-1.1.0/README.md +150 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Pybinder/uniqc_cpp.cpp +10 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/src/CMakeLists.txt +4 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/src/density_operator_simulator.cpp +1 -0
- uniqc_cppsimulator-1.1.0/UniqcCpp/src/qopcode.cpp +5 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/src/simulator.cpp +30 -16
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/src/simulator_common.cpp +38 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/src/simulator_common.h +8 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/src/simulator_density_op_impl.cpp +146 -134
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/src/simulator_statevector_impl.cpp +396 -296
- uniqc_cppsimulator-1.1.0/UniqcCpp/src/threading.cpp +65 -0
- uniqc_cppsimulator-1.1.0/UniqcCpp/src/threading.h +76 -0
- uniqc_cppsimulator-1.1.0/UniqcCpp/src/threading_control.h +37 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/test/main.cpp +41 -0
- uniqc_cppsimulator-1.1.0/benchmark/README.md +76 -0
- uniqc_cppsimulator-1.1.0/benchmark/__init__.py +9 -0
- uniqc_cppsimulator-1.1.0/benchmark/__main__.py +3 -0
- uniqc_cppsimulator-1.1.0/benchmark/backends/__init__.py +19 -0
- uniqc_cppsimulator-1.1.0/benchmark/backends/aer.py +119 -0
- uniqc_cppsimulator-1.1.0/benchmark/backends/base.py +80 -0
- uniqc_cppsimulator-1.1.0/benchmark/backends/braket_sim.py +66 -0
- uniqc_cppsimulator-1.1.0/benchmark/backends/cirq_sim.py +116 -0
- uniqc_cppsimulator-1.1.0/benchmark/backends/lightning_sim.py +62 -0
- uniqc_cppsimulator-1.1.0/benchmark/backends/pyqrack_sim.py +54 -0
- uniqc_cppsimulator-1.1.0/benchmark/backends/qibo_sim.py +51 -0
- uniqc_cppsimulator-1.1.0/benchmark/backends/qsimcirq_sim.py +34 -0
- uniqc_cppsimulator-1.1.0/benchmark/backends/quimb_sim.py +33 -0
- uniqc_cppsimulator-1.1.0/benchmark/backends/qulacs_sim.py +109 -0
- uniqc_cppsimulator-1.1.0/benchmark/backends/qutip_sim.py +59 -0
- uniqc_cppsimulator-1.1.0/benchmark/backends/uniqc_dm.py +38 -0
- uniqc_cppsimulator-1.1.0/benchmark/backends/uniqc_sv.py +158 -0
- uniqc_cppsimulator-1.1.0/benchmark/backends/util.py +27 -0
- uniqc_cppsimulator-1.1.0/benchmark/circuits.py +78 -0
- uniqc_cppsimulator-1.1.0/benchmark/cli.py +120 -0
- uniqc_cppsimulator-1.1.0/benchmark/ir.py +136 -0
- uniqc_cppsimulator-1.1.0/benchmark/noise.py +12 -0
- uniqc_cppsimulator-1.1.0/benchmark/plotting.py +254 -0
- uniqc_cppsimulator-1.1.0/benchmark/presets.py +135 -0
- uniqc_cppsimulator-1.1.0/benchmark/registry.py +46 -0
- uniqc_cppsimulator-1.1.0/benchmark/report.py +222 -0
- uniqc_cppsimulator-1.1.0/benchmark/runner.py +268 -0
- uniqc_cppsimulator-1.1.0/benchmark/worker.py +203 -0
- uniqc_cppsimulator-1.1.0/doc/benchmark/README_summary.md +17 -0
- uniqc_cppsimulator-1.1.0/doc/benchmark/ideal_runtime_vs_qubits.png +0 -0
- uniqc_cppsimulator-1.1.0/doc/benchmark/noise_runtime_vs_qubits.png +0 -0
- uniqc_cppsimulator-1.1.0/doc/benchmark/results-2026-09-20.json +14319 -0
- uniqc_cppsimulator-1.1.0/doc/benchmark/results-2026-09-22.json +15815 -0
- uniqc_cppsimulator-1.1.0/doc/benchmark/sampling_throughput.png +0 -0
- uniqc_cppsimulator-1.1.0/doc/benchmark/thread_speedup.png +0 -0
- uniqc_cppsimulator-1.1.0/doc/benchmark.md +141 -0
- uniqc_cppsimulator-1.1.0/docs/Makefile +19 -0
- uniqc_cppsimulator-1.1.0/docs/api_benchmark.rst +88 -0
- uniqc_cppsimulator-1.1.0/docs/api_uniqc_cpp.rst +65 -0
- uniqc_cppsimulator-1.1.0/docs/benchmark.rst +88 -0
- uniqc_cppsimulator-1.1.0/docs/conf.py +64 -0
- uniqc_cppsimulator-1.1.0/docs/index.rst +61 -0
- uniqc_cppsimulator-1.1.0/docs/prepare.py +138 -0
- uniqc_cppsimulator-1.1.0/docs/requirements.txt +8 -0
- uniqc_cppsimulator-1.1.0/docs/usage.rst +117 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/pyproject.toml +6 -0
- uniqc_cppsimulator-1.1.0/tests/test_benchmark.py +69 -0
- uniqc_cppsimulator-1.1.0/tests/test_bindings.py +434 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/uniqc_cpp.pyi +14 -1
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/uniqc_cppsimulator.egg-info/PKG-INFO +81 -4
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/uniqc_cppsimulator.egg-info/SOURCES.txt +50 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/uniqc_cppsimulator.egg-info/scm_file_list.json +50 -0
- uniqc_cppsimulator-1.1.0/uniqc_cppsimulator.egg-info/scm_version.json +8 -0
- uniqc_cppsimulator-1.0.0/CHANGELOG.md +0 -16
- uniqc_cppsimulator-1.0.0/README.md +0 -73
- uniqc_cppsimulator-1.0.0/UniqcCpp/src/qopcode.cpp +0 -108
- uniqc_cppsimulator-1.0.0/tests/test_bindings.py +0 -141
- uniqc_cppsimulator-1.0.0/uniqc_cppsimulator.egg-info/scm_version.json +0 -8
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/.github/workflows/build_and_test.yml +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/.github/workflows/pypi-publish.yml +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/.github/workflows/python_build_wheel.yml +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/LICENSE +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/CMakeLists.txt +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Pybinder/CMakeLists.txt +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/CMakeLists.txt +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/.clang-format +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/.github/issue_template.md +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/.github/pull_request_template.md +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/.github/workflows/cifuzz.yml +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/.github/workflows/doc.yml +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/.github/workflows/linux.yml +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/.github/workflows/macos.yml +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/.github/workflows/windows.yml +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/.gitignore +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/CMakeLists.txt +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/CONTRIBUTING.md +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/ChangeLog.rst +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/LICENSE.rst +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/README.rst +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/CMakeLists.txt +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/_static/bootstrap.min.js +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/_static/breathe.css +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/_static/fonts/glyphicons-halflings-regular.eot +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/_static/fonts/glyphicons-halflings-regular.svg +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/_static/fonts/glyphicons-halflings-regular.ttf +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/_static/fonts/glyphicons-halflings-regular.woff +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/_templates/layout.html +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/_templates/search.html +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/api.rst +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/basic-bootstrap/README +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/basic-bootstrap/layout.html +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/basic-bootstrap/theme.conf +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/alerts.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/badges.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/bootstrap.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/breadcrumbs.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/button-groups.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/buttons.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/carousel.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/close.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/code.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/component-animations.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/dropdowns.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/forms.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/glyphicons.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/grid.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/input-groups.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/jumbotron.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/labels.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/list-group.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/media.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/alerts.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/background-variant.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/border-radius.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/buttons.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/center-block.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/clearfix.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/forms.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/gradients.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/grid-framework.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/grid.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/hide-text.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/image.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/labels.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/list-group.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/nav-divider.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/nav-vertical-align.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/opacity.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/pagination.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/panels.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/progress-bar.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/reset-filter.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/resize.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/responsive-visibility.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/size.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/tab-focus.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/table-row.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/text-emphasis.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/text-overflow.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/vendor-prefixes.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/modals.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/navbar.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/navs.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/normalize.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/pager.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/pagination.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/panels.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/popovers.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/print.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/progress-bars.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/responsive-embed.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/responsive-utilities.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/scaffolding.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/tables.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/theme.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/thumbnails.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/tooltip.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/type.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/utilities.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/variables.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/wells.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/build.py +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/conf.py +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/contents.rst +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/fmt.less +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/index.rst +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/python-license.txt +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/syntax.rst +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/usage.rst +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/include/fmt/args.h +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/include/fmt/chrono.h +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/include/fmt/color.h +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/include/fmt/compile.h +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/include/fmt/core.h +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/include/fmt/format-inl.h +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/include/fmt/format.h +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/include/fmt/os.h +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/include/fmt/ostream.h +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/include/fmt/printf.h +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/include/fmt/ranges.h +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/include/fmt/std.h +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/include/fmt/xchar.h +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/src/fmt.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/src/format.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/src/os.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/Android.mk +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/AndroidManifest.xml +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/C++.sublime-syntax +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/README +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/Vagrantfile +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/bazel/.bazelversion +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/bazel/BUILD.bazel +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/bazel/README.md +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/bazel/WORKSPACE.bazel +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/build-docs.py +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/build.gradle +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/cmake/FindSetEnv.cmake +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/cmake/JoinPaths.cmake +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/cmake/fmt-config.cmake.in +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/cmake/fmt.pc.in +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/compute-powers.py +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/docopt.py +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/manage.py +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/printable.py +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/rst2md.py +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/rtd/conf.py +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/rtd/index.rst +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/rtd/theme/layout.html +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/rtd/theme/theme.conf +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/CMakeLists.txt +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/add-subdirectory-test/CMakeLists.txt +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/add-subdirectory-test/main.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/args-test.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/assert-test.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/chrono-test.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/color-test.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/compile-error-test/CMakeLists.txt +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/compile-fp-test.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/compile-test.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/core-test.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/cuda-test/CMakeLists.txt +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/cuda-test/cpp14.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/cuda-test/cuda-cpp14.cu +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/detect-stdfs.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/enforce-checks-test.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/find-package-test/CMakeLists.txt +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/find-package-test/main.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/format-impl-test.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/format-test.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/fuzzing/.gitignore +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/fuzzing/CMakeLists.txt +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/fuzzing/README.md +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/fuzzing/build.sh +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/fuzzing/chrono-duration.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/fuzzing/chrono-timepoint.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/fuzzing/float.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/fuzzing/fuzzer-common.h +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/fuzzing/main.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/fuzzing/named-arg.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/fuzzing/one-arg.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/fuzzing/two-args.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/gtest/.clang-format +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/gtest/CMakeLists.txt +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/gtest/gmock/gmock.h +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/gtest/gmock-gtest-all.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/gtest/gtest/gtest-spi.h +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/gtest/gtest/gtest.h +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/gtest-extra-test.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/gtest-extra.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/gtest-extra.h +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/header-only-test.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/mock-allocator.h +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/module-test.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/noexception-test.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/os-test.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/ostream-test.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/posix-mock-test.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/posix-mock.h +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/printf-test.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/ranges-odr-test.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/ranges-test.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/scan-test.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/scan.h +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/static-export-test/CMakeLists.txt +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/static-export-test/library.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/static-export-test/main.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/std-test.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/test-assert.h +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/test-main.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/unicode-test.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/util.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/util.h +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/xchar-test.cc +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/src/basic_math.cpp +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/src/basic_math.h +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/src/density_operator_simulator.h +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/src/errors.h +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/src/qopcode.h +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/src/rng.h +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/src/simulator.h +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/src/simulator_density_op_impl.h +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/src/simulator_impl.h +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/src/simulator_statevector_impl.h +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/test/CMakeLists.txt +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/scripts/check_release.py +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/scripts/check_wheel_abi.py +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/scripts/stubgen.py +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/setup.cfg +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/setup.py +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/uniqc_cppsimulator.egg-info/dependency_links.txt +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/uniqc_cppsimulator.egg-info/not-zip-safe +0 -0
- {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/uniqc_cppsimulator.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
name: Docs (GitHub Pages)
|
|
2
|
+
|
|
3
|
+
# Build the Sphinx site and publish it to GitHub Pages on every push to main
|
|
4
|
+
# that can change its content, plus manual runs.
|
|
5
|
+
# First run: enable Pages in repo Settings -> Pages -> Source: GitHub Actions.
|
|
6
|
+
|
|
7
|
+
on:
|
|
8
|
+
push:
|
|
9
|
+
branches: [ "main" ]
|
|
10
|
+
paths:
|
|
11
|
+
- 'docs/**'
|
|
12
|
+
- 'doc/**'
|
|
13
|
+
- 'benchmark/**'
|
|
14
|
+
- 'UniqcCpp/**'
|
|
15
|
+
- 'README.md'
|
|
16
|
+
- 'CHANGELOG.md'
|
|
17
|
+
- 'pyproject.toml'
|
|
18
|
+
- 'setup.py'
|
|
19
|
+
- '.github/workflows/docs-pages.yml'
|
|
20
|
+
workflow_dispatch:
|
|
21
|
+
|
|
22
|
+
permissions:
|
|
23
|
+
contents: read
|
|
24
|
+
|
|
25
|
+
# One deployment at a time; a newer push supersedes the in-flight one.
|
|
26
|
+
concurrency:
|
|
27
|
+
group: github-pages
|
|
28
|
+
cancel-in-progress: true
|
|
29
|
+
|
|
30
|
+
jobs:
|
|
31
|
+
build:
|
|
32
|
+
runs-on: ubuntu-latest
|
|
33
|
+
permissions:
|
|
34
|
+
contents: read
|
|
35
|
+
pages: write
|
|
36
|
+
id-token: write
|
|
37
|
+
steps:
|
|
38
|
+
- name: Checkout repository
|
|
39
|
+
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
|
|
40
|
+
with:
|
|
41
|
+
fetch-depth: 0 # full history for setuptools_scm version in the docs
|
|
42
|
+
|
|
43
|
+
- name: Set up Python
|
|
44
|
+
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
|
45
|
+
with:
|
|
46
|
+
python-version: '3.12'
|
|
47
|
+
|
|
48
|
+
- name: Configure GitHub Pages
|
|
49
|
+
id: pages
|
|
50
|
+
uses: actions/configure-pages@45bfe0192ca1faeb007ade9deae92b16b8254a0d # v6.0.0
|
|
51
|
+
|
|
52
|
+
- name: Install docs dependencies
|
|
53
|
+
run: python -m pip install -r docs/requirements.txt
|
|
54
|
+
|
|
55
|
+
# autodoc imports the benchmark/ package (via sys.path in docs/conf.py)
|
|
56
|
+
# and the uniqc_cpp extension, so install the extension from source.
|
|
57
|
+
- name: Build and install the extension
|
|
58
|
+
run: python -m pip install .
|
|
59
|
+
|
|
60
|
+
- name: Copy markdown sources into the Sphinx tree
|
|
61
|
+
run: python docs/prepare.py
|
|
62
|
+
|
|
63
|
+
- name: Build HTML (warnings are errors)
|
|
64
|
+
run: python -m sphinx -W --keep-going -b html docs docs/_build/html
|
|
65
|
+
|
|
66
|
+
- name: Upload pages artifact
|
|
67
|
+
uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0
|
|
68
|
+
with:
|
|
69
|
+
path: docs/_build/html
|
|
70
|
+
|
|
71
|
+
deploy:
|
|
72
|
+
needs: build
|
|
73
|
+
runs-on: ubuntu-latest
|
|
74
|
+
permissions:
|
|
75
|
+
pages: write
|
|
76
|
+
id-token: write
|
|
77
|
+
environment:
|
|
78
|
+
name: github-pages
|
|
79
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
80
|
+
steps:
|
|
81
|
+
- name: Deploy to GitHub Pages
|
|
82
|
+
id: deployment
|
|
83
|
+
uses: actions/deploy-pages@368f82528645a54fb793d4d04e342629a3f51346 # v5.0.1
|
|
@@ -70,6 +70,8 @@ instance/
|
|
|
70
70
|
|
|
71
71
|
# Sphinx documentation
|
|
72
72
|
docs/_build/
|
|
73
|
+
# Markdown sources copied in by docs/prepare.py at build time
|
|
74
|
+
docs/includes/
|
|
73
75
|
# Autogenerated per-module reference pages; regenerated by `sphinx-apidoc`
|
|
74
76
|
# before every build (see docs/Makefile). `uniqc_api.rst` is hand-curated.
|
|
75
77
|
docs/source/uniqc.rst
|
|
@@ -195,6 +197,11 @@ bad_circuits.txt
|
|
|
195
197
|
# setuptools_scm generated version file
|
|
196
198
|
uniqc/_version.py
|
|
197
199
|
|
|
200
|
+
# Benchmark scratch env & runs (published snapshots live in doc/benchmark/)
|
|
201
|
+
.venv-bench/
|
|
202
|
+
benchmark/results*.json
|
|
203
|
+
!doc/benchmark/*.png
|
|
204
|
+
|
|
198
205
|
# CMake build artifacts
|
|
199
206
|
UniqcCpp/CMakeCache.txt
|
|
200
207
|
UniqcCpp/CMakeFiles/
|
|
@@ -210,3 +217,6 @@ UniqcCpp/src/cmake_install.cmake
|
|
|
210
217
|
UniqcCpp/test/Makefile
|
|
211
218
|
UniqcCpp/test/CMakeFiles/
|
|
212
219
|
UniqcCpp/test/cmake_install.cmake
|
|
220
|
+
|
|
221
|
+
# 本地并行开发交接资料
|
|
222
|
+
/.agent-task/
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [1.1.0] - 2026-11-09
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **内核全局多线程**:新增进程级全局开关与线程数 API(`uniqc_cpp.set_parallel_enabled` / `is_parallel_enabled` / `set_num_threads` / `get_num_threads`,默认关闭、单线程,与历史行为完全一致)。态矢量全部门内核(含受控门)与密度算符行循环按 `std::thread` 连续分块并行(无新依赖,CMake 仅链接 `Threads::Threads`);门操作结果与单线程数值一致(不同编译器的浮点收缩可能有末位差异),概率类读出(`pmeasure`/`get_prob`)还可能有浮点求和顺序差异;`rand()` 决策保留在调用线程;态矢量小于 2^14 幅度时自动回落单线程,密度矩阵按行循环总工作量决定。类型存根与 `docs/usage.rst` 同步更新。
|
|
13
|
+
- **benchmark 多线程基线接入内核线程**:`uniqc_sv` 后端改为 `option` 模式(threads 档位经全局 API 直接测内核门级并行,此前精确模式的 threads>1 档位被跳过);新增 `uniqc_sv_batch` 后端保留原进程池 shot 级采样吞吐基线;`uniqc_dm` 同样改为 `option`。sampling 预设组加入 `uniqc_sv_batch`,相关文档(README / benchmark/README / docs)同步。
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
|
|
17
|
+
- **QRAM 原生入口的越界访问与高位静默丢失**:`StatevectorSimulator` 与 `DensityOperatorSimulator` 现在要求数据数组长度恰好为 `2^addr_size`,并拒绝超出 `data_size` 位宽的值,统一抛出 `ValueError`。此前过短数组会使两个后端段错误,超位宽值的高位会被静默忽略;有效调用语义与 UniQC `QRAM` 既有契约不变。新增 Python 参数化回归及 C++ 原生异常回归。
|
|
18
|
+
- **`StatevectorSimulator::measure_single_shot` 标量重载死循环**:`measure_single_shot({ qubit })` 的花括号初始化列表在重载决议中选中了标量重载自身,完美尾递归被编译器优化为无限循环——表现为挂起而非崩溃,1.0.1 及此前所有发布版本均受影响(list 重载不受影响,故既有测试未暴露)。现改为显式 `std::vector{ qubit }` 转发(与 `pmeasure` 标量重载同一写法)。新增带子进程超时保护的回归测试(`tests/test_bindings.py`):旧版本上该测试失败而非挂死套件。
|
|
19
|
+
- **`benchmark.worker` 在 Windows 上不可导入**:顶层 `import resource`(Unix-only 标准库)改为带回退的守卫导入,无 `resource` 平台上峰值 RSS 记为 `null`;`python -m benchmark list` 等 CLI 与文档 autodoc 在 Windows 恢复可用。
|
|
20
|
+
|
|
21
|
+
### Added
|
|
22
|
+
|
|
23
|
+
- **Sphinx 文档(`docs/`)**:使用/构建/测试指南、基准套件使用、`benchmark` 包 API 参考(autodoc)与 `uniqc_cpp` 扩展 API 参考;补全 `benchmark` 包全部 docstring。构建:`python -m sphinx -b html docs docs/_build/html`(零告警)。
|
|
24
|
+
- **文档发布到 GitHub Pages**:`.github/workflows/docs-pages.yml` 在 `main` 分支文档相关变更后自动构建部署(`-W` 零告警门禁)。README / CHANGELOG / `doc/benchmark.md` / `benchmark/README.md` 与基准图表由 `docs/prepare.py` 在构建开始时自动拷入站点并重写站内链接(myst-parser),主题换为 furo;站点地址 <https://iai-ustc-quantum.github.io/uniqc-cppsimulator/>。
|
|
25
|
+
- **跨模拟器 CPU benchmark 套件(`benchmark/`)**:以 `uniqc_cpp` 为对象与主流 pip 可装 CPU 模拟器(Qiskit Aer、Cirq、qsim、Qulacs、PennyLane lightning、Qibo、quimb、QuTiP、Braket 本地模拟器等)对比;统一线路 IR + 注册表扩展点(线路族 / 噪声预设 / 后端适配器 / 矩阵预设 / 图表);单线程 vs 多线程基线(外部模拟器走原生线程旋钮,`uniqc_cpp` 走进程池并行采样吞吐);结果 JSON 落盘 + 图表 + 报告生成(`python -m benchmark run|plot|report`)。摘要见 [README"性能基准"](README.md#性能基准),详情见 [doc/benchmark.md](doc/benchmark.md),套件用法见 [benchmark/README.md](benchmark/README.md)。
|
|
26
|
+
|
|
27
|
+
## [1.0.1] - 2026-08-23
|
|
28
|
+
|
|
29
|
+
### Fixed
|
|
30
|
+
|
|
31
|
+
- **`StatevectorSimulator::twoqubit_depolarizing` 去极化概率被进程内首次调用固化**:1.0.0 中 Kraus 概率向量被误声明为 `const static` 局部变量,只在首次调用时初始化,之后同进程内所有调用静默沿用第一次的 `p`(实测错误率被"钉死",且密度算符实现无此问题,两后端行为不一致)。现改为每次调用按当前 `p` 构建。新增同进程交变 `p` 的回归测试(`tests/test_bindings.py`)。
|
|
32
|
+
|
|
33
|
+
### Removed
|
|
34
|
+
|
|
35
|
+
- 清理 `qopcode.cpp` 中整段注释掉的废弃代码(`string_to_UnitaryType` / `string_to_NoiseType` / `gate_qubit_count`)。
|
|
36
|
+
|
|
37
|
+
## [1.0.0] - 2026-08-21
|
|
38
|
+
|
|
39
|
+
初始独立版本。C++ 模拟器自 [UnifiedQuantum](https://github.com/IAI-USTC-Quantum/UnifiedQuantum) v0.0.17 拆分为独立仓库,import 名保持 `uniqc_cpp` 不变,API 与拆分前完全兼容。
|
|
40
|
+
|
|
41
|
+
- `StatevectorSimulator`(态矢量,最多 30 量子比特)与 `DensityOperatorSimulator`(密度算符,最多 10 量子比特,含噪声通道)
|
|
42
|
+
- QRAM 指令支持与参数校验
|
|
43
|
+
- Release 构建安全加固(stack protector / FORTIFY / relro)
|
|
44
|
+
- Python 绑定测试套件(`tests/`)与 C++ 原生冒烟测试
|
|
45
|
+
- 类型存根 `uniqc_cpp.pyi` 随 wheel 一起发布
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: uniqc-cppsimulator
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.1.0
|
|
4
4
|
Summary: C++ quantum circuit simulators (statevector / density operator) with pybind11 bindings. The native simulation kernel of UnifiedQuantum.
|
|
5
5
|
Author-email: Agony <chenzhaoyun@iai.ustc.edu.cn>
|
|
6
6
|
License: Apache License
|
|
@@ -234,6 +234,8 @@ UnifiedQuantum 的 C++ 量子线路模拟内核,独立发版。
|
|
|
234
234
|
|
|
235
235
|
*The native C++ simulation kernel of [UnifiedQuantum](https://github.com/IAI-USTC-Quantum/UnifiedQuantum), published as a standalone package.*
|
|
236
236
|
|
|
237
|
+
[](https://iai-ustc-quantum.github.io/uniqc-cppsimulator/)
|
|
238
|
+
|
|
237
239
|
## 定位
|
|
238
240
|
|
|
239
241
|
本仓库提供两个高性能 C++ 模拟器,通过 pybind11 暴露为 **`uniqc_cpp`** Python 扩展模块:
|
|
@@ -241,7 +243,7 @@ UnifiedQuantum 的 C++ 量子线路模拟内核,独立发版。
|
|
|
241
243
|
- `StatevectorSimulator` — 态矢量模拟器(最多 30 量子比特)
|
|
242
244
|
- `DensityOperatorSimulator` — 密度算符模拟器(最多 10 量子比特,支持噪声通道)
|
|
243
245
|
|
|
244
|
-
它原来是 [UnifiedQuantum](https://github.com/IAI-USTC-Quantum/UnifiedQuantum) 仓库的 `UniqcCpp/` 目录,自
|
|
246
|
+
它原来是 [UnifiedQuantum](https://github.com/IAI-USTC-Quantum/UnifiedQuantum) 仓库的 `UniqcCpp/` 目录,自 v0.0.18 起拆分为独立仓库、独立版本、独立发布。UnifiedQuantum 通过 PyPI 依赖本包,二者接口保持兼容。
|
|
245
247
|
|
|
246
248
|
**安装本包后,import 名为 `uniqc_cpp`**(分发名 `uniqc-cppsimulator`,import 名 `uniqc_cpp`)。
|
|
247
249
|
|
|
@@ -265,7 +267,7 @@ sim.cnot(0, 1)
|
|
|
265
267
|
print(sim.pmeasure([0, 1])) # Bell 态: [0.5, 0, 0, 0.5]
|
|
266
268
|
```
|
|
267
269
|
|
|
268
|
-
完整 API 见仓库根目录的类型存根 [`uniqc_cpp.pyi`](uniqc_cpp.pyi)(安装后随扩展一起发布,IDE /
|
|
270
|
+
完整 API 见仓库根目录的类型存根 [`uniqc_cpp.pyi`](uniqc_cpp.pyi)(安装后随扩展一起发布,IDE / 类型检查器可直接使用)。测量列表的第一个量子比特是返回整数的最低有效位;`measure_single_shot` 只采样、不坍缩状态,`measure_qubit` 才执行坍缩测量。两个后端均为稠密存储,30 比特态矢量仅状态本身即需 16 GiB,实际可用规模还受内存限制。
|
|
269
271
|
|
|
270
272
|
## 源码构建要求
|
|
271
273
|
|
|
@@ -293,10 +295,85 @@ cmake --build build-cpp --config Release
|
|
|
293
295
|
./build-cpp/bin/Release/UnifiedQuantumTest # Windows: .\build-cpp\bin\Release\UnifiedQuantumTest.exe
|
|
294
296
|
```
|
|
295
297
|
|
|
298
|
+
## 文档
|
|
299
|
+
|
|
300
|
+
在线文档(GitHub Pages):**<https://iai-ustc-quantum.github.io/uniqc-cppsimulator/>** ——
|
|
301
|
+
安装/构建指南、基准套件使用、`benchmark` 包与 `uniqc_cpp` 扩展的 API 参考、基准结果
|
|
302
|
+
与 CHANGELOG;`main` 分支相关变更推送后自动构建发布。
|
|
303
|
+
|
|
304
|
+
本地构建(源在 [`docs/`](docs/);README / CHANGELOG / 基准报告等 markdown 由
|
|
305
|
+
`docs/prepare.py` 在构建开始时自动拷入 `docs/includes/`):
|
|
306
|
+
|
|
307
|
+
```bash
|
|
308
|
+
uv venv .venv-docs --python 3.12
|
|
309
|
+
uv pip install --python .venv-docs -r docs/requirements.txt .
|
|
310
|
+
.venv-docs/bin/python -m sphinx -b html docs docs/_build/html # 或 cd docs && make html PYTHON=../.venv-docs/bin/python
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
类型存根 `uniqc_cpp.pyi` 随 wheel 发布;基准结果文档见 [doc/benchmark.md](doc/benchmark.md),一页纸摘要见 [doc/benchmark/README_summary.md](doc/benchmark/README_summary.md)。
|
|
314
|
+
|
|
315
|
+
在 UnifiedQuantum 框架中调用本内核(`submit_task` / `Simulator` 等入口)的用法,见
|
|
316
|
+
[UnifiedQuantum 文档的本地模拟章节](https://github.com/IAI-USTC-Quantum/UnifiedQuantum/blob/main/docs/source/1_basic_usage/simulation.md)。
|
|
317
|
+
|
|
318
|
+
## 性能基准
|
|
319
|
+
|
|
320
|
+
[`benchmark/`](benchmark/README.md) 提供跨模拟器 CPU 基准套件:以 `uniqc_cpp` 为对象,
|
|
321
|
+
与主流 pip 可装 CPU 模拟器广泛对比(Qiskit Aer、Cirq、Google qsim、Qulacs、PennyLane
|
|
322
|
+
lightning、Qibo、quimb、QuTiP、Braket 本地模拟器;未安装的自动跳过),覆盖:
|
|
323
|
+
|
|
324
|
+
- **基线**:单线程 vs 多线程(现阶段仅 CPU)
|
|
325
|
+
- **线路族 × qubit 数**:`ghz` / `qft` / 分层随机 / `qaoa`,4 → 24 量子比特
|
|
326
|
+
- **噪声**:去极化、幅度阻尼、比特翻转(密度矩阵)与轨迹采样
|
|
327
|
+
- **多线程机制**:外部模拟器走内核线程旋钮(OMP/选项);`uniqc_cpp` 内核自带
|
|
328
|
+
全局多线程开关(`set_num_threads` / `set_parallel_enabled`),threads 档位直接
|
|
329
|
+
测内核门级并行;`uniqc_sv_batch` 另保留 shot 级进程并行采样吞吐基线
|
|
330
|
+
|
|
331
|
+
```bash
|
|
332
|
+
uv venv .venv-bench --python 3.12 && uv pip install --python .venv-bench/bin/python \
|
|
333
|
+
uniqc-cppsimulator matplotlib qiskit qiskit-aer cirq qsimcirq qulacs \
|
|
334
|
+
pennylane pennylane-lightning qibo qibojit quimb qutip qutip-qip amazon-braket-sdk
|
|
335
|
+
.venv-bench/bin/python -m benchmark selftest # 适配器正确性检查
|
|
336
|
+
.venv-bench/bin/python -m benchmark run --preset smoke # ~2 分钟冒烟
|
|
337
|
+
.venv-bench/bin/python -m benchmark run --preset standard --out benchmark/results.json
|
|
338
|
+
.venv-bench/bin/python -m benchmark plot && .venv-bench/bin/python -m benchmark report
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
默认对比对象是 PyPI 上最新的 `uniqc-cppsimulator` release;本轮为验证内核多线程,
|
|
342
|
+
从本地源码安装 dev 构建(`1.0.2.dev4`)。
|
|
343
|
+
|
|
344
|
+
### 最近一轮结果(2026-09-22,Xeon Gold 5118 × 48 核,本地 dev 构建 `1.0.2.dev4`)
|
|
345
|
+
|
|
346
|
+
理想态矢量、单线程、各线路最大可比规模(完整数据见 [`doc/benchmark.md`](doc/benchmark.md)):
|
|
347
|
+
|
|
348
|
+
| 线路 | 最大可比 qubits | 最快 | uniqc_sv | 倍差 |
|
|
349
|
+
|---|---|---|---|---|
|
|
350
|
+
| ghz | 24 | Qiskit Aer (4.9 ms) | 1.82 s | ×372 |
|
|
351
|
+
| qaoa | 24 | Google qsim (3.21 s) | 69.7 s | ×22 |
|
|
352
|
+
| qft | 20 | Google qsim (224 ms) | 13.3 s | ×59 |
|
|
353
|
+
| random | 24 | Google qsim (3.15 s) | 27.3 s | ×9 |
|
|
354
|
+
|
|
355
|
+
**内核多线程首次生效**(threads=8 档位,全局 `set_num_threads` 门级并行):
|
|
356
|
+
|
|
357
|
+
- 大规模加速 **×2.7–2.9**:ghz 24q 1.82 s → 0.67 s;random 24q 27.3 s → 10.2 s;
|
|
358
|
+
qaoa 24q 69.7 s → 24.2 s;20q 约 ×1.7–1.8。≤16q 受线程启动开销与访存带宽限制收益甚微。
|
|
359
|
+
- threads=8 下 24q ghz:uniqc_sv(672 ms)已与 PennyLane lightning(655 ms)并肩,
|
|
360
|
+
仅次于 Aer 的线路专用优化(2.1 ms)。
|
|
361
|
+
- 密度矩阵行循环同样并行:uniqc_dm 10q 去极化 **×1.7**(19.0 s → 11.0 s)。
|
|
362
|
+
- 采样吞吐(1024 shots):进程级并行仍是王道 —— uniqc_sv_batch 16q **×7.7**
|
|
363
|
+
(37.0 s → 4.8 s),8q 达 17.4k shots/s 超过 Aer 多线程(6.3k);内核线程对
|
|
364
|
+
轨迹采样仅 ×1.1(每条轨迹规模小、且无跨轨迹并行),两种机制各司其职。
|
|
365
|
+
- 小规模(≤8q)单线程:uniqc_sv 与 Qulacs 各拿下 8 个线路-规模组合中的 4 个。
|
|
366
|
+
- 噪声密度矩阵(去极化):4q 处 uniqc_dm 最快(1.7 ms,比 Qulacs-DM 快 ~2.5×),
|
|
367
|
+
10q 处落后 Aer(19.0 s vs 1.7 s)。
|
|
368
|
+
|
|
369
|
+
> 数字来自共享开发机(本轮有其他用户进程占用约 21 核,多线程加速比被低估)、
|
|
370
|
+
> 未做绑核等公平性控制,仅用于相对趋势;图表见
|
|
371
|
+
> [doc/benchmark.md](doc/benchmark.md),原始 JSON 见 `doc/benchmark/results-2026-09-22.json`。
|
|
372
|
+
|
|
296
373
|
## 版本与兼容
|
|
297
374
|
|
|
298
375
|
- 本包版本与 UnifiedQuantum 独立演进。UnifiedQuantum 在其 `pyproject.toml` 中以 `uniqc-cppsimulator>=x.y,<z` 声明兼容区间。
|
|
299
|
-
- 破坏性 API 变更会提升 major 版本并在 CHANGELOG 中标注。
|
|
376
|
+
- 破坏性 API 变更会提升 major 版本并在 [CHANGELOG](CHANGELOG.md) 中标注。
|
|
300
377
|
|
|
301
378
|
## 许可证
|
|
302
379
|
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
# uniqc-cppsimulator
|
|
2
|
+
|
|
3
|
+
UnifiedQuantum 的 C++ 量子线路模拟内核,独立发版。
|
|
4
|
+
|
|
5
|
+
*The native C++ simulation kernel of [UnifiedQuantum](https://github.com/IAI-USTC-Quantum/UnifiedQuantum), published as a standalone package.*
|
|
6
|
+
|
|
7
|
+
[](https://iai-ustc-quantum.github.io/uniqc-cppsimulator/)
|
|
8
|
+
|
|
9
|
+
## 定位
|
|
10
|
+
|
|
11
|
+
本仓库提供两个高性能 C++ 模拟器,通过 pybind11 暴露为 **`uniqc_cpp`** Python 扩展模块:
|
|
12
|
+
|
|
13
|
+
- `StatevectorSimulator` — 态矢量模拟器(最多 30 量子比特)
|
|
14
|
+
- `DensityOperatorSimulator` — 密度算符模拟器(最多 10 量子比特,支持噪声通道)
|
|
15
|
+
|
|
16
|
+
它原来是 [UnifiedQuantum](https://github.com/IAI-USTC-Quantum/UnifiedQuantum) 仓库的 `UniqcCpp/` 目录,自 v0.0.18 起拆分为独立仓库、独立版本、独立发布。UnifiedQuantum 通过 PyPI 依赖本包,二者接口保持兼容。
|
|
17
|
+
|
|
18
|
+
**安装本包后,import 名为 `uniqc_cpp`**(分发名 `uniqc-cppsimulator`,import 名 `uniqc_cpp`)。
|
|
19
|
+
|
|
20
|
+
## 安装
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
pip install uniqc-cppsimulator
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
提供 Linux / Windows / macOS 的 cp310–cp314 预编译 wheel;其余平台自动从 sdist 源码编译,需要满足下方"源码构建要求"。
|
|
27
|
+
|
|
28
|
+
## 快速上手
|
|
29
|
+
|
|
30
|
+
```python
|
|
31
|
+
import uniqc_cpp
|
|
32
|
+
|
|
33
|
+
sim = uniqc_cpp.StatevectorSimulator()
|
|
34
|
+
sim.init_n_qubit(2)
|
|
35
|
+
sim.hadamard(0)
|
|
36
|
+
sim.cnot(0, 1)
|
|
37
|
+
print(sim.pmeasure([0, 1])) # Bell 态: [0.5, 0, 0, 0.5]
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
完整 API 见仓库根目录的类型存根 [`uniqc_cpp.pyi`](uniqc_cpp.pyi)(安装后随扩展一起发布,IDE / 类型检查器可直接使用)。测量列表的第一个量子比特是返回整数的最低有效位;`measure_single_shot` 只采样、不坍缩状态,`measure_qubit` 才执行坍缩测量。两个后端均为稠密存储,30 比特态矢量仅状态本身即需 16 GiB,实际可用规模还受内存限制。
|
|
41
|
+
|
|
42
|
+
## 源码构建要求
|
|
43
|
+
|
|
44
|
+
- CMake >= 3.22
|
|
45
|
+
- 支持 C++17 的编译器(MSVC / gcc / clang)
|
|
46
|
+
- pybind11(构建隔离模式下由 `pyproject.toml` 自动提供)
|
|
47
|
+
- 第三方库 [fmt](https://fmt.dev/) 已 vendored 在 `UniqcCpp/Thirdparty/`,无需额外安装
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
git clone https://github.com/IAI-USTC-Quantum/uniqc-cppsimulator.git
|
|
51
|
+
cd uniqc-cppsimulator
|
|
52
|
+
pip install .
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## 测试
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
# Python 绑定测试
|
|
59
|
+
pytest tests/
|
|
60
|
+
|
|
61
|
+
# C++ 原生测试
|
|
62
|
+
cmake -S . -B build-cpp -DCMAKE_BUILD_TYPE=Release \
|
|
63
|
+
-Dpybind11_DIR="$(python -c 'import pybind11; print(pybind11.get_cmake_dir())')"
|
|
64
|
+
cmake --build build-cpp --config Release
|
|
65
|
+
./build-cpp/bin/Release/UnifiedQuantumTest # Windows: .\build-cpp\bin\Release\UnifiedQuantumTest.exe
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## 文档
|
|
69
|
+
|
|
70
|
+
在线文档(GitHub Pages):**<https://iai-ustc-quantum.github.io/uniqc-cppsimulator/>** ——
|
|
71
|
+
安装/构建指南、基准套件使用、`benchmark` 包与 `uniqc_cpp` 扩展的 API 参考、基准结果
|
|
72
|
+
与 CHANGELOG;`main` 分支相关变更推送后自动构建发布。
|
|
73
|
+
|
|
74
|
+
本地构建(源在 [`docs/`](docs/);README / CHANGELOG / 基准报告等 markdown 由
|
|
75
|
+
`docs/prepare.py` 在构建开始时自动拷入 `docs/includes/`):
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
uv venv .venv-docs --python 3.12
|
|
79
|
+
uv pip install --python .venv-docs -r docs/requirements.txt .
|
|
80
|
+
.venv-docs/bin/python -m sphinx -b html docs docs/_build/html # 或 cd docs && make html PYTHON=../.venv-docs/bin/python
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
类型存根 `uniqc_cpp.pyi` 随 wheel 发布;基准结果文档见 [doc/benchmark.md](doc/benchmark.md),一页纸摘要见 [doc/benchmark/README_summary.md](doc/benchmark/README_summary.md)。
|
|
84
|
+
|
|
85
|
+
在 UnifiedQuantum 框架中调用本内核(`submit_task` / `Simulator` 等入口)的用法,见
|
|
86
|
+
[UnifiedQuantum 文档的本地模拟章节](https://github.com/IAI-USTC-Quantum/UnifiedQuantum/blob/main/docs/source/1_basic_usage/simulation.md)。
|
|
87
|
+
|
|
88
|
+
## 性能基准
|
|
89
|
+
|
|
90
|
+
[`benchmark/`](benchmark/README.md) 提供跨模拟器 CPU 基准套件:以 `uniqc_cpp` 为对象,
|
|
91
|
+
与主流 pip 可装 CPU 模拟器广泛对比(Qiskit Aer、Cirq、Google qsim、Qulacs、PennyLane
|
|
92
|
+
lightning、Qibo、quimb、QuTiP、Braket 本地模拟器;未安装的自动跳过),覆盖:
|
|
93
|
+
|
|
94
|
+
- **基线**:单线程 vs 多线程(现阶段仅 CPU)
|
|
95
|
+
- **线路族 × qubit 数**:`ghz` / `qft` / 分层随机 / `qaoa`,4 → 24 量子比特
|
|
96
|
+
- **噪声**:去极化、幅度阻尼、比特翻转(密度矩阵)与轨迹采样
|
|
97
|
+
- **多线程机制**:外部模拟器走内核线程旋钮(OMP/选项);`uniqc_cpp` 内核自带
|
|
98
|
+
全局多线程开关(`set_num_threads` / `set_parallel_enabled`),threads 档位直接
|
|
99
|
+
测内核门级并行;`uniqc_sv_batch` 另保留 shot 级进程并行采样吞吐基线
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
uv venv .venv-bench --python 3.12 && uv pip install --python .venv-bench/bin/python \
|
|
103
|
+
uniqc-cppsimulator matplotlib qiskit qiskit-aer cirq qsimcirq qulacs \
|
|
104
|
+
pennylane pennylane-lightning qibo qibojit quimb qutip qutip-qip amazon-braket-sdk
|
|
105
|
+
.venv-bench/bin/python -m benchmark selftest # 适配器正确性检查
|
|
106
|
+
.venv-bench/bin/python -m benchmark run --preset smoke # ~2 分钟冒烟
|
|
107
|
+
.venv-bench/bin/python -m benchmark run --preset standard --out benchmark/results.json
|
|
108
|
+
.venv-bench/bin/python -m benchmark plot && .venv-bench/bin/python -m benchmark report
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
默认对比对象是 PyPI 上最新的 `uniqc-cppsimulator` release;本轮为验证内核多线程,
|
|
112
|
+
从本地源码安装 dev 构建(`1.0.2.dev4`)。
|
|
113
|
+
|
|
114
|
+
### 最近一轮结果(2026-09-22,Xeon Gold 5118 × 48 核,本地 dev 构建 `1.0.2.dev4`)
|
|
115
|
+
|
|
116
|
+
理想态矢量、单线程、各线路最大可比规模(完整数据见 [`doc/benchmark.md`](doc/benchmark.md)):
|
|
117
|
+
|
|
118
|
+
| 线路 | 最大可比 qubits | 最快 | uniqc_sv | 倍差 |
|
|
119
|
+
|---|---|---|---|---|
|
|
120
|
+
| ghz | 24 | Qiskit Aer (4.9 ms) | 1.82 s | ×372 |
|
|
121
|
+
| qaoa | 24 | Google qsim (3.21 s) | 69.7 s | ×22 |
|
|
122
|
+
| qft | 20 | Google qsim (224 ms) | 13.3 s | ×59 |
|
|
123
|
+
| random | 24 | Google qsim (3.15 s) | 27.3 s | ×9 |
|
|
124
|
+
|
|
125
|
+
**内核多线程首次生效**(threads=8 档位,全局 `set_num_threads` 门级并行):
|
|
126
|
+
|
|
127
|
+
- 大规模加速 **×2.7–2.9**:ghz 24q 1.82 s → 0.67 s;random 24q 27.3 s → 10.2 s;
|
|
128
|
+
qaoa 24q 69.7 s → 24.2 s;20q 约 ×1.7–1.8。≤16q 受线程启动开销与访存带宽限制收益甚微。
|
|
129
|
+
- threads=8 下 24q ghz:uniqc_sv(672 ms)已与 PennyLane lightning(655 ms)并肩,
|
|
130
|
+
仅次于 Aer 的线路专用优化(2.1 ms)。
|
|
131
|
+
- 密度矩阵行循环同样并行:uniqc_dm 10q 去极化 **×1.7**(19.0 s → 11.0 s)。
|
|
132
|
+
- 采样吞吐(1024 shots):进程级并行仍是王道 —— uniqc_sv_batch 16q **×7.7**
|
|
133
|
+
(37.0 s → 4.8 s),8q 达 17.4k shots/s 超过 Aer 多线程(6.3k);内核线程对
|
|
134
|
+
轨迹采样仅 ×1.1(每条轨迹规模小、且无跨轨迹并行),两种机制各司其职。
|
|
135
|
+
- 小规模(≤8q)单线程:uniqc_sv 与 Qulacs 各拿下 8 个线路-规模组合中的 4 个。
|
|
136
|
+
- 噪声密度矩阵(去极化):4q 处 uniqc_dm 最快(1.7 ms,比 Qulacs-DM 快 ~2.5×),
|
|
137
|
+
10q 处落后 Aer(19.0 s vs 1.7 s)。
|
|
138
|
+
|
|
139
|
+
> 数字来自共享开发机(本轮有其他用户进程占用约 21 核,多线程加速比被低估)、
|
|
140
|
+
> 未做绑核等公平性控制,仅用于相对趋势;图表见
|
|
141
|
+
> [doc/benchmark.md](doc/benchmark.md),原始 JSON 见 `doc/benchmark/results-2026-09-22.json`。
|
|
142
|
+
|
|
143
|
+
## 版本与兼容
|
|
144
|
+
|
|
145
|
+
- 本包版本与 UnifiedQuantum 独立演进。UnifiedQuantum 在其 `pyproject.toml` 中以 `uniqc-cppsimulator>=x.y,<z` 声明兼容区间。
|
|
146
|
+
- 破坏性 API 变更会提升 major 版本并在 [CHANGELOG](CHANGELOG.md) 中标注。
|
|
147
|
+
|
|
148
|
+
## 许可证
|
|
149
|
+
|
|
150
|
+
Apache License 2.0,见 [LICENSE](LICENSE)。
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
#include "simulator.h"
|
|
17
17
|
#include "density_operator_simulator.h"
|
|
18
18
|
#include "rng.h"
|
|
19
|
+
#include "threading_control.h"
|
|
19
20
|
using namespace std;
|
|
20
21
|
using namespace pybind11::literals;
|
|
21
22
|
namespace py = pybind11;
|
|
@@ -26,6 +27,15 @@ PYBIND11_MODULE(uniqc_cpp, m)
|
|
|
26
27
|
m.def("seed", &uniqc::seed);
|
|
27
28
|
m.def("rand", &uniqc::rand);
|
|
28
29
|
|
|
30
|
+
m.def("set_parallel_enabled", &uniqc::set_parallel_enabled, py::arg("enabled"),
|
|
31
|
+
"Turn the global multithreading switch on/off (default off).");
|
|
32
|
+
m.def("is_parallel_enabled", &uniqc::is_parallel_enabled,
|
|
33
|
+
"Whether the global multithreading switch is on.");
|
|
34
|
+
m.def("set_num_threads", &uniqc::set_num_threads, py::arg("n"),
|
|
35
|
+
"Set the global worker-thread count (>= 1, clamped to hardware concurrency).");
|
|
36
|
+
m.def("get_num_threads", &uniqc::get_num_threads,
|
|
37
|
+
"Current global worker-thread count.");
|
|
38
|
+
|
|
29
39
|
auto py_arg_global_controller = (py::arg("global_controller") = std::vector<size_t>{});
|
|
30
40
|
auto py_arg_dagger = (py::arg("dagger") = false);
|
|
31
41
|
|
|
@@ -10,6 +10,8 @@ set(UniqcCppCoreSrc_H
|
|
|
10
10
|
${CMAKE_CURRENT_SOURCE_DIR}/simulator_density_op_impl.h
|
|
11
11
|
${CMAKE_CURRENT_SOURCE_DIR}/simulator_impl.h
|
|
12
12
|
${CMAKE_CURRENT_SOURCE_DIR}/simulator_statevector_impl.h
|
|
13
|
+
${CMAKE_CURRENT_SOURCE_DIR}/threading.h
|
|
14
|
+
${CMAKE_CURRENT_SOURCE_DIR}/threading_control.h
|
|
13
15
|
)
|
|
14
16
|
set(UniqcCppCoreSrc
|
|
15
17
|
${CMAKE_CURRENT_SOURCE_DIR}/basic_math.cpp
|
|
@@ -19,5 +21,7 @@ set(UniqcCppCoreSrc
|
|
|
19
21
|
${CMAKE_CURRENT_SOURCE_DIR}/simulator_common.cpp
|
|
20
22
|
${CMAKE_CURRENT_SOURCE_DIR}/simulator_density_op_impl.cpp
|
|
21
23
|
${CMAKE_CURRENT_SOURCE_DIR}/simulator_statevector_impl.cpp
|
|
24
|
+
${CMAKE_CURRENT_SOURCE_DIR}/threading.cpp
|
|
22
25
|
)
|
|
23
26
|
add_library(${PROJECT_NAME} STATIC ${UniqcCppCoreSrc_H} ${UniqcCppCoreSrc})
|
|
27
|
+
target_link_libraries(${PROJECT_NAME} PUBLIC Threads::Threads)
|
{uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/src/density_operator_simulator.cpp
RENAMED
|
@@ -832,6 +832,7 @@ namespace uniqc
|
|
|
832
832
|
CHECK_QUBIT_RANGE(qn)
|
|
833
833
|
|
|
834
834
|
check_qram_qubit_validity(addr_qubits, data_qubits, control_qubits);
|
|
835
|
+
check_qram_data_validity(addr_qubits.size(), data_qubits.size(), data_array);
|
|
835
836
|
|
|
836
837
|
size_t controller_mask = make_controller_mask(control_qubits, total_qubit);
|
|
837
838
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
#include "simulator.h"
|
|
2
|
+
#include "threading.h"
|
|
2
3
|
namespace uniqc {
|
|
3
4
|
|
|
4
5
|
using namespace statevector_simulator_impl;
|
|
@@ -746,7 +747,7 @@ namespace uniqc {
|
|
|
746
747
|
CHECK_QUBIT_RANGE2(qn2, qn2)
|
|
747
748
|
CHECK_PROBABILITY_BOUND(p)
|
|
748
749
|
|
|
749
|
-
const
|
|
750
|
+
const std::vector<double> p_(15, p / 15);
|
|
750
751
|
pauli_error_2q(qn1, qn2, p_);
|
|
751
752
|
}
|
|
752
753
|
|
|
@@ -785,6 +786,7 @@ namespace uniqc {
|
|
|
785
786
|
CHECK_QUBIT_RANGE(qn)
|
|
786
787
|
|
|
787
788
|
check_qram_qubit_validity(addr_qubits, data_qubits, control_qubits);
|
|
789
|
+
check_qram_data_validity(addr_qubits.size(), data_qubits.size(), data_array);
|
|
788
790
|
|
|
789
791
|
size_t controller_mask = make_controller_mask(control_qubits, total_qubit);
|
|
790
792
|
qram_permutation_impl(state, addr_qubits, data_qubits, data_array, total_qubit, controller_mask);
|
|
@@ -804,14 +806,17 @@ namespace uniqc {
|
|
|
804
806
|
double prob = (outcome == 0) ? p0 : (1.0 - p0);
|
|
805
807
|
double norm = std::sqrt(prob);
|
|
806
808
|
|
|
807
|
-
|
|
808
|
-
{
|
|
809
|
-
size_t
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
809
|
+
const size_t n_state = state.size();
|
|
810
|
+
parallel_for(0, n_state, [&](size_t begin, size_t end) {
|
|
811
|
+
for (size_t i = begin; i < end; ++i)
|
|
812
|
+
{
|
|
813
|
+
size_t bit = (i >> qn) & 1ull;
|
|
814
|
+
if (bit != outcome)
|
|
815
|
+
state[i] = 0;
|
|
816
|
+
else if (norm > 1e-14)
|
|
817
|
+
state[i] /= norm;
|
|
818
|
+
}
|
|
819
|
+
});
|
|
815
820
|
return outcome;
|
|
816
821
|
}
|
|
817
822
|
|
|
@@ -861,17 +866,26 @@ namespace uniqc {
|
|
|
861
866
|
std::vector<dtype> ret;
|
|
862
867
|
ret.resize(pow2(measure_list.size()));
|
|
863
868
|
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
+
const size_t n_state = pow2(total_qubit);
|
|
870
|
+
const size_t nchunk = parallel_worker_count(n_state);
|
|
871
|
+
std::vector<std::vector<dtype>> partial(nchunk, std::vector<dtype>(ret.size(), 0.0));
|
|
872
|
+
parallel_chunks(0, n_state, [&](size_t c, size_t b, size_t e) {
|
|
873
|
+
auto& local = partial[c];
|
|
874
|
+
for (size_t i = b; i < e; ++i)
|
|
875
|
+
{
|
|
876
|
+
size_t meas_idx = get_state_with_qubit(i, measure_map);
|
|
877
|
+
local[meas_idx] += abs_sqr(state[i]);
|
|
878
|
+
}
|
|
879
|
+
});
|
|
880
|
+
for (auto& p : partial)
|
|
881
|
+
for (size_t k = 0; k < ret.size(); ++k)
|
|
882
|
+
ret[k] += p[k];
|
|
869
883
|
return ret;
|
|
870
884
|
}
|
|
871
885
|
|
|
872
886
|
size_t StatevectorSimulator::measure_single_shot(size_t qubit)
|
|
873
887
|
{
|
|
874
|
-
return measure_single_shot({ qubit });
|
|
888
|
+
return measure_single_shot(std::vector{ qubit });
|
|
875
889
|
}
|
|
876
890
|
|
|
877
891
|
size_t StatevectorSimulator::measure_single_shot(const std::vector<size_t>& qubit)
|
|
@@ -55,6 +55,44 @@ namespace uniqc {
|
|
|
55
55
|
return mask;
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
+
void check_qram_data_validity(
|
|
59
|
+
size_t addr_size,
|
|
60
|
+
size_t data_size,
|
|
61
|
+
const std::vector<size_t>& data_array)
|
|
62
|
+
{
|
|
63
|
+
constexpr size_t size_t_bits = sizeof(size_t) * 8;
|
|
64
|
+
if (addr_size >= size_t_bits || data_size > size_t_bits)
|
|
65
|
+
{
|
|
66
|
+
auto errstr = fmt::format(
|
|
67
|
+
"QRAM address/data sizes ({}/{}) exceed the native size_t representation ({} bits).",
|
|
68
|
+
addr_size, data_size, size_t_bits);
|
|
69
|
+
ThrowInvalidArgument(errstr);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const size_t expected_size = size_t{ 1 } << addr_size;
|
|
73
|
+
if (data_array.size() != expected_size)
|
|
74
|
+
{
|
|
75
|
+
auto errstr = fmt::format(
|
|
76
|
+
"QRAM data array size ({}) does not match 2^addr_size ({}).",
|
|
77
|
+
data_array.size(), expected_size);
|
|
78
|
+
ThrowInvalidArgument(errstr);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (data_size == size_t_bits)
|
|
82
|
+
return;
|
|
83
|
+
const size_t value_limit = size_t{ 1 } << data_size;
|
|
84
|
+
for (size_t i = 0; i < data_array.size(); ++i)
|
|
85
|
+
{
|
|
86
|
+
if (data_array[i] >= value_limit)
|
|
87
|
+
{
|
|
88
|
+
auto errstr = fmt::format(
|
|
89
|
+
"QRAM data value ({}) at index {} does not fit data_size = {}.",
|
|
90
|
+
data_array[i], i, data_size);
|
|
91
|
+
ThrowInvalidArgument(errstr);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
58
96
|
void check_qram_qubit_validity(
|
|
59
97
|
const std::vector<size_t>& addr_qubits,
|
|
60
98
|
const std::vector<size_t>& data_qubits,
|
|
@@ -54,6 +54,14 @@ namespace uniqc {
|
|
|
54
54
|
const std::vector<size_t>& data_qubits,
|
|
55
55
|
const std::vector<size_t>& control_qubits);
|
|
56
56
|
|
|
57
|
+
/* Requires exactly one value per address and rejects values that do not
|
|
58
|
+
* fit the data register instead of indexing out of bounds or dropping
|
|
59
|
+
* high bits. Throws InvalidArgument on any violation. */
|
|
60
|
+
void check_qram_data_validity(
|
|
61
|
+
size_t addr_size,
|
|
62
|
+
size_t data_size,
|
|
63
|
+
const std::vector<size_t>& data_array);
|
|
64
|
+
|
|
57
65
|
// ============================================================
|
|
58
66
|
// Inline 2x2 statevector (matrix × vector) operation
|
|
59
67
|
// |ψ'⟩ = U |ψ⟩, where ψ = (a0, a1), U = [[u00,u01],[u10,u11]]
|