mqt-core 3.2.0__cp314-cp314-win_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (343) hide show
  1. mqt/core/__init__.py +89 -0
  2. mqt/core/__main__.py +55 -0
  3. mqt/core/_commands.py +52 -0
  4. mqt/core/_compat/__init__.py +11 -0
  5. mqt/core/_compat/typing.py +29 -0
  6. mqt/core/_version.py +21 -0
  7. mqt/core/_version.pyi +12 -0
  8. mqt/core/bin/mqt-core-algorithms.dll +0 -0
  9. mqt/core/bin/mqt-core-circuit-optimizer.dll +0 -0
  10. mqt/core/bin/mqt-core-dd.dll +0 -0
  11. mqt/core/bin/mqt-core-ds.dll +0 -0
  12. mqt/core/bin/mqt-core-ir.dll +0 -0
  13. mqt/core/bin/mqt-core-na.dll +0 -0
  14. mqt/core/bin/mqt-core-qasm.dll +0 -0
  15. mqt/core/bin/mqt-core-zx.dll +0 -0
  16. mqt/core/dd.cp314-win_arm64.pyd +0 -0
  17. mqt/core/dd.pyi +1018 -0
  18. mqt/core/dd_evaluation.py +368 -0
  19. mqt/core/include/mqt-core/algorithms/BernsteinVazirani.hpp +39 -0
  20. mqt/core/include/mqt-core/algorithms/GHZState.hpp +18 -0
  21. mqt/core/include/mqt-core/algorithms/Grover.hpp +33 -0
  22. mqt/core/include/mqt-core/algorithms/QFT.hpp +21 -0
  23. mqt/core/include/mqt-core/algorithms/QPE.hpp +30 -0
  24. mqt/core/include/mqt-core/algorithms/RandomCliffordCircuit.hpp +22 -0
  25. mqt/core/include/mqt-core/algorithms/StatePreparation.hpp +43 -0
  26. mqt/core/include/mqt-core/algorithms/WState.hpp +18 -0
  27. mqt/core/include/mqt-core/algorithms/mqt_core_algorithms_export.h +43 -0
  28. mqt/core/include/mqt-core/boost/config/abi/borland_prefix.hpp +27 -0
  29. mqt/core/include/mqt-core/boost/config/abi/borland_suffix.hpp +12 -0
  30. mqt/core/include/mqt-core/boost/config/abi/msvc_prefix.hpp +22 -0
  31. mqt/core/include/mqt-core/boost/config/abi/msvc_suffix.hpp +8 -0
  32. mqt/core/include/mqt-core/boost/config/abi_prefix.hpp +25 -0
  33. mqt/core/include/mqt-core/boost/config/abi_suffix.hpp +25 -0
  34. mqt/core/include/mqt-core/boost/config/assert_cxx03.hpp +211 -0
  35. mqt/core/include/mqt-core/boost/config/assert_cxx11.hpp +212 -0
  36. mqt/core/include/mqt-core/boost/config/assert_cxx14.hpp +47 -0
  37. mqt/core/include/mqt-core/boost/config/assert_cxx17.hpp +65 -0
  38. mqt/core/include/mqt-core/boost/config/assert_cxx20.hpp +59 -0
  39. mqt/core/include/mqt-core/boost/config/assert_cxx23.hpp +41 -0
  40. mqt/core/include/mqt-core/boost/config/assert_cxx98.hpp +23 -0
  41. mqt/core/include/mqt-core/boost/config/auto_link.hpp +525 -0
  42. mqt/core/include/mqt-core/boost/config/compiler/borland.hpp +342 -0
  43. mqt/core/include/mqt-core/boost/config/compiler/clang.hpp +370 -0
  44. mqt/core/include/mqt-core/boost/config/compiler/clang_version.hpp +89 -0
  45. mqt/core/include/mqt-core/boost/config/compiler/codegear.hpp +389 -0
  46. mqt/core/include/mqt-core/boost/config/compiler/comeau.hpp +59 -0
  47. mqt/core/include/mqt-core/boost/config/compiler/common_edg.hpp +185 -0
  48. mqt/core/include/mqt-core/boost/config/compiler/compaq_cxx.hpp +19 -0
  49. mqt/core/include/mqt-core/boost/config/compiler/cray.hpp +446 -0
  50. mqt/core/include/mqt-core/boost/config/compiler/diab.hpp +26 -0
  51. mqt/core/include/mqt-core/boost/config/compiler/digitalmars.hpp +146 -0
  52. mqt/core/include/mqt-core/boost/config/compiler/gcc.hpp +386 -0
  53. mqt/core/include/mqt-core/boost/config/compiler/gcc_xml.hpp +115 -0
  54. mqt/core/include/mqt-core/boost/config/compiler/greenhills.hpp +28 -0
  55. mqt/core/include/mqt-core/boost/config/compiler/hp_acc.hpp +153 -0
  56. mqt/core/include/mqt-core/boost/config/compiler/intel.hpp +577 -0
  57. mqt/core/include/mqt-core/boost/config/compiler/kai.hpp +33 -0
  58. mqt/core/include/mqt-core/boost/config/compiler/metrowerks.hpp +201 -0
  59. mqt/core/include/mqt-core/boost/config/compiler/mpw.hpp +143 -0
  60. mqt/core/include/mqt-core/boost/config/compiler/nvcc.hpp +64 -0
  61. mqt/core/include/mqt-core/boost/config/compiler/pathscale.hpp +141 -0
  62. mqt/core/include/mqt-core/boost/config/compiler/pgi.hpp +23 -0
  63. mqt/core/include/mqt-core/boost/config/compiler/sgi_mipspro.hpp +29 -0
  64. mqt/core/include/mqt-core/boost/config/compiler/sunpro_cc.hpp +225 -0
  65. mqt/core/include/mqt-core/boost/config/compiler/vacpp.hpp +189 -0
  66. mqt/core/include/mqt-core/boost/config/compiler/visualc.hpp +398 -0
  67. mqt/core/include/mqt-core/boost/config/compiler/xlcpp.hpp +303 -0
  68. mqt/core/include/mqt-core/boost/config/compiler/xlcpp_zos.hpp +174 -0
  69. mqt/core/include/mqt-core/boost/config/detail/cxx_composite.hpp +218 -0
  70. mqt/core/include/mqt-core/boost/config/detail/posix_features.hpp +95 -0
  71. mqt/core/include/mqt-core/boost/config/detail/select_compiler_config.hpp +157 -0
  72. mqt/core/include/mqt-core/boost/config/detail/select_platform_config.hpp +147 -0
  73. mqt/core/include/mqt-core/boost/config/detail/select_stdlib_config.hpp +121 -0
  74. mqt/core/include/mqt-core/boost/config/detail/suffix.hpp +1334 -0
  75. mqt/core/include/mqt-core/boost/config/header_deprecated.hpp +26 -0
  76. mqt/core/include/mqt-core/boost/config/helper_macros.hpp +37 -0
  77. mqt/core/include/mqt-core/boost/config/no_tr1/cmath.hpp +28 -0
  78. mqt/core/include/mqt-core/boost/config/no_tr1/complex.hpp +28 -0
  79. mqt/core/include/mqt-core/boost/config/no_tr1/functional.hpp +28 -0
  80. mqt/core/include/mqt-core/boost/config/no_tr1/memory.hpp +28 -0
  81. mqt/core/include/mqt-core/boost/config/no_tr1/utility.hpp +28 -0
  82. mqt/core/include/mqt-core/boost/config/platform/aix.hpp +33 -0
  83. mqt/core/include/mqt-core/boost/config/platform/amigaos.hpp +15 -0
  84. mqt/core/include/mqt-core/boost/config/platform/beos.hpp +26 -0
  85. mqt/core/include/mqt-core/boost/config/platform/bsd.hpp +83 -0
  86. mqt/core/include/mqt-core/boost/config/platform/cloudabi.hpp +18 -0
  87. mqt/core/include/mqt-core/boost/config/platform/cray.hpp +18 -0
  88. mqt/core/include/mqt-core/boost/config/platform/cygwin.hpp +71 -0
  89. mqt/core/include/mqt-core/boost/config/platform/haiku.hpp +31 -0
  90. mqt/core/include/mqt-core/boost/config/platform/hpux.hpp +87 -0
  91. mqt/core/include/mqt-core/boost/config/platform/irix.hpp +31 -0
  92. mqt/core/include/mqt-core/boost/config/platform/linux.hpp +106 -0
  93. mqt/core/include/mqt-core/boost/config/platform/macos.hpp +87 -0
  94. mqt/core/include/mqt-core/boost/config/platform/qnxnto.hpp +31 -0
  95. mqt/core/include/mqt-core/boost/config/platform/solaris.hpp +31 -0
  96. mqt/core/include/mqt-core/boost/config/platform/symbian.hpp +97 -0
  97. mqt/core/include/mqt-core/boost/config/platform/vms.hpp +25 -0
  98. mqt/core/include/mqt-core/boost/config/platform/vxworks.hpp +422 -0
  99. mqt/core/include/mqt-core/boost/config/platform/wasm.hpp +23 -0
  100. mqt/core/include/mqt-core/boost/config/platform/win32.hpp +90 -0
  101. mqt/core/include/mqt-core/boost/config/platform/zos.hpp +32 -0
  102. mqt/core/include/mqt-core/boost/config/pragma_message.hpp +31 -0
  103. mqt/core/include/mqt-core/boost/config/requires_threads.hpp +92 -0
  104. mqt/core/include/mqt-core/boost/config/stdlib/dinkumware.hpp +324 -0
  105. mqt/core/include/mqt-core/boost/config/stdlib/libcomo.hpp +93 -0
  106. mqt/core/include/mqt-core/boost/config/stdlib/libcpp.hpp +180 -0
  107. mqt/core/include/mqt-core/boost/config/stdlib/libstdcpp3.hpp +482 -0
  108. mqt/core/include/mqt-core/boost/config/stdlib/modena.hpp +79 -0
  109. mqt/core/include/mqt-core/boost/config/stdlib/msl.hpp +98 -0
  110. mqt/core/include/mqt-core/boost/config/stdlib/roguewave.hpp +208 -0
  111. mqt/core/include/mqt-core/boost/config/stdlib/sgi.hpp +168 -0
  112. mqt/core/include/mqt-core/boost/config/stdlib/stlport.hpp +258 -0
  113. mqt/core/include/mqt-core/boost/config/stdlib/vacpp.hpp +74 -0
  114. mqt/core/include/mqt-core/boost/config/stdlib/xlcpp_zos.hpp +61 -0
  115. mqt/core/include/mqt-core/boost/config/user.hpp +133 -0
  116. mqt/core/include/mqt-core/boost/config/warning_disable.hpp +47 -0
  117. mqt/core/include/mqt-core/boost/config/workaround.hpp +305 -0
  118. mqt/core/include/mqt-core/boost/config.hpp +67 -0
  119. mqt/core/include/mqt-core/boost/cstdint.hpp +556 -0
  120. mqt/core/include/mqt-core/boost/cxx11_char_types.hpp +70 -0
  121. mqt/core/include/mqt-core/boost/detail/workaround.hpp +10 -0
  122. mqt/core/include/mqt-core/boost/limits.hpp +146 -0
  123. mqt/core/include/mqt-core/boost/multiprecision/complex128.hpp +24 -0
  124. mqt/core/include/mqt-core/boost/multiprecision/complex_adaptor.hpp +1046 -0
  125. mqt/core/include/mqt-core/boost/multiprecision/concepts/mp_number_archetypes.hpp +257 -0
  126. mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float/io.hpp +698 -0
  127. mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float/transcendental.hpp +157 -0
  128. mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float.hpp +2297 -0
  129. mqt/core/include/mqt-core/boost/multiprecision/cpp_complex.hpp +12 -0
  130. mqt/core/include/mqt-core/boost/multiprecision/cpp_dec_float.hpp +3690 -0
  131. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/add.hpp +368 -0
  132. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/add_unsigned.hpp +387 -0
  133. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/bitwise.hpp +889 -0
  134. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/checked.hpp +178 -0
  135. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/comparison.hpp +374 -0
  136. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/cpp_int_config.hpp +161 -0
  137. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/divide.hpp +703 -0
  138. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/import_export.hpp +248 -0
  139. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/intel_intrinsics.hpp +138 -0
  140. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/limits.hpp +282 -0
  141. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/literals.hpp +295 -0
  142. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/misc.hpp +1457 -0
  143. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/multiply.hpp +848 -0
  144. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/serialize.hpp +211 -0
  145. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/value_pack.hpp +42 -0
  146. mqt/core/include/mqt-core/boost/multiprecision/cpp_int.hpp +2360 -0
  147. mqt/core/include/mqt-core/boost/multiprecision/debug_adaptor.hpp +760 -0
  148. mqt/core/include/mqt-core/boost/multiprecision/detail/assert.hpp +29 -0
  149. mqt/core/include/mqt-core/boost/multiprecision/detail/atomic.hpp +62 -0
  150. mqt/core/include/mqt-core/boost/multiprecision/detail/bitscan.hpp +317 -0
  151. mqt/core/include/mqt-core/boost/multiprecision/detail/check_cpp11_config.hpp +64 -0
  152. mqt/core/include/mqt-core/boost/multiprecision/detail/constexpr.hpp +88 -0
  153. mqt/core/include/mqt-core/boost/multiprecision/detail/default_ops.hpp +4052 -0
  154. mqt/core/include/mqt-core/boost/multiprecision/detail/digits.hpp +49 -0
  155. mqt/core/include/mqt-core/boost/multiprecision/detail/dynamic_array.hpp +44 -0
  156. mqt/core/include/mqt-core/boost/multiprecision/detail/empty_value.hpp +87 -0
  157. mqt/core/include/mqt-core/boost/multiprecision/detail/endian.hpp +35 -0
  158. mqt/core/include/mqt-core/boost/multiprecision/detail/et_ops.hpp +1831 -0
  159. mqt/core/include/mqt-core/boost/multiprecision/detail/float128_functions.hpp +95 -0
  160. mqt/core/include/mqt-core/boost/multiprecision/detail/float_string_cvt.hpp +333 -0
  161. mqt/core/include/mqt-core/boost/multiprecision/detail/fpclassify.hpp +101 -0
  162. mqt/core/include/mqt-core/boost/multiprecision/detail/functions/constants.hpp +288 -0
  163. mqt/core/include/mqt-core/boost/multiprecision/detail/functions/pow.hpp +905 -0
  164. mqt/core/include/mqt-core/boost/multiprecision/detail/functions/trig.hpp +1058 -0
  165. mqt/core/include/mqt-core/boost/multiprecision/detail/functions/trunc.hpp +82 -0
  166. mqt/core/include/mqt-core/boost/multiprecision/detail/generic_interconvert.hpp +687 -0
  167. mqt/core/include/mqt-core/boost/multiprecision/detail/hash.hpp +56 -0
  168. mqt/core/include/mqt-core/boost/multiprecision/detail/integer_ops.hpp +474 -0
  169. mqt/core/include/mqt-core/boost/multiprecision/detail/itos.hpp +39 -0
  170. mqt/core/include/mqt-core/boost/multiprecision/detail/min_max.hpp +106 -0
  171. mqt/core/include/mqt-core/boost/multiprecision/detail/no_et_ops.hpp +661 -0
  172. mqt/core/include/mqt-core/boost/multiprecision/detail/no_exceptions_support.hpp +55 -0
  173. mqt/core/include/mqt-core/boost/multiprecision/detail/number_base.hpp +1656 -0
  174. mqt/core/include/mqt-core/boost/multiprecision/detail/number_compare.hpp +848 -0
  175. mqt/core/include/mqt-core/boost/multiprecision/detail/precision.hpp +313 -0
  176. mqt/core/include/mqt-core/boost/multiprecision/detail/rebind.hpp +19 -0
  177. mqt/core/include/mqt-core/boost/multiprecision/detail/standalone_config.hpp +148 -0
  178. mqt/core/include/mqt-core/boost/multiprecision/detail/static_array.hpp +42 -0
  179. mqt/core/include/mqt-core/boost/multiprecision/detail/string_helpers.hpp +48 -0
  180. mqt/core/include/mqt-core/boost/multiprecision/detail/tables.hpp +80 -0
  181. mqt/core/include/mqt-core/boost/multiprecision/detail/ublas_interop.hpp +75 -0
  182. mqt/core/include/mqt-core/boost/multiprecision/detail/uniform_int_distribution.hpp +212 -0
  183. mqt/core/include/mqt-core/boost/multiprecision/detail/utype_helper.hpp +374 -0
  184. mqt/core/include/mqt-core/boost/multiprecision/eigen.hpp +248 -0
  185. mqt/core/include/mqt-core/boost/multiprecision/float128.hpp +920 -0
  186. mqt/core/include/mqt-core/boost/multiprecision/fwd.hpp +268 -0
  187. mqt/core/include/mqt-core/boost/multiprecision/gmp.hpp +4060 -0
  188. mqt/core/include/mqt-core/boost/multiprecision/integer.hpp +363 -0
  189. mqt/core/include/mqt-core/boost/multiprecision/logged_adaptor.hpp +834 -0
  190. mqt/core/include/mqt-core/boost/multiprecision/miller_rabin.hpp +221 -0
  191. mqt/core/include/mqt-core/boost/multiprecision/mpc.hpp +1721 -0
  192. mqt/core/include/mqt-core/boost/multiprecision/mpfi.hpp +2559 -0
  193. mqt/core/include/mqt-core/boost/multiprecision/mpfr.hpp +3644 -0
  194. mqt/core/include/mqt-core/boost/multiprecision/number.hpp +2500 -0
  195. mqt/core/include/mqt-core/boost/multiprecision/random.hpp +23 -0
  196. mqt/core/include/mqt-core/boost/multiprecision/rational_adaptor.hpp +1289 -0
  197. mqt/core/include/mqt-core/boost/multiprecision/tommath.hpp +1034 -0
  198. mqt/core/include/mqt-core/boost/multiprecision/traits/explicit_conversion.hpp +67 -0
  199. mqt/core/include/mqt-core/boost/multiprecision/traits/extract_exponent_type.hpp +28 -0
  200. mqt/core/include/mqt-core/boost/multiprecision/traits/is_backend.hpp +91 -0
  201. mqt/core/include/mqt-core/boost/multiprecision/traits/is_byte_container.hpp +51 -0
  202. mqt/core/include/mqt-core/boost/multiprecision/traits/is_complex.hpp +22 -0
  203. mqt/core/include/mqt-core/boost/multiprecision/traits/is_convertible_arithmetic.hpp +51 -0
  204. mqt/core/include/mqt-core/boost/multiprecision/traits/is_restricted_conversion.hpp +47 -0
  205. mqt/core/include/mqt-core/boost/multiprecision/traits/is_variable_precision.hpp +25 -0
  206. mqt/core/include/mqt-core/boost/multiprecision/traits/max_digits10.hpp +79 -0
  207. mqt/core/include/mqt-core/boost/multiprecision/traits/std_integer_traits.hpp +90 -0
  208. mqt/core/include/mqt-core/boost/multiprecision/traits/transcendental_reduction_type.hpp +21 -0
  209. mqt/core/include/mqt-core/boost/version.hpp +32 -0
  210. mqt/core/include/mqt-core/circuit_optimizer/CircuitOptimizer.hpp +106 -0
  211. mqt/core/include/mqt-core/circuit_optimizer/mqt_core_circuit_optimizer_export.h +43 -0
  212. mqt/core/include/mqt-core/datastructures/DirectedAcyclicGraph.hpp +117 -0
  213. mqt/core/include/mqt-core/datastructures/DirectedGraph.hpp +158 -0
  214. mqt/core/include/mqt-core/datastructures/DisjointSet.hpp +50 -0
  215. mqt/core/include/mqt-core/datastructures/Layer.hpp +172 -0
  216. mqt/core/include/mqt-core/datastructures/SymmetricMatrix.hpp +57 -0
  217. mqt/core/include/mqt-core/datastructures/UndirectedGraph.hpp +227 -0
  218. mqt/core/include/mqt-core/datastructures/mqt_core_ds_export.h +43 -0
  219. mqt/core/include/mqt-core/dd/Approximation.hpp +45 -0
  220. mqt/core/include/mqt-core/dd/CachedEdge.hpp +167 -0
  221. mqt/core/include/mqt-core/dd/Complex.hpp +165 -0
  222. mqt/core/include/mqt-core/dd/ComplexNumbers.hpp +150 -0
  223. mqt/core/include/mqt-core/dd/ComplexValue.hpp +184 -0
  224. mqt/core/include/mqt-core/dd/ComputeTable.hpp +183 -0
  225. mqt/core/include/mqt-core/dd/DDDefinitions.hpp +139 -0
  226. mqt/core/include/mqt-core/dd/DDpackageConfig.hpp +104 -0
  227. mqt/core/include/mqt-core/dd/DensityNoiseTable.hpp +114 -0
  228. mqt/core/include/mqt-core/dd/Edge.hpp +416 -0
  229. mqt/core/include/mqt-core/dd/Export.hpp +438 -0
  230. mqt/core/include/mqt-core/dd/FunctionalityConstruction.hpp +75 -0
  231. mqt/core/include/mqt-core/dd/GateMatrixDefinitions.hpp +43 -0
  232. mqt/core/include/mqt-core/dd/LinkedListBase.hpp +45 -0
  233. mqt/core/include/mqt-core/dd/MemoryManager.hpp +193 -0
  234. mqt/core/include/mqt-core/dd/Node.hpp +223 -0
  235. mqt/core/include/mqt-core/dd/NoiseFunctionality.hpp +144 -0
  236. mqt/core/include/mqt-core/dd/Operations.hpp +308 -0
  237. mqt/core/include/mqt-core/dd/Package.hpp +2036 -0
  238. mqt/core/include/mqt-core/dd/Package_fwd.hpp +22 -0
  239. mqt/core/include/mqt-core/dd/RealNumber.hpp +255 -0
  240. mqt/core/include/mqt-core/dd/RealNumberUniqueTable.hpp +217 -0
  241. mqt/core/include/mqt-core/dd/Simulation.hpp +98 -0
  242. mqt/core/include/mqt-core/dd/StateGeneration.hpp +143 -0
  243. mqt/core/include/mqt-core/dd/StochasticNoiseOperationTable.hpp +88 -0
  244. mqt/core/include/mqt-core/dd/UnaryComputeTable.hpp +121 -0
  245. mqt/core/include/mqt-core/dd/UniqueTable.hpp +243 -0
  246. mqt/core/include/mqt-core/dd/mqt_core_dd_export.h +43 -0
  247. mqt/core/include/mqt-core/dd/statistics/MemoryManagerStatistics.hpp +84 -0
  248. mqt/core/include/mqt-core/dd/statistics/PackageStatistics.hpp +55 -0
  249. mqt/core/include/mqt-core/dd/statistics/Statistics.hpp +48 -0
  250. mqt/core/include/mqt-core/dd/statistics/TableStatistics.hpp +79 -0
  251. mqt/core/include/mqt-core/dd/statistics/UniqueTableStatistics.hpp +31 -0
  252. mqt/core/include/mqt-core/ir/Definitions.hpp +108 -0
  253. mqt/core/include/mqt-core/ir/Permutation.hpp +213 -0
  254. mqt/core/include/mqt-core/ir/QuantumComputation.hpp +594 -0
  255. mqt/core/include/mqt-core/ir/Register.hpp +125 -0
  256. mqt/core/include/mqt-core/ir/mqt_core_ir_export.h +43 -0
  257. mqt/core/include/mqt-core/ir/operations/AodOperation.hpp +92 -0
  258. mqt/core/include/mqt-core/ir/operations/ClassicControlledOperation.hpp +156 -0
  259. mqt/core/include/mqt-core/ir/operations/CompoundOperation.hpp +210 -0
  260. mqt/core/include/mqt-core/ir/operations/Control.hpp +142 -0
  261. mqt/core/include/mqt-core/ir/operations/Expression.hpp +847 -0
  262. mqt/core/include/mqt-core/ir/operations/NonUnitaryOperation.hpp +118 -0
  263. mqt/core/include/mqt-core/ir/operations/OpType.hpp +115 -0
  264. mqt/core/include/mqt-core/ir/operations/OpType.inc +75 -0
  265. mqt/core/include/mqt-core/ir/operations/Operation.hpp +245 -0
  266. mqt/core/include/mqt-core/ir/operations/StandardOperation.hpp +138 -0
  267. mqt/core/include/mqt-core/ir/operations/SymbolicOperation.hpp +144 -0
  268. mqt/core/include/mqt-core/na/NAComputation.hpp +185 -0
  269. mqt/core/include/mqt-core/na/entities/Atom.hpp +62 -0
  270. mqt/core/include/mqt-core/na/entities/Location.hpp +154 -0
  271. mqt/core/include/mqt-core/na/entities/Zone.hpp +95 -0
  272. mqt/core/include/mqt-core/na/mqt_core_na_export.h +43 -0
  273. mqt/core/include/mqt-core/na/operations/GlobalCZOp.hpp +38 -0
  274. mqt/core/include/mqt-core/na/operations/GlobalOp.hpp +58 -0
  275. mqt/core/include/mqt-core/na/operations/GlobalRYOp.hpp +42 -0
  276. mqt/core/include/mqt-core/na/operations/LoadOp.hpp +89 -0
  277. mqt/core/include/mqt-core/na/operations/LocalOp.hpp +56 -0
  278. mqt/core/include/mqt-core/na/operations/LocalRZOp.hpp +42 -0
  279. mqt/core/include/mqt-core/na/operations/LocalUOp.hpp +49 -0
  280. mqt/core/include/mqt-core/na/operations/MoveOp.hpp +66 -0
  281. mqt/core/include/mqt-core/na/operations/Op.hpp +62 -0
  282. mqt/core/include/mqt-core/na/operations/ShuttlingOp.hpp +51 -0
  283. mqt/core/include/mqt-core/na/operations/StoreOp.hpp +87 -0
  284. mqt/core/include/mqt-core/qasm3/Exception.hpp +85 -0
  285. mqt/core/include/mqt-core/qasm3/Gate.hpp +65 -0
  286. mqt/core/include/mqt-core/qasm3/Importer.hpp +192 -0
  287. mqt/core/include/mqt-core/qasm3/InstVisitor.hpp +145 -0
  288. mqt/core/include/mqt-core/qasm3/NestedEnvironment.hpp +41 -0
  289. mqt/core/include/mqt-core/qasm3/Parser.hpp +170 -0
  290. mqt/core/include/mqt-core/qasm3/Scanner.hpp +73 -0
  291. mqt/core/include/mqt-core/qasm3/Statement.hpp +486 -0
  292. mqt/core/include/mqt-core/qasm3/Statement_fwd.hpp +39 -0
  293. mqt/core/include/mqt-core/qasm3/StdGates.hpp +123 -0
  294. mqt/core/include/mqt-core/qasm3/Token.hpp +198 -0
  295. mqt/core/include/mqt-core/qasm3/Types.hpp +238 -0
  296. mqt/core/include/mqt-core/qasm3/Types_fwd.hpp +22 -0
  297. mqt/core/include/mqt-core/qasm3/mqt_core_qasm_export.h +43 -0
  298. mqt/core/include/mqt-core/qasm3/passes/CompilerPass.hpp +22 -0
  299. mqt/core/include/mqt-core/qasm3/passes/ConstEvalPass.hpp +102 -0
  300. mqt/core/include/mqt-core/qasm3/passes/TypeCheckPass.hpp +124 -0
  301. mqt/core/include/mqt-core/zx/FunctionalityConstruction.hpp +125 -0
  302. mqt/core/include/mqt-core/zx/Rational.hpp +318 -0
  303. mqt/core/include/mqt-core/zx/Rules.hpp +132 -0
  304. mqt/core/include/mqt-core/zx/Simplify.hpp +182 -0
  305. mqt/core/include/mqt-core/zx/Utils.hpp +212 -0
  306. mqt/core/include/mqt-core/zx/ZXDefinitions.hpp +93 -0
  307. mqt/core/include/mqt-core/zx/ZXDiagram.hpp +480 -0
  308. mqt/core/include/mqt-core/zx/mqt_core_zx_export.h +43 -0
  309. mqt/core/ir/__init__.pyi +1998 -0
  310. mqt/core/ir/operations.pyi +991 -0
  311. mqt/core/ir/registers.pyi +91 -0
  312. mqt/core/ir/symbolic.pyi +177 -0
  313. mqt/core/ir.cp314-win_arm64.pyd +0 -0
  314. mqt/core/lib/mqt-core-algorithms.lib +0 -0
  315. mqt/core/lib/mqt-core-circuit-optimizer.lib +0 -0
  316. mqt/core/lib/mqt-core-dd.lib +0 -0
  317. mqt/core/lib/mqt-core-ds.lib +0 -0
  318. mqt/core/lib/mqt-core-ir.lib +0 -0
  319. mqt/core/lib/mqt-core-na.lib +0 -0
  320. mqt/core/lib/mqt-core-qasm.lib +0 -0
  321. mqt/core/lib/mqt-core-zx.lib +0 -0
  322. mqt/core/plugins/__init__.py +9 -0
  323. mqt/core/plugins/qiskit/__init__.py +19 -0
  324. mqt/core/plugins/qiskit/mqt_to_qiskit.py +354 -0
  325. mqt/core/plugins/qiskit/qiskit_to_mqt.py +455 -0
  326. mqt/core/py.typed +2 -0
  327. mqt/core/share/cmake/mqt-core/AddMQTPythonBinding.cmake +52 -0
  328. mqt/core/share/cmake/mqt-core/Cache.cmake +32 -0
  329. mqt/core/share/cmake/mqt-core/FindGMP.cmake +103 -0
  330. mqt/core/share/cmake/mqt-core/PackageAddTest.cmake +40 -0
  331. mqt/core/share/cmake/mqt-core/PreventInSourceBuilds.cmake +25 -0
  332. mqt/core/share/cmake/mqt-core/StandardProjectSettings.cmake +87 -0
  333. mqt/core/share/cmake/mqt-core/mqt-core-config-version.cmake +85 -0
  334. mqt/core/share/cmake/mqt-core/mqt-core-config.cmake +49 -0
  335. mqt/core/share/cmake/mqt-core/mqt-core-targets-release.cmake +90 -0
  336. mqt/core/share/cmake/mqt-core/mqt-core-targets.cmake +324 -0
  337. mqt_core-3.2.0.dist-info/DELVEWHEEL +2 -0
  338. mqt_core-3.2.0.dist-info/METADATA +169 -0
  339. mqt_core-3.2.0.dist-info/RECORD +343 -0
  340. mqt_core-3.2.0.dist-info/WHEEL +5 -0
  341. mqt_core-3.2.0.dist-info/entry_points.txt +4 -0
  342. mqt_core-3.2.0.dist-info/licenses/LICENSE.md +22 -0
  343. mqt_core.libs/msvcp140.dll +0 -0
