mqt-core 3.3.2__cp312-cp312-win_amd64.whl

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 (537) hide show
  1. mqt/core/__init__.py +89 -0
  2. mqt/core/__main__.py +55 -0
  3. mqt/core/_commands.py +52 -0
  4. mqt/core/_compat/__init__.py +11 -0
  5. mqt/core/_compat/typing.py +29 -0
  6. mqt/core/_version.py +34 -0
  7. mqt/core/_version.pyi +12 -0
  8. mqt/core/bin/mqt-core-algorithms.dll +0 -0
  9. mqt/core/bin/mqt-core-circuit-optimizer.dll +0 -0
  10. mqt/core/bin/mqt-core-dd.dll +0 -0
  11. mqt/core/bin/mqt-core-ds.dll +0 -0
  12. mqt/core/bin/mqt-core-fomac.dll +0 -0
  13. mqt/core/bin/mqt-core-ir.dll +0 -0
  14. mqt/core/bin/mqt-core-na-fomac.dll +0 -0
  15. mqt/core/bin/mqt-core-na.dll +0 -0
  16. mqt/core/bin/mqt-core-qasm.dll +0 -0
  17. mqt/core/bin/mqt-core-qdmi-driver.dll +0 -0
  18. mqt/core/bin/mqt-core-qdmi-na-device.dll +0 -0
  19. mqt/core/bin/mqt-core-zx.dll +0 -0
  20. mqt/core/dd.cp312-win_amd64.pyd +0 -0
  21. mqt/core/dd.pyi +1016 -0
  22. mqt/core/dd_evaluation.py +368 -0
  23. mqt/core/fomac.cp312-win_amd64.pyd +0 -0
  24. mqt/core/fomac.pyi +125 -0
  25. mqt/core/include/mqt-core/algorithms/BernsteinVazirani.hpp +39 -0
  26. mqt/core/include/mqt-core/algorithms/GHZState.hpp +18 -0
  27. mqt/core/include/mqt-core/algorithms/Grover.hpp +33 -0
  28. mqt/core/include/mqt-core/algorithms/QFT.hpp +21 -0
  29. mqt/core/include/mqt-core/algorithms/QPE.hpp +30 -0
  30. mqt/core/include/mqt-core/algorithms/RandomCliffordCircuit.hpp +22 -0
  31. mqt/core/include/mqt-core/algorithms/StatePreparation.hpp +43 -0
  32. mqt/core/include/mqt-core/algorithms/WState.hpp +18 -0
  33. mqt/core/include/mqt-core/algorithms/mqt_core_algorithms_export.h +43 -0
  34. mqt/core/include/mqt-core/boost/config/abi/borland_prefix.hpp +27 -0
  35. mqt/core/include/mqt-core/boost/config/abi/borland_suffix.hpp +12 -0
  36. mqt/core/include/mqt-core/boost/config/abi/msvc_prefix.hpp +22 -0
  37. mqt/core/include/mqt-core/boost/config/abi/msvc_suffix.hpp +8 -0
  38. mqt/core/include/mqt-core/boost/config/abi_prefix.hpp +25 -0
  39. mqt/core/include/mqt-core/boost/config/abi_suffix.hpp +25 -0
  40. mqt/core/include/mqt-core/boost/config/assert_cxx03.hpp +211 -0
  41. mqt/core/include/mqt-core/boost/config/assert_cxx11.hpp +212 -0
  42. mqt/core/include/mqt-core/boost/config/assert_cxx14.hpp +47 -0
  43. mqt/core/include/mqt-core/boost/config/assert_cxx17.hpp +65 -0
  44. mqt/core/include/mqt-core/boost/config/assert_cxx20.hpp +59 -0
  45. mqt/core/include/mqt-core/boost/config/assert_cxx23.hpp +41 -0
  46. mqt/core/include/mqt-core/boost/config/assert_cxx98.hpp +23 -0
  47. mqt/core/include/mqt-core/boost/config/auto_link.hpp +525 -0
  48. mqt/core/include/mqt-core/boost/config/compiler/borland.hpp +342 -0
  49. mqt/core/include/mqt-core/boost/config/compiler/clang.hpp +370 -0
  50. mqt/core/include/mqt-core/boost/config/compiler/clang_version.hpp +89 -0
  51. mqt/core/include/mqt-core/boost/config/compiler/codegear.hpp +389 -0
  52. mqt/core/include/mqt-core/boost/config/compiler/comeau.hpp +59 -0
  53. mqt/core/include/mqt-core/boost/config/compiler/common_edg.hpp +185 -0
  54. mqt/core/include/mqt-core/boost/config/compiler/compaq_cxx.hpp +19 -0
  55. mqt/core/include/mqt-core/boost/config/compiler/cray.hpp +446 -0
  56. mqt/core/include/mqt-core/boost/config/compiler/diab.hpp +26 -0
  57. mqt/core/include/mqt-core/boost/config/compiler/digitalmars.hpp +146 -0
  58. mqt/core/include/mqt-core/boost/config/compiler/gcc.hpp +386 -0
  59. mqt/core/include/mqt-core/boost/config/compiler/gcc_xml.hpp +115 -0
  60. mqt/core/include/mqt-core/boost/config/compiler/greenhills.hpp +28 -0
  61. mqt/core/include/mqt-core/boost/config/compiler/hp_acc.hpp +153 -0
  62. mqt/core/include/mqt-core/boost/config/compiler/intel.hpp +577 -0
  63. mqt/core/include/mqt-core/boost/config/compiler/kai.hpp +33 -0
  64. mqt/core/include/mqt-core/boost/config/compiler/metrowerks.hpp +201 -0
  65. mqt/core/include/mqt-core/boost/config/compiler/mpw.hpp +143 -0
  66. mqt/core/include/mqt-core/boost/config/compiler/nvcc.hpp +64 -0
  67. mqt/core/include/mqt-core/boost/config/compiler/pathscale.hpp +141 -0
  68. mqt/core/include/mqt-core/boost/config/compiler/pgi.hpp +23 -0
  69. mqt/core/include/mqt-core/boost/config/compiler/sgi_mipspro.hpp +29 -0
  70. mqt/core/include/mqt-core/boost/config/compiler/sunpro_cc.hpp +225 -0
  71. mqt/core/include/mqt-core/boost/config/compiler/vacpp.hpp +189 -0
  72. mqt/core/include/mqt-core/boost/config/compiler/visualc.hpp +398 -0
  73. mqt/core/include/mqt-core/boost/config/compiler/xlcpp.hpp +303 -0
  74. mqt/core/include/mqt-core/boost/config/compiler/xlcpp_zos.hpp +174 -0
  75. mqt/core/include/mqt-core/boost/config/detail/cxx_composite.hpp +218 -0
  76. mqt/core/include/mqt-core/boost/config/detail/posix_features.hpp +95 -0
  77. mqt/core/include/mqt-core/boost/config/detail/select_compiler_config.hpp +157 -0
  78. mqt/core/include/mqt-core/boost/config/detail/select_platform_config.hpp +147 -0
  79. mqt/core/include/mqt-core/boost/config/detail/select_stdlib_config.hpp +121 -0
  80. mqt/core/include/mqt-core/boost/config/detail/suffix.hpp +1334 -0
  81. mqt/core/include/mqt-core/boost/config/header_deprecated.hpp +26 -0
  82. mqt/core/include/mqt-core/boost/config/helper_macros.hpp +37 -0
  83. mqt/core/include/mqt-core/boost/config/no_tr1/cmath.hpp +28 -0
  84. mqt/core/include/mqt-core/boost/config/no_tr1/complex.hpp +28 -0
  85. mqt/core/include/mqt-core/boost/config/no_tr1/functional.hpp +28 -0
  86. mqt/core/include/mqt-core/boost/config/no_tr1/memory.hpp +28 -0
  87. mqt/core/include/mqt-core/boost/config/no_tr1/utility.hpp +28 -0
  88. mqt/core/include/mqt-core/boost/config/platform/aix.hpp +33 -0
  89. mqt/core/include/mqt-core/boost/config/platform/amigaos.hpp +15 -0
  90. mqt/core/include/mqt-core/boost/config/platform/beos.hpp +26 -0
  91. mqt/core/include/mqt-core/boost/config/platform/bsd.hpp +83 -0
  92. mqt/core/include/mqt-core/boost/config/platform/cloudabi.hpp +18 -0
  93. mqt/core/include/mqt-core/boost/config/platform/cray.hpp +18 -0
  94. mqt/core/include/mqt-core/boost/config/platform/cygwin.hpp +71 -0
  95. mqt/core/include/mqt-core/boost/config/platform/haiku.hpp +31 -0
  96. mqt/core/include/mqt-core/boost/config/platform/hpux.hpp +87 -0
  97. mqt/core/include/mqt-core/boost/config/platform/irix.hpp +31 -0
  98. mqt/core/include/mqt-core/boost/config/platform/linux.hpp +106 -0
  99. mqt/core/include/mqt-core/boost/config/platform/macos.hpp +87 -0
  100. mqt/core/include/mqt-core/boost/config/platform/qnxnto.hpp +31 -0
  101. mqt/core/include/mqt-core/boost/config/platform/solaris.hpp +31 -0
  102. mqt/core/include/mqt-core/boost/config/platform/symbian.hpp +97 -0
  103. mqt/core/include/mqt-core/boost/config/platform/vms.hpp +25 -0
  104. mqt/core/include/mqt-core/boost/config/platform/vxworks.hpp +422 -0
  105. mqt/core/include/mqt-core/boost/config/platform/wasm.hpp +23 -0
  106. mqt/core/include/mqt-core/boost/config/platform/win32.hpp +90 -0
  107. mqt/core/include/mqt-core/boost/config/platform/zos.hpp +32 -0
  108. mqt/core/include/mqt-core/boost/config/pragma_message.hpp +31 -0
  109. mqt/core/include/mqt-core/boost/config/requires_threads.hpp +92 -0
  110. mqt/core/include/mqt-core/boost/config/stdlib/dinkumware.hpp +324 -0
  111. mqt/core/include/mqt-core/boost/config/stdlib/libcomo.hpp +93 -0
  112. mqt/core/include/mqt-core/boost/config/stdlib/libcpp.hpp +180 -0
  113. mqt/core/include/mqt-core/boost/config/stdlib/libstdcpp3.hpp +482 -0
  114. mqt/core/include/mqt-core/boost/config/stdlib/modena.hpp +79 -0
  115. mqt/core/include/mqt-core/boost/config/stdlib/msl.hpp +98 -0
  116. mqt/core/include/mqt-core/boost/config/stdlib/roguewave.hpp +208 -0
  117. mqt/core/include/mqt-core/boost/config/stdlib/sgi.hpp +168 -0
  118. mqt/core/include/mqt-core/boost/config/stdlib/stlport.hpp +258 -0
  119. mqt/core/include/mqt-core/boost/config/stdlib/vacpp.hpp +74 -0
  120. mqt/core/include/mqt-core/boost/config/stdlib/xlcpp_zos.hpp +61 -0
  121. mqt/core/include/mqt-core/boost/config/user.hpp +133 -0
  122. mqt/core/include/mqt-core/boost/config/warning_disable.hpp +47 -0
  123. mqt/core/include/mqt-core/boost/config/workaround.hpp +305 -0
  124. mqt/core/include/mqt-core/boost/config.hpp +67 -0
  125. mqt/core/include/mqt-core/boost/cstdint.hpp +556 -0
  126. mqt/core/include/mqt-core/boost/cxx11_char_types.hpp +70 -0
  127. mqt/core/include/mqt-core/boost/detail/workaround.hpp +10 -0
  128. mqt/core/include/mqt-core/boost/limits.hpp +146 -0
  129. mqt/core/include/mqt-core/boost/multiprecision/complex128.hpp +24 -0
  130. mqt/core/include/mqt-core/boost/multiprecision/complex_adaptor.hpp +1046 -0
  131. mqt/core/include/mqt-core/boost/multiprecision/concepts/mp_number_archetypes.hpp +257 -0
  132. mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float/io.hpp +698 -0
  133. mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float/transcendental.hpp +157 -0
  134. mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float.hpp +2297 -0
  135. mqt/core/include/mqt-core/boost/multiprecision/cpp_complex.hpp +12 -0
  136. mqt/core/include/mqt-core/boost/multiprecision/cpp_dec_float.hpp +3690 -0
  137. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/add.hpp +368 -0
  138. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/add_unsigned.hpp +387 -0
  139. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/bitwise.hpp +889 -0
  140. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/checked.hpp +178 -0
  141. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/comparison.hpp +374 -0
  142. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/cpp_int_config.hpp +161 -0
  143. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/divide.hpp +703 -0
  144. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/import_export.hpp +248 -0
  145. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/intel_intrinsics.hpp +138 -0
  146. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/limits.hpp +282 -0
  147. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/literals.hpp +295 -0
  148. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/misc.hpp +1457 -0
  149. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/multiply.hpp +848 -0
  150. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/serialize.hpp +211 -0
  151. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/value_pack.hpp +42 -0
  152. mqt/core/include/mqt-core/boost/multiprecision/cpp_int.hpp +2360 -0
  153. mqt/core/include/mqt-core/boost/multiprecision/debug_adaptor.hpp +760 -0
  154. mqt/core/include/mqt-core/boost/multiprecision/detail/assert.hpp +29 -0
  155. mqt/core/include/mqt-core/boost/multiprecision/detail/atomic.hpp +62 -0
  156. mqt/core/include/mqt-core/boost/multiprecision/detail/bitscan.hpp +317 -0
  157. mqt/core/include/mqt-core/boost/multiprecision/detail/check_cpp11_config.hpp +64 -0
  158. mqt/core/include/mqt-core/boost/multiprecision/detail/constexpr.hpp +88 -0
  159. mqt/core/include/mqt-core/boost/multiprecision/detail/default_ops.hpp +4052 -0
  160. mqt/core/include/mqt-core/boost/multiprecision/detail/digits.hpp +49 -0
  161. mqt/core/include/mqt-core/boost/multiprecision/detail/dynamic_array.hpp +44 -0
  162. mqt/core/include/mqt-core/boost/multiprecision/detail/empty_value.hpp +87 -0
  163. mqt/core/include/mqt-core/boost/multiprecision/detail/endian.hpp +35 -0
  164. mqt/core/include/mqt-core/boost/multiprecision/detail/et_ops.hpp +1831 -0
  165. mqt/core/include/mqt-core/boost/multiprecision/detail/float128_functions.hpp +95 -0
  166. mqt/core/include/mqt-core/boost/multiprecision/detail/float_string_cvt.hpp +333 -0
  167. mqt/core/include/mqt-core/boost/multiprecision/detail/fpclassify.hpp +101 -0
  168. mqt/core/include/mqt-core/boost/multiprecision/detail/functions/constants.hpp +288 -0
  169. mqt/core/include/mqt-core/boost/multiprecision/detail/functions/pow.hpp +905 -0
  170. mqt/core/include/mqt-core/boost/multiprecision/detail/functions/trig.hpp +1058 -0
  171. mqt/core/include/mqt-core/boost/multiprecision/detail/functions/trunc.hpp +82 -0
  172. mqt/core/include/mqt-core/boost/multiprecision/detail/generic_interconvert.hpp +687 -0
  173. mqt/core/include/mqt-core/boost/multiprecision/detail/hash.hpp +56 -0
  174. mqt/core/include/mqt-core/boost/multiprecision/detail/integer_ops.hpp +474 -0
  175. mqt/core/include/mqt-core/boost/multiprecision/detail/itos.hpp +39 -0
  176. mqt/core/include/mqt-core/boost/multiprecision/detail/min_max.hpp +106 -0
  177. mqt/core/include/mqt-core/boost/multiprecision/detail/no_et_ops.hpp +661 -0
  178. mqt/core/include/mqt-core/boost/multiprecision/detail/no_exceptions_support.hpp +55 -0
  179. mqt/core/include/mqt-core/boost/multiprecision/detail/number_base.hpp +1656 -0
  180. mqt/core/include/mqt-core/boost/multiprecision/detail/number_compare.hpp +848 -0
  181. mqt/core/include/mqt-core/boost/multiprecision/detail/precision.hpp +313 -0
  182. mqt/core/include/mqt-core/boost/multiprecision/detail/rebind.hpp +19 -0
  183. mqt/core/include/mqt-core/boost/multiprecision/detail/standalone_config.hpp +148 -0
  184. mqt/core/include/mqt-core/boost/multiprecision/detail/static_array.hpp +42 -0
  185. mqt/core/include/mqt-core/boost/multiprecision/detail/string_helpers.hpp +48 -0
  186. mqt/core/include/mqt-core/boost/multiprecision/detail/tables.hpp +80 -0
  187. mqt/core/include/mqt-core/boost/multiprecision/detail/ublas_interop.hpp +75 -0
  188. mqt/core/include/mqt-core/boost/multiprecision/detail/uniform_int_distribution.hpp +212 -0
  189. mqt/core/include/mqt-core/boost/multiprecision/detail/utype_helper.hpp +374 -0
  190. mqt/core/include/mqt-core/boost/multiprecision/eigen.hpp +248 -0
  191. mqt/core/include/mqt-core/boost/multiprecision/float128.hpp +920 -0
  192. mqt/core/include/mqt-core/boost/multiprecision/fwd.hpp +268 -0
  193. mqt/core/include/mqt-core/boost/multiprecision/gmp.hpp +4060 -0
  194. mqt/core/include/mqt-core/boost/multiprecision/integer.hpp +363 -0
  195. mqt/core/include/mqt-core/boost/multiprecision/logged_adaptor.hpp +834 -0
  196. mqt/core/include/mqt-core/boost/multiprecision/miller_rabin.hpp +221 -0
  197. mqt/core/include/mqt-core/boost/multiprecision/mpc.hpp +1721 -0
  198. mqt/core/include/mqt-core/boost/multiprecision/mpfi.hpp +2559 -0
  199. mqt/core/include/mqt-core/boost/multiprecision/mpfr.hpp +3644 -0
  200. mqt/core/include/mqt-core/boost/multiprecision/number.hpp +2500 -0
  201. mqt/core/include/mqt-core/boost/multiprecision/random.hpp +23 -0
  202. mqt/core/include/mqt-core/boost/multiprecision/rational_adaptor.hpp +1289 -0
  203. mqt/core/include/mqt-core/boost/multiprecision/tommath.hpp +1034 -0
  204. mqt/core/include/mqt-core/boost/multiprecision/traits/explicit_conversion.hpp +67 -0
  205. mqt/core/include/mqt-core/boost/multiprecision/traits/extract_exponent_type.hpp +28 -0
  206. mqt/core/include/mqt-core/boost/multiprecision/traits/is_backend.hpp +91 -0
  207. mqt/core/include/mqt-core/boost/multiprecision/traits/is_byte_container.hpp +51 -0
  208. mqt/core/include/mqt-core/boost/multiprecision/traits/is_complex.hpp +22 -0
  209. mqt/core/include/mqt-core/boost/multiprecision/traits/is_convertible_arithmetic.hpp +51 -0
  210. mqt/core/include/mqt-core/boost/multiprecision/traits/is_restricted_conversion.hpp +47 -0
  211. mqt/core/include/mqt-core/boost/multiprecision/traits/is_variable_precision.hpp +25 -0
  212. mqt/core/include/mqt-core/boost/multiprecision/traits/max_digits10.hpp +79 -0
  213. mqt/core/include/mqt-core/boost/multiprecision/traits/std_integer_traits.hpp +90 -0
  214. mqt/core/include/mqt-core/boost/multiprecision/traits/transcendental_reduction_type.hpp +21 -0
  215. mqt/core/include/mqt-core/boost/version.hpp +32 -0
  216. mqt/core/include/mqt-core/circuit_optimizer/CircuitOptimizer.hpp +119 -0
  217. mqt/core/include/mqt-core/circuit_optimizer/mqt_core_circuit_optimizer_export.h +43 -0
  218. mqt/core/include/mqt-core/datastructures/DirectedAcyclicGraph.hpp +117 -0
  219. mqt/core/include/mqt-core/datastructures/DirectedGraph.hpp +158 -0
  220. mqt/core/include/mqt-core/datastructures/DisjointSet.hpp +50 -0
  221. mqt/core/include/mqt-core/datastructures/Layer.hpp +172 -0
  222. mqt/core/include/mqt-core/datastructures/SymmetricMatrix.hpp +57 -0
  223. mqt/core/include/mqt-core/datastructures/UndirectedGraph.hpp +227 -0
  224. mqt/core/include/mqt-core/datastructures/mqt_core_ds_export.h +43 -0
  225. mqt/core/include/mqt-core/dd/Approximation.hpp +45 -0
  226. mqt/core/include/mqt-core/dd/CachedEdge.hpp +174 -0
  227. mqt/core/include/mqt-core/dd/Complex.hpp +165 -0
  228. mqt/core/include/mqt-core/dd/ComplexNumbers.hpp +150 -0
  229. mqt/core/include/mqt-core/dd/ComplexValue.hpp +184 -0
  230. mqt/core/include/mqt-core/dd/ComputeTable.hpp +183 -0
  231. mqt/core/include/mqt-core/dd/DDDefinitions.hpp +139 -0
  232. mqt/core/include/mqt-core/dd/DDpackageConfig.hpp +104 -0
  233. mqt/core/include/mqt-core/dd/DensityNoiseTable.hpp +114 -0
  234. mqt/core/include/mqt-core/dd/Edge.hpp +416 -0
  235. mqt/core/include/mqt-core/dd/Export.hpp +438 -0
  236. mqt/core/include/mqt-core/dd/FunctionalityConstruction.hpp +75 -0
  237. mqt/core/include/mqt-core/dd/GateMatrixDefinitions.hpp +43 -0
  238. mqt/core/include/mqt-core/dd/LinkedListBase.hpp +45 -0
  239. mqt/core/include/mqt-core/dd/MemoryManager.hpp +193 -0
  240. mqt/core/include/mqt-core/dd/Node.hpp +223 -0
  241. mqt/core/include/mqt-core/dd/NoiseFunctionality.hpp +144 -0
  242. mqt/core/include/mqt-core/dd/Operations.hpp +306 -0
  243. mqt/core/include/mqt-core/dd/Package.hpp +2036 -0
  244. mqt/core/include/mqt-core/dd/Package_fwd.hpp +22 -0
  245. mqt/core/include/mqt-core/dd/RealNumber.hpp +255 -0
  246. mqt/core/include/mqt-core/dd/RealNumberUniqueTable.hpp +217 -0
  247. mqt/core/include/mqt-core/dd/Simulation.hpp +98 -0
  248. mqt/core/include/mqt-core/dd/StateGeneration.hpp +143 -0
  249. mqt/core/include/mqt-core/dd/StochasticNoiseOperationTable.hpp +88 -0
  250. mqt/core/include/mqt-core/dd/UnaryComputeTable.hpp +121 -0
  251. mqt/core/include/mqt-core/dd/UniqueTable.hpp +243 -0
  252. mqt/core/include/mqt-core/dd/mqt_core_dd_export.h +43 -0
  253. mqt/core/include/mqt-core/dd/statistics/MemoryManagerStatistics.hpp +84 -0
  254. mqt/core/include/mqt-core/dd/statistics/PackageStatistics.hpp +55 -0
  255. mqt/core/include/mqt-core/dd/statistics/Statistics.hpp +48 -0
  256. mqt/core/include/mqt-core/dd/statistics/TableStatistics.hpp +79 -0
  257. mqt/core/include/mqt-core/dd/statistics/UniqueTableStatistics.hpp +31 -0
  258. mqt/core/include/mqt-core/fomac/FoMaC.hpp +568 -0
  259. mqt/core/include/mqt-core/ir/Definitions.hpp +108 -0
  260. mqt/core/include/mqt-core/ir/Permutation.hpp +213 -0
  261. mqt/core/include/mqt-core/ir/QuantumComputation.hpp +596 -0
  262. mqt/core/include/mqt-core/ir/Register.hpp +125 -0
  263. mqt/core/include/mqt-core/ir/mqt_core_ir_export.h +43 -0
  264. mqt/core/include/mqt-core/ir/operations/AodOperation.hpp +92 -0
  265. mqt/core/include/mqt-core/ir/operations/CompoundOperation.hpp +212 -0
  266. mqt/core/include/mqt-core/ir/operations/Control.hpp +142 -0
  267. mqt/core/include/mqt-core/ir/operations/Expression.hpp +847 -0
  268. mqt/core/include/mqt-core/ir/operations/IfElseOperation.hpp +169 -0
  269. mqt/core/include/mqt-core/ir/operations/NonUnitaryOperation.hpp +118 -0
  270. mqt/core/include/mqt-core/ir/operations/OpType.hpp +120 -0
  271. mqt/core/include/mqt-core/ir/operations/OpType.inc +76 -0
  272. mqt/core/include/mqt-core/ir/operations/Operation.hpp +247 -0
  273. mqt/core/include/mqt-core/ir/operations/StandardOperation.hpp +140 -0
  274. mqt/core/include/mqt-core/ir/operations/SymbolicOperation.hpp +144 -0
  275. mqt/core/include/mqt-core/mqt_na_qdmi/device.h +602 -0
  276. mqt/core/include/mqt-core/mqt_na_qdmi/types.h +78 -0
  277. mqt/core/include/mqt-core/na/NAComputation.hpp +185 -0
  278. mqt/core/include/mqt-core/na/device/Device.hpp +410 -0
  279. mqt/core/include/mqt-core/na/device/DeviceMemberInitializers.hpp +724 -0
  280. mqt/core/include/mqt-core/na/device/Generator.hpp +447 -0
  281. mqt/core/include/mqt-core/na/entities/Atom.hpp +62 -0
  282. mqt/core/include/mqt-core/na/entities/Location.hpp +154 -0
  283. mqt/core/include/mqt-core/na/entities/Zone.hpp +95 -0
  284. mqt/core/include/mqt-core/na/fomac/Device.hpp +169 -0
  285. mqt/core/include/mqt-core/na/mqt_core_na_export.h +43 -0
  286. mqt/core/include/mqt-core/na/operations/GlobalCZOp.hpp +38 -0
  287. mqt/core/include/mqt-core/na/operations/GlobalOp.hpp +58 -0
  288. mqt/core/include/mqt-core/na/operations/GlobalRYOp.hpp +42 -0
  289. mqt/core/include/mqt-core/na/operations/LoadOp.hpp +89 -0
  290. mqt/core/include/mqt-core/na/operations/LocalOp.hpp +56 -0
  291. mqt/core/include/mqt-core/na/operations/LocalRZOp.hpp +42 -0
  292. mqt/core/include/mqt-core/na/operations/LocalUOp.hpp +49 -0
  293. mqt/core/include/mqt-core/na/operations/MoveOp.hpp +66 -0
  294. mqt/core/include/mqt-core/na/operations/Op.hpp +62 -0
  295. mqt/core/include/mqt-core/na/operations/ShuttlingOp.hpp +51 -0
  296. mqt/core/include/mqt-core/na/operations/StoreOp.hpp +87 -0
  297. mqt/core/include/mqt-core/qasm3/Exception.hpp +85 -0
  298. mqt/core/include/mqt-core/qasm3/Gate.hpp +65 -0
  299. mqt/core/include/mqt-core/qasm3/Importer.hpp +192 -0
  300. mqt/core/include/mqt-core/qasm3/InstVisitor.hpp +145 -0
  301. mqt/core/include/mqt-core/qasm3/NestedEnvironment.hpp +41 -0
  302. mqt/core/include/mqt-core/qasm3/Parser.hpp +170 -0
  303. mqt/core/include/mqt-core/qasm3/Scanner.hpp +73 -0
  304. mqt/core/include/mqt-core/qasm3/Statement.hpp +486 -0
  305. mqt/core/include/mqt-core/qasm3/Statement_fwd.hpp +39 -0
  306. mqt/core/include/mqt-core/qasm3/StdGates.hpp +232 -0
  307. mqt/core/include/mqt-core/qasm3/Token.hpp +198 -0
  308. mqt/core/include/mqt-core/qasm3/Types.hpp +238 -0
  309. mqt/core/include/mqt-core/qasm3/Types_fwd.hpp +22 -0
  310. mqt/core/include/mqt-core/qasm3/mqt_core_qasm_export.h +43 -0
  311. mqt/core/include/mqt-core/qasm3/passes/CompilerPass.hpp +22 -0
  312. mqt/core/include/mqt-core/qasm3/passes/ConstEvalPass.hpp +102 -0
  313. mqt/core/include/mqt-core/qasm3/passes/TypeCheckPass.hpp +124 -0
  314. mqt/core/include/mqt-core/qdmi/Driver.hpp +431 -0
  315. mqt/core/include/mqt-core/zx/FunctionalityConstruction.hpp +125 -0
  316. mqt/core/include/mqt-core/zx/Rational.hpp +318 -0
  317. mqt/core/include/mqt-core/zx/Rules.hpp +132 -0
  318. mqt/core/include/mqt-core/zx/Simplify.hpp +182 -0
  319. mqt/core/include/mqt-core/zx/Utils.hpp +212 -0
  320. mqt/core/include/mqt-core/zx/ZXDefinitions.hpp +93 -0
  321. mqt/core/include/mqt-core/zx/ZXDiagram.hpp +480 -0
  322. mqt/core/include/mqt-core/zx/mqt_core_zx_export.h +43 -0
  323. mqt/core/include/nlohmann/adl_serializer.hpp +55 -0
  324. mqt/core/include/nlohmann/byte_container_with_subtype.hpp +103 -0
  325. mqt/core/include/nlohmann/detail/abi_macros.hpp +111 -0
  326. mqt/core/include/nlohmann/detail/conversions/from_json.hpp +577 -0
  327. mqt/core/include/nlohmann/detail/conversions/to_chars.hpp +1118 -0
  328. mqt/core/include/nlohmann/detail/conversions/to_json.hpp +479 -0
  329. mqt/core/include/nlohmann/detail/exceptions.hpp +291 -0
  330. mqt/core/include/nlohmann/detail/hash.hpp +129 -0
  331. mqt/core/include/nlohmann/detail/input/binary_reader.hpp +3068 -0
  332. mqt/core/include/nlohmann/detail/input/input_adapters.hpp +549 -0
  333. mqt/core/include/nlohmann/detail/input/json_sax.hpp +986 -0
  334. mqt/core/include/nlohmann/detail/input/lexer.hpp +1643 -0
  335. mqt/core/include/nlohmann/detail/input/parser.hpp +519 -0
  336. mqt/core/include/nlohmann/detail/input/position_t.hpp +37 -0
  337. mqt/core/include/nlohmann/detail/iterators/internal_iterator.hpp +35 -0
  338. mqt/core/include/nlohmann/detail/iterators/iter_impl.hpp +760 -0
  339. mqt/core/include/nlohmann/detail/iterators/iteration_proxy.hpp +235 -0
  340. mqt/core/include/nlohmann/detail/iterators/iterator_traits.hpp +61 -0
  341. mqt/core/include/nlohmann/detail/iterators/json_reverse_iterator.hpp +130 -0
  342. mqt/core/include/nlohmann/detail/iterators/primitive_iterator.hpp +132 -0
  343. mqt/core/include/nlohmann/detail/json_custom_base_class.hpp +39 -0
  344. mqt/core/include/nlohmann/detail/json_pointer.hpp +988 -0
  345. mqt/core/include/nlohmann/detail/json_ref.hpp +78 -0
  346. mqt/core/include/nlohmann/detail/macro_scope.hpp +595 -0
  347. mqt/core/include/nlohmann/detail/macro_unscope.hpp +46 -0
  348. mqt/core/include/nlohmann/detail/meta/call_std/begin.hpp +17 -0
  349. mqt/core/include/nlohmann/detail/meta/call_std/end.hpp +17 -0
  350. mqt/core/include/nlohmann/detail/meta/cpp_future.hpp +171 -0
  351. mqt/core/include/nlohmann/detail/meta/detected.hpp +70 -0
  352. mqt/core/include/nlohmann/detail/meta/identity_tag.hpp +21 -0
  353. mqt/core/include/nlohmann/detail/meta/is_sax.hpp +159 -0
  354. mqt/core/include/nlohmann/detail/meta/std_fs.hpp +29 -0
  355. mqt/core/include/nlohmann/detail/meta/type_traits.hpp +795 -0
  356. mqt/core/include/nlohmann/detail/meta/void_t.hpp +24 -0
  357. mqt/core/include/nlohmann/detail/output/binary_writer.hpp +1850 -0
  358. mqt/core/include/nlohmann/detail/output/output_adapters.hpp +147 -0
  359. mqt/core/include/nlohmann/detail/output/serializer.hpp +988 -0
  360. mqt/core/include/nlohmann/detail/string_concat.hpp +146 -0
  361. mqt/core/include/nlohmann/detail/string_escape.hpp +72 -0
  362. mqt/core/include/nlohmann/detail/string_utils.hpp +37 -0
  363. mqt/core/include/nlohmann/detail/value_t.hpp +118 -0
  364. mqt/core/include/nlohmann/json.hpp +5306 -0
  365. mqt/core/include/nlohmann/json_fwd.hpp +75 -0
  366. mqt/core/include/nlohmann/ordered_map.hpp +359 -0
  367. mqt/core/include/nlohmann/thirdparty/hedley/hedley.hpp +2045 -0
  368. mqt/core/include/nlohmann/thirdparty/hedley/hedley_undef.hpp +158 -0
  369. mqt/core/include/qdmi/qdmi/client.h +990 -0
  370. mqt/core/include/qdmi/qdmi/constants.h +1139 -0
  371. mqt/core/include/qdmi/qdmi/device.h +602 -0
  372. mqt/core/include/qdmi/qdmi/types.h +78 -0
  373. mqt/core/include/spdlog/async.h +99 -0
  374. mqt/core/include/spdlog/async_logger-inl.h +84 -0
  375. mqt/core/include/spdlog/async_logger.h +74 -0
  376. mqt/core/include/spdlog/cfg/argv.h +40 -0
  377. mqt/core/include/spdlog/cfg/env.h +36 -0
  378. mqt/core/include/spdlog/cfg/helpers-inl.h +107 -0
  379. mqt/core/include/spdlog/cfg/helpers.h +29 -0
  380. mqt/core/include/spdlog/common-inl.h +68 -0
  381. mqt/core/include/spdlog/common.h +406 -0
  382. mqt/core/include/spdlog/details/backtracer-inl.h +63 -0
  383. mqt/core/include/spdlog/details/backtracer.h +45 -0
  384. mqt/core/include/spdlog/details/circular_q.h +115 -0
  385. mqt/core/include/spdlog/details/console_globals.h +28 -0
  386. mqt/core/include/spdlog/details/file_helper-inl.h +153 -0
  387. mqt/core/include/spdlog/details/file_helper.h +61 -0
  388. mqt/core/include/spdlog/details/fmt_helper.h +141 -0
  389. mqt/core/include/spdlog/details/log_msg-inl.h +44 -0
  390. mqt/core/include/spdlog/details/log_msg.h +40 -0
  391. mqt/core/include/spdlog/details/log_msg_buffer-inl.h +54 -0
  392. mqt/core/include/spdlog/details/log_msg_buffer.h +32 -0
  393. mqt/core/include/spdlog/details/mpmc_blocking_q.h +177 -0
  394. mqt/core/include/spdlog/details/null_mutex.h +35 -0
  395. mqt/core/include/spdlog/details/os-inl.h +606 -0
  396. mqt/core/include/spdlog/details/os.h +127 -0
  397. mqt/core/include/spdlog/details/periodic_worker-inl.h +26 -0
  398. mqt/core/include/spdlog/details/periodic_worker.h +58 -0
  399. mqt/core/include/spdlog/details/registry-inl.h +270 -0
  400. mqt/core/include/spdlog/details/registry.h +131 -0
  401. mqt/core/include/spdlog/details/synchronous_factory.h +22 -0
  402. mqt/core/include/spdlog/details/tcp_client-windows.h +135 -0
  403. mqt/core/include/spdlog/details/tcp_client.h +127 -0
  404. mqt/core/include/spdlog/details/thread_pool-inl.h +126 -0
  405. mqt/core/include/spdlog/details/thread_pool.h +117 -0
  406. mqt/core/include/spdlog/details/udp_client-windows.h +98 -0
  407. mqt/core/include/spdlog/details/udp_client.h +81 -0
  408. mqt/core/include/spdlog/details/windows_include.h +11 -0
  409. mqt/core/include/spdlog/fmt/bin_to_hex.h +224 -0
  410. mqt/core/include/spdlog/fmt/bundled/args.h +220 -0
  411. mqt/core/include/spdlog/fmt/bundled/base.h +2989 -0
  412. mqt/core/include/spdlog/fmt/bundled/chrono.h +2330 -0
  413. mqt/core/include/spdlog/fmt/bundled/color.h +637 -0
  414. mqt/core/include/spdlog/fmt/bundled/compile.h +539 -0
  415. mqt/core/include/spdlog/fmt/bundled/core.h +5 -0
  416. mqt/core/include/spdlog/fmt/bundled/fmt.license.rst +27 -0
  417. mqt/core/include/spdlog/fmt/bundled/format-inl.h +1948 -0
  418. mqt/core/include/spdlog/fmt/bundled/format.h +4244 -0
  419. mqt/core/include/spdlog/fmt/bundled/os.h +427 -0
  420. mqt/core/include/spdlog/fmt/bundled/ostream.h +167 -0
  421. mqt/core/include/spdlog/fmt/bundled/printf.h +633 -0
  422. mqt/core/include/spdlog/fmt/bundled/ranges.h +850 -0
  423. mqt/core/include/spdlog/fmt/bundled/std.h +728 -0
  424. mqt/core/include/spdlog/fmt/bundled/xchar.h +369 -0
  425. mqt/core/include/spdlog/fmt/chrono.h +23 -0
  426. mqt/core/include/spdlog/fmt/compile.h +23 -0
  427. mqt/core/include/spdlog/fmt/fmt.h +30 -0
  428. mqt/core/include/spdlog/fmt/ostr.h +23 -0
  429. mqt/core/include/spdlog/fmt/ranges.h +23 -0
  430. mqt/core/include/spdlog/fmt/std.h +24 -0
  431. mqt/core/include/spdlog/fmt/xchar.h +23 -0
  432. mqt/core/include/spdlog/formatter.h +17 -0
  433. mqt/core/include/spdlog/fwd.h +18 -0
  434. mqt/core/include/spdlog/logger-inl.h +198 -0
  435. mqt/core/include/spdlog/logger.h +379 -0
  436. mqt/core/include/spdlog/mdc.h +52 -0
  437. mqt/core/include/spdlog/pattern_formatter-inl.h +1340 -0
  438. mqt/core/include/spdlog/pattern_formatter.h +118 -0
  439. mqt/core/include/spdlog/sinks/android_sink.h +137 -0
  440. mqt/core/include/spdlog/sinks/ansicolor_sink-inl.h +142 -0
  441. mqt/core/include/spdlog/sinks/ansicolor_sink.h +116 -0
  442. mqt/core/include/spdlog/sinks/base_sink-inl.h +59 -0
  443. mqt/core/include/spdlog/sinks/base_sink.h +51 -0
  444. mqt/core/include/spdlog/sinks/basic_file_sink-inl.h +48 -0
  445. mqt/core/include/spdlog/sinks/basic_file_sink.h +66 -0
  446. mqt/core/include/spdlog/sinks/callback_sink.h +56 -0
  447. mqt/core/include/spdlog/sinks/daily_file_sink.h +254 -0
  448. mqt/core/include/spdlog/sinks/dist_sink.h +81 -0
  449. mqt/core/include/spdlog/sinks/dup_filter_sink.h +91 -0
  450. mqt/core/include/spdlog/sinks/hourly_file_sink.h +193 -0
  451. mqt/core/include/spdlog/sinks/kafka_sink.h +119 -0
  452. mqt/core/include/spdlog/sinks/mongo_sink.h +108 -0
  453. mqt/core/include/spdlog/sinks/msvc_sink.h +68 -0
  454. mqt/core/include/spdlog/sinks/null_sink.h +41 -0
  455. mqt/core/include/spdlog/sinks/ostream_sink.h +43 -0
  456. mqt/core/include/spdlog/sinks/qt_sinks.h +304 -0
  457. mqt/core/include/spdlog/sinks/ringbuffer_sink.h +67 -0
  458. mqt/core/include/spdlog/sinks/rotating_file_sink-inl.h +179 -0
  459. mqt/core/include/spdlog/sinks/rotating_file_sink.h +93 -0
  460. mqt/core/include/spdlog/sinks/sink-inl.h +22 -0
  461. mqt/core/include/spdlog/sinks/sink.h +34 -0
  462. mqt/core/include/spdlog/sinks/stdout_color_sinks-inl.h +38 -0
  463. mqt/core/include/spdlog/sinks/stdout_color_sinks.h +49 -0
  464. mqt/core/include/spdlog/sinks/stdout_sinks-inl.h +127 -0
  465. mqt/core/include/spdlog/sinks/stdout_sinks.h +84 -0
  466. mqt/core/include/spdlog/sinks/syslog_sink.h +104 -0
  467. mqt/core/include/spdlog/sinks/systemd_sink.h +121 -0
  468. mqt/core/include/spdlog/sinks/tcp_sink.h +75 -0
  469. mqt/core/include/spdlog/sinks/udp_sink.h +69 -0
  470. mqt/core/include/spdlog/sinks/win_eventlog_sink.h +260 -0
  471. mqt/core/include/spdlog/sinks/wincolor_sink-inl.h +172 -0
  472. mqt/core/include/spdlog/sinks/wincolor_sink.h +82 -0
  473. mqt/core/include/spdlog/spdlog-inl.h +96 -0
  474. mqt/core/include/spdlog/spdlog.h +357 -0
  475. mqt/core/include/spdlog/stopwatch.h +66 -0
  476. mqt/core/include/spdlog/tweakme.h +148 -0
  477. mqt/core/include/spdlog/version.h +11 -0
  478. mqt/core/ir/__init__.pyi +2078 -0
  479. mqt/core/ir/operations.pyi +1011 -0
  480. mqt/core/ir/registers.pyi +91 -0
  481. mqt/core/ir/symbolic.pyi +177 -0
  482. mqt/core/ir.cp312-win_amd64.pyd +0 -0
  483. mqt/core/lib/mqt-core-algorithms.lib +0 -0
  484. mqt/core/lib/mqt-core-circuit-optimizer.lib +0 -0
  485. mqt/core/lib/mqt-core-dd.lib +0 -0
  486. mqt/core/lib/mqt-core-ds.lib +0 -0
  487. mqt/core/lib/mqt-core-fomac.lib +0 -0
  488. mqt/core/lib/mqt-core-ir.lib +0 -0
  489. mqt/core/lib/mqt-core-na-fomac.lib +0 -0
  490. mqt/core/lib/mqt-core-na.lib +0 -0
  491. mqt/core/lib/mqt-core-qasm.lib +0 -0
  492. mqt/core/lib/mqt-core-qdmi-driver.lib +0 -0
  493. mqt/core/lib/mqt-core-qdmi-na-device-gen.lib +0 -0
  494. mqt/core/lib/mqt-core-qdmi-na-device.lib +0 -0
  495. mqt/core/lib/mqt-core-zx.lib +0 -0
  496. mqt/core/lib/pkgconfig/spdlog.pc +13 -0
  497. mqt/core/lib/spdlog.lib +0 -0
  498. mqt/core/na/__init__.py +12 -0
  499. mqt/core/na/fomac.cp312-win_amd64.pyd +0 -0
  500. mqt/core/na/fomac.pyi +117 -0
  501. mqt/core/nlohmann_json.natvis +278 -0
  502. mqt/core/plugins/__init__.py +9 -0
  503. mqt/core/plugins/qiskit/__init__.py +19 -0
  504. mqt/core/plugins/qiskit/mqt_to_qiskit.py +420 -0
  505. mqt/core/plugins/qiskit/qiskit_to_mqt.py +562 -0
  506. mqt/core/py.typed +2 -0
  507. mqt/core/share/cmake/mqt-core/AddMQTPythonBinding.cmake +55 -0
  508. mqt/core/share/cmake/mqt-core/Cache.cmake +33 -0
  509. mqt/core/share/cmake/mqt-core/FindGMP.cmake +103 -0
  510. mqt/core/share/cmake/mqt-core/PackageAddTest.cmake +46 -0
  511. mqt/core/share/cmake/mqt-core/PreventInSourceBuilds.cmake +25 -0
  512. mqt/core/share/cmake/mqt-core/StandardProjectSettings.cmake +87 -0
  513. mqt/core/share/cmake/mqt-core/mqt-core-config-version.cmake +85 -0
  514. mqt/core/share/cmake/mqt-core/mqt-core-config.cmake +52 -0
  515. mqt/core/share/cmake/mqt-core/mqt-core-targets-release.cmake +141 -0
  516. mqt/core/share/cmake/mqt-core/mqt-core-targets.cmake +445 -0
  517. mqt/core/share/cmake/nlohmann_json/nlohmann_jsonConfig.cmake +15 -0
  518. mqt/core/share/cmake/nlohmann_json/nlohmann_jsonConfigVersion.cmake +20 -0
  519. mqt/core/share/cmake/nlohmann_json/nlohmann_jsonTargets.cmake +110 -0
  520. mqt/core/share/cmake/qdmi/Cache.cmake +44 -0
  521. mqt/core/share/cmake/qdmi/PrefixHandling.cmake +78 -0
  522. mqt/core/share/cmake/qdmi/prefix_defs.txt +26 -0
  523. mqt/core/share/cmake/qdmi/qdmi-config-version.cmake +85 -0
  524. mqt/core/share/cmake/qdmi/qdmi-config.cmake +42 -0
  525. mqt/core/share/cmake/qdmi/qdmi-targets.cmake +129 -0
  526. mqt/core/share/cmake/spdlog/spdlogConfig.cmake +44 -0
  527. mqt/core/share/cmake/spdlog/spdlogConfigTargets-release.cmake +19 -0
  528. mqt/core/share/cmake/spdlog/spdlogConfigTargets.cmake +121 -0
  529. mqt/core/share/cmake/spdlog/spdlogConfigVersion.cmake +65 -0
  530. mqt/core/share/pkgconfig/nlohmann_json.pc +7 -0
  531. mqt_core-3.3.2.dist-info/DELVEWHEEL +2 -0
  532. mqt_core-3.3.2.dist-info/METADATA +210 -0
  533. mqt_core-3.3.2.dist-info/RECORD +537 -0
  534. mqt_core-3.3.2.dist-info/WHEEL +5 -0
  535. mqt_core-3.3.2.dist-info/entry_points.txt +4 -0
  536. mqt_core-3.3.2.dist-info/licenses/LICENSE.md +22 -0
  537. mqt_core.libs/msvcp140.dll +0 -0
@@ -0,0 +1,596 @@
1
+ /*
2
+ * Copyright (c) 2023 - 2025 Chair for Design Automation, TUM
3
+ * Copyright (c) 2025 Munich Quantum Software Company GmbH
4
+ * All rights reserved.
5
+ *
6
+ * SPDX-License-Identifier: MIT
7
+ *
8
+ * Licensed under the MIT License
9
+ */
10
+
11
+ #pragma once
12
+
13
+ #include "Definitions.hpp"
14
+ #include "Permutation.hpp"
15
+ #include "Register.hpp"
16
+ #include "operations/CompoundOperation.hpp"
17
+ #include "operations/Control.hpp"
18
+ #include "operations/Expression.hpp"
19
+ #include "operations/IfElseOperation.hpp"
20
+ #include "operations/OpType.hpp"
21
+ #include "operations/Operation.hpp"
22
+ #include "operations/StandardOperation.hpp"
23
+
24
+ #include <cstddef>
25
+ #include <cstdint>
26
+ #include <iostream>
27
+ #include <memory>
28
+ #include <optional>
29
+ #include <random>
30
+ #include <string>
31
+ #include <unordered_map>
32
+ #include <unordered_set>
33
+ #include <utility>
34
+ #include <vector>
35
+
36
+ namespace qc {
37
+ using QuantumRegisterMap = std::unordered_map<std::string, QuantumRegister>;
38
+ using ClassicalRegisterMap = std::unordered_map<std::string, ClassicalRegister>;
39
+
40
+ class QuantumComputation {
41
+ public:
42
+ using iterator = std::vector<std::unique_ptr<Operation>>::iterator;
43
+ using const_iterator =
44
+ std::vector<std::unique_ptr<Operation>>::const_iterator;
45
+ using reverse_iterator =
46
+ std::vector<std::unique_ptr<Operation>>::reverse_iterator;
47
+ using const_reverse_iterator =
48
+ std::vector<std::unique_ptr<Operation>>::const_reverse_iterator;
49
+
50
+ protected:
51
+ std::vector<std::unique_ptr<Operation>> ops;
52
+ std::size_t nqubits = 0;
53
+ std::size_t nclassics = 0;
54
+ std::size_t nancillae = 0;
55
+ std::string name;
56
+
57
+ QuantumRegisterMap quantumRegisters;
58
+ ClassicalRegisterMap classicalRegisters;
59
+ QuantumRegisterMap ancillaRegisters;
60
+
61
+ std::vector<bool> ancillary;
62
+ std::vector<bool> garbage;
63
+
64
+ std::mt19937_64 mt;
65
+ std::size_t seed = 0;
66
+
67
+ fp globalPhase = 0.;
68
+
69
+ std::unordered_set<sym::Variable> occurringVariables;
70
+
71
+ public:
72
+ explicit QuantumComputation(std::size_t nq = 0, std::size_t nc = 0U,
73
+ std::size_t s = 0);
74
+ QuantumComputation(QuantumComputation&& qc) noexcept = default;
75
+ QuantumComputation& operator=(QuantumComputation&& qc) noexcept = default;
76
+ QuantumComputation(const QuantumComputation& qc);
77
+ QuantumComputation& operator=(const QuantumComputation& qc);
78
+ ~QuantumComputation() = default;
79
+
80
+ // physical qubits are used as keys, logical qubits as values
81
+ Permutation initialLayout;
82
+ Permutation outputPermutation;
83
+
84
+ /**
85
+ * @brief Construct a QuantumComputation from CompoundOperation object
86
+ * @details The function creates a copy of each operation in the compound
87
+ * operation. It uses the largest qubit index in the CompoundOperation for
88
+ * determining the number of qubits. It adds a single quantum register with
89
+ * all qubits from 0 to the largest qubit index and a corresponding classical
90
+ * register with the same size. The initial layout as well as the output
91
+ * permutation are set to the identity permutation.
92
+ * @param op The CompoundOperation to convert to a quantum circuit
93
+ * @return The constructed QuantumComputation
94
+ */
95
+ [[nodiscard]] static QuantumComputation
96
+ fromCompoundOperation(const CompoundOperation& op);
97
+
98
+ [[nodiscard]] std::size_t getNops() const noexcept { return ops.size(); }
99
+ [[nodiscard]] std::size_t getNqubits() const noexcept {
100
+ return nqubits + nancillae;
101
+ }
102
+ [[nodiscard]] std::size_t getNancillae() const noexcept { return nancillae; }
103
+ [[nodiscard]] std::size_t getNqubitsWithoutAncillae() const noexcept {
104
+ return nqubits;
105
+ }
106
+ [[nodiscard]] const std::vector<bool>& getAncillary() const noexcept {
107
+ return ancillary;
108
+ }
109
+ [[nodiscard]] std::vector<bool>& getAncillary() noexcept { return ancillary; }
110
+ [[nodiscard]] const std::vector<bool>& getGarbage() const noexcept {
111
+ return garbage;
112
+ }
113
+ [[nodiscard]] std::vector<bool>& getGarbage() noexcept { return garbage; }
114
+ [[nodiscard]] std::size_t getNcbits() const noexcept { return nclassics; }
115
+ [[nodiscard]] std::string getName() const noexcept { return name; }
116
+ [[nodiscard]] const auto& getQuantumRegisters() const noexcept {
117
+ return quantumRegisters;
118
+ }
119
+ [[nodiscard]] const auto& getClassicalRegisters() const noexcept {
120
+ return classicalRegisters;
121
+ }
122
+ [[nodiscard]] const auto& getAncillaRegisters() const noexcept {
123
+ return ancillaRegisters;
124
+ }
125
+ [[nodiscard]] decltype(mt)& getGenerator() noexcept { return mt; }
126
+
127
+ [[nodiscard]] fp getGlobalPhase() const noexcept { return globalPhase; }
128
+ [[nodiscard]] bool hasGlobalPhase() const noexcept {
129
+ return std::abs(getGlobalPhase()) > 0;
130
+ }
131
+
132
+ [[nodiscard]] const std::unordered_set<sym::Variable>&
133
+ getVariables() const noexcept {
134
+ return occurringVariables;
135
+ }
136
+
137
+ [[nodiscard]] std::size_t getNmeasuredQubits() const noexcept;
138
+ [[nodiscard]] std::size_t getNgarbageQubits() const;
139
+
140
+ void setName(const std::string& n) noexcept { name = n; }
141
+
142
+ [[nodiscard]] std::size_t getNindividualOps() const;
143
+ [[nodiscard]] std::size_t getNsingleQubitOps() const;
144
+ [[nodiscard]] std::size_t getDepth() const;
145
+
146
+ [[nodiscard]] QuantumRegister& getQubitRegister(Qubit physicalQubitIndex);
147
+ /// Returns the highest qubit index used as a value in the initial layout
148
+ [[nodiscard]] Qubit getHighestLogicalQubitIndex() const;
149
+ /// Returns the highest qubit index used as a key in the initial layout
150
+ [[nodiscard]] Qubit getHighestPhysicalQubitIndex() const;
151
+ /**
152
+ * @brief Returns the physical qubit index of the given logical qubit index
153
+ * @details Iterates over the initial layout dictionary and returns the key
154
+ * corresponding to the given value.
155
+ * @param logicalQubitIndex The logical qubit index to look for
156
+ * @return The physical qubit index of the given logical qubit index
157
+ */
158
+ [[nodiscard]] Qubit getPhysicalQubitIndex(Qubit logicalQubitIndex) const;
159
+ [[nodiscard]] bool isIdleQubit(Qubit physicalQubit) const;
160
+ [[nodiscard]] bool isLastOperationOnQubit(const const_iterator& opIt,
161
+ const const_iterator& end) const;
162
+ [[nodiscard]] bool physicalQubitIsAncillary(Qubit physicalQubitIndex) const;
163
+ [[nodiscard]] bool
164
+ logicalQubitIsAncillary(const Qubit logicalQubitIndex) const {
165
+ return ancillary[logicalQubitIndex];
166
+ }
167
+ /**
168
+ * @brief Sets the given logical qubit to be ancillary
169
+ * @details Removes the qubit from the qubit register and adds it to the
170
+ * ancillary register, if such a register exists. Otherwise a new ancillary
171
+ * register is created.
172
+ * @param logicalQubitIndex
173
+ */
174
+ void setLogicalQubitAncillary(Qubit logicalQubitIndex);
175
+ /**
176
+ * @brief Sets all logical qubits in the range [minLogicalQubitIndex,
177
+ * maxLogicalQubitIndex] to be ancillary
178
+ * @details Removes the qubits from the qubit register and adds it to the
179
+ * ancillary register, if such a register exists. Otherwise a new ancillary
180
+ * register is created.
181
+ * @param minLogicalQubitIndex first qubit that is set to be ancillary
182
+ * @param maxLogicalQubitIndex last qubit that is set to be ancillary
183
+ */
184
+ void setLogicalQubitsAncillary(Qubit minLogicalQubitIndex,
185
+ Qubit maxLogicalQubitIndex);
186
+ [[nodiscard]] bool
187
+ logicalQubitIsGarbage(const Qubit logicalQubitIndex) const {
188
+ return garbage[logicalQubitIndex];
189
+ }
190
+ void setLogicalQubitGarbage(Qubit logicalQubitIndex);
191
+ /**
192
+ * @brief Sets all logical qubits in the range [minLogicalQubitIndex,
193
+ * maxLogicalQubitIndex] to be garbage
194
+ * @param minLogicalQubitIndex first qubit that is set to be garbage
195
+ * @param maxLogicalQubitIndex last qubit that is set to be garbage
196
+ */
197
+ void setLogicalQubitsGarbage(Qubit minLogicalQubitIndex,
198
+ Qubit maxLogicalQubitIndex);
199
+
200
+ /// checks whether the given logical qubit exists in the initial layout.
201
+ /// \param logicalQubitIndex the logical qubit index to check
202
+ /// \return whether the given logical qubit exists in the initial layout and
203
+ /// to which physical qubit it is mapped
204
+ [[nodiscard]] std::pair<bool, std::optional<Qubit>>
205
+ containsLogicalQubit(Qubit logicalQubitIndex) const;
206
+
207
+ /// Adds a global phase to the quantum circuit.
208
+ /// \param angle the angle to add
209
+ void gphase(fp angle);
210
+
211
+ #define DECLARE_SINGLE_TARGET_OPERATION(op) \
212
+ void op(Qubit target); \
213
+ void c##op(const Control& control, Qubit target); \
214
+ void mc##op(const Controls& controls, const Qubit target);
215
+
216
+ DECLARE_SINGLE_TARGET_OPERATION(i)
217
+ DECLARE_SINGLE_TARGET_OPERATION(x)
218
+ DECLARE_SINGLE_TARGET_OPERATION(y)
219
+ DECLARE_SINGLE_TARGET_OPERATION(z)
220
+ DECLARE_SINGLE_TARGET_OPERATION(h)
221
+ DECLARE_SINGLE_TARGET_OPERATION(s)
222
+ DECLARE_SINGLE_TARGET_OPERATION(sdg)
223
+ DECLARE_SINGLE_TARGET_OPERATION(t)
224
+ DECLARE_SINGLE_TARGET_OPERATION(tdg)
225
+ DECLARE_SINGLE_TARGET_OPERATION(v)
226
+ DECLARE_SINGLE_TARGET_OPERATION(vdg)
227
+ DECLARE_SINGLE_TARGET_OPERATION(sx)
228
+ DECLARE_SINGLE_TARGET_OPERATION(sxdg)
229
+
230
+ #undef DECLARE_SINGLE_TARGET_OPERATION
231
+
232
+ #define DECLARE_SINGLE_TARGET_SINGLE_PARAMETER_OPERATION(op, param) \
233
+ void op(const SymbolOrNumber&(param), Qubit target); \
234
+ void c##op(const SymbolOrNumber&(param), const Control& control, \
235
+ Qubit target); \
236
+ void mc##op(const SymbolOrNumber&(param), const Controls& controls, \
237
+ Qubit target);
238
+
239
+ DECLARE_SINGLE_TARGET_SINGLE_PARAMETER_OPERATION(rx, theta)
240
+ DECLARE_SINGLE_TARGET_SINGLE_PARAMETER_OPERATION(ry, theta)
241
+ DECLARE_SINGLE_TARGET_SINGLE_PARAMETER_OPERATION(rz, theta)
242
+ DECLARE_SINGLE_TARGET_SINGLE_PARAMETER_OPERATION(p, theta)
243
+
244
+ #undef DECLARE_SINGLE_TARGET_SINGLE_PARAMETER_OPERATION
245
+
246
+ #define DECLARE_SINGLE_TARGET_TWO_PARAMETER_OPERATION(op, param0, param1) \
247
+ void op(const SymbolOrNumber&(param0), const SymbolOrNumber&(param1), \
248
+ Qubit target); \
249
+ void c##op(const SymbolOrNumber&(param0), const SymbolOrNumber&(param1), \
250
+ const Control& control, const Qubit target); \
251
+ void mc##op(const SymbolOrNumber&(param0), const SymbolOrNumber&(param1), \
252
+ const Controls& controls, const Qubit target);
253
+
254
+ DECLARE_SINGLE_TARGET_TWO_PARAMETER_OPERATION(u2, phi, lambda)
255
+ DECLARE_SINGLE_TARGET_TWO_PARAMETER_OPERATION(r, theta, phi)
256
+
257
+ #undef DECLARE_SINGLE_TARGET_TWO_PARAMETER_OPERATION
258
+
259
+ #define DECLARE_SINGLE_TARGET_THREE_PARAMETER_OPERATION(op, param0, param1, \
260
+ param2) \
261
+ void op(const SymbolOrNumber&(param0), const SymbolOrNumber&(param1), \
262
+ const SymbolOrNumber&(param2), Qubit target); \
263
+ void c##op(const SymbolOrNumber&(param0), const SymbolOrNumber&(param1), \
264
+ const SymbolOrNumber&(param2), const Control& control, \
265
+ Qubit target); \
266
+ void mc##op(const SymbolOrNumber&(param0), const SymbolOrNumber&(param1), \
267
+ const SymbolOrNumber&(param2), const Controls& controls, \
268
+ Qubit target);
269
+
270
+ DECLARE_SINGLE_TARGET_THREE_PARAMETER_OPERATION(u, theta, phi, lambda)
271
+
272
+ #undef DECLARE_SINGLE_TARGET_THREE_PARAMETER_OPERATION
273
+
274
+ #define DECLARE_TWO_TARGET_OPERATION(op) \
275
+ void op(const Qubit target0, const Qubit target1); \
276
+ void c##op(const Control& control, Qubit target0, Qubit target1); \
277
+ void mc##op(const Controls& controls, Qubit target0, Qubit target1);
278
+
279
+ DECLARE_TWO_TARGET_OPERATION(swap) // NOLINT: bugprone-exception-escape
280
+ DECLARE_TWO_TARGET_OPERATION(dcx)
281
+ DECLARE_TWO_TARGET_OPERATION(ecr)
282
+ DECLARE_TWO_TARGET_OPERATION(iswap)
283
+ DECLARE_TWO_TARGET_OPERATION(iswapdg)
284
+ DECLARE_TWO_TARGET_OPERATION(peres)
285
+ DECLARE_TWO_TARGET_OPERATION(peresdg)
286
+ DECLARE_TWO_TARGET_OPERATION(move)
287
+
288
+ #undef DECLARE_TWO_TARGET_OPERATION
289
+
290
+ #define DECLARE_TWO_TARGET_SINGLE_PARAMETER_OPERATION(op, param) \
291
+ void op(const SymbolOrNumber&(param), Qubit target0, Qubit target1); \
292
+ void c##op(const SymbolOrNumber&(param), const Control& control, \
293
+ Qubit target0, Qubit target1); \
294
+ void mc##op(const SymbolOrNumber&(param), const Controls& controls, \
295
+ Qubit target0, Qubit target1);
296
+
297
+ DECLARE_TWO_TARGET_SINGLE_PARAMETER_OPERATION(rxx, theta)
298
+ DECLARE_TWO_TARGET_SINGLE_PARAMETER_OPERATION(ryy, theta)
299
+ DECLARE_TWO_TARGET_SINGLE_PARAMETER_OPERATION(rzz, theta)
300
+ DECLARE_TWO_TARGET_SINGLE_PARAMETER_OPERATION(rzx, theta)
301
+
302
+ #undef DECLARE_TWO_TARGET_SINGLE_PARAMETER_OPERATION
303
+
304
+ #define DECLARE_TWO_TARGET_TWO_PARAMETER_OPERATION(op, param0, param1) \
305
+ void op(const SymbolOrNumber&(param0), const SymbolOrNumber&(param1), \
306
+ Qubit target0, Qubit target1); \
307
+ void c##op(const SymbolOrNumber&(param0), const SymbolOrNumber&(param1), \
308
+ const Control& control, Qubit target0, Qubit target1); \
309
+ void mc##op(const SymbolOrNumber&(param0), const SymbolOrNumber&(param1), \
310
+ const Controls& controls, Qubit target0, Qubit target1);
311
+
312
+ // NOLINTNEXTLINE(readability-identifier-naming)
313
+ DECLARE_TWO_TARGET_TWO_PARAMETER_OPERATION(xx_minus_yy, theta, beta)
314
+ // NOLINTNEXTLINE(readability-identifier-naming)
315
+ DECLARE_TWO_TARGET_TWO_PARAMETER_OPERATION(xx_plus_yy, theta, beta)
316
+
317
+ #undef DECLARE_TWO_TARGET_TWO_PARAMETER_OPERATION
318
+
319
+ void measure(Qubit qubit, std::size_t bit);
320
+ void measure(const Targets& qubits, const std::vector<Bit>& bits);
321
+
322
+ /**
323
+ * @brief Add measurements to all qubits
324
+ * @param addBits Whether to add new classical bits to the circuit
325
+ * @details This function adds measurements to all qubits in the circuit and
326
+ * appends a new classical register (named "meas") to the circuit if addBits
327
+ * is true. Otherwise, qubit q is measured into classical bit q.
328
+ */
329
+ void measureAll(bool addBits = true);
330
+
331
+ void reset(Qubit target);
332
+ void reset(const Targets& targets);
333
+
334
+ void barrier();
335
+ void barrier(Qubit target);
336
+ void barrier(const Targets& targets);
337
+
338
+ void ifElse(std::unique_ptr<Operation>&& thenOp,
339
+ std::unique_ptr<Operation>&& elseOp,
340
+ const ClassicalRegister& controlRegister,
341
+ std::uint64_t expectedValue = 1U, ComparisonKind cmp = Eq);
342
+ void ifElse(std::unique_ptr<Operation>&& thenOp,
343
+ std::unique_ptr<Operation>&& elseOp, Bit controlBit,
344
+ bool expectedValue = true, ComparisonKind cmp = Eq);
345
+
346
+ void if_(OpType op, Qubit target, const ClassicalRegister& controlRegister,
347
+ std::uint64_t expectedValue = 1U, ComparisonKind cmp = Eq,
348
+ const std::vector<fp>& params = {});
349
+ void if_(OpType op, Qubit target, Control control,
350
+ const ClassicalRegister& controlRegister,
351
+ std::uint64_t expectedValue = 1U, ComparisonKind cmp = Eq,
352
+ const std::vector<fp>& params = {});
353
+ void if_(OpType op, Qubit target, const Controls& controls,
354
+ const ClassicalRegister& controlRegister,
355
+ std::uint64_t expectedValue = 1U, ComparisonKind cmp = Eq,
356
+ const std::vector<fp>& params = {});
357
+ void if_(OpType op, Qubit target, Bit controlBit, bool expectedValue = true,
358
+ ComparisonKind cmp = Eq, const std::vector<fp>& params = {});
359
+ void if_(OpType op, Qubit target, Control control, Bit controlBit,
360
+ bool expectedValue = true, ComparisonKind cmp = Eq,
361
+ const std::vector<fp>& params = {});
362
+ void if_(OpType op, Qubit target, const Controls& controls, Bit controlBit,
363
+ bool expectedValue = true, ComparisonKind cmp = Eq,
364
+ const std::vector<fp>& params = {});
365
+
366
+ /// strip away qubits with no operations applied to them and which do not pop
367
+ /// up in the output permutation \param force if true, also strip away idle
368
+ /// qubits occurring in the output permutation
369
+ void stripIdleQubits(bool force = false);
370
+
371
+ void initializeIOMapping();
372
+ // append measurements to the end of the circuit according to the tracked
373
+ // output permutation
374
+ void appendMeasurementsAccordingToOutputPermutation(
375
+ const std::string& registerName = "c");
376
+
377
+ // this function augments a given circuit by additional registers
378
+ const QuantumRegister& addQubitRegister(std::size_t nq,
379
+ const std::string& regName = "q");
380
+ const ClassicalRegister&
381
+ addClassicalRegister(std::size_t nc, const std::string& regName = "c");
382
+ const QuantumRegister&
383
+ addAncillaryRegister(std::size_t nq, const std::string& regName = "anc");
384
+ // a function to combine all quantum registers (qregs and ancregs) into a
385
+ // single register (useful for circuits mapped to a device)
386
+ const QuantumRegister&
387
+ unifyQuantumRegisters(const std::string& regName = "q");
388
+
389
+ /**
390
+ * @brief Removes a logical qubit
391
+ * @param logicalQubitIndex The qubit to remove
392
+ * @return The physical qubit index that the logical qubit was mapped to in
393
+ * the initial layout and the output qubit index that the logical qubit was
394
+ * mapped to in the output permutation.
395
+ */
396
+ std::pair<Qubit, std::optional<Qubit>> removeQubit(Qubit logicalQubitIndex);
397
+
398
+ // adds physical qubit as ancillary qubit and gives it the appropriate output
399
+ // mapping
400
+ void addAncillaryQubit(Qubit physicalQubitIndex,
401
+ std::optional<Qubit> outputQubitIndex);
402
+ // try to add logical qubit to circuit and assign it to physical qubit with
403
+ // certain output permutation value
404
+ void addQubit(Qubit logicalQubitIndex, Qubit physicalQubitIndex,
405
+ std::optional<Qubit> outputQubitIndex);
406
+
407
+ [[nodiscard]] QuantumComputation
408
+ instantiate(const VariableAssignment& assignment) const;
409
+ void instantiateInplace(const VariableAssignment& assignment);
410
+
411
+ void addVariable(const SymbolOrNumber& expr);
412
+
413
+ template <typename... Vars> void addVariables(const Vars&... vars) {
414
+ (addVariable(vars), ...);
415
+ }
416
+
417
+ [[nodiscard]] bool isVariableFree() const;
418
+
419
+ /**
420
+ * @brief Invert the circuit
421
+ * @details Inverts the circuit by inverting all operations and reversing the
422
+ * order of the operations. Additionally, the initial layout and output
423
+ * permutation are swapped. If the circuit has different initial
424
+ * layout and output permutation sizes, the initial layout and output
425
+ * permutation will not be swapped.
426
+ */
427
+ void invert();
428
+
429
+ [[nodiscard]] bool operator==(const QuantumComputation& rhs) const;
430
+ [[nodiscard]] bool operator!=(const QuantumComputation& rhs) const {
431
+ return !(*this == rhs);
432
+ }
433
+
434
+ /**
435
+ * printing
436
+ */
437
+ std::ostream& print(std::ostream& os) const;
438
+
439
+ friend std::ostream& operator<<(std::ostream& os,
440
+ const QuantumComputation& qc) {
441
+ return qc.print(os);
442
+ }
443
+
444
+ std::ostream& printStatistics(std::ostream& os) const;
445
+
446
+ static std::ostream& printPermutation(const Permutation& permutation,
447
+ std::ostream& os = std::cout);
448
+
449
+ void dump(const std::string& filename,
450
+ Format format = Format::OpenQASM3) const;
451
+
452
+ /**
453
+ * @brief Dumps the circuit in OpenQASM format to the given output stream
454
+ * @param of The output stream to write the OpenQASM representation to
455
+ * @param openQasm3 Whether to use OpenQASM 3.0 or 2.0
456
+ */
457
+ void dumpOpenQASM(std::ostream& of, bool openQasm3 = true) const;
458
+
459
+ /**
460
+ * @brief Returns the OpenQASM representation of the circuit
461
+ * @param qasm3 Whether to use OpenQASM 3.0 or 2.0
462
+ * @return The OpenQASM representation of the circuit
463
+ */
464
+ [[nodiscard]] std::string toQASM(bool qasm3 = true) const;
465
+
466
+ // this convenience method allows to turn a circuit into a compound operation.
467
+ std::unique_ptr<CompoundOperation> asCompoundOperation() {
468
+ return std::make_unique<CompoundOperation>(std::move(ops));
469
+ }
470
+
471
+ // this convenience method allows to turn a circuit into an operation.
472
+ std::unique_ptr<Operation> asOperation();
473
+
474
+ void reset();
475
+
476
+ /**
477
+ * @brief Reorders the operations in the quantum computation to establish a
478
+ * canonical order
479
+ * @details Uses iterative breadth-first search starting from the topmost
480
+ * qubit.
481
+ */
482
+ void reorderOperations();
483
+
484
+ /**
485
+ * @brief Check whether the quantum computation contains dynamic circuit
486
+ * primitives
487
+ * @details Dynamic circuit primitives are mid-circuit measurements, resets,
488
+ * or classical control flow operations. This method traverses the whole
489
+ * circuit once until it finds a dynamic operation.
490
+ * @return Whether the quantum computation contains dynamic circuit primitives
491
+ */
492
+ [[nodiscard]] bool isDynamic() const;
493
+
494
+ protected:
495
+ [[nodiscard]] std::size_t getSmallestAncillary() const {
496
+ for (std::size_t i = 0; i < ancillary.size(); ++i) {
497
+ if (ancillary[i]) {
498
+ return i;
499
+ }
500
+ }
501
+ return ancillary.size();
502
+ }
503
+
504
+ [[nodiscard]] std::size_t getSmallestGarbage() const {
505
+ for (std::size_t i = 0; i < garbage.size(); ++i) {
506
+ if (garbage[i]) {
507
+ return i;
508
+ }
509
+ }
510
+ return garbage.size();
511
+ }
512
+ [[nodiscard]] bool isLastOperationOnQubit(const const_iterator& opIt) const {
513
+ const auto end = ops.cend();
514
+ return isLastOperationOnQubit(opIt, end);
515
+ }
516
+ void checkQubitRange(Qubit qubit) const;
517
+ void checkQubitRange(Qubit qubit, const Controls& controls) const;
518
+ void checkQubitRange(Qubit qubit0, Qubit qubit1,
519
+ const Controls& controls) const;
520
+ void checkQubitRange(const std::vector<Qubit>& qubits) const;
521
+ void checkBitRange(Bit bit) const;
522
+ void checkBitRange(const std::vector<Bit>& bits) const;
523
+ void checkClassicalRegister(const ClassicalRegister& creg) const;
524
+
525
+ /**
526
+ * Pass-Through
527
+ */
528
+ public:
529
+ // Iterators (pass-through)
530
+ auto begin() noexcept { return ops.begin(); }
531
+ [[nodiscard]] auto begin() const noexcept { return ops.begin(); }
532
+ [[nodiscard]] auto cbegin() const noexcept { return ops.cbegin(); }
533
+ auto end() noexcept { return ops.end(); }
534
+ [[nodiscard]] auto end() const noexcept { return ops.end(); }
535
+ [[nodiscard]] auto cend() const noexcept { return ops.cend(); }
536
+ auto rbegin() noexcept { return ops.rbegin(); }
537
+ [[nodiscard]] auto rbegin() const noexcept { return ops.rbegin(); }
538
+ [[nodiscard]] auto crbegin() const noexcept { return ops.crbegin(); }
539
+ auto rend() noexcept { return ops.rend(); }
540
+ [[nodiscard]] auto rend() const noexcept { return ops.rend(); }
541
+ [[nodiscard]] auto crend() const noexcept { return ops.crend(); }
542
+
543
+ // Capacity (pass-through)
544
+ [[nodiscard]] bool empty() const noexcept { return ops.empty(); }
545
+ [[nodiscard]] std::size_t size() const noexcept { return ops.size(); }
546
+ // NOLINTNEXTLINE(readability-identifier-naming)
547
+ [[nodiscard]] std::size_t max_size() const noexcept { return ops.max_size(); }
548
+ [[nodiscard]] std::size_t capacity() const noexcept { return ops.capacity(); }
549
+
550
+ void reserve(const std::size_t newCap) { ops.reserve(newCap); }
551
+ // NOLINTNEXTLINE(readability-identifier-naming)
552
+ void shrink_to_fit() { ops.shrink_to_fit(); }
553
+
554
+ // Modifiers (pass-through)
555
+ void clear() noexcept { ops.clear(); }
556
+ // NOLINTNEXTLINE(readability-identifier-naming)
557
+ void pop_back() { ops.pop_back(); }
558
+ void resize(const std::size_t count) { ops.resize(count); }
559
+ iterator erase(const const_iterator pos) { return ops.erase(pos); }
560
+ iterator erase(const const_iterator first, const const_iterator last) {
561
+ return ops.erase(first, last);
562
+ }
563
+
564
+ // NOLINTNEXTLINE(readability-identifier-naming)
565
+ template <class T> void push_back(const T& op) {
566
+ ops.push_back(std::make_unique<T>(op));
567
+ }
568
+
569
+ // NOLINTNEXTLINE(readability-identifier-naming)
570
+ template <class T, class... Args> void emplace_back(Args&&... args) {
571
+ ops.emplace_back(std::make_unique<T>(std::forward<Args>(args)...));
572
+ }
573
+
574
+ // NOLINTNEXTLINE(readability-identifier-naming)
575
+ template <class T> void emplace_back(std::unique_ptr<T>& op) {
576
+ ops.emplace_back(std::move(op));
577
+ }
578
+
579
+ // NOLINTNEXTLINE(readability-identifier-naming)
580
+ template <class T> void emplace_back(std::unique_ptr<T>&& op) {
581
+ ops.emplace_back(std::move(op));
582
+ }
583
+
584
+ template <class T> iterator insert(const_iterator pos, T&& op) {
585
+ return ops.insert(pos, std::forward<T>(op));
586
+ }
587
+
588
+ [[nodiscard]] const auto& at(const std::size_t i) const { return ops.at(i); }
589
+ [[nodiscard]] auto& at(const std::size_t i) { return ops.at(i); }
590
+ [[nodiscard]] const auto& front() const { return ops.front(); }
591
+ [[nodiscard]] const auto& back() const { return ops.back(); }
592
+
593
+ // reverse
594
+ void reverse();
595
+ };
596
+ } // namespace qc