mqt-core 3.3.2__cp314-cp314t-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (537) hide show
  1. mqt/core/__init__.py +89 -0
  2. mqt/core/__main__.py +55 -0
  3. mqt/core/_commands.py +52 -0
  4. mqt/core/_compat/__init__.py +11 -0
  5. mqt/core/_compat/typing.py +29 -0
  6. mqt/core/_version.py +34 -0
  7. mqt/core/_version.pyi +12 -0
  8. mqt/core/bin/mqt-core-algorithms.dll +0 -0
  9. mqt/core/bin/mqt-core-circuit-optimizer.dll +0 -0
  10. mqt/core/bin/mqt-core-dd.dll +0 -0
  11. mqt/core/bin/mqt-core-ds.dll +0 -0
  12. mqt/core/bin/mqt-core-fomac.dll +0 -0
  13. mqt/core/bin/mqt-core-ir.dll +0 -0
  14. mqt/core/bin/mqt-core-na-fomac.dll +0 -0
  15. mqt/core/bin/mqt-core-na.dll +0 -0
  16. mqt/core/bin/mqt-core-qasm.dll +0 -0
  17. mqt/core/bin/mqt-core-qdmi-driver.dll +0 -0
  18. mqt/core/bin/mqt-core-qdmi-na-device.dll +0 -0
  19. mqt/core/bin/mqt-core-zx.dll +0 -0
  20. mqt/core/dd.cp314t-win_amd64.pyd +0 -0
  21. mqt/core/dd.pyi +1016 -0
  22. mqt/core/dd_evaluation.py +368 -0
  23. mqt/core/fomac.cp314t-win_amd64.pyd +0 -0
  24. mqt/core/fomac.pyi +125 -0
  25. mqt/core/include/mqt-core/algorithms/BernsteinVazirani.hpp +39 -0
  26. mqt/core/include/mqt-core/algorithms/GHZState.hpp +18 -0
  27. mqt/core/include/mqt-core/algorithms/Grover.hpp +33 -0
  28. mqt/core/include/mqt-core/algorithms/QFT.hpp +21 -0
  29. mqt/core/include/mqt-core/algorithms/QPE.hpp +30 -0
  30. mqt/core/include/mqt-core/algorithms/RandomCliffordCircuit.hpp +22 -0
  31. mqt/core/include/mqt-core/algorithms/StatePreparation.hpp +43 -0
  32. mqt/core/include/mqt-core/algorithms/WState.hpp +18 -0
  33. mqt/core/include/mqt-core/algorithms/mqt_core_algorithms_export.h +43 -0
  34. mqt/core/include/mqt-core/boost/config/abi/borland_prefix.hpp +27 -0
  35. mqt/core/include/mqt-core/boost/config/abi/borland_suffix.hpp +12 -0
  36. mqt/core/include/mqt-core/boost/config/abi/msvc_prefix.hpp +22 -0
  37. mqt/core/include/mqt-core/boost/config/abi/msvc_suffix.hpp +8 -0
  38. mqt/core/include/mqt-core/boost/config/abi_prefix.hpp +25 -0
  39. mqt/core/include/mqt-core/boost/config/abi_suffix.hpp +25 -0
  40. mqt/core/include/mqt-core/boost/config/assert_cxx03.hpp +211 -0
  41. mqt/core/include/mqt-core/boost/config/assert_cxx11.hpp +212 -0
  42. mqt/core/include/mqt-core/boost/config/assert_cxx14.hpp +47 -0
  43. mqt/core/include/mqt-core/boost/config/assert_cxx17.hpp +65 -0
  44. mqt/core/include/mqt-core/boost/config/assert_cxx20.hpp +59 -0
  45. mqt/core/include/mqt-core/boost/config/assert_cxx23.hpp +41 -0
  46. mqt/core/include/mqt-core/boost/config/assert_cxx98.hpp +23 -0
  47. mqt/core/include/mqt-core/boost/config/auto_link.hpp +525 -0
  48. mqt/core/include/mqt-core/boost/config/compiler/borland.hpp +342 -0
  49. mqt/core/include/mqt-core/boost/config/compiler/clang.hpp +370 -0
  50. mqt/core/include/mqt-core/boost/config/compiler/clang_version.hpp +89 -0
  51. mqt/core/include/mqt-core/boost/config/compiler/codegear.hpp +389 -0
  52. mqt/core/include/mqt-core/boost/config/compiler/comeau.hpp +59 -0
  53. mqt/core/include/mqt-core/boost/config/compiler/common_edg.hpp +185 -0
  54. mqt/core/include/mqt-core/boost/config/compiler/compaq_cxx.hpp +19 -0
  55. mqt/core/include/mqt-core/boost/config/compiler/cray.hpp +446 -0
  56. mqt/core/include/mqt-core/boost/config/compiler/diab.hpp +26 -0
  57. mqt/core/include/mqt-core/boost/config/compiler/digitalmars.hpp +146 -0
  58. mqt/core/include/mqt-core/boost/config/compiler/gcc.hpp +386 -0
  59. mqt/core/include/mqt-core/boost/config/compiler/gcc_xml.hpp +115 -0
  60. mqt/core/include/mqt-core/boost/config/compiler/greenhills.hpp +28 -0
  61. mqt/core/include/mqt-core/boost/config/compiler/hp_acc.hpp +153 -0
  62. mqt/core/include/mqt-core/boost/config/compiler/intel.hpp +577 -0
  63. mqt/core/include/mqt-core/boost/config/compiler/kai.hpp +33 -0
  64. mqt/core/include/mqt-core/boost/config/compiler/metrowerks.hpp +201 -0
  65. mqt/core/include/mqt-core/boost/config/compiler/mpw.hpp +143 -0
  66. mqt/core/include/mqt-core/boost/config/compiler/nvcc.hpp +64 -0
  67. mqt/core/include/mqt-core/boost/config/compiler/pathscale.hpp +141 -0
  68. mqt/core/include/mqt-core/boost/config/compiler/pgi.hpp +23 -0
  69. mqt/core/include/mqt-core/boost/config/compiler/sgi_mipspro.hpp +29 -0
  70. mqt/core/include/mqt-core/boost/config/compiler/sunpro_cc.hpp +225 -0
  71. mqt/core/include/mqt-core/boost/config/compiler/vacpp.hpp +189 -0
  72. mqt/core/include/mqt-core/boost/config/compiler/visualc.hpp +398 -0
  73. mqt/core/include/mqt-core/boost/config/compiler/xlcpp.hpp +303 -0
  74. mqt/core/include/mqt-core/boost/config/compiler/xlcpp_zos.hpp +174 -0
  75. mqt/core/include/mqt-core/boost/config/detail/cxx_composite.hpp +218 -0
  76. mqt/core/include/mqt-core/boost/config/detail/posix_features.hpp +95 -0
  77. mqt/core/include/mqt-core/boost/config/detail/select_compiler_config.hpp +157 -0
  78. mqt/core/include/mqt-core/boost/config/detail/select_platform_config.hpp +147 -0
  79. mqt/core/include/mqt-core/boost/config/detail/select_stdlib_config.hpp +121 -0
  80. mqt/core/include/mqt-core/boost/config/detail/suffix.hpp +1334 -0
  81. mqt/core/include/mqt-core/boost/config/header_deprecated.hpp +26 -0
  82. mqt/core/include/mqt-core/boost/config/helper_macros.hpp +37 -0
  83. mqt/core/include/mqt-core/boost/config/no_tr1/cmath.hpp +28 -0
  84. mqt/core/include/mqt-core/boost/config/no_tr1/complex.hpp +28 -0
  85. mqt/core/include/mqt-core/boost/config/no_tr1/functional.hpp +28 -0
  86. mqt/core/include/mqt-core/boost/config/no_tr1/memory.hpp +28 -0
  87. mqt/core/include/mqt-core/boost/config/no_tr1/utility.hpp +28 -0
  88. mqt/core/include/mqt-core/boost/config/platform/aix.hpp +33 -0
  89. mqt/core/include/mqt-core/boost/config/platform/amigaos.hpp +15 -0
  90. mqt/core/include/mqt-core/boost/config/platform/beos.hpp +26 -0
  91. mqt/core/include/mqt-core/boost/config/platform/bsd.hpp +83 -0
  92. mqt/core/include/mqt-core/boost/config/platform/cloudabi.hpp +18 -0
  93. mqt/core/include/mqt-core/boost/config/platform/cray.hpp +18 -0
  94. mqt/core/include/mqt-core/boost/config/platform/cygwin.hpp +71 -0
  95. mqt/core/include/mqt-core/boost/config/platform/haiku.hpp +31 -0
  96. mqt/core/include/mqt-core/boost/config/platform/hpux.hpp +87 -0
  97. mqt/core/include/mqt-core/boost/config/platform/irix.hpp +31 -0
  98. mqt/core/include/mqt-core/boost/config/platform/linux.hpp +106 -0
  99. mqt/core/include/mqt-core/boost/config/platform/macos.hpp +87 -0
  100. mqt/core/include/mqt-core/boost/config/platform/qnxnto.hpp +31 -0
  101. mqt/core/include/mqt-core/boost/config/platform/solaris.hpp +31 -0
  102. mqt/core/include/mqt-core/boost/config/platform/symbian.hpp +97 -0
  103. mqt/core/include/mqt-core/boost/config/platform/vms.hpp +25 -0
  104. mqt/core/include/mqt-core/boost/config/platform/vxworks.hpp +422 -0
  105. mqt/core/include/mqt-core/boost/config/platform/wasm.hpp +23 -0
  106. mqt/core/include/mqt-core/boost/config/platform/win32.hpp +90 -0
  107. mqt/core/include/mqt-core/boost/config/platform/zos.hpp +32 -0
  108. mqt/core/include/mqt-core/boost/config/pragma_message.hpp +31 -0
  109. mqt/core/include/mqt-core/boost/config/requires_threads.hpp +92 -0
  110. mqt/core/include/mqt-core/boost/config/stdlib/dinkumware.hpp +324 -0
  111. mqt/core/include/mqt-core/boost/config/stdlib/libcomo.hpp +93 -0
  112. mqt/core/include/mqt-core/boost/config/stdlib/libcpp.hpp +180 -0
  113. mqt/core/include/mqt-core/boost/config/stdlib/libstdcpp3.hpp +482 -0
  114. mqt/core/include/mqt-core/boost/config/stdlib/modena.hpp +79 -0
  115. mqt/core/include/mqt-core/boost/config/stdlib/msl.hpp +98 -0
  116. mqt/core/include/mqt-core/boost/config/stdlib/roguewave.hpp +208 -0
  117. mqt/core/include/mqt-core/boost/config/stdlib/sgi.hpp +168 -0
  118. mqt/core/include/mqt-core/boost/config/stdlib/stlport.hpp +258 -0
  119. mqt/core/include/mqt-core/boost/config/stdlib/vacpp.hpp +74 -0
  120. mqt/core/include/mqt-core/boost/config/stdlib/xlcpp_zos.hpp +61 -0
  121. mqt/core/include/mqt-core/boost/config/user.hpp +133 -0
  122. mqt/core/include/mqt-core/boost/config/warning_disable.hpp +47 -0
  123. mqt/core/include/mqt-core/boost/config/workaround.hpp +305 -0
  124. mqt/core/include/mqt-core/boost/config.hpp +67 -0
  125. mqt/core/include/mqt-core/boost/cstdint.hpp +556 -0
  126. mqt/core/include/mqt-core/boost/cxx11_char_types.hpp +70 -0
  127. mqt/core/include/mqt-core/boost/detail/workaround.hpp +10 -0
  128. mqt/core/include/mqt-core/boost/limits.hpp +146 -0
  129. mqt/core/include/mqt-core/boost/multiprecision/complex128.hpp +24 -0
  130. mqt/core/include/mqt-core/boost/multiprecision/complex_adaptor.hpp +1046 -0
  131. mqt/core/include/mqt-core/boost/multiprecision/concepts/mp_number_archetypes.hpp +257 -0
  132. mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float/io.hpp +698 -0
  133. mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float/transcendental.hpp +157 -0
  134. mqt/core/include/mqt-core/boost/multiprecision/cpp_bin_float.hpp +2297 -0
  135. mqt/core/include/mqt-core/boost/multiprecision/cpp_complex.hpp +12 -0
  136. mqt/core/include/mqt-core/boost/multiprecision/cpp_dec_float.hpp +3690 -0
  137. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/add.hpp +368 -0
  138. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/add_unsigned.hpp +387 -0
  139. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/bitwise.hpp +889 -0
  140. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/checked.hpp +178 -0
  141. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/comparison.hpp +374 -0
  142. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/cpp_int_config.hpp +161 -0
  143. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/divide.hpp +703 -0
  144. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/import_export.hpp +248 -0
  145. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/intel_intrinsics.hpp +138 -0
  146. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/limits.hpp +282 -0
  147. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/literals.hpp +295 -0
  148. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/misc.hpp +1457 -0
  149. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/multiply.hpp +848 -0
  150. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/serialize.hpp +211 -0
  151. mqt/core/include/mqt-core/boost/multiprecision/cpp_int/value_pack.hpp +42 -0
  152. mqt/core/include/mqt-core/boost/multiprecision/cpp_int.hpp +2360 -0
  153. mqt/core/include/mqt-core/boost/multiprecision/debug_adaptor.hpp +760 -0
  154. mqt/core/include/mqt-core/boost/multiprecision/detail/assert.hpp +29 -0
  155. mqt/core/include/mqt-core/boost/multiprecision/detail/atomic.hpp +62 -0
  156. mqt/core/include/mqt-core/boost/multiprecision/detail/bitscan.hpp +317 -0
  157. mqt/core/include/mqt-core/boost/multiprecision/detail/check_cpp11_config.hpp +64 -0
  158. mqt/core/include/mqt-core/boost/multiprecision/detail/constexpr.hpp +88 -0
  159. mqt/core/include/mqt-core/boost/multiprecision/detail/default_ops.hpp +4052 -0
  160. mqt/core/include/mqt-core/boost/multiprecision/detail/digits.hpp +49 -0
  161. mqt/core/include/mqt-core/boost/multiprecision/detail/dynamic_array.hpp +44 -0
  162. mqt/core/include/mqt-core/boost/multiprecision/detail/empty_value.hpp +87 -0
  163. mqt/core/include/mqt-core/boost/multiprecision/detail/endian.hpp +35 -0
  164. mqt/core/include/mqt-core/boost/multiprecision/detail/et_ops.hpp +1831 -0
  165. mqt/core/include/mqt-core/boost/multiprecision/detail/float128_functions.hpp +95 -0
  166. mqt/core/include/mqt-core/boost/multiprecision/detail/float_string_cvt.hpp +333 -0
  167. mqt/core/include/mqt-core/boost/multiprecision/detail/fpclassify.hpp +101 -0
  168. mqt/core/include/mqt-core/boost/multiprecision/detail/functions/constants.hpp +288 -0
  169. mqt/core/include/mqt-core/boost/multiprecision/detail/functions/pow.hpp +905 -0
  170. mqt/core/include/mqt-core/boost/multiprecision/detail/functions/trig.hpp +1058 -0
  171. mqt/core/include/mqt-core/boost/multiprecision/detail/functions/trunc.hpp +82 -0
  172. mqt/core/include/mqt-core/boost/multiprecision/detail/generic_interconvert.hpp +687 -0
  173. mqt/core/include/mqt-core/boost/multiprecision/detail/hash.hpp +56 -0
  174. mqt/core/include/mqt-core/boost/multiprecision/detail/integer_ops.hpp +474 -0
  175. mqt/core/include/mqt-core/boost/multiprecision/detail/itos.hpp +39 -0
  176. mqt/core/include/mqt-core/boost/multiprecision/detail/min_max.hpp +106 -0
  177. mqt/core/include/mqt-core/boost/multiprecision/detail/no_et_ops.hpp +661 -0
  178. mqt/core/include/mqt-core/boost/multiprecision/detail/no_exceptions_support.hpp +55 -0
  179. mqt/core/include/mqt-core/boost/multiprecision/detail/number_base.hpp +1656 -0
  180. mqt/core/include/mqt-core/boost/multiprecision/detail/number_compare.hpp +848 -0
  181. mqt/core/include/mqt-core/boost/multiprecision/detail/precision.hpp +313 -0
  182. mqt/core/include/mqt-core/boost/multiprecision/detail/rebind.hpp +19 -0
  183. mqt/core/include/mqt-core/boost/multiprecision/detail/standalone_config.hpp +148 -0
  184. mqt/core/include/mqt-core/boost/multiprecision/detail/static_array.hpp +42 -0
  185. mqt/core/include/mqt-core/boost/multiprecision/detail/string_helpers.hpp +48 -0
  186. mqt/core/include/mqt-core/boost/multiprecision/detail/tables.hpp +80 -0
  187. mqt/core/include/mqt-core/boost/multiprecision/detail/ublas_interop.hpp +75 -0
  188. mqt/core/include/mqt-core/boost/multiprecision/detail/uniform_int_distribution.hpp +212 -0
  189. mqt/core/include/mqt-core/boost/multiprecision/detail/utype_helper.hpp +374 -0
  190. mqt/core/include/mqt-core/boost/multiprecision/eigen.hpp +248 -0
  191. mqt/core/include/mqt-core/boost/multiprecision/float128.hpp +920 -0
  192. mqt/core/include/mqt-core/boost/multiprecision/fwd.hpp +268 -0
  193. mqt/core/include/mqt-core/boost/multiprecision/gmp.hpp +4060 -0
  194. mqt/core/include/mqt-core/boost/multiprecision/integer.hpp +363 -0
  195. mqt/core/include/mqt-core/boost/multiprecision/logged_adaptor.hpp +834 -0
  196. mqt/core/include/mqt-core/boost/multiprecision/miller_rabin.hpp +221 -0
  197. mqt/core/include/mqt-core/boost/multiprecision/mpc.hpp +1721 -0
  198. mqt/core/include/mqt-core/boost/multiprecision/mpfi.hpp +2559 -0
  199. mqt/core/include/mqt-core/boost/multiprecision/mpfr.hpp +3644 -0
  200. mqt/core/include/mqt-core/boost/multiprecision/number.hpp +2500 -0
  201. mqt/core/include/mqt-core/boost/multiprecision/random.hpp +23 -0
  202. mqt/core/include/mqt-core/boost/multiprecision/rational_adaptor.hpp +1289 -0
  203. mqt/core/include/mqt-core/boost/multiprecision/tommath.hpp +1034 -0
  204. mqt/core/include/mqt-core/boost/multiprecision/traits/explicit_conversion.hpp +67 -0
  205. mqt/core/include/mqt-core/boost/multiprecision/traits/extract_exponent_type.hpp +28 -0
  206. mqt/core/include/mqt-core/boost/multiprecision/traits/is_backend.hpp +91 -0
  207. mqt/core/include/mqt-core/boost/multiprecision/traits/is_byte_container.hpp +51 -0
  208. mqt/core/include/mqt-core/boost/multiprecision/traits/is_complex.hpp +22 -0
  209. mqt/core/include/mqt-core/boost/multiprecision/traits/is_convertible_arithmetic.hpp +51 -0
  210. mqt/core/include/mqt-core/boost/multiprecision/traits/is_restricted_conversion.hpp +47 -0
  211. mqt/core/include/mqt-core/boost/multiprecision/traits/is_variable_precision.hpp +25 -0
  212. mqt/core/include/mqt-core/boost/multiprecision/traits/max_digits10.hpp +79 -0
  213. mqt/core/include/mqt-core/boost/multiprecision/traits/std_integer_traits.hpp +90 -0
  214. mqt/core/include/mqt-core/boost/multiprecision/traits/transcendental_reduction_type.hpp +21 -0
  215. mqt/core/include/mqt-core/boost/version.hpp +32 -0
  216. mqt/core/include/mqt-core/circuit_optimizer/CircuitOptimizer.hpp +119 -0
  217. mqt/core/include/mqt-core/circuit_optimizer/mqt_core_circuit_optimizer_export.h +43 -0
  218. mqt/core/include/mqt-core/datastructures/DirectedAcyclicGraph.hpp +117 -0
  219. mqt/core/include/mqt-core/datastructures/DirectedGraph.hpp +158 -0
  220. mqt/core/include/mqt-core/datastructures/DisjointSet.hpp +50 -0
  221. mqt/core/include/mqt-core/datastructures/Layer.hpp +172 -0
  222. mqt/core/include/mqt-core/datastructures/SymmetricMatrix.hpp +57 -0
  223. mqt/core/include/mqt-core/datastructures/UndirectedGraph.hpp +227 -0
  224. mqt/core/include/mqt-core/datastructures/mqt_core_ds_export.h +43 -0
  225. mqt/core/include/mqt-core/dd/Approximation.hpp +45 -0
  226. mqt/core/include/mqt-core/dd/CachedEdge.hpp +174 -0
  227. mqt/core/include/mqt-core/dd/Complex.hpp +165 -0
  228. mqt/core/include/mqt-core/dd/ComplexNumbers.hpp +150 -0
  229. mqt/core/include/mqt-core/dd/ComplexValue.hpp +184 -0
  230. mqt/core/include/mqt-core/dd/ComputeTable.hpp +183 -0
  231. mqt/core/include/mqt-core/dd/DDDefinitions.hpp +139 -0
  232. mqt/core/include/mqt-core/dd/DDpackageConfig.hpp +104 -0
  233. mqt/core/include/mqt-core/dd/DensityNoiseTable.hpp +114 -0
  234. mqt/core/include/mqt-core/dd/Edge.hpp +416 -0
  235. mqt/core/include/mqt-core/dd/Export.hpp +438 -0
  236. mqt/core/include/mqt-core/dd/FunctionalityConstruction.hpp +75 -0
  237. mqt/core/include/mqt-core/dd/GateMatrixDefinitions.hpp +43 -0
  238. mqt/core/include/mqt-core/dd/LinkedListBase.hpp +45 -0
  239. mqt/core/include/mqt-core/dd/MemoryManager.hpp +193 -0
  240. mqt/core/include/mqt-core/dd/Node.hpp +223 -0
  241. mqt/core/include/mqt-core/dd/NoiseFunctionality.hpp +144 -0
  242. mqt/core/include/mqt-core/dd/Operations.hpp +306 -0
  243. mqt/core/include/mqt-core/dd/Package.hpp +2036 -0
  244. mqt/core/include/mqt-core/dd/Package_fwd.hpp +22 -0
  245. mqt/core/include/mqt-core/dd/RealNumber.hpp +255 -0
  246. mqt/core/include/mqt-core/dd/RealNumberUniqueTable.hpp +217 -0
  247. mqt/core/include/mqt-core/dd/Simulation.hpp +98 -0
  248. mqt/core/include/mqt-core/dd/StateGeneration.hpp +143 -0
  249. mqt/core/include/mqt-core/dd/StochasticNoiseOperationTable.hpp +88 -0
  250. mqt/core/include/mqt-core/dd/UnaryComputeTable.hpp +121 -0
  251. mqt/core/include/mqt-core/dd/UniqueTable.hpp +243 -0
  252. mqt/core/include/mqt-core/dd/mqt_core_dd_export.h +43 -0
  253. mqt/core/include/mqt-core/dd/statistics/MemoryManagerStatistics.hpp +84 -0
  254. mqt/core/include/mqt-core/dd/statistics/PackageStatistics.hpp +55 -0
  255. mqt/core/include/mqt-core/dd/statistics/Statistics.hpp +48 -0
  256. mqt/core/include/mqt-core/dd/statistics/TableStatistics.hpp +79 -0
  257. mqt/core/include/mqt-core/dd/statistics/UniqueTableStatistics.hpp +31 -0
  258. mqt/core/include/mqt-core/fomac/FoMaC.hpp +568 -0
  259. mqt/core/include/mqt-core/ir/Definitions.hpp +108 -0
  260. mqt/core/include/mqt-core/ir/Permutation.hpp +213 -0
  261. mqt/core/include/mqt-core/ir/QuantumComputation.hpp +596 -0
  262. mqt/core/include/mqt-core/ir/Register.hpp +125 -0
  263. mqt/core/include/mqt-core/ir/mqt_core_ir_export.h +43 -0
  264. mqt/core/include/mqt-core/ir/operations/AodOperation.hpp +92 -0
  265. mqt/core/include/mqt-core/ir/operations/CompoundOperation.hpp +212 -0
  266. mqt/core/include/mqt-core/ir/operations/Control.hpp +142 -0
  267. mqt/core/include/mqt-core/ir/operations/Expression.hpp +847 -0
  268. mqt/core/include/mqt-core/ir/operations/IfElseOperation.hpp +169 -0
  269. mqt/core/include/mqt-core/ir/operations/NonUnitaryOperation.hpp +118 -0
  270. mqt/core/include/mqt-core/ir/operations/OpType.hpp +120 -0
  271. mqt/core/include/mqt-core/ir/operations/OpType.inc +76 -0
  272. mqt/core/include/mqt-core/ir/operations/Operation.hpp +247 -0
  273. mqt/core/include/mqt-core/ir/operations/StandardOperation.hpp +140 -0
  274. mqt/core/include/mqt-core/ir/operations/SymbolicOperation.hpp +144 -0
  275. mqt/core/include/mqt-core/mqt_na_qdmi/device.h +602 -0
  276. mqt/core/include/mqt-core/mqt_na_qdmi/types.h +78 -0
  277. mqt/core/include/mqt-core/na/NAComputation.hpp +185 -0
  278. mqt/core/include/mqt-core/na/device/Device.hpp +410 -0
  279. mqt/core/include/mqt-core/na/device/DeviceMemberInitializers.hpp +724 -0
  280. mqt/core/include/mqt-core/na/device/Generator.hpp +447 -0
  281. mqt/core/include/mqt-core/na/entities/Atom.hpp +62 -0
  282. mqt/core/include/mqt-core/na/entities/Location.hpp +154 -0
  283. mqt/core/include/mqt-core/na/entities/Zone.hpp +95 -0
  284. mqt/core/include/mqt-core/na/fomac/Device.hpp +169 -0
  285. mqt/core/include/mqt-core/na/mqt_core_na_export.h +43 -0
  286. mqt/core/include/mqt-core/na/operations/GlobalCZOp.hpp +38 -0
  287. mqt/core/include/mqt-core/na/operations/GlobalOp.hpp +58 -0
  288. mqt/core/include/mqt-core/na/operations/GlobalRYOp.hpp +42 -0
  289. mqt/core/include/mqt-core/na/operations/LoadOp.hpp +89 -0
  290. mqt/core/include/mqt-core/na/operations/LocalOp.hpp +56 -0
  291. mqt/core/include/mqt-core/na/operations/LocalRZOp.hpp +42 -0
  292. mqt/core/include/mqt-core/na/operations/LocalUOp.hpp +49 -0
  293. mqt/core/include/mqt-core/na/operations/MoveOp.hpp +66 -0
  294. mqt/core/include/mqt-core/na/operations/Op.hpp +62 -0
  295. mqt/core/include/mqt-core/na/operations/ShuttlingOp.hpp +51 -0
  296. mqt/core/include/mqt-core/na/operations/StoreOp.hpp +87 -0
  297. mqt/core/include/mqt-core/qasm3/Exception.hpp +85 -0
  298. mqt/core/include/mqt-core/qasm3/Gate.hpp +65 -0
  299. mqt/core/include/mqt-core/qasm3/Importer.hpp +192 -0
  300. mqt/core/include/mqt-core/qasm3/InstVisitor.hpp +145 -0
  301. mqt/core/include/mqt-core/qasm3/NestedEnvironment.hpp +41 -0
  302. mqt/core/include/mqt-core/qasm3/Parser.hpp +170 -0
  303. mqt/core/include/mqt-core/qasm3/Scanner.hpp +73 -0
  304. mqt/core/include/mqt-core/qasm3/Statement.hpp +486 -0
  305. mqt/core/include/mqt-core/qasm3/Statement_fwd.hpp +39 -0
  306. mqt/core/include/mqt-core/qasm3/StdGates.hpp +232 -0
  307. mqt/core/include/mqt-core/qasm3/Token.hpp +198 -0
  308. mqt/core/include/mqt-core/qasm3/Types.hpp +238 -0
  309. mqt/core/include/mqt-core/qasm3/Types_fwd.hpp +22 -0
  310. mqt/core/include/mqt-core/qasm3/mqt_core_qasm_export.h +43 -0
  311. mqt/core/include/mqt-core/qasm3/passes/CompilerPass.hpp +22 -0
  312. mqt/core/include/mqt-core/qasm3/passes/ConstEvalPass.hpp +102 -0
  313. mqt/core/include/mqt-core/qasm3/passes/TypeCheckPass.hpp +124 -0
  314. mqt/core/include/mqt-core/qdmi/Driver.hpp +431 -0
  315. mqt/core/include/mqt-core/zx/FunctionalityConstruction.hpp +125 -0
  316. mqt/core/include/mqt-core/zx/Rational.hpp +318 -0
  317. mqt/core/include/mqt-core/zx/Rules.hpp +132 -0
  318. mqt/core/include/mqt-core/zx/Simplify.hpp +182 -0
  319. mqt/core/include/mqt-core/zx/Utils.hpp +212 -0
  320. mqt/core/include/mqt-core/zx/ZXDefinitions.hpp +93 -0
  321. mqt/core/include/mqt-core/zx/ZXDiagram.hpp +480 -0
  322. mqt/core/include/mqt-core/zx/mqt_core_zx_export.h +43 -0
  323. mqt/core/include/nlohmann/adl_serializer.hpp +55 -0
  324. mqt/core/include/nlohmann/byte_container_with_subtype.hpp +103 -0
  325. mqt/core/include/nlohmann/detail/abi_macros.hpp +111 -0
  326. mqt/core/include/nlohmann/detail/conversions/from_json.hpp +577 -0
  327. mqt/core/include/nlohmann/detail/conversions/to_chars.hpp +1118 -0
  328. mqt/core/include/nlohmann/detail/conversions/to_json.hpp +479 -0
  329. mqt/core/include/nlohmann/detail/exceptions.hpp +291 -0
  330. mqt/core/include/nlohmann/detail/hash.hpp +129 -0
  331. mqt/core/include/nlohmann/detail/input/binary_reader.hpp +3068 -0
  332. mqt/core/include/nlohmann/detail/input/input_adapters.hpp +549 -0
  333. mqt/core/include/nlohmann/detail/input/json_sax.hpp +986 -0
  334. mqt/core/include/nlohmann/detail/input/lexer.hpp +1643 -0
  335. mqt/core/include/nlohmann/detail/input/parser.hpp +519 -0
  336. mqt/core/include/nlohmann/detail/input/position_t.hpp +37 -0
  337. mqt/core/include/nlohmann/detail/iterators/internal_iterator.hpp +35 -0
  338. mqt/core/include/nlohmann/detail/iterators/iter_impl.hpp +760 -0
  339. mqt/core/include/nlohmann/detail/iterators/iteration_proxy.hpp +235 -0
  340. mqt/core/include/nlohmann/detail/iterators/iterator_traits.hpp +61 -0
  341. mqt/core/include/nlohmann/detail/iterators/json_reverse_iterator.hpp +130 -0
  342. mqt/core/include/nlohmann/detail/iterators/primitive_iterator.hpp +132 -0
  343. mqt/core/include/nlohmann/detail/json_custom_base_class.hpp +39 -0
  344. mqt/core/include/nlohmann/detail/json_pointer.hpp +988 -0
  345. mqt/core/include/nlohmann/detail/json_ref.hpp +78 -0
  346. mqt/core/include/nlohmann/detail/macro_scope.hpp +595 -0
  347. mqt/core/include/nlohmann/detail/macro_unscope.hpp +46 -0
  348. mqt/core/include/nlohmann/detail/meta/call_std/begin.hpp +17 -0
  349. mqt/core/include/nlohmann/detail/meta/call_std/end.hpp +17 -0
  350. mqt/core/include/nlohmann/detail/meta/cpp_future.hpp +171 -0
  351. mqt/core/include/nlohmann/detail/meta/detected.hpp +70 -0
  352. mqt/core/include/nlohmann/detail/meta/identity_tag.hpp +21 -0
  353. mqt/core/include/nlohmann/detail/meta/is_sax.hpp +159 -0
  354. mqt/core/include/nlohmann/detail/meta/std_fs.hpp +29 -0
  355. mqt/core/include/nlohmann/detail/meta/type_traits.hpp +795 -0
  356. mqt/core/include/nlohmann/detail/meta/void_t.hpp +24 -0
  357. mqt/core/include/nlohmann/detail/output/binary_writer.hpp +1850 -0
  358. mqt/core/include/nlohmann/detail/output/output_adapters.hpp +147 -0
  359. mqt/core/include/nlohmann/detail/output/serializer.hpp +988 -0
  360. mqt/core/include/nlohmann/detail/string_concat.hpp +146 -0
  361. mqt/core/include/nlohmann/detail/string_escape.hpp +72 -0
  362. mqt/core/include/nlohmann/detail/string_utils.hpp +37 -0
  363. mqt/core/include/nlohmann/detail/value_t.hpp +118 -0
  364. mqt/core/include/nlohmann/json.hpp +5306 -0
  365. mqt/core/include/nlohmann/json_fwd.hpp +75 -0
  366. mqt/core/include/nlohmann/ordered_map.hpp +359 -0
  367. mqt/core/include/nlohmann/thirdparty/hedley/hedley.hpp +2045 -0
  368. mqt/core/include/nlohmann/thirdparty/hedley/hedley_undef.hpp +158 -0
  369. mqt/core/include/qdmi/qdmi/client.h +990 -0
  370. mqt/core/include/qdmi/qdmi/constants.h +1139 -0
  371. mqt/core/include/qdmi/qdmi/device.h +602 -0
  372. mqt/core/include/qdmi/qdmi/types.h +78 -0
  373. mqt/core/include/spdlog/async.h +99 -0
  374. mqt/core/include/spdlog/async_logger-inl.h +84 -0
  375. mqt/core/include/spdlog/async_logger.h +74 -0
  376. mqt/core/include/spdlog/cfg/argv.h +40 -0
  377. mqt/core/include/spdlog/cfg/env.h +36 -0
  378. mqt/core/include/spdlog/cfg/helpers-inl.h +107 -0
  379. mqt/core/include/spdlog/cfg/helpers.h +29 -0
  380. mqt/core/include/spdlog/common-inl.h +68 -0
  381. mqt/core/include/spdlog/common.h +406 -0
  382. mqt/core/include/spdlog/details/backtracer-inl.h +63 -0
  383. mqt/core/include/spdlog/details/backtracer.h +45 -0
  384. mqt/core/include/spdlog/details/circular_q.h +115 -0
  385. mqt/core/include/spdlog/details/console_globals.h +28 -0
  386. mqt/core/include/spdlog/details/file_helper-inl.h +153 -0
  387. mqt/core/include/spdlog/details/file_helper.h +61 -0
  388. mqt/core/include/spdlog/details/fmt_helper.h +141 -0
  389. mqt/core/include/spdlog/details/log_msg-inl.h +44 -0
  390. mqt/core/include/spdlog/details/log_msg.h +40 -0
  391. mqt/core/include/spdlog/details/log_msg_buffer-inl.h +54 -0
  392. mqt/core/include/spdlog/details/log_msg_buffer.h +32 -0
  393. mqt/core/include/spdlog/details/mpmc_blocking_q.h +177 -0
  394. mqt/core/include/spdlog/details/null_mutex.h +35 -0
  395. mqt/core/include/spdlog/details/os-inl.h +606 -0
  396. mqt/core/include/spdlog/details/os.h +127 -0
  397. mqt/core/include/spdlog/details/periodic_worker-inl.h +26 -0
  398. mqt/core/include/spdlog/details/periodic_worker.h +58 -0
  399. mqt/core/include/spdlog/details/registry-inl.h +270 -0
  400. mqt/core/include/spdlog/details/registry.h +131 -0
  401. mqt/core/include/spdlog/details/synchronous_factory.h +22 -0
  402. mqt/core/include/spdlog/details/tcp_client-windows.h +135 -0
  403. mqt/core/include/spdlog/details/tcp_client.h +127 -0
  404. mqt/core/include/spdlog/details/thread_pool-inl.h +126 -0
  405. mqt/core/include/spdlog/details/thread_pool.h +117 -0
  406. mqt/core/include/spdlog/details/udp_client-windows.h +98 -0
  407. mqt/core/include/spdlog/details/udp_client.h +81 -0
  408. mqt/core/include/spdlog/details/windows_include.h +11 -0
  409. mqt/core/include/spdlog/fmt/bin_to_hex.h +224 -0
  410. mqt/core/include/spdlog/fmt/bundled/args.h +220 -0
  411. mqt/core/include/spdlog/fmt/bundled/base.h +2989 -0
  412. mqt/core/include/spdlog/fmt/bundled/chrono.h +2330 -0
  413. mqt/core/include/spdlog/fmt/bundled/color.h +637 -0
  414. mqt/core/include/spdlog/fmt/bundled/compile.h +539 -0
  415. mqt/core/include/spdlog/fmt/bundled/core.h +5 -0
  416. mqt/core/include/spdlog/fmt/bundled/fmt.license.rst +27 -0
  417. mqt/core/include/spdlog/fmt/bundled/format-inl.h +1948 -0
  418. mqt/core/include/spdlog/fmt/bundled/format.h +4244 -0
  419. mqt/core/include/spdlog/fmt/bundled/os.h +427 -0
  420. mqt/core/include/spdlog/fmt/bundled/ostream.h +167 -0
  421. mqt/core/include/spdlog/fmt/bundled/printf.h +633 -0
  422. mqt/core/include/spdlog/fmt/bundled/ranges.h +850 -0
  423. mqt/core/include/spdlog/fmt/bundled/std.h +728 -0
  424. mqt/core/include/spdlog/fmt/bundled/xchar.h +369 -0
  425. mqt/core/include/spdlog/fmt/chrono.h +23 -0
  426. mqt/core/include/spdlog/fmt/compile.h +23 -0
  427. mqt/core/include/spdlog/fmt/fmt.h +30 -0
  428. mqt/core/include/spdlog/fmt/ostr.h +23 -0
  429. mqt/core/include/spdlog/fmt/ranges.h +23 -0
  430. mqt/core/include/spdlog/fmt/std.h +24 -0
  431. mqt/core/include/spdlog/fmt/xchar.h +23 -0
  432. mqt/core/include/spdlog/formatter.h +17 -0
  433. mqt/core/include/spdlog/fwd.h +18 -0
  434. mqt/core/include/spdlog/logger-inl.h +198 -0
  435. mqt/core/include/spdlog/logger.h +379 -0
  436. mqt/core/include/spdlog/mdc.h +52 -0
  437. mqt/core/include/spdlog/pattern_formatter-inl.h +1340 -0
  438. mqt/core/include/spdlog/pattern_formatter.h +118 -0
  439. mqt/core/include/spdlog/sinks/android_sink.h +137 -0
  440. mqt/core/include/spdlog/sinks/ansicolor_sink-inl.h +142 -0
  441. mqt/core/include/spdlog/sinks/ansicolor_sink.h +116 -0
  442. mqt/core/include/spdlog/sinks/base_sink-inl.h +59 -0
  443. mqt/core/include/spdlog/sinks/base_sink.h +51 -0
  444. mqt/core/include/spdlog/sinks/basic_file_sink-inl.h +48 -0
  445. mqt/core/include/spdlog/sinks/basic_file_sink.h +66 -0
  446. mqt/core/include/spdlog/sinks/callback_sink.h +56 -0
  447. mqt/core/include/spdlog/sinks/daily_file_sink.h +254 -0
  448. mqt/core/include/spdlog/sinks/dist_sink.h +81 -0
  449. mqt/core/include/spdlog/sinks/dup_filter_sink.h +91 -0
  450. mqt/core/include/spdlog/sinks/hourly_file_sink.h +193 -0
  451. mqt/core/include/spdlog/sinks/kafka_sink.h +119 -0
  452. mqt/core/include/spdlog/sinks/mongo_sink.h +108 -0
  453. mqt/core/include/spdlog/sinks/msvc_sink.h +68 -0
  454. mqt/core/include/spdlog/sinks/null_sink.h +41 -0
  455. mqt/core/include/spdlog/sinks/ostream_sink.h +43 -0
  456. mqt/core/include/spdlog/sinks/qt_sinks.h +304 -0
  457. mqt/core/include/spdlog/sinks/ringbuffer_sink.h +67 -0
  458. mqt/core/include/spdlog/sinks/rotating_file_sink-inl.h +179 -0
  459. mqt/core/include/spdlog/sinks/rotating_file_sink.h +93 -0
  460. mqt/core/include/spdlog/sinks/sink-inl.h +22 -0
  461. mqt/core/include/spdlog/sinks/sink.h +34 -0
  462. mqt/core/include/spdlog/sinks/stdout_color_sinks-inl.h +38 -0
  463. mqt/core/include/spdlog/sinks/stdout_color_sinks.h +49 -0
  464. mqt/core/include/spdlog/sinks/stdout_sinks-inl.h +127 -0
  465. mqt/core/include/spdlog/sinks/stdout_sinks.h +84 -0
  466. mqt/core/include/spdlog/sinks/syslog_sink.h +104 -0
  467. mqt/core/include/spdlog/sinks/systemd_sink.h +121 -0
  468. mqt/core/include/spdlog/sinks/tcp_sink.h +75 -0
  469. mqt/core/include/spdlog/sinks/udp_sink.h +69 -0
  470. mqt/core/include/spdlog/sinks/win_eventlog_sink.h +260 -0
  471. mqt/core/include/spdlog/sinks/wincolor_sink-inl.h +172 -0
  472. mqt/core/include/spdlog/sinks/wincolor_sink.h +82 -0
  473. mqt/core/include/spdlog/spdlog-inl.h +96 -0
  474. mqt/core/include/spdlog/spdlog.h +357 -0
  475. mqt/core/include/spdlog/stopwatch.h +66 -0
  476. mqt/core/include/spdlog/tweakme.h +148 -0
  477. mqt/core/include/spdlog/version.h +11 -0
  478. mqt/core/ir/__init__.pyi +2078 -0
  479. mqt/core/ir/operations.pyi +1011 -0
  480. mqt/core/ir/registers.pyi +91 -0
  481. mqt/core/ir/symbolic.pyi +177 -0
  482. mqt/core/ir.cp314t-win_amd64.pyd +0 -0
  483. mqt/core/lib/mqt-core-algorithms.lib +0 -0
  484. mqt/core/lib/mqt-core-circuit-optimizer.lib +0 -0
  485. mqt/core/lib/mqt-core-dd.lib +0 -0
  486. mqt/core/lib/mqt-core-ds.lib +0 -0
  487. mqt/core/lib/mqt-core-fomac.lib +0 -0
  488. mqt/core/lib/mqt-core-ir.lib +0 -0
  489. mqt/core/lib/mqt-core-na-fomac.lib +0 -0
  490. mqt/core/lib/mqt-core-na.lib +0 -0
  491. mqt/core/lib/mqt-core-qasm.lib +0 -0
  492. mqt/core/lib/mqt-core-qdmi-driver.lib +0 -0
  493. mqt/core/lib/mqt-core-qdmi-na-device-gen.lib +0 -0
  494. mqt/core/lib/mqt-core-qdmi-na-device.lib +0 -0
  495. mqt/core/lib/mqt-core-zx.lib +0 -0
  496. mqt/core/lib/pkgconfig/spdlog.pc +13 -0
  497. mqt/core/lib/spdlog.lib +0 -0
  498. mqt/core/na/__init__.py +12 -0
  499. mqt/core/na/fomac.cp314t-win_amd64.pyd +0 -0
  500. mqt/core/na/fomac.pyi +117 -0
  501. mqt/core/nlohmann_json.natvis +278 -0
  502. mqt/core/plugins/__init__.py +9 -0
  503. mqt/core/plugins/qiskit/__init__.py +19 -0
  504. mqt/core/plugins/qiskit/mqt_to_qiskit.py +420 -0
  505. mqt/core/plugins/qiskit/qiskit_to_mqt.py +562 -0
  506. mqt/core/py.typed +2 -0
  507. mqt/core/share/cmake/mqt-core/AddMQTPythonBinding.cmake +55 -0
  508. mqt/core/share/cmake/mqt-core/Cache.cmake +33 -0
  509. mqt/core/share/cmake/mqt-core/FindGMP.cmake +103 -0
  510. mqt/core/share/cmake/mqt-core/PackageAddTest.cmake +46 -0
  511. mqt/core/share/cmake/mqt-core/PreventInSourceBuilds.cmake +25 -0
  512. mqt/core/share/cmake/mqt-core/StandardProjectSettings.cmake +87 -0
  513. mqt/core/share/cmake/mqt-core/mqt-core-config-version.cmake +85 -0
  514. mqt/core/share/cmake/mqt-core/mqt-core-config.cmake +52 -0
  515. mqt/core/share/cmake/mqt-core/mqt-core-targets-release.cmake +141 -0
  516. mqt/core/share/cmake/mqt-core/mqt-core-targets.cmake +445 -0
  517. mqt/core/share/cmake/nlohmann_json/nlohmann_jsonConfig.cmake +15 -0
  518. mqt/core/share/cmake/nlohmann_json/nlohmann_jsonConfigVersion.cmake +20 -0
  519. mqt/core/share/cmake/nlohmann_json/nlohmann_jsonTargets.cmake +110 -0
  520. mqt/core/share/cmake/qdmi/Cache.cmake +44 -0
  521. mqt/core/share/cmake/qdmi/PrefixHandling.cmake +78 -0
  522. mqt/core/share/cmake/qdmi/prefix_defs.txt +26 -0
  523. mqt/core/share/cmake/qdmi/qdmi-config-version.cmake +85 -0
  524. mqt/core/share/cmake/qdmi/qdmi-config.cmake +42 -0
  525. mqt/core/share/cmake/qdmi/qdmi-targets.cmake +129 -0
  526. mqt/core/share/cmake/spdlog/spdlogConfig.cmake +44 -0
  527. mqt/core/share/cmake/spdlog/spdlogConfigTargets-release.cmake +19 -0
  528. mqt/core/share/cmake/spdlog/spdlogConfigTargets.cmake +121 -0
  529. mqt/core/share/cmake/spdlog/spdlogConfigVersion.cmake +65 -0
  530. mqt/core/share/pkgconfig/nlohmann_json.pc +7 -0
  531. mqt_core-3.3.2.dist-info/DELVEWHEEL +2 -0
  532. mqt_core-3.3.2.dist-info/METADATA +210 -0
  533. mqt_core-3.3.2.dist-info/RECORD +537 -0
  534. mqt_core-3.3.2.dist-info/WHEEL +5 -0
  535. mqt_core-3.3.2.dist-info/entry_points.txt +4 -0
  536. mqt_core-3.3.2.dist-info/licenses/LICENSE.md +22 -0
  537. mqt_core.libs/msvcp140.dll +0 -0
@@ -0,0 +1,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