@@ -0,0 +1,102 @@
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 "qasm3/InstVisitor.hpp"
14
+ #include "qasm3/NestedEnvironment.hpp"
15
+ #include "qasm3/Statement_fwd.hpp"
16
+ #include "qasm3/passes/CompilerPass.hpp"
17
+
18
+ #include <cstddef>
19
+ #include <cstdint>
20
+ #include <memory>
21
+ #include <optional>
22
+ #include <string>
23
+ #include <variant>
24
+
25
+ namespace qasm3::const_eval {
26
+ struct ConstEvalValue {
27
+ enum Type : uint8_t {
28
+ ConstInt,
29
+ ConstUint,
30
+ ConstFloat,
31
+ ConstBool,
32
+ } type;
33
+ std::variant<int64_t, double, bool> value;
34
+ size_t width;
35
+
36
+ explicit ConstEvalValue(double val, const size_t w = 64)
37
+ : type(ConstFloat), value(val), width(w) {}
38
+ explicit ConstEvalValue(int64_t val, const bool isSigned, const size_t w = 64)
39
+ : type(isSigned ? ConstInt : ConstUint), value(val), width(w) {}
40
+ explicit ConstEvalValue(bool val) : type(ConstBool), value(val), width(1) {}
41
+
42
+ [[nodiscard]] std::shared_ptr<Constant> toExpr() const;
43
+
44
+ bool operator==(const ConstEvalValue& rhs) const;
45
+
46
+ bool operator!=(const ConstEvalValue& rhs) const { return !(*this == rhs); }
47
+
48
+ [[nodiscard]] std::string toString() const;
49
+ };
50
+
51
+ class ConstEvalPass final
52
+ : public CompilerPass,
53
+ public DefaultInstVisitor,
54
+ public ExpressionVisitor<std::optional<ConstEvalValue>>,
55
+ public TypeVisitor<std::shared_ptr<Expression>> {
56
+ NestedEnvironment<ConstEvalValue> env;
57
+
58
+ public:
59
+ ConstEvalPass() = default;
60
+ ~ConstEvalPass() override = default;
61
+
62
+ void addConst(const std::string& identifier, const ConstEvalValue& val) {
63
+ env.emplace(identifier, val);
64
+ }
65
+
66
+ void addConst(const std::string& identifier, const double val) {
67
+ env.emplace(identifier, ConstEvalValue(val));
68
+ }
69
+
70
+ void processStatement(Statement& statement) override;
71
+
72
+ void pushEnv() { env.push(); }
73
+ void popEnv() { env.pop(); }
74
+
75
+ void visitDeclarationStatement(
76
+ std::shared_ptr<DeclarationStatement> declarationStatement) override;
77
+ void visitGateCallStatement(
78
+ std::shared_ptr<GateCallStatement> gateCallStatement) override;
79
+
80
+ std::optional<ConstEvalValue> visitBinaryExpression(
81
+ std::shared_ptr<BinaryExpression> binaryExpression) override;
82
+ std::optional<ConstEvalValue> visitUnaryExpression(
83
+ std::shared_ptr<UnaryExpression> unaryExpression) override;
84
+ std::optional<ConstEvalValue>
85
+ visitConstantExpression(std::shared_ptr<Constant> constant) override;
86
+ std::optional<ConstEvalValue> visitIdentifierExpression(
87
+ std::shared_ptr<IdentifierExpression> identifierExpression) override;
88
+ std::optional<ConstEvalValue>
89
+ visitIdentifierList(std::shared_ptr<IdentifierList> identifierList) override;
90
+ std::optional<ConstEvalValue> visitIndexedIdentifier(
91
+ std::shared_ptr<IndexedIdentifier> indexedIdentifier) override;
92
+ std::optional<ConstEvalValue> visitMeasureExpression(
93
+ std::shared_ptr<MeasureExpression> measureExpression) override;
94
+
95
+ std::shared_ptr<ResolvedType> visitDesignatedType(
96
+ DesignatedType<std::shared_ptr<Expression>>* designatedType) override;
97
+ std::shared_ptr<ResolvedType> visitUnsizedType(
98
+ UnsizedType<std::shared_ptr<Expression>>* unsizedType) override;
99
+ std::shared_ptr<ResolvedType>
100
+ visitArrayType(ArrayType<std::shared_ptr<Expression>>* arrayType) override;
101
+ };
102
+ } // namespace qasm3::const_eval
@@ -0,0 +1,124 @@
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 "qasm3/InstVisitor.hpp"
14
+ #include "qasm3/Statement_fwd.hpp"
15
+ #include "qasm3/Types.hpp"
16
+ #include "qasm3/passes/CompilerPass.hpp"
17
+ #include "qasm3/passes/ConstEvalPass.hpp"
18
+
19
+ #include <map>
20
+ #include <memory>
21
+ #include <string>
22
+ #include <utility>
23
+
24
+ namespace qasm3 {
25
+ class GateOperand;
26
+ struct DebugInfo;
27
+ } // namespace qasm3
28
+
29
+ namespace qasm3::type_checking {
30
+ struct InferredType {
31
+ bool isError;
32
+ std::shared_ptr<ResolvedType> type;
33
+
34
+ InferredType(const bool isErr, std::shared_ptr<ResolvedType> ty)
35
+ : isError(isErr), type(std::move(ty)) {}
36
+
37
+ explicit InferredType(std::shared_ptr<ResolvedType> ty)
38
+ : isError(false), type(std::move(ty)) {}
39
+
40
+ static InferredType error() { return InferredType{true, nullptr}; }
41
+
42
+ [[nodiscard]] bool matches(const InferredType& other) const {
43
+ if (isError || other.isError) {
44
+ return true;
45
+ }
46
+
47
+ return *type == *other.type;
48
+ }
49
+
50
+ [[nodiscard]] std::string toString() const {
51
+ if (isError) {
52
+ return "error";
53
+ }
54
+ return type->toString();
55
+ }
56
+ };
57
+
58
+ class TypeCheckPass final : public CompilerPass,
59
+ public InstVisitor,
60
+ public ExpressionVisitor<InferredType> {
61
+ bool hasError = false;
62
+ std::string errMessage;
63
+ std::map<std::string, InferredType> env;
64
+ // We need a reference to a const eval pass to evaluate types before type
65
+ // checking.
66
+ const_eval::ConstEvalPass* constEvalPass;
67
+
68
+ InferredType error(const std::string& msg,
69
+ const std::shared_ptr<DebugInfo>& debugInfo = nullptr);
70
+
71
+ public:
72
+ explicit TypeCheckPass(const_eval::ConstEvalPass& pass)
73
+ : constEvalPass(&pass) {}
74
+
75
+ ~TypeCheckPass() override = default;
76
+
77
+ void addBuiltin(const std::string& identifier, const InferredType& ty) {
78
+ env.emplace(identifier, ty);
79
+ }
80
+
81
+ void processStatement(Statement& statement) override;
82
+
83
+ void checkIndexOperator(const IndexOperator& indexOperator);
84
+ void checkIndexedIdentifier(const IndexedIdentifier& id);
85
+ void checkGateOperand(const GateOperand& operand);
86
+
87
+ // Types
88
+ void
89
+ visitGateStatement(std::shared_ptr<GateDeclaration> gateStatement) override;
90
+ void visitVersionDeclaration(
91
+ std::shared_ptr<VersionDeclaration> versionDeclaration) override;
92
+ void visitDeclarationStatement(
93
+ std::shared_ptr<DeclarationStatement> declarationStatement) override;
94
+ void
95
+ visitInitialLayout(std::shared_ptr<InitialLayout> initialLayout) override;
96
+ void visitOutputPermutation(
97
+ std::shared_ptr<OutputPermutation> outputPermutation) override;
98
+ void visitGateCallStatement(
99
+ std::shared_ptr<GateCallStatement> gateCallStatement) override;
100
+ void visitAssignmentStatement(
101
+ std::shared_ptr<AssignmentStatement> assignmentStatement) override;
102
+ void visitBarrierStatement(
103
+ std::shared_ptr<BarrierStatement> barrierStatement) override;
104
+ void
105
+ visitResetStatement(std::shared_ptr<ResetStatement> resetStatement) override;
106
+ void visitIfStatement(std::shared_ptr<IfStatement> ifStatement) override;
107
+
108
+ // Expressions
109
+ InferredType visitBinaryExpression(
110
+ std::shared_ptr<BinaryExpression> binaryExpression) override;
111
+ InferredType visitUnaryExpression(
112
+ std::shared_ptr<UnaryExpression> unaryExpression) override;
113
+ InferredType
114
+ visitConstantExpression(std::shared_ptr<Constant> constantInt) override;
115
+ InferredType visitIdentifierExpression(
116
+ std::shared_ptr<IdentifierExpression> identifierExpression) override;
117
+ InferredType
118
+ visitIdentifierList(std::shared_ptr<IdentifierList> identifierList) override;
119
+ InferredType visitIndexedIdentifier(
120
+ std::shared_ptr<IndexedIdentifier> indexedIdentifier) override;
121
+ InferredType visitMeasureExpression(
122
+ std::shared_ptr<MeasureExpression> measureExpression) override;
123
+ };
124
+ } // namespace qasm3::type_checking
@@ -0,0 +1,125 @@
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 "ZXDefinitions.hpp"
14
+ #include "ZXDiagram.hpp"
15
+ #include "ir/Permutation.hpp"
16
+ #include "ir/QuantumComputation.hpp"
17
+ #include "ir/operations/Expression.hpp"
18
+ #include "ir/operations/Operation.hpp"
19
+
20
+ #include <cstddef>
21
+ #include <optional>
22
+ #include <vector>
23
+
24
+ namespace zx {
25
+
26
+ /**
27
+ * @brief Static class to construct ZX-diagrams from a Quantumcomputation
28
+ */
29
+ class FunctionalityConstruction {
30
+ using op_it = qc::QuantumComputation::const_iterator;
31
+
32
+ public:
33
+ /**
34
+ * @brief Builds a ZX-diagram from a QuantumComputation
35
+ *
36
+ * @param qc Pointer to QuantumComputation to build the ZX-diagram from
37
+ * @return ZXDiagram
38
+ */
39
+ static ZXDiagram buildFunctionality(const qc::QuantumComputation* qc);
40
+
41
+ /**
42
+ * @brief Check whether a given QuantumComputation can be transformed to a
43
+ * ZXDiagram.
44
+ * @details Not all instructions supported by the QuantumComputation are
45
+ * supported by the ZXDiagram (e.g. arbitrarily-controlled multi-qubit gates).
46
+ * @param qc Pointer to QuantumComputation to check
47
+ * @return true if the QuantumComputation can be transformed to a ZXDiagram,
48
+ * false otherwise
49
+ */
50
+ static bool transformableToZX(const qc::QuantumComputation* qc);
51
+
52
+ /**
53
+ * @brief Check whether a given Operation can be transformed to a ZXDiagram.
54
+ * @details Not all Operations have a corresponding representation in the
55
+ * ZX-calculus.
56
+ * @param op Pointer to Operation to check
57
+ * @return true if the Operation can be transformed to a ZXDiagram, false
58
+ * otherwise
59
+ */
60
+ static bool transformableToZX(const qc::Operation* op);
61
+
62
+ protected:
63
+ static bool checkSwap(const op_it& it, const op_it& end, Qubit ctrl,
64
+ Qubit target, const qc::Permutation& p);
65
+ static void addZSpider(ZXDiagram& diag, zx::Qubit qubit,
66
+ std::vector<Vertex>& qubits,
67
+ const PiExpression& phase = PiExpression(),
68
+ EdgeType type = EdgeType::Simple);
69
+ static void addXSpider(ZXDiagram& diag, Qubit qubit,
70
+ std::vector<Vertex>& qubits,
71
+ const PiExpression& phase = PiExpression(),
72
+ EdgeType type = EdgeType::Simple);
73
+ static void
74
+ addRz(ZXDiagram& diag, const PiExpression& phase, Qubit target,
75
+ std::vector<Vertex>& qubits,
76
+ const std::optional<double>& unconvertedPhase = std::nullopt);
77
+ static void addRx(ZXDiagram& diag, const PiExpression& phase, Qubit target,
78
+ std::vector<Vertex>& qubits);
79
+ static void
80
+ addRy(ZXDiagram& diag, const PiExpression& phase, Qubit target,
81
+ std::vector<Vertex>& qubits,
82
+ const std::optional<double>& unconvertedPhase = std::nullopt);
83
+ static void addCnot(ZXDiagram& diag, Qubit ctrl, Qubit target,
84
+ std::vector<Vertex>& qubits,
85
+ EdgeType type = EdgeType::Simple);
86
+ static void addCphase(ZXDiagram& diag, const PiExpression& phase, Qubit ctrl,
87
+ Qubit target, std::vector<Vertex>& qubits);
88
+ static void addSwap(ZXDiagram& diag, Qubit target, Qubit target2,
89
+ std::vector<Vertex>& qubits);
90
+ static void
91
+ addRzz(ZXDiagram& diag, const PiExpression& phase, Qubit target,
92
+ Qubit target2, std::vector<Vertex>& qubits,
93
+ const std::optional<double>& unconvertedPhase = std::nullopt);
94
+ static void
95
+ addRxx(ZXDiagram& diag, const PiExpression& phase, Qubit target,
96
+ Qubit target2, std::vector<Vertex>& qubits,
97
+ const std::optional<double>& unconvertedPhase = std::nullopt);
98
+ static void
99
+ addRzx(ZXDiagram& diag, const PiExpression& phase, Qubit target,
100
+ Qubit target2, std::vector<Vertex>& qubits,
101
+ const std::optional<double>& unconvertedPhase = std::nullopt);
102
+ static void addDcx(ZXDiagram& diag, Qubit qubit1, Qubit qubit2,
103
+ std::vector<Vertex>& qubits);
104
+ static void
105
+ addXXplusYY(ZXDiagram& diag, const PiExpression& theta,
106
+ const PiExpression& beta, Qubit qubit0, Qubit qubit1,
107
+ std::vector<Vertex>& qubits,
108
+ const std::optional<double>& unconvertedBeta = std::nullopt);
109
+ static void
110
+ addXXminusYY(ZXDiagram& diag, const PiExpression& theta,
111
+ const PiExpression& beta, Qubit qubit0, Qubit qubit1,
112
+ std::vector<Vertex>& qubits,
113
+ const std::optional<double>& unconvertedBeta = std::nullopt);
114
+ static void addCcx(ZXDiagram& diag, Qubit ctrl0, Qubit ctrl1, Qubit target,
115
+ std::vector<Vertex>& qubits);
116
+ static op_it parseOp(ZXDiagram& diag, op_it it, op_it end,
117
+ std::vector<Vertex>& qubits, const qc::Permutation& p);
118
+ static op_it parseCompoundOp(ZXDiagram& diag, op_it it, op_it end,
119
+ std::vector<Vertex>& qubits,
120
+ const qc::Permutation& initialLayout);
121
+
122
+ static PiExpression toPiExpr(const qc::SymbolOrNumber& param);
123
+ static PiExpression parseParam(const qc::Operation* op, std::size_t i);
124
+ };
125
+ } // namespace zx
@@ -0,0 +1,318 @@
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
+ #if defined(GMP)
14
+ #include <boost/multiprecision/gmp.hpp> // IWYU pragma: keep
15
+ using Rational = boost::multiprecision::mpq_rational;
16
+ using BigInt = boost::multiprecision::mpz_int;
17
+ #else
18
+ #include <boost/multiprecision/cpp_int.hpp> // IWYU pragma: keep
19
+ #include <boost/multiprecision/fwd.hpp>
20
+ using Rational = boost::multiprecision::cpp_rational;
21
+ using BigInt = boost::multiprecision::cpp_int;
22
+ #endif
23
+
24
+ #include <boost/multiprecision/rational_adaptor.hpp>
25
+ #include <cmath>
26
+ #include <cstdint>
27
+ #include <cstdlib>
28
+ #include <iostream>
29
+
30
+ namespace zx {
31
+
32
+ /*
33
+ * @brief Representation of fractions as multiples of pi
34
+ * @details Rationals can only have values in the half-open interval (-1,1],
35
+ * corresponding to the interval (-pi, pi]
36
+ */
37
+ class PiRational {
38
+ public:
39
+ /**
40
+ * @brief Default constructor initializes the rational to 0/1.
41
+ */
42
+ PiRational() = default;
43
+
44
+ /**
45
+ * @brief Construct a PiRational from numerator and denominator.
46
+ * @details The input fraction is already assumed to be in multiples of Pi.
47
+ * For example, the fraction 1/2 corresponds to Pi/2.
48
+ * @param num Numerator of the fraction.
49
+ * @param denom Denominator of the fraction.
50
+ */
51
+ explicit PiRational(int64_t num, int64_t denom) : frac(num, denom) {
52
+ modPi();
53
+ }
54
+ explicit PiRational(const BigInt& num, const BigInt& denom)
55
+ : frac(num, denom) {
56
+ modPi();
57
+ }
58
+
59
+ /**
60
+ * @brief Construct a PiRational from numerator. Denominator is assumed to
61
+ * be 1.
62
+ * @details The input numerator is already assumed to be in multiples of Pi.
63
+ * For example a numerator of 1 corresponds to a fraction Pi/1.
64
+ * @param num Numerator of the fraction.
65
+ */
66
+ explicit PiRational(int64_t num) : frac(num, 1) { modPi(); }
67
+
68
+ /**
69
+ * @brief Construct a PiRational from a double.
70
+ * @details The input double is approximated as a fraction of Pi within a
71
+ * tolerance of 1e-13.
72
+ * @param val Double value to be approximated.
73
+ */
74
+ explicit PiRational(double val);
75
+
76
+ PiRational& operator+=(const PiRational& rhs);
77
+ PiRational& operator+=(int64_t rhs);
78
+
79
+ PiRational& operator-=(const PiRational& rhs);
80
+ PiRational& operator-=(int64_t rhs);
81
+
82
+ PiRational& operator*=(const PiRational& rhs);
83
+ PiRational& operator*=(int64_t rhs);
84
+
85
+ PiRational& operator/=(const PiRational& rhs);
86
+ PiRational& operator/=(int64_t rhs);
87
+
88
+ /**
89
+ * @brief Check if the fraction is an integer, i.e., the denominator is 1.
90
+ * @return True if the fraction is an integer, false otherwise.
91
+ */
92
+ [[nodiscard]] bool isInteger() const {
93
+ return boost::multiprecision::denominator(frac) == 1;
94
+ }
95
+
96
+ /**
97
+ * @brief Check if the fraction is zero, i,e, the numerator is 0.
98
+ * @return True if the fraction is zero, false otherwise.
99
+ */
100
+ [[nodiscard]] bool isZero() const {
101
+ return boost::multiprecision::numerator(frac) == 0;
102
+ }
103
+
104
+ /**
105
+ * @brief Get the denominator of the fraction.
106
+ * @return Denominator of the fraction.
107
+ */
108
+ [[nodiscard]] BigInt getDenom() const {
109
+ return boost::multiprecision::denominator(frac);
110
+ }
111
+
112
+ /**
113
+ * @brief Get the numerator of the fraction.
114
+ * @return Numerator of the fraction.
115
+ */
116
+ [[nodiscard]] BigInt getNum() const {
117
+ return boost::multiprecision::numerator(frac);
118
+ }
119
+
120
+ /**
121
+ * @brief Convert the fraction to a double.
122
+ * @details The result is not taken mod Pi. Converting 1/1 will return an
123
+ * approximation of Pi.
124
+ * @return Double value of the fraction.
125
+ */
126
+ [[nodiscard]] double toDouble() const;
127
+
128
+ /**
129
+ * @brief Convert the fraction to a double mod Pi.
130
+ * @details The result is taken mod Pi. Converting 1/1 will return 1.0.
131
+ * @return Double value of the fraction.
132
+ */
133
+ [[nodiscard]] double toDoubleDivPi() const {
134
+ return frac.convert_to<double>();
135
+ }
136
+
137
+ /**
138
+ * @brief Check if the fraction is close to a double value within a tolerance.
139
+ * @details The comparison is not done mod Pi. So if the fraction is 1/1
140
+ * isClose(1.0, 1e-13) will return true.
141
+ * @param x Double value to compare to.
142
+ * @param tolerance Tolerance for the comparison.
143
+ * @return True if the fraction is close to the double value, false otherwise.
144
+ */
145
+ [[nodiscard]] bool isClose(const double x, const double tolerance) const {
146
+ return std::abs(toDouble() - x) < tolerance;
147
+ }
148
+
149
+ /**
150
+ * @brief Check if the fraction is close to a double value within a tolerance
151
+ * mod Pi.
152
+ * @details The comparison is done mod Pi. So if the fraction is 1/1
153
+ * isCloseDivPi(1.0, 1e-13) will return false, but isCloseDivPi(3.14159,
154
+ * 1e-14) will return true.
155
+ * @param x Double value to compare to.
156
+ * @param tolerance Tolerance for the comparison.
157
+ * @return True if the fraction is close to the double value divided by Pi,
158
+ * false otherwise.
159
+ */
160
+ [[nodiscard]] bool isCloseDivPi(const double x,
161
+ const double tolerance) const {
162
+ return std::abs(toDoubleDivPi() - x) < tolerance;
163
+ }
164
+
165
+ /**
166
+ * @brief Get the double value of the fraction.
167
+ * @details The result is not taken mod Pi. Converting 1/1 will return 1.0.
168
+ * @return Double value of the fraction.
169
+ */
170
+ explicit operator double() const { return this->toDouble(); }
171
+
172
+ private:
173
+ Rational frac;
174
+
175
+ void modPi();
176
+
177
+ void setNum(const BigInt& num) {
178
+ boost::multiprecision::numerator(frac) = num;
179
+ }
180
+
181
+ void setDenom(const BigInt& denom) const {
182
+ boost::multiprecision::denominator(frac) = denom;
183
+ }
184
+ };
185
+
186
+ inline PiRational operator-(const PiRational& rhs) {
187
+ return PiRational(-rhs.getNum(), rhs.getDenom());
188
+ }
189
+ inline PiRational operator+(PiRational lhs, const PiRational& rhs) {
190
+ lhs += rhs;
191
+ return lhs;
192
+ }
193
+ inline PiRational operator+(PiRational lhs, const int64_t rhs) {
194
+ lhs += rhs;
195
+ return lhs;
196
+ }
197
+ inline PiRational operator+(const int64_t lhs, PiRational rhs) {
198
+ rhs += lhs;
199
+ return rhs;
200
+ }
201
+
202
+ inline PiRational operator-(PiRational lhs, const PiRational& rhs) {
203
+ lhs -= rhs;
204
+ return lhs;
205
+ }
206
+ inline PiRational operator-(PiRational lhs, const int64_t rhs) {
207
+ lhs -= rhs;
208
+ return lhs;
209
+ }
210
+ inline PiRational operator-(const int64_t lhs, PiRational rhs) {
211
+ rhs -= lhs;
212
+ return rhs;
213
+ }
214
+
215
+ inline PiRational operator*(PiRational lhs, const PiRational& rhs) {
216
+ lhs *= rhs;
217
+ return lhs;
218
+ }
219
+ inline PiRational operator*(PiRational lhs, const int64_t rhs) {
220
+ lhs *= rhs;
221
+ return lhs;
222
+ }
223
+ inline PiRational operator*(const int64_t lhs, PiRational rhs) {
224
+ rhs *= lhs;
225
+ return rhs;
226
+ }
227
+
228
+ inline PiRational operator/(PiRational lhs, const PiRational& rhs) {
229
+ lhs /= rhs;
230
+ return lhs;
231
+ }
232
+ inline PiRational operator/(PiRational lhs, const int64_t rhs) {
233
+ lhs /= rhs;
234
+ return lhs;
235
+ }
236
+ inline PiRational operator/(const int64_t lhs, PiRational rhs) {
237
+ rhs /= lhs;
238
+ return rhs;
239
+ }
240
+
241
+ inline bool operator<(const PiRational& lhs, const PiRational& rhs) {
242
+ return (lhs.getNum() * rhs.getDenom()) < (rhs.getNum() * lhs.getDenom());
243
+ }
244
+
245
+ inline bool operator<(const PiRational& lhs, const int64_t rhs) {
246
+ return lhs.getNum() < (rhs * lhs.getDenom());
247
+ }
248
+
249
+ inline bool operator<(const int64_t lhs, const PiRational& rhs) {
250
+ return (lhs * rhs.getDenom()) < rhs.getNum();
251
+ }
252
+
253
+ inline bool operator<=(const PiRational& lhs, const PiRational& rhs) {
254
+ return (lhs.getNum() * rhs.getDenom()) <= (rhs.getNum() * lhs.getDenom());
255
+ }
256
+
257
+ inline bool operator<=(const PiRational& lhs, const int64_t rhs) {
258
+ return lhs.getNum() <= (rhs * lhs.getDenom());
259
+ }
260
+
261
+ inline bool operator<=(const int64_t lhs, const PiRational& rhs) {
262
+ return (lhs * rhs.getDenom()) <= rhs.getNum();
263
+ }
264
+
265
+ inline bool operator>(const PiRational& lhs, const PiRational& rhs) {
266
+ return rhs < lhs;
267
+ }
268
+
269
+ inline bool operator>(const PiRational& lhs, const int64_t rhs) {
270
+ return rhs < lhs;
271
+ }
272
+
273
+ inline bool operator>(const int64_t lhs, const PiRational& rhs) {
274
+ return rhs < lhs;
275
+ }
276
+
277
+ inline bool operator>=(const PiRational& lhs, const PiRational& rhs) {
278
+ return rhs <= lhs;
279
+ }
280
+
281
+ inline bool operator>=(const PiRational& lhs, const int64_t rhs) {
282
+ return rhs <= lhs;
283
+ }
284
+
285
+ inline bool operator>=(const int64_t lhs, const PiRational& rhs) {
286
+ return rhs <= lhs;
287
+ }
288
+
289
+ inline bool operator==(const PiRational& lhs, const PiRational& rhs) {
290
+ return lhs.getNum() == rhs.getNum() && lhs.getDenom() == rhs.getDenom();
291
+ }
292
+
293
+ inline bool operator==(const PiRational& lhs, const int64_t rhs) {
294
+ return lhs.getNum() == rhs && lhs.getDenom() == 1;
295
+ }
296
+
297
+ inline bool operator==(const int64_t lhs, const PiRational& rhs) {
298
+ return rhs == lhs;
299
+ }
300
+
301
+ inline bool operator!=(const PiRational& lhs, const PiRational& rhs) {
302
+ return !(lhs == rhs);
303
+ }
304
+
305
+ inline bool operator!=(const PiRational& lhs, const int64_t rhs) {
306
+ return !(lhs == rhs);
307
+ }
308
+
309
+ inline bool operator!=(const int64_t lhs, const PiRational& rhs) {
310
+ return !(lhs == rhs);
311
+ }
312
+
313
+ inline std::ostream& operator<<(std::ostream& os, const zx::PiRational& rhs) {
314
+ os << rhs.getNum() << "/" << rhs.getDenom();
315
+ return os;
316
+ }
317
+
318
+ } // namespace zx