mqt-core 3.3.2__cp312-cp312-win_amd64.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 (537) hide show
  1. mqt/core/__init__.py +89 -0
  2. mqt/core/__main__.py +55 -0
  3. mqt/core/_commands.py +52 -0
  4. mqt/core/_compat/__init__.py +11 -0
  5. mqt/core/_compat/typing.py +29 -0
  6. mqt/core/_version.py +34 -0
  7. mqt/core/_version.pyi +12 -0
  8. mqt/core/bin/mqt-core-algorithms.dll +0 -0
  9. mqt/core/bin/mqt-core-circuit-optimizer.dll +0 -0
  10. mqt/core/bin/mqt-core-dd.dll +0 -0
  11. mqt/core/bin/mqt-core-ds.dll +0 -0
  12. mqt/core/bin/mqt-core-fomac.dll +0 -0
  13. mqt/core/bin/mqt-core-ir.dll +0 -0
  14. mqt/core/bin/mqt-core-na-fomac.dll +0 -0
  15. mqt/core/bin/mqt-core-na.dll +0 -0
  16. mqt/core/bin/mqt-core-qasm.dll +0 -0
  17. mqt/core/bin/mqt-core-qdmi-driver.dll +0 -0
  18. mqt/core/bin/mqt-core-qdmi-na-device.dll +0 -0
  19. mqt/core/bin/mqt-core-zx.dll +0 -0
  20. mqt/core/dd.cp312-win_amd64.pyd +0 -0
  21. mqt/core/dd.pyi +1016 -0
  22. mqt/core/dd_evaluation.py +368 -0
  23. mqt/core/fomac.cp312-win_amd64.pyd +0 -0
  24. mqt/core/fomac.pyi +125 -0
  25. mqt/core/include/mqt-core/algorithms/BernsteinVazirani.hpp +39 -0
  26. mqt/core/include/mqt-core/algorithms/GHZState.hpp +18 -0
  27. mqt/core/include/mqt-core/algorithms/Grover.hpp +33 -0
  28. mqt/core/include/mqt-core/algorithms/QFT.hpp +21 -0
  29. mqt/core/include/mqt-core/algorithms/QPE.hpp +30 -0
  30. mqt/core/include/mqt-core/algorithms/RandomCliffordCircuit.hpp +22 -0
  31. mqt/core/include/mqt-core/algorithms/StatePreparation.hpp +43 -0
  32. mqt/core/include/mqt-core/algorithms/WState.hpp +18 -0
  33. mqt/core/include/mqt-core/algorithms/mqt_core_algorithms_export.h +43 -0
  34. mqt/core/include/mqt-core/boost/config/abi/borland_prefix.hpp +27 -0
  35. mqt/core/include/mqt-core/boost/config/abi/borland_suffix.hpp +12 -0
  36. mqt/core/include/mqt-core/boost/config/abi/msvc_prefix.hpp +22 -0
  37. mqt/core/include/mqt-core/boost/config/abi/msvc_suffix.hpp +8 -0
  38. mqt/core/include/mqt-core/boost/config/abi_prefix.hpp +25 -0
  39. mqt/core/include/mqt-core/boost/config/abi_suffix.hpp +25 -0
  40. mqt/core/include/mqt-core/boost/config/assert_cxx03.hpp +211 -0
  41. mqt/core/include/mqt-core/boost/config/assert_cxx11.hpp +212 -0
  42. mqt/core/include/mqt-core/boost/config/assert_cxx14.hpp +47 -0
  43. mqt/core/include/mqt-core/boost/config/assert_cxx17.hpp +65 -0
  44. mqt/core/include/mqt-core/boost/config/assert_cxx20.hpp +59 -0
  45. mqt/core/include/mqt-core/boost/config/assert_cxx23.hpp +41 -0
  46. mqt/core/include/mqt-core/boost/config/assert_cxx98.hpp +23 -0
  47. mqt/core/include/mqt-core/boost/config/auto_link.hpp +525 -0
  48. mqt/core/include/mqt-core/boost/config/compiler/borland.hpp +342 -0
  49. mqt/core/include/mqt-core/boost/config/compiler/clang.hpp +370 -0
  50. mqt/core/include/mqt-core/boost/config/compiler/clang_version.hpp +89 -0
  51. mqt/core/include/mqt-core/boost/config/compiler/codegear.hpp +389 -0
  52. mqt/core/include/mqt-core/boost/config/compiler/comeau.hpp +59 -0
  53. mqt/core/include/mqt-core/boost/config/compiler/common_edg.hpp +185 -0
  54. mqt/core/include/mqt-core/boost/config/compiler/compaq_cxx.hpp +19 -0
  55. mqt/core/include/mqt-core/boost/config/compiler/cray.hpp +446 -0
  56. mqt/core/include/mqt-core/boost/config/compiler/diab.hpp +26 -0
  57. mqt/core/include/mqt-core/boost/config/compiler/digitalmars.hpp +146 -0
  58. mqt/core/include/mqt-core/boost/config/compiler/gcc.hpp +386 -0
  59. mqt/core/include/mqt-core/boost/config/compiler/gcc_xml.hpp +115 -0
  60. mqt/core/include/mqt-core/boost/config/compiler/greenhills.hpp +28 -0
  61. mqt/core/include/mqt-core/boost/config/compiler/hp_acc.hpp +153 -0
  62. mqt/core/include/mqt-core/boost/config/compiler/intel.hpp +577 -0
  63. mqt/core/include/mqt-core/boost/config/compiler/kai.hpp +33 -0
  64. mqt/core/include/mqt-core/boost/config/compiler/metrowerks.hpp +201 -0
  65. mqt/core/include/mqt-core/boost/config/compiler/mpw.hpp +143 -0
  66. mqt/core/include/mqt-core/boost/config/compiler/nvcc.hpp +64 -0
  67. mqt/core/include/mqt-core/boost/config/compiler/pathscale.hpp +141 -0
  68. mqt/core/include/mqt-core/boost/config/compiler/pgi.hpp +23 -0
  69. mqt/core/include/mqt-core/boost/config/compiler/sgi_mipspro.hpp +29 -0
  70. mqt/core/include/mqt-core/boost/config/compiler/sunpro_cc.hpp +225 -0
  71. mqt/core/include/mqt-core/boost/config/compiler/vacpp.hpp +189 -0
  72. mqt/core/include/mqt-core/boost/config/compiler/visualc.hpp +398 -0
  73. mqt/core/include/mqt-core/boost/config/compiler/xlcpp.hpp +303 -0
  74. mqt/core/include/mqt-core/boost/config/compiler/xlcpp_zos.hpp +174 -0
  75. mqt/core/include/mqt-core/boost/config/detail/cxx_composite.hpp +218 -0
  76. mqt/core/include/mqt-core/boost/config/detail/posix_features.hpp +95 -0
  77. mqt/core/include/mqt-core/boost/config/detail/select_compiler_config.hpp +157 -0
  78. mqt/core/include/mqt-core/boost/config/detail/select_platform_config.hpp +147 -0
  79. mqt/core/include/mqt-core/boost/config/detail/select_stdlib_config.hpp +121 -0
  80. mqt/core/include/mqt-core/boost/config/detail/suffix.hpp +1334 -0
  81. mqt/core/include/mqt-core/boost/config/header_deprecated.hpp +26 -0
  82. mqt/core/include/mqt-core/boost/config/helper_macros.hpp +37 -0
  83. mqt/core/include/mqt-core/boost/config/no_tr1/cmath.hpp +28 -0
  84. mqt/core/include/mqt-core/boost/config/no_tr1/complex.hpp +28 -0
  85. mqt/core/include/mqt-core/boost/config/no_tr1/functional.hpp +28 -0
  86. mqt/core/include/mqt-core/boost/config/no_tr1/memory.hpp +28 -0
  87. mqt/core/include/mqt-core/boost/config/no_tr1/utility.hpp +28 -0
  88. mqt/core/include/mqt-core/boost/config/platform/aix.hpp +33 -0
  89. mqt/core/include/mqt-core/boost/config/platform/amigaos.hpp +15 -0
  90. mqt/core/include/mqt-core/boost/config/platform/beos.hpp +26 -0
  91. mqt/core/include/mqt-core/boost/config/platform/bsd.hpp +83 -0
  92. mqt/core/include/mqt-core/boost/config/platform/cloudabi.hpp +18 -0
  93. mqt/core/include/mqt-core/boost/config/platform/cray.hpp +18 -0
  94. mqt/core/include/mqt-core/boost/config/platform/cygwin.hpp +71 -0
  95. mqt/core/include/mqt-core/boost/config/platform/haiku.hpp +31 -0
  96. mqt/core/include/mqt-core/boost/config/platform/hpux.hpp +87 -0
  97. mqt/core/include/mqt-core/boost/config/platform/irix.hpp +31 -0
  98. mqt/core/include/mqt-core/boost/config/platform/linux.hpp +106 -0
  99. mqt/core/include/mqt-core/boost/config/platform/macos.hpp +87 -0
  100. mqt/core/include/mqt-core/boost/config/platform/qnxnto.hpp +31 -0
  101. mqt/core/include/mqt-core/boost/config/platform/solaris.hpp +31 -0
  102. mqt/core/include/mqt-core/boost/config/platform/symbian.hpp +97 -0
  103. mqt/core/include/mqt-core/boost/config/platform/vms.hpp +25 -0
  104. mqt/core/include/mqt-core/boost/config/platform/vxworks.hpp +422 -0
  105. mqt/core/include/mqt-core/boost/config/platform/wasm.hpp +23 -0
  106. mqt/core/include/mqt-core/boost/config/platform/win32.hpp +90 -0
  107. mqt/core/include/mqt-core/boost/config/platform/zos.hpp +32 -0
  108. mqt/core/include/mqt-core/boost/config/pragma_message.hpp +31 -0
  109. mqt/core/include/mqt-core/boost/config/requires_threads.hpp +92 -0
  110. mqt/core/include/mqt-core/boost/config/stdlib/dinkumware.hpp +324 -0
  111. mqt/core/include/mqt-core/boost/config/stdlib/libcomo.hpp +93 -0
  112. mqt/core/include/mqt-core/boost/config/stdlib/libcpp.hpp +180 -0
  113. mqt/core/include/mqt-core/boost/config/stdlib/libstdcpp3.hpp +482 -0
  114. mqt/core/include/mqt-core/boost/config/stdlib/modena.hpp +79 -0
  115. mqt/core/include/mqt-core/boost/config/stdlib/msl.hpp +98 -0
  116. mqt/core/include/mqt-core/boost/config/stdlib/roguewave.hpp +208 -0
  117. mqt/core/include/mqt-core/boost/config/stdlib/sgi.hpp +168 -0
  118. mqt/core/include/mqt-core/boost/config/stdlib/stlport.hpp +258 -0
  119. mqt/core/include/mqt-core/boost/config/stdlib/vacpp.hpp +74 -0
  120. mqt/core/include/mqt-core/boost/config/stdlib/xlcpp_zos.hpp +61 -0
  121. mqt/core/include/mqt-core/boost/config/user.hpp +133 -0
  122. mqt/core/include/mqt-core/boost/config/warning_disable.hpp +47 -0
  123. mqt/core/include/mqt-core/boost/config/workaround.hpp +305 -0
  124. mqt/core/include/mqt-core/boost/config.hpp +67 -0
  125. mqt/core/include/mqt-core/boost/cstdint.hpp +556 -0
  126. mqt/core/include/mqt-core/boost/cxx11_char_types.hpp +70 -0
  127. mqt/core/include/mqt-core/boost/detail/workaround.hpp +10 -0
  128. mqt/core/include/mqt-core/boost/limits.hpp +146 -0
  129. mqt/core/include/mqt-core/boost/multiprecision/complex128.hpp +24 -0
  130. mqt/core/include/mqt-core/boost/multiprecision/complex_adaptor.hpp +1046 -0
  131. mqt/core/include/mqt-core/boost/multiprecision/concepts/mp_number_archetypes.hpp +257 -0
  132. mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float/io.hpp +698 -0
  133. mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float/transcendental.hpp +157 -0
  134. mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float.hpp +2297 -0
  135. mqt/core/include/mqt-core/boost/multiprecision/cpp_complex.hpp +12 -0
  136. mqt/core/include/mqt-core/boost/multiprecision/cpp_dec_float.hpp +3690 -0
  137. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/add.hpp +368 -0
  138. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/add_unsigned.hpp +387 -0
  139. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/bitwise.hpp +889 -0
  140. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/checked.hpp +178 -0
  141. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/comparison.hpp +374 -0
  142. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/cpp_int_config.hpp +161 -0
  143. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/divide.hpp +703 -0
  144. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/import_export.hpp +248 -0
  145. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/intel_intrinsics.hpp +138 -0
  146. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/limits.hpp +282 -0
  147. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/literals.hpp +295 -0
  148. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/misc.hpp +1457 -0
  149. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/multiply.hpp +848 -0
  150. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/serialize.hpp +211 -0
  151. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/value_pack.hpp +42 -0
  152. mqt/core/include/mqt-core/boost/multiprecision/cpp_int.hpp +2360 -0
  153. mqt/core/include/mqt-core/boost/multiprecision/debug_adaptor.hpp +760 -0
  154. mqt/core/include/mqt-core/boost/multiprecision/detail/assert.hpp +29 -0
  155. mqt/core/include/mqt-core/boost/multiprecision/detail/atomic.hpp +62 -0
  156. mqt/core/include/mqt-core/boost/multiprecision/detail/bitscan.hpp +317 -0
  157. mqt/core/include/mqt-core/boost/multiprecision/detail/check_cpp11_config.hpp +64 -0
  158. mqt/core/include/mqt-core/boost/multiprecision/detail/constexpr.hpp +88 -0
  159. mqt/core/include/mqt-core/boost/multiprecision/detail/default_ops.hpp +4052 -0
  160. mqt/core/include/mqt-core/boost/multiprecision/detail/digits.hpp +49 -0
  161. mqt/core/include/mqt-core/boost/multiprecision/detail/dynamic_array.hpp +44 -0
  162. mqt/core/include/mqt-core/boost/multiprecision/detail/empty_value.hpp +87 -0
  163. mqt/core/include/mqt-core/boost/multiprecision/detail/endian.hpp +35 -0
  164. mqt/core/include/mqt-core/boost/multiprecision/detail/et_ops.hpp +1831 -0
  165. mqt/core/include/mqt-core/boost/multiprecision/detail/float128_functions.hpp +95 -0
  166. mqt/core/include/mqt-core/boost/multiprecision/detail/float_string_cvt.hpp +333 -0
  167. mqt/core/include/mqt-core/boost/multiprecision/detail/fpclassify.hpp +101 -0
  168. mqt/core/include/mqt-core/boost/multiprecision/detail/functions/constants.hpp +288 -0
  169. mqt/core/include/mqt-core/boost/multiprecision/detail/functions/pow.hpp +905 -0
  170. mqt/core/include/mqt-core/boost/multiprecision/detail/functions/trig.hpp +1058 -0
  171. mqt/core/include/mqt-core/boost/multiprecision/detail/functions/trunc.hpp +82 -0
  172. mqt/core/include/mqt-core/boost/multiprecision/detail/generic_interconvert.hpp +687 -0
  173. mqt/core/include/mqt-core/boost/multiprecision/detail/hash.hpp +56 -0
  174. mqt/core/include/mqt-core/boost/multiprecision/detail/integer_ops.hpp +474 -0
  175. mqt/core/include/mqt-core/boost/multiprecision/detail/itos.hpp +39 -0
  176. mqt/core/include/mqt-core/boost/multiprecision/detail/min_max.hpp +106 -0
  177. mqt/core/include/mqt-core/boost/multiprecision/detail/no_et_ops.hpp +661 -0
  178. mqt/core/include/mqt-core/boost/multiprecision/detail/no_exceptions_support.hpp +55 -0
  179. mqt/core/include/mqt-core/boost/multiprecision/detail/number_base.hpp +1656 -0
  180. mqt/core/include/mqt-core/boost/multiprecision/detail/number_compare.hpp +848 -0
  181. mqt/core/include/mqt-core/boost/multiprecision/detail/precision.hpp +313 -0
  182. mqt/core/include/mqt-core/boost/multiprecision/detail/rebind.hpp +19 -0
  183. mqt/core/include/mqt-core/boost/multiprecision/detail/standalone_config.hpp +148 -0
  184. mqt/core/include/mqt-core/boost/multiprecision/detail/static_array.hpp +42 -0
  185. mqt/core/include/mqt-core/boost/multiprecision/detail/string_helpers.hpp +48 -0
  186. mqt/core/include/mqt-core/boost/multiprecision/detail/tables.hpp +80 -0
  187. mqt/core/include/mqt-core/boost/multiprecision/detail/ublas_interop.hpp +75 -0
  188. mqt/core/include/mqt-core/boost/multiprecision/detail/uniform_int_distribution.hpp +212 -0
  189. mqt/core/include/mqt-core/boost/multiprecision/detail/utype_helper.hpp +374 -0
  190. mqt/core/include/mqt-core/boost/multiprecision/eigen.hpp +248 -0
  191. mqt/core/include/mqt-core/boost/multiprecision/float128.hpp +920 -0
  192. mqt/core/include/mqt-core/boost/multiprecision/fwd.hpp +268 -0
  193. mqt/core/include/mqt-core/boost/multiprecision/gmp.hpp +4060 -0
  194. mqt/core/include/mqt-core/boost/multiprecision/integer.hpp +363 -0
  195. mqt/core/include/mqt-core/boost/multiprecision/logged_adaptor.hpp +834 -0
  196. mqt/core/include/mqt-core/boost/multiprecision/miller_rabin.hpp +221 -0
  197. mqt/core/include/mqt-core/boost/multiprecision/mpc.hpp +1721 -0
  198. mqt/core/include/mqt-core/boost/multiprecision/mpfi.hpp +2559 -0
  199. mqt/core/include/mqt-core/boost/multiprecision/mpfr.hpp +3644 -0
  200. mqt/core/include/mqt-core/boost/multiprecision/number.hpp +2500 -0
  201. mqt/core/include/mqt-core/boost/multiprecision/random.hpp +23 -0
  202. mqt/core/include/mqt-core/boost/multiprecision/rational_adaptor.hpp +1289 -0
  203. mqt/core/include/mqt-core/boost/multiprecision/tommath.hpp +1034 -0
  204. mqt/core/include/mqt-core/boost/multiprecision/traits/explicit_conversion.hpp +67 -0
  205. mqt/core/include/mqt-core/boost/multiprecision/traits/extract_exponent_type.hpp +28 -0
  206. mqt/core/include/mqt-core/boost/multiprecision/traits/is_backend.hpp +91 -0
  207. mqt/core/include/mqt-core/boost/multiprecision/traits/is_byte_container.hpp +51 -0
  208. mqt/core/include/mqt-core/boost/multiprecision/traits/is_complex.hpp +22 -0
  209. mqt/core/include/mqt-core/boost/multiprecision/traits/is_convertible_arithmetic.hpp +51 -0
  210. mqt/core/include/mqt-core/boost/multiprecision/traits/is_restricted_conversion.hpp +47 -0
  211. mqt/core/include/mqt-core/boost/multiprecision/traits/is_variable_precision.hpp +25 -0
  212. mqt/core/include/mqt-core/boost/multiprecision/traits/max_digits10.hpp +79 -0
  213. mqt/core/include/mqt-core/boost/multiprecision/traits/std_integer_traits.hpp +90 -0
  214. mqt/core/include/mqt-core/boost/multiprecision/traits/transcendental_reduction_type.hpp +21 -0
  215. mqt/core/include/mqt-core/boost/version.hpp +32 -0
  216. mqt/core/include/mqt-core/circuit_optimizer/CircuitOptimizer.hpp +119 -0
  217. mqt/core/include/mqt-core/circuit_optimizer/mqt_core_circuit_optimizer_export.h +43 -0
  218. mqt/core/include/mqt-core/datastructures/DirectedAcyclicGraph.hpp +117 -0
  219. mqt/core/include/mqt-core/datastructures/DirectedGraph.hpp +158 -0
  220. mqt/core/include/mqt-core/datastructures/DisjointSet.hpp +50 -0
  221. mqt/core/include/mqt-core/datastructures/Layer.hpp +172 -0
  222. mqt/core/include/mqt-core/datastructures/SymmetricMatrix.hpp +57 -0
  223. mqt/core/include/mqt-core/datastructures/UndirectedGraph.hpp +227 -0
  224. mqt/core/include/mqt-core/datastructures/mqt_core_ds_export.h +43 -0
  225. mqt/core/include/mqt-core/dd/Approximation.hpp +45 -0
  226. mqt/core/include/mqt-core/dd/CachedEdge.hpp +174 -0
  227. mqt/core/include/mqt-core/dd/Complex.hpp +165 -0
  228. mqt/core/include/mqt-core/dd/ComplexNumbers.hpp +150 -0
  229. mqt/core/include/mqt-core/dd/ComplexValue.hpp +184 -0
  230. mqt/core/include/mqt-core/dd/ComputeTable.hpp +183 -0
  231. mqt/core/include/mqt-core/dd/DDDefinitions.hpp +139 -0
  232. mqt/core/include/mqt-core/dd/DDpackageConfig.hpp +104 -0
  233. mqt/core/include/mqt-core/dd/DensityNoiseTable.hpp +114 -0
  234. mqt/core/include/mqt-core/dd/Edge.hpp +416 -0
  235. mqt/core/include/mqt-core/dd/Export.hpp +438 -0
  236. mqt/core/include/mqt-core/dd/FunctionalityConstruction.hpp +75 -0
  237. mqt/core/include/mqt-core/dd/GateMatrixDefinitions.hpp +43 -0
  238. mqt/core/include/mqt-core/dd/LinkedListBase.hpp +45 -0
  239. mqt/core/include/mqt-core/dd/MemoryManager.hpp +193 -0
  240. mqt/core/include/mqt-core/dd/Node.hpp +223 -0
  241. mqt/core/include/mqt-core/dd/NoiseFunctionality.hpp +144 -0
  242. mqt/core/include/mqt-core/dd/Operations.hpp +306 -0
  243. mqt/core/include/mqt-core/dd/Package.hpp +2036 -0
  244. mqt/core/include/mqt-core/dd/Package_fwd.hpp +22 -0
  245. mqt/core/include/mqt-core/dd/RealNumber.hpp +255 -0
  246. mqt/core/include/mqt-core/dd/RealNumberUniqueTable.hpp +217 -0
  247. mqt/core/include/mqt-core/dd/Simulation.hpp +98 -0
  248. mqt/core/include/mqt-core/dd/StateGeneration.hpp +143 -0
  249. mqt/core/include/mqt-core/dd/StochasticNoiseOperationTable.hpp +88 -0
  250. mqt/core/include/mqt-core/dd/UnaryComputeTable.hpp +121 -0
  251. mqt/core/include/mqt-core/dd/UniqueTable.hpp +243 -0
  252. mqt/core/include/mqt-core/dd/mqt_core_dd_export.h +43 -0
  253. mqt/core/include/mqt-core/dd/statistics/MemoryManagerStatistics.hpp +84 -0
  254. mqt/core/include/mqt-core/dd/statistics/PackageStatistics.hpp +55 -0
  255. mqt/core/include/mqt-core/dd/statistics/Statistics.hpp +48 -0
  256. mqt/core/include/mqt-core/dd/statistics/TableStatistics.hpp +79 -0
  257. mqt/core/include/mqt-core/dd/statistics/UniqueTableStatistics.hpp +31 -0
  258. mqt/core/include/mqt-core/fomac/FoMaC.hpp +568 -0
  259. mqt/core/include/mqt-core/ir/Definitions.hpp +108 -0
  260. mqt/core/include/mqt-core/ir/Permutation.hpp +213 -0
  261. mqt/core/include/mqt-core/ir/QuantumComputation.hpp +596 -0
  262. mqt/core/include/mqt-core/ir/Register.hpp +125 -0
  263. mqt/core/include/mqt-core/ir/mqt_core_ir_export.h +43 -0
  264. mqt/core/include/mqt-core/ir/operations/AodOperation.hpp +92 -0
  265. mqt/core/include/mqt-core/ir/operations/CompoundOperation.hpp +212 -0
  266. mqt/core/include/mqt-core/ir/operations/Control.hpp +142 -0
  267. mqt/core/include/mqt-core/ir/operations/Expression.hpp +847 -0
  268. mqt/core/include/mqt-core/ir/operations/IfElseOperation.hpp +169 -0
  269. mqt/core/include/mqt-core/ir/operations/NonUnitaryOperation.hpp +118 -0
  270. mqt/core/include/mqt-core/ir/operations/OpType.hpp +120 -0
  271. mqt/core/include/mqt-core/ir/operations/OpType.inc +76 -0
  272. mqt/core/include/mqt-core/ir/operations/Operation.hpp +247 -0
  273. mqt/core/include/mqt-core/ir/operations/StandardOperation.hpp +140 -0
  274. mqt/core/include/mqt-core/ir/operations/SymbolicOperation.hpp +144 -0
  275. mqt/core/include/mqt-core/mqt_na_qdmi/device.h +602 -0
  276. mqt/core/include/mqt-core/mqt_na_qdmi/types.h +78 -0
  277. mqt/core/include/mqt-core/na/NAComputation.hpp +185 -0
  278. mqt/core/include/mqt-core/na/device/Device.hpp +410 -0
  279. mqt/core/include/mqt-core/na/device/DeviceMemberInitializers.hpp +724 -0
  280. mqt/core/include/mqt-core/na/device/Generator.hpp +447 -0
  281. mqt/core/include/mqt-core/na/entities/Atom.hpp +62 -0
  282. mqt/core/include/mqt-core/na/entities/Location.hpp +154 -0
  283. mqt/core/include/mqt-core/na/entities/Zone.hpp +95 -0
  284. mqt/core/include/mqt-core/na/fomac/Device.hpp +169 -0
  285. mqt/core/include/mqt-core/na/mqt_core_na_export.h +43 -0
  286. mqt/core/include/mqt-core/na/operations/GlobalCZOp.hpp +38 -0
  287. mqt/core/include/mqt-core/na/operations/GlobalOp.hpp +58 -0
  288. mqt/core/include/mqt-core/na/operations/GlobalRYOp.hpp +42 -0
  289. mqt/core/include/mqt-core/na/operations/LoadOp.hpp +89 -0
  290. mqt/core/include/mqt-core/na/operations/LocalOp.hpp +56 -0
  291. mqt/core/include/mqt-core/na/operations/LocalRZOp.hpp +42 -0
  292. mqt/core/include/mqt-core/na/operations/LocalUOp.hpp +49 -0
  293. mqt/core/include/mqt-core/na/operations/MoveOp.hpp +66 -0
  294. mqt/core/include/mqt-core/na/operations/Op.hpp +62 -0
  295. mqt/core/include/mqt-core/na/operations/ShuttlingOp.hpp +51 -0
  296. mqt/core/include/mqt-core/na/operations/StoreOp.hpp +87 -0
  297. mqt/core/include/mqt-core/qasm3/Exception.hpp +85 -0
  298. mqt/core/include/mqt-core/qasm3/Gate.hpp +65 -0
  299. mqt/core/include/mqt-core/qasm3/Importer.hpp +192 -0
  300. mqt/core/include/mqt-core/qasm3/InstVisitor.hpp +145 -0
  301. mqt/core/include/mqt-core/qasm3/NestedEnvironment.hpp +41 -0
  302. mqt/core/include/mqt-core/qasm3/Parser.hpp +170 -0
  303. mqt/core/include/mqt-core/qasm3/Scanner.hpp +73 -0
  304. mqt/core/include/mqt-core/qasm3/Statement.hpp +486 -0
  305. mqt/core/include/mqt-core/qasm3/Statement_fwd.hpp +39 -0
  306. mqt/core/include/mqt-core/qasm3/StdGates.hpp +232 -0
  307. mqt/core/include/mqt-core/qasm3/Token.hpp +198 -0
  308. mqt/core/include/mqt-core/qasm3/Types.hpp +238 -0
  309. mqt/core/include/mqt-core/qasm3/Types_fwd.hpp +22 -0
  310. mqt/core/include/mqt-core/qasm3/mqt_core_qasm_export.h +43 -0
  311. mqt/core/include/mqt-core/qasm3/passes/CompilerPass.hpp +22 -0
  312. mqt/core/include/mqt-core/qasm3/passes/ConstEvalPass.hpp +102 -0
  313. mqt/core/include/mqt-core/qasm3/passes/TypeCheckPass.hpp +124 -0
  314. mqt/core/include/mqt-core/qdmi/Driver.hpp +431 -0
  315. mqt/core/include/mqt-core/zx/FunctionalityConstruction.hpp +125 -0
  316. mqt/core/include/mqt-core/zx/Rational.hpp +318 -0
  317. mqt/core/include/mqt-core/zx/Rules.hpp +132 -0
  318. mqt/core/include/mqt-core/zx/Simplify.hpp +182 -0
  319. mqt/core/include/mqt-core/zx/Utils.hpp +212 -0
  320. mqt/core/include/mqt-core/zx/ZXDefinitions.hpp +93 -0
  321. mqt/core/include/mqt-core/zx/ZXDiagram.hpp +480 -0
  322. mqt/core/include/mqt-core/zx/mqt_core_zx_export.h +43 -0
  323. mqt/core/include/nlohmann/adl_serializer.hpp +55 -0
  324. mqt/core/include/nlohmann/byte_container_with_subtype.hpp +103 -0
  325. mqt/core/include/nlohmann/detail/abi_macros.hpp +111 -0
  326. mqt/core/include/nlohmann/detail/conversions/from_json.hpp +577 -0
  327. mqt/core/include/nlohmann/detail/conversions/to_chars.hpp +1118 -0
  328. mqt/core/include/nlohmann/detail/conversions/to_json.hpp +479 -0
  329. mqt/core/include/nlohmann/detail/exceptions.hpp +291 -0
  330. mqt/core/include/nlohmann/detail/hash.hpp +129 -0
  331. mqt/core/include/nlohmann/detail/input/binary_reader.hpp +3068 -0
  332. mqt/core/include/nlohmann/detail/input/input_adapters.hpp +549 -0
  333. mqt/core/include/nlohmann/detail/input/json_sax.hpp +986 -0
  334. mqt/core/include/nlohmann/detail/input/lexer.hpp +1643 -0
  335. mqt/core/include/nlohmann/detail/input/parser.hpp +519 -0
  336. mqt/core/include/nlohmann/detail/input/position_t.hpp +37 -0
  337. mqt/core/include/nlohmann/detail/iterators/internal_iterator.hpp +35 -0
  338. mqt/core/include/nlohmann/detail/iterators/iter_impl.hpp +760 -0
  339. mqt/core/include/nlohmann/detail/iterators/iteration_proxy.hpp +235 -0
  340. mqt/core/include/nlohmann/detail/iterators/iterator_traits.hpp +61 -0
  341. mqt/core/include/nlohmann/detail/iterators/json_reverse_iterator.hpp +130 -0
  342. mqt/core/include/nlohmann/detail/iterators/primitive_iterator.hpp +132 -0
  343. mqt/core/include/nlohmann/detail/json_custom_base_class.hpp +39 -0
  344. mqt/core/include/nlohmann/detail/json_pointer.hpp +988 -0
  345. mqt/core/include/nlohmann/detail/json_ref.hpp +78 -0
  346. mqt/core/include/nlohmann/detail/macro_scope.hpp +595 -0
  347. mqt/core/include/nlohmann/detail/macro_unscope.hpp +46 -0
  348. mqt/core/include/nlohmann/detail/meta/call_std/begin.hpp +17 -0
  349. mqt/core/include/nlohmann/detail/meta/call_std/end.hpp +17 -0
  350. mqt/core/include/nlohmann/detail/meta/cpp_future.hpp +171 -0
  351. mqt/core/include/nlohmann/detail/meta/detected.hpp +70 -0
  352. mqt/core/include/nlohmann/detail/meta/identity_tag.hpp +21 -0
  353. mqt/core/include/nlohmann/detail/meta/is_sax.hpp +159 -0
  354. mqt/core/include/nlohmann/detail/meta/std_fs.hpp +29 -0
  355. mqt/core/include/nlohmann/detail/meta/type_traits.hpp +795 -0
  356. mqt/core/include/nlohmann/detail/meta/void_t.hpp +24 -0
  357. mqt/core/include/nlohmann/detail/output/binary_writer.hpp +1850 -0
  358. mqt/core/include/nlohmann/detail/output/output_adapters.hpp +147 -0
  359. mqt/core/include/nlohmann/detail/output/serializer.hpp +988 -0
  360. mqt/core/include/nlohmann/detail/string_concat.hpp +146 -0
  361. mqt/core/include/nlohmann/detail/string_escape.hpp +72 -0
  362. mqt/core/include/nlohmann/detail/string_utils.hpp +37 -0
  363. mqt/core/include/nlohmann/detail/value_t.hpp +118 -0
  364. mqt/core/include/nlohmann/json.hpp +5306 -0
  365. mqt/core/include/nlohmann/json_fwd.hpp +75 -0
  366. mqt/core/include/nlohmann/ordered_map.hpp +359 -0
  367. mqt/core/include/nlohmann/thirdparty/hedley/hedley.hpp +2045 -0
  368. mqt/core/include/nlohmann/thirdparty/hedley/hedley_undef.hpp +158 -0
  369. mqt/core/include/qdmi/qdmi/client.h +990 -0
  370. mqt/core/include/qdmi/qdmi/constants.h +1139 -0
  371. mqt/core/include/qdmi/qdmi/device.h +602 -0
  372. mqt/core/include/qdmi/qdmi/types.h +78 -0
  373. mqt/core/include/spdlog/async.h +99 -0
  374. mqt/core/include/spdlog/async_logger-inl.h +84 -0
  375. mqt/core/include/spdlog/async_logger.h +74 -0
  376. mqt/core/include/spdlog/cfg/argv.h +40 -0
  377. mqt/core/include/spdlog/cfg/env.h +36 -0
  378. mqt/core/include/spdlog/cfg/helpers-inl.h +107 -0
  379. mqt/core/include/spdlog/cfg/helpers.h +29 -0
  380. mqt/core/include/spdlog/common-inl.h +68 -0
  381. mqt/core/include/spdlog/common.h +406 -0
  382. mqt/core/include/spdlog/details/backtracer-inl.h +63 -0
  383. mqt/core/include/spdlog/details/backtracer.h +45 -0
  384. mqt/core/include/spdlog/details/circular_q.h +115 -0
  385. mqt/core/include/spdlog/details/console_globals.h +28 -0
  386. mqt/core/include/spdlog/details/file_helper-inl.h +153 -0
  387. mqt/core/include/spdlog/details/file_helper.h +61 -0
  388. mqt/core/include/spdlog/details/fmt_helper.h +141 -0
  389. mqt/core/include/spdlog/details/log_msg-inl.h +44 -0
  390. mqt/core/include/spdlog/details/log_msg.h +40 -0
  391. mqt/core/include/spdlog/details/log_msg_buffer-inl.h +54 -0
  392. mqt/core/include/spdlog/details/log_msg_buffer.h +32 -0
  393. mqt/core/include/spdlog/details/mpmc_blocking_q.h +177 -0
  394. mqt/core/include/spdlog/details/null_mutex.h +35 -0
  395. mqt/core/include/spdlog/details/os-inl.h +606 -0
  396. mqt/core/include/spdlog/details/os.h +127 -0
  397. mqt/core/include/spdlog/details/periodic_worker-inl.h +26 -0
  398. mqt/core/include/spdlog/details/periodic_worker.h +58 -0
  399. mqt/core/include/spdlog/details/registry-inl.h +270 -0
  400. mqt/core/include/spdlog/details/registry.h +131 -0
  401. mqt/core/include/spdlog/details/synchronous_factory.h +22 -0
  402. mqt/core/include/spdlog/details/tcp_client-windows.h +135 -0
  403. mqt/core/include/spdlog/details/tcp_client.h +127 -0
  404. mqt/core/include/spdlog/details/thread_pool-inl.h +126 -0
  405. mqt/core/include/spdlog/details/thread_pool.h +117 -0
  406. mqt/core/include/spdlog/details/udp_client-windows.h +98 -0
  407. mqt/core/include/spdlog/details/udp_client.h +81 -0
  408. mqt/core/include/spdlog/details/windows_include.h +11 -0
  409. mqt/core/include/spdlog/fmt/bin_to_hex.h +224 -0
  410. mqt/core/include/spdlog/fmt/bundled/args.h +220 -0
  411. mqt/core/include/spdlog/fmt/bundled/base.h +2989 -0
  412. mqt/core/include/spdlog/fmt/bundled/chrono.h +2330 -0
  413. mqt/core/include/spdlog/fmt/bundled/color.h +637 -0
  414. mqt/core/include/spdlog/fmt/bundled/compile.h +539 -0
  415. mqt/core/include/spdlog/fmt/bundled/core.h +5 -0
  416. mqt/core/include/spdlog/fmt/bundled/fmt.license.rst +27 -0
  417. mqt/core/include/spdlog/fmt/bundled/format-inl.h +1948 -0
  418. mqt/core/include/spdlog/fmt/bundled/format.h +4244 -0
  419. mqt/core/include/spdlog/fmt/bundled/os.h +427 -0
  420. mqt/core/include/spdlog/fmt/bundled/ostream.h +167 -0
  421. mqt/core/include/spdlog/fmt/bundled/printf.h +633 -0
  422. mqt/core/include/spdlog/fmt/bundled/ranges.h +850 -0
  423. mqt/core/include/spdlog/fmt/bundled/std.h +728 -0
  424. mqt/core/include/spdlog/fmt/bundled/xchar.h +369 -0
  425. mqt/core/include/spdlog/fmt/chrono.h +23 -0
  426. mqt/core/include/spdlog/fmt/compile.h +23 -0
  427. mqt/core/include/spdlog/fmt/fmt.h +30 -0
  428. mqt/core/include/spdlog/fmt/ostr.h +23 -0
  429. mqt/core/include/spdlog/fmt/ranges.h +23 -0
  430. mqt/core/include/spdlog/fmt/std.h +24 -0
  431. mqt/core/include/spdlog/fmt/xchar.h +23 -0
  432. mqt/core/include/spdlog/formatter.h +17 -0
  433. mqt/core/include/spdlog/fwd.h +18 -0
  434. mqt/core/include/spdlog/logger-inl.h +198 -0
  435. mqt/core/include/spdlog/logger.h +379 -0
  436. mqt/core/include/spdlog/mdc.h +52 -0
  437. mqt/core/include/spdlog/pattern_formatter-inl.h +1340 -0
  438. mqt/core/include/spdlog/pattern_formatter.h +118 -0
  439. mqt/core/include/spdlog/sinks/android_sink.h +137 -0
  440. mqt/core/include/spdlog/sinks/ansicolor_sink-inl.h +142 -0
  441. mqt/core/include/spdlog/sinks/ansicolor_sink.h +116 -0
  442. mqt/core/include/spdlog/sinks/base_sink-inl.h +59 -0
  443. mqt/core/include/spdlog/sinks/base_sink.h +51 -0
  444. mqt/core/include/spdlog/sinks/basic_file_sink-inl.h +48 -0
  445. mqt/core/include/spdlog/sinks/basic_file_sink.h +66 -0
  446. mqt/core/include/spdlog/sinks/callback_sink.h +56 -0
  447. mqt/core/include/spdlog/sinks/daily_file_sink.h +254 -0
  448. mqt/core/include/spdlog/sinks/dist_sink.h +81 -0
  449. mqt/core/include/spdlog/sinks/dup_filter_sink.h +91 -0
  450. mqt/core/include/spdlog/sinks/hourly_file_sink.h +193 -0
  451. mqt/core/include/spdlog/sinks/kafka_sink.h +119 -0
  452. mqt/core/include/spdlog/sinks/mongo_sink.h +108 -0
  453. mqt/core/include/spdlog/sinks/msvc_sink.h +68 -0
  454. mqt/core/include/spdlog/sinks/null_sink.h +41 -0
  455. mqt/core/include/spdlog/sinks/ostream_sink.h +43 -0
  456. mqt/core/include/spdlog/sinks/qt_sinks.h +304 -0
  457. mqt/core/include/spdlog/sinks/ringbuffer_sink.h +67 -0
  458. mqt/core/include/spdlog/sinks/rotating_file_sink-inl.h +179 -0
  459. mqt/core/include/spdlog/sinks/rotating_file_sink.h +93 -0
  460. mqt/core/include/spdlog/sinks/sink-inl.h +22 -0
  461. mqt/core/include/spdlog/sinks/sink.h +34 -0
  462. mqt/core/include/spdlog/sinks/stdout_color_sinks-inl.h +38 -0
  463. mqt/core/include/spdlog/sinks/stdout_color_sinks.h +49 -0
  464. mqt/core/include/spdlog/sinks/stdout_sinks-inl.h +127 -0
  465. mqt/core/include/spdlog/sinks/stdout_sinks.h +84 -0
  466. mqt/core/include/spdlog/sinks/syslog_sink.h +104 -0
  467. mqt/core/include/spdlog/sinks/systemd_sink.h +121 -0
  468. mqt/core/include/spdlog/sinks/tcp_sink.h +75 -0
  469. mqt/core/include/spdlog/sinks/udp_sink.h +69 -0
  470. mqt/core/include/spdlog/sinks/win_eventlog_sink.h +260 -0
  471. mqt/core/include/spdlog/sinks/wincolor_sink-inl.h +172 -0
  472. mqt/core/include/spdlog/sinks/wincolor_sink.h +82 -0
  473. mqt/core/include/spdlog/spdlog-inl.h +96 -0
  474. mqt/core/include/spdlog/spdlog.h +357 -0
  475. mqt/core/include/spdlog/stopwatch.h +66 -0
  476. mqt/core/include/spdlog/tweakme.h +148 -0
  477. mqt/core/include/spdlog/version.h +11 -0
  478. mqt/core/ir/__init__.pyi +2078 -0
  479. mqt/core/ir/operations.pyi +1011 -0
  480. mqt/core/ir/registers.pyi +91 -0
  481. mqt/core/ir/symbolic.pyi +177 -0
  482. mqt/core/ir.cp312-win_amd64.pyd +0 -0
  483. mqt/core/lib/mqt-core-algorithms.lib +0 -0
  484. mqt/core/lib/mqt-core-circuit-optimizer.lib +0 -0
  485. mqt/core/lib/mqt-core-dd.lib +0 -0
  486. mqt/core/lib/mqt-core-ds.lib +0 -0
  487. mqt/core/lib/mqt-core-fomac.lib +0 -0
  488. mqt/core/lib/mqt-core-ir.lib +0 -0
  489. mqt/core/lib/mqt-core-na-fomac.lib +0 -0
  490. mqt/core/lib/mqt-core-na.lib +0 -0
  491. mqt/core/lib/mqt-core-qasm.lib +0 -0
  492. mqt/core/lib/mqt-core-qdmi-driver.lib +0 -0
  493. mqt/core/lib/mqt-core-qdmi-na-device-gen.lib +0 -0
  494. mqt/core/lib/mqt-core-qdmi-na-device.lib +0 -0
  495. mqt/core/lib/mqt-core-zx.lib +0 -0
  496. mqt/core/lib/pkgconfig/spdlog.pc +13 -0
  497. mqt/core/lib/spdlog.lib +0 -0
  498. mqt/core/na/__init__.py +12 -0
  499. mqt/core/na/fomac.cp312-win_amd64.pyd +0 -0
  500. mqt/core/na/fomac.pyi +117 -0
  501. mqt/core/nlohmann_json.natvis +278 -0
  502. mqt/core/plugins/__init__.py +9 -0
  503. mqt/core/plugins/qiskit/__init__.py +19 -0
  504. mqt/core/plugins/qiskit/mqt_to_qiskit.py +420 -0
  505. mqt/core/plugins/qiskit/qiskit_to_mqt.py +562 -0
  506. mqt/core/py.typed +2 -0
  507. mqt/core/share/cmake/mqt-core/AddMQTPythonBinding.cmake +55 -0
  508. mqt/core/share/cmake/mqt-core/Cache.cmake +33 -0
  509. mqt/core/share/cmake/mqt-core/FindGMP.cmake +103 -0
  510. mqt/core/share/cmake/mqt-core/PackageAddTest.cmake +46 -0
  511. mqt/core/share/cmake/mqt-core/PreventInSourceBuilds.cmake +25 -0
  512. mqt/core/share/cmake/mqt-core/StandardProjectSettings.cmake +87 -0
  513. mqt/core/share/cmake/mqt-core/mqt-core-config-version.cmake +85 -0
  514. mqt/core/share/cmake/mqt-core/mqt-core-config.cmake +52 -0
  515. mqt/core/share/cmake/mqt-core/mqt-core-targets-release.cmake +141 -0
  516. mqt/core/share/cmake/mqt-core/mqt-core-targets.cmake +445 -0
  517. mqt/core/share/cmake/nlohmann_json/nlohmann_jsonConfig.cmake +15 -0
  518. mqt/core/share/cmake/nlohmann_json/nlohmann_jsonConfigVersion.cmake +20 -0
  519. mqt/core/share/cmake/nlohmann_json/nlohmann_jsonTargets.cmake +110 -0
  520. mqt/core/share/cmake/qdmi/Cache.cmake +44 -0
  521. mqt/core/share/cmake/qdmi/PrefixHandling.cmake +78 -0
  522. mqt/core/share/cmake/qdmi/prefix_defs.txt +26 -0
  523. mqt/core/share/cmake/qdmi/qdmi-config-version.cmake +85 -0
  524. mqt/core/share/cmake/qdmi/qdmi-config.cmake +42 -0
  525. mqt/core/share/cmake/qdmi/qdmi-targets.cmake +129 -0
  526. mqt/core/share/cmake/spdlog/spdlogConfig.cmake +44 -0
  527. mqt/core/share/cmake/spdlog/spdlogConfigTargets-release.cmake +19 -0
  528. mqt/core/share/cmake/spdlog/spdlogConfigTargets.cmake +121 -0
  529. mqt/core/share/cmake/spdlog/spdlogConfigVersion.cmake +65 -0
  530. mqt/core/share/pkgconfig/nlohmann_json.pc +7 -0
  531. mqt_core-3.3.2.dist-info/DELVEWHEEL +2 -0
  532. mqt_core-3.3.2.dist-info/METADATA +210 -0
  533. mqt_core-3.3.2.dist-info/RECORD +537 -0
  534. mqt_core-3.3.2.dist-info/WHEEL +5 -0
  535. mqt_core-3.3.2.dist-info/entry_points.txt +4 -0
  536. mqt_core-3.3.2.dist-info/licenses/LICENSE.md +22 -0
  537. mqt_core.libs/msvcp140.dll +0 -0
@@ -0,0 +1,447 @@
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 <array>
15
+ #include <cstddef>
16
+ #include <cstdint>
17
+ #include <functional>
18
+ #include <istream>
19
+ // NOLINTNEXTLINE(misc-include-cleaner)
20
+ #include <nlohmann/json.hpp>
21
+ #include <ostream>
22
+ #include <sstream>
23
+ #include <stdexcept>
24
+ #include <string>
25
+ #include <vector>
26
+
27
+ namespace na {
28
+ /**
29
+ * @brief Represents a neutral atom device configuration.
30
+ * @details This struct defines the schema for the JSON representation of a
31
+ * neutral atom device configuration. This struct, including all its
32
+ * sub-structs, implements functions to serialize and deserialize to and from
33
+ * JSON using the nlohmann::json library.
34
+ * @note All duration and length values are in multiples of the time unit and
35
+ * the length unit, respectively.
36
+ */
37
+ struct Device {
38
+ /// @brief The name of the device.
39
+ std::string name;
40
+ /// @brief The number of qubits in the device.
41
+ uint64_t numQubits = 0;
42
+
43
+ /// @brief Represents a 2D-vector.
44
+ struct Vector {
45
+ /// @brief The x-coordinate of the vector.
46
+ int64_t x = 0;
47
+ /// @brief The y-coordinate of the vector.
48
+ int64_t y = 0;
49
+
50
+ // NOLINTNEXTLINE(misc-include-cleaner)
51
+ NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(Vector, x, y)
52
+
53
+ auto operator<=>(const Vector&) const = default;
54
+ };
55
+ /// @brief Represents a region in the device.
56
+ struct Region {
57
+ /// @brief The origin of the region.
58
+ Vector origin;
59
+
60
+ /// @brief The size of the region.
61
+ struct Size {
62
+ /// @brief The width of the region.
63
+ uint64_t width = 0;
64
+ /// @brief The height of the region.
65
+ uint64_t height = 0;
66
+
67
+ // NOLINTNEXTLINE(misc-include-cleaner)
68
+ NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(Size, width, height)
69
+
70
+ auto operator<=>(const Size&) const = default;
71
+ };
72
+ /// @brief The size of the region.
73
+ Size size;
74
+
75
+ // NOLINTNEXTLINE(misc-include-cleaner)
76
+ NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(Region, origin, size)
77
+
78
+ auto operator<=>(const Region&) const = default;
79
+ };
80
+ /// @brief Represents a lattice of traps in the device.
81
+ struct Lattice {
82
+ /// @brief The origin of the lattice.
83
+ Vector latticeOrigin;
84
+ /**
85
+ * @brief The first lattice vector.
86
+ * @details Multiples of this vector are added to the lattice origin to
87
+ * create the lattice structure.
88
+ */
89
+ Vector latticeVector1;
90
+ /**
91
+ * @brief The second lattice vector.
92
+ * @details Multiples of this vector are added to the lattice origin and
93
+ * multiples of the first lattice vector to create the lattice structure.
94
+ */
95
+ Vector latticeVector2;
96
+ /**
97
+ * @brief The offsets for each sublattice.
98
+ * @details The actual locations of traps are calculated by adding the
99
+ * each offset to the points in the lattice defined by the lattice
100
+ * vectors, i.e., for each sublattice offset `offset` and indices `i` and
101
+ * `j`, the trap location is `latticeOrigin + i * latticeVector1 + j *
102
+ * latticeVector2 + offset`.
103
+ */
104
+ std::vector<Vector> sublatticeOffsets;
105
+ /**
106
+ * @brief The extent of the lattice.
107
+ * @details The extent defines the boundary of the lattice in which traps
108
+ * are placed. Only traps of the lattice that are within this extent
109
+ * are considered valid.
110
+ */
111
+ Region extent;
112
+
113
+ // NOLINTNEXTLINE(misc-include-cleaner)
114
+ NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(Lattice, latticeOrigin,
115
+ latticeVector1, latticeVector2,
116
+ sublatticeOffsets, extent)
117
+
118
+ auto operator<=>(const Lattice&) const = default;
119
+ };
120
+ /// @brief The list of lattices (trap areas) in the device.
121
+ std::vector<Lattice> traps;
122
+ /**
123
+ * @brief The minimum distance between atoms in the device that must be
124
+ * respected.
125
+ */
126
+ uint64_t minAtomDistance = 0;
127
+
128
+ private:
129
+ struct Operation {
130
+ /// @brief The name of the operation.
131
+ std::string name;
132
+ /// @brief The region in which the operation can be performed.
133
+ Region region;
134
+ /// @brief The duration of the operation.
135
+ uint64_t duration = 0;
136
+ /// @brief The fidelity of the operation.
137
+ double fidelity = 0.0;
138
+ /// @brief The number of parameters the operation takes.
139
+ uint64_t numParameters = 0;
140
+
141
+ // NOLINTNEXTLINE(misc-include-cleaner)
142
+ NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(Operation, name, region,
143
+ duration, fidelity,
144
+ numParameters)
145
+ };
146
+
147
+ public:
148
+ /// @brief Represents a global single-qubit operation.
149
+ struct GlobalSingleQubitOperation : Operation {};
150
+ /// @brief The list of global single-qubit operations supported by the device.
151
+ std::vector<GlobalSingleQubitOperation> globalSingleQubitOperations;
152
+
153
+ /// @brief Represents a global multi-qubit operation.
154
+ struct GlobalMultiQubitOperation : Operation {
155
+ /**
156
+ * @brief The interaction radius of the operation within which two qubits
157
+ * can interact.
158
+ */
159
+ uint64_t interactionRadius = 0;
160
+ /**
161
+ * @brief The blocking radius of the operation within which no other
162
+ * operation can be performed to avoid interference.
163
+ */
164
+ uint64_t blockingRadius = 0;
165
+ /// @brief The fidelity of the operation when no qubits are interacting.
166
+ double idlingFidelity = 0.0;
167
+ /// @brief The number of qubits involved in the operation.
168
+ uint64_t numQubits = 0;
169
+
170
+ // NOLINTNEXTLINE(misc-include-cleaner)
171
+ NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_WITH_DEFAULT(
172
+ GlobalMultiQubitOperation, Operation, interactionRadius, blockingRadius,
173
+ idlingFidelity, numQubits)
174
+ };
175
+ /// @brief The list of global multi-qubit operations supported by the device.
176
+ std::vector<GlobalMultiQubitOperation> globalMultiQubitOperations;
177
+
178
+ /// @brief Represents a local single-qubit operation.
179
+ struct LocalSingleQubitOperation : Operation {};
180
+ /// @brief The list of local single-qubit operations supported by the device.
181
+ std::vector<LocalSingleQubitOperation> localSingleQubitOperations;
182
+
183
+ /// @brief Represents a local multi-qubit operation.
184
+ struct LocalMultiQubitOperation : Operation {
185
+ /**
186
+ * @brief The interaction radius of the operation within which two qubits
187
+ * can interact.
188
+ */
189
+ uint64_t interactionRadius = 0.0;
190
+ /**
191
+ * @brief The blocking radius of the operation within which no other
192
+ * operation can be performed to avoid interference.
193
+ */
194
+ uint64_t blockingRadius = 0.0;
195
+ /// @brief The number of qubits involved in the operation.
196
+ uint64_t numQubits = 0;
197
+
198
+ // NOLINTNEXTLINE(misc-include-cleaner)
199
+ NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_WITH_DEFAULT(
200
+ LocalMultiQubitOperation, Operation, interactionRadius, blockingRadius,
201
+ numQubits)
202
+ };
203
+ /// @brief The list of local multi-qubit operations supported by the device.
204
+ std::vector<LocalMultiQubitOperation> localMultiQubitOperations;
205
+
206
+ /// @brief Represents a shuttling unit in the device.
207
+ struct ShuttlingUnit {
208
+ size_t id = 0; ///< @brief Unique identifier for the shuttling unit.
209
+ /// @brief The region in which the shuttling unit operates.
210
+ Region region;
211
+ /// @brief The duration of the load operation in the shuttling unit.
212
+ uint64_t loadDuration = 0;
213
+ /// @brief The duration of the store operation in the shuttling unit.
214
+ uint64_t storeDuration = 0;
215
+ /// @brief The fidelity of the load operation in the shuttling unit.
216
+ double loadFidelity = 0.0;
217
+ /// @brief The fidelity of the store operation in the shuttling unit.
218
+ double storeFidelity = 0.0;
219
+ /// @brief The number of parameters the shuttling unit takes.
220
+ uint64_t numParameters = 0;
221
+ /**
222
+ * @brief The mean shuttling speed.
223
+ * @note Only for shuttling operations.
224
+ */
225
+ uint64_t meanShuttlingSpeed = 0;
226
+
227
+ // NOLINTNEXTLINE(misc-include-cleaner)
228
+ NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(ShuttlingUnit, region,
229
+ loadDuration, storeDuration,
230
+ loadFidelity, storeFidelity,
231
+ numParameters,
232
+ meanShuttlingSpeed)
233
+ };
234
+ /// @brief The list of shuttling units supported by the device.
235
+ std::vector<ShuttlingUnit> shuttlingUnits;
236
+
237
+ /// @brief Represents the decoherence times of the device.
238
+ struct DecoherenceTimes {
239
+ /// @brief The T1 time.
240
+ uint64_t t1 = 0;
241
+ /// @brief The T2 time.
242
+ uint64_t t2 = 0;
243
+
244
+ // NOLINTNEXTLINE(misc-include-cleaner)
245
+ NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(DecoherenceTimes, t1, t2)
246
+ };
247
+ /// @brief The decoherence times of the device.
248
+ DecoherenceTimes decoherenceTimes;
249
+
250
+ /// @brief Represents a unit of measurement for length and time.
251
+ struct Unit {
252
+ /// @brief The unit of measurement (e.g., "µm" for micrometers, "ns" for
253
+ /// nanoseconds).
254
+ std::string unit;
255
+ /// @brief The factor of the unit.
256
+ double scaleFactor = 0;
257
+
258
+ // NOLINTNEXTLINE(misc-include-cleaner)
259
+ NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(Unit, scaleFactor, unit)
260
+ };
261
+
262
+ /// @brief The unit of measurement for lengths in the device.
263
+ Unit lengthUnit = {.unit = "um", ///< Default is micrometers (um).
264
+ .scaleFactor = 1.0};
265
+
266
+ /// @brief The unit of measurement for time in the device.
267
+ Unit durationUnit = {.unit = "us", ///< Default is microseconds (us).
268
+ .scaleFactor = 1.0};
269
+
270
+ // Before we used the macro NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT here,
271
+ // too. Now, we added an id to shuttling units that must be initialized
272
+ // in a custom routine, so we can only use the serialize macro. Additionally,
273
+ // we check here whether the units are valid SI units.
274
+ // NOLINTNEXTLINE(misc-include-cleaner)
275
+ NLOHMANN_DEFINE_TYPE_INTRUSIVE_ONLY_SERIALIZE(
276
+ Device, name, numQubits, traps, minAtomDistance,
277
+ globalSingleQubitOperations, globalMultiQubitOperations,
278
+ localSingleQubitOperations, localMultiQubitOperations, shuttlingUnits,
279
+ decoherenceTimes, lengthUnit, durationUnit)
280
+
281
+ // the name of the following function is given by the nlohmann::json library
282
+ // and must not be changed
283
+ template <typename BasicJsonType>
284
+ // NOLINTNEXTLINE(readability-identifier-naming)
285
+ friend auto from_json(const BasicJsonType& json, Device& device) -> void {
286
+ const Device defaultDevice{};
287
+ device.name = !json.is_null() ? json.value("name", defaultDevice.name)
288
+ : defaultDevice.name;
289
+ device.numQubits = !json.is_null()
290
+ ? json.value("numQubits", defaultDevice.numQubits)
291
+ : defaultDevice.numQubits;
292
+ device.traps = !json.is_null() ? json.value("traps", defaultDevice.traps)
293
+ : defaultDevice.traps;
294
+ device.minAtomDistance =
295
+ !json.is_null()
296
+ ? json.value("minAtomDistance", defaultDevice.minAtomDistance)
297
+ : defaultDevice.minAtomDistance;
298
+ device.globalSingleQubitOperations =
299
+ !json.is_null() ? json.value("globalSingleQubitOperations",
300
+ defaultDevice.globalSingleQubitOperations)
301
+ : defaultDevice.globalSingleQubitOperations;
302
+ device.globalMultiQubitOperations =
303
+ !json.is_null() ? json.value("globalMultiQubitOperations",
304
+ defaultDevice.globalMultiQubitOperations)
305
+ : defaultDevice.globalMultiQubitOperations;
306
+ device.localSingleQubitOperations =
307
+ !json.is_null() ? json.value("localSingleQubitOperations",
308
+ defaultDevice.localSingleQubitOperations)
309
+ : defaultDevice.localSingleQubitOperations;
310
+ device.localMultiQubitOperations =
311
+ !json.is_null() ? json.value("localMultiQubitOperations",
312
+ defaultDevice.localMultiQubitOperations)
313
+ : defaultDevice.localMultiQubitOperations;
314
+ device.shuttlingUnits =
315
+ !json.is_null()
316
+ ? json.value("shuttlingUnits", defaultDevice.shuttlingUnits)
317
+ : defaultDevice.shuttlingUnits;
318
+ std::ranges::for_each(device.shuttlingUnits,
319
+ [i = 0UL](auto& unit) mutable { unit.id = i++; });
320
+ device.decoherenceTimes =
321
+ !json.is_null()
322
+ ? json.value("decoherenceTimes", defaultDevice.decoherenceTimes)
323
+ : defaultDevice.decoherenceTimes;
324
+ device.lengthUnit = !json.is_null()
325
+ ? json.value("lengthUnit", defaultDevice.lengthUnit)
326
+ : defaultDevice.lengthUnit;
327
+ constexpr std::array allowedLengthUnits = {"mm", "um", "nm"};
328
+ if (std::ranges::find(allowedLengthUnits, device.lengthUnit.unit) ==
329
+ allowedLengthUnits.end()) {
330
+ std::ostringstream ss;
331
+ ss << "Invalid length unit: " << device.lengthUnit.unit
332
+ << ". Supported units are: ";
333
+ std::ranges::for_each(allowedLengthUnits,
334
+ [&ss](const char* unit) { ss << unit << ", "; });
335
+ ss.seekp(-2, std::ostringstream::cur); // Remove the last comma and space
336
+ ss << ".";
337
+ throw std::runtime_error(ss.str());
338
+ }
339
+ device.durationUnit =
340
+ !json.is_null() ? json.value("durationUnit", defaultDevice.durationUnit)
341
+ : defaultDevice.durationUnit;
342
+ constexpr std::array allowedDurationUnits = {"ms", "us", "ns"};
343
+ if (std::ranges::find(allowedDurationUnits, device.durationUnit.unit) ==
344
+ allowedDurationUnits.end()) {
345
+ std::ostringstream ss;
346
+ ss << "Invalid duration unit: " << device.durationUnit.unit
347
+ << ". Supported units are: ";
348
+ std::ranges::for_each(allowedDurationUnits,
349
+ [&ss](const char* unit) { ss << unit << ", "; });
350
+ ss.seekp(-2, std::ostringstream::cur); // Remove the last comma and space
351
+ ss << ".";
352
+ throw std::runtime_error(ss.str());
353
+ }
354
+ }
355
+ };
356
+
357
+ /**
358
+ * @brief Writes a JSON schema with default values for the device configuration
359
+ * to the specified output stream.
360
+ * @param os is the output stream to write the JSON schema to.
361
+ * @throws std::runtime_error if the JSON conversion fails.
362
+ */
363
+ auto writeJSONSchema(std::ostream& os) -> void;
364
+
365
+ /**
366
+ * @brief Writes a JSON schema with default values for the device configuration
367
+ * to the specified path.
368
+ * @param path The path to write the JSON schema to.
369
+ * @throws std::runtime_error if the JSON conversion fails or the file cannot be
370
+ * opened.
371
+ */
372
+ auto writeJSONSchema(const std::string& path) -> void;
373
+
374
+ /**
375
+ * @brief Parses the device configuration from an input stream.
376
+ * @param is is the input stream containing the JSON representation of the
377
+ * device configuration.
378
+ * @returns The parsed device configuration as a Protobuf message.
379
+ * @throws std::runtime_error if the JSON cannot be parsed.
380
+ */
381
+ [[nodiscard]] auto readJSON(std::istream& is) -> Device;
382
+
383
+ /**
384
+ * @brief Parses the device configuration from a JSON file.
385
+ * @param path is the path to the JSON file containing the device configuration.
386
+ * @returns The parsed device configuration as a Protobuf message.
387
+ * @throws std::runtime_error if the JSON file does not exist, or the JSON file
388
+ * cannot be parsed.
389
+ */
390
+ [[nodiscard]] auto readJSON(const std::string& path) -> Device;
391
+
392
+ /**
393
+ * @brief Writes a header file with the device configuration to the specified
394
+ * output stream.
395
+ * @param device is the protobuf representation of the device.
396
+ * @param os is the output stream to write the header file to.
397
+ * @throws std::runtime_error if the file cannot be opened or written to.
398
+ * @note This implementation only supports multi-qubit gates up to two
399
+ * qubits.
400
+ */
401
+ auto writeHeader(const Device& device, std::ostream& os) -> void;
402
+
403
+ /**
404
+ * @brief Writes a header file with the device configuration to the specified
405
+ * path.
406
+ * @param device is the protobuf representation of the device.
407
+ * @param path is the path to write the header file to.
408
+ * @throws std::runtime_error if the file cannot be opened or written to.
409
+ * @note This implementation only supports multi-qubit gates up to two
410
+ * qubits.
411
+ */
412
+ auto writeHeader(const Device& device, const std::string& path) -> void;
413
+
414
+ /**
415
+ * @brief Information about a regular site in a lattice.
416
+ * @details This struct encapsulates all relevant information about a site
417
+ * for use in the forEachRegularSites callback.
418
+ */
419
+ struct SiteInfo {
420
+ /// @brief The unique identifier of the site.
421
+ uint64_t id;
422
+ /// @brief The x-coordinate of the site.
423
+ int64_t x;
424
+ /// @brief The y-coordinate of the site.
425
+ int64_t y;
426
+ /// @brief The identifier of the lattice (module) the site belongs to.
427
+ uint64_t moduleId;
428
+ /// @brief The identifier of the sublattice (submodule) the site belongs to.
429
+ uint64_t subModuleId;
430
+ };
431
+
432
+ /**
433
+ * @brief Iterates over all regular sites created by the given lattices and
434
+ * calls the given function for each site.
435
+ * @param lattices is the list of lattices to iterate over.
436
+ * @param f is the function to call for each regular site, receiving a SiteInfo
437
+ * struct containing all site information.
438
+ * @param startId is the starting identifier for the sites. Default is 0.
439
+ * @throws std::runtime_error if lattice vectors are degenerate (i.e., the
440
+ * determinant of the lattice vector matrix is near zero, causing the system
441
+ * of equations to have no unique solution).
442
+ */
443
+ auto forEachRegularSites(const std::vector<Device::Lattice>& lattices,
444
+ const std::function<void(const SiteInfo&)>& f,
445
+ size_t startId = 0) -> void;
446
+
447
+ } // namespace na
@@ -0,0 +1,62 @@
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 Defines a type for representing individual atoms.
13
+ */
14
+
15
+ #pragma once
16
+
17
+ #include <ostream>
18
+ #include <string>
19
+ #include <utility>
20
+
21
+ namespace na {
22
+ /// Represents an atom in the NAComputation.
23
+ /// @details The name of the atom is used for printing the NAComputation.
24
+ /// To maintain the uniqueness of atoms, the name of the atom should be unique.
25
+ class Atom final {
26
+ /// The identifier of the atom.
27
+ std::string name_;
28
+
29
+ public:
30
+ /// Creates a new atom with the given name.
31
+ /// @param name The name of the atom.
32
+ explicit Atom(std::string name) : name_(std::move(name)) {}
33
+
34
+ /// Returns the name of the atom.
35
+ [[nodiscard]] auto getName() const -> std::string { return name_; }
36
+
37
+ /// Prints the atom to the given output stream.
38
+ /// @param os The output stream to print the atom to.
39
+ /// @param obj The atom to print.
40
+ /// @return The output stream after printing the atom.
41
+ friend auto operator<<(std::ostream& os, const Atom& obj) -> std::ostream& {
42
+ return os << obj.getName();
43
+ }
44
+
45
+ /// Compares two atoms for equality.
46
+ /// @param other The atom to compare with.
47
+ /// @return True if the atoms are equal, false otherwise.
48
+ [[nodiscard]] auto operator==(const Atom& other) const -> bool {
49
+ if (this == &other) {
50
+ return true;
51
+ }
52
+ return name_ == other.name_;
53
+ }
54
+
55
+ /// Compares two atoms for inequality.
56
+ /// @param other The atom to compare with.
57
+ /// @return True if the atoms are not equal, false otherwise.
58
+ [[nodiscard]] auto operator!=(const Atom& other) const -> bool {
59
+ return !(*this == other);
60
+ }
61
+ };
62
+ } // namespace na
@@ -0,0 +1,154 @@
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 Defines a type for representing two-dimensional locations.
13
+ */
14
+
15
+ #pragma once
16
+
17
+ #include "ir/Definitions.hpp"
18
+
19
+ #include <cmath>
20
+ #include <cstddef>
21
+ #include <functional>
22
+ #include <iomanip>
23
+ #include <ios>
24
+ #include <ostream>
25
+ #include <sstream>
26
+ #include <string>
27
+
28
+ namespace na {
29
+ /// Class to store two-dimensional coordinates of type double.
30
+ struct Location final {
31
+ /// The x-coordinate of the location.
32
+ double x = 0;
33
+ /// The y-coordinate of the location.
34
+ double y = 0;
35
+
36
+ /// Subtracts the coordinates of the given location from this location.
37
+ /// @param loc The location to subtract.
38
+ /// @return The location resulting from the subtraction.
39
+ Location operator-(const Location& loc) const {
40
+ return {x - loc.x, y - loc.y};
41
+ }
42
+
43
+ /// Adds the coordinates of the given location to this location.
44
+ /// @param loc The location to add.
45
+ /// @return The location resulting from the addition.
46
+ Location operator+(const Location& loc) const {
47
+ return {x + loc.x, y + loc.y};
48
+ }
49
+
50
+ /// Returns the length of the vector from the origin to this location.
51
+ [[nodiscard]] auto length() const -> double { return std::hypot(x, y); }
52
+
53
+ /// Returns the distance between two locations.
54
+ [[nodiscard]] static auto distance(const Location& loc1, const Location& loc2)
55
+ -> double {
56
+ return (loc1 - loc2).length();
57
+ }
58
+
59
+ /// Returns a string representation of the location in the format "(x, y)".
60
+ [[nodiscard]] auto toString() const -> std::string {
61
+ std::stringstream ss;
62
+ ss << std::setprecision(3) << std::fixed;
63
+ ss << "(" << x << ", " << y << ")";
64
+ return ss.str();
65
+ }
66
+
67
+ /// Prints the location to the given output stream.
68
+ /// @param os The output stream to print the location to.
69
+ /// @param obj The location to print.
70
+ /// @return The output stream after printing the location.
71
+ friend auto operator<<(std::ostream& os, const Location& obj)
72
+ -> std::ostream& {
73
+ return os << obj.toString();
74
+ }
75
+
76
+ /// Compares two locations for equality.
77
+ /// @param other The location to compare with.
78
+ /// @return True if the locations are equal, false otherwise.
79
+ [[nodiscard]] auto operator==(const Location& other) const -> bool {
80
+ return x == other.x && y == other.y;
81
+ }
82
+
83
+ /// Compares two locations for inequality.
84
+ /// @param other The location to compare with.
85
+ /// @return True if the locations are not equal, false otherwise.
86
+ [[nodiscard]] auto operator!=(const Location& other) const -> bool {
87
+ return !(*this == other);
88
+ }
89
+
90
+ /// Compares two locations for less than.
91
+ /// @param other The location to compare with.
92
+ /// @return True if this location is less than the other location, false
93
+ [[nodiscard]] auto operator<(const Location& other) const -> bool {
94
+ return x < other.x || (x == other.x && y < other.y);
95
+ }
96
+
97
+ /// Compares two locations for greater than.
98
+ /// @param other The location to compare with.
99
+ /// @return True if this location is greater than the other location, false
100
+ [[nodiscard]] auto operator>(const Location& other) const -> bool {
101
+ return other < *this;
102
+ }
103
+
104
+ /// Compares two locations for greater than or equal.
105
+ /// @param other The location to compare with.
106
+ /// @return True if this location is greater than or equal to the other
107
+ [[nodiscard]] auto operator>=(const Location& other) const -> bool {
108
+ return !(other < *this);
109
+ }
110
+
111
+ /// Compares two locations for less than or equal.
112
+ /// @param other The location to compare with.
113
+ /// @return True if this location is less than or equal to the other location,
114
+ [[nodiscard]] auto operator<=(const Location& other) const -> bool {
115
+ return *this >= other;
116
+ }
117
+
118
+ /// Computes the Euclidean distance between this location and the given
119
+ /// location.
120
+ /// @param loc The location to compute the distance to.
121
+ /// @return The Euclidean distance between the two locations.
122
+ [[nodiscard]] auto getEuclideanDistance(const Location& loc) const -> double {
123
+ return (*this - loc).length();
124
+ }
125
+
126
+ /// Computes the horizontal distance between this location and the given
127
+ /// location.
128
+ /// @param loc The location to compute the distance to.
129
+ /// @return The horizontal distance between the two locations.
130
+ [[nodiscard]] auto getManhattanDistanceX(const Location& loc) const
131
+ -> double {
132
+ return std::abs(x - loc.x);
133
+ }
134
+
135
+ /// Computes the vertical distance between this location and the given
136
+ /// location.
137
+ /// @param loc The location to compute the distance to.
138
+ /// @return The vertical distance between the two locations.
139
+ [[nodiscard]] auto getManhattanDistanceY(const Location& loc) const
140
+ -> double {
141
+ return std::abs(y - loc.y);
142
+ }
143
+ };
144
+ } // namespace na
145
+
146
+ /// @brief Specialization of std::hash for na::Location.
147
+ template <> struct std::hash<na::Location> {
148
+ /// @brief Hashes a pair of qc::OpType and size_t values.
149
+ auto operator()(const na::Location& loc) const noexcept -> size_t {
150
+ const size_t h1 = std::hash<double>{}(loc.x);
151
+ const size_t h2 = std::hash<double>{}(loc.y);
152
+ return qc::combineHash(h1, h2);
153
+ }
154
+ };