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.
Files changed (312) hide show
  1. uniqc_cppsimulator-1.1.0/.github/workflows/docs-pages.yml +83 -0
  2. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/.gitignore +10 -0
  3. uniqc_cppsimulator-1.1.0/CHANGELOG.md +45 -0
  4. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/CMakeLists.txt +1 -0
  5. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/PKG-INFO +81 -4
  6. uniqc_cppsimulator-1.1.0/README.md +150 -0
  7. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Pybinder/uniqc_cpp.cpp +10 -0
  8. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/src/CMakeLists.txt +4 -0
  9. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/src/density_operator_simulator.cpp +1 -0
  10. uniqc_cppsimulator-1.1.0/UniqcCpp/src/qopcode.cpp +5 -0
  11. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/src/simulator.cpp +30 -16
  12. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/src/simulator_common.cpp +38 -0
  13. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/src/simulator_common.h +8 -0
  14. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/src/simulator_density_op_impl.cpp +146 -134
  15. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/src/simulator_statevector_impl.cpp +396 -296
  16. uniqc_cppsimulator-1.1.0/UniqcCpp/src/threading.cpp +65 -0
  17. uniqc_cppsimulator-1.1.0/UniqcCpp/src/threading.h +76 -0
  18. uniqc_cppsimulator-1.1.0/UniqcCpp/src/threading_control.h +37 -0
  19. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/test/main.cpp +41 -0
  20. uniqc_cppsimulator-1.1.0/benchmark/README.md +76 -0
  21. uniqc_cppsimulator-1.1.0/benchmark/__init__.py +9 -0
  22. uniqc_cppsimulator-1.1.0/benchmark/__main__.py +3 -0
  23. uniqc_cppsimulator-1.1.0/benchmark/backends/__init__.py +19 -0
  24. uniqc_cppsimulator-1.1.0/benchmark/backends/aer.py +119 -0
  25. uniqc_cppsimulator-1.1.0/benchmark/backends/base.py +80 -0
  26. uniqc_cppsimulator-1.1.0/benchmark/backends/braket_sim.py +66 -0
  27. uniqc_cppsimulator-1.1.0/benchmark/backends/cirq_sim.py +116 -0
  28. uniqc_cppsimulator-1.1.0/benchmark/backends/lightning_sim.py +62 -0
  29. uniqc_cppsimulator-1.1.0/benchmark/backends/pyqrack_sim.py +54 -0
  30. uniqc_cppsimulator-1.1.0/benchmark/backends/qibo_sim.py +51 -0
  31. uniqc_cppsimulator-1.1.0/benchmark/backends/qsimcirq_sim.py +34 -0
  32. uniqc_cppsimulator-1.1.0/benchmark/backends/quimb_sim.py +33 -0
  33. uniqc_cppsimulator-1.1.0/benchmark/backends/qulacs_sim.py +109 -0
  34. uniqc_cppsimulator-1.1.0/benchmark/backends/qutip_sim.py +59 -0
  35. uniqc_cppsimulator-1.1.0/benchmark/backends/uniqc_dm.py +38 -0
  36. uniqc_cppsimulator-1.1.0/benchmark/backends/uniqc_sv.py +158 -0
  37. uniqc_cppsimulator-1.1.0/benchmark/backends/util.py +27 -0
  38. uniqc_cppsimulator-1.1.0/benchmark/circuits.py +78 -0
  39. uniqc_cppsimulator-1.1.0/benchmark/cli.py +120 -0
  40. uniqc_cppsimulator-1.1.0/benchmark/ir.py +136 -0
  41. uniqc_cppsimulator-1.1.0/benchmark/noise.py +12 -0
  42. uniqc_cppsimulator-1.1.0/benchmark/plotting.py +254 -0
  43. uniqc_cppsimulator-1.1.0/benchmark/presets.py +135 -0
  44. uniqc_cppsimulator-1.1.0/benchmark/registry.py +46 -0
  45. uniqc_cppsimulator-1.1.0/benchmark/report.py +222 -0
  46. uniqc_cppsimulator-1.1.0/benchmark/runner.py +268 -0
  47. uniqc_cppsimulator-1.1.0/benchmark/worker.py +203 -0
  48. uniqc_cppsimulator-1.1.0/doc/benchmark/README_summary.md +17 -0
  49. uniqc_cppsimulator-1.1.0/doc/benchmark/ideal_runtime_vs_qubits.png +0 -0
  50. uniqc_cppsimulator-1.1.0/doc/benchmark/noise_runtime_vs_qubits.png +0 -0
  51. uniqc_cppsimulator-1.1.0/doc/benchmark/results-2026-09-20.json +14319 -0
  52. uniqc_cppsimulator-1.1.0/doc/benchmark/results-2026-09-22.json +15815 -0
  53. uniqc_cppsimulator-1.1.0/doc/benchmark/sampling_throughput.png +0 -0
  54. uniqc_cppsimulator-1.1.0/doc/benchmark/thread_speedup.png +0 -0
  55. uniqc_cppsimulator-1.1.0/doc/benchmark.md +141 -0
  56. uniqc_cppsimulator-1.1.0/docs/Makefile +19 -0
  57. uniqc_cppsimulator-1.1.0/docs/api_benchmark.rst +88 -0
  58. uniqc_cppsimulator-1.1.0/docs/api_uniqc_cpp.rst +65 -0
  59. uniqc_cppsimulator-1.1.0/docs/benchmark.rst +88 -0
  60. uniqc_cppsimulator-1.1.0/docs/conf.py +64 -0
  61. uniqc_cppsimulator-1.1.0/docs/index.rst +61 -0
  62. uniqc_cppsimulator-1.1.0/docs/prepare.py +138 -0
  63. uniqc_cppsimulator-1.1.0/docs/requirements.txt +8 -0
  64. uniqc_cppsimulator-1.1.0/docs/usage.rst +117 -0
  65. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/pyproject.toml +6 -0
  66. uniqc_cppsimulator-1.1.0/tests/test_benchmark.py +69 -0
  67. uniqc_cppsimulator-1.1.0/tests/test_bindings.py +434 -0
  68. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/uniqc_cpp.pyi +14 -1
  69. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/uniqc_cppsimulator.egg-info/PKG-INFO +81 -4
  70. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/uniqc_cppsimulator.egg-info/SOURCES.txt +50 -0
  71. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/uniqc_cppsimulator.egg-info/scm_file_list.json +50 -0
  72. uniqc_cppsimulator-1.1.0/uniqc_cppsimulator.egg-info/scm_version.json +8 -0
  73. uniqc_cppsimulator-1.0.0/CHANGELOG.md +0 -16
  74. uniqc_cppsimulator-1.0.0/README.md +0 -73
  75. uniqc_cppsimulator-1.0.0/UniqcCpp/src/qopcode.cpp +0 -108
  76. uniqc_cppsimulator-1.0.0/tests/test_bindings.py +0 -141
  77. uniqc_cppsimulator-1.0.0/uniqc_cppsimulator.egg-info/scm_version.json +0 -8
  78. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/.github/workflows/build_and_test.yml +0 -0
  79. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/.github/workflows/pypi-publish.yml +0 -0
  80. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/.github/workflows/python_build_wheel.yml +0 -0
  81. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/LICENSE +0 -0
  82. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/CMakeLists.txt +0 -0
  83. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Pybinder/CMakeLists.txt +0 -0
  84. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/CMakeLists.txt +0 -0
  85. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/.clang-format +0 -0
  86. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/.github/issue_template.md +0 -0
  87. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/.github/pull_request_template.md +0 -0
  88. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/.github/workflows/cifuzz.yml +0 -0
  89. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/.github/workflows/doc.yml +0 -0
  90. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/.github/workflows/linux.yml +0 -0
  91. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/.github/workflows/macos.yml +0 -0
  92. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/.github/workflows/windows.yml +0 -0
  93. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/.gitignore +0 -0
  94. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/CMakeLists.txt +0 -0
  95. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/CONTRIBUTING.md +0 -0
  96. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/ChangeLog.rst +0 -0
  97. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/LICENSE.rst +0 -0
  98. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/README.rst +0 -0
  99. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/CMakeLists.txt +0 -0
  100. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/_static/bootstrap.min.js +0 -0
  101. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/_static/breathe.css +0 -0
  102. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/_static/fonts/glyphicons-halflings-regular.eot +0 -0
  103. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/_static/fonts/glyphicons-halflings-regular.svg +0 -0
  104. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/_static/fonts/glyphicons-halflings-regular.ttf +0 -0
  105. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/_static/fonts/glyphicons-halflings-regular.woff +0 -0
  106. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/_templates/layout.html +0 -0
  107. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/_templates/search.html +0 -0
  108. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/api.rst +0 -0
  109. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/basic-bootstrap/README +0 -0
  110. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/basic-bootstrap/layout.html +0 -0
  111. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/basic-bootstrap/theme.conf +0 -0
  112. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/alerts.less +0 -0
  113. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/badges.less +0 -0
  114. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/bootstrap.less +0 -0
  115. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/breadcrumbs.less +0 -0
  116. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/button-groups.less +0 -0
  117. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/buttons.less +0 -0
  118. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/carousel.less +0 -0
  119. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/close.less +0 -0
  120. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/code.less +0 -0
  121. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/component-animations.less +0 -0
  122. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/dropdowns.less +0 -0
  123. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/forms.less +0 -0
  124. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/glyphicons.less +0 -0
  125. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/grid.less +0 -0
  126. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/input-groups.less +0 -0
  127. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/jumbotron.less +0 -0
  128. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/labels.less +0 -0
  129. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/list-group.less +0 -0
  130. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/media.less +0 -0
  131. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/alerts.less +0 -0
  132. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/background-variant.less +0 -0
  133. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/border-radius.less +0 -0
  134. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/buttons.less +0 -0
  135. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/center-block.less +0 -0
  136. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/clearfix.less +0 -0
  137. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/forms.less +0 -0
  138. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/gradients.less +0 -0
  139. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/grid-framework.less +0 -0
  140. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/grid.less +0 -0
  141. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/hide-text.less +0 -0
  142. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/image.less +0 -0
  143. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/labels.less +0 -0
  144. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/list-group.less +0 -0
  145. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/nav-divider.less +0 -0
  146. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/nav-vertical-align.less +0 -0
  147. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/opacity.less +0 -0
  148. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/pagination.less +0 -0
  149. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/panels.less +0 -0
  150. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/progress-bar.less +0 -0
  151. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/reset-filter.less +0 -0
  152. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/resize.less +0 -0
  153. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/responsive-visibility.less +0 -0
  154. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/size.less +0 -0
  155. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/tab-focus.less +0 -0
  156. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/table-row.less +0 -0
  157. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/text-emphasis.less +0 -0
  158. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/text-overflow.less +0 -0
  159. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins/vendor-prefixes.less +0 -0
  160. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/mixins.less +0 -0
  161. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/modals.less +0 -0
  162. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/navbar.less +0 -0
  163. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/navs.less +0 -0
  164. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/normalize.less +0 -0
  165. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/pager.less +0 -0
  166. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/pagination.less +0 -0
  167. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/panels.less +0 -0
  168. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/popovers.less +0 -0
  169. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/print.less +0 -0
  170. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/progress-bars.less +0 -0
  171. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/responsive-embed.less +0 -0
  172. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/responsive-utilities.less +0 -0
  173. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/scaffolding.less +0 -0
  174. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/tables.less +0 -0
  175. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/theme.less +0 -0
  176. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/thumbnails.less +0 -0
  177. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/tooltip.less +0 -0
  178. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/type.less +0 -0
  179. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/utilities.less +0 -0
  180. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/variables.less +0 -0
  181. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/bootstrap/wells.less +0 -0
  182. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/build.py +0 -0
  183. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/conf.py +0 -0
  184. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/contents.rst +0 -0
  185. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/fmt.less +0 -0
  186. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/index.rst +0 -0
  187. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/python-license.txt +0 -0
  188. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/syntax.rst +0 -0
  189. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/doc/usage.rst +0 -0
  190. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/include/fmt/args.h +0 -0
  191. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/include/fmt/chrono.h +0 -0
  192. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/include/fmt/color.h +0 -0
  193. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/include/fmt/compile.h +0 -0
  194. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/include/fmt/core.h +0 -0
  195. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/include/fmt/format-inl.h +0 -0
  196. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/include/fmt/format.h +0 -0
  197. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/include/fmt/os.h +0 -0
  198. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/include/fmt/ostream.h +0 -0
  199. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/include/fmt/printf.h +0 -0
  200. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/include/fmt/ranges.h +0 -0
  201. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/include/fmt/std.h +0 -0
  202. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/include/fmt/xchar.h +0 -0
  203. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/src/fmt.cc +0 -0
  204. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/src/format.cc +0 -0
  205. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/src/os.cc +0 -0
  206. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/Android.mk +0 -0
  207. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/AndroidManifest.xml +0 -0
  208. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/C++.sublime-syntax +0 -0
  209. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/README +0 -0
  210. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/Vagrantfile +0 -0
  211. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/bazel/.bazelversion +0 -0
  212. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/bazel/BUILD.bazel +0 -0
  213. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/bazel/README.md +0 -0
  214. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/bazel/WORKSPACE.bazel +0 -0
  215. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/build-docs.py +0 -0
  216. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/build.gradle +0 -0
  217. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/cmake/FindSetEnv.cmake +0 -0
  218. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/cmake/JoinPaths.cmake +0 -0
  219. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/cmake/fmt-config.cmake.in +0 -0
  220. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/cmake/fmt.pc.in +0 -0
  221. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/compute-powers.py +0 -0
  222. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/docopt.py +0 -0
  223. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/manage.py +0 -0
  224. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/printable.py +0 -0
  225. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/rst2md.py +0 -0
  226. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/rtd/conf.py +0 -0
  227. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/rtd/index.rst +0 -0
  228. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/rtd/theme/layout.html +0 -0
  229. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/support/rtd/theme/theme.conf +0 -0
  230. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/CMakeLists.txt +0 -0
  231. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/add-subdirectory-test/CMakeLists.txt +0 -0
  232. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/add-subdirectory-test/main.cc +0 -0
  233. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/args-test.cc +0 -0
  234. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/assert-test.cc +0 -0
  235. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/chrono-test.cc +0 -0
  236. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/color-test.cc +0 -0
  237. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/compile-error-test/CMakeLists.txt +0 -0
  238. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/compile-fp-test.cc +0 -0
  239. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/compile-test.cc +0 -0
  240. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/core-test.cc +0 -0
  241. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/cuda-test/CMakeLists.txt +0 -0
  242. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/cuda-test/cpp14.cc +0 -0
  243. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/cuda-test/cuda-cpp14.cu +0 -0
  244. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/detect-stdfs.cc +0 -0
  245. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/enforce-checks-test.cc +0 -0
  246. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/find-package-test/CMakeLists.txt +0 -0
  247. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/find-package-test/main.cc +0 -0
  248. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/format-impl-test.cc +0 -0
  249. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/format-test.cc +0 -0
  250. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/fuzzing/.gitignore +0 -0
  251. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/fuzzing/CMakeLists.txt +0 -0
  252. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/fuzzing/README.md +0 -0
  253. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/fuzzing/build.sh +0 -0
  254. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/fuzzing/chrono-duration.cc +0 -0
  255. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/fuzzing/chrono-timepoint.cc +0 -0
  256. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/fuzzing/float.cc +0 -0
  257. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/fuzzing/fuzzer-common.h +0 -0
  258. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/fuzzing/main.cc +0 -0
  259. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/fuzzing/named-arg.cc +0 -0
  260. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/fuzzing/one-arg.cc +0 -0
  261. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/fuzzing/two-args.cc +0 -0
  262. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/gtest/.clang-format +0 -0
  263. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/gtest/CMakeLists.txt +0 -0
  264. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/gtest/gmock/gmock.h +0 -0
  265. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/gtest/gmock-gtest-all.cc +0 -0
  266. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/gtest/gtest/gtest-spi.h +0 -0
  267. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/gtest/gtest/gtest.h +0 -0
  268. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/gtest-extra-test.cc +0 -0
  269. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/gtest-extra.cc +0 -0
  270. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/gtest-extra.h +0 -0
  271. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/header-only-test.cc +0 -0
  272. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/mock-allocator.h +0 -0
  273. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/module-test.cc +0 -0
  274. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/noexception-test.cc +0 -0
  275. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/os-test.cc +0 -0
  276. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/ostream-test.cc +0 -0
  277. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/posix-mock-test.cc +0 -0
  278. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/posix-mock.h +0 -0
  279. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/printf-test.cc +0 -0
  280. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/ranges-odr-test.cc +0 -0
  281. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/ranges-test.cc +0 -0
  282. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/scan-test.cc +0 -0
  283. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/scan.h +0 -0
  284. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/static-export-test/CMakeLists.txt +0 -0
  285. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/static-export-test/library.cc +0 -0
  286. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/static-export-test/main.cc +0 -0
  287. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/std-test.cc +0 -0
  288. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/test-assert.h +0 -0
  289. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/test-main.cc +0 -0
  290. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/unicode-test.cc +0 -0
  291. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/util.cc +0 -0
  292. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/util.h +0 -0
  293. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/Thirdparty/fmt/test/xchar-test.cc +0 -0
  294. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/src/basic_math.cpp +0 -0
  295. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/src/basic_math.h +0 -0
  296. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/src/density_operator_simulator.h +0 -0
  297. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/src/errors.h +0 -0
  298. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/src/qopcode.h +0 -0
  299. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/src/rng.h +0 -0
  300. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/src/simulator.h +0 -0
  301. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/src/simulator_density_op_impl.h +0 -0
  302. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/src/simulator_impl.h +0 -0
  303. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/src/simulator_statevector_impl.h +0 -0
  304. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/UniqcCpp/test/CMakeLists.txt +0 -0
  305. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/scripts/check_release.py +0 -0
  306. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/scripts/check_wheel_abi.py +0 -0
  307. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/scripts/stubgen.py +0 -0
  308. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/setup.cfg +0 -0
  309. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/setup.py +0 -0
  310. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/uniqc_cppsimulator.egg-info/dependency_links.txt +0 -0
  311. {uniqc_cppsimulator-1.0.0 → uniqc_cppsimulator-1.1.0}/uniqc_cppsimulator.egg-info/not-zip-safe +0 -0
  312. {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 一起发布
@@ -29,5 +29,6 @@ endif()
29
29
 
30
30
  set(PYBIND11_FINDPYTHON ON)
31
31
  find_package(pybind11 CONFIG REQUIRED)
32
+ find_package(Threads REQUIRED)
32
33
 
33
34
  add_subdirectory(UniqcCpp)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: uniqc-cppsimulator
3
- Version: 1.0.0
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
+ [![Docs](https://img.shields.io/badge/docs-GitHub%20Pages-blue)](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/` 目录,自 v1.0.0 起拆分为独立仓库、独立版本、独立发布。UnifiedQuantum 通过 PyPI 依赖本包,二者接口保持兼容。
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
+ [![Docs](https://img.shields.io/badge/docs-GitHub%20Pages-blue)](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)
@@ -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
 
@@ -0,0 +1,5 @@
1
+ #include "qopcode.h"
2
+
3
+ namespace uniqc {
4
+
5
+ } // namespace uniqc
@@ -1,4 +1,5 @@
1
- #include "simulator.h"
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 static std::vector<double> p_(15, p / 15);
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
- for (size_t i = 0; i < state.size(); ++i)
808
- {
809
- size_t bit = (i >> qn) & 1ull;
810
- if (bit != outcome)
811
- state[i] = 0;
812
- else if (norm > 1e-14)
813
- state[i] /= norm;
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
- for (size_t i = 0; i < pow2(total_qubit); ++i)
865
- {
866
- size_t meas_idx = get_state_with_qubit(i, measure_map);
867
- ret[meas_idx] += abs_sqr(state[i]);
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]]