mqt-core 3.1.0__cp313-cp313t-win_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (343) hide show
  1. mqt/core/__init__.py +89 -0
  2. mqt/core/__main__.py +55 -0
  3. mqt/core/_commands.py +52 -0
  4. mqt/core/_compat/__init__.py +11 -0
  5. mqt/core/_compat/typing.py +29 -0
  6. mqt/core/_version.py +21 -0
  7. mqt/core/_version.pyi +12 -0
  8. mqt/core/bin/mqt-core-algorithms.dll +0 -0
  9. mqt/core/bin/mqt-core-circuit-optimizer.dll +0 -0
  10. mqt/core/bin/mqt-core-dd.dll +0 -0
  11. mqt/core/bin/mqt-core-ds.dll +0 -0
  12. mqt/core/bin/mqt-core-ir.dll +0 -0
  13. mqt/core/bin/mqt-core-na.dll +0 -0
  14. mqt/core/bin/mqt-core-qasm.dll +0 -0
  15. mqt/core/bin/mqt-core-zx.dll +0 -0
  16. mqt/core/dd.cp313t-win_arm64.pyd +0 -0
  17. mqt/core/dd.pyi +1031 -0
  18. mqt/core/dd_evaluation.py +368 -0
  19. mqt/core/include/mqt-core/algorithms/BernsteinVazirani.hpp +39 -0
  20. mqt/core/include/mqt-core/algorithms/GHZState.hpp +18 -0
  21. mqt/core/include/mqt-core/algorithms/Grover.hpp +33 -0
  22. mqt/core/include/mqt-core/algorithms/QFT.hpp +21 -0
  23. mqt/core/include/mqt-core/algorithms/QPE.hpp +30 -0
  24. mqt/core/include/mqt-core/algorithms/RandomCliffordCircuit.hpp +22 -0
  25. mqt/core/include/mqt-core/algorithms/StatePreparation.hpp +43 -0
  26. mqt/core/include/mqt-core/algorithms/WState.hpp +18 -0
  27. mqt/core/include/mqt-core/algorithms/mqt_core_algorithms_export.h +43 -0
  28. mqt/core/include/mqt-core/boost/config/abi/borland_prefix.hpp +27 -0
  29. mqt/core/include/mqt-core/boost/config/abi/borland_suffix.hpp +12 -0
  30. mqt/core/include/mqt-core/boost/config/abi/msvc_prefix.hpp +22 -0
  31. mqt/core/include/mqt-core/boost/config/abi/msvc_suffix.hpp +8 -0
  32. mqt/core/include/mqt-core/boost/config/abi_prefix.hpp +25 -0
  33. mqt/core/include/mqt-core/boost/config/abi_suffix.hpp +25 -0
  34. mqt/core/include/mqt-core/boost/config/assert_cxx03.hpp +211 -0
  35. mqt/core/include/mqt-core/boost/config/assert_cxx11.hpp +212 -0
  36. mqt/core/include/mqt-core/boost/config/assert_cxx14.hpp +47 -0
  37. mqt/core/include/mqt-core/boost/config/assert_cxx17.hpp +65 -0
  38. mqt/core/include/mqt-core/boost/config/assert_cxx20.hpp +59 -0
  39. mqt/core/include/mqt-core/boost/config/assert_cxx23.hpp +41 -0
  40. mqt/core/include/mqt-core/boost/config/assert_cxx98.hpp +23 -0
  41. mqt/core/include/mqt-core/boost/config/auto_link.hpp +525 -0
  42. mqt/core/include/mqt-core/boost/config/compiler/borland.hpp +342 -0
  43. mqt/core/include/mqt-core/boost/config/compiler/clang.hpp +370 -0
  44. mqt/core/include/mqt-core/boost/config/compiler/clang_version.hpp +89 -0
  45. mqt/core/include/mqt-core/boost/config/compiler/codegear.hpp +389 -0
  46. mqt/core/include/mqt-core/boost/config/compiler/comeau.hpp +59 -0
  47. mqt/core/include/mqt-core/boost/config/compiler/common_edg.hpp +185 -0
  48. mqt/core/include/mqt-core/boost/config/compiler/compaq_cxx.hpp +19 -0
  49. mqt/core/include/mqt-core/boost/config/compiler/cray.hpp +446 -0
  50. mqt/core/include/mqt-core/boost/config/compiler/diab.hpp +26 -0
  51. mqt/core/include/mqt-core/boost/config/compiler/digitalmars.hpp +146 -0
  52. mqt/core/include/mqt-core/boost/config/compiler/gcc.hpp +386 -0
  53. mqt/core/include/mqt-core/boost/config/compiler/gcc_xml.hpp +115 -0
  54. mqt/core/include/mqt-core/boost/config/compiler/greenhills.hpp +28 -0
  55. mqt/core/include/mqt-core/boost/config/compiler/hp_acc.hpp +153 -0
  56. mqt/core/include/mqt-core/boost/config/compiler/intel.hpp +577 -0
  57. mqt/core/include/mqt-core/boost/config/compiler/kai.hpp +33 -0
  58. mqt/core/include/mqt-core/boost/config/compiler/metrowerks.hpp +201 -0
  59. mqt/core/include/mqt-core/boost/config/compiler/mpw.hpp +143 -0
  60. mqt/core/include/mqt-core/boost/config/compiler/nvcc.hpp +64 -0
  61. mqt/core/include/mqt-core/boost/config/compiler/pathscale.hpp +141 -0
  62. mqt/core/include/mqt-core/boost/config/compiler/pgi.hpp +23 -0
  63. mqt/core/include/mqt-core/boost/config/compiler/sgi_mipspro.hpp +29 -0
  64. mqt/core/include/mqt-core/boost/config/compiler/sunpro_cc.hpp +225 -0
  65. mqt/core/include/mqt-core/boost/config/compiler/vacpp.hpp +189 -0
  66. mqt/core/include/mqt-core/boost/config/compiler/visualc.hpp +398 -0
  67. mqt/core/include/mqt-core/boost/config/compiler/xlcpp.hpp +303 -0
  68. mqt/core/include/mqt-core/boost/config/compiler/xlcpp_zos.hpp +174 -0
  69. mqt/core/include/mqt-core/boost/config/detail/cxx_composite.hpp +218 -0
  70. mqt/core/include/mqt-core/boost/config/detail/posix_features.hpp +95 -0
  71. mqt/core/include/mqt-core/boost/config/detail/select_compiler_config.hpp +157 -0
  72. mqt/core/include/mqt-core/boost/config/detail/select_platform_config.hpp +147 -0
  73. mqt/core/include/mqt-core/boost/config/detail/select_stdlib_config.hpp +121 -0
  74. mqt/core/include/mqt-core/boost/config/detail/suffix.hpp +1334 -0
  75. mqt/core/include/mqt-core/boost/config/header_deprecated.hpp +26 -0
  76. mqt/core/include/mqt-core/boost/config/helper_macros.hpp +37 -0
  77. mqt/core/include/mqt-core/boost/config/no_tr1/cmath.hpp +28 -0
  78. mqt/core/include/mqt-core/boost/config/no_tr1/complex.hpp +28 -0
  79. mqt/core/include/mqt-core/boost/config/no_tr1/functional.hpp +28 -0
  80. mqt/core/include/mqt-core/boost/config/no_tr1/memory.hpp +28 -0
  81. mqt/core/include/mqt-core/boost/config/no_tr1/utility.hpp +28 -0
  82. mqt/core/include/mqt-core/boost/config/platform/aix.hpp +33 -0
  83. mqt/core/include/mqt-core/boost/config/platform/amigaos.hpp +15 -0
  84. mqt/core/include/mqt-core/boost/config/platform/beos.hpp +26 -0
  85. mqt/core/include/mqt-core/boost/config/platform/bsd.hpp +83 -0
  86. mqt/core/include/mqt-core/boost/config/platform/cloudabi.hpp +18 -0
  87. mqt/core/include/mqt-core/boost/config/platform/cray.hpp +18 -0
  88. mqt/core/include/mqt-core/boost/config/platform/cygwin.hpp +71 -0
  89. mqt/core/include/mqt-core/boost/config/platform/haiku.hpp +31 -0
  90. mqt/core/include/mqt-core/boost/config/platform/hpux.hpp +87 -0
  91. mqt/core/include/mqt-core/boost/config/platform/irix.hpp +31 -0
  92. mqt/core/include/mqt-core/boost/config/platform/linux.hpp +106 -0
  93. mqt/core/include/mqt-core/boost/config/platform/macos.hpp +87 -0
  94. mqt/core/include/mqt-core/boost/config/platform/qnxnto.hpp +31 -0
  95. mqt/core/include/mqt-core/boost/config/platform/solaris.hpp +31 -0
  96. mqt/core/include/mqt-core/boost/config/platform/symbian.hpp +97 -0
  97. mqt/core/include/mqt-core/boost/config/platform/vms.hpp +25 -0
  98. mqt/core/include/mqt-core/boost/config/platform/vxworks.hpp +422 -0
  99. mqt/core/include/mqt-core/boost/config/platform/wasm.hpp +23 -0
  100. mqt/core/include/mqt-core/boost/config/platform/win32.hpp +90 -0
  101. mqt/core/include/mqt-core/boost/config/platform/zos.hpp +32 -0
  102. mqt/core/include/mqt-core/boost/config/pragma_message.hpp +31 -0
  103. mqt/core/include/mqt-core/boost/config/requires_threads.hpp +92 -0
  104. mqt/core/include/mqt-core/boost/config/stdlib/dinkumware.hpp +324 -0
  105. mqt/core/include/mqt-core/boost/config/stdlib/libcomo.hpp +93 -0
  106. mqt/core/include/mqt-core/boost/config/stdlib/libcpp.hpp +180 -0
  107. mqt/core/include/mqt-core/boost/config/stdlib/libstdcpp3.hpp +482 -0
  108. mqt/core/include/mqt-core/boost/config/stdlib/modena.hpp +79 -0
  109. mqt/core/include/mqt-core/boost/config/stdlib/msl.hpp +98 -0
  110. mqt/core/include/mqt-core/boost/config/stdlib/roguewave.hpp +208 -0
  111. mqt/core/include/mqt-core/boost/config/stdlib/sgi.hpp +168 -0
  112. mqt/core/include/mqt-core/boost/config/stdlib/stlport.hpp +258 -0
  113. mqt/core/include/mqt-core/boost/config/stdlib/vacpp.hpp +74 -0
  114. mqt/core/include/mqt-core/boost/config/stdlib/xlcpp_zos.hpp +61 -0
  115. mqt/core/include/mqt-core/boost/config/user.hpp +133 -0
  116. mqt/core/include/mqt-core/boost/config/warning_disable.hpp +47 -0
  117. mqt/core/include/mqt-core/boost/config/workaround.hpp +305 -0
  118. mqt/core/include/mqt-core/boost/config.hpp +67 -0
  119. mqt/core/include/mqt-core/boost/cstdint.hpp +556 -0
  120. mqt/core/include/mqt-core/boost/cxx11_char_types.hpp +70 -0
  121. mqt/core/include/mqt-core/boost/detail/workaround.hpp +10 -0
  122. mqt/core/include/mqt-core/boost/limits.hpp +146 -0
  123. mqt/core/include/mqt-core/boost/multiprecision/complex128.hpp +24 -0
  124. mqt/core/include/mqt-core/boost/multiprecision/complex_adaptor.hpp +1046 -0
  125. mqt/core/include/mqt-core/boost/multiprecision/concepts/mp_number_archetypes.hpp +257 -0
  126. mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float/io.hpp +698 -0
  127. mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float/transcendental.hpp +157 -0
  128. mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float.hpp +2297 -0
  129. mqt/core/include/mqt-core/boost/multiprecision/cpp_complex.hpp +12 -0
  130. mqt/core/include/mqt-core/boost/multiprecision/cpp_dec_float.hpp +3690 -0
  131. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/add.hpp +368 -0
  132. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/add_unsigned.hpp +387 -0
  133. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/bitwise.hpp +889 -0
  134. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/checked.hpp +178 -0
  135. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/comparison.hpp +374 -0
  136. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/cpp_int_config.hpp +161 -0
  137. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/divide.hpp +703 -0
  138. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/import_export.hpp +248 -0
  139. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/intel_intrinsics.hpp +138 -0
  140. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/limits.hpp +282 -0
  141. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/literals.hpp +295 -0
  142. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/misc.hpp +1457 -0
  143. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/multiply.hpp +848 -0
  144. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/serialize.hpp +211 -0
  145. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/value_pack.hpp +42 -0
  146. mqt/core/include/mqt-core/boost/multiprecision/cpp_int.hpp +2360 -0
  147. mqt/core/include/mqt-core/boost/multiprecision/debug_adaptor.hpp +760 -0
  148. mqt/core/include/mqt-core/boost/multiprecision/detail/assert.hpp +29 -0
  149. mqt/core/include/mqt-core/boost/multiprecision/detail/atomic.hpp +62 -0
  150. mqt/core/include/mqt-core/boost/multiprecision/detail/bitscan.hpp +317 -0
  151. mqt/core/include/mqt-core/boost/multiprecision/detail/check_cpp11_config.hpp +64 -0
  152. mqt/core/include/mqt-core/boost/multiprecision/detail/constexpr.hpp +88 -0
  153. mqt/core/include/mqt-core/boost/multiprecision/detail/default_ops.hpp +4052 -0
  154. mqt/core/include/mqt-core/boost/multiprecision/detail/digits.hpp +49 -0
  155. mqt/core/include/mqt-core/boost/multiprecision/detail/dynamic_array.hpp +44 -0
  156. mqt/core/include/mqt-core/boost/multiprecision/detail/empty_value.hpp +87 -0
  157. mqt/core/include/mqt-core/boost/multiprecision/detail/endian.hpp +35 -0
  158. mqt/core/include/mqt-core/boost/multiprecision/detail/et_ops.hpp +1831 -0
  159. mqt/core/include/mqt-core/boost/multiprecision/detail/float128_functions.hpp +95 -0
  160. mqt/core/include/mqt-core/boost/multiprecision/detail/float_string_cvt.hpp +333 -0
  161. mqt/core/include/mqt-core/boost/multiprecision/detail/fpclassify.hpp +101 -0
  162. mqt/core/include/mqt-core/boost/multiprecision/detail/functions/constants.hpp +288 -0
  163. mqt/core/include/mqt-core/boost/multiprecision/detail/functions/pow.hpp +905 -0
  164. mqt/core/include/mqt-core/boost/multiprecision/detail/functions/trig.hpp +1058 -0
  165. mqt/core/include/mqt-core/boost/multiprecision/detail/functions/trunc.hpp +82 -0
  166. mqt/core/include/mqt-core/boost/multiprecision/detail/generic_interconvert.hpp +687 -0
  167. mqt/core/include/mqt-core/boost/multiprecision/detail/hash.hpp +56 -0
  168. mqt/core/include/mqt-core/boost/multiprecision/detail/integer_ops.hpp +474 -0
  169. mqt/core/include/mqt-core/boost/multiprecision/detail/itos.hpp +39 -0
  170. mqt/core/include/mqt-core/boost/multiprecision/detail/min_max.hpp +106 -0
  171. mqt/core/include/mqt-core/boost/multiprecision/detail/no_et_ops.hpp +661 -0
  172. mqt/core/include/mqt-core/boost/multiprecision/detail/no_exceptions_support.hpp +55 -0
  173. mqt/core/include/mqt-core/boost/multiprecision/detail/number_base.hpp +1656 -0
  174. mqt/core/include/mqt-core/boost/multiprecision/detail/number_compare.hpp +848 -0
  175. mqt/core/include/mqt-core/boost/multiprecision/detail/precision.hpp +313 -0
  176. mqt/core/include/mqt-core/boost/multiprecision/detail/rebind.hpp +19 -0
  177. mqt/core/include/mqt-core/boost/multiprecision/detail/standalone_config.hpp +148 -0
  178. mqt/core/include/mqt-core/boost/multiprecision/detail/static_array.hpp +42 -0
  179. mqt/core/include/mqt-core/boost/multiprecision/detail/string_helpers.hpp +48 -0
  180. mqt/core/include/mqt-core/boost/multiprecision/detail/tables.hpp +80 -0
  181. mqt/core/include/mqt-core/boost/multiprecision/detail/ublas_interop.hpp +75 -0
  182. mqt/core/include/mqt-core/boost/multiprecision/detail/uniform_int_distribution.hpp +212 -0
  183. mqt/core/include/mqt-core/boost/multiprecision/detail/utype_helper.hpp +374 -0
  184. mqt/core/include/mqt-core/boost/multiprecision/eigen.hpp +248 -0
  185. mqt/core/include/mqt-core/boost/multiprecision/float128.hpp +920 -0
  186. mqt/core/include/mqt-core/boost/multiprecision/fwd.hpp +268 -0
  187. mqt/core/include/mqt-core/boost/multiprecision/gmp.hpp +4060 -0
  188. mqt/core/include/mqt-core/boost/multiprecision/integer.hpp +363 -0
  189. mqt/core/include/mqt-core/boost/multiprecision/logged_adaptor.hpp +834 -0
  190. mqt/core/include/mqt-core/boost/multiprecision/miller_rabin.hpp +221 -0
  191. mqt/core/include/mqt-core/boost/multiprecision/mpc.hpp +1721 -0
  192. mqt/core/include/mqt-core/boost/multiprecision/mpfi.hpp +2559 -0
  193. mqt/core/include/mqt-core/boost/multiprecision/mpfr.hpp +3644 -0
  194. mqt/core/include/mqt-core/boost/multiprecision/number.hpp +2500 -0
  195. mqt/core/include/mqt-core/boost/multiprecision/random.hpp +23 -0
  196. mqt/core/include/mqt-core/boost/multiprecision/rational_adaptor.hpp +1289 -0
  197. mqt/core/include/mqt-core/boost/multiprecision/tommath.hpp +1034 -0
  198. mqt/core/include/mqt-core/boost/multiprecision/traits/explicit_conversion.hpp +67 -0
  199. mqt/core/include/mqt-core/boost/multiprecision/traits/extract_exponent_type.hpp +28 -0
  200. mqt/core/include/mqt-core/boost/multiprecision/traits/is_backend.hpp +91 -0
  201. mqt/core/include/mqt-core/boost/multiprecision/traits/is_byte_container.hpp +51 -0
  202. mqt/core/include/mqt-core/boost/multiprecision/traits/is_complex.hpp +22 -0
  203. mqt/core/include/mqt-core/boost/multiprecision/traits/is_convertible_arithmetic.hpp +51 -0
  204. mqt/core/include/mqt-core/boost/multiprecision/traits/is_restricted_conversion.hpp +47 -0
  205. mqt/core/include/mqt-core/boost/multiprecision/traits/is_variable_precision.hpp +25 -0
  206. mqt/core/include/mqt-core/boost/multiprecision/traits/max_digits10.hpp +79 -0
  207. mqt/core/include/mqt-core/boost/multiprecision/traits/std_integer_traits.hpp +90 -0
  208. mqt/core/include/mqt-core/boost/multiprecision/traits/transcendental_reduction_type.hpp +21 -0
  209. mqt/core/include/mqt-core/boost/version.hpp +32 -0
  210. mqt/core/include/mqt-core/circuit_optimizer/CircuitOptimizer.hpp +106 -0
  211. mqt/core/include/mqt-core/circuit_optimizer/mqt_core_circuit_optimizer_export.h +43 -0
  212. mqt/core/include/mqt-core/datastructures/DirectedAcyclicGraph.hpp +117 -0
  213. mqt/core/include/mqt-core/datastructures/DirectedGraph.hpp +158 -0
  214. mqt/core/include/mqt-core/datastructures/DisjointSet.hpp +50 -0
  215. mqt/core/include/mqt-core/datastructures/Layer.hpp +172 -0
  216. mqt/core/include/mqt-core/datastructures/SymmetricMatrix.hpp +57 -0
  217. mqt/core/include/mqt-core/datastructures/UndirectedGraph.hpp +227 -0
  218. mqt/core/include/mqt-core/datastructures/mqt_core_ds_export.h +43 -0
  219. mqt/core/include/mqt-core/dd/Approximation.hpp +45 -0
  220. mqt/core/include/mqt-core/dd/CachedEdge.hpp +167 -0
  221. mqt/core/include/mqt-core/dd/Complex.hpp +165 -0
  222. mqt/core/include/mqt-core/dd/ComplexNumbers.hpp +150 -0
  223. mqt/core/include/mqt-core/dd/ComplexValue.hpp +184 -0
  224. mqt/core/include/mqt-core/dd/ComputeTable.hpp +183 -0
  225. mqt/core/include/mqt-core/dd/DDDefinitions.hpp +139 -0
  226. mqt/core/include/mqt-core/dd/DDpackageConfig.hpp +104 -0
  227. mqt/core/include/mqt-core/dd/DensityNoiseTable.hpp +114 -0
  228. mqt/core/include/mqt-core/dd/Edge.hpp +416 -0
  229. mqt/core/include/mqt-core/dd/Export.hpp +438 -0
  230. mqt/core/include/mqt-core/dd/FunctionalityConstruction.hpp +75 -0
  231. mqt/core/include/mqt-core/dd/GateMatrixDefinitions.hpp +43 -0
  232. mqt/core/include/mqt-core/dd/LinkedListBase.hpp +45 -0
  233. mqt/core/include/mqt-core/dd/MemoryManager.hpp +193 -0
  234. mqt/core/include/mqt-core/dd/Node.hpp +223 -0
  235. mqt/core/include/mqt-core/dd/NoiseFunctionality.hpp +144 -0
  236. mqt/core/include/mqt-core/dd/Operations.hpp +308 -0
  237. mqt/core/include/mqt-core/dd/Package.hpp +2036 -0
  238. mqt/core/include/mqt-core/dd/Package_fwd.hpp +22 -0
  239. mqt/core/include/mqt-core/dd/RealNumber.hpp +255 -0
  240. mqt/core/include/mqt-core/dd/RealNumberUniqueTable.hpp +217 -0
  241. mqt/core/include/mqt-core/dd/Simulation.hpp +98 -0
  242. mqt/core/include/mqt-core/dd/StateGeneration.hpp +143 -0
  243. mqt/core/include/mqt-core/dd/StochasticNoiseOperationTable.hpp +88 -0
  244. mqt/core/include/mqt-core/dd/UnaryComputeTable.hpp +121 -0
  245. mqt/core/include/mqt-core/dd/UniqueTable.hpp +243 -0
  246. mqt/core/include/mqt-core/dd/mqt_core_dd_export.h +43 -0
  247. mqt/core/include/mqt-core/dd/statistics/MemoryManagerStatistics.hpp +84 -0
  248. mqt/core/include/mqt-core/dd/statistics/PackageStatistics.hpp +55 -0
  249. mqt/core/include/mqt-core/dd/statistics/Statistics.hpp +48 -0
  250. mqt/core/include/mqt-core/dd/statistics/TableStatistics.hpp +79 -0
  251. mqt/core/include/mqt-core/dd/statistics/UniqueTableStatistics.hpp +31 -0
  252. mqt/core/include/mqt-core/ir/Definitions.hpp +108 -0
  253. mqt/core/include/mqt-core/ir/Permutation.hpp +213 -0
  254. mqt/core/include/mqt-core/ir/QuantumComputation.hpp +594 -0
  255. mqt/core/include/mqt-core/ir/Register.hpp +125 -0
  256. mqt/core/include/mqt-core/ir/mqt_core_ir_export.h +43 -0
  257. mqt/core/include/mqt-core/ir/operations/AodOperation.hpp +92 -0
  258. mqt/core/include/mqt-core/ir/operations/ClassicControlledOperation.hpp +156 -0
  259. mqt/core/include/mqt-core/ir/operations/CompoundOperation.hpp +210 -0
  260. mqt/core/include/mqt-core/ir/operations/Control.hpp +142 -0
  261. mqt/core/include/mqt-core/ir/operations/Expression.hpp +847 -0
  262. mqt/core/include/mqt-core/ir/operations/NonUnitaryOperation.hpp +118 -0
  263. mqt/core/include/mqt-core/ir/operations/OpType.hpp +115 -0
  264. mqt/core/include/mqt-core/ir/operations/OpType.inc +75 -0
  265. mqt/core/include/mqt-core/ir/operations/Operation.hpp +245 -0
  266. mqt/core/include/mqt-core/ir/operations/StandardOperation.hpp +138 -0
  267. mqt/core/include/mqt-core/ir/operations/SymbolicOperation.hpp +144 -0
  268. mqt/core/include/mqt-core/na/NAComputation.hpp +185 -0
  269. mqt/core/include/mqt-core/na/entities/Atom.hpp +62 -0
  270. mqt/core/include/mqt-core/na/entities/Location.hpp +154 -0
  271. mqt/core/include/mqt-core/na/entities/Zone.hpp +95 -0
  272. mqt/core/include/mqt-core/na/mqt_core_na_export.h +43 -0
  273. mqt/core/include/mqt-core/na/operations/GlobalCZOp.hpp +38 -0
  274. mqt/core/include/mqt-core/na/operations/GlobalOp.hpp +58 -0
  275. mqt/core/include/mqt-core/na/operations/GlobalRYOp.hpp +42 -0
  276. mqt/core/include/mqt-core/na/operations/LoadOp.hpp +89 -0
  277. mqt/core/include/mqt-core/na/operations/LocalOp.hpp +56 -0
  278. mqt/core/include/mqt-core/na/operations/LocalRZOp.hpp +42 -0
  279. mqt/core/include/mqt-core/na/operations/LocalUOp.hpp +49 -0
  280. mqt/core/include/mqt-core/na/operations/MoveOp.hpp +66 -0
  281. mqt/core/include/mqt-core/na/operations/Op.hpp +62 -0
  282. mqt/core/include/mqt-core/na/operations/ShuttlingOp.hpp +51 -0
  283. mqt/core/include/mqt-core/na/operations/StoreOp.hpp +87 -0
  284. mqt/core/include/mqt-core/qasm3/Exception.hpp +85 -0
  285. mqt/core/include/mqt-core/qasm3/Gate.hpp +65 -0
  286. mqt/core/include/mqt-core/qasm3/Importer.hpp +192 -0
  287. mqt/core/include/mqt-core/qasm3/InstVisitor.hpp +145 -0
  288. mqt/core/include/mqt-core/qasm3/NestedEnvironment.hpp +41 -0
  289. mqt/core/include/mqt-core/qasm3/Parser.hpp +170 -0
  290. mqt/core/include/mqt-core/qasm3/Scanner.hpp +73 -0
  291. mqt/core/include/mqt-core/qasm3/Statement.hpp +486 -0
  292. mqt/core/include/mqt-core/qasm3/Statement_fwd.hpp +39 -0
  293. mqt/core/include/mqt-core/qasm3/StdGates.hpp +123 -0
  294. mqt/core/include/mqt-core/qasm3/Token.hpp +198 -0
  295. mqt/core/include/mqt-core/qasm3/Types.hpp +238 -0
  296. mqt/core/include/mqt-core/qasm3/Types_fwd.hpp +22 -0
  297. mqt/core/include/mqt-core/qasm3/mqt_core_qasm_export.h +43 -0
  298. mqt/core/include/mqt-core/qasm3/passes/CompilerPass.hpp +22 -0
  299. mqt/core/include/mqt-core/qasm3/passes/ConstEvalPass.hpp +102 -0
  300. mqt/core/include/mqt-core/qasm3/passes/TypeCheckPass.hpp +124 -0
  301. mqt/core/include/mqt-core/zx/FunctionalityConstruction.hpp +125 -0
  302. mqt/core/include/mqt-core/zx/Rational.hpp +318 -0
  303. mqt/core/include/mqt-core/zx/Rules.hpp +132 -0
  304. mqt/core/include/mqt-core/zx/Simplify.hpp +182 -0
  305. mqt/core/include/mqt-core/zx/Utils.hpp +212 -0
  306. mqt/core/include/mqt-core/zx/ZXDefinitions.hpp +93 -0
  307. mqt/core/include/mqt-core/zx/ZXDiagram.hpp +480 -0
  308. mqt/core/include/mqt-core/zx/mqt_core_zx_export.h +43 -0
  309. mqt/core/ir/__init__.pyi +1998 -0
  310. mqt/core/ir/operations.pyi +1019 -0
  311. mqt/core/ir/registers.pyi +91 -0
  312. mqt/core/ir/symbolic.pyi +177 -0
  313. mqt/core/ir.cp313t-win_arm64.pyd +0 -0
  314. mqt/core/lib/mqt-core-algorithms.lib +0 -0
  315. mqt/core/lib/mqt-core-circuit-optimizer.lib +0 -0
  316. mqt/core/lib/mqt-core-dd.lib +0 -0
  317. mqt/core/lib/mqt-core-ds.lib +0 -0
  318. mqt/core/lib/mqt-core-ir.lib +0 -0
  319. mqt/core/lib/mqt-core-na.lib +0 -0
  320. mqt/core/lib/mqt-core-qasm.lib +0 -0
  321. mqt/core/lib/mqt-core-zx.lib +0 -0
  322. mqt/core/plugins/__init__.py +9 -0
  323. mqt/core/plugins/qiskit/__init__.py +19 -0
  324. mqt/core/plugins/qiskit/mqt_to_qiskit.py +354 -0
  325. mqt/core/plugins/qiskit/qiskit_to_mqt.py +455 -0
  326. mqt/core/py.typed +2 -0
  327. mqt/core/share/cmake/mqt-core/AddMQTPythonBinding.cmake +52 -0
  328. mqt/core/share/cmake/mqt-core/Cache.cmake +32 -0
  329. mqt/core/share/cmake/mqt-core/FindGMP.cmake +103 -0
  330. mqt/core/share/cmake/mqt-core/PackageAddTest.cmake +40 -0
  331. mqt/core/share/cmake/mqt-core/PreventInSourceBuilds.cmake +25 -0
  332. mqt/core/share/cmake/mqt-core/StandardProjectSettings.cmake +87 -0
  333. mqt/core/share/cmake/mqt-core/mqt-core-config-version.cmake +85 -0
  334. mqt/core/share/cmake/mqt-core/mqt-core-config.cmake +49 -0
  335. mqt/core/share/cmake/mqt-core/mqt-core-targets-release.cmake +90 -0
  336. mqt/core/share/cmake/mqt-core/mqt-core-targets.cmake +324 -0
  337. mqt_core-3.1.0.dist-info/DELVEWHEEL +2 -0
  338. mqt_core-3.1.0.dist-info/METADATA +168 -0
  339. mqt_core-3.1.0.dist-info/RECORD +343 -0
  340. mqt_core-3.1.0.dist-info/WHEEL +5 -0
  341. mqt_core-3.1.0.dist-info/entry_points.txt +4 -0
  342. mqt_core-3.1.0.dist-info/licenses/LICENSE.md +22 -0
  343. mqt_core.libs/msvcp140.dll +0 -0
@@ -0,0 +1,57 @@
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 <cstddef>
14
+ #include <vector>
15
+
16
+ namespace qc {
17
+ /**
18
+ * @brief Symmetric matrix class with same number of rows and columns that
19
+ * allows access by row and column but uses less memory than a full matrix
20
+ */
21
+ template <typename T> class SymmetricMatrix {
22
+ std::vector<std::vector<T>> data;
23
+
24
+ public:
25
+ // Constructors
26
+ SymmetricMatrix() = default;
27
+ explicit SymmetricMatrix(const size_t size) {
28
+ data.resize(size);
29
+ for (size_t i = 0; i < size; ++i) {
30
+ data[i].resize(i + 1);
31
+ }
32
+ }
33
+
34
+ SymmetricMatrix(const size_t size, const T& value) {
35
+ data.resize(size);
36
+ for (size_t i = 0; i < size; ++i) {
37
+ data[i].resize(i + 1, value);
38
+ }
39
+ }
40
+
41
+ [[nodiscard]] const T& operator()(const size_t row, const size_t col) const {
42
+ if (row < col) {
43
+ return data[col][row];
44
+ }
45
+ return data[row][col];
46
+ }
47
+
48
+ [[nodiscard]] T& operator()(const size_t row, const size_t col) {
49
+ if (row < col) {
50
+ return data[col][row];
51
+ }
52
+ return data[row][col];
53
+ }
54
+
55
+ [[nodiscard]] size_t size() const { return data.size(); }
56
+ };
57
+ } // namespace qc
@@ -0,0 +1,227 @@
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 <cstddef>
16
+ #include <functional>
17
+ #include <numeric>
18
+ #include <optional>
19
+ #include <ostream>
20
+ #include <sstream>
21
+ #include <stdexcept>
22
+ #include <string>
23
+ #include <unordered_map>
24
+ #include <unordered_set>
25
+ #include <utility>
26
+ #include <vector>
27
+
28
+ namespace qc {
29
+
30
+ /// Pairs do not provide a hash function by default, this is the replacement
31
+ template <class T, class U> struct PairHash {
32
+ size_t operator()(const std::pair<T, U>& x) const {
33
+ return combineHash(std::hash<T>{}(x.first), std::hash<U>{}(x.second));
34
+ }
35
+ };
36
+
37
+ /**
38
+ * Class representing generic undirected directed graphs.
39
+ *
40
+ * @tparam V the type of the vertices in the graph. Must implement `operator<<`.
41
+ */
42
+ template <class V, class E> class UndirectedGraph final {
43
+ static_assert(std::is_same_v<decltype(std::declval<std::ostream&>()
44
+ << std::declval<V>()),
45
+ std::ostream&>,
46
+ "V must support `operator<<`.");
47
+
48
+ protected:
49
+ // the adjecency matrix works with indices
50
+ std::vector<std::vector<std::optional<E>>> adjacencyMatrix{};
51
+ // the mapping of vertices to indices in the graph are stored in a map
52
+ std::unordered_map<V, std::size_t> mapping;
53
+ // the inverse mapping is used to get the vertex from the index
54
+ std::vector<V> invMapping;
55
+ // the number of vertices in the graph
56
+ std::size_t nVertices = 0;
57
+ // the number of edges in the graph
58
+ std::size_t nEdges = 0;
59
+ // the degrees of the vertices in the graph
60
+ std::vector<std::size_t> degrees;
61
+
62
+ public:
63
+ auto addVertex(const V& v) -> void {
64
+ // check whether the vertex is already in the graph, if so do nothing
65
+ if (mapping.find(v) == mapping.end()) {
66
+ mapping[v] = nVertices;
67
+ invMapping.emplace_back(v);
68
+ ++nVertices;
69
+ for (auto& row : adjacencyMatrix) {
70
+ row.emplace_back(std::nullopt);
71
+ }
72
+ // the first param must be a 1 not nVertices since we are using an upper
73
+ // triangular matrix as adjacency matrix instead of a square matrix
74
+ adjacencyMatrix.emplace_back(1, std::nullopt);
75
+ degrees.emplace_back(0);
76
+ } else {
77
+ std::stringstream ss;
78
+ ss << "The vertex " << v << " is already in the graph.";
79
+ throw std::invalid_argument(ss.str());
80
+ }
81
+ }
82
+ auto addEdge(const V& u, const V& v, const E& e) -> void {
83
+ if (mapping.find(u) == mapping.end()) {
84
+ addVertex(u);
85
+ }
86
+ if (mapping.find(v) == mapping.end()) {
87
+ addVertex(v);
88
+ }
89
+ const auto i = mapping.at(u);
90
+ const auto j = mapping.at(v);
91
+ if (i < j) {
92
+ if (adjacencyMatrix[i][j - i] == std::nullopt) {
93
+ ++degrees[i];
94
+ if (i != j) {
95
+ ++degrees[j];
96
+ }
97
+ ++nEdges;
98
+ adjacencyMatrix[i][j - i] = e;
99
+ } else {
100
+ std::stringstream ss;
101
+ ss << "The edge (" << i << ", " << j << ") is already in the graph.";
102
+ throw std::invalid_argument(ss.str());
103
+ }
104
+ } else {
105
+ if (adjacencyMatrix[j][i - j] == std::nullopt) {
106
+ ++degrees[i];
107
+ if (i != j) {
108
+ ++degrees[j];
109
+ }
110
+ ++nEdges;
111
+ adjacencyMatrix[j][i - j] = e;
112
+ } else {
113
+ std::stringstream ss;
114
+ ss << "The edge (" << j << ", " << i << ") is already in the graph.";
115
+ throw std::invalid_argument(ss.str());
116
+ }
117
+ }
118
+ }
119
+ [[nodiscard]] auto getNVertices() const -> std::size_t { return nVertices; }
120
+ [[nodiscard]] auto getNEdges() const -> std::size_t { return nEdges; }
121
+ [[nodiscard]] auto getEdge(const V& v, const V& u) const -> E {
122
+ const auto i = mapping.at(v);
123
+ const auto j = mapping.at(u);
124
+ if (i < j ? adjacencyMatrix[i][j - i] != std::nullopt
125
+ : adjacencyMatrix[j][i - j] != std::nullopt) {
126
+ return i < j ? adjacencyMatrix[i][j - i].value()
127
+ : adjacencyMatrix[j][i - j].value();
128
+ }
129
+ std::stringstream ss;
130
+ ss << "The edge (" << v << ", " << u << ") does not exist.";
131
+ throw std::invalid_argument(ss.str());
132
+ }
133
+ [[nodiscard]] auto getAdjacentEdges(const V& v) const
134
+ -> std::unordered_set<std::pair<V, V>, PairHash<V, V>> {
135
+ if (mapping.find(v) == mapping.end()) {
136
+ std::stringstream ss;
137
+ ss << "The vertex " << v << " is not in the graph.";
138
+ throw std::invalid_argument(ss.str());
139
+ }
140
+ const auto i = mapping.at(v);
141
+ std::unordered_set<std::pair<V, V>, PairHash<V, V>> result;
142
+ for (std::size_t j = 0; j < nVertices; ++j) {
143
+ if (i < j ? adjacencyMatrix[i][j - i] != std::nullopt
144
+ : adjacencyMatrix[j][i - j] != std::nullopt) {
145
+ const auto u = invMapping.at(j);
146
+ result.emplace(std::make_pair(v, u));
147
+ }
148
+ }
149
+ return result;
150
+ }
151
+ [[nodiscard]] auto getNeighbours(const V& v) const -> std::unordered_set<V> {
152
+ if (mapping.find(v) == mapping.end()) {
153
+ std::stringstream ss;
154
+ ss << "The vertex " << v << " is not in the graph.";
155
+ throw std::invalid_argument(ss.str());
156
+ }
157
+ const auto i = mapping.at(v);
158
+ std::unordered_set<V> result;
159
+ for (std::size_t j = 0; j < nVertices; ++j) {
160
+ if (i < j ? adjacencyMatrix[i][j - i] != std::nullopt
161
+ : adjacencyMatrix[j][i - j] != std::nullopt) {
162
+ result.emplace(invMapping.at(j));
163
+ }
164
+ }
165
+ return result;
166
+ }
167
+ [[nodiscard]] auto getDegree(const V& v) const -> std::size_t {
168
+ if (mapping.find(v) == mapping.end()) {
169
+ std::stringstream ss;
170
+ ss << "The vertex " << v << " is not in the graph.";
171
+ throw std::invalid_argument(ss.str());
172
+ }
173
+ const auto i = mapping.at(v);
174
+ return degrees[i];
175
+ }
176
+ [[nodiscard]] auto getVertices() const -> std::unordered_set<V> {
177
+ return std::accumulate(mapping.cbegin(), mapping.cend(),
178
+ std::unordered_set<V>(),
179
+ [](auto& acc, const auto& v) {
180
+ acc.emplace(v.first);
181
+ return acc;
182
+ });
183
+ }
184
+ [[nodiscard]] auto isAdjacent(const V& u, const V& v) const -> bool {
185
+ if (mapping.find(u) == mapping.end()) {
186
+ std::stringstream ss;
187
+ ss << "The vertex " << u << " is not in the graph.";
188
+ throw std::invalid_argument(ss.str());
189
+ }
190
+ if (mapping.find(v) == mapping.end()) {
191
+ std::stringstream ss;
192
+ ss << "The vertex " << v << " is not in the graph.";
193
+ throw std::invalid_argument(ss.str());
194
+ }
195
+ const auto i = mapping.at(u);
196
+ const auto j = mapping.at(v);
197
+ return (i < j && adjacencyMatrix[i][j - i] != std::nullopt) or
198
+ (j < i && adjacencyMatrix[j][i - j] != std::nullopt);
199
+ }
200
+ [[nodiscard]] static auto isAdjacentEdge(const std::pair<V, V>& e,
201
+ const std::pair<V, V>& f) -> bool {
202
+ return e.first == f.first || e.first == f.second || e.second == f.first ||
203
+ e.second == f.second;
204
+ }
205
+ /// Outputs a string representation of the graph in the DOT format
206
+ [[nodiscard]] auto toString() const -> std::string {
207
+ std::stringstream ss;
208
+ ss << "graph {\n";
209
+ for (const auto& [v, i] : mapping) {
210
+ ss << " " << i << " [label=\"" << v << "\"];\n";
211
+ }
212
+ for (std::size_t i = 0; i < nVertices; ++i) {
213
+ for (std::size_t j = i + 1; j < nVertices; ++j) {
214
+ if (adjacencyMatrix[i][j - i] != std::nullopt) {
215
+ ss << " " << i << " -- " << j << ";\n";
216
+ }
217
+ }
218
+ }
219
+ ss << "}\n";
220
+ return ss.str();
221
+ }
222
+ friend auto operator<<(std::ostream& os, const UndirectedGraph& g)
223
+ -> std::ostream& {
224
+ return os << g.toString(); // Using toString() method
225
+ }
226
+ };
227
+ } // namespace qc
@@ -0,0 +1,43 @@
1
+
2
+ #ifndef MQT_CORE_DS_EXPORT_H
3
+ #define MQT_CORE_DS_EXPORT_H
4
+
5
+ #ifdef MQT_CORE_DS_STATIC_DEFINE
6
+ # define MQT_CORE_DS_EXPORT
7
+ # define MQT_CORE_DS_NO_EXPORT
8
+ #else
9
+ # ifndef MQT_CORE_DS_EXPORT
10
+ # ifdef mqt_core_ds_EXPORTS
11
+ /* We are building this library */
12
+ # define MQT_CORE_DS_EXPORT __declspec(dllexport)
13
+ # else
14
+ /* We are using this library */
15
+ # define MQT_CORE_DS_EXPORT __declspec(dllimport)
16
+ # endif
17
+ # endif
18
+
19
+ # ifndef MQT_CORE_DS_NO_EXPORT
20
+ # define MQT_CORE_DS_NO_EXPORT
21
+ # endif
22
+ #endif
23
+
24
+ #ifndef MQT_CORE_DS_DEPRECATED
25
+ # define MQT_CORE_DS_DEPRECATED __declspec(deprecated)
26
+ #endif
27
+
28
+ #ifndef MQT_CORE_DS_DEPRECATED_EXPORT
29
+ # define MQT_CORE_DS_DEPRECATED_EXPORT MQT_CORE_DS_EXPORT MQT_CORE_DS_DEPRECATED
30
+ #endif
31
+
32
+ #ifndef MQT_CORE_DS_DEPRECATED_NO_EXPORT
33
+ # define MQT_CORE_DS_DEPRECATED_NO_EXPORT MQT_CORE_DS_NO_EXPORT MQT_CORE_DS_DEPRECATED
34
+ #endif
35
+
36
+ /* NOLINTNEXTLINE(readability-avoid-unconditional-preprocessor-if) */
37
+ #if 0 /* DEFINE_NO_DEPRECATED */
38
+ # ifndef MQT_CORE_DS_NO_DEPRECATED
39
+ # define MQT_CORE_DS_NO_DEPRECATED
40
+ # endif
41
+ #endif
42
+
43
+ #endif /* MQT_CORE_DS_EXPORT_H */
@@ -0,0 +1,45 @@
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/Node.hpp"
14
+ #include "dd/Package.hpp"
15
+
16
+ namespace dd {
17
+
18
+ /**
19
+ * @brief Useful metadata of an approximation run.
20
+ */
21
+ struct ApproximationMetadata {
22
+ /// @brief The fidelity between the source and the approximated state.
23
+ double fidelity;
24
+ /// @brief The number of nodes visited during the mark stage.
25
+ std::size_t nodesVisited;
26
+ /// @brief The lowest qubit number that requires rebuilding.
27
+ Qubit min;
28
+ };
29
+
30
+ /**
31
+ * @brief Approximate the @p state based on fidelity. The fidelity of the
32
+ * approximated state will be at least @p fidelity.
33
+ * @details Traverses the decision diagram layer by layer in a breadth-first
34
+ * manner (iterative deepening algorithm) and eliminates edges greedily until
35
+ * the budget (1 - @p fidelity) is exhausted.
36
+ *
37
+ * @param state The DD to approximate.
38
+ * @param fidelity The desired minimum fidelity after approximation.
39
+ * @param dd The DD package to use for the approximation.
40
+ * @return Metadata about the approximation.
41
+ */
42
+ ApproximationMetadata approximate(VectorDD& state, double fidelity,
43
+ Package& dd);
44
+
45
+ } // namespace dd
@@ -0,0 +1,167 @@
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/Complex.hpp"
14
+ #include "dd/ComplexValue.hpp"
15
+ #include "dd/DDDefinitions.hpp"
16
+
17
+ #include <array>
18
+ #include <complex>
19
+ #include <cstddef>
20
+ #include <functional>
21
+ #include <type_traits>
22
+
23
+ namespace dd {
24
+
25
+ struct vNode; // NOLINT(readability-identifier-naming)
26
+ struct mNode; // NOLINT(readability-identifier-naming)
27
+ struct dNode; // NOLINT(readability-identifier-naming)
28
+ class ComplexNumbers;
29
+ class MemoryManager;
30
+
31
+ template <typename T>
32
+ using isVector = std::enable_if_t<std::is_same_v<T, vNode>, bool>;
33
+ template <typename T>
34
+ using isMatrix = std::enable_if_t<std::is_same_v<T, mNode>, bool>;
35
+ template <typename T>
36
+ using isMatrixVariant =
37
+ std::enable_if_t<std::is_same_v<T, mNode> || std::is_same_v<T, dNode>,
38
+ bool>;
39
+
40
+ /**
41
+ * @brief A DD node with a cached edge weight
42
+ * @details Some DD operations create intermediate results that are not part of
43
+ * the final result. To avoid storing these intermediate results in the unique
44
+ * table, they are represented via cached numbers.
45
+ * @tparam Node Type of the DD node
46
+ */
47
+ template <typename Node> struct CachedEdge {
48
+ Node* p{};
49
+ ComplexValue w;
50
+
51
+ CachedEdge() = default;
52
+ CachedEdge(Node* n, const ComplexValue& v) : p(n), w(v) {}
53
+ CachedEdge(Node* n, const Complex& c)
54
+ : p(n), w(static_cast<ComplexValue>(c)) {}
55
+
56
+ /// Comparing two DD edges with another involves comparing the respective
57
+ /// pointers and checking whether the corresponding weights are "close enough"
58
+ /// according to a given tolerance this notion of equivalence is chosen to
59
+ /// counter floating point inaccuracies
60
+ bool operator==(const CachedEdge& other) const {
61
+ return p == other.p && w.approximatelyEquals(other.w);
62
+ }
63
+ bool operator!=(const CachedEdge& other) const { return !operator==(other); }
64
+
65
+ /**
66
+ * @brief Create a terminal edge with the given weight.
67
+ * @param w The weight of the terminal edge.
68
+ * @return A terminal edge with the given weight.
69
+ */
70
+ [[nodiscard]] static constexpr CachedEdge terminal(const ComplexValue& w) {
71
+ return CachedEdge{Node::getTerminal(), w};
72
+ }
73
+
74
+ /**
75
+ * @brief Create a terminal edge with the given weight.
76
+ * @param w The weight of the terminal edge.
77
+ * @return A terminal edge with the given weight.
78
+ */
79
+ [[nodiscard]] static constexpr CachedEdge
80
+ terminal(const std::complex<fp>& w) {
81
+ return CachedEdge{Node::getTerminal(), static_cast<ComplexValue>(w)};
82
+ }
83
+
84
+ /**
85
+ * @brief Create a terminal edge with the given weight.
86
+ * @param w The weight of the terminal edge.
87
+ * @return A terminal edge with the given weight.
88
+ */
89
+ [[nodiscard]] static constexpr CachedEdge terminal(const Complex& w) {
90
+ return terminal(static_cast<ComplexValue>(w));
91
+ }
92
+
93
+ /**
94
+ * @brief Create a zero terminal edge.
95
+ * @return A zero terminal edge.
96
+ */
97
+ [[nodiscard]] static constexpr CachedEdge zero() {
98
+ return terminal(ComplexValue(0.));
99
+ }
100
+
101
+ /**
102
+ * @brief Create a one terminal edge.
103
+ * @return A one terminal edge.
104
+ */
105
+ [[nodiscard]] static constexpr CachedEdge one() {
106
+ return terminal(ComplexValue(1.));
107
+ }
108
+
109
+ /**
110
+ * @brief Check whether this is a terminal.
111
+ * @return whether this is a terminal
112
+ */
113
+ [[nodiscard]] constexpr bool isTerminal() const {
114
+ return Node::isTerminal(p);
115
+ }
116
+
117
+ /**
118
+ * @brief Get a normalized vector DD from a fresh node and a list of edges.
119
+ * @tparam T template parameter to enable this method only for vNode
120
+ * @param p the fresh node
121
+ * @param e the list of edges that form the successor nodes
122
+ * @param mm a reference to the memory manager (for returning unused nodes)
123
+ * @param cn a reference to the complex number manager (for adding new
124
+ * complex numbers)
125
+ * @return the normalized vector DD
126
+ */
127
+ template <typename T = Node, isVector<T> = true>
128
+ static auto normalize(Node* p, const std::array<CachedEdge, RADIX>& e,
129
+ MemoryManager& mm, ComplexNumbers& cn) -> CachedEdge;
130
+
131
+ /**
132
+ * @brief Get a normalized (density) matrix) DD from a fresh node and a list
133
+ * of edges.
134
+ * @tparam T template parameter to enable this method only for matrix nodes
135
+ * @param p the fresh node
136
+ * @param e the list of edges that form the successor nodes
137
+ * @param mm a reference to the memory manager (for returning unused nodes)
138
+ * @param cn a reference to the complex number manager (for adding new
139
+ * complex numbers)
140
+ * @return the normalized (density) matrix DD
141
+ */
142
+ template <typename T = Node, isMatrixVariant<T> = true>
143
+ static auto normalize(Node* p, const std::array<CachedEdge, NEDGE>& e,
144
+ MemoryManager& mm, ComplexNumbers& cn) -> CachedEdge;
145
+
146
+ /**
147
+ * @brief Check whether the matrix represented by the DD is the identity.
148
+ * @tparam T template parameter to enable this function only for matrix nodes
149
+ * @return whether the matrix is the identity
150
+ */
151
+ template <typename T = Node, isMatrixVariant<T> = true>
152
+ [[nodiscard]] bool isIdentity(const bool upToGlobalPhase = true) const {
153
+ if (!isTerminal()) {
154
+ return false;
155
+ }
156
+ if (upToGlobalPhase) {
157
+ return !w.exactlyZero();
158
+ }
159
+ return w.exactlyOne();
160
+ }
161
+ };
162
+
163
+ } // namespace dd
164
+
165
+ template <class Node> struct std::hash<dd::CachedEdge<Node>> {
166
+ auto operator()(dd::CachedEdge<Node> const& e) const noexcept -> std::size_t;
167
+ };
@@ -0,0 +1,165 @@
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
+ #include "dd/RealNumber.hpp"
15
+ #include "ir/Definitions.hpp"
16
+
17
+ #include <complex>
18
+ #include <cstddef>
19
+ #include <functional>
20
+ #include <iostream>
21
+ #include <string>
22
+
23
+ namespace dd {
24
+
25
+ struct RealNumber;
26
+ struct ComplexValue;
27
+
28
+ /// A complex number represented by two pointers to compute table entries.
29
+ struct Complex {
30
+ /// Compute table entry for the real part.
31
+ RealNumber* r;
32
+ /// Compute table entry for the imaginary part.
33
+ RealNumber* i;
34
+
35
+ /**
36
+ * @brief The static constant for the complex number zero.
37
+ * @return A complex number with real and imaginary part equal to zero.
38
+ */
39
+ static constexpr Complex zero() noexcept {
40
+ return {&constants::zero, &constants::zero};
41
+ }
42
+
43
+ /**
44
+ * @brief The static constant for the complex number one.
45
+ * @return A complex number with real part equal to one and imaginary part
46
+ * equal to zero.
47
+ */
48
+ static constexpr Complex one() noexcept {
49
+ return {&constants::one, &constants::zero};
50
+ }
51
+
52
+ /**
53
+ * @brief Check whether the complex number is exactly equal to zero.
54
+ * @returns True if the complex number is exactly equal to zero, false
55
+ * otherwise.
56
+ * @see RealNumber::exactlyZero
57
+ */
58
+ [[nodiscard]] constexpr bool exactlyZero() const noexcept {
59
+ return RealNumber::exactlyZero(r) && RealNumber::exactlyZero(i);
60
+ }
61
+
62
+ /**
63
+ * @brief Check whether the complex number is exactly equal to one.
64
+ * @returns True if the complex number is exactly equal to one, false
65
+ * otherwise.
66
+ * @see RealNumber::exactlyOne
67
+ * @see RealNumber::exactlyZero
68
+ */
69
+ [[nodiscard]] constexpr bool exactlyOne() const noexcept {
70
+ return RealNumber::exactlyOne(r) && RealNumber::exactlyZero(i);
71
+ }
72
+
73
+ /**
74
+ * @brief Check whether the complex number is approximately equal to the
75
+ * given complex number.
76
+ * @param c The complex number to compare to.
77
+ * @returns True if the complex number is approximately equal to the given
78
+ * complex number, false otherwise.
79
+ * @see RealNumber::approximatelyEquals
80
+ */
81
+ [[nodiscard]] bool approximatelyEquals(const Complex& c) const noexcept;
82
+
83
+ /**
84
+ * @brief Check whether the complex number is approximately equal to zero.
85
+ * @returns True if the complex number is approximately equal to zero, false
86
+ * otherwise.
87
+ * @see RealNumber::approximatelyZero
88
+ */
89
+ [[nodiscard]] bool approximatelyZero() const noexcept;
90
+
91
+ /// @brief Mark the complex number as used.
92
+ void mark() const noexcept;
93
+
94
+ /// @brief Unmark the complex number.
95
+ void unmark() const noexcept;
96
+
97
+ /**
98
+ * @brief Convert the complex number to a string.
99
+ * @param formatted Whether to apply special formatting to the numbers.
100
+ * @param precision The precision to use for the numbers.
101
+ * @returns The string representation of the complex number.
102
+ * @see ComplexValue::toString
103
+ */
104
+ [[nodiscard]] std::string toString(bool formatted = true,
105
+ int precision = -1) const;
106
+
107
+ /**
108
+ * @brief Write the complex number to a binary stream.
109
+ * @param os The output stream to write to.
110
+ * @see RealNumber::writeBinary
111
+ */
112
+ void writeBinary(std::ostream& os) const;
113
+
114
+ /**
115
+ * @brief Convert the Complex number to an std::complex<fp>.
116
+ * @returns The std::complex<fp> representation of the Complex number.
117
+ */
118
+ [[nodiscard]] explicit operator std::complex<fp>() const noexcept;
119
+
120
+ /**
121
+ * @brief Convert the Complex number to a ComplexValue.
122
+ * @returns The ComplexValue representation of the Complex number.
123
+ */
124
+ [[nodiscard]] explicit operator ComplexValue() const noexcept;
125
+ };
126
+
127
+ /**
128
+ * @brief Print a complex number to a stream.
129
+ * @param os The output stream to write to.
130
+ * @param c The complex number to print.
131
+ * @returns The output stream.
132
+ */
133
+ std::ostream& operator<<(std::ostream& os, const Complex& c);
134
+
135
+ ComplexValue operator*(const Complex& c1, const ComplexValue& c2);
136
+ ComplexValue operator*(const ComplexValue& c1, const Complex& c2);
137
+ ComplexValue operator*(const Complex& c1, const Complex& c2);
138
+ ComplexValue operator*(const Complex& c1, fp real);
139
+ ComplexValue operator*(fp real, const Complex& c1);
140
+
141
+ ComplexValue operator/(const Complex& c1, const ComplexValue& c2);
142
+ ComplexValue operator/(const ComplexValue& c1, const Complex& c2);
143
+ ComplexValue operator/(const Complex& c1, const Complex& c2);
144
+ ComplexValue operator/(const Complex& c1, fp real);
145
+
146
+ } // namespace dd
147
+
148
+ /// Hash function for complex numbers.
149
+ template <> struct std::hash<dd::Complex> {
150
+ /**
151
+ * @brief Compute the hash value for a complex number.
152
+ * @details Reinterprets the pointers to the real and imaginary part as
153
+ * integers and computes the hash value for those. Afterwards, the two hash
154
+ * values are combined.
155
+ * @param c The complex number to compute the hash value for.
156
+ * @returns The hash value.
157
+ * @see dd::murmur64
158
+ * @see dd::combineHash
159
+ */
160
+ std::size_t operator()(dd::Complex const& c) const noexcept {
161
+ const auto h1 = dd::murmur64(reinterpret_cast<std::size_t>(c.r));
162
+ const auto h2 = dd::murmur64(reinterpret_cast<std::size_t>(c.i));
163
+ return qc::combineHash(h1, h2);
164
+ }
165
+ };