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,568 @@
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 <concepts>
15
+ #include <cstddef>
16
+ #include <cstdint>
17
+ #include <iostream>
18
+ #include <iterator>
19
+ #include <optional>
20
+ #include <qdmi/client.h>
21
+ #include <ranges>
22
+ #include <string>
23
+ #include <type_traits>
24
+ #include <utility>
25
+ #include <vector>
26
+
27
+ namespace fomac {
28
+ /**
29
+ * @brief Concept for ranges that are contiguous in memory and can be
30
+ * constructed with a size.
31
+ * @details This concept is used to constrain the template parameter of the
32
+ * `queryProperty` method.
33
+ * @tparam T The type to check.
34
+ */
35
+ template <typename T>
36
+ concept size_constructible_contiguous_range =
37
+ std::ranges::contiguous_range<T> &&
38
+ std::constructible_from<T, std::size_t> &&
39
+ requires { typename T::value_type; } && requires(T t) {
40
+ { t.data() } -> std::same_as<typename T::value_type*>;
41
+ };
42
+ /**
43
+ * @brief Concept for types that are either integral, floating point, bool,
44
+ * std::string, or QDMI_Device_Status.
45
+ * @details This concept is used to constrain the template parameter of the
46
+ * `queryProperty` method.
47
+ * @tparam T The type to check.
48
+ */
49
+ template <typename T>
50
+ concept value_or_string =
51
+ std::integral<T> || std::floating_point<T> || std::is_same_v<T, bool> ||
52
+ std::is_same_v<T, std::string> || std::is_same_v<T, QDMI_Device_Status>;
53
+
54
+ /**
55
+ * @brief Concept for types that are either value_or_string or
56
+ * size_constructible_contiguous_range.
57
+ * @details This concept is used to constrain the template parameter of the
58
+ * `queryProperty` method.
59
+ * @tparam T The type to check.
60
+ */
61
+ template <typename T>
62
+ concept value_or_string_or_vector =
63
+ value_or_string<T> || size_constructible_contiguous_range<T>;
64
+
65
+ /**
66
+ * @brief Concept for types that are std::optional of value_or_string.
67
+ * @details This concept is used to constrain the template parameter of the
68
+ * `queryProperty` method.
69
+ * @tparam T The type to check.
70
+ */
71
+ template <typename T>
72
+ concept is_optional = requires { typename T::value_type; } &&
73
+ std::is_same_v<T, std::optional<typename T::value_type>>;
74
+
75
+ /**
76
+ * @brief Concept for types that are either std::string or std::optional of
77
+ * std::string.
78
+ * @details This concept is used to constrain the template parameter of the
79
+ * `queryProperty` method.
80
+ * @tparam T The type to check.
81
+ */
82
+ template <typename T>
83
+ concept string_or_optional_string =
84
+ std::is_same_v<T, std::string> ||
85
+ (is_optional<T> && std::is_same_v<typename T::value_type, std::string>);
86
+
87
+ /// @see remove_optional_t
88
+ template <typename T> struct remove_optional {
89
+ using type = T;
90
+ };
91
+
92
+ /// @see remove_optional_t
93
+ template <typename U> struct remove_optional<std::optional<U>> {
94
+ using type = U;
95
+ };
96
+
97
+ /**
98
+ * @brief Helper type to strip std::optional from a type if it is present.
99
+ * @details This is useful for template metaprogramming when you want to work
100
+ * with the underlying type of optional without caring about its optionality.
101
+ * @tparam T The type to strip optional from.
102
+ */
103
+ template <typename T>
104
+ using remove_optional_t = typename remove_optional<T>::type;
105
+
106
+ /**
107
+ * @brief Concept for types that are either size_constructible_contiguous_range
108
+ * or std::optional of size_constructible_contiguous_range.
109
+ * @details This concept is used to constrain the template parameter of the
110
+ * `queryProperty` method.
111
+ * @tparam T The type to check.
112
+ * @see Operation::queryProperty
113
+ */
114
+ template <typename T>
115
+ concept maybe_optional_size_constructible_contiguous_range =
116
+ size_constructible_contiguous_range<remove_optional_t<T>>;
117
+
118
+ /**
119
+ * @brief Concept for types that are either value_or_string or std::optional of
120
+ * value_or_string.
121
+ * @details This concept is used to constrain the template parameter of the
122
+ * `queryProperty` method.
123
+ * @tparam T The type to check.
124
+ * @see Site::queryProperty
125
+ */
126
+ template <typename T>
127
+ concept maybe_optional_value_or_string = value_or_string<remove_optional_t<T>>;
128
+
129
+ /**
130
+ * @brief Concept for types that are either value_or_string_or_vector or
131
+ * std::optional of value_or_string_or_vector.
132
+ * @details This concept is used to constrain the template parameter of the
133
+ * `queryProperty` method.
134
+ * @tparam T The type to check.
135
+ * @see Operation::queryProperty
136
+ */
137
+ template <typename T>
138
+ concept maybe_optional_value_or_string_or_vector =
139
+ value_or_string_or_vector<remove_optional_t<T>>;
140
+
141
+ /// @returns the string representation of the given QDMI_STATUS.
142
+ auto toString(QDMI_STATUS result) -> std::string;
143
+
144
+ /// @returns the string representation of the given QDMI_Site_Property.
145
+ auto toString(QDMI_Site_Property prop) -> std::string;
146
+
147
+ /// @returns the string representation of the given QDMI_Operation_Property.
148
+ auto toString(QDMI_Operation_Property prop) -> std::string;
149
+
150
+ /// @returns the string representation of the given QDMI_Device_Property.
151
+ auto toString(QDMI_Device_Property prop) -> std::string;
152
+
153
+ /// @returns the string representation of the given QDMI_Session_Property.
154
+ constexpr auto toString(QDMI_Session_Property prop) -> std::string {
155
+ if (prop == QDMI_SESSION_PROPERTY_DEVICES) {
156
+ return "QDMI_SESSION_PROPERTY_DEVICES";
157
+ }
158
+ return "QDMI_SESSION_PROPERTY_UNKNOWN";
159
+ }
160
+
161
+ /// Throws an exception corresponding to the given QDMI_STATUS code.
162
+ [[noreturn]] auto throwError(int result, const std::string& msg) -> void;
163
+
164
+ /// Throws an exception if the result indicates an error.
165
+ inline auto throwIfError(int result, const std::string& msg) -> void {
166
+ switch (result) {
167
+ case QDMI_SUCCESS:
168
+ break;
169
+ case QDMI_WARN_GENERAL:
170
+ std::cerr << "Warning: " << msg << "\n";
171
+ break;
172
+ default:
173
+ throwError(result, msg);
174
+ }
175
+ }
176
+
177
+ /**
178
+ * @brief Class representing the FoMaC library.
179
+ * @details This class provides methods to query available devices and
180
+ * manage the QDMI session.
181
+ * @note This class is a singleton.
182
+ * @see QDMI_Session
183
+ */
184
+ class FoMaC {
185
+ /**
186
+ * @brief Private token class.
187
+ * @details Only the FoMaC class can create instances of this class.
188
+ */
189
+ class Token {
190
+ public:
191
+ Token() = default;
192
+ };
193
+
194
+ public:
195
+ /**
196
+ * @brief Class representing a quantum device.
197
+ * @details This class provides methods to query properties of the device,
198
+ * its sites, and its operations.
199
+ * @see QDMI_Device
200
+ */
201
+ class Device {
202
+ /**
203
+ * @brief Private token class.
204
+ * @details Only the Device class can create instances of this class.
205
+ */
206
+ class Token {
207
+ public:
208
+ Token() = default;
209
+ };
210
+
211
+ public:
212
+ /**
213
+ * @brief Class representing a site (qubit) on the device.
214
+ * @details This class provides methods to query properties of the site.
215
+ * @see QDMI_Site
216
+ */
217
+ class Site {
218
+ /// @brief The associated QDMI_Device object.
219
+ QDMI_Device device_;
220
+ /// @brief The underlying QDMI_Site object.
221
+ QDMI_Site site_;
222
+
223
+ template <maybe_optional_value_or_string T>
224
+ [[nodiscard]] auto queryProperty(QDMI_Site_Property prop) const -> T {
225
+ if constexpr (string_or_optional_string<T>) {
226
+ size_t size = 0;
227
+ const auto result = QDMI_device_query_site_property(
228
+ device_, site_, prop, 0, nullptr, &size);
229
+ if constexpr (is_optional<T>) {
230
+ if (result == QDMI_ERROR_NOTSUPPORTED) {
231
+ return std::nullopt;
232
+ }
233
+ }
234
+ throwIfError(result, "Querying " + toString(prop));
235
+ std::string value(size - 1, '\0');
236
+ throwIfError(QDMI_device_query_site_property(
237
+ device_, site_, prop, size, value.data(), nullptr),
238
+ "Querying " + toString(prop));
239
+ return value;
240
+ } else {
241
+ remove_optional_t<T> value{};
242
+ const auto result = QDMI_device_query_site_property(
243
+ device_, site_, prop, sizeof(remove_optional_t<T>), &value,
244
+ nullptr);
245
+ if constexpr (is_optional<T>) {
246
+ if (result == QDMI_ERROR_NOTSUPPORTED) {
247
+ return std::nullopt;
248
+ }
249
+ }
250
+ throwIfError(result, "Querying " + toString(prop));
251
+ return value;
252
+ }
253
+ }
254
+
255
+ public:
256
+ /**
257
+ * @brief Constructs a Site object from a QDMI_Site handle.
258
+ * @param device The associated QDMI_Device handle.
259
+ * @param site The QDMI_Site handle to wrap.
260
+ */
261
+ Site(Token /* unused */, QDMI_Device device, QDMI_Site site)
262
+ : device_(device), site_(site) {}
263
+ /// @returns the underlying QDMI_Site object.
264
+ [[nodiscard]] auto getQDMISite() const -> QDMI_Site { return site_; }
265
+ // NOLINTNEXTLINE(google-explicit-constructor)
266
+ operator QDMI_Site() const { return site_; }
267
+ auto operator<=>(const Site&) const = default;
268
+ /// @see QDMI_SITE_PROPERTY_INDEX
269
+ [[nodiscard]] auto getIndex() const -> size_t;
270
+ /// @see QDMI_SITE_PROPERTY_T1
271
+ [[nodiscard]] auto getT1() const -> std::optional<uint64_t>;
272
+ /// @see QDMI_SITE_PROPERTY_T2
273
+ [[nodiscard]] auto getT2() const -> std::optional<uint64_t>;
274
+ /// @see QDMI_SITE_PROPERTY_NAME
275
+ [[nodiscard]] auto getName() const -> std::optional<std::string>;
276
+ /// @see QDMI_SITE_PROPERTY_XCOORDINATE
277
+ [[nodiscard]] auto getXCoordinate() const -> std::optional<int64_t>;
278
+ /// @see QDMI_SITE_PROPERTY_YCOORDINATE
279
+ [[nodiscard]] auto getYCoordinate() const -> std::optional<int64_t>;
280
+ /// @see QDMI_SITE_PROPERTY_ZCOORDINATE
281
+ [[nodiscard]] auto getZCoordinate() const -> std::optional<int64_t>;
282
+ /// @see QDMI_SITE_PROPERTY_ISZONE
283
+ [[nodiscard]] auto isZone() const -> std::optional<bool>;
284
+ /// @see QDMI_SITE_PROPERTY_XEXTENT
285
+ [[nodiscard]] auto getXExtent() const -> std::optional<uint64_t>;
286
+ /// @see QDMI_SITE_PROPERTY_YEXTENT
287
+ [[nodiscard]] auto getYExtent() const -> std::optional<uint64_t>;
288
+ /// @see QDMI_SITE_PROPERTY_ZEXTENT
289
+ [[nodiscard]] auto getZExtent() const -> std::optional<uint64_t>;
290
+ /// @see QDMI_SITE_PROPERTY_MODULEINDEX
291
+ [[nodiscard]] auto getModuleIndex() const -> std::optional<uint64_t>;
292
+ /// @see QDMI_SITE_PROPERTY_SUBMODULEINDEX
293
+ [[nodiscard]] auto getSubmoduleIndex() const -> std::optional<uint64_t>;
294
+ };
295
+ /**
296
+ * @brief Class representing an operation (gate) supported by the device.
297
+ * @details This class provides methods to query properties of the
298
+ * operation.
299
+ * @see QDMI_Operation
300
+ */
301
+ class Operation {
302
+ /// @brief The associated QDMI_Device object.
303
+ QDMI_Device device_;
304
+ /// @brief The underlying QDMI_Operation object.
305
+ QDMI_Operation operation_;
306
+
307
+ template <maybe_optional_value_or_string_or_vector T>
308
+ [[nodiscard]] auto queryProperty(QDMI_Operation_Property prop,
309
+ const std::vector<Site>& sites,
310
+ const std::vector<double>& params) const
311
+ -> T {
312
+ std::vector<QDMI_Site> qdmiSites;
313
+ qdmiSites.reserve(sites.size());
314
+ std::ranges::transform(
315
+ sites, std::back_inserter(qdmiSites),
316
+ [](const Site& site) -> QDMI_Site { return site; });
317
+ if constexpr (string_or_optional_string<T>) {
318
+ size_t size = 0;
319
+ const auto result = QDMI_device_query_operation_property(
320
+ device_, operation_, sites.size(), qdmiSites.data(),
321
+ params.size(), params.data(), prop, 0, nullptr, &size);
322
+ if constexpr (is_optional<T>) {
323
+ if (result == QDMI_ERROR_NOTSUPPORTED) {
324
+ return std::nullopt;
325
+ }
326
+ }
327
+ throwIfError(result, "Querying " + toString(prop));
328
+ std::string value(size - 1, '\0');
329
+ throwIfError(QDMI_device_query_operation_property(
330
+ device_, operation_, sites.size(), qdmiSites.data(),
331
+ params.size(), params.data(), prop, size,
332
+ value.data(), nullptr),
333
+ "Querying " + toString(prop));
334
+ return value;
335
+ } else if constexpr (maybe_optional_size_constructible_contiguous_range<
336
+ T>) {
337
+ size_t size = 0;
338
+ const auto result = QDMI_device_query_operation_property(
339
+ device_, operation_, sites.size(), qdmiSites.data(),
340
+ params.size(), params.data(), prop, 0, nullptr, &size);
341
+ if constexpr (is_optional<T>) {
342
+ if (result == QDMI_ERROR_NOTSUPPORTED) {
343
+ return std::nullopt;
344
+ }
345
+ }
346
+ throwIfError(result, "Querying " + toString(prop));
347
+ remove_optional_t<T> value(
348
+ size / sizeof(typename remove_optional_t<T>::value_type));
349
+ throwIfError(QDMI_device_query_operation_property(
350
+ device_, operation_, sites.size(), qdmiSites.data(),
351
+ params.size(), params.data(), prop, size,
352
+ value.data(), nullptr),
353
+ "Querying " + toString(prop));
354
+ return value;
355
+ } else {
356
+ remove_optional_t<T> value{};
357
+ const auto result = QDMI_device_query_operation_property(
358
+ device_, operation_, sites.size(), qdmiSites.data(),
359
+ params.size(), params.data(), prop, sizeof(remove_optional_t<T>),
360
+ &value, nullptr);
361
+ if constexpr (is_optional<T>) {
362
+ if (result == QDMI_ERROR_NOTSUPPORTED) {
363
+ return std::nullopt;
364
+ }
365
+ }
366
+ throwIfError(result, "Querying " + toString(prop));
367
+ return value;
368
+ }
369
+ }
370
+
371
+ public:
372
+ /**
373
+ * @brief Constructs an Operation object from a QDMI_Operation handle.
374
+ * @param device The associated QDMI_Device handle.
375
+ * @param operation The QDMI_Operation handle to wrap.
376
+ */
377
+ Operation(Token /* unused */, QDMI_Device device,
378
+ QDMI_Operation operation)
379
+ : device_(device), operation_(operation) {}
380
+ /// @returns the underlying QDMI_Operation object.
381
+ [[nodiscard]] auto getQDMIOperation() const -> QDMI_Operation {
382
+ return operation_;
383
+ }
384
+ // NOLINTNEXTLINE(google-explicit-constructor)
385
+ operator QDMI_Operation() const { return operation_; }
386
+ auto operator<=>(const Operation&) const = default;
387
+ /// @see QDMI_OPERATION_PROPERTY_NAME
388
+ [[nodiscard]] auto getName(const std::vector<Site>& sites = {},
389
+ const std::vector<double>& params = {}) const
390
+ -> std::string;
391
+ /// @see QDMI_OPERATION_PROPERTY_QUBITSNUM
392
+ [[nodiscard]] auto
393
+ getQubitsNum(const std::vector<Site>& sites = {},
394
+ const std::vector<double>& params = {}) const
395
+ -> std::optional<size_t>;
396
+ /// @see QDMI_OPERATION_PROPERTY_PARAMETERSNUM
397
+ [[nodiscard]] auto
398
+ getParametersNum(const std::vector<Site>& sites = {},
399
+ const std::vector<double>& params = {}) const -> size_t;
400
+ /// @see QDMI_OPERATION_PROPERTY_DURATION
401
+ [[nodiscard]] auto
402
+ getDuration(const std::vector<Site>& sites = {},
403
+ const std::vector<double>& params = {}) const
404
+ -> std::optional<uint64_t>;
405
+ /// @see QDMI_OPERATION_PROPERTY_FIDELITY
406
+ [[nodiscard]] auto
407
+ getFidelity(const std::vector<Site>& sites = {},
408
+ const std::vector<double>& params = {}) const
409
+ -> std::optional<double>;
410
+ /// @see QDMI_OPERATION_PROPERTY_INTERACTIONRADIUS
411
+ [[nodiscard]] auto
412
+ getInteractionRadius(const std::vector<Site>& sites = {},
413
+ const std::vector<double>& params = {}) const
414
+ -> std::optional<uint64_t>;
415
+ /// @see QDMI_OPERATION_PROPERTY_BLOCKINGRADIUS
416
+ [[nodiscard]] auto
417
+ getBlockingRadius(const std::vector<Site>& sites = {},
418
+ const std::vector<double>& params = {}) const
419
+ -> std::optional<uint64_t>;
420
+ /// @see QDMI_OPERATION_PROPERTY_IDLINGFIDELITY
421
+ [[nodiscard]] auto
422
+ getIdlingFidelity(const std::vector<Site>& sites = {},
423
+ const std::vector<double>& params = {}) const
424
+ -> std::optional<double>;
425
+ /// @see QDMI_OPERATION_PROPERTY_ISZONED
426
+ [[nodiscard]] auto isZoned(const std::vector<Site>& sites = {},
427
+ const std::vector<double>& params = {}) const
428
+ -> std::optional<bool>;
429
+ /// @see QDMI_OPERATION_PROPERTY_SITES
430
+ [[nodiscard]] auto getSites(const std::vector<Site>& sites = {},
431
+ const std::vector<double>& params = {}) const
432
+ -> std::optional<std::vector<Site>>;
433
+ /// @see QDMI_OPERATION_PROPERTY_MEANSHUTTLINGSPEED
434
+ [[nodiscard]] auto
435
+ getMeanShuttlingSpeed(const std::vector<Site>& sites = {},
436
+ const std::vector<double>& params = {}) const
437
+ -> std::optional<uint64_t>;
438
+ };
439
+
440
+ private:
441
+ /// @brief The underlying QDMI_Device object.
442
+ QDMI_Device device_;
443
+
444
+ template <maybe_optional_value_or_string_or_vector T>
445
+ [[nodiscard]] auto queryProperty(QDMI_Device_Property prop) const -> T {
446
+ if constexpr (string_or_optional_string<T>) {
447
+ size_t size = 0;
448
+ const auto result =
449
+ QDMI_device_query_device_property(device_, prop, 0, nullptr, &size);
450
+ if constexpr (is_optional<T>) {
451
+ if (result == QDMI_ERROR_NOTSUPPORTED) {
452
+ return std::nullopt;
453
+ }
454
+ }
455
+ throwIfError(result, "Querying " + toString(prop));
456
+ std::string value(size - 1, '\0');
457
+ throwIfError(QDMI_device_query_device_property(device_, prop, size,
458
+ value.data(), nullptr),
459
+ "Querying " + toString(prop));
460
+ return value;
461
+ } else if constexpr (maybe_optional_size_constructible_contiguous_range<
462
+ T>) {
463
+ size_t size = 0;
464
+ const auto result =
465
+ QDMI_device_query_device_property(device_, prop, 0, nullptr, &size);
466
+ if constexpr (is_optional<T>) {
467
+ if (result == QDMI_ERROR_NOTSUPPORTED) {
468
+ return std::nullopt;
469
+ }
470
+ }
471
+ throwIfError(result, "Querying " + toString(prop));
472
+ remove_optional_t<T> value(
473
+ size / sizeof(typename remove_optional_t<T>::value_type));
474
+ throwIfError(QDMI_device_query_device_property(device_, prop, size,
475
+ value.data(), nullptr),
476
+ "Querying " + toString(prop));
477
+ return value;
478
+ } else {
479
+ remove_optional_t<T> value{};
480
+ const auto result = QDMI_device_query_device_property(
481
+ device_, prop, sizeof(remove_optional_t<T>), &value, nullptr);
482
+ if constexpr (is_optional<T>) {
483
+ if (result == QDMI_ERROR_NOTSUPPORTED) {
484
+ return std::nullopt;
485
+ }
486
+ }
487
+ throwIfError(result, "Querying " + toString(prop));
488
+ return value;
489
+ }
490
+ }
491
+
492
+ public:
493
+ /**
494
+ * @brief Constructs a Device object from a QDMI_Device handle.
495
+ * @param device The QDMI_Device handle to wrap.
496
+ */
497
+ Device(FoMaC::Token /* unused */, QDMI_Device device) : device_(device) {}
498
+ /// @returns the underlying QDMI_Device object.
499
+ [[nodiscard]] auto getQDMIDevice() const -> QDMI_Device { return device_; }
500
+ // NOLINTNEXTLINE(google-explicit-constructor)
501
+ operator QDMI_Device() const { return device_; }
502
+ auto operator<=>(const Device&) const = default;
503
+ /// @see QDMI_DEVICE_PROPERTY_NAME
504
+ [[nodiscard]] auto getName() const -> std::string;
505
+ /// @see QDMI_DEVICE_PROPERTY_VERSION
506
+ [[nodiscard]] auto getVersion() const -> std::string;
507
+ /// @see QDMI_DEVICE_PROPERTY_STATUS
508
+ [[nodiscard]] auto getStatus() const -> QDMI_Device_Status;
509
+ /// @see QDMI_DEVICE_PROPERTY_LIBRARYVERSION
510
+ [[nodiscard]] auto getLibraryVersion() const -> std::string;
511
+ /// @see QDMI_DEVICE_PROPERTY_QUBITSNUM
512
+ [[nodiscard]] auto getQubitsNum() const -> size_t;
513
+ /// @see QDMI_DEVICE_PROPERTY_SITES
514
+ [[nodiscard]] auto getSites() const -> std::vector<Site>;
515
+ /// @see QDMI_DEVICE_PROPERTY_OPERATIONS
516
+ [[nodiscard]] auto getOperations() const -> std::vector<Operation>;
517
+ /// @see QDMI_DEVICE_PROPERTY_COUPLINGMAP
518
+ [[nodiscard]] auto getCouplingMap() const
519
+ -> std::optional<std::vector<std::pair<Site, Site>>>;
520
+ /// @see QDMI_DEVICE_PROPERTY_NEEDSCALIBRATION
521
+ [[nodiscard]] auto getNeedsCalibration() const -> std::optional<size_t>;
522
+ /// @see QDMI_DEVICE_PROPERTY_LENGTHUNIT
523
+ [[nodiscard]] auto getLengthUnit() const -> std::optional<std::string>;
524
+ /// @see QDMI_DEVICE_PROPERTY_LENGTHSCALEFACTOR
525
+ [[nodiscard]] auto getLengthScaleFactor() const -> std::optional<double>;
526
+ /// @see QDMI_DEVICE_PROPERTY_DURATIONUNIT
527
+ [[nodiscard]] auto getDurationUnit() const -> std::optional<std::string>;
528
+ /// @see QDMI_DEVICE_PROPERTY_DURATIONSCALEFACTOR
529
+ [[nodiscard]] auto getDurationScaleFactor() const -> std::optional<double>;
530
+ /// @see QDMI_DEVICE_PROPERTY_MINATOMDISTANCE
531
+ [[nodiscard]] auto getMinAtomDistance() const -> std::optional<uint64_t>;
532
+ };
533
+
534
+ private:
535
+ QDMI_Session session_ = nullptr;
536
+
537
+ FoMaC();
538
+ static auto get() -> FoMaC& {
539
+ static FoMaC instance;
540
+ return instance;
541
+ }
542
+ template <size_constructible_contiguous_range T>
543
+ [[nodiscard]] auto queryProperty(const QDMI_Session_Property prop) const
544
+ -> T {
545
+ size_t size = 0;
546
+ throwIfError(
547
+ QDMI_session_query_session_property(session_, prop, 0, nullptr, &size),
548
+ "Querying " + toString(prop));
549
+ remove_optional_t<T> value(
550
+ size / sizeof(typename remove_optional_t<T>::value_type));
551
+ throwIfError(QDMI_session_query_session_property(session_, prop, size,
552
+ value.data(), nullptr),
553
+ "Querying " + toString(prop));
554
+ return value;
555
+ }
556
+
557
+ public:
558
+ virtual ~FoMaC();
559
+ // Delete copy constructors and assignment operators to prevent copying the
560
+ // singleton instance.
561
+ FoMaC(const FoMaC&) = delete;
562
+ FoMaC& operator=(const FoMaC&) = delete;
563
+ FoMaC(FoMaC&&) = default;
564
+ FoMaC& operator=(FoMaC&&) = default;
565
+ /// @see QDMI_SESSION_PROPERTY_DEVICES
566
+ [[nodiscard]] static auto getDevices() -> std::vector<Device>;
567
+ };
568
+ } // namespace fomac
@@ -0,0 +1,108 @@
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
+ /** @file
12
+ * @brief Common definitions used throughout the library.
13
+ */
14
+
15
+ #pragma once
16
+
17
+ #include <cstddef>
18
+ #include <cstdint>
19
+ #include <vector>
20
+
21
+ namespace qc {
22
+ /**
23
+ * @brief Type alias for qubit indices.
24
+ * @details This type (alias) is used to represent qubit indices in the library.
25
+ * It has been chosen to be an unsigned 32-bit integer to allow for up to
26
+ * 4,294,967,295 qubits, which should be enough for most use cases.
27
+ */
28
+ using Qubit = std::uint32_t;
29
+ /**
30
+ * @brief Type alias for classical bit indices.
31
+ * @details This type (alias) is used to represent classical bit indices in the
32
+ * library. The choice of 64-bits is arbitrary and can be changed if necessary.
33
+ */
34
+ using Bit = std::uint64_t;
35
+
36
+ /// A type alias for a vector of qubits which are supposed to act as targets.
37
+ using Targets = std::vector<Qubit>;
38
+
39
+ /// Floating-point type used throughout the library
40
+ using fp = double;
41
+
42
+ /// A constant for the value of \f$\pi\f$.
43
+ static constexpr auto PI = static_cast<fp>(
44
+ 3.141592653589793238462643383279502884197169399375105820974L);
45
+ /// A constant for the value of \f$\frac{\pi}{2}\f$.
46
+ static constexpr auto PI_2 = static_cast<fp>(
47
+ 1.570796326794896619231321691639751442098584699687552910487L);
48
+ /// A constant for the value of \f$\frac{\pi}{4}\f$.
49
+ static constexpr auto PI_4 = static_cast<fp>(
50
+ 0.785398163397448309615660845819875721049292349843776455243L);
51
+ /// A constant for the value of \f$\tau\f$.
52
+ static constexpr auto TAU = static_cast<fp>(
53
+ 6.283185307179586476925286766559005768394338798750211641950L);
54
+ /// A constant for the value of \f$e\f$.
55
+ static constexpr auto E = static_cast<fp>(
56
+ 2.718281828459045235360287471352662497757247093699959574967L);
57
+
58
+ /// Supported file formats
59
+ enum class Format : uint8_t {
60
+ /**
61
+ * @brief OpenQASM 2.0 format
62
+ * @see https://arxiv.org/abs/1707.03429
63
+ */
64
+ OpenQASM2,
65
+ /**
66
+ * @brief OpenQASM 3 format
67
+ * @see https://openqasm.com/index.html
68
+ */
69
+ OpenQASM3
70
+ };
71
+
72
+ /**
73
+ * @brief Combine two 64bit hashes into one 64bit hash
74
+ * @details Combines two 64bit hashes into one 64bit hash based on
75
+ * boost::hash_combine (https://www.boost.org/LICENSE_1_0.txt)
76
+ * @param lhs The first hash
77
+ * @param rhs The second hash
78
+ * @returns The combined hash
79
+ */
80
+ [[nodiscard]] constexpr std::size_t
81
+ combineHash(const std::size_t lhs, const std::size_t rhs) noexcept {
82
+ return lhs ^ (rhs + 0x9e3779b97f4a7c15ULL + (lhs << 6) + (lhs >> 2));
83
+ }
84
+
85
+ /**
86
+ * @brief Extend a 64bit hash with a 64bit integer
87
+ * @param hash The hash to extend
88
+ * @param with The integer to extend the hash with
89
+ * @return The combined hash
90
+ */
91
+ constexpr void hashCombine(std::size_t& hash, const std::size_t with) noexcept {
92
+ hash = combineHash(hash, with);
93
+ }
94
+
95
+ /**
96
+ * @brief Function used to mark unreachable code
97
+ * @details Uses compiler specific extensions if possible. Even if no extension
98
+ * is used, undefined behavior is still raised by an empty function body and the
99
+ * noreturn attribute.
100
+ */
101
+ [[noreturn]] inline void unreachable() {
102
+ #ifdef __GNUC__ // GCC, Clang, ICC
103
+ __builtin_unreachable();
104
+ #elif defined(_MSC_VER) // MSVC
105
+ __assume(false);
106
+ #endif
107
+ }
108
+ } // namespace qc