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
mqt/core/dd.pyi ADDED
@@ -0,0 +1,1016 @@
1
+ # Copyright (c) 2023 - 2025 Chair for Design Automation, TUM
2
+ # Copyright (c) 2025 Munich Quantum Software Company GmbH
3
+ # All rights reserved.
4
+ #
5
+ # SPDX-License-Identifier: MIT
6
+ #
7
+ # Licensed under the MIT License
8
+
9
+ """MQT Core DD - The MQT Decision Diagram Package."""
10
+
11
+ from collections.abc import Iterable
12
+ from enum import Enum
13
+
14
+ import numpy as np
15
+ import numpy.typing as npt
16
+
17
+ from .ir import Permutation, QuantumComputation
18
+ from .ir.operations import Control, IfElseOperation, NonUnitaryOperation, Operation
19
+
20
+ __all__ = [
21
+ "BasisStates",
22
+ "DDPackage",
23
+ "Matrix",
24
+ "MatrixDD",
25
+ "Vector",
26
+ "VectorDD",
27
+ "build_functionality",
28
+ "build_unitary",
29
+ "sample",
30
+ "simulate",
31
+ "simulate_statevector",
32
+ ]
33
+
34
+ def sample(qc: QuantumComputation, shots: int = 1024, seed: int = 0) -> dict[str, int]:
35
+ """Sample from the output distribution of a quantum computation.
36
+
37
+ This function classically simulates the quantum computation and repeatedly
38
+ samples from the output distribution. It supports mid-circuit measurements,
39
+ resets, and classical control.
40
+
41
+ Args:
42
+ qc: The quantum computation.
43
+ shots: The number of samples to take. If the quantum computation contains
44
+ no mid-circuit measurements or resets, the circuit is simulated
45
+ once and the samples are drawn from the final state. Otherwise,
46
+ the circuit is simulated once for each sample. Defaults to 1024.
47
+ seed: The seed for the random number generator. If set to a specific
48
+ non-zero value, the simulation is deterministic. If set to 0, the
49
+ RNG is randomly seeded. Defaults to 0.
50
+
51
+ Returns:
52
+ A histogram of the samples. Each sample is a bitstring representing the
53
+ measurement outcomes of the qubits in the quantum computation. The
54
+ leftmost bit corresponds to the most significant qubit, that is, the
55
+ qubit with the highest index (big-endian). If the circuit contains
56
+ measurements, only the qubits that are actively measured are included in
57
+ the output distribution. Otherwise, all qubits in the circuit are measured.
58
+ """
59
+
60
+ def simulate_statevector(qc: QuantumComputation) -> Vector:
61
+ """Simulate the quantum computation and return the final state vector.
62
+
63
+ This function classically simulates the quantum computation and returns the
64
+ state vector of the final state.
65
+ It does not support measurements, resets, or classical control.
66
+
67
+ Since the state vector is guaranteed to be exponentially large in the number
68
+ of qubits, this function is only suitable for small quantum computations.
69
+ Consider using the :func:`~mqt.core.dd.simulate` or the
70
+ :func:`~mqt.core.dd.sample` functions, which never explicitly construct
71
+ the state vector, for larger quantum computations.
72
+
73
+ Args:
74
+ qc: The quantum computation.
75
+ Must only contain unitary operations.
76
+
77
+ Returns:
78
+ The state vector of the final state.
79
+
80
+ Notes:
81
+ This function internally constructs a :class:`~mqt.core.dd.DDPackage`, creates the
82
+ zero state, and simulates the quantum computation via the :func:`simulate`
83
+ function.
84
+ The state vector is then extracted from the resulting DD via the :meth:`~mqt.core.dd.VectorDD.get_vector`
85
+ method.
86
+ The resulting :class:`~mqt.core.dd.Vector` can be converted to a NumPy array without copying
87
+ the data by calling :func:`numpy.array` with the `copy=False` argument.
88
+ """
89
+
90
+ def build_unitary(qc: QuantumComputation, recursive: bool = False) -> Matrix:
91
+ """Build a unitary matrix representation of a quantum computation.
92
+
93
+ This function builds a matrix representation of the unitary representing the
94
+ functionality of a quantum computation.
95
+ This function does not support measurements, resets, or classical control,
96
+ as the corresponding operations are non-unitary.
97
+
98
+ Since the unitary matrix is guaranteed to be exponentially large in the number
99
+ of qubits, this function is only suitable for small quantum computations.
100
+ Consider using the :func:`~mqt.core.dd.build_functionality` function, which
101
+ never explicitly constructs the unitary matrix, for larger quantum computations.
102
+
103
+ Args:
104
+ qc: The quantum computation.
105
+ Must only contain unitary operations.
106
+ recursive: Whether to build the unitary matrix recursively.
107
+ If set to True, the unitary matrix is built recursively by
108
+ pairwise grouping the operations of the quantum computation.
109
+ If set to False, the unitary matrix is built by sequentially
110
+ applying the operations of the quantum computation to the
111
+ identity matrix.
112
+ Defaults to False.
113
+
114
+ Returns:
115
+ The unitary matrix representing the functionality of the quantum computation.
116
+
117
+ Notes:
118
+ This function internally constructs a :class:`~mqt.core.dd.DDPackage`, creates the
119
+ identity matrix, and builds the unitary matrix via the :func:`~mqt.core.dd.build_functionality`
120
+ function.
121
+ The unitary matrix is then extracted from the resulting DD via the :meth:`~mqt.core.dd.MatrixDD.get_matrix`
122
+ method.
123
+ The resulting :class:`~mqt.core.dd.Matrix` can be converted to a NumPy array without copying
124
+ the data by calling :func:`numpy.array` with the `copy=False` argument.
125
+ """
126
+
127
+ def simulate(qc: QuantumComputation, initial_state: VectorDD, dd_package: DDPackage) -> VectorDD:
128
+ """Simulate a quantum computation.
129
+
130
+ This function classically simulates a quantum computation for a given initial
131
+ state and returns the final state (represented as a DD). Compared to the
132
+ `sample` function, this function does not support measurements, resets, or
133
+ classical control. It only supports unitary operations.
134
+
135
+ The simulation is effectively computed by sequentially applying the operations
136
+ of the quantum computation to the initial state.
137
+
138
+ Args:
139
+ qc: The quantum computation.
140
+ Must only contain unitary operations.
141
+ initial_state: The initial state as a DD. Must have the same number of qubits
142
+ as the quantum computation. The reference count of the initial
143
+ state is decremented during the simulation, so the caller must
144
+ ensure that the initial state has a non-zero reference count.
145
+ dd_package: The DD package. Must be configured with a sufficient number of
146
+ qubits to accommodate the quantum computation.
147
+
148
+ Returns:
149
+ The final state as a DD. The reference count of the final state is non-zero
150
+ and must be manually decremented by the caller if it is no longer needed.
151
+ """
152
+
153
+ def build_functionality(qc: QuantumComputation, dd_package: DDPackage, recursive: bool = False) -> MatrixDD:
154
+ """Build a functional representation of a quantum computation.
155
+
156
+ This function builds a matrix DD representation of the unitary representing
157
+ the functionality of a quantum computation. This function does not support
158
+ measurements, resets, or classical control, as the corresponding operations
159
+ are non-unitary.
160
+
161
+ Args:
162
+ qc: The quantum computation.
163
+ Must only contain unitary operations.
164
+ dd_package: The DD package.
165
+ Must be configured with a sufficient number of qubits to
166
+ accommodate the quantum computation.
167
+ recursive: Whether to build the functionality matrix recursively. If set
168
+ to True, the functionality matrix is built recursively by
169
+ pairwise grouping the operations of the quantum computation.
170
+ If set to False, the functionality matrix is built by
171
+ sequentially applying the operations of the quantum
172
+ computation to the identity matrix. Defaults to False.
173
+
174
+ Returns:
175
+ The functionality as a DD. The reference count of the result is non-zero
176
+ and must be manually decremented by the caller if it is no longer needed.
177
+ """
178
+
179
+ class DDPackage:
180
+ """The central manager for performing computations on decision diagrams.
181
+
182
+ It drives all computation on decision diagrams and maintains the necessary
183
+ data structures for this purpose.
184
+ Specifically, it
185
+
186
+ - manages the memory for the decision diagram nodes (Memory Manager),
187
+ - ensures the canonical representation of decision diagrams (Unique Table),
188
+ - ensures the efficiency of decision diagram operations (Compute Table),
189
+ - provides methods for creating quantum states and operations from various sources,
190
+ - provides methods for various operations on quantum states and operations, and
191
+ - provides means for reference counting and garbage collection.
192
+
193
+ Args:
194
+ num_qubits: The maximum number of qubits that the DDPackage can handle.
195
+ Mainly influences the size of the unique tables.
196
+ Can be adjusted dynamically using the `resize` method.
197
+ Since resizing the DDPackage can be expensive, it is recommended
198
+ to choose a value that is large enough for the quantum computations
199
+ that are to be performed, but not unnecessarily large.
200
+ Default is 32.
201
+
202
+ Notes:
203
+ It is undefined behavior to pass VectorDD or MatrixDD objects that were
204
+ created with a different DDPackage to the methods of the DDPackage.
205
+
206
+ """
207
+
208
+ def __init__(self, num_qubits: int = 32) -> None: ...
209
+ def resize(self, num_qubits: int) -> None:
210
+ """Resize the DDPackage to accommodate a different number of qubits.
211
+
212
+ Args:
213
+ num_qubits: The new number of qubits.
214
+ Must be greater than zero.
215
+ It is undefined behavior to resize the DDPackage to a
216
+ smaller number of qubits and then perform operations
217
+ on decision diagrams that are associated with qubits
218
+ that are no longer present.
219
+ """
220
+
221
+ @property
222
+ def max_qubits(self) -> int:
223
+ """The maximum number of qubits that the DDPackage can handle."""
224
+
225
+ def zero_state(self, num_qubits: int) -> VectorDD:
226
+ r"""Create the DD for the zero state :math:`|0\ldots 0\rangle`.
227
+
228
+ Args:
229
+ num_qubits: The number of qubits.
230
+ Must not be greater than the number of qubits the DDPackage is configured with.
231
+
232
+ Returns:
233
+ The DD for the zero state.
234
+ The resulting state is guaranteed to have its reference count increased.
235
+ """
236
+
237
+ def computational_basis_state(self, num_qubits: int, state: list[bool]) -> VectorDD:
238
+ r"""Create the DD for the computational basis state :math:`|b_{n-1} \ldots b_0\rangle`.
239
+
240
+ Args:
241
+ num_qubits: The number of qubits.
242
+ Must not be greater than the number of qubits the DDPackage is configured with.
243
+ state: The state as a list of booleans.
244
+ Must be at least `num_qubits` long.
245
+
246
+ Returns:
247
+ The DD for the computational basis state.
248
+ The resulting state is guaranteed to have its reference count increased.
249
+ """
250
+
251
+ def basis_state(self, num_qubits: int, state: Iterable[BasisStates]) -> VectorDD:
252
+ r"""Create the DD for the basis state :math:`|B_{n-1} \ldots B_0\rangle`, where :math:`B_i\in\{0,1,+\,-,L,R\}`.
253
+
254
+ Args:
255
+ num_qubits: The number of qubits.
256
+ Must not be greater than the number of qubits the DDPackage is configured with.
257
+ state: The state as an iterable of :class:`BasisStates`.
258
+ Must be at least `num_qubits` long.
259
+
260
+ Returns:
261
+ The DD for the basis state.
262
+ The resulting state is guaranteed to have its reference count increased.
263
+ """
264
+
265
+ def ghz_state(self, num_qubits: int) -> VectorDD:
266
+ r"""Create the DD for the GHZ state :math:`\frac{1}{\sqrt{2}}(|0\ldots 0\rangle + |1\ldots 1\rangle)`.
267
+
268
+ Args:
269
+ num_qubits: The number of qubits.
270
+ Must not be greater than the number of qubits the DDPackage is configured with.
271
+
272
+ Returns:
273
+ The DD for the GHZ state.
274
+ The resulting state is guaranteed to have its reference count increased.
275
+ """
276
+
277
+ def w_state(self, num_qubits: int) -> VectorDD:
278
+ r"""Create the DD for the W state :math:`|W\rangle`.
279
+
280
+ :math:`|W\rangle = \frac{1}{\sqrt{n}}(|100\ldots 0\rangle + |010\ldots 0\rangle + \ldots + |000\ldots 1\rangle)`
281
+
282
+ Args:
283
+ num_qubits: The number of qubits.
284
+ Must not be greater than the number of qubits the DDPackage is configured with.
285
+
286
+ Returns:
287
+ The DD for the W state.
288
+ The resulting state is guaranteed to have its reference count increased.
289
+ """
290
+
291
+ def from_vector(self, state: npt.NDArray[np.cdouble]) -> VectorDD:
292
+ """Create a DD from a state vector.
293
+
294
+ Args:
295
+ state: The state vector.
296
+ Must have a length that is a power of 2.
297
+ Must not require more qubits than the DDPackage is configured with.
298
+
299
+ Returns:
300
+ The DD for the vector.
301
+ The resulting state is guaranteed to have its reference count increased.
302
+ """
303
+
304
+ def apply_unitary_operation(self, vec: VectorDD, operation: Operation, permutation: Permutation = ...) -> VectorDD:
305
+ """Apply a unitary operation to the DD.
306
+
307
+ Args:
308
+ vec: The input DD.
309
+ operation: The operation.
310
+ Must be unitary.
311
+ permutation: The permutation of the qubits.
312
+ Defaults to the identity permutation.
313
+
314
+ Returns:
315
+ The resulting DD.
316
+
317
+ Notes:
318
+ Automatically manages the reference count of the input and output DDs.
319
+ The input DD must have a non-zero reference count.
320
+ """
321
+
322
+ def apply_measurement(
323
+ self,
324
+ vec: VectorDD,
325
+ operation: NonUnitaryOperation,
326
+ measurements: list[bool],
327
+ permutation: Permutation = ...,
328
+ ) -> tuple[VectorDD, list[bool]]:
329
+ """Apply a measurement to the DD.
330
+
331
+ Args:
332
+ vec: The input DD.
333
+ operation: The measurement operation.
334
+ measurements: A list of bits with existing measurement outcomes.
335
+ permutation: The permutation of the qubits.
336
+ Defaults to the identity permutation.
337
+
338
+ Returns:
339
+ The resulting DD after the measurement as well as the updated measurement outcomes.
340
+
341
+ Notes:
342
+ Automatically manages the reference count of the input and output DDs.
343
+ The input DD must have a non-zero reference count.
344
+ """
345
+
346
+ def apply_reset(self, vec: VectorDD, operation: NonUnitaryOperation, permutation: Permutation = ...) -> VectorDD:
347
+ """Apply a reset to the DD.
348
+
349
+ Args:
350
+ vec: The input DD.
351
+ operation: The reset operation.
352
+ permutation: The permutation of the qubits.
353
+ Defaults to the identity permutation.
354
+
355
+ Returns:
356
+ The resulting DD after the reset.
357
+
358
+ Notes:
359
+ Automatically manages the reference count of the input and output DDs.
360
+ The input DD must have a non-zero reference count.
361
+ """
362
+
363
+ def apply_if_else_operation(
364
+ self,
365
+ vec: VectorDD,
366
+ operation: IfElseOperation,
367
+ measurements: list[bool],
368
+ permutation: Permutation = ...,
369
+ ) -> VectorDD:
370
+ """Apply a classically controlled operation to the DD.
371
+
372
+ Args:
373
+ vec: The input DD.
374
+ operation: The classically controlled operation.
375
+ measurements: A list of bits with stored measurement outcomes.
376
+ permutation: The permutation of the qubits. Defaults to the identity permutation.
377
+
378
+ Returns:
379
+ The resulting DD after the operation.
380
+
381
+ Notes:
382
+ Automatically manages the reference count of the input and output DDs.
383
+ The input DD must have a non-zero reference count.
384
+ """
385
+
386
+ def measure_collapsing(self, vec: VectorDD, qubit: int) -> str:
387
+ """Measure a qubit and collapse the DD.
388
+
389
+ Args:
390
+ vec: The input DD.
391
+ qubit: The qubit to measure.
392
+
393
+ Returns:
394
+ The measurement outcome.
395
+
396
+ Notes:
397
+ Automatically manages the reference count of the input and output DDs.
398
+ The input DD must have a non-zero reference count.
399
+ """
400
+
401
+ def measure_all(self, vec: VectorDD, collapse: bool = False) -> str:
402
+ """Measure all qubits.
403
+
404
+ Args:
405
+ vec: The input DD.
406
+ collapse: Whether to collapse the DD.
407
+
408
+ Returns:
409
+ The measurement outcome.
410
+
411
+ Notes:
412
+ Automatically manages the reference count of the input and output DDs.
413
+ The input DD must have a non-zero reference count.
414
+ """
415
+
416
+ @staticmethod
417
+ def identity() -> MatrixDD:
418
+ r"""Create the DD for the identity matrix :math:`I`.
419
+
420
+ Returns:
421
+ The DD for the identity matrix.
422
+ """
423
+
424
+ def single_qubit_gate(
425
+ self,
426
+ matrix: npt.NDArray[np.cdouble],
427
+ target: int,
428
+ ) -> MatrixDD:
429
+ r"""Create the DD for a single-qubit gate.
430
+
431
+ Args:
432
+ matrix: The :math:`2\times 2` matrix representing the single-qubit gate.
433
+ target: The target qubit.
434
+
435
+ Returns:
436
+ The DD for the single-qubit gate.
437
+ """
438
+
439
+ def controlled_single_qubit_gate(
440
+ self, matrix: npt.NDArray[np.cdouble], control: Control | int, target: int
441
+ ) -> MatrixDD:
442
+ r"""Create the DD for a controlled single-qubit gate.
443
+
444
+ Args:
445
+ matrix: The :math:`2\times 2` matrix representing the single-qubit gate.
446
+ control: The control qubit.
447
+ target: The target qubit.
448
+
449
+ Returns:
450
+ The DD for the controlled single-qubit gate.
451
+ """
452
+
453
+ def multi_controlled_single_qubit_gate(
454
+ self,
455
+ matrix: npt.NDArray[np.cdouble],
456
+ controls: set[Control | int],
457
+ target: int,
458
+ ) -> MatrixDD:
459
+ r"""Create the DD for a multi-controlled single-qubit gate.
460
+
461
+ Args:
462
+ matrix: The :math:`2\times 2` matrix representing the single-qubit gate.
463
+ controls: The control qubits.
464
+ target: The target qubit.
465
+
466
+ Returns:
467
+ The DD for the multi-controlled single-qubit gate.
468
+ """
469
+
470
+ def two_qubit_gate(
471
+ self,
472
+ matrix: npt.NDArray[np.cdouble],
473
+ target0: int,
474
+ target1: int,
475
+ ) -> MatrixDD:
476
+ r"""Create the DD for a two-qubit gate.
477
+
478
+ Args:
479
+ matrix: The :math:`4\times 4` matrix representing the two-qubit gate.
480
+ target0: The first target qubit.
481
+ target1: The second target qubit.
482
+
483
+ Returns:
484
+ The DD for the two-qubit gate.
485
+ """
486
+
487
+ def controlled_two_qubit_gate(
488
+ self,
489
+ matrix: npt.NDArray[np.cdouble],
490
+ control: Control | int,
491
+ target0: int,
492
+ target1: int,
493
+ ) -> MatrixDD:
494
+ r"""Create the DD for a controlled two-qubit gate.
495
+
496
+ Args:
497
+ matrix: The :math:`4\times 4` matrix representing the two-qubit gate.
498
+ control: The control qubit.
499
+ target0: The first target qubit.
500
+ target1: The second target qubit.
501
+
502
+ Returns:
503
+ The DD for the controlled two-qubit gate.
504
+ """
505
+
506
+ def multi_controlled_two_qubit_gate(
507
+ self,
508
+ matrix: npt.NDArray[np.cdouble],
509
+ controls: set[Control | int],
510
+ target0: int,
511
+ target1: int,
512
+ ) -> MatrixDD:
513
+ r"""Create the DD for a multi-controlled two-qubit gate.
514
+
515
+ Args:
516
+ matrix: The :math:`4\times 4` matrix representing the two-qubit gate.
517
+ controls: The control qubits.
518
+ target0: The first target qubit.
519
+ target1: The second target qubit.
520
+
521
+ Returns:
522
+ The DD for the multi-controlled two-qubit gate.
523
+ """
524
+
525
+ def from_matrix(self, matrix: npt.NDArray[np.cdouble]) -> MatrixDD:
526
+ """Create a DD from a matrix.
527
+
528
+ Args:
529
+ matrix: The matrix.
530
+ Must be square and have a size that is a power of 2.
531
+
532
+ Returns:
533
+ The DD for the matrix.
534
+ """
535
+
536
+ def from_operation(self, operation: Operation, invert: bool = False) -> MatrixDD:
537
+ """Create a DD from an operation.
538
+
539
+ Args:
540
+ operation: The operation.
541
+ Must be unitary.
542
+ invert: Whether to get the inverse of the operation.
543
+
544
+ Returns:
545
+ The DD for the operation.
546
+ """
547
+
548
+ def inc_ref_vec(self, vec: VectorDD) -> None:
549
+ """Increment the reference count of a vector."""
550
+
551
+ def dec_ref_vec(self, vec: VectorDD) -> None:
552
+ """Decrement the reference count of a vector."""
553
+
554
+ def inc_ref_mat(self, mat: MatrixDD) -> None:
555
+ """Increment the reference count of a matrix."""
556
+
557
+ def dec_ref_mat(self, mat: MatrixDD) -> None:
558
+ """Decrement the reference count of a matrix."""
559
+
560
+ def garbage_collect(self, force: bool = False) -> bool:
561
+ """Perform garbage collection on the DDPackage.
562
+
563
+ Args:
564
+ force: Whether to force garbage collection.
565
+ If set to True, garbage collection is performed regardless
566
+ of the current memory usage. If set to False, garbage collection
567
+ is only performed if the memory usage exceeds a certain threshold.
568
+
569
+ Returns:
570
+ Whether any nodes were collected during garbage collection.
571
+ """
572
+
573
+ def vector_add(self, lhs: VectorDD, rhs: VectorDD) -> VectorDD:
574
+ """Add two vectors.
575
+
576
+ Args:
577
+ lhs: The left vector.
578
+ rhs: The right vector.
579
+
580
+ Returns:
581
+ The sum of the two vectors.
582
+
583
+ Notes:
584
+ It is the caller's responsibility to update the reference count of the
585
+ input and output vectors after the operation.
586
+
587
+ Both vectors must have the same number of qubits.
588
+ """
589
+
590
+ def matrix_add(self, lhs: MatrixDD, rhs: MatrixDD) -> MatrixDD:
591
+ """Add two matrices.
592
+
593
+ Args:
594
+ lhs: The left matrix.
595
+ rhs: The right matrix.
596
+
597
+ Returns:
598
+ The sum of the two matrices.
599
+
600
+ Notes:
601
+ It is the caller's responsibility to update the reference count of the
602
+ input and output matrices after the operation.
603
+
604
+ Both matrices must have the same number of qubits.
605
+ """
606
+
607
+ def conjugate(self, vec: VectorDD) -> VectorDD:
608
+ """Conjugate a vector.
609
+
610
+ Args:
611
+ vec: The vector.
612
+
613
+ Returns:
614
+ The conjugated vector.
615
+
616
+ Notes:
617
+ It is the caller's responsibility to update the reference count of the
618
+ input and output vectors after the operation.
619
+ """
620
+
621
+ def conjugate_transpose(self, mat: MatrixDD) -> MatrixDD:
622
+ """Conjugate transpose a matrix.
623
+
624
+ Args:
625
+ mat: The matrix.
626
+
627
+ Returns:
628
+ The conjugate transposed matrix.
629
+
630
+ Notes:
631
+ It is the caller's responsibility to update the reference count of the
632
+ input and output matrices after the operation.
633
+ """
634
+
635
+ def matrix_vector_multiply(self, mat: MatrixDD, vec: VectorDD) -> VectorDD:
636
+ """Multiply a matrix with a vector.
637
+
638
+ Args:
639
+ mat: The matrix.
640
+ vec: The vector.
641
+
642
+ Returns:
643
+ The product of the matrix and the vector.
644
+
645
+ Notes:
646
+ It is the caller's responsibility to update the reference count of the
647
+ input and output matrices after the operation.
648
+
649
+ The vector must have at least as many qubits as the matrix non-trivially acts on.
650
+ """
651
+
652
+ def matrix_multiply(self, lhs: MatrixDD, rhs: MatrixDD) -> MatrixDD:
653
+ """Multiply two matrices.
654
+
655
+ Args:
656
+ lhs: The left matrix.
657
+ rhs: The right matrix.
658
+
659
+ Returns:
660
+ The product of the two matrices.
661
+
662
+ Notes:
663
+ It is the caller's responsibility to update the reference count of the
664
+ input and output matrices after the operation.
665
+ """
666
+
667
+ def inner_product(self, lhs: VectorDD, rhs: VectorDD) -> complex:
668
+ """Compute the inner product of two vectors.
669
+
670
+ Args:
671
+ lhs: The left vector.
672
+ rhs: The right vector.
673
+
674
+ Returns:
675
+ The inner product of the two vectors.
676
+
677
+ Notes:
678
+ Both vectors must have the same number of qubits.
679
+ """
680
+
681
+ def fidelity(self, lhs: VectorDD, rhs: VectorDD) -> float:
682
+ """Compute the fidelity of two vectors.
683
+
684
+ Args:
685
+ lhs: The left vector.
686
+ rhs: The right vector.
687
+
688
+ Returns:
689
+ The fidelity of the two vectors.
690
+
691
+ Notes:
692
+ Both vectors must have the same number of qubits.
693
+ """
694
+
695
+ def expectation_value(self, observable: MatrixDD, state: VectorDD) -> float:
696
+ r"""Compute the expectation value of an observable.
697
+
698
+ Args:
699
+ observable: The observable.
700
+ state: The state.
701
+
702
+ Returns:
703
+ The expectation value of the observable.
704
+
705
+ Notes:
706
+ The state must have at least as many qubits as the observable non-trivially acts on.
707
+
708
+ The method computes :math:`\langle \psi | O | \psi \rangle` as
709
+ :math:`\langle \psi | (O | \psi \rangle)`.
710
+ """
711
+
712
+ def vector_kronecker(
713
+ self, top: VectorDD, bottom: VectorDD, bottom_num_qubits: int, increment_index: bool = True
714
+ ) -> VectorDD:
715
+ """Compute the Kronecker product of two vectors.
716
+
717
+ Args:
718
+ top: The top vector.
719
+ bottom: The bottom vector.
720
+ bottom_num_qubits: The number of qubits of the bottom vector.
721
+ increment_index: Whether to increment the indexes of the top vector.
722
+
723
+ Returns:
724
+ The Kronecker product of the two vectors.
725
+
726
+ Notes:
727
+ It is the caller's responsibility to update the reference count of the
728
+ input and output vectors after the operation.
729
+ """
730
+
731
+ def matrix_kronecker(
732
+ self, top: MatrixDD, bottom: MatrixDD, bottom_num_qubits: int, increment_index: bool = True
733
+ ) -> MatrixDD:
734
+ """Compute the Kronecker product of two matrices.
735
+
736
+ Args:
737
+ top: The top matrix.
738
+ bottom: The bottom matrix.
739
+ bottom_num_qubits: The number of qubits of the bottom matrix.
740
+ increment_index: Whether to increment the indexes of the top matrix.
741
+
742
+ Returns:
743
+ The Kronecker product of the two matrices.
744
+
745
+ Notes:
746
+ It is the caller's responsibility to update the reference count of the
747
+ input and output matrices after the operation.
748
+ """
749
+
750
+ def partial_trace(self, mat: MatrixDD, eliminate: list[bool]) -> MatrixDD:
751
+ """Compute the partial trace of a matrix.
752
+
753
+ Args:
754
+ mat: The matrix.
755
+ eliminate: The qubits to eliminate.
756
+ Must be at least as long as the number of qubits of the matrix.
757
+
758
+ Returns:
759
+ The partial trace of the matrix.
760
+ """
761
+
762
+ def trace(self, mat: MatrixDD, num_qubits: int) -> complex:
763
+ """Compute the trace of a matrix.
764
+
765
+ Args:
766
+ mat: The matrix.
767
+ num_qubits: The number of qubits of the matrix.
768
+
769
+ Returns:
770
+ The trace of the matrix.
771
+ """
772
+
773
+ class VectorDD:
774
+ """A class representing a vector decision diagram (DD)."""
775
+
776
+ def is_terminal(self) -> bool:
777
+ """Check if the DD is a terminal node."""
778
+
779
+ def is_zero_terminal(self) -> bool:
780
+ """Check if the DD is a zero terminal node."""
781
+
782
+ def size(self) -> int:
783
+ """Get the size of the DD by traversing it once."""
784
+
785
+ def __getitem__(self, index: int) -> complex:
786
+ """Get the amplitude of a basis state by index."""
787
+
788
+ def get_amplitude(self, num_qubits: int, decisions: str) -> complex:
789
+ """Get the amplitude of a basis state by decisions.
790
+
791
+ Args:
792
+ num_qubits: The number of qubits.
793
+ decisions: The decisions as a string of bits (`0` or `1`), where
794
+ `decisions[i]` corresponds to the successor to follow at level `i` of the DD.
795
+ Must be at least `num_qubits` long.
796
+
797
+ Returns:
798
+ The amplitude of the basis state.
799
+ """
800
+
801
+ def get_vector(self, threshold: float = 0.0) -> Vector:
802
+ """Get the state vector represented by the DD.
803
+
804
+ Args:
805
+ threshold: The threshold for not including amplitudes in the state vector.
806
+ Defaults to 0.0.
807
+
808
+ Returns:
809
+ The state vector.
810
+ """
811
+
812
+ def to_dot(
813
+ self,
814
+ colored: bool = True,
815
+ edge_labels: bool = False,
816
+ classic: bool = False,
817
+ memory: bool = False,
818
+ format_as_polar: bool = True,
819
+ ) -> str:
820
+ """Convert the DD to a DOT graph that can be plotted via Graphviz.
821
+
822
+ Args:
823
+ colored: Whether to use colored edge weights
824
+ edge_labels: Whether to include edge weights as labels.
825
+ classic: Whether to use the classic DD visualization style.
826
+ memory: Whether to include memory information.
827
+ For debugging purposes only.
828
+ format_as_polar: Whether to format the edge weights in polar coordinates.
829
+
830
+ Returns:
831
+ The DOT graph.
832
+ """
833
+
834
+ def to_svg(
835
+ self,
836
+ filename: str,
837
+ colored: bool = True,
838
+ edge_labels: bool = False,
839
+ classic: bool = False,
840
+ memory: bool = False,
841
+ format_as_polar: bool = True,
842
+ ) -> None:
843
+ """Convert the DD to an SVG file that can be viewed in a browser.
844
+
845
+ Requires the `dot` command from Graphviz to be installed and available in the PATH.
846
+
847
+ Args:
848
+ filename: The filename of the SVG file.
849
+ Any file extension will be replaced by `.dot` and then `.svg`.
850
+ colored: Whether to use colored edge weights.
851
+ edge_labels: Whether to include edge weights as labels.
852
+ classic: Whether to use the classic DD visualization style.
853
+ memory: Whether to include memory information.
854
+ For debugging purposes only.
855
+ show: Whether to open the SVG file in the default browser.
856
+ format_as_polar: Whether to format the edge weights in polar coordinates.
857
+ """
858
+
859
+ class MatrixDD:
860
+ """A class representing a matrix decision diagram (DD)."""
861
+
862
+ def is_terminal(self) -> bool:
863
+ """Check if the DD is a terminal node."""
864
+
865
+ def is_zero_terminal(self) -> bool:
866
+ """Check if the DD is a zero terminal node."""
867
+
868
+ def is_identity(self, up_to_global_phase: bool = True) -> bool:
869
+ """Check if the DD represents the identity matrix.
870
+
871
+ Args:
872
+ up_to_global_phase: Whether to ignore global phase.
873
+
874
+ Returns:
875
+ Whether the DD represents the identity matrix.
876
+ """
877
+
878
+ def size(self) -> int:
879
+ """Get the size of the DD by traversing it once."""
880
+
881
+ def get_entry(self, num_qubits: int, row: int, col: int) -> complex:
882
+ """Get the entry of the matrix by row and column index."""
883
+
884
+ def get_entry_by_path(self, num_qubits: int, decisions: str) -> complex:
885
+ """Get the entry of the matrix by decisions.
886
+
887
+ Args:
888
+ num_qubits: The number of qubits.
889
+ decisions: The decisions as a string of `0`, `1`, `2`, or `3`, where
890
+ `decisions[i]` corresponds to the successor to follow at level `i` of the DD.
891
+ Must be at least `num_qubits` long.
892
+
893
+ Returns:
894
+ The entry of the matrix.
895
+ """
896
+
897
+ def get_matrix(self, num_qubits: int, threshold: float = 0.0) -> Matrix:
898
+ """Get the matrix represented by the DD.
899
+
900
+ Args:
901
+ num_qubits: The number of qubits.
902
+ threshold: The threshold for not including entries in the matrix.
903
+ Defaults to 0.0.
904
+
905
+ Returns:
906
+ The matrix.
907
+ """
908
+
909
+ def to_dot(
910
+ self,
911
+ colored: bool = True,
912
+ edge_labels: bool = False,
913
+ classic: bool = False,
914
+ memory: bool = False,
915
+ format_as_polar: bool = True,
916
+ ) -> str:
917
+ """Convert the DD to a DOT graph that can be plotted via Graphviz.
918
+
919
+ Args:
920
+ colored: Whether to use colored edge weights
921
+ edge_labels: Whether to include edge weights as labels.
922
+ classic: Whether to use the classic DD visualization style.
923
+ memory: Whether to include memory information.
924
+ For debugging purposes only.
925
+ format_as_polar: Whether to format the edge weights in polar coordinates.
926
+
927
+ Returns:
928
+ The DOT graph.
929
+ """
930
+
931
+ def to_svg(
932
+ self,
933
+ filename: str,
934
+ colored: bool = True,
935
+ edge_labels: bool = False,
936
+ classic: bool = False,
937
+ memory: bool = False,
938
+ format_as_polar: bool = True,
939
+ ) -> None:
940
+ """Convert the DD to an SVG file that can be viewed in a browser.
941
+
942
+ Requires the `dot` command from Graphviz to be installed and available in the PATH.
943
+
944
+ Args:
945
+ filename: The filename of the SVG file.
946
+ Any file extension will be replaced by `.dot` and then `.svg`.
947
+ colored: Whether to use colored edge weights.
948
+ edge_labels: Whether to include edge weights as labels.
949
+ classic: Whether to use the classic DD visualization style.
950
+ memory: Whether to include memory information.
951
+ For debugging purposes only.
952
+ show: Whether to open the SVG file in the default browser.
953
+ format_as_polar: Whether to format the edge weights in polar coordinates.
954
+ """
955
+
956
+ class BasisStates(Enum):
957
+ """Enumeration of basis states."""
958
+
959
+ zero = ...
960
+ r"""The computational basis state :math:`|0\rangle`."""
961
+ one = ...
962
+ r"""The computational basis state :math:`|1\rangle`."""
963
+ plus = ...
964
+ r"""The superposition state :math:`|+\rangle = \frac{1}{\sqrt{2}}(|0\rangle + |1\rangle)`."""
965
+ minus = ...
966
+ r"""The superposition state :math:`|-\rangle = \frac{1}{\sqrt{2}}(|0\rangle - |1\rangle)`."""
967
+ left = ...
968
+ r"""The rotational superposition state :math:`|L\rangle = \frac{1}{\sqrt{2}}(|0\rangle + i|1\rangle)`."""
969
+ right = ...
970
+ r"""The rotational superposition state :math:`|R\rangle = \frac{1}{\sqrt{2}}(|0\rangle - i|1\rangle)`."""
971
+
972
+ class Vector:
973
+ """A class representing a vector of complex numbers.
974
+
975
+ Implements the buffer protocol so that the underlying memory can be accessed
976
+ and easily converted to a NumPy array without copying.
977
+
978
+ Examples:
979
+ >>> from mqt.core.dd import DDPackage
980
+ ... import numpy as np
981
+ ...
982
+ ... zero_state = DDPackage(2).zero_state(2)
983
+ ... vec = np.array(zero_state.get_vector(), copy=False)
984
+ ... print(vec)
985
+ [1.+0.j 0.+0.j 0.+0.j 0.+0.j]
986
+
987
+ """
988
+
989
+ def __buffer__(self, flags: int, /) -> memoryview:
990
+ """Return a buffer object that exposes the underlying memory of the object."""
991
+
992
+ def __release_buffer__(self, buffer: memoryview, /) -> None:
993
+ """Release the buffer object that exposes the underlying memory of the object."""
994
+
995
+ class Matrix:
996
+ """A class representing a matrix of complex numbers.
997
+
998
+ Implements the buffer protocol so that the underlying memory can be accessed
999
+ and easily converted to a NumPy array without copying.
1000
+
1001
+ Examples:
1002
+ >>> from mqt.core.dd import DDPackage
1003
+ ... import numpy as np
1004
+ ...
1005
+ ... identity = DDPackage(1).identity()
1006
+ ... mat = np.array(identity.get_matrix(1), copy=False)
1007
+ ... print(mat)
1008
+ [[1.+0.j 0.+0.j]
1009
+ [0.+0.j 1.+0.j]]
1010
+ """
1011
+
1012
+ def __buffer__(self, flags: int, /) -> memoryview:
1013
+ """Return a buffer object that exposes the underlying memory of the object."""
1014
+
1015
+ def __release_buffer__(self, buffer: memoryview, /) -> None:
1016
+ """Release the buffer object that exposes the underlying memory of the object."""