mqt-core 3.2.0__cp314-cp314-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.

Potentially problematic release.


This version of mqt-core might be problematic. Click here for more details.

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_amd64.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_amd64.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,905 @@
1
+
2
+ // Copyright Christopher Kormanyos 2002 - 2013.
3
+ // Copyright 2011 - 2013 John Maddock.
4
+ // Distributed under the Boost Software License, Version 1.0.
5
+ // (See accompanying file LICENSE_1_0.txt or copy at
6
+ // http://www.boost.org/LICENSE_1_0.txt)
7
+
8
+ // This work is based on an earlier work:
9
+ // "Algorithm 910: A Portable C++ Multiple-Precision System for Special-Function Calculations",
10
+ // in ACM TOMS, {VOL 37, ISSUE 4, (February 2011)} (C) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469
11
+ //
12
+ // This file has no include guards or namespaces - it's expanded inline inside default_ops.hpp
13
+ //
14
+
15
+ #ifdef BOOST_MSVC
16
+ #pragma warning(push)
17
+ #pragma warning(disable : 6326) // comparison of two constants
18
+ #pragma warning(disable : 4127) // conditional expression is constant
19
+ #endif
20
+
21
+ #include <boost/multiprecision/detail/standalone_config.hpp>
22
+ #include <boost/multiprecision/detail/no_exceptions_support.hpp>
23
+ #include <boost/multiprecision/detail/assert.hpp>
24
+
25
+ namespace detail {
26
+
27
+ template <typename T, typename U>
28
+ inline void pow_imp(T& result, const T& t, const U& p, const std::integral_constant<bool, false>&)
29
+ {
30
+ // Compute the pure power of typename T t^p.
31
+ // Use the S-and-X binary method, as described in
32
+ // D. E. Knuth, "The Art of Computer Programming", Vol. 2,
33
+ // Section 4.6.3 . The resulting computational complexity
34
+ // is order log2[abs(p)].
35
+
36
+ using int_type = typename boost::multiprecision::detail::canonical<U, T>::type;
37
+
38
+ if (&result == &t)
39
+ {
40
+ T temp;
41
+ pow_imp(temp, t, p, std::integral_constant<bool, false>());
42
+ result = temp;
43
+ return;
44
+ }
45
+
46
+ // This will store the result.
47
+ if (U(p % U(2)) != U(0))
48
+ {
49
+ result = t;
50
+ }
51
+ else
52
+ result = int_type(1);
53
+
54
+ U p2(p);
55
+
56
+ // The variable x stores the binary powers of t.
57
+ T x(t);
58
+
59
+ while (U(p2 /= 2) != U(0))
60
+ {
61
+ // Square x for each binary power.
62
+ eval_multiply(x, x);
63
+
64
+ const bool has_binary_power = (U(p2 % U(2)) != U(0));
65
+
66
+ if (has_binary_power)
67
+ {
68
+ // Multiply the result with each binary power contained in the exponent.
69
+ eval_multiply(result, x);
70
+ }
71
+ }
72
+ }
73
+
74
+ template <typename T, typename U>
75
+ inline void pow_imp(T& result, const T& t, const U& p, const std::integral_constant<bool, true>&)
76
+ {
77
+ // Signed integer power, just take care of the sign then call the unsigned version:
78
+ using int_type = typename boost::multiprecision::detail::canonical<U, T>::type;
79
+ using ui_type = typename boost::multiprecision::detail::make_unsigned<U>::type ;
80
+
81
+ if (p < 0)
82
+ {
83
+ T temp;
84
+ temp = static_cast<int_type>(1);
85
+ T denom;
86
+ pow_imp(denom, t, static_cast<ui_type>(-p), std::integral_constant<bool, false>());
87
+ eval_divide(result, temp, denom);
88
+ return;
89
+ }
90
+ pow_imp(result, t, static_cast<ui_type>(p), std::integral_constant<bool, false>());
91
+ }
92
+
93
+ } // namespace detail
94
+
95
+ template <typename T, typename U>
96
+ inline typename std::enable_if<boost::multiprecision::detail::is_integral<U>::value>::type eval_pow(T& result, const T& t, const U& p)
97
+ {
98
+ detail::pow_imp(result, t, p, boost::multiprecision::detail::is_signed<U>());
99
+ }
100
+
101
+ template <class T>
102
+ void hyp0F0(T& H0F0, const T& x)
103
+ {
104
+ // Compute the series representation of Hypergeometric0F0 taken from
105
+ // http://functions.wolfram.com/HypergeometricFunctions/Hypergeometric0F0/06/01/
106
+ // There are no checks on input range or parameter boundaries.
107
+
108
+ using ui_type = typename std::tuple_element<0, typename T::unsigned_types>::type;
109
+
110
+ BOOST_MP_ASSERT(&H0F0 != &x);
111
+ long tol = boost::multiprecision::detail::digits2<number<T, et_on> >::value();
112
+ T t;
113
+
114
+ T x_pow_n_div_n_fact(x);
115
+
116
+ eval_add(H0F0, x_pow_n_div_n_fact, ui_type(1));
117
+
118
+ T lim;
119
+ eval_ldexp(lim, H0F0, static_cast<int>(1L - tol));
120
+ if (eval_get_sign(lim) < 0)
121
+ lim.negate();
122
+
123
+ ui_type n;
124
+
125
+ const unsigned series_limit =
126
+ boost::multiprecision::detail::digits2<number<T, et_on> >::value() < 100
127
+ ? 100
128
+ : boost::multiprecision::detail::digits2<number<T, et_on> >::value();
129
+ // Series expansion of hyperg_0f0(; ; x).
130
+ for (n = 2; n < series_limit; ++n)
131
+ {
132
+ eval_multiply(x_pow_n_div_n_fact, x);
133
+ eval_divide(x_pow_n_div_n_fact, n);
134
+ eval_add(H0F0, x_pow_n_div_n_fact);
135
+ bool neg = eval_get_sign(x_pow_n_div_n_fact) < 0;
136
+ if (neg)
137
+ x_pow_n_div_n_fact.negate();
138
+ if (lim.compare(x_pow_n_div_n_fact) > 0)
139
+ break;
140
+ if (neg)
141
+ x_pow_n_div_n_fact.negate();
142
+ }
143
+ if (n >= series_limit)
144
+ BOOST_MP_THROW_EXCEPTION(std::runtime_error("H0F0 failed to converge"));
145
+ }
146
+
147
+ template <class T>
148
+ void hyp1F0(T& H1F0, const T& a, const T& x)
149
+ {
150
+ // Compute the series representation of Hypergeometric1F0 taken from
151
+ // http://functions.wolfram.com/HypergeometricFunctions/Hypergeometric1F0/06/01/01/
152
+ // and also see the corresponding section for the power function (i.e. x^a).
153
+ // There are no checks on input range or parameter boundaries.
154
+
155
+ using si_type = typename boost::multiprecision::detail::canonical<int, T>::type;
156
+
157
+ BOOST_MP_ASSERT(&H1F0 != &x);
158
+ BOOST_MP_ASSERT(&H1F0 != &a);
159
+
160
+ T x_pow_n_div_n_fact(x);
161
+ T pochham_a(a);
162
+ T ap(a);
163
+
164
+ eval_multiply(H1F0, pochham_a, x_pow_n_div_n_fact);
165
+ eval_add(H1F0, si_type(1));
166
+ T lim;
167
+ eval_ldexp(lim, H1F0, 1 - boost::multiprecision::detail::digits2<number<T, et_on> >::value());
168
+ if (eval_get_sign(lim) < 0)
169
+ lim.negate();
170
+
171
+ si_type n;
172
+ T term, part;
173
+
174
+ const si_type series_limit =
175
+ boost::multiprecision::detail::digits2<number<T, et_on> >::value() < 100
176
+ ? 100
177
+ : boost::multiprecision::detail::digits2<number<T, et_on> >::value();
178
+ // Series expansion of hyperg_1f0(a; ; x).
179
+ for (n = 2; n < series_limit; n++)
180
+ {
181
+ eval_multiply(x_pow_n_div_n_fact, x);
182
+ eval_divide(x_pow_n_div_n_fact, n);
183
+ eval_increment(ap);
184
+ eval_multiply(pochham_a, ap);
185
+ eval_multiply(term, pochham_a, x_pow_n_div_n_fact);
186
+ eval_add(H1F0, term);
187
+ if (eval_get_sign(term) < 0)
188
+ term.negate();
189
+ if (lim.compare(term) >= 0)
190
+ break;
191
+ }
192
+ if (n >= series_limit)
193
+ BOOST_MP_THROW_EXCEPTION(std::runtime_error("H1F0 failed to converge"));
194
+ }
195
+
196
+ template <class T>
197
+ void eval_exp(T& result, const T& x)
198
+ {
199
+ static_assert(number_category<T>::value == number_kind_floating_point, "The exp function is only valid for floating point types.");
200
+ if (&x == &result)
201
+ {
202
+ T temp;
203
+ eval_exp(temp, x);
204
+ result = temp;
205
+ return;
206
+ }
207
+ using ui_type = typename boost::multiprecision::detail::canonical<unsigned, T>::type;
208
+ using si_type = typename boost::multiprecision::detail::canonical<int, T>::type ;
209
+ using exp_type = typename T::exponent_type ;
210
+ using canonical_exp_type = typename boost::multiprecision::detail::canonical<exp_type, T>::type;
211
+
212
+ // Handle special arguments.
213
+ int type = eval_fpclassify(x);
214
+ bool isneg = eval_get_sign(x) < 0;
215
+ if (type == static_cast<int>(FP_NAN))
216
+ {
217
+ result = x;
218
+ errno = EDOM;
219
+ return;
220
+ }
221
+ else if (type == static_cast<int>(FP_INFINITE))
222
+ {
223
+ if (isneg)
224
+ result = ui_type(0u);
225
+ else
226
+ result = x;
227
+ return;
228
+ }
229
+ else if (type == static_cast<int>(FP_ZERO))
230
+ {
231
+ result = ui_type(1);
232
+ return;
233
+ }
234
+
235
+ // Get local copy of argument and force it to be positive.
236
+ T xx = x;
237
+ T exp_series;
238
+ if (isneg)
239
+ xx.negate();
240
+
241
+ // Check the range of the argument.
242
+ if (xx.compare(si_type(1)) <= 0)
243
+ {
244
+ //
245
+ // Use series for exp(x) - 1:
246
+ //
247
+ T lim;
248
+ BOOST_IF_CONSTEXPR(std::numeric_limits<number<T, et_on> >::is_specialized)
249
+ lim = std::numeric_limits<number<T, et_on> >::epsilon().backend();
250
+ else
251
+ {
252
+ result = ui_type(1);
253
+ eval_ldexp(lim, result, 1 - boost::multiprecision::detail::digits2<number<T, et_on> >::value());
254
+ }
255
+ unsigned k = 2;
256
+ exp_series = xx;
257
+ result = si_type(1);
258
+ if (isneg)
259
+ eval_subtract(result, exp_series);
260
+ else
261
+ eval_add(result, exp_series);
262
+ eval_multiply(exp_series, xx);
263
+ eval_divide(exp_series, ui_type(k));
264
+ eval_add(result, exp_series);
265
+ while (exp_series.compare(lim) > 0)
266
+ {
267
+ ++k;
268
+ eval_multiply(exp_series, xx);
269
+ eval_divide(exp_series, ui_type(k));
270
+ if (isneg && (k & 1))
271
+ eval_subtract(result, exp_series);
272
+ else
273
+ eval_add(result, exp_series);
274
+ }
275
+ return;
276
+ }
277
+
278
+ // Check for pure-integer arguments which can be either signed or unsigned.
279
+ typename boost::multiprecision::detail::canonical<std::intmax_t, T>::type ll;
280
+ eval_trunc(exp_series, x);
281
+ eval_convert_to(&ll, exp_series);
282
+ if (x.compare(ll) == 0)
283
+ {
284
+ detail::pow_imp(result, get_constant_e<T>(), ll, std::integral_constant<bool, true>());
285
+ return;
286
+ }
287
+ else if (exp_series.compare(x) == 0)
288
+ {
289
+ // We have a value that has no fractional part, but is too large to fit
290
+ // in a long long, in this situation the code below will fail, so
291
+ // we're just going to assume that this will overflow:
292
+ if (isneg)
293
+ result = ui_type(0);
294
+ else
295
+ result = std::numeric_limits<number<T> >::has_infinity ? std::numeric_limits<number<T> >::infinity().backend() : (std::numeric_limits<number<T> >::max)().backend();
296
+ return;
297
+ }
298
+
299
+ // The algorithm for exp has been taken from MPFUN.
300
+ // exp(t) = [ (1 + r + r^2/2! + r^3/3! + r^4/4! ...)^p2 ] * 2^n
301
+ // where p2 is a power of 2 such as 2048, r = t_prime / p2, and
302
+ // t_prime = t - n*ln2, with n chosen to minimize the absolute
303
+ // value of t_prime. In the resulting Taylor series, which is
304
+ // implemented as a hypergeometric function, |r| is bounded by
305
+ // ln2 / p2. For small arguments, no scaling is done.
306
+
307
+ // Compute the exponential series of the (possibly) scaled argument.
308
+
309
+ eval_divide(result, xx, get_constant_ln2<T>());
310
+ exp_type n;
311
+ eval_convert_to(&n, result);
312
+
313
+ if (n == (std::numeric_limits<exp_type>::max)())
314
+ {
315
+ // Exponent is too large to fit in our exponent type:
316
+ if (isneg)
317
+ result = ui_type(0);
318
+ else
319
+ result = std::numeric_limits<number<T> >::has_infinity ? std::numeric_limits<number<T> >::infinity().backend() : (std::numeric_limits<number<T> >::max)().backend();
320
+ return;
321
+ }
322
+
323
+ // The scaling is 2^11 = 2048.
324
+ const si_type p2 = static_cast<si_type>(si_type(1) << 11);
325
+
326
+ eval_multiply(exp_series, get_constant_ln2<T>(), static_cast<canonical_exp_type>(n));
327
+ eval_subtract(exp_series, xx);
328
+ eval_divide(exp_series, p2);
329
+ exp_series.negate();
330
+ hyp0F0(result, exp_series);
331
+
332
+ detail::pow_imp(exp_series, result, p2, std::integral_constant<bool, true>());
333
+ result = ui_type(1);
334
+ eval_ldexp(result, result, n);
335
+ eval_multiply(exp_series, result);
336
+
337
+ if (isneg)
338
+ eval_divide(result, ui_type(1), exp_series);
339
+ else
340
+ result = exp_series;
341
+ }
342
+
343
+ template <class T>
344
+ void eval_log(T& result, const T& arg)
345
+ {
346
+ static_assert(number_category<T>::value == number_kind_floating_point, "The log function is only valid for floating point types.");
347
+ //
348
+ // We use a variation of http://dlmf.nist.gov/4.45#i
349
+ // using frexp to reduce the argument to x * 2^n,
350
+ // then let y = x - 1 and compute:
351
+ // log(x) = log(2) * n + log1p(1 + y)
352
+ //
353
+ using ui_type = typename boost::multiprecision::detail::canonical<unsigned, T>::type;
354
+ using exp_type = typename T::exponent_type ;
355
+ using canonical_exp_type = typename boost::multiprecision::detail::canonical<exp_type, T>::type;
356
+ using fp_type = typename std::tuple_element<0, typename T::float_types>::type ;
357
+ int s = eval_signbit(arg);
358
+ switch (eval_fpclassify(arg))
359
+ {
360
+ case FP_NAN:
361
+ result = arg;
362
+ errno = EDOM;
363
+ return;
364
+ case FP_INFINITE:
365
+ if (s)
366
+ break;
367
+ result = arg;
368
+ return;
369
+ case FP_ZERO:
370
+ result = std::numeric_limits<number<T> >::has_infinity ? std::numeric_limits<number<T> >::infinity().backend() : (std::numeric_limits<number<T> >::max)().backend();
371
+ result.negate();
372
+ errno = ERANGE;
373
+ return;
374
+ }
375
+ if (s)
376
+ {
377
+ result = std::numeric_limits<number<T> >::quiet_NaN().backend();
378
+ errno = EDOM;
379
+ return;
380
+ }
381
+
382
+ exp_type e;
383
+ T t;
384
+ eval_frexp(t, arg, &e);
385
+ bool alternate = false;
386
+
387
+ if (t.compare(fp_type(2) / fp_type(3)) <= 0)
388
+ {
389
+ alternate = true;
390
+ eval_ldexp(t, t, 1);
391
+ --e;
392
+ }
393
+
394
+ eval_multiply(result, get_constant_ln2<T>(), canonical_exp_type(e));
395
+ INSTRUMENT_BACKEND(result);
396
+ eval_subtract(t, ui_type(1)); /* -0.3 <= t <= 0.3 */
397
+ if (!alternate)
398
+ t.negate(); /* 0 <= t <= 0.33333 */
399
+ T pow = t;
400
+ T lim;
401
+ T t2;
402
+
403
+ if (alternate)
404
+ eval_add(result, t);
405
+ else
406
+ eval_subtract(result, t);
407
+
408
+ BOOST_IF_CONSTEXPR(std::numeric_limits<number<T, et_on> >::is_specialized)
409
+ eval_multiply(lim, result, std::numeric_limits<number<T, et_on> >::epsilon().backend());
410
+ else
411
+ eval_ldexp(lim, result, 1 - boost::multiprecision::detail::digits2<number<T, et_on> >::value());
412
+ if (eval_get_sign(lim) < 0)
413
+ lim.negate();
414
+ INSTRUMENT_BACKEND(lim);
415
+
416
+ ui_type k = 1;
417
+ do
418
+ {
419
+ ++k;
420
+ eval_multiply(pow, t);
421
+ eval_divide(t2, pow, k);
422
+ INSTRUMENT_BACKEND(t2);
423
+ if (alternate && ((k & 1) != 0))
424
+ eval_add(result, t2);
425
+ else
426
+ eval_subtract(result, t2);
427
+ INSTRUMENT_BACKEND(result);
428
+ } while (lim.compare(t2) < 0);
429
+ }
430
+
431
+ template <class T>
432
+ const T& get_constant_log10()
433
+ {
434
+ static BOOST_MP_THREAD_LOCAL T result;
435
+ static BOOST_MP_THREAD_LOCAL long digits = 0;
436
+ if ((digits != boost::multiprecision::detail::digits2<number<T> >::value()))
437
+ {
438
+ using ui_type = typename boost::multiprecision::detail::canonical<unsigned, T>::type;
439
+ T ten;
440
+ ten = ui_type(10u);
441
+ eval_log(result, ten);
442
+ digits = boost::multiprecision::detail::digits2<number<T> >::value();
443
+ }
444
+
445
+ return result;
446
+ }
447
+
448
+ template <class T>
449
+ void eval_log10(T& result, const T& arg)
450
+ {
451
+ static_assert(number_category<T>::value == number_kind_floating_point, "The log10 function is only valid for floating point types.");
452
+ eval_log(result, arg);
453
+ eval_divide(result, get_constant_log10<T>());
454
+ }
455
+
456
+ template <class R, class T>
457
+ inline void eval_log2(R& result, const T& a)
458
+ {
459
+ eval_log(result, a);
460
+ eval_divide(result, get_constant_ln2<R>());
461
+ }
462
+
463
+ template <typename T>
464
+ inline void eval_pow(T& result, const T& x, const T& a)
465
+ {
466
+ static_assert(number_category<T>::value == number_kind_floating_point, "The pow function is only valid for floating point types.");
467
+ using si_type = typename boost::multiprecision::detail::canonical<int, T>::type;
468
+ using fp_type = typename std::tuple_element<0, typename T::float_types>::type ;
469
+
470
+ if ((&result == &x) || (&result == &a))
471
+ {
472
+ T t;
473
+ eval_pow(t, x, a);
474
+ result = t;
475
+ return;
476
+ }
477
+
478
+ if ((a.compare(si_type(1)) == 0) || (x.compare(si_type(1)) == 0))
479
+ {
480
+ result = x;
481
+ return;
482
+ }
483
+ if (a.compare(si_type(0)) == 0)
484
+ {
485
+ result = si_type(1);
486
+ return;
487
+ }
488
+
489
+ int type = eval_fpclassify(x);
490
+
491
+ switch (type)
492
+ {
493
+ case FP_ZERO:
494
+ switch (eval_fpclassify(a))
495
+ {
496
+ case FP_ZERO:
497
+ result = si_type(1);
498
+ break;
499
+ case FP_NAN:
500
+ result = a;
501
+ break;
502
+ case FP_NORMAL: {
503
+ // Need to check for a an odd integer as a special case:
504
+ BOOST_MP_TRY
505
+ {
506
+ typename boost::multiprecision::detail::canonical<std::intmax_t, T>::type i;
507
+ eval_convert_to(&i, a);
508
+ if (a.compare(i) == 0)
509
+ {
510
+ if (eval_signbit(a))
511
+ {
512
+ if (i & 1)
513
+ {
514
+ result = std::numeric_limits<number<T> >::infinity().backend();
515
+ if (eval_signbit(x))
516
+ result.negate();
517
+ errno = ERANGE;
518
+ }
519
+ else
520
+ {
521
+ result = std::numeric_limits<number<T> >::infinity().backend();
522
+ errno = ERANGE;
523
+ }
524
+ }
525
+ else if (i & 1)
526
+ {
527
+ result = x;
528
+ }
529
+ else
530
+ result = si_type(0);
531
+ return;
532
+ }
533
+ }
534
+ BOOST_MP_CATCH(const std::exception&)
535
+ {
536
+ // fallthrough..
537
+ }
538
+ BOOST_MP_CATCH_END
539
+ BOOST_FALLTHROUGH;
540
+ }
541
+ default:
542
+ if (eval_signbit(a))
543
+ {
544
+ result = std::numeric_limits<number<T> >::infinity().backend();
545
+ errno = ERANGE;
546
+ }
547
+ else
548
+ result = x;
549
+ break;
550
+ }
551
+ return;
552
+ case FP_NAN:
553
+ result = x;
554
+ errno = ERANGE;
555
+ return;
556
+ default:;
557
+ }
558
+
559
+ int s = eval_get_sign(a);
560
+ if (s == 0)
561
+ {
562
+ result = si_type(1);
563
+ return;
564
+ }
565
+
566
+ if (s < 0)
567
+ {
568
+ T t, da;
569
+ t = a;
570
+ t.negate();
571
+ eval_pow(da, x, t);
572
+ eval_divide(result, si_type(1), da);
573
+ return;
574
+ }
575
+
576
+ typename boost::multiprecision::detail::canonical<std::intmax_t, T>::type an;
577
+ typename boost::multiprecision::detail::canonical<std::intmax_t, T>::type max_an =
578
+ std::numeric_limits<typename boost::multiprecision::detail::canonical<std::intmax_t, T>::type>::is_specialized ? (std::numeric_limits<typename boost::multiprecision::detail::canonical<std::intmax_t, T>::type>::max)() : static_cast<typename boost::multiprecision::detail::canonical<std::intmax_t, T>::type>(1) << (sizeof(typename boost::multiprecision::detail::canonical<std::intmax_t, T>::type) * CHAR_BIT - 2);
579
+ typename boost::multiprecision::detail::canonical<std::intmax_t, T>::type min_an =
580
+ std::numeric_limits<typename boost::multiprecision::detail::canonical<std::intmax_t, T>::type>::is_specialized ? (std::numeric_limits<typename boost::multiprecision::detail::canonical<std::intmax_t, T>::type>::min)() : -min_an;
581
+
582
+ T fa;
583
+ BOOST_MP_TRY
584
+ {
585
+ eval_convert_to(&an, a);
586
+ if (a.compare(an) == 0)
587
+ {
588
+ detail::pow_imp(result, x, an, std::integral_constant<bool, true>());
589
+ return;
590
+ }
591
+ }
592
+ BOOST_MP_CATCH(const std::exception&)
593
+ {
594
+ // conversion failed, just fall through, value is not an integer.
595
+ an = (std::numeric_limits<std::intmax_t>::max)();
596
+ }
597
+ BOOST_MP_CATCH_END
598
+ if ((eval_get_sign(x) < 0))
599
+ {
600
+ typename boost::multiprecision::detail::canonical<std::uintmax_t, T>::type aun;
601
+ BOOST_MP_TRY
602
+ {
603
+ eval_convert_to(&aun, a);
604
+ if (a.compare(aun) == 0)
605
+ {
606
+ fa = x;
607
+ fa.negate();
608
+ eval_pow(result, fa, a);
609
+ if (aun & 1u)
610
+ result.negate();
611
+ return;
612
+ }
613
+ }
614
+ BOOST_MP_CATCH(const std::exception&)
615
+ {
616
+ // conversion failed, just fall through, value is not an integer.
617
+ }
618
+ BOOST_MP_CATCH_END
619
+
620
+ eval_floor(result, a);
621
+ // -1^INF is a special case in C99:
622
+ if ((x.compare(si_type(-1)) == 0) && (eval_fpclassify(a) == FP_INFINITE))
623
+ {
624
+ result = si_type(1);
625
+ }
626
+ else if (a.compare(result) == 0)
627
+ {
628
+ // exponent is so large we have no fractional part:
629
+ if (x.compare(si_type(-1)) < 0)
630
+ {
631
+ result = std::numeric_limits<number<T, et_on> >::infinity().backend();
632
+ }
633
+ else
634
+ {
635
+ result = si_type(0);
636
+ }
637
+ }
638
+ else if (type == FP_INFINITE)
639
+ {
640
+ result = std::numeric_limits<number<T, et_on> >::infinity().backend();
641
+ }
642
+ else BOOST_IF_CONSTEXPR (std::numeric_limits<number<T, et_on> >::has_quiet_NaN)
643
+ {
644
+ result = std::numeric_limits<number<T, et_on> >::quiet_NaN().backend();
645
+ errno = EDOM;
646
+ }
647
+ else
648
+ {
649
+ BOOST_MP_THROW_EXCEPTION(std::domain_error("Result of pow is undefined or non-real and there is no NaN for this number type."));
650
+ }
651
+ return;
652
+ }
653
+
654
+ T t, da;
655
+
656
+ eval_subtract(da, a, an);
657
+
658
+ if ((x.compare(fp_type(0.5)) >= 0) && (x.compare(fp_type(0.9)) < 0) && (an < max_an) && (an > min_an))
659
+ {
660
+ if (a.compare(fp_type(1e-5f)) <= 0)
661
+ {
662
+ // Series expansion for small a.
663
+ eval_log(t, x);
664
+ eval_multiply(t, a);
665
+ hyp0F0(result, t);
666
+ return;
667
+ }
668
+ else
669
+ {
670
+ // Series expansion for moderately sized x. Note that for large power of a,
671
+ // the power of the integer part of a is calculated using the pown function.
672
+ if (an)
673
+ {
674
+ da.negate();
675
+ t = si_type(1);
676
+ eval_subtract(t, x);
677
+ hyp1F0(result, da, t);
678
+ detail::pow_imp(t, x, an, std::integral_constant<bool, true>());
679
+ eval_multiply(result, t);
680
+ }
681
+ else
682
+ {
683
+ da = a;
684
+ da.negate();
685
+ t = si_type(1);
686
+ eval_subtract(t, x);
687
+ hyp1F0(result, da, t);
688
+ }
689
+ }
690
+ }
691
+ else
692
+ {
693
+ // Series expansion for pow(x, a). Note that for large power of a, the power
694
+ // of the integer part of a is calculated using the pown function.
695
+ if (an)
696
+ {
697
+ eval_log(t, x);
698
+ eval_multiply(t, da);
699
+ eval_exp(result, t);
700
+ detail::pow_imp(t, x, an, std::integral_constant<bool, true>());
701
+ eval_multiply(result, t);
702
+ }
703
+ else
704
+ {
705
+ eval_log(t, x);
706
+ eval_multiply(t, a);
707
+ eval_exp(result, t);
708
+ }
709
+ }
710
+ }
711
+
712
+ template <class T, class A>
713
+ #if BOOST_WORKAROUND(BOOST_MSVC, < 1800)
714
+ inline typename std::enable_if<!boost::multiprecision::detail::is_integral<A>::value, void>::type
715
+ #else
716
+ inline typename std::enable_if<is_compatible_arithmetic_type<A, number<T> >::value && !boost::multiprecision::detail::is_integral<A>::value, void>::type
717
+ #endif
718
+ eval_pow(T& result, const T& x, const A& a)
719
+ {
720
+ // Note this one is restricted to float arguments since pow.hpp already has a version for
721
+ // integer powers....
722
+ using canonical_type = typename boost::multiprecision::detail::canonical<A, T>::type ;
723
+ using cast_type = typename std::conditional<std::is_same<A, canonical_type>::value, T, canonical_type>::type;
724
+ cast_type c;
725
+ c = a;
726
+ eval_pow(result, x, c);
727
+ }
728
+
729
+ template <class T, class A>
730
+ #if BOOST_WORKAROUND(BOOST_MSVC, < 1800)
731
+ inline void
732
+ #else
733
+ inline typename std::enable_if<is_compatible_arithmetic_type<A, number<T> >::value, void>::type
734
+ #endif
735
+ eval_pow(T& result, const A& x, const T& a)
736
+ {
737
+ using canonical_type = typename boost::multiprecision::detail::canonical<A, T>::type ;
738
+ using cast_type = typename std::conditional<std::is_same<A, canonical_type>::value, T, canonical_type>::type;
739
+ cast_type c;
740
+ c = x;
741
+ eval_pow(result, c, a);
742
+ }
743
+
744
+ template <class T>
745
+ void eval_exp2(T& result, const T& arg)
746
+ {
747
+ static_assert(number_category<T>::value == number_kind_floating_point, "The log function is only valid for floating point types.");
748
+
749
+ // Check for pure-integer arguments which can be either signed or unsigned.
750
+ typename boost::multiprecision::detail::canonical<typename T::exponent_type, T>::type i;
751
+ T temp;
752
+ BOOST_MP_TRY
753
+ {
754
+ eval_trunc(temp, arg);
755
+ eval_convert_to(&i, temp);
756
+ if (arg.compare(i) == 0)
757
+ {
758
+ temp = static_cast<typename std::tuple_element<0, typename T::unsigned_types>::type>(1u);
759
+ eval_ldexp(result, temp, i);
760
+ return;
761
+ }
762
+ }
763
+ #ifdef BOOST_MP_MATH_AVAILABLE
764
+ BOOST_MP_CATCH(const boost::math::rounding_error&)
765
+ { /* Fallthrough */
766
+ }
767
+ #endif
768
+ BOOST_MP_CATCH(const std::runtime_error&)
769
+ { /* Fallthrough */
770
+ }
771
+ BOOST_MP_CATCH_END
772
+
773
+ temp = static_cast<typename std::tuple_element<0, typename T::unsigned_types>::type>(2u);
774
+ eval_pow(result, temp, arg);
775
+ }
776
+
777
+ namespace detail {
778
+
779
+ template <class T>
780
+ void small_sinh_series(T x, T& result)
781
+ {
782
+ using ui_type = typename boost::multiprecision::detail::canonical<unsigned, T>::type;
783
+ bool neg = eval_get_sign(x) < 0;
784
+ if (neg)
785
+ x.negate();
786
+ T p(x);
787
+ T mult(x);
788
+ eval_multiply(mult, x);
789
+ result = x;
790
+ ui_type k = 1;
791
+
792
+ T lim(x);
793
+ eval_ldexp(lim, lim, 1 - boost::multiprecision::detail::digits2<number<T, et_on> >::value());
794
+
795
+ do
796
+ {
797
+ eval_multiply(p, mult);
798
+ eval_divide(p, ++k);
799
+ eval_divide(p, ++k);
800
+ eval_add(result, p);
801
+ } while (p.compare(lim) >= 0);
802
+ if (neg)
803
+ result.negate();
804
+ }
805
+
806
+ template <class T>
807
+ void sinhcosh(const T& x, T* p_sinh, T* p_cosh)
808
+ {
809
+ using ui_type = typename boost::multiprecision::detail::canonical<unsigned, T>::type;
810
+ using fp_type = typename std::tuple_element<0, typename T::float_types>::type ;
811
+
812
+ switch (eval_fpclassify(x))
813
+ {
814
+ case FP_NAN:
815
+ errno = EDOM;
816
+ // fallthrough...
817
+ case FP_INFINITE:
818
+ if (p_sinh)
819
+ *p_sinh = x;
820
+ if (p_cosh)
821
+ {
822
+ *p_cosh = x;
823
+ if (eval_get_sign(x) < 0)
824
+ p_cosh->negate();
825
+ }
826
+ return;
827
+ case FP_ZERO:
828
+ if (p_sinh)
829
+ *p_sinh = x;
830
+ if (p_cosh)
831
+ *p_cosh = ui_type(1);
832
+ return;
833
+ default:;
834
+ }
835
+
836
+ bool small_sinh = eval_get_sign(x) < 0 ? x.compare(fp_type(-0.5)) > 0 : x.compare(fp_type(0.5)) < 0;
837
+
838
+ if (p_cosh || !small_sinh)
839
+ {
840
+ T e_px, e_mx;
841
+ eval_exp(e_px, x);
842
+ eval_divide(e_mx, ui_type(1), e_px);
843
+ if (eval_signbit(e_mx) != eval_signbit(e_px))
844
+ e_mx.negate(); // Handles lack of signed zero in some types
845
+
846
+ if (p_sinh)
847
+ {
848
+ if (small_sinh)
849
+ {
850
+ small_sinh_series(x, *p_sinh);
851
+ }
852
+ else
853
+ {
854
+ eval_subtract(*p_sinh, e_px, e_mx);
855
+ eval_ldexp(*p_sinh, *p_sinh, -1);
856
+ }
857
+ }
858
+ if (p_cosh)
859
+ {
860
+ eval_add(*p_cosh, e_px, e_mx);
861
+ eval_ldexp(*p_cosh, *p_cosh, -1);
862
+ }
863
+ }
864
+ else
865
+ {
866
+ small_sinh_series(x, *p_sinh);
867
+ }
868
+ }
869
+
870
+ } // namespace detail
871
+
872
+ template <class T>
873
+ inline void eval_sinh(T& result, const T& x)
874
+ {
875
+ static_assert(number_category<T>::value == number_kind_floating_point, "The sinh function is only valid for floating point types.");
876
+ detail::sinhcosh(x, &result, static_cast<T*>(0));
877
+ }
878
+
879
+ template <class T>
880
+ inline void eval_cosh(T& result, const T& x)
881
+ {
882
+ static_assert(number_category<T>::value == number_kind_floating_point, "The cosh function is only valid for floating point types.");
883
+ detail::sinhcosh(x, static_cast<T*>(0), &result);
884
+ }
885
+
886
+ template <class T>
887
+ inline void eval_tanh(T& result, const T& x)
888
+ {
889
+ static_assert(number_category<T>::value == number_kind_floating_point, "The tanh function is only valid for floating point types.");
890
+ T c;
891
+ detail::sinhcosh(x, &result, &c);
892
+ if ((eval_fpclassify(result) == FP_INFINITE) && (eval_fpclassify(c) == FP_INFINITE))
893
+ {
894
+ bool s = eval_signbit(result) != eval_signbit(c);
895
+ result = static_cast<typename std::tuple_element<0, typename T::unsigned_types>::type>(1u);
896
+ if (s)
897
+ result.negate();
898
+ return;
899
+ }
900
+ eval_divide(result, c);
901
+ }
902
+
903
+ #ifdef BOOST_MSVC
904
+ #pragma warning(pop)
905
+ #endif