mqt-core 3.1.0__cp313-cp313-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.cp313-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.cp313-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,150 @@
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 "dd/CachedEdge.hpp"
14
+ #include "dd/Complex.hpp"
15
+ #include "dd/DDDefinitions.hpp"
16
+ #include "dd/Edge.hpp"
17
+ #include "dd/RealNumberUniqueTable.hpp"
18
+
19
+ #include <complex>
20
+ #include <cstddef>
21
+
22
+ namespace dd {
23
+
24
+ struct ComplexValue;
25
+
26
+ /// A class for managing complex numbers in the DD package.
27
+ class ComplexNumbers {
28
+
29
+ public:
30
+ /// Default constructor.
31
+ explicit ComplexNumbers(RealNumberUniqueTable& table)
32
+ : uniqueTable(&table) {};
33
+ /// Default destructor.
34
+ ~ComplexNumbers() = default;
35
+
36
+ /**
37
+ * @brief Set the numerical tolerance for comparisons of floats.
38
+ * @param tol The new tolerance.
39
+ */
40
+ static void setTolerance(fp tol) noexcept;
41
+
42
+ /**
43
+ * @brief Compute the squared magnitude of a complex number.
44
+ * @param a The complex number.
45
+ * @returns The squared magnitude.
46
+ */
47
+ [[nodiscard]] static fp mag2(const Complex& a) noexcept;
48
+
49
+ /**
50
+ * @brief Compute the magnitude of a complex number.
51
+ * @param a The complex number.
52
+ * @returns The magnitude.
53
+ */
54
+ [[nodiscard]] static fp mag(const Complex& a) noexcept;
55
+
56
+ /**
57
+ * @brief Compute the argument of a complex number.
58
+ * @param a The complex number.
59
+ * @returns The argument.
60
+ */
61
+ [[nodiscard]] static fp arg(const Complex& a) noexcept;
62
+
63
+ /**
64
+ * @brief Compute the complex conjugate of a complex number.
65
+ * @param a The complex number.
66
+ * @returns The complex conjugate.
67
+ * @note Conjugation is efficiently handled by just flipping the sign of the
68
+ * imaginary pointer.
69
+ */
70
+ [[nodiscard]] static Complex conj(const Complex& a) noexcept;
71
+
72
+ /**
73
+ * @brief Compute the negation of a complex number.
74
+ * @param a The complex number.
75
+ * @returns The negation.
76
+ * @note Negation is efficiently handled by just flipping the sign of both
77
+ * pointers.
78
+ */
79
+ [[nodiscard]] static Complex neg(const Complex& a) noexcept;
80
+
81
+ /**
82
+ * @brief Lookup a complex value in the complex table; if not found add it.
83
+ * @param c The complex number.
84
+ * @return The found or added complex number.
85
+ */
86
+ [[nodiscard]] Complex lookup(const Complex& c);
87
+
88
+ /**
89
+ * @see lookup(fp r, fp i)
90
+ */
91
+ [[nodiscard]] Complex lookup(const std::complex<fp>& c);
92
+
93
+ /**
94
+ * @see lookup(fp r, fp i)
95
+ */
96
+ [[nodiscard]] Complex lookup(const ComplexValue& c);
97
+
98
+ /**
99
+ * @brief Lookup a real value in the complex table; if not found add it.
100
+ * @param r The real number.
101
+ * @return The found or added complex number with real part r and imaginary
102
+ * part zero.
103
+ */
104
+ [[nodiscard]] Complex lookup(fp r);
105
+
106
+ /**
107
+ * @brief Lookup a complex value in the complex table; if not found add it.
108
+ * @param r The real part.
109
+ * @param i The imaginary part.
110
+ * @return The found or added complex number.
111
+ * @see ComplexTable::lookup
112
+ */
113
+ [[nodiscard]] Complex lookup(fp r, fp i);
114
+
115
+ /**
116
+ * @brief Turn CachedEdge into Edge via lookup.
117
+ * @tparam Node The type of the node.
118
+ * @param ce The cached edge.
119
+ * @return The edge with looked-up weight. The zero terminal if the new weight
120
+ * is exactly zero.
121
+ */
122
+ template <class Node>
123
+ [[nodiscard]] Edge<Node> lookup(const CachedEdge<Node>& ce) {
124
+ auto e = Edge<Node>{ce.p, lookup(ce.w)};
125
+ if (e.w.exactlyZero()) {
126
+ e.p = Node::getTerminal();
127
+ }
128
+ return e;
129
+ }
130
+
131
+ /**
132
+ * @brief Check whether a complex number is one of the static ones.
133
+ * @param c The complex number.
134
+ * @return Whether the complex number is one of the static ones.
135
+ */
136
+ [[nodiscard]] static constexpr bool isStaticComplex(const Complex& c) {
137
+ return c.exactlyZero() || c.exactlyOne();
138
+ }
139
+
140
+ /**
141
+ * @brief Get the number of stored real numbers.
142
+ * @return The number of stored real numbers.
143
+ */
144
+ [[nodiscard]] std::size_t realCount() const noexcept;
145
+
146
+ private:
147
+ /// A pointer to the unique table to use for calculations
148
+ RealNumberUniqueTable* uniqueTable;
149
+ };
150
+ } // namespace dd
@@ -0,0 +1,184 @@
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 "dd/DDDefinitions.hpp"
14
+
15
+ #include <cmath>
16
+ #include <complex>
17
+ #include <cstddef>
18
+ #include <cstdint>
19
+ #include <functional>
20
+ #include <iostream>
21
+ #include <string>
22
+ #include <utility>
23
+
24
+ namespace dd {
25
+ /// A complex number represented by two floating point values.
26
+ struct ComplexValue {
27
+ /// real part
28
+ fp r{};
29
+ /// imaginary part
30
+ fp i{};
31
+
32
+ ComplexValue() = default;
33
+ // NOLINTNEXTLINE(google-explicit-constructor) We want impl. conv. from reals
34
+ ComplexValue(const fp real) noexcept : r{real} {}
35
+ explicit ComplexValue(const std::complex<fp>& c) noexcept
36
+ : r{c.real()}, i{c.imag()} {}
37
+ ComplexValue(const fp real, const fp imag) noexcept : r{real}, i{imag} {}
38
+
39
+ /**
40
+ * @brief Check for exact equality.
41
+ * @param other The other complex number to compare to.
42
+ * @returns True if the complex numbers are exactly equal, false otherwise.
43
+ */
44
+ [[nodiscard]] bool operator==(const ComplexValue& other) const noexcept;
45
+
46
+ /// @see operator==
47
+ [[nodiscard]] bool operator!=(const ComplexValue& other) const noexcept;
48
+
49
+ /**
50
+ * @brief Check whether the complex number is exactly equal to zero.
51
+ * @return True if the complex number is exactly equal to zero, false
52
+ * otherwise.
53
+ */
54
+ [[nodiscard]] bool exactlyZero() const noexcept { return r == 0. && i == 0.; }
55
+
56
+ /**
57
+ * @brief Check whether the complex number is exactly equal to one.
58
+ * @return True if the complex number is exactly equal to one, false
59
+ * otherwise.
60
+ */
61
+ [[nodiscard]] bool exactlyOne() const noexcept { return r == 1. && i == 0.; }
62
+
63
+ /**
64
+ * @brief Check whether the complex number is approximately equal to the
65
+ * given complex number.
66
+ * @param c The complex number to compare to.
67
+ * @returns True if the complex number is approximately equal to the given
68
+ * complex number, false otherwise.
69
+ * @see RealNumber::approximatelyEquals
70
+ */
71
+ [[nodiscard]] bool approximatelyEquals(const ComplexValue& c) const noexcept;
72
+
73
+ /**
74
+ * @brief Check whether the complex number is approximately equal to zero.
75
+ * @returns True if the complex number is approximately equal to zero, false
76
+ * otherwise.
77
+ * @see RealNumber::approximatelyZero
78
+ */
79
+ [[nodiscard]] bool approximatelyZero() const noexcept;
80
+
81
+ /**
82
+ * @brief Write a binary representation of the complex number to the given
83
+ * output stream.
84
+ * @param os The output stream to write to.
85
+ */
86
+ void writeBinary(std::ostream& os) const;
87
+
88
+ /**
89
+ * @brief Read a binary representation of the complex number from the given
90
+ * input stream.
91
+ * @param is The input stream to read from.
92
+ */
93
+ void readBinary(std::istream& is);
94
+
95
+ /**
96
+ * @brief Construct a complex number from a string.
97
+ * @param realStr The string representation of the real part.
98
+ * @param imagStr The string representation of the imaginary part.
99
+ */
100
+ void fromString(const std::string& realStr, std::string imagStr);
101
+
102
+ /**
103
+ * @brief Get the closest fraction to the given number.
104
+ * @param x The number to approximate.
105
+ * @param maxDenominator The maximum denominator to use.
106
+ * @returns The closest fraction to the given number as a pair of numerator
107
+ * and denominator.
108
+ */
109
+ static std::pair<std::uint64_t, std::uint64_t>
110
+ getLowestFraction(fp x, std::uint64_t maxDenominator = 1U << 10);
111
+
112
+ /**
113
+ * @brief Pretty print the given real number to the given output stream.
114
+ * @param os The output stream to write to.
115
+ * @param num The number to print.
116
+ * @param imaginary Whether the number is imaginary.
117
+ */
118
+ static void printFormatted(std::ostream& os, fp num, bool imaginary = false);
119
+
120
+ /**
121
+ * @brief Print the given complex number to the given output stream.
122
+ * @param real The real part of the complex number.
123
+ * @param imag The imaginary part of the complex number.
124
+ * @param formatted Whether to pretty print the number.
125
+ * @param precision The precision to use for printing numbers..
126
+ * @returns The string representation of the complex number.
127
+ */
128
+ static std::string toString(const fp& real, const fp& imag,
129
+ bool formatted = true, int precision = -1);
130
+
131
+ /// Automatically convert to std::complex<fp>
132
+ explicit operator auto() const noexcept { return std::complex<fp>{r, i}; }
133
+
134
+ /**
135
+ * @brief Compute the squared magnitude of the complex number.
136
+ * @return The squared magnitude of the complex number.
137
+ */
138
+ [[nodiscard]] fp mag2() const noexcept { return (r * r) + (i * i); }
139
+
140
+ /**
141
+ * @brief Compute the magnitude of the complex number.
142
+ * @return The magnitude of the complex number.
143
+ */
144
+ [[nodiscard]] fp mag() const noexcept { return std::hypot(r, i); }
145
+
146
+ /// In-place addition of two complex numbers
147
+ ComplexValue& operator+=(const ComplexValue& rhs) noexcept;
148
+
149
+ ComplexValue& operator*=(const fp& real) noexcept;
150
+ };
151
+
152
+ ComplexValue operator+(const ComplexValue& c1, const ComplexValue& c2);
153
+ ComplexValue operator*(const ComplexValue& c1, fp r);
154
+ ComplexValue operator*(fp r, const ComplexValue& c1);
155
+ ComplexValue operator*(const ComplexValue& c1, const ComplexValue& c2);
156
+ ComplexValue operator/(const ComplexValue& c1, fp r);
157
+ ComplexValue operator/(const ComplexValue& c1, const ComplexValue& c2);
158
+
159
+ /**
160
+ * @brief Print a complex value to the given output stream.
161
+ * @param os The output stream to write to.
162
+ * @param c The complex value to print.
163
+ * @returns The output stream.
164
+ */
165
+ std::ostream& operator<<(std::ostream& os, const ComplexValue& c);
166
+ } // namespace dd
167
+
168
+ /// Hash function for complex values
169
+ template <> struct std::hash<dd::ComplexValue> {
170
+ /**
171
+ * @brief Compute the hash value for the given complex value.
172
+ * @details The hash value is computed by scaling the real and imaginary part
173
+ * by the tolerance of the complex table, rounding the result to the nearest
174
+ * integer and computing the hash value of the resulting pair of integers.
175
+ * @param c The complex value to compute the hash value for.
176
+ * @returns The hash value for the given complex value.
177
+ * @note It is rather hard to define good hash functions for floating point
178
+ * numbers. This hash function is not perfect, but it is fast and should
179
+ * provide a good distribution of hash values. Furthermore, two floating point
180
+ * numbers that are within the tolerance of the complex table will always
181
+ * produce the same hash value.
182
+ */
183
+ std::size_t operator()(dd::ComplexValue const& c) const noexcept;
184
+ };
@@ -0,0 +1,183 @@
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
+ /**
12
+ * @file ComputeTable.hpp
13
+ * @brief Data structure for caching computed results of binary operations
14
+ */
15
+
16
+ #pragma once
17
+
18
+ #include "dd/Node.hpp"
19
+ #include "dd/statistics/TableStatistics.hpp"
20
+ #include "ir/Definitions.hpp"
21
+
22
+ #include <cstddef>
23
+ #include <functional>
24
+ #include <iostream>
25
+ #include <stdexcept>
26
+ #include <vector>
27
+
28
+ namespace dd {
29
+
30
+ /**
31
+ * @brief Data structure for caching computed results of binary operations
32
+ * @tparam LeftOperandType type of the operation's left operand
33
+ * @tparam RightOperandType type of the operation's right operand
34
+ * @tparam ResultType type of the operation's result
35
+ */
36
+ template <class LeftOperandType, class RightOperandType, class ResultType>
37
+ class ComputeTable {
38
+ public:
39
+ /// Default number of buckets for the compute table
40
+ static constexpr std::size_t DEFAULT_NUM_BUCKETS = 16384U;
41
+
42
+ /**
43
+ * Default constructor
44
+ * @param numBuckets Number of hash table buckets. Must be a power of two.
45
+ */
46
+ explicit ComputeTable(const size_t numBuckets = DEFAULT_NUM_BUCKETS) {
47
+ // numBuckets must be a power of two
48
+ if ((numBuckets & (numBuckets - 1)) != 0) {
49
+ throw std::invalid_argument("Number of buckets must be a power of two.");
50
+ }
51
+ stats.entrySize = sizeof(Entry);
52
+ stats.numBuckets = numBuckets;
53
+ valid = std::vector(numBuckets, false);
54
+ table = std::vector<Entry>(numBuckets);
55
+ }
56
+
57
+ /**
58
+ * @brief An entry in the compute table
59
+ * @details A triple consisting of the left operand, the right operand, and
60
+ * the result of a binary operation.
61
+ */
62
+ struct Entry {
63
+ LeftOperandType leftOperand;
64
+ RightOperandType rightOperand;
65
+ ResultType result;
66
+ };
67
+
68
+ /**
69
+ * @brief Compute the hash value for a given pair of operands
70
+ * @param leftOperand The left operand
71
+ * @param rightOperand The right operand
72
+ * @return The hash value
73
+ */
74
+ [[nodiscard]] std::size_t hash(const LeftOperandType& leftOperand,
75
+ const RightOperandType& rightOperand) const {
76
+ auto h1 = std::hash<LeftOperandType>{}(leftOperand);
77
+ if constexpr (std::is_same_v<LeftOperandType, dNode*>) {
78
+ if (!dNode::isTerminal(leftOperand)) {
79
+ h1 = qc::combineHash(
80
+ h1, dd::dNode::getDensityMatrixTempFlags(leftOperand->flags));
81
+ }
82
+ }
83
+ auto h2 = std::hash<RightOperandType>{}(rightOperand);
84
+ if constexpr (std::is_same_v<RightOperandType, dNode*>) {
85
+ if (!dNode::isTerminal(rightOperand)) {
86
+ h2 = qc::combineHash(
87
+ h2, dd::dNode::getDensityMatrixTempFlags(rightOperand->flags));
88
+ }
89
+ }
90
+ const auto hash = qc::combineHash(h1, h2);
91
+ const auto mask = stats.numBuckets - 1;
92
+ return hash & mask;
93
+ }
94
+
95
+ /// Get a reference to the underlying table
96
+ [[nodiscard]] const auto& getTable() const { return table; }
97
+
98
+ /// Get a reference to the statistics
99
+ [[nodiscard]] const auto& getStats() const noexcept { return stats; }
100
+
101
+ /**
102
+ * @brief Insert a new entry into the compute table
103
+ * @details Any existing entry for the resulting hash value will be replaced.
104
+ * @param leftOperand The left operand
105
+ * @param rightOperand The right operand
106
+ * @param result The result of the operation
107
+ */
108
+ void insert(const LeftOperandType& leftOperand,
109
+ const RightOperandType& rightOperand, const ResultType& result) {
110
+ const auto key = hash(leftOperand, rightOperand);
111
+ if (valid[key]) {
112
+ ++stats.collisions;
113
+ } else {
114
+ stats.trackInsert();
115
+ valid[key] = true;
116
+ }
117
+ table[key] = {leftOperand, rightOperand, result};
118
+ }
119
+
120
+ /**
121
+ * @brief Look up a result in the compute table
122
+ * @param leftOperand The left operand
123
+ * @param rightOperand The right operand
124
+ * @param useDensityMatrix Whether a density matrix is expected
125
+ * @return A pointer to the result if it is found, otherwise nullptr.
126
+ */
127
+ ResultType* lookup(const LeftOperandType& leftOperand,
128
+ const RightOperandType& rightOperand,
129
+ [[maybe_unused]] const bool useDensityMatrix = false) {
130
+ ResultType* result = nullptr;
131
+ ++stats.lookups;
132
+ const auto key = hash(leftOperand, rightOperand);
133
+ if (!valid[key]) {
134
+ return result;
135
+ }
136
+
137
+ auto& entry = table[key];
138
+ if (entry.leftOperand != leftOperand) {
139
+ return result;
140
+ }
141
+ if (entry.rightOperand != rightOperand) {
142
+ return result;
143
+ }
144
+
145
+ if constexpr (std::is_same_v<RightOperandType, dNode*> ||
146
+ std::is_same_v<RightOperandType, dCachedEdge>) {
147
+ // Since density matrices are reduced representations of matrices, a
148
+ // density matrix may not be returned when a matrix is required and vice
149
+ // versa
150
+ if (!dNode::isTerminal(entry.result.p) &&
151
+ dNode::isDensityMatrixNode(entry.result.p->flags) !=
152
+ useDensityMatrix) {
153
+ return result;
154
+ }
155
+ }
156
+ ++stats.hits;
157
+ return &entry.result;
158
+ }
159
+
160
+ /**
161
+ * @brief Clear the compute table
162
+ * @details Sets all entries to invalid.
163
+ */
164
+ void clear() { valid = std::vector(stats.numBuckets, false); }
165
+
166
+ /**
167
+ * @brief Print the statistics of the compute table
168
+ * @param os The output stream to print to
169
+ * @return The output stream
170
+ */
171
+ std::ostream& printStatistics(std::ostream& os = std::cout) const {
172
+ return os << stats;
173
+ }
174
+
175
+ private:
176
+ /// The actual table storing the entries
177
+ std::vector<Entry> table;
178
+ /// Dynamic bitset to mark valid entries
179
+ std::vector<bool> valid;
180
+ /// Statistics of the compute table
181
+ TableStatistics stats{};
182
+ };
183
+ } // namespace dd
@@ -0,0 +1,139 @@
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 "ir/Definitions.hpp"
14
+
15
+ #include <array>
16
+ #include <cmath>
17
+ #include <complex>
18
+ #include <cstddef>
19
+ #include <cstdint>
20
+ #include <string>
21
+ #include <type_traits>
22
+ #include <unordered_map>
23
+ #include <utility>
24
+ #include <vector>
25
+
26
+ namespace dd {
27
+ /**
28
+ * @brief Integer type used for indexing qubits
29
+ * @details `std::uint16_t` can address up to 65536 qubits as [0, ..., 65535].
30
+ * @note If you need even more qubits, this can be increased to `std::uint32_t`.
31
+ * Beware of the increased memory footprint of matrix nodes.
32
+ */
33
+ using Qubit = std::uint16_t;
34
+
35
+ /**
36
+ * @brief Floating point type to use for computations
37
+ * @note Adjusting the precision might lead to unexpected results.
38
+ */
39
+ using fp = double;
40
+ static_assert(
41
+ std::is_floating_point_v<fp>,
42
+ "fp should be a floating point type (float, *double*, long double)");
43
+
44
+ // logic radix
45
+ static constexpr std::uint8_t RADIX = 2;
46
+ // max no. of edges = RADIX^2
47
+ static constexpr std::uint8_t NEDGE = RADIX * RADIX;
48
+
49
+ enum class BasisStates : std::uint8_t {
50
+ zero, // NOLINT(readability-identifier-naming)
51
+ one, // NOLINT(readability-identifier-naming)
52
+ plus, // NOLINT(readability-identifier-naming)
53
+ minus, // NOLINT(readability-identifier-naming)
54
+ right, // NOLINT(readability-identifier-naming)
55
+ left // NOLINT(readability-identifier-naming)
56
+ };
57
+
58
+ static constexpr fp SQRT2_2 = static_cast<fp>(
59
+ 0.707106781186547524400844362104849039284835937688474036588L);
60
+ static constexpr fp PI = static_cast<fp>(
61
+ 3.141592653589793238462643383279502884197169399375105820974L);
62
+ static constexpr fp PI_2 = static_cast<fp>(
63
+ 1.570796326794896619231321691639751442098584699687552910487L);
64
+ static constexpr fp PI_4 = static_cast<fp>(
65
+ 0.785398163397448309615660845819875721049292349843776455243L);
66
+
67
+ static constexpr std::uint64_t SERIALIZATION_VERSION = 1;
68
+
69
+ struct PairHash {
70
+ std::size_t
71
+ operator()(const std::pair<std::size_t, std::size_t>& p) const noexcept {
72
+ return qc::combineHash(p.first, p.second);
73
+ }
74
+ };
75
+
76
+ using CVec = std::vector<std::complex<fp>>;
77
+ using SparseCVec = std::unordered_map<std::size_t, std::complex<fp>>;
78
+ using SparsePVec = std::unordered_map<std::size_t, fp>;
79
+ using SparsePVecStrKeys = std::unordered_map<std::string, fp>;
80
+ using CMat = std::vector<CVec>;
81
+ using SparseCMat = std::unordered_map<std::pair<std::size_t, std::size_t>,
82
+ std::complex<fp>, PairHash>;
83
+
84
+ using GateMatrix = std::array<std::complex<fp>, NEDGE>;
85
+ using TwoQubitGateMatrix =
86
+ std::array<std::array<std::complex<fp>, NEDGE>, NEDGE>;
87
+
88
+ /**
89
+ * @brief Converts a decimal number to a binary string (big endian)
90
+ * @param value The decimal number to convert
91
+ * @param nbits The number of bits to use for the binary representation
92
+ * @return The binary representation of the decimal number
93
+ */
94
+ [[nodiscard]] static inline std::string
95
+ intToBinaryString(const std::size_t value, const std::size_t nbits) {
96
+ std::string binary(nbits, '0');
97
+ for (std::size_t j = 0; j < nbits; ++j) {
98
+ if ((value & (1ULL << j)) != 0U) {
99
+ binary[nbits - 1 - j] = '1';
100
+ }
101
+ }
102
+ return binary;
103
+ }
104
+
105
+ // calculates the Units in Last Place (ULP) distance of two floating point
106
+ // numbers
107
+ [[maybe_unused]] static std::size_t ulpDistance(fp a, fp b) {
108
+ // NOLINTNEXTLINE(clang-diagnostic-float-equal)
109
+ if (a == b) {
110
+ return 0;
111
+ }
112
+
113
+ std::size_t ulps = 1;
114
+ fp nextFP = std::nextafter(a, b);
115
+ // NOLINTNEXTLINE(clang-diagnostic-float-equal)
116
+ while (nextFP != b) {
117
+ ulps++;
118
+ nextFP = std::nextafter(nextFP, b);
119
+ }
120
+ return ulps;
121
+ }
122
+
123
+ /**
124
+ * @brief 64bit mixing hash (from MurmurHash3)
125
+ * @details Hash function for 64bit integers adapted from MurmurHash3
126
+ * @param k the number to hash
127
+ * @returns the hash value
128
+ * @see https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp
129
+ */
130
+ [[nodiscard]] constexpr std::size_t murmur64(std::size_t k) noexcept {
131
+ k ^= k >> 33;
132
+ k *= 0xff51afd7ed558ccdULL;
133
+ k ^= k >> 33;
134
+ k *= 0xc4ceb9fe1a85ec53ULL;
135
+ k ^= k >> 33;
136
+ return k;
137
+ }
138
+
139
+ } // namespace dd