mqt-core 3.3.2__cp314-cp314t-macosx_11_0_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.
Files changed (546) hide show
  1. mqt/core/__init__.py +77 -0
  2. mqt/core/__main__.py +55 -0
  3. mqt/core/_commands.py +52 -0
  4. mqt/core/_compat/__init__.py +11 -0
  5. mqt/core/_compat/typing.py +29 -0
  6. mqt/core/_version.py +34 -0
  7. mqt/core/_version.pyi +12 -0
  8. mqt/core/dd.cpython-314t-darwin.so +0 -0
  9. mqt/core/dd.pyi +1016 -0
  10. mqt/core/dd_evaluation.py +368 -0
  11. mqt/core/fomac.cpython-314t-darwin.so +0 -0
  12. mqt/core/fomac.pyi +125 -0
  13. mqt/core/include/mqt-core/algorithms/BernsteinVazirani.hpp +39 -0
  14. mqt/core/include/mqt-core/algorithms/GHZState.hpp +18 -0
  15. mqt/core/include/mqt-core/algorithms/Grover.hpp +33 -0
  16. mqt/core/include/mqt-core/algorithms/QFT.hpp +21 -0
  17. mqt/core/include/mqt-core/algorithms/QPE.hpp +30 -0
  18. mqt/core/include/mqt-core/algorithms/RandomCliffordCircuit.hpp +22 -0
  19. mqt/core/include/mqt-core/algorithms/StatePreparation.hpp +43 -0
  20. mqt/core/include/mqt-core/algorithms/WState.hpp +18 -0
  21. mqt/core/include/mqt-core/algorithms/mqt_core_algorithms_export.h +43 -0
  22. mqt/core/include/mqt-core/boost/config/abi/borland_prefix.hpp +27 -0
  23. mqt/core/include/mqt-core/boost/config/abi/borland_suffix.hpp +12 -0
  24. mqt/core/include/mqt-core/boost/config/abi/msvc_prefix.hpp +22 -0
  25. mqt/core/include/mqt-core/boost/config/abi/msvc_suffix.hpp +8 -0
  26. mqt/core/include/mqt-core/boost/config/abi_prefix.hpp +25 -0
  27. mqt/core/include/mqt-core/boost/config/abi_suffix.hpp +25 -0
  28. mqt/core/include/mqt-core/boost/config/assert_cxx03.hpp +211 -0
  29. mqt/core/include/mqt-core/boost/config/assert_cxx11.hpp +212 -0
  30. mqt/core/include/mqt-core/boost/config/assert_cxx14.hpp +47 -0
  31. mqt/core/include/mqt-core/boost/config/assert_cxx17.hpp +65 -0
  32. mqt/core/include/mqt-core/boost/config/assert_cxx20.hpp +59 -0
  33. mqt/core/include/mqt-core/boost/config/assert_cxx23.hpp +41 -0
  34. mqt/core/include/mqt-core/boost/config/assert_cxx98.hpp +23 -0
  35. mqt/core/include/mqt-core/boost/config/auto_link.hpp +525 -0
  36. mqt/core/include/mqt-core/boost/config/compiler/borland.hpp +342 -0
  37. mqt/core/include/mqt-core/boost/config/compiler/clang.hpp +370 -0
  38. mqt/core/include/mqt-core/boost/config/compiler/clang_version.hpp +89 -0
  39. mqt/core/include/mqt-core/boost/config/compiler/codegear.hpp +389 -0
  40. mqt/core/include/mqt-core/boost/config/compiler/comeau.hpp +59 -0
  41. mqt/core/include/mqt-core/boost/config/compiler/common_edg.hpp +185 -0
  42. mqt/core/include/mqt-core/boost/config/compiler/compaq_cxx.hpp +19 -0
  43. mqt/core/include/mqt-core/boost/config/compiler/cray.hpp +446 -0
  44. mqt/core/include/mqt-core/boost/config/compiler/diab.hpp +26 -0
  45. mqt/core/include/mqt-core/boost/config/compiler/digitalmars.hpp +146 -0
  46. mqt/core/include/mqt-core/boost/config/compiler/gcc.hpp +386 -0
  47. mqt/core/include/mqt-core/boost/config/compiler/gcc_xml.hpp +115 -0
  48. mqt/core/include/mqt-core/boost/config/compiler/greenhills.hpp +28 -0
  49. mqt/core/include/mqt-core/boost/config/compiler/hp_acc.hpp +153 -0
  50. mqt/core/include/mqt-core/boost/config/compiler/intel.hpp +577 -0
  51. mqt/core/include/mqt-core/boost/config/compiler/kai.hpp +33 -0
  52. mqt/core/include/mqt-core/boost/config/compiler/metrowerks.hpp +201 -0
  53. mqt/core/include/mqt-core/boost/config/compiler/mpw.hpp +143 -0
  54. mqt/core/include/mqt-core/boost/config/compiler/nvcc.hpp +64 -0
  55. mqt/core/include/mqt-core/boost/config/compiler/pathscale.hpp +141 -0
  56. mqt/core/include/mqt-core/boost/config/compiler/pgi.hpp +23 -0
  57. mqt/core/include/mqt-core/boost/config/compiler/sgi_mipspro.hpp +29 -0
  58. mqt/core/include/mqt-core/boost/config/compiler/sunpro_cc.hpp +225 -0
  59. mqt/core/include/mqt-core/boost/config/compiler/vacpp.hpp +189 -0
  60. mqt/core/include/mqt-core/boost/config/compiler/visualc.hpp +398 -0
  61. mqt/core/include/mqt-core/boost/config/compiler/xlcpp.hpp +303 -0
  62. mqt/core/include/mqt-core/boost/config/compiler/xlcpp_zos.hpp +174 -0
  63. mqt/core/include/mqt-core/boost/config/detail/cxx_composite.hpp +218 -0
  64. mqt/core/include/mqt-core/boost/config/detail/posix_features.hpp +95 -0
  65. mqt/core/include/mqt-core/boost/config/detail/select_compiler_config.hpp +157 -0
  66. mqt/core/include/mqt-core/boost/config/detail/select_platform_config.hpp +147 -0
  67. mqt/core/include/mqt-core/boost/config/detail/select_stdlib_config.hpp +121 -0
  68. mqt/core/include/mqt-core/boost/config/detail/suffix.hpp +1334 -0
  69. mqt/core/include/mqt-core/boost/config/header_deprecated.hpp +26 -0
  70. mqt/core/include/mqt-core/boost/config/helper_macros.hpp +37 -0
  71. mqt/core/include/mqt-core/boost/config/no_tr1/cmath.hpp +28 -0
  72. mqt/core/include/mqt-core/boost/config/no_tr1/complex.hpp +28 -0
  73. mqt/core/include/mqt-core/boost/config/no_tr1/functional.hpp +28 -0
  74. mqt/core/include/mqt-core/boost/config/no_tr1/memory.hpp +28 -0
  75. mqt/core/include/mqt-core/boost/config/no_tr1/utility.hpp +28 -0
  76. mqt/core/include/mqt-core/boost/config/platform/aix.hpp +33 -0
  77. mqt/core/include/mqt-core/boost/config/platform/amigaos.hpp +15 -0
  78. mqt/core/include/mqt-core/boost/config/platform/beos.hpp +26 -0
  79. mqt/core/include/mqt-core/boost/config/platform/bsd.hpp +83 -0
  80. mqt/core/include/mqt-core/boost/config/platform/cloudabi.hpp +18 -0
  81. mqt/core/include/mqt-core/boost/config/platform/cray.hpp +18 -0
  82. mqt/core/include/mqt-core/boost/config/platform/cygwin.hpp +71 -0
  83. mqt/core/include/mqt-core/boost/config/platform/haiku.hpp +31 -0
  84. mqt/core/include/mqt-core/boost/config/platform/hpux.hpp +87 -0
  85. mqt/core/include/mqt-core/boost/config/platform/irix.hpp +31 -0
  86. mqt/core/include/mqt-core/boost/config/platform/linux.hpp +106 -0
  87. mqt/core/include/mqt-core/boost/config/platform/macos.hpp +87 -0
  88. mqt/core/include/mqt-core/boost/config/platform/qnxnto.hpp +31 -0
  89. mqt/core/include/mqt-core/boost/config/platform/solaris.hpp +31 -0
  90. mqt/core/include/mqt-core/boost/config/platform/symbian.hpp +97 -0
  91. mqt/core/include/mqt-core/boost/config/platform/vms.hpp +25 -0
  92. mqt/core/include/mqt-core/boost/config/platform/vxworks.hpp +422 -0
  93. mqt/core/include/mqt-core/boost/config/platform/wasm.hpp +23 -0
  94. mqt/core/include/mqt-core/boost/config/platform/win32.hpp +90 -0
  95. mqt/core/include/mqt-core/boost/config/platform/zos.hpp +32 -0
  96. mqt/core/include/mqt-core/boost/config/pragma_message.hpp +31 -0
  97. mqt/core/include/mqt-core/boost/config/requires_threads.hpp +92 -0
  98. mqt/core/include/mqt-core/boost/config/stdlib/dinkumware.hpp +324 -0
  99. mqt/core/include/mqt-core/boost/config/stdlib/libcomo.hpp +93 -0
  100. mqt/core/include/mqt-core/boost/config/stdlib/libcpp.hpp +180 -0
  101. mqt/core/include/mqt-core/boost/config/stdlib/libstdcpp3.hpp +482 -0
  102. mqt/core/include/mqt-core/boost/config/stdlib/modena.hpp +79 -0
  103. mqt/core/include/mqt-core/boost/config/stdlib/msl.hpp +98 -0
  104. mqt/core/include/mqt-core/boost/config/stdlib/roguewave.hpp +208 -0
  105. mqt/core/include/mqt-core/boost/config/stdlib/sgi.hpp +168 -0
  106. mqt/core/include/mqt-core/boost/config/stdlib/stlport.hpp +258 -0
  107. mqt/core/include/mqt-core/boost/config/stdlib/vacpp.hpp +74 -0
  108. mqt/core/include/mqt-core/boost/config/stdlib/xlcpp_zos.hpp +61 -0
  109. mqt/core/include/mqt-core/boost/config/user.hpp +133 -0
  110. mqt/core/include/mqt-core/boost/config/warning_disable.hpp +47 -0
  111. mqt/core/include/mqt-core/boost/config/workaround.hpp +305 -0
  112. mqt/core/include/mqt-core/boost/config.hpp +67 -0
  113. mqt/core/include/mqt-core/boost/cstdint.hpp +556 -0
  114. mqt/core/include/mqt-core/boost/cxx11_char_types.hpp +70 -0
  115. mqt/core/include/mqt-core/boost/detail/workaround.hpp +10 -0
  116. mqt/core/include/mqt-core/boost/limits.hpp +146 -0
  117. mqt/core/include/mqt-core/boost/multiprecision/complex128.hpp +24 -0
  118. mqt/core/include/mqt-core/boost/multiprecision/complex_adaptor.hpp +1046 -0
  119. mqt/core/include/mqt-core/boost/multiprecision/concepts/mp_number_archetypes.hpp +257 -0
  120. mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float/io.hpp +698 -0
  121. mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float/transcendental.hpp +157 -0
  122. mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float.hpp +2297 -0
  123. mqt/core/include/mqt-core/boost/multiprecision/cpp_complex.hpp +12 -0
  124. mqt/core/include/mqt-core/boost/multiprecision/cpp_dec_float.hpp +3690 -0
  125. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/add.hpp +368 -0
  126. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/add_unsigned.hpp +387 -0
  127. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/bitwise.hpp +889 -0
  128. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/checked.hpp +178 -0
  129. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/comparison.hpp +374 -0
  130. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/cpp_int_config.hpp +161 -0
  131. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/divide.hpp +703 -0
  132. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/import_export.hpp +248 -0
  133. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/intel_intrinsics.hpp +138 -0
  134. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/limits.hpp +282 -0
  135. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/literals.hpp +295 -0
  136. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/misc.hpp +1457 -0
  137. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/multiply.hpp +848 -0
  138. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/serialize.hpp +211 -0
  139. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/value_pack.hpp +42 -0
  140. mqt/core/include/mqt-core/boost/multiprecision/cpp_int.hpp +2360 -0
  141. mqt/core/include/mqt-core/boost/multiprecision/debug_adaptor.hpp +760 -0
  142. mqt/core/include/mqt-core/boost/multiprecision/detail/assert.hpp +29 -0
  143. mqt/core/include/mqt-core/boost/multiprecision/detail/atomic.hpp +62 -0
  144. mqt/core/include/mqt-core/boost/multiprecision/detail/bitscan.hpp +317 -0
  145. mqt/core/include/mqt-core/boost/multiprecision/detail/check_cpp11_config.hpp +64 -0
  146. mqt/core/include/mqt-core/boost/multiprecision/detail/constexpr.hpp +88 -0
  147. mqt/core/include/mqt-core/boost/multiprecision/detail/default_ops.hpp +4052 -0
  148. mqt/core/include/mqt-core/boost/multiprecision/detail/digits.hpp +49 -0
  149. mqt/core/include/mqt-core/boost/multiprecision/detail/dynamic_array.hpp +44 -0
  150. mqt/core/include/mqt-core/boost/multiprecision/detail/empty_value.hpp +87 -0
  151. mqt/core/include/mqt-core/boost/multiprecision/detail/endian.hpp +35 -0
  152. mqt/core/include/mqt-core/boost/multiprecision/detail/et_ops.hpp +1831 -0
  153. mqt/core/include/mqt-core/boost/multiprecision/detail/float128_functions.hpp +95 -0
  154. mqt/core/include/mqt-core/boost/multiprecision/detail/float_string_cvt.hpp +333 -0
  155. mqt/core/include/mqt-core/boost/multiprecision/detail/fpclassify.hpp +101 -0
  156. mqt/core/include/mqt-core/boost/multiprecision/detail/functions/constants.hpp +288 -0
  157. mqt/core/include/mqt-core/boost/multiprecision/detail/functions/pow.hpp +905 -0
  158. mqt/core/include/mqt-core/boost/multiprecision/detail/functions/trig.hpp +1058 -0
  159. mqt/core/include/mqt-core/boost/multiprecision/detail/functions/trunc.hpp +82 -0
  160. mqt/core/include/mqt-core/boost/multiprecision/detail/generic_interconvert.hpp +687 -0
  161. mqt/core/include/mqt-core/boost/multiprecision/detail/hash.hpp +56 -0
  162. mqt/core/include/mqt-core/boost/multiprecision/detail/integer_ops.hpp +474 -0
  163. mqt/core/include/mqt-core/boost/multiprecision/detail/itos.hpp +39 -0
  164. mqt/core/include/mqt-core/boost/multiprecision/detail/min_max.hpp +106 -0
  165. mqt/core/include/mqt-core/boost/multiprecision/detail/no_et_ops.hpp +661 -0
  166. mqt/core/include/mqt-core/boost/multiprecision/detail/no_exceptions_support.hpp +55 -0
  167. mqt/core/include/mqt-core/boost/multiprecision/detail/number_base.hpp +1656 -0
  168. mqt/core/include/mqt-core/boost/multiprecision/detail/number_compare.hpp +848 -0
  169. mqt/core/include/mqt-core/boost/multiprecision/detail/precision.hpp +313 -0
  170. mqt/core/include/mqt-core/boost/multiprecision/detail/rebind.hpp +19 -0
  171. mqt/core/include/mqt-core/boost/multiprecision/detail/standalone_config.hpp +148 -0
  172. mqt/core/include/mqt-core/boost/multiprecision/detail/static_array.hpp +42 -0
  173. mqt/core/include/mqt-core/boost/multiprecision/detail/string_helpers.hpp +48 -0
  174. mqt/core/include/mqt-core/boost/multiprecision/detail/tables.hpp +80 -0
  175. mqt/core/include/mqt-core/boost/multiprecision/detail/ublas_interop.hpp +75 -0
  176. mqt/core/include/mqt-core/boost/multiprecision/detail/uniform_int_distribution.hpp +212 -0
  177. mqt/core/include/mqt-core/boost/multiprecision/detail/utype_helper.hpp +374 -0
  178. mqt/core/include/mqt-core/boost/multiprecision/eigen.hpp +248 -0
  179. mqt/core/include/mqt-core/boost/multiprecision/float128.hpp +920 -0
  180. mqt/core/include/mqt-core/boost/multiprecision/fwd.hpp +268 -0
  181. mqt/core/include/mqt-core/boost/multiprecision/gmp.hpp +4060 -0
  182. mqt/core/include/mqt-core/boost/multiprecision/integer.hpp +363 -0
  183. mqt/core/include/mqt-core/boost/multiprecision/logged_adaptor.hpp +834 -0
  184. mqt/core/include/mqt-core/boost/multiprecision/miller_rabin.hpp +221 -0
  185. mqt/core/include/mqt-core/boost/multiprecision/mpc.hpp +1721 -0
  186. mqt/core/include/mqt-core/boost/multiprecision/mpfi.hpp +2559 -0
  187. mqt/core/include/mqt-core/boost/multiprecision/mpfr.hpp +3644 -0
  188. mqt/core/include/mqt-core/boost/multiprecision/number.hpp +2500 -0
  189. mqt/core/include/mqt-core/boost/multiprecision/random.hpp +23 -0
  190. mqt/core/include/mqt-core/boost/multiprecision/rational_adaptor.hpp +1289 -0
  191. mqt/core/include/mqt-core/boost/multiprecision/tommath.hpp +1034 -0
  192. mqt/core/include/mqt-core/boost/multiprecision/traits/explicit_conversion.hpp +67 -0
  193. mqt/core/include/mqt-core/boost/multiprecision/traits/extract_exponent_type.hpp +28 -0
  194. mqt/core/include/mqt-core/boost/multiprecision/traits/is_backend.hpp +91 -0
  195. mqt/core/include/mqt-core/boost/multiprecision/traits/is_byte_container.hpp +51 -0
  196. mqt/core/include/mqt-core/boost/multiprecision/traits/is_complex.hpp +22 -0
  197. mqt/core/include/mqt-core/boost/multiprecision/traits/is_convertible_arithmetic.hpp +51 -0
  198. mqt/core/include/mqt-core/boost/multiprecision/traits/is_restricted_conversion.hpp +47 -0
  199. mqt/core/include/mqt-core/boost/multiprecision/traits/is_variable_precision.hpp +25 -0
  200. mqt/core/include/mqt-core/boost/multiprecision/traits/max_digits10.hpp +79 -0
  201. mqt/core/include/mqt-core/boost/multiprecision/traits/std_integer_traits.hpp +90 -0
  202. mqt/core/include/mqt-core/boost/multiprecision/traits/transcendental_reduction_type.hpp +21 -0
  203. mqt/core/include/mqt-core/boost/version.hpp +32 -0
  204. mqt/core/include/mqt-core/circuit_optimizer/CircuitOptimizer.hpp +119 -0
  205. mqt/core/include/mqt-core/circuit_optimizer/mqt_core_circuit_optimizer_export.h +43 -0
  206. mqt/core/include/mqt-core/datastructures/DirectedAcyclicGraph.hpp +117 -0
  207. mqt/core/include/mqt-core/datastructures/DirectedGraph.hpp +158 -0
  208. mqt/core/include/mqt-core/datastructures/DisjointSet.hpp +50 -0
  209. mqt/core/include/mqt-core/datastructures/Layer.hpp +172 -0
  210. mqt/core/include/mqt-core/datastructures/SymmetricMatrix.hpp +57 -0
  211. mqt/core/include/mqt-core/datastructures/UndirectedGraph.hpp +227 -0
  212. mqt/core/include/mqt-core/datastructures/mqt_core_ds_export.h +43 -0
  213. mqt/core/include/mqt-core/dd/Approximation.hpp +45 -0
  214. mqt/core/include/mqt-core/dd/CachedEdge.hpp +174 -0
  215. mqt/core/include/mqt-core/dd/Complex.hpp +165 -0
  216. mqt/core/include/mqt-core/dd/ComplexNumbers.hpp +150 -0
  217. mqt/core/include/mqt-core/dd/ComplexValue.hpp +184 -0
  218. mqt/core/include/mqt-core/dd/ComputeTable.hpp +183 -0
  219. mqt/core/include/mqt-core/dd/DDDefinitions.hpp +139 -0
  220. mqt/core/include/mqt-core/dd/DDpackageConfig.hpp +104 -0
  221. mqt/core/include/mqt-core/dd/DensityNoiseTable.hpp +114 -0
  222. mqt/core/include/mqt-core/dd/Edge.hpp +416 -0
  223. mqt/core/include/mqt-core/dd/Export.hpp +438 -0
  224. mqt/core/include/mqt-core/dd/FunctionalityConstruction.hpp +75 -0
  225. mqt/core/include/mqt-core/dd/GateMatrixDefinitions.hpp +43 -0
  226. mqt/core/include/mqt-core/dd/LinkedListBase.hpp +45 -0
  227. mqt/core/include/mqt-core/dd/MemoryManager.hpp +193 -0
  228. mqt/core/include/mqt-core/dd/Node.hpp +223 -0
  229. mqt/core/include/mqt-core/dd/NoiseFunctionality.hpp +144 -0
  230. mqt/core/include/mqt-core/dd/Operations.hpp +306 -0
  231. mqt/core/include/mqt-core/dd/Package.hpp +2036 -0
  232. mqt/core/include/mqt-core/dd/Package_fwd.hpp +22 -0
  233. mqt/core/include/mqt-core/dd/RealNumber.hpp +255 -0
  234. mqt/core/include/mqt-core/dd/RealNumberUniqueTable.hpp +217 -0
  235. mqt/core/include/mqt-core/dd/Simulation.hpp +98 -0
  236. mqt/core/include/mqt-core/dd/StateGeneration.hpp +143 -0
  237. mqt/core/include/mqt-core/dd/StochasticNoiseOperationTable.hpp +88 -0
  238. mqt/core/include/mqt-core/dd/UnaryComputeTable.hpp +121 -0
  239. mqt/core/include/mqt-core/dd/UniqueTable.hpp +243 -0
  240. mqt/core/include/mqt-core/dd/mqt_core_dd_export.h +43 -0
  241. mqt/core/include/mqt-core/dd/statistics/MemoryManagerStatistics.hpp +84 -0
  242. mqt/core/include/mqt-core/dd/statistics/PackageStatistics.hpp +55 -0
  243. mqt/core/include/mqt-core/dd/statistics/Statistics.hpp +48 -0
  244. mqt/core/include/mqt-core/dd/statistics/TableStatistics.hpp +79 -0
  245. mqt/core/include/mqt-core/dd/statistics/UniqueTableStatistics.hpp +31 -0
  246. mqt/core/include/mqt-core/fomac/FoMaC.hpp +568 -0
  247. mqt/core/include/mqt-core/ir/Definitions.hpp +108 -0
  248. mqt/core/include/mqt-core/ir/Permutation.hpp +213 -0
  249. mqt/core/include/mqt-core/ir/QuantumComputation.hpp +596 -0
  250. mqt/core/include/mqt-core/ir/Register.hpp +125 -0
  251. mqt/core/include/mqt-core/ir/mqt_core_ir_export.h +43 -0
  252. mqt/core/include/mqt-core/ir/operations/AodOperation.hpp +92 -0
  253. mqt/core/include/mqt-core/ir/operations/CompoundOperation.hpp +212 -0
  254. mqt/core/include/mqt-core/ir/operations/Control.hpp +142 -0
  255. mqt/core/include/mqt-core/ir/operations/Expression.hpp +847 -0
  256. mqt/core/include/mqt-core/ir/operations/IfElseOperation.hpp +169 -0
  257. mqt/core/include/mqt-core/ir/operations/NonUnitaryOperation.hpp +118 -0
  258. mqt/core/include/mqt-core/ir/operations/OpType.hpp +120 -0
  259. mqt/core/include/mqt-core/ir/operations/OpType.inc +76 -0
  260. mqt/core/include/mqt-core/ir/operations/Operation.hpp +247 -0
  261. mqt/core/include/mqt-core/ir/operations/StandardOperation.hpp +140 -0
  262. mqt/core/include/mqt-core/ir/operations/SymbolicOperation.hpp +144 -0
  263. mqt/core/include/mqt-core/mqt_na_qdmi/device.h +602 -0
  264. mqt/core/include/mqt-core/mqt_na_qdmi/types.h +78 -0
  265. mqt/core/include/mqt-core/na/NAComputation.hpp +185 -0
  266. mqt/core/include/mqt-core/na/device/Device.hpp +410 -0
  267. mqt/core/include/mqt-core/na/device/DeviceMemberInitializers.hpp +724 -0
  268. mqt/core/include/mqt-core/na/device/Generator.hpp +447 -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/fomac/Device.hpp +169 -0
  273. mqt/core/include/mqt-core/na/mqt_core_na_export.h +43 -0
  274. mqt/core/include/mqt-core/na/operations/GlobalCZOp.hpp +38 -0
  275. mqt/core/include/mqt-core/na/operations/GlobalOp.hpp +58 -0
  276. mqt/core/include/mqt-core/na/operations/GlobalRYOp.hpp +42 -0
  277. mqt/core/include/mqt-core/na/operations/LoadOp.hpp +89 -0
  278. mqt/core/include/mqt-core/na/operations/LocalOp.hpp +56 -0
  279. mqt/core/include/mqt-core/na/operations/LocalRZOp.hpp +42 -0
  280. mqt/core/include/mqt-core/na/operations/LocalUOp.hpp +49 -0
  281. mqt/core/include/mqt-core/na/operations/MoveOp.hpp +66 -0
  282. mqt/core/include/mqt-core/na/operations/Op.hpp +62 -0
  283. mqt/core/include/mqt-core/na/operations/ShuttlingOp.hpp +51 -0
  284. mqt/core/include/mqt-core/na/operations/StoreOp.hpp +87 -0
  285. mqt/core/include/mqt-core/qasm3/Exception.hpp +85 -0
  286. mqt/core/include/mqt-core/qasm3/Gate.hpp +65 -0
  287. mqt/core/include/mqt-core/qasm3/Importer.hpp +192 -0
  288. mqt/core/include/mqt-core/qasm3/InstVisitor.hpp +145 -0
  289. mqt/core/include/mqt-core/qasm3/NestedEnvironment.hpp +41 -0
  290. mqt/core/include/mqt-core/qasm3/Parser.hpp +170 -0
  291. mqt/core/include/mqt-core/qasm3/Scanner.hpp +73 -0
  292. mqt/core/include/mqt-core/qasm3/Statement.hpp +486 -0
  293. mqt/core/include/mqt-core/qasm3/Statement_fwd.hpp +39 -0
  294. mqt/core/include/mqt-core/qasm3/StdGates.hpp +232 -0
  295. mqt/core/include/mqt-core/qasm3/Token.hpp +198 -0
  296. mqt/core/include/mqt-core/qasm3/Types.hpp +238 -0
  297. mqt/core/include/mqt-core/qasm3/Types_fwd.hpp +22 -0
  298. mqt/core/include/mqt-core/qasm3/mqt_core_qasm_export.h +43 -0
  299. mqt/core/include/mqt-core/qasm3/passes/CompilerPass.hpp +22 -0
  300. mqt/core/include/mqt-core/qasm3/passes/ConstEvalPass.hpp +102 -0
  301. mqt/core/include/mqt-core/qasm3/passes/TypeCheckPass.hpp +124 -0
  302. mqt/core/include/mqt-core/qdmi/Driver.hpp +431 -0
  303. mqt/core/include/mqt-core/zx/FunctionalityConstruction.hpp +125 -0
  304. mqt/core/include/mqt-core/zx/Rational.hpp +318 -0
  305. mqt/core/include/mqt-core/zx/Rules.hpp +132 -0
  306. mqt/core/include/mqt-core/zx/Simplify.hpp +182 -0
  307. mqt/core/include/mqt-core/zx/Utils.hpp +212 -0
  308. mqt/core/include/mqt-core/zx/ZXDefinitions.hpp +93 -0
  309. mqt/core/include/mqt-core/zx/ZXDiagram.hpp +480 -0
  310. mqt/core/include/mqt-core/zx/mqt_core_zx_export.h +43 -0
  311. mqt/core/include/nlohmann/adl_serializer.hpp +55 -0
  312. mqt/core/include/nlohmann/byte_container_with_subtype.hpp +103 -0
  313. mqt/core/include/nlohmann/detail/abi_macros.hpp +111 -0
  314. mqt/core/include/nlohmann/detail/conversions/from_json.hpp +577 -0
  315. mqt/core/include/nlohmann/detail/conversions/to_chars.hpp +1118 -0
  316. mqt/core/include/nlohmann/detail/conversions/to_json.hpp +479 -0
  317. mqt/core/include/nlohmann/detail/exceptions.hpp +291 -0
  318. mqt/core/include/nlohmann/detail/hash.hpp +129 -0
  319. mqt/core/include/nlohmann/detail/input/binary_reader.hpp +3068 -0
  320. mqt/core/include/nlohmann/detail/input/input_adapters.hpp +549 -0
  321. mqt/core/include/nlohmann/detail/input/json_sax.hpp +986 -0
  322. mqt/core/include/nlohmann/detail/input/lexer.hpp +1643 -0
  323. mqt/core/include/nlohmann/detail/input/parser.hpp +519 -0
  324. mqt/core/include/nlohmann/detail/input/position_t.hpp +37 -0
  325. mqt/core/include/nlohmann/detail/iterators/internal_iterator.hpp +35 -0
  326. mqt/core/include/nlohmann/detail/iterators/iter_impl.hpp +760 -0
  327. mqt/core/include/nlohmann/detail/iterators/iteration_proxy.hpp +235 -0
  328. mqt/core/include/nlohmann/detail/iterators/iterator_traits.hpp +61 -0
  329. mqt/core/include/nlohmann/detail/iterators/json_reverse_iterator.hpp +130 -0
  330. mqt/core/include/nlohmann/detail/iterators/primitive_iterator.hpp +132 -0
  331. mqt/core/include/nlohmann/detail/json_custom_base_class.hpp +39 -0
  332. mqt/core/include/nlohmann/detail/json_pointer.hpp +988 -0
  333. mqt/core/include/nlohmann/detail/json_ref.hpp +78 -0
  334. mqt/core/include/nlohmann/detail/macro_scope.hpp +595 -0
  335. mqt/core/include/nlohmann/detail/macro_unscope.hpp +46 -0
  336. mqt/core/include/nlohmann/detail/meta/call_std/begin.hpp +17 -0
  337. mqt/core/include/nlohmann/detail/meta/call_std/end.hpp +17 -0
  338. mqt/core/include/nlohmann/detail/meta/cpp_future.hpp +171 -0
  339. mqt/core/include/nlohmann/detail/meta/detected.hpp +70 -0
  340. mqt/core/include/nlohmann/detail/meta/identity_tag.hpp +21 -0
  341. mqt/core/include/nlohmann/detail/meta/is_sax.hpp +159 -0
  342. mqt/core/include/nlohmann/detail/meta/std_fs.hpp +29 -0
  343. mqt/core/include/nlohmann/detail/meta/type_traits.hpp +795 -0
  344. mqt/core/include/nlohmann/detail/meta/void_t.hpp +24 -0
  345. mqt/core/include/nlohmann/detail/output/binary_writer.hpp +1850 -0
  346. mqt/core/include/nlohmann/detail/output/output_adapters.hpp +147 -0
  347. mqt/core/include/nlohmann/detail/output/serializer.hpp +988 -0
  348. mqt/core/include/nlohmann/detail/string_concat.hpp +146 -0
  349. mqt/core/include/nlohmann/detail/string_escape.hpp +72 -0
  350. mqt/core/include/nlohmann/detail/string_utils.hpp +37 -0
  351. mqt/core/include/nlohmann/detail/value_t.hpp +118 -0
  352. mqt/core/include/nlohmann/json.hpp +5306 -0
  353. mqt/core/include/nlohmann/json_fwd.hpp +75 -0
  354. mqt/core/include/nlohmann/ordered_map.hpp +359 -0
  355. mqt/core/include/nlohmann/thirdparty/hedley/hedley.hpp +2045 -0
  356. mqt/core/include/nlohmann/thirdparty/hedley/hedley_undef.hpp +158 -0
  357. mqt/core/include/qdmi/qdmi/client.h +990 -0
  358. mqt/core/include/qdmi/qdmi/constants.h +1139 -0
  359. mqt/core/include/qdmi/qdmi/device.h +602 -0
  360. mqt/core/include/qdmi/qdmi/types.h +78 -0
  361. mqt/core/include/spdlog/async.h +99 -0
  362. mqt/core/include/spdlog/async_logger-inl.h +84 -0
  363. mqt/core/include/spdlog/async_logger.h +74 -0
  364. mqt/core/include/spdlog/cfg/argv.h +40 -0
  365. mqt/core/include/spdlog/cfg/env.h +36 -0
  366. mqt/core/include/spdlog/cfg/helpers-inl.h +107 -0
  367. mqt/core/include/spdlog/cfg/helpers.h +29 -0
  368. mqt/core/include/spdlog/common-inl.h +68 -0
  369. mqt/core/include/spdlog/common.h +406 -0
  370. mqt/core/include/spdlog/details/backtracer-inl.h +63 -0
  371. mqt/core/include/spdlog/details/backtracer.h +45 -0
  372. mqt/core/include/spdlog/details/circular_q.h +115 -0
  373. mqt/core/include/spdlog/details/console_globals.h +28 -0
  374. mqt/core/include/spdlog/details/file_helper-inl.h +153 -0
  375. mqt/core/include/spdlog/details/file_helper.h +61 -0
  376. mqt/core/include/spdlog/details/fmt_helper.h +141 -0
  377. mqt/core/include/spdlog/details/log_msg-inl.h +44 -0
  378. mqt/core/include/spdlog/details/log_msg.h +40 -0
  379. mqt/core/include/spdlog/details/log_msg_buffer-inl.h +54 -0
  380. mqt/core/include/spdlog/details/log_msg_buffer.h +32 -0
  381. mqt/core/include/spdlog/details/mpmc_blocking_q.h +177 -0
  382. mqt/core/include/spdlog/details/null_mutex.h +35 -0
  383. mqt/core/include/spdlog/details/os-inl.h +606 -0
  384. mqt/core/include/spdlog/details/os.h +127 -0
  385. mqt/core/include/spdlog/details/periodic_worker-inl.h +26 -0
  386. mqt/core/include/spdlog/details/periodic_worker.h +58 -0
  387. mqt/core/include/spdlog/details/registry-inl.h +270 -0
  388. mqt/core/include/spdlog/details/registry.h +131 -0
  389. mqt/core/include/spdlog/details/synchronous_factory.h +22 -0
  390. mqt/core/include/spdlog/details/tcp_client-windows.h +135 -0
  391. mqt/core/include/spdlog/details/tcp_client.h +127 -0
  392. mqt/core/include/spdlog/details/thread_pool-inl.h +126 -0
  393. mqt/core/include/spdlog/details/thread_pool.h +117 -0
  394. mqt/core/include/spdlog/details/udp_client-windows.h +98 -0
  395. mqt/core/include/spdlog/details/udp_client.h +81 -0
  396. mqt/core/include/spdlog/details/windows_include.h +11 -0
  397. mqt/core/include/spdlog/fmt/bin_to_hex.h +224 -0
  398. mqt/core/include/spdlog/fmt/bundled/args.h +220 -0
  399. mqt/core/include/spdlog/fmt/bundled/base.h +2989 -0
  400. mqt/core/include/spdlog/fmt/bundled/chrono.h +2330 -0
  401. mqt/core/include/spdlog/fmt/bundled/color.h +637 -0
  402. mqt/core/include/spdlog/fmt/bundled/compile.h +539 -0
  403. mqt/core/include/spdlog/fmt/bundled/core.h +5 -0
  404. mqt/core/include/spdlog/fmt/bundled/fmt.license.rst +27 -0
  405. mqt/core/include/spdlog/fmt/bundled/format-inl.h +1948 -0
  406. mqt/core/include/spdlog/fmt/bundled/format.h +4244 -0
  407. mqt/core/include/spdlog/fmt/bundled/os.h +427 -0
  408. mqt/core/include/spdlog/fmt/bundled/ostream.h +167 -0
  409. mqt/core/include/spdlog/fmt/bundled/printf.h +633 -0
  410. mqt/core/include/spdlog/fmt/bundled/ranges.h +850 -0
  411. mqt/core/include/spdlog/fmt/bundled/std.h +728 -0
  412. mqt/core/include/spdlog/fmt/bundled/xchar.h +369 -0
  413. mqt/core/include/spdlog/fmt/chrono.h +23 -0
  414. mqt/core/include/spdlog/fmt/compile.h +23 -0
  415. mqt/core/include/spdlog/fmt/fmt.h +30 -0
  416. mqt/core/include/spdlog/fmt/ostr.h +23 -0
  417. mqt/core/include/spdlog/fmt/ranges.h +23 -0
  418. mqt/core/include/spdlog/fmt/std.h +24 -0
  419. mqt/core/include/spdlog/fmt/xchar.h +23 -0
  420. mqt/core/include/spdlog/formatter.h +17 -0
  421. mqt/core/include/spdlog/fwd.h +18 -0
  422. mqt/core/include/spdlog/logger-inl.h +198 -0
  423. mqt/core/include/spdlog/logger.h +379 -0
  424. mqt/core/include/spdlog/mdc.h +52 -0
  425. mqt/core/include/spdlog/pattern_formatter-inl.h +1340 -0
  426. mqt/core/include/spdlog/pattern_formatter.h +118 -0
  427. mqt/core/include/spdlog/sinks/android_sink.h +137 -0
  428. mqt/core/include/spdlog/sinks/ansicolor_sink-inl.h +142 -0
  429. mqt/core/include/spdlog/sinks/ansicolor_sink.h +116 -0
  430. mqt/core/include/spdlog/sinks/base_sink-inl.h +59 -0
  431. mqt/core/include/spdlog/sinks/base_sink.h +51 -0
  432. mqt/core/include/spdlog/sinks/basic_file_sink-inl.h +48 -0
  433. mqt/core/include/spdlog/sinks/basic_file_sink.h +66 -0
  434. mqt/core/include/spdlog/sinks/callback_sink.h +56 -0
  435. mqt/core/include/spdlog/sinks/daily_file_sink.h +254 -0
  436. mqt/core/include/spdlog/sinks/dist_sink.h +81 -0
  437. mqt/core/include/spdlog/sinks/dup_filter_sink.h +91 -0
  438. mqt/core/include/spdlog/sinks/hourly_file_sink.h +193 -0
  439. mqt/core/include/spdlog/sinks/kafka_sink.h +119 -0
  440. mqt/core/include/spdlog/sinks/mongo_sink.h +108 -0
  441. mqt/core/include/spdlog/sinks/msvc_sink.h +68 -0
  442. mqt/core/include/spdlog/sinks/null_sink.h +41 -0
  443. mqt/core/include/spdlog/sinks/ostream_sink.h +43 -0
  444. mqt/core/include/spdlog/sinks/qt_sinks.h +304 -0
  445. mqt/core/include/spdlog/sinks/ringbuffer_sink.h +67 -0
  446. mqt/core/include/spdlog/sinks/rotating_file_sink-inl.h +179 -0
  447. mqt/core/include/spdlog/sinks/rotating_file_sink.h +93 -0
  448. mqt/core/include/spdlog/sinks/sink-inl.h +22 -0
  449. mqt/core/include/spdlog/sinks/sink.h +34 -0
  450. mqt/core/include/spdlog/sinks/stdout_color_sinks-inl.h +38 -0
  451. mqt/core/include/spdlog/sinks/stdout_color_sinks.h +49 -0
  452. mqt/core/include/spdlog/sinks/stdout_sinks-inl.h +127 -0
  453. mqt/core/include/spdlog/sinks/stdout_sinks.h +84 -0
  454. mqt/core/include/spdlog/sinks/syslog_sink.h +104 -0
  455. mqt/core/include/spdlog/sinks/systemd_sink.h +121 -0
  456. mqt/core/include/spdlog/sinks/tcp_sink.h +75 -0
  457. mqt/core/include/spdlog/sinks/udp_sink.h +69 -0
  458. mqt/core/include/spdlog/sinks/win_eventlog_sink.h +260 -0
  459. mqt/core/include/spdlog/sinks/wincolor_sink-inl.h +172 -0
  460. mqt/core/include/spdlog/sinks/wincolor_sink.h +82 -0
  461. mqt/core/include/spdlog/spdlog-inl.h +96 -0
  462. mqt/core/include/spdlog/spdlog.h +357 -0
  463. mqt/core/include/spdlog/stopwatch.h +66 -0
  464. mqt/core/include/spdlog/tweakme.h +148 -0
  465. mqt/core/include/spdlog/version.h +11 -0
  466. mqt/core/ir/__init__.pyi +2078 -0
  467. mqt/core/ir/operations.pyi +1011 -0
  468. mqt/core/ir/registers.pyi +91 -0
  469. mqt/core/ir/symbolic.pyi +177 -0
  470. mqt/core/ir.cpython-314t-darwin.so +0 -0
  471. mqt/core/lib/libmqt-core-algorithms.3.3.2.dylib +0 -0
  472. mqt/core/lib/libmqt-core-algorithms.3.3.dylib +0 -0
  473. mqt/core/lib/libmqt-core-algorithms.dylib +0 -0
  474. mqt/core/lib/libmqt-core-circuit-optimizer.3.3.2.dylib +0 -0
  475. mqt/core/lib/libmqt-core-circuit-optimizer.3.3.dylib +0 -0
  476. mqt/core/lib/libmqt-core-circuit-optimizer.dylib +0 -0
  477. mqt/core/lib/libmqt-core-dd.3.3.2.dylib +0 -0
  478. mqt/core/lib/libmqt-core-dd.3.3.dylib +0 -0
  479. mqt/core/lib/libmqt-core-dd.dylib +0 -0
  480. mqt/core/lib/libmqt-core-ds.3.3.2.dylib +0 -0
  481. mqt/core/lib/libmqt-core-ds.3.3.dylib +0 -0
  482. mqt/core/lib/libmqt-core-ds.dylib +0 -0
  483. mqt/core/lib/libmqt-core-fomac.3.3.2.dylib +0 -0
  484. mqt/core/lib/libmqt-core-fomac.3.3.dylib +0 -0
  485. mqt/core/lib/libmqt-core-fomac.dylib +0 -0
  486. mqt/core/lib/libmqt-core-ir.3.3.2.dylib +0 -0
  487. mqt/core/lib/libmqt-core-ir.3.3.dylib +0 -0
  488. mqt/core/lib/libmqt-core-ir.dylib +0 -0
  489. mqt/core/lib/libmqt-core-na-fomac.3.3.2.dylib +0 -0
  490. mqt/core/lib/libmqt-core-na-fomac.3.3.dylib +0 -0
  491. mqt/core/lib/libmqt-core-na-fomac.dylib +0 -0
  492. mqt/core/lib/libmqt-core-na.3.3.2.dylib +0 -0
  493. mqt/core/lib/libmqt-core-na.3.3.dylib +0 -0
  494. mqt/core/lib/libmqt-core-na.dylib +0 -0
  495. mqt/core/lib/libmqt-core-qasm.3.3.2.dylib +0 -0
  496. mqt/core/lib/libmqt-core-qasm.3.3.dylib +0 -0
  497. mqt/core/lib/libmqt-core-qasm.dylib +0 -0
  498. mqt/core/lib/libmqt-core-qdmi-driver.3.3.2.dylib +0 -0
  499. mqt/core/lib/libmqt-core-qdmi-driver.3.3.dylib +0 -0
  500. mqt/core/lib/libmqt-core-qdmi-driver.dylib +0 -0
  501. mqt/core/lib/libmqt-core-qdmi-na-device-gen.a +0 -0
  502. mqt/core/lib/libmqt-core-qdmi-na-device.3.3.2.dylib +0 -0
  503. mqt/core/lib/libmqt-core-qdmi-na-device.3.3.dylib +0 -0
  504. mqt/core/lib/libmqt-core-qdmi-na-device.dylib +0 -0
  505. mqt/core/lib/libmqt-core-zx.3.3.2.dylib +0 -0
  506. mqt/core/lib/libmqt-core-zx.3.3.dylib +0 -0
  507. mqt/core/lib/libmqt-core-zx.dylib +0 -0
  508. mqt/core/lib/libspdlog.a +0 -0
  509. mqt/core/lib/pkgconfig/spdlog.pc +13 -0
  510. mqt/core/na/__init__.py +12 -0
  511. mqt/core/na/fomac.cpython-314t-darwin.so +0 -0
  512. mqt/core/na/fomac.pyi +117 -0
  513. mqt/core/plugins/__init__.py +9 -0
  514. mqt/core/plugins/qiskit/__init__.py +19 -0
  515. mqt/core/plugins/qiskit/mqt_to_qiskit.py +420 -0
  516. mqt/core/plugins/qiskit/qiskit_to_mqt.py +562 -0
  517. mqt/core/py.typed +2 -0
  518. mqt/core/share/cmake/mqt-core/AddMQTPythonBinding.cmake +55 -0
  519. mqt/core/share/cmake/mqt-core/Cache.cmake +33 -0
  520. mqt/core/share/cmake/mqt-core/FindGMP.cmake +103 -0
  521. mqt/core/share/cmake/mqt-core/PackageAddTest.cmake +46 -0
  522. mqt/core/share/cmake/mqt-core/PreventInSourceBuilds.cmake +25 -0
  523. mqt/core/share/cmake/mqt-core/StandardProjectSettings.cmake +87 -0
  524. mqt/core/share/cmake/mqt-core/mqt-core-config-version.cmake +85 -0
  525. mqt/core/share/cmake/mqt-core/mqt-core-config.cmake +52 -0
  526. mqt/core/share/cmake/mqt-core/mqt-core-targets-release.cmake +141 -0
  527. mqt/core/share/cmake/mqt-core/mqt-core-targets.cmake +446 -0
  528. mqt/core/share/cmake/nlohmann_json/nlohmann_jsonConfig.cmake +15 -0
  529. mqt/core/share/cmake/nlohmann_json/nlohmann_jsonConfigVersion.cmake +20 -0
  530. mqt/core/share/cmake/nlohmann_json/nlohmann_jsonTargets.cmake +109 -0
  531. mqt/core/share/cmake/qdmi/Cache.cmake +44 -0
  532. mqt/core/share/cmake/qdmi/PrefixHandling.cmake +78 -0
  533. mqt/core/share/cmake/qdmi/prefix_defs.txt +26 -0
  534. mqt/core/share/cmake/qdmi/qdmi-config-version.cmake +85 -0
  535. mqt/core/share/cmake/qdmi/qdmi-config.cmake +42 -0
  536. mqt/core/share/cmake/qdmi/qdmi-targets.cmake +129 -0
  537. mqt/core/share/cmake/spdlog/spdlogConfig.cmake +44 -0
  538. mqt/core/share/cmake/spdlog/spdlogConfigTargets-release.cmake +19 -0
  539. mqt/core/share/cmake/spdlog/spdlogConfigTargets.cmake +118 -0
  540. mqt/core/share/cmake/spdlog/spdlogConfigVersion.cmake +65 -0
  541. mqt/core/share/pkgconfig/nlohmann_json.pc +7 -0
  542. mqt_core-3.3.2.dist-info/METADATA +210 -0
  543. mqt_core-3.3.2.dist-info/RECORD +546 -0
  544. mqt_core-3.3.2.dist-info/WHEEL +6 -0
  545. mqt_core-3.3.2.dist-info/entry_points.txt +4 -0
  546. mqt_core-3.3.2.dist-info/licenses/LICENSE.md +22 -0
@@ -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
+ };
@@ -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