mqt-core 3.1.0__cp313-cp313t-win_arm64.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.

Potentially problematic release.


This version of mqt-core might be problematic. Click here for more details.

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