mqt-core 3.3.2__cp314-cp314t-macosx_11_0_x86_64.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,119 @@
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/QuantumComputation.hpp"
14
+ #include "ir/operations/OpType.hpp"
15
+ #include "ir/operations/Operation.hpp"
16
+
17
+ #include <cstddef>
18
+ #include <deque>
19
+ #include <memory>
20
+ #include <unordered_set>
21
+ #include <vector>
22
+
23
+ namespace qc {
24
+
25
+ class CircuitOptimizer {
26
+ public:
27
+ CircuitOptimizer() = default;
28
+
29
+ using DAG = std::vector<std::deque<std::unique_ptr<Operation>*>>;
30
+ using DAGIterator = std::deque<std::unique_ptr<Operation>*>::iterator;
31
+ using DAGReverseIterator =
32
+ std::deque<std::unique_ptr<Operation>*>::reverse_iterator;
33
+ using DAGIterators = std::vector<DAGIterator>;
34
+ using DAGReverseIterators = std::vector<DAGReverseIterator>;
35
+
36
+ static DAG constructDAG(QuantumComputation& qc);
37
+
38
+ static void swapReconstruction(QuantumComputation& qc);
39
+
40
+ static void singleQubitGateFusion(QuantumComputation& qc);
41
+
42
+ static void removeIdentities(QuantumComputation& qc);
43
+
44
+ static void removeOperation(QuantumComputation& qc,
45
+ const std::unordered_set<OpType>& opTypes,
46
+ size_t opSize);
47
+
48
+ static void removeDiagonalGatesBeforeMeasure(QuantumComputation& qc);
49
+
50
+ static void removeFinalMeasurements(QuantumComputation& qc);
51
+
52
+ static void decomposeSWAP(QuantumComputation& qc,
53
+ bool isDirectedArchitecture);
54
+
55
+ static void eliminateResets(QuantumComputation& qc);
56
+
57
+ static void deferMeasurements(QuantumComputation& qc);
58
+
59
+ static void flattenOperations(QuantumComputation& qc,
60
+ bool customGatesOnly = false);
61
+
62
+ static void cancelCNOTs(QuantumComputation& qc);
63
+
64
+ /**
65
+ * @brief Replaces all MCX gates with MCZ gates (and H gates surrounding the
66
+ * target qubit) in the given circuit.
67
+ * @param qc the quantum circuit
68
+ */
69
+ static void replaceMCXWithMCZ(QuantumComputation& qc);
70
+
71
+ /**
72
+ * @brief Backpropagates the output permutation through the circuit.
73
+ * @details Starts at the end of the circuit with a potentially incomplete
74
+ * output permutation and backpropagates it through the circuit until the
75
+ * beginning of the circuit is reached. The tracked permutation is updated
76
+ * with every SWAP gate and, eventually, the initial layout of the circuit is
77
+ * set to the tracked permutation. Any unassigned qubit in the initial layout
78
+ * is assigned to the first available position (favoring an identity mapping).
79
+ * @param qc the quantum circuit
80
+ */
81
+ static void backpropagateOutputPermutation(QuantumComputation& qc);
82
+
83
+ /**
84
+ * @brief Collects all operations in the circuit into blocks of a maximum
85
+ * size.
86
+ * @details The circuit is traversed and operations are collected into blocks
87
+ * of a maximum size. The blocks are then appended to the circuit in the order
88
+ * they were collected. Each block is realized as a compound operation.
89
+ * Light optimizations are applied to the blocks, such as removing identity
90
+ * gates and fusing single-qubit gates.
91
+ * @param qc the quantum circuit
92
+ * @param maxBlockSize the maximum size of a block
93
+ */
94
+ static void collectBlocks(QuantumComputation& qc, std::size_t maxBlockSize);
95
+
96
+ /**
97
+ * @brief Collects all Clifford blocks in the circuit.
98
+ * @details The circuit is traversed and all operations that are part of a
99
+ * Clifford block are collected into a compound operation with a certain
100
+ * maximum block size. All non-Clifford operations remain untouched.
101
+ * Light optimizations are applied to the blocks, such as removing identity
102
+ * gates.
103
+ * @param qc the quantum circuit
104
+ * @param maxBlockSize the maximum size of a block
105
+ */
106
+ static void collectCliffordBlocks(QuantumComputation& qc,
107
+ std::size_t maxBlockSize);
108
+
109
+ /**
110
+ * @brief Elide permutations by propagating them through the circuit.
111
+ * @details The circuit is traversed and any SWAP gate is eliminated by
112
+ * propagating the permutation through the circuit. The final layout of the
113
+ * circuit is updated accordingly. This pass works well together with the
114
+ * `swapReconstruction` pass.
115
+ * @param qc the quantum circuit
116
+ */
117
+ static void elidePermutations(QuantumComputation& qc);
118
+ };
119
+ } // namespace qc
@@ -0,0 +1,43 @@
1
+
2
+ #ifndef MQT_CORE_CIRCUIT_OPTIMIZER_EXPORT_H
3
+ #define MQT_CORE_CIRCUIT_OPTIMIZER_EXPORT_H
4
+
5
+ #ifdef MQT_CORE_CIRCUIT_OPTIMIZER_STATIC_DEFINE
6
+ # define MQT_CORE_CIRCUIT_OPTIMIZER_EXPORT
7
+ # define MQT_CORE_CIRCUIT_OPTIMIZER_NO_EXPORT
8
+ #else
9
+ # ifndef MQT_CORE_CIRCUIT_OPTIMIZER_EXPORT
10
+ # ifdef mqt_core_circuit_optimizer_EXPORTS
11
+ /* We are building this library */
12
+ # define MQT_CORE_CIRCUIT_OPTIMIZER_EXPORT __attribute__((visibility("default")))
13
+ # else
14
+ /* We are using this library */
15
+ # define MQT_CORE_CIRCUIT_OPTIMIZER_EXPORT __attribute__((visibility("default")))
16
+ # endif
17
+ # endif
18
+
19
+ # ifndef MQT_CORE_CIRCUIT_OPTIMIZER_NO_EXPORT
20
+ # define MQT_CORE_CIRCUIT_OPTIMIZER_NO_EXPORT __attribute__((visibility("hidden")))
21
+ # endif
22
+ #endif
23
+
24
+ #ifndef MQT_CORE_CIRCUIT_OPTIMIZER_DEPRECATED
25
+ # define MQT_CORE_CIRCUIT_OPTIMIZER_DEPRECATED __attribute__ ((__deprecated__))
26
+ #endif
27
+
28
+ #ifndef MQT_CORE_CIRCUIT_OPTIMIZER_DEPRECATED_EXPORT
29
+ # define MQT_CORE_CIRCUIT_OPTIMIZER_DEPRECATED_EXPORT MQT_CORE_CIRCUIT_OPTIMIZER_EXPORT MQT_CORE_CIRCUIT_OPTIMIZER_DEPRECATED
30
+ #endif
31
+
32
+ #ifndef MQT_CORE_CIRCUIT_OPTIMIZER_DEPRECATED_NO_EXPORT
33
+ # define MQT_CORE_CIRCUIT_OPTIMIZER_DEPRECATED_NO_EXPORT MQT_CORE_CIRCUIT_OPTIMIZER_NO_EXPORT MQT_CORE_CIRCUIT_OPTIMIZER_DEPRECATED
34
+ #endif
35
+
36
+ /* NOLINTNEXTLINE(readability-avoid-unconditional-preprocessor-if) */
37
+ #if 0 /* DEFINE_NO_DEPRECATED */
38
+ # ifndef MQT_CORE_CIRCUIT_OPTIMIZER_NO_DEPRECATED
39
+ # define MQT_CORE_CIRCUIT_OPTIMIZER_NO_DEPRECATED
40
+ # endif
41
+ #endif
42
+
43
+ #endif /* MQT_CORE_CIRCUIT_OPTIMIZER_EXPORT_H */
@@ -0,0 +1,117 @@
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 "DirectedGraph.hpp"
14
+
15
+ #include <algorithm>
16
+ #include <cassert>
17
+ #include <cstddef>
18
+ #include <sstream>
19
+ #include <stack>
20
+ #include <stdexcept>
21
+ #include <vector>
22
+
23
+ namespace qc {
24
+
25
+ template <class V> class DirectedAcyclicGraph final : public DirectedGraph<V> {
26
+ protected:
27
+ // transitive closure matrix to detect cycles
28
+ std::vector<std::vector<bool>> closureMatrix;
29
+
30
+ public:
31
+ auto addVertex(const V& v) -> void override {
32
+ DirectedGraph<V>::addVertex(v);
33
+ for (auto& row : closureMatrix) {
34
+ row.emplace_back(false);
35
+ }
36
+ closureMatrix.emplace_back(this->nVertices, false);
37
+ const auto i = this->mapping.at(v);
38
+ closureMatrix[i][i] = true;
39
+ }
40
+ auto addEdge(const V& u, const V& v) -> void override {
41
+ if (!this->mapping.contains(u)) {
42
+ addVertex(u);
43
+ }
44
+ if (!this->mapping.contains(v)) {
45
+ addVertex(v);
46
+ }
47
+ std::size_t const i = this->mapping.at(u);
48
+ std::size_t const j = this->mapping.at(v);
49
+ if (closureMatrix[j][i]) {
50
+ std::ostringstream oss;
51
+ oss << "Adding edge (" << u << ", " << v << ") would create a cycle.";
52
+ throw std::logic_error(oss.str());
53
+ }
54
+ DirectedGraph<V>::addEdge(u, v);
55
+ for (std::size_t k = 0; k < this->nVertices; ++k) {
56
+ if (closureMatrix[k][i]) {
57
+ closureMatrix[k][j] = true;
58
+ }
59
+ if (closureMatrix[j][k]) {
60
+ closureMatrix[i][k] = true;
61
+ }
62
+ }
63
+ }
64
+ [[nodiscard]] auto isReachable(const V& u, const V& v) const -> bool {
65
+ if (!this->mapping.contains(u)) {
66
+ throw std::invalid_argument("Vertex u not in graph.");
67
+ }
68
+ if (!this->mapping.contains(v)) {
69
+ throw std::invalid_argument("Vertex v not in graph.");
70
+ }
71
+ return closureMatrix[this->mapping.at(u)][this->mapping.at(v)];
72
+ }
73
+ /// Perform a depth-first search on the graph and return the nodes in a
74
+ /// topological order
75
+ [[nodiscard]] auto orderTopologically() const -> std::vector<V> {
76
+ std::stack<std::size_t> stack{};
77
+ std::vector<std::size_t> result;
78
+ result.reserve(this->nVertices);
79
+ std::vector visited(this->nVertices, false);
80
+ // visitedInDegree is used to count the incoming edges that have been
81
+ // visited already such that the resulting order of the nodes is one that
82
+ // satisfies a topological ordering
83
+ std::vector<std::size_t> visitedInDegree(this->nVertices, 0);
84
+ // Push nodes with 0 indegree onto the stack
85
+ for (std::size_t k = 0; k < this->nVertices; ++k) {
86
+ if (this->inDegrees[k] == 0) {
87
+ stack.push(k);
88
+ visited[k] = true;
89
+ }
90
+ }
91
+ // Perform DFS
92
+ while (!stack.empty()) {
93
+ const auto u = stack.top();
94
+ stack.pop();
95
+ result.emplace_back(u);
96
+
97
+ for (std::size_t k = 0; k < this->nVertices; ++k) {
98
+ if (this->adjacencyMatrix[u][k]) {
99
+ if (!visited[k]) {
100
+ if (++visitedInDegree[k] == this->inDegrees[k]) {
101
+ stack.push(k);
102
+ visited[k] = true;
103
+ }
104
+ }
105
+ }
106
+ }
107
+ }
108
+ // Otherwise graph has a cycle
109
+ assert(result.size() == this->nVertices);
110
+ std::vector<V> vertices;
111
+ vertices.reserve(this->nVertices);
112
+ std::transform(result.cbegin(), result.cend(), std::back_inserter(vertices),
113
+ [&](const auto i) { return this->invMapping.at(i); });
114
+ return vertices;
115
+ }
116
+ };
117
+ } // namespace qc
@@ -0,0 +1,158 @@
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 <numeric>
15
+ #include <ostream>
16
+ #include <sstream>
17
+ #include <stdexcept>
18
+ #include <string>
19
+ #include <unordered_map>
20
+ #include <unordered_set>
21
+ #include <utility>
22
+ #include <vector>
23
+
24
+ namespace qc {
25
+
26
+ /**
27
+ * Class representing generic directed graphs.
28
+ *
29
+ * @tparam V the type of the vertices in the graph. Must implement `operator<<`.
30
+ */
31
+ template <class V> class DirectedGraph {
32
+ static_assert(std::is_same_v<decltype(std::declval<std::ostream&>()
33
+ << std::declval<V>()),
34
+ std::ostream&>,
35
+ "V must support `operator<<`.");
36
+
37
+ protected:
38
+ // the adjecency matrix works with indices
39
+ std::vector<std::vector<bool>> adjacencyMatrix;
40
+ // the mapping of vertices to indices in the graph are stored in a map
41
+ std::unordered_map<V, std::size_t> mapping;
42
+ // the inverse mapping is used to get the vertex from the index
43
+ std::vector<V> invMapping;
44
+ // the number of vertices in the graph
45
+ std::size_t nVertices = 0;
46
+ // the number of edges in the graph
47
+ std::size_t nEdges = 0;
48
+ // the in-degrees of the vertices in the graph
49
+ std::vector<std::size_t> inDegrees;
50
+ // the out-degrees of the vertices in the graph
51
+ std::vector<std::size_t> outDegrees;
52
+
53
+ public:
54
+ DirectedGraph() = default;
55
+ DirectedGraph(const DirectedGraph&) = default;
56
+ DirectedGraph(DirectedGraph&&) = default;
57
+ DirectedGraph& operator=(const DirectedGraph&) = default;
58
+ DirectedGraph& operator=(DirectedGraph&&) = default;
59
+ virtual ~DirectedGraph() = default;
60
+ virtual auto addVertex(const V& v) -> void {
61
+ // check whether the vertex is already in the graph, if so do nothing
62
+ if (mapping.contains(v)) {
63
+ std::stringstream ss;
64
+ ss << "The vertex " << v << " is already in the graph.";
65
+ throw std::invalid_argument(ss.str());
66
+ }
67
+ mapping[v] = nVertices;
68
+ invMapping.emplace_back(v);
69
+ ++nVertices;
70
+ for (auto& row : adjacencyMatrix) {
71
+ row.emplace_back(false);
72
+ }
73
+ adjacencyMatrix.emplace_back(nVertices, false);
74
+ inDegrees.emplace_back(0);
75
+ outDegrees.emplace_back(0);
76
+ }
77
+ virtual auto addEdge(const V& u, const V& v) -> void {
78
+ if (!mapping.contains(u)) {
79
+ addVertex(u);
80
+ }
81
+ if (!mapping.contains(v)) {
82
+ addVertex(v);
83
+ }
84
+ const auto i = mapping.at(u);
85
+ const auto j = mapping.at(v);
86
+ if (!adjacencyMatrix[i][j]) {
87
+ adjacencyMatrix[i][j] = true;
88
+ ++outDegrees[i];
89
+ ++inDegrees[j];
90
+ ++nEdges;
91
+ }
92
+ }
93
+ [[nodiscard]] auto getNVertices() const -> std::size_t { return nVertices; }
94
+ [[nodiscard]] auto getNEdges() const -> std::size_t { return nEdges; }
95
+ [[nodiscard]] auto getInDegree(const V& v) const -> std::size_t {
96
+ if (!mapping.contains(v)) {
97
+ std::stringstream ss;
98
+ ss << "The vertex " << v << " is not in the graph.";
99
+ throw std::invalid_argument(ss.str());
100
+ }
101
+ const auto i = mapping.at(v);
102
+ return inDegrees[i];
103
+ }
104
+ [[nodiscard]] auto getOutDegree(const V& v) const -> std::size_t {
105
+ if (!mapping.contains(v)) {
106
+ std::stringstream ss;
107
+ ss << "The vertex " << v << " is not in the graph.";
108
+ throw std::invalid_argument(ss.str());
109
+ }
110
+ const auto i = mapping.at(v);
111
+ return outDegrees[i];
112
+ }
113
+ [[nodiscard]] auto getVertices() const -> std::unordered_set<V> {
114
+ return std::accumulate(mapping.cbegin(), mapping.cend(),
115
+ std::unordered_set<V>(),
116
+ [](auto acc, const auto& v) {
117
+ acc.emplace(v.first);
118
+ return acc;
119
+ });
120
+ }
121
+ [[nodiscard]] auto isEdge(const V& u, const V& v) const -> bool {
122
+ if (!mapping.contains(u)) {
123
+ std::stringstream ss;
124
+ ss << "The vertex " << u << " is not in the graph.";
125
+ throw std::invalid_argument(ss.str());
126
+ }
127
+ if (!mapping.contains(v)) {
128
+ std::stringstream ss;
129
+ ss << "The vertex " << v << " is not in the graph.";
130
+ throw std::invalid_argument(ss.str());
131
+ }
132
+ const auto i = mapping.at(u);
133
+ const auto j = mapping.at(v);
134
+ return adjacencyMatrix[i][j];
135
+ }
136
+ /// Outputs a string representation of the graph in the DOT format
137
+ [[nodiscard]] auto toString() const -> std::string {
138
+ std::stringstream ss;
139
+ ss << "digraph {\n";
140
+ for (const auto& [v, i] : mapping) {
141
+ ss << " " << i << " [label=\"" << v << "\"];\n";
142
+ }
143
+ for (std::size_t i = 0; i < nVertices; ++i) {
144
+ for (std::size_t j = 0; j < nVertices; ++j) {
145
+ if (adjacencyMatrix[i][j]) {
146
+ ss << " " << i << " -> " << j << ";\n";
147
+ }
148
+ }
149
+ }
150
+ ss << "}\n";
151
+ return ss.str();
152
+ }
153
+ friend auto operator<<(std::ostream& os, const DirectedGraph& g)
154
+ -> std::ostream& {
155
+ return os << g.toString(); // Using toString() method
156
+ }
157
+ };
158
+ } // namespace qc
@@ -0,0 +1,50 @@
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 <algorithm>
14
+ #include <cstddef>
15
+ #include <unordered_map>
16
+
17
+ namespace qc {
18
+ template <class T> struct DisjointSet {
19
+ std::unordered_map<T, T> parent;
20
+ std::unordered_map<T, std::size_t> rank;
21
+
22
+ template <class Iterator>
23
+ explicit DisjointSet(const Iterator& begin, const Iterator& end) {
24
+ std::for_each(begin, end, [&](const auto& element) {
25
+ parent[element] = element;
26
+ rank[element] = 0;
27
+ });
28
+ }
29
+
30
+ T findSet(const T& v) {
31
+ if (parent[v] != v) {
32
+ parent[v] = findSet(parent[v]);
33
+ }
34
+ return parent[v];
35
+ }
36
+
37
+ void unionSet(const T& x, const T& y) {
38
+ const auto& xSet = findSet(x);
39
+ const auto& ySet = findSet(y);
40
+ if (rank[xSet] > rank[ySet]) {
41
+ parent[ySet] = xSet;
42
+ } else {
43
+ parent[xSet] = ySet;
44
+ if (rank[xSet] == rank[ySet]) {
45
+ ++rank[ySet];
46
+ }
47
+ }
48
+ }
49
+ };
50
+ } // namespace qc
@@ -0,0 +1,172 @@
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 "datastructures/UndirectedGraph.hpp"
14
+ #include "ir/Definitions.hpp"
15
+ #include "ir/QuantumComputation.hpp"
16
+ #include "ir/operations/OpType.hpp"
17
+ #include "ir/operations/Operation.hpp"
18
+
19
+ #include <cassert>
20
+ #include <cstddef>
21
+ #include <cstdint>
22
+ #include <memory>
23
+ #include <stdexcept>
24
+ #include <unordered_set>
25
+ #include <vector>
26
+
27
+ namespace qc {
28
+ /**
29
+ * @brief Class to manage the creation of layers when traversing a quantum
30
+ * circuit.
31
+ * @details The class uses the DAG of the circuit to create layers of gates that
32
+ * can be executed at the same time. It can be used to create the front or look
33
+ * ahead layer.
34
+ */
35
+ class Layer final {
36
+ public:
37
+ class DAGVertex;
38
+ using ExecutableSet = std::unordered_set<std::shared_ptr<DAGVertex>>;
39
+ using InteractionGraph = UndirectedGraph<Qubit, std::shared_ptr<DAGVertex>>;
40
+
41
+ class DAGVertex : public std::enable_shared_from_this<DAGVertex> {
42
+ protected:
43
+ // if the executableCounter becomes equal to the executableThreshold the
44
+ // vertex becomes executable
45
+ std::int64_t executableThreshold = 0;
46
+ std::int64_t executableCounter = 0;
47
+ std::vector<std::shared_ptr<DAGVertex>> enabledSuccessors;
48
+ std::vector<std::shared_ptr<DAGVertex>> disabledSuccessors;
49
+ bool executed = false;
50
+ Operation* operation;
51
+ ExecutableSet* executableSet;
52
+
53
+ /**
54
+ * @brief Construct a new DAGVertex
55
+ * @details The constructor initializes the vertex with the given operation
56
+ * and the given executable set, which is shared among all vertices.
57
+ *
58
+ * @param op
59
+ * @param es
60
+ */
61
+ DAGVertex(Operation* op, ExecutableSet& es)
62
+ : operation(op), executableSet(&es) {}
63
+
64
+ public:
65
+ [[nodiscard]] static auto create(Operation* operation,
66
+ ExecutableSet& executableSet)
67
+ -> std::shared_ptr<DAGVertex> {
68
+ std::shared_ptr<DAGVertex> v(new DAGVertex(operation, executableSet));
69
+ v->updateExecutableSet();
70
+ return v;
71
+ }
72
+ [[nodiscard]] auto isExecutable() const {
73
+ assert(executableCounter <= executableThreshold);
74
+ return (!executed) && executableCounter == executableThreshold;
75
+ }
76
+ [[nodiscard]] auto isExecuted() const { return executed; }
77
+ [[nodiscard]] auto getOperation() const -> const Operation* {
78
+ return operation;
79
+ }
80
+
81
+ protected:
82
+ auto incExecutableCounter() {
83
+ executableCounter++;
84
+ updateExecutableSet();
85
+ }
86
+ auto decExecutableCounter() {
87
+ executableCounter--;
88
+ updateExecutableSet();
89
+ }
90
+ /**
91
+ * @brief Inserts or removes the vertex from the executable set.
92
+ * @warning May not be called from the constructor.
93
+ */
94
+ auto updateExecutableSet() -> void {
95
+ if (isExecutable()) {
96
+ if (const auto& it = executableSet->find(shared_from_this());
97
+ it == executableSet->end()) {
98
+ executableSet->insert(shared_from_this());
99
+ }
100
+ } else {
101
+ if (const auto& it = executableSet->find(shared_from_this());
102
+ it != executableSet->end()) {
103
+ executableSet->erase(it);
104
+ }
105
+ }
106
+ }
107
+
108
+ public:
109
+ auto execute() -> void {
110
+ if (isExecutable()) {
111
+ executed = true;
112
+ for (const auto& successor : disabledSuccessors) {
113
+ successor->decExecutableCounter();
114
+ }
115
+ for (const auto& successor : enabledSuccessors) {
116
+ successor->incExecutableCounter();
117
+ }
118
+ updateExecutableSet();
119
+ } else {
120
+ throw std::logic_error(
121
+ "The vertex is not executable and cannot be executed.");
122
+ }
123
+ }
124
+ auto addEnabledSuccessor(const std::shared_ptr<DAGVertex>& successor) {
125
+ enabledSuccessors.emplace_back(successor);
126
+ ++successor->executableThreshold;
127
+ successor->updateExecutableSet();
128
+ }
129
+ auto addDisabledSuccessor(const std::shared_ptr<DAGVertex>& successor) {
130
+ disabledSuccessors.emplace_back(successor);
131
+ --successor->executableThreshold;
132
+ successor->updateExecutableSet();
133
+ }
134
+ };
135
+
136
+ protected:
137
+ ExecutableSet executableSet;
138
+ auto constructDAG(const QuantumComputation& qc, bool commutable) -> void;
139
+
140
+ public:
141
+ Layer() = default;
142
+ Layer(const Layer&) = default;
143
+ Layer(Layer&&) = default;
144
+ Layer& operator=(const Layer&) = default;
145
+ Layer& operator=(Layer&&) = default;
146
+ ~Layer() = default;
147
+ /**
148
+ * @brief Constructs a new layer from the given quantum circuit.
149
+ * @details The layer contains all gates that are currently executable in a
150
+ * set of executable gates. When a gate is executed, this can enable other
151
+ * gates that are added to the set of executable sets then, or disable gates
152
+ * that are removed from the set of executable gates. The commutable flag can
153
+ * be used to specify whether commutation rules should be considered.
154
+ *
155
+ * @param qc quantum circuit
156
+ * @param commutable true if commutation rules should be considered, false
157
+ * otherwise (default: true)
158
+ */
159
+ explicit Layer(const QuantumComputation& qc, bool commutable = true) {
160
+ constructDAG(qc, commutable);
161
+ }
162
+ [[nodiscard]] auto getExecutableSet() const -> const ExecutableSet& {
163
+ return executableSet;
164
+ }
165
+ [[nodiscard]] auto constructInteractionGraph(OpType opType,
166
+ std::size_t nControls) const
167
+ -> InteractionGraph;
168
+ [[nodiscard]] auto getExecutablesOfType(OpType opType,
169
+ std::size_t nControls) const
170
+ -> std::vector<std::shared_ptr<DAGVertex>>;
171
+ };
172
+ } // namespace qc