sequenzo 0.1.31__cp310-cp310-macosx_10_9_x86_64.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 (299) hide show
  1. _sequenzo_fastcluster.cpython-310-darwin.so +0 -0
  2. sequenzo/__init__.py +349 -0
  3. sequenzo/big_data/__init__.py +12 -0
  4. sequenzo/big_data/clara/__init__.py +26 -0
  5. sequenzo/big_data/clara/clara.py +476 -0
  6. sequenzo/big_data/clara/utils/__init__.py +27 -0
  7. sequenzo/big_data/clara/utils/aggregatecases.py +92 -0
  8. sequenzo/big_data/clara/utils/davies_bouldin.py +91 -0
  9. sequenzo/big_data/clara/utils/get_weighted_diss.cpython-310-darwin.so +0 -0
  10. sequenzo/big_data/clara/utils/wfcmdd.py +205 -0
  11. sequenzo/big_data/clara/visualization.py +88 -0
  12. sequenzo/clustering/KMedoids.py +178 -0
  13. sequenzo/clustering/__init__.py +30 -0
  14. sequenzo/clustering/clustering_c_code.cpython-310-darwin.so +0 -0
  15. sequenzo/clustering/hierarchical_clustering.py +1256 -0
  16. sequenzo/clustering/sequenzo_fastcluster/fastcluster.py +495 -0
  17. sequenzo/clustering/sequenzo_fastcluster/src/fastcluster.cpp +1877 -0
  18. sequenzo/clustering/sequenzo_fastcluster/src/fastcluster_python.cpp +1264 -0
  19. sequenzo/clustering/src/KMedoid.cpp +263 -0
  20. sequenzo/clustering/src/PAM.cpp +237 -0
  21. sequenzo/clustering/src/PAMonce.cpp +265 -0
  22. sequenzo/clustering/src/cluster_quality.cpp +496 -0
  23. sequenzo/clustering/src/cluster_quality.h +128 -0
  24. sequenzo/clustering/src/cluster_quality_backup.cpp +570 -0
  25. sequenzo/clustering/src/module.cpp +228 -0
  26. sequenzo/clustering/src/weightedinertia.cpp +111 -0
  27. sequenzo/clustering/utils/__init__.py +27 -0
  28. sequenzo/clustering/utils/disscenter.py +122 -0
  29. sequenzo/data_preprocessing/__init__.py +22 -0
  30. sequenzo/data_preprocessing/helpers.py +303 -0
  31. sequenzo/datasets/__init__.py +41 -0
  32. sequenzo/datasets/biofam.csv +2001 -0
  33. sequenzo/datasets/biofam_child_domain.csv +2001 -0
  34. sequenzo/datasets/biofam_left_domain.csv +2001 -0
  35. sequenzo/datasets/biofam_married_domain.csv +2001 -0
  36. sequenzo/datasets/chinese_colonial_territories.csv +12 -0
  37. sequenzo/datasets/country_co2_emissions.csv +194 -0
  38. sequenzo/datasets/country_co2_emissions_global_deciles.csv +195 -0
  39. sequenzo/datasets/country_co2_emissions_global_quintiles.csv +195 -0
  40. sequenzo/datasets/country_co2_emissions_local_deciles.csv +195 -0
  41. sequenzo/datasets/country_co2_emissions_local_quintiles.csv +195 -0
  42. sequenzo/datasets/country_gdp_per_capita.csv +194 -0
  43. sequenzo/datasets/dyadic_children.csv +61 -0
  44. sequenzo/datasets/dyadic_parents.csv +61 -0
  45. sequenzo/datasets/mvad.csv +713 -0
  46. sequenzo/datasets/pairfam_activity_by_month.csv +1028 -0
  47. sequenzo/datasets/pairfam_activity_by_year.csv +1028 -0
  48. sequenzo/datasets/pairfam_family_by_month.csv +1028 -0
  49. sequenzo/datasets/pairfam_family_by_year.csv +1028 -0
  50. sequenzo/datasets/political_science_aid_shock.csv +166 -0
  51. sequenzo/datasets/political_science_donor_fragmentation.csv +157 -0
  52. sequenzo/define_sequence_data.py +1400 -0
  53. sequenzo/dissimilarity_measures/__init__.py +31 -0
  54. sequenzo/dissimilarity_measures/c_code.cpython-310-darwin.so +0 -0
  55. sequenzo/dissimilarity_measures/get_distance_matrix.py +762 -0
  56. sequenzo/dissimilarity_measures/get_substitution_cost_matrix.py +246 -0
  57. sequenzo/dissimilarity_measures/src/DHDdistance.cpp +148 -0
  58. sequenzo/dissimilarity_measures/src/LCPdistance.cpp +114 -0
  59. sequenzo/dissimilarity_measures/src/LCPspellDistance.cpp +215 -0
  60. sequenzo/dissimilarity_measures/src/OMdistance.cpp +247 -0
  61. sequenzo/dissimilarity_measures/src/OMspellDistance.cpp +281 -0
  62. sequenzo/dissimilarity_measures/src/__init__.py +0 -0
  63. sequenzo/dissimilarity_measures/src/dist2matrix.cpp +63 -0
  64. sequenzo/dissimilarity_measures/src/dp_utils.h +160 -0
  65. sequenzo/dissimilarity_measures/src/module.cpp +40 -0
  66. sequenzo/dissimilarity_measures/src/setup.py +30 -0
  67. sequenzo/dissimilarity_measures/src/utils.h +25 -0
  68. sequenzo/dissimilarity_measures/src/xsimd/.github/cmake-test/main.cpp +6 -0
  69. sequenzo/dissimilarity_measures/src/xsimd/benchmark/main.cpp +159 -0
  70. sequenzo/dissimilarity_measures/src/xsimd/benchmark/xsimd_benchmark.hpp +565 -0
  71. sequenzo/dissimilarity_measures/src/xsimd/docs/source/conf.py +37 -0
  72. sequenzo/dissimilarity_measures/src/xsimd/examples/mandelbrot.cpp +330 -0
  73. sequenzo/dissimilarity_measures/src/xsimd/examples/pico_bench.hpp +246 -0
  74. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_arithmetic.hpp +266 -0
  75. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_complex.hpp +112 -0
  76. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_details.hpp +323 -0
  77. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_logical.hpp +218 -0
  78. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_math.hpp +2583 -0
  79. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_memory.hpp +880 -0
  80. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_rounding.hpp +72 -0
  81. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_swizzle.hpp +174 -0
  82. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_trigo.hpp +978 -0
  83. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx.hpp +1924 -0
  84. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx2.hpp +1144 -0
  85. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512bw.hpp +656 -0
  86. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512cd.hpp +28 -0
  87. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512dq.hpp +244 -0
  88. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512er.hpp +20 -0
  89. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512f.hpp +2650 -0
  90. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512ifma.hpp +20 -0
  91. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512pf.hpp +20 -0
  92. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512vbmi.hpp +77 -0
  93. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512vbmi2.hpp +131 -0
  94. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512vnni_avx512bw.hpp +20 -0
  95. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512vnni_avx512vbmi2.hpp +20 -0
  96. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avxvnni.hpp +20 -0
  97. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_common.hpp +24 -0
  98. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_common_fwd.hpp +77 -0
  99. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_constants.hpp +393 -0
  100. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_emulated.hpp +788 -0
  101. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_fma3_avx.hpp +93 -0
  102. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_fma3_avx2.hpp +46 -0
  103. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_fma3_sse.hpp +97 -0
  104. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_fma4.hpp +92 -0
  105. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_i8mm_neon64.hpp +17 -0
  106. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_isa.hpp +142 -0
  107. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_neon.hpp +3142 -0
  108. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_neon64.hpp +1543 -0
  109. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_rvv.hpp +1513 -0
  110. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_scalar.hpp +1260 -0
  111. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_sse2.hpp +2024 -0
  112. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_sse3.hpp +67 -0
  113. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_sse4_1.hpp +339 -0
  114. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_sse4_2.hpp +44 -0
  115. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_ssse3.hpp +186 -0
  116. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_sve.hpp +1155 -0
  117. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_vsx.hpp +892 -0
  118. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_wasm.hpp +1780 -0
  119. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/config/xsimd_arch.hpp +240 -0
  120. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/config/xsimd_config.hpp +484 -0
  121. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/config/xsimd_cpuid.hpp +269 -0
  122. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/config/xsimd_inline.hpp +27 -0
  123. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/math/xsimd_rem_pio2.hpp +719 -0
  124. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/memory/xsimd_aligned_allocator.hpp +349 -0
  125. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/memory/xsimd_alignment.hpp +91 -0
  126. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_all_registers.hpp +55 -0
  127. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_api.hpp +2765 -0
  128. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx2_register.hpp +44 -0
  129. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512bw_register.hpp +51 -0
  130. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512cd_register.hpp +51 -0
  131. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512dq_register.hpp +51 -0
  132. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512er_register.hpp +51 -0
  133. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512f_register.hpp +77 -0
  134. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512ifma_register.hpp +51 -0
  135. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512pf_register.hpp +51 -0
  136. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512vbmi2_register.hpp +51 -0
  137. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512vbmi_register.hpp +51 -0
  138. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512vnni_avx512bw_register.hpp +54 -0
  139. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512vnni_avx512vbmi2_register.hpp +53 -0
  140. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx_register.hpp +64 -0
  141. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avxvnni_register.hpp +44 -0
  142. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_batch.hpp +1524 -0
  143. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_batch_constant.hpp +300 -0
  144. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_common_arch.hpp +47 -0
  145. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_emulated_register.hpp +80 -0
  146. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_fma3_avx2_register.hpp +50 -0
  147. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_fma3_avx_register.hpp +50 -0
  148. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_fma3_sse_register.hpp +50 -0
  149. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_fma4_register.hpp +50 -0
  150. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_i8mm_neon64_register.hpp +55 -0
  151. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_neon64_register.hpp +55 -0
  152. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_neon_register.hpp +154 -0
  153. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_register.hpp +94 -0
  154. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_rvv_register.hpp +506 -0
  155. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_sse2_register.hpp +59 -0
  156. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_sse3_register.hpp +49 -0
  157. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_sse4_1_register.hpp +48 -0
  158. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_sse4_2_register.hpp +48 -0
  159. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_ssse3_register.hpp +48 -0
  160. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_sve_register.hpp +156 -0
  161. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_traits.hpp +337 -0
  162. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_utils.hpp +536 -0
  163. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_vsx_register.hpp +77 -0
  164. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_wasm_register.hpp +59 -0
  165. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/xsimd.hpp +75 -0
  166. sequenzo/dissimilarity_measures/src/xsimd/test/architectures/dummy.cpp +7 -0
  167. sequenzo/dissimilarity_measures/src/xsimd/test/doc/explicit_use_of_an_instruction_set.cpp +13 -0
  168. sequenzo/dissimilarity_measures/src/xsimd/test/doc/explicit_use_of_an_instruction_set_mean.cpp +24 -0
  169. sequenzo/dissimilarity_measures/src/xsimd/test/doc/explicit_use_of_an_instruction_set_mean_aligned.cpp +25 -0
  170. sequenzo/dissimilarity_measures/src/xsimd/test/doc/explicit_use_of_an_instruction_set_mean_arch_independent.cpp +28 -0
  171. sequenzo/dissimilarity_measures/src/xsimd/test/doc/explicit_use_of_an_instruction_set_mean_tag_dispatch.cpp +25 -0
  172. sequenzo/dissimilarity_measures/src/xsimd/test/doc/manipulating_abstract_batches.cpp +7 -0
  173. sequenzo/dissimilarity_measures/src/xsimd/test/doc/manipulating_parametric_batches.cpp +8 -0
  174. sequenzo/dissimilarity_measures/src/xsimd/test/doc/sum.hpp +31 -0
  175. sequenzo/dissimilarity_measures/src/xsimd/test/doc/sum_avx2.cpp +3 -0
  176. sequenzo/dissimilarity_measures/src/xsimd/test/doc/sum_sse2.cpp +3 -0
  177. sequenzo/dissimilarity_measures/src/xsimd/test/doc/writing_vectorized_code.cpp +11 -0
  178. sequenzo/dissimilarity_measures/src/xsimd/test/main.cpp +31 -0
  179. sequenzo/dissimilarity_measures/src/xsimd/test/test_api.cpp +230 -0
  180. sequenzo/dissimilarity_measures/src/xsimd/test/test_arch.cpp +217 -0
  181. sequenzo/dissimilarity_measures/src/xsimd/test/test_basic_math.cpp +183 -0
  182. sequenzo/dissimilarity_measures/src/xsimd/test/test_batch.cpp +1049 -0
  183. sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_bool.cpp +508 -0
  184. sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_cast.cpp +409 -0
  185. sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_complex.cpp +712 -0
  186. sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_constant.cpp +286 -0
  187. sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_float.cpp +141 -0
  188. sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_int.cpp +365 -0
  189. sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_manip.cpp +308 -0
  190. sequenzo/dissimilarity_measures/src/xsimd/test/test_bitwise_cast.cpp +222 -0
  191. sequenzo/dissimilarity_measures/src/xsimd/test/test_complex_exponential.cpp +226 -0
  192. sequenzo/dissimilarity_measures/src/xsimd/test/test_complex_hyperbolic.cpp +183 -0
  193. sequenzo/dissimilarity_measures/src/xsimd/test/test_complex_power.cpp +265 -0
  194. sequenzo/dissimilarity_measures/src/xsimd/test/test_complex_trigonometric.cpp +236 -0
  195. sequenzo/dissimilarity_measures/src/xsimd/test/test_conversion.cpp +248 -0
  196. sequenzo/dissimilarity_measures/src/xsimd/test/test_custom_default_arch.cpp +28 -0
  197. sequenzo/dissimilarity_measures/src/xsimd/test/test_error_gamma.cpp +170 -0
  198. sequenzo/dissimilarity_measures/src/xsimd/test/test_explicit_batch_instantiation.cpp +32 -0
  199. sequenzo/dissimilarity_measures/src/xsimd/test/test_exponential.cpp +202 -0
  200. sequenzo/dissimilarity_measures/src/xsimd/test/test_extract_pair.cpp +92 -0
  201. sequenzo/dissimilarity_measures/src/xsimd/test/test_fp_manipulation.cpp +77 -0
  202. sequenzo/dissimilarity_measures/src/xsimd/test/test_gnu_source.cpp +30 -0
  203. sequenzo/dissimilarity_measures/src/xsimd/test/test_hyperbolic.cpp +167 -0
  204. sequenzo/dissimilarity_measures/src/xsimd/test/test_load_store.cpp +304 -0
  205. sequenzo/dissimilarity_measures/src/xsimd/test/test_memory.cpp +61 -0
  206. sequenzo/dissimilarity_measures/src/xsimd/test/test_poly_evaluation.cpp +64 -0
  207. sequenzo/dissimilarity_measures/src/xsimd/test/test_power.cpp +184 -0
  208. sequenzo/dissimilarity_measures/src/xsimd/test/test_rounding.cpp +199 -0
  209. sequenzo/dissimilarity_measures/src/xsimd/test/test_select.cpp +101 -0
  210. sequenzo/dissimilarity_measures/src/xsimd/test/test_shuffle.cpp +760 -0
  211. sequenzo/dissimilarity_measures/src/xsimd/test/test_sum.cpp +4 -0
  212. sequenzo/dissimilarity_measures/src/xsimd/test/test_sum.hpp +34 -0
  213. sequenzo/dissimilarity_measures/src/xsimd/test/test_traits.cpp +172 -0
  214. sequenzo/dissimilarity_measures/src/xsimd/test/test_trigonometric.cpp +208 -0
  215. sequenzo/dissimilarity_measures/src/xsimd/test/test_utils.hpp +611 -0
  216. sequenzo/dissimilarity_measures/src/xsimd/test/test_wasm/test_wasm_playwright.py +123 -0
  217. sequenzo/dissimilarity_measures/src/xsimd/test/test_xsimd_api.cpp +1460 -0
  218. sequenzo/dissimilarity_measures/utils/__init__.py +16 -0
  219. sequenzo/dissimilarity_measures/utils/get_LCP_length_for_2_seq.py +44 -0
  220. sequenzo/dissimilarity_measures/utils/get_sm_trate_substitution_cost_matrix.cpython-310-darwin.so +0 -0
  221. sequenzo/dissimilarity_measures/utils/seqconc.cpython-310-darwin.so +0 -0
  222. sequenzo/dissimilarity_measures/utils/seqdss.cpython-310-darwin.so +0 -0
  223. sequenzo/dissimilarity_measures/utils/seqdur.cpython-310-darwin.so +0 -0
  224. sequenzo/dissimilarity_measures/utils/seqlength.cpython-310-darwin.so +0 -0
  225. sequenzo/multidomain/__init__.py +23 -0
  226. sequenzo/multidomain/association_between_domains.py +311 -0
  227. sequenzo/multidomain/cat.py +597 -0
  228. sequenzo/multidomain/combt.py +519 -0
  229. sequenzo/multidomain/dat.py +81 -0
  230. sequenzo/multidomain/idcd.py +139 -0
  231. sequenzo/multidomain/linked_polyad.py +292 -0
  232. sequenzo/openmp_setup.py +233 -0
  233. sequenzo/prefix_tree/__init__.py +62 -0
  234. sequenzo/prefix_tree/hub.py +114 -0
  235. sequenzo/prefix_tree/individual_level_indicators.py +1321 -0
  236. sequenzo/prefix_tree/spell_individual_level_indicators.py +580 -0
  237. sequenzo/prefix_tree/spell_level_indicators.py +297 -0
  238. sequenzo/prefix_tree/system_level_indicators.py +544 -0
  239. sequenzo/prefix_tree/utils.py +54 -0
  240. sequenzo/seqhmm/__init__.py +95 -0
  241. sequenzo/seqhmm/advanced_optimization.py +305 -0
  242. sequenzo/seqhmm/bootstrap.py +411 -0
  243. sequenzo/seqhmm/build_hmm.py +142 -0
  244. sequenzo/seqhmm/build_mhmm.py +136 -0
  245. sequenzo/seqhmm/build_nhmm.py +121 -0
  246. sequenzo/seqhmm/fit_mhmm.py +62 -0
  247. sequenzo/seqhmm/fit_model.py +61 -0
  248. sequenzo/seqhmm/fit_nhmm.py +76 -0
  249. sequenzo/seqhmm/formulas.py +289 -0
  250. sequenzo/seqhmm/forward_backward_nhmm.py +276 -0
  251. sequenzo/seqhmm/gradients_nhmm.py +306 -0
  252. sequenzo/seqhmm/hmm.py +291 -0
  253. sequenzo/seqhmm/mhmm.py +314 -0
  254. sequenzo/seqhmm/model_comparison.py +238 -0
  255. sequenzo/seqhmm/multichannel_em.py +282 -0
  256. sequenzo/seqhmm/multichannel_utils.py +138 -0
  257. sequenzo/seqhmm/nhmm.py +270 -0
  258. sequenzo/seqhmm/nhmm_utils.py +191 -0
  259. sequenzo/seqhmm/predict.py +137 -0
  260. sequenzo/seqhmm/predict_mhmm.py +142 -0
  261. sequenzo/seqhmm/simulate.py +878 -0
  262. sequenzo/seqhmm/utils.py +218 -0
  263. sequenzo/seqhmm/visualization.py +910 -0
  264. sequenzo/sequence_characteristics/__init__.py +40 -0
  265. sequenzo/sequence_characteristics/complexity_index.py +49 -0
  266. sequenzo/sequence_characteristics/overall_cross_sectional_entropy.py +220 -0
  267. sequenzo/sequence_characteristics/plot_characteristics.py +593 -0
  268. sequenzo/sequence_characteristics/simple_characteristics.py +311 -0
  269. sequenzo/sequence_characteristics/state_frequencies_and_entropy_per_sequence.py +39 -0
  270. sequenzo/sequence_characteristics/turbulence.py +155 -0
  271. sequenzo/sequence_characteristics/variance_of_spell_durations.py +86 -0
  272. sequenzo/sequence_characteristics/within_sequence_entropy.py +43 -0
  273. sequenzo/suffix_tree/__init__.py +66 -0
  274. sequenzo/suffix_tree/hub.py +114 -0
  275. sequenzo/suffix_tree/individual_level_indicators.py +1679 -0
  276. sequenzo/suffix_tree/spell_individual_level_indicators.py +493 -0
  277. sequenzo/suffix_tree/spell_level_indicators.py +248 -0
  278. sequenzo/suffix_tree/system_level_indicators.py +535 -0
  279. sequenzo/suffix_tree/utils.py +56 -0
  280. sequenzo/version_check.py +283 -0
  281. sequenzo/visualization/__init__.py +29 -0
  282. sequenzo/visualization/plot_mean_time.py +222 -0
  283. sequenzo/visualization/plot_modal_state.py +276 -0
  284. sequenzo/visualization/plot_most_frequent_sequences.py +147 -0
  285. sequenzo/visualization/plot_relative_frequency.py +405 -0
  286. sequenzo/visualization/plot_sequence_index.py +1175 -0
  287. sequenzo/visualization/plot_single_medoid.py +153 -0
  288. sequenzo/visualization/plot_state_distribution.py +651 -0
  289. sequenzo/visualization/plot_transition_matrix.py +190 -0
  290. sequenzo/visualization/utils/__init__.py +23 -0
  291. sequenzo/visualization/utils/utils.py +310 -0
  292. sequenzo/with_event_history_analysis/__init__.py +35 -0
  293. sequenzo/with_event_history_analysis/sequence_analysis_multi_state_model.py +850 -0
  294. sequenzo/with_event_history_analysis/sequence_history_analysis.py +283 -0
  295. sequenzo-0.1.31.dist-info/METADATA +286 -0
  296. sequenzo-0.1.31.dist-info/RECORD +299 -0
  297. sequenzo-0.1.31.dist-info/WHEEL +5 -0
  298. sequenzo-0.1.31.dist-info/licenses/LICENSE +28 -0
  299. sequenzo-0.1.31.dist-info/top_level.txt +2 -0
@@ -0,0 +1,1260 @@
1
+ /***************************************************************************
2
+ * Copyright (c) Johan Mabille, Sylvain Corlay, Wolf Vollprecht and *
3
+ * Martin Renou *
4
+ * Copyright (c) QuantStack *
5
+ * Copyright (c) Serge Guelton *
6
+ * *
7
+ * Distributed under the terms of the BSD 3-Clause License. *
8
+ * *
9
+ * The full license is in the file LICENSE, distributed with this software. *
10
+ ****************************************************************************/
11
+
12
+ #ifndef XSIMD_SCALAR_HPP
13
+ #define XSIMD_SCALAR_HPP
14
+
15
+ #include <cassert>
16
+ #include <cmath>
17
+ #include <complex>
18
+ #include <cstdint>
19
+ #include <cstring>
20
+ #include <limits>
21
+ #include <type_traits>
22
+
23
+ #include "xsimd/config/xsimd_inline.hpp"
24
+
25
+ #ifdef XSIMD_ENABLE_XTL_COMPLEX
26
+ #include "xtl/xcomplex.hpp"
27
+ #endif
28
+
29
+ #ifdef __APPLE__
30
+ #include <AvailabilityMacros.h>
31
+ #endif
32
+
33
+ namespace xsimd
34
+ {
35
+ template <class T, class A>
36
+ class batch;
37
+ template <class T, class A>
38
+ class batch_bool;
39
+
40
+ using std::abs;
41
+
42
+ using std::acos;
43
+ using std::acosh;
44
+ using std::arg;
45
+ using std::asin;
46
+ using std::asinh;
47
+ using std::atan;
48
+ using std::atan2;
49
+ using std::atanh;
50
+ using std::cbrt;
51
+ using std::ceil;
52
+ using std::conj;
53
+ using std::copysign;
54
+ using std::cos;
55
+ using std::cosh;
56
+ using std::erf;
57
+ using std::erfc;
58
+ using std::exp;
59
+ using std::exp2;
60
+ using std::expm1;
61
+ using std::fabs;
62
+ using std::fdim;
63
+ using std::floor;
64
+ using std::fmax;
65
+ using std::fmin;
66
+ using std::fmod;
67
+ using std::hypot;
68
+ using std::ldexp;
69
+ using std::lgamma;
70
+ using std::log;
71
+ using std::log10;
72
+ using std::log1p;
73
+ using std::log2;
74
+ using std::modf;
75
+ using std::nearbyint;
76
+ using std::nextafter;
77
+ using std::norm;
78
+ using std::polar;
79
+ using std::proj;
80
+ using std::remainder;
81
+ using std::rint;
82
+ using std::round;
83
+ using std::sin;
84
+ using std::sinh;
85
+ using std::sqrt;
86
+ using std::tan;
87
+ using std::tanh;
88
+ using std::tgamma;
89
+ using std::trunc;
90
+
91
+ XSIMD_INLINE signed char abs(signed char v)
92
+ {
93
+ return v < 0 ? -v : v;
94
+ }
95
+
96
+ namespace detail
97
+ {
98
+ // Use templated type here to prevent automatic instantiation that may
99
+ // ends up in a warning
100
+ template <typename char_type>
101
+ XSIMD_INLINE char abs(char_type v, std::true_type)
102
+ {
103
+ return v;
104
+ }
105
+ template <typename char_type>
106
+ XSIMD_INLINE char abs(char_type v, std::false_type)
107
+ {
108
+ return v < 0 ? -v : v;
109
+ }
110
+ }
111
+
112
+ XSIMD_INLINE char abs(char v)
113
+ {
114
+ return detail::abs(v, std::is_unsigned<char>::type {});
115
+ }
116
+
117
+ XSIMD_INLINE short abs(short v)
118
+ {
119
+ return v < 0 ? -v : v;
120
+ }
121
+ XSIMD_INLINE unsigned char abs(unsigned char v)
122
+ {
123
+ return v;
124
+ }
125
+ XSIMD_INLINE unsigned short abs(unsigned short v)
126
+ {
127
+ return v;
128
+ }
129
+ XSIMD_INLINE unsigned int abs(unsigned int v)
130
+ {
131
+ return v;
132
+ }
133
+ XSIMD_INLINE unsigned long abs(unsigned long v)
134
+ {
135
+ return v;
136
+ }
137
+ XSIMD_INLINE unsigned long long abs(unsigned long long v)
138
+ {
139
+ return v;
140
+ }
141
+
142
+ #ifndef _WIN32
143
+ using std::isfinite;
144
+ using std::isinf;
145
+ using std::isnan;
146
+ #else
147
+
148
+ // Windows defines catch all templates
149
+ template <class T>
150
+ XSIMD_INLINE typename std::enable_if<std::is_floating_point<T>::value, bool>::type
151
+ isfinite(T var) noexcept
152
+ {
153
+ return std::isfinite(var);
154
+ }
155
+
156
+ template <class T>
157
+ XSIMD_INLINE typename std::enable_if<std::is_integral<T>::value, bool>::type
158
+ isfinite(T var) noexcept
159
+ {
160
+ return isfinite(double(var));
161
+ }
162
+
163
+ template <class T>
164
+ XSIMD_INLINE typename std::enable_if<std::is_floating_point<T>::value, bool>::type
165
+ isinf(T var) noexcept
166
+ {
167
+ return std::isinf(var);
168
+ }
169
+
170
+ template <class T>
171
+ XSIMD_INLINE typename std::enable_if<std::is_integral<T>::value, bool>::type
172
+ isinf(T var) noexcept
173
+ {
174
+ return isinf(double(var));
175
+ }
176
+
177
+ template <class T>
178
+ XSIMD_INLINE typename std::enable_if<std::is_floating_point<T>::value, bool>::type
179
+ isnan(T var) noexcept
180
+ {
181
+ return std::isnan(var);
182
+ }
183
+
184
+ template <class T>
185
+ XSIMD_INLINE typename std::enable_if<std::is_integral<T>::value, bool>::type
186
+ isnan(T var) noexcept
187
+ {
188
+ return isnan(double(var));
189
+ }
190
+ #endif
191
+
192
+ template <class T, class Tp>
193
+ XSIMD_INLINE typename std::common_type<T, Tp>::type add(T const& x, Tp const& y) noexcept
194
+ {
195
+ return x + y;
196
+ }
197
+
198
+ template <class T, class Tp>
199
+ XSIMD_INLINE typename std::common_type<T, Tp>::type avg(T const& x, Tp const& y) noexcept
200
+ {
201
+ using common_type = typename std::common_type<T, Tp>::type;
202
+ if (std::is_floating_point<common_type>::value)
203
+ return (x + y) / 2;
204
+ else if (std::is_unsigned<common_type>::value)
205
+ {
206
+ return (x & y) + ((x ^ y) >> 1);
207
+ }
208
+ else
209
+ {
210
+ // Inspired by
211
+ // https://stackoverflow.com/questions/5697500/take-the-average-of-two-signed-numbers-in-c
212
+ auto t = (x & y) + ((x ^ y) >> 1);
213
+ auto t_u = static_cast<typename std::make_unsigned<common_type>::type>(t);
214
+ auto avg = t + (static_cast<T>(t_u >> (8 * sizeof(T) - 1)) & (x ^ y));
215
+ return avg;
216
+ }
217
+ }
218
+
219
+ template <class T, class Tp>
220
+ XSIMD_INLINE typename std::common_type<T, Tp>::type avgr(T const& x, Tp const& y) noexcept
221
+ {
222
+ using common_type = typename std::common_type<T, Tp>::type;
223
+ if (std::is_floating_point<common_type>::value)
224
+ return avg(x, y);
225
+ else
226
+ {
227
+ return avg(x, y) + ((x ^ y) & 1);
228
+ }
229
+ }
230
+
231
+ template <class T>
232
+ XSIMD_INLINE T incr(T const& x) noexcept
233
+ {
234
+ return x + T(1);
235
+ }
236
+
237
+ template <class T>
238
+ XSIMD_INLINE T incr_if(T const& x, bool mask) noexcept
239
+ {
240
+ return x + T(mask ? 1 : 0);
241
+ }
242
+
243
+ XSIMD_INLINE bool all(bool mask)
244
+ {
245
+ return mask;
246
+ }
247
+
248
+ XSIMD_INLINE bool any(bool mask)
249
+ {
250
+ return mask;
251
+ }
252
+
253
+ XSIMD_INLINE bool none(bool mask)
254
+ {
255
+ return !mask;
256
+ }
257
+
258
+ template <class T>
259
+ XSIMD_INLINE typename std::enable_if<std::is_integral<T>::value, T>::type
260
+ bitwise_and(T x, T y) noexcept
261
+ {
262
+ return x & y;
263
+ }
264
+
265
+ template <class T_out, class T_in>
266
+ XSIMD_INLINE T_out bitwise_cast(T_in x) noexcept
267
+ {
268
+ static_assert(sizeof(T_in) == sizeof(T_out), "bitwise_cast between types of the same size");
269
+ T_out r;
270
+ std::memcpy((void*)&r, (void*)&x, sizeof(T_in));
271
+ return r;
272
+ }
273
+
274
+ XSIMD_INLINE float bitwise_and(float x, float y) noexcept
275
+ {
276
+ uint32_t ix, iy;
277
+ std::memcpy((void*)&ix, (void*)&x, sizeof(float));
278
+ std::memcpy((void*)&iy, (void*)&y, sizeof(float));
279
+ uint32_t ir = bitwise_and(ix, iy);
280
+ float r;
281
+ std::memcpy((void*)&r, (void*)&ir, sizeof(float));
282
+ return r;
283
+ }
284
+
285
+ XSIMD_INLINE double bitwise_and(double x, double y) noexcept
286
+ {
287
+ uint64_t ix, iy;
288
+ std::memcpy((void*)&ix, (void*)&x, sizeof(double));
289
+ std::memcpy((void*)&iy, (void*)&y, sizeof(double));
290
+ uint64_t ir = bitwise_and(ix, iy);
291
+ double r;
292
+ std::memcpy((void*)&r, (void*)&ir, sizeof(double));
293
+ return r;
294
+ }
295
+
296
+ template <class T0, class T1>
297
+ XSIMD_INLINE typename std::enable_if<std::is_integral<T0>::value && std::is_integral<T1>::value, T0>::type
298
+ bitwise_lshift(T0 x, T1 shift) noexcept
299
+ {
300
+ return x << shift;
301
+ }
302
+
303
+ template <size_t shift, class T>
304
+ XSIMD_INLINE typename std::enable_if<std::is_integral<T>::value, T>::type
305
+ bitwise_lshift(T x) noexcept
306
+ {
307
+ constexpr auto bits = std::numeric_limits<T>::digits + std::numeric_limits<T>::is_signed;
308
+ static_assert(shift < bits, "Count must be less than the number of bits in T");
309
+ return x << shift;
310
+ }
311
+
312
+ template <class T0, class T1>
313
+ XSIMD_INLINE typename std::enable_if<std::is_integral<T0>::value && std::is_integral<T1>::value, T0>::type
314
+ bitwise_rshift(T0 x, T1 shift) noexcept
315
+ {
316
+ return x >> shift;
317
+ }
318
+ template <size_t shift, class T>
319
+ XSIMD_INLINE typename std::enable_if<std::is_integral<T>::value, T>::type
320
+ bitwise_rshift(T x) noexcept
321
+ {
322
+ constexpr auto bits = std::numeric_limits<T>::digits + std::numeric_limits<T>::is_signed;
323
+ static_assert(shift < bits, "Count must be less than the number of bits in T");
324
+ return x >> shift;
325
+ }
326
+
327
+ template <class T>
328
+ XSIMD_INLINE typename std::enable_if<std::is_integral<T>::value, T>::type
329
+ bitwise_not(T x) noexcept
330
+ {
331
+ return ~x;
332
+ }
333
+
334
+ XSIMD_INLINE bool bitwise_not(bool x) noexcept
335
+ {
336
+ return !x;
337
+ }
338
+
339
+ XSIMD_INLINE float bitwise_not(float x) noexcept
340
+ {
341
+ uint32_t ix;
342
+ std::memcpy((void*)&ix, (void*)&x, sizeof(float));
343
+ uint32_t ir = bitwise_not(ix);
344
+ float r;
345
+ std::memcpy((void*)&r, (void*)&ir, sizeof(float));
346
+ return r;
347
+ }
348
+
349
+ XSIMD_INLINE double bitwise_not(double x) noexcept
350
+ {
351
+ uint64_t ix;
352
+ std::memcpy((void*)&ix, (void*)&x, sizeof(double));
353
+ uint64_t ir = bitwise_not(ix);
354
+ double r;
355
+ std::memcpy((void*)&r, (void*)&ir, sizeof(double));
356
+ return r;
357
+ }
358
+
359
+ template <class T>
360
+ XSIMD_INLINE typename std::enable_if<std::is_scalar<T>::value, T>::type bitwise_andnot(T x, T y) noexcept
361
+ {
362
+ return bitwise_and(x, bitwise_not(y));
363
+ }
364
+
365
+ template <class T>
366
+ XSIMD_INLINE typename std::enable_if<std::is_integral<T>::value, T>::type
367
+ bitwise_or(T x, T y) noexcept
368
+ {
369
+ return x | y;
370
+ }
371
+
372
+ XSIMD_INLINE float bitwise_or(float x, float y) noexcept
373
+ {
374
+ uint32_t ix, iy;
375
+ std::memcpy((void*)&ix, (void*)&x, sizeof(float));
376
+ std::memcpy((void*)&iy, (void*)&y, sizeof(float));
377
+ uint32_t ir = bitwise_or(ix, iy);
378
+ float r;
379
+ std::memcpy((void*)&r, (void*)&ir, sizeof(float));
380
+ return r;
381
+ }
382
+
383
+ XSIMD_INLINE double bitwise_or(double x, double y) noexcept
384
+ {
385
+ uint64_t ix, iy;
386
+ std::memcpy((void*)&ix, (void*)&x, sizeof(double));
387
+ std::memcpy((void*)&iy, (void*)&y, sizeof(double));
388
+ uint64_t ir = bitwise_or(ix, iy);
389
+ double r;
390
+ std::memcpy((void*)&r, (void*)&ir, sizeof(double));
391
+ return r;
392
+ }
393
+
394
+ template <class T>
395
+ XSIMD_INLINE typename std::enable_if<std::is_integral<T>::value, T>::type
396
+ bitwise_xor(T x, T y) noexcept
397
+ {
398
+ return x ^ y;
399
+ }
400
+
401
+ XSIMD_INLINE float bitwise_xor(float x, float y) noexcept
402
+ {
403
+ uint32_t ix, iy;
404
+ std::memcpy((void*)&ix, (void*)&x, sizeof(float));
405
+ std::memcpy((void*)&iy, (void*)&y, sizeof(float));
406
+ uint32_t ir = bitwise_xor(ix, iy);
407
+ float r;
408
+ std::memcpy((void*)&r, (void*)&ir, sizeof(float));
409
+ return r;
410
+ }
411
+
412
+ XSIMD_INLINE double bitwise_xor(double x, double y) noexcept
413
+ {
414
+ uint64_t ix, iy;
415
+ std::memcpy((void*)&ix, (void*)&x, sizeof(double));
416
+ std::memcpy((void*)&iy, (void*)&y, sizeof(double));
417
+ uint64_t ir = bitwise_xor(ix, iy);
418
+ double r;
419
+ std::memcpy((void*)&r, (void*)&ir, sizeof(double));
420
+ return r;
421
+ }
422
+
423
+ template <class T, class Tp>
424
+ XSIMD_INLINE typename std::common_type<T, Tp>::type div(T const& x, Tp const& y) noexcept
425
+ {
426
+ return x / y;
427
+ }
428
+
429
+ template <class T, class Tp>
430
+ XSIMD_INLINE auto mod(T const& x, Tp const& y) noexcept -> decltype(x % y)
431
+ {
432
+ return x % y;
433
+ }
434
+
435
+ template <class T, class Tp>
436
+ XSIMD_INLINE typename std::common_type<T, Tp>::type mul(T const& x, Tp const& y) noexcept
437
+ {
438
+ return x * y;
439
+ }
440
+
441
+ template <class T>
442
+ XSIMD_INLINE T neg(T const& x) noexcept
443
+ {
444
+ return -x;
445
+ }
446
+
447
+ template <class T>
448
+ XSIMD_INLINE auto pos(T const& x) noexcept -> decltype(+x)
449
+ {
450
+ return +x;
451
+ }
452
+
453
+ XSIMD_INLINE float reciprocal(float const& x) noexcept
454
+ {
455
+ return 1.f / x;
456
+ }
457
+
458
+ XSIMD_INLINE double reciprocal(double const& x) noexcept
459
+ {
460
+ return 1. / x;
461
+ }
462
+
463
+ template <class T0, class T1>
464
+ XSIMD_INLINE typename std::enable_if<std::is_integral<T0>::value && std::is_integral<T1>::value, T0>::type
465
+ rotl(T0 x, T1 shift) noexcept
466
+ {
467
+ constexpr auto bits = std::numeric_limits<T0>::digits + std::numeric_limits<T0>::is_signed;
468
+ return (x << shift) | (x >> (bits - shift));
469
+ }
470
+ template <size_t count, class T>
471
+ XSIMD_INLINE typename std::enable_if<std::is_integral<T>::value, T>::type
472
+ rotl(T x) noexcept
473
+ {
474
+ constexpr auto bits = std::numeric_limits<T>::digits + std::numeric_limits<T>::is_signed;
475
+ static_assert(count < bits, "Count must be less than the number of bits in T");
476
+ return (x << count) | (x >> (bits - count));
477
+ }
478
+
479
+ template <class T0, class T1>
480
+ XSIMD_INLINE typename std::enable_if<std::is_integral<T0>::value && std::is_integral<T1>::value, T0>::type
481
+ rotr(T0 x, T1 shift) noexcept
482
+ {
483
+ constexpr auto bits = std::numeric_limits<T0>::digits + std::numeric_limits<T0>::is_signed;
484
+ return (x >> shift) | (x << (bits - shift));
485
+ }
486
+ template <size_t count, class T>
487
+ XSIMD_INLINE typename std::enable_if<std::is_integral<T>::value, T>::type
488
+ rotr(T x) noexcept
489
+ {
490
+ constexpr auto bits = std::numeric_limits<T>::digits + std::numeric_limits<T>::is_signed;
491
+ static_assert(count < bits, "Count must be less than the number of bits in T");
492
+ return (x >> count) | (x << (bits - count));
493
+ }
494
+
495
+ template <class T>
496
+ XSIMD_INLINE bool isnan(std::complex<T> var) noexcept
497
+ {
498
+ return std::isnan(std::real(var)) || std::isnan(std::imag(var));
499
+ }
500
+
501
+ template <class T>
502
+ XSIMD_INLINE bool isinf(std::complex<T> var) noexcept
503
+ {
504
+ return std::isinf(std::real(var)) || std::isinf(std::imag(var));
505
+ }
506
+
507
+ template <class T>
508
+ XSIMD_INLINE bool isfinite(std::complex<T> var) noexcept
509
+ {
510
+ return std::isfinite(std::real(var)) && std::isfinite(std::imag(var));
511
+ }
512
+
513
+ #ifdef XSIMD_ENABLE_XTL_COMPLEX
514
+ using xtl::abs;
515
+ using xtl::acos;
516
+ using xtl::acosh;
517
+ using xtl::asin;
518
+ using xtl::asinh;
519
+ using xtl::atan;
520
+ using xtl::atanh;
521
+ using xtl::cos;
522
+ using xtl::cosh;
523
+ using xtl::exp;
524
+ using xtl::log;
525
+ using xtl::log10;
526
+ using xtl::norm;
527
+ using xtl::pow;
528
+ using xtl::proj;
529
+ using xtl::sin;
530
+ using xtl::sinh;
531
+ using xtl::sqrt;
532
+ using xtl::tan;
533
+ using xtl::tanh;
534
+ #endif
535
+
536
+ template <typename T, class = typename std::enable_if<std::is_scalar<T>::value>::type>
537
+ XSIMD_INLINE T clip(const T& val, const T& low, const T& hi) noexcept
538
+ {
539
+ assert(low <= hi && "ordered clipping bounds");
540
+ return low > val ? low : (hi < val ? hi : val);
541
+ }
542
+
543
+ template <class T, class = typename std::enable_if<std::is_scalar<T>::value>::type>
544
+ XSIMD_INLINE bool is_flint(const T& x) noexcept
545
+ {
546
+ #ifdef __FAST_MATH__
547
+ return (x - std::trunc(x)) == T(0);
548
+ #else
549
+ return std::isnan(x - x) ? false : (x - std::trunc(x)) == T(0);
550
+ #endif
551
+ }
552
+
553
+ template <class T, class = typename std::enable_if<std::is_scalar<T>::value>::type>
554
+ XSIMD_INLINE bool is_even(const T& x) noexcept
555
+ {
556
+ return is_flint(x * T(0.5));
557
+ }
558
+
559
+ template <class T, class = typename std::enable_if<std::is_scalar<T>::value>::type>
560
+ XSIMD_INLINE bool is_odd(const T& x) noexcept
561
+ {
562
+ return is_even(x - 1.);
563
+ }
564
+
565
+ XSIMD_INLINE int32_t nearbyint_as_int(float var) noexcept
566
+ {
567
+ return static_cast<int32_t>(std::nearbyint(var));
568
+ }
569
+
570
+ XSIMD_INLINE int64_t nearbyint_as_int(double var) noexcept
571
+ {
572
+ return static_cast<int64_t>(std::nearbyint(var));
573
+ }
574
+
575
+ template <class T, class = typename std::enable_if<std::is_scalar<T>::value>::type>
576
+ XSIMD_INLINE bool eq(const T& x0, const T& x1) noexcept
577
+ {
578
+ return x0 == x1;
579
+ }
580
+
581
+ template <class T>
582
+ XSIMD_INLINE bool eq(const std::complex<T>& x0, const std::complex<T>& x1) noexcept
583
+ {
584
+ return x0 == x1;
585
+ }
586
+
587
+ template <class T, class = typename std::enable_if<std::is_scalar<T>::value>::type>
588
+ XSIMD_INLINE bool ge(const T& x0, const T& x1) noexcept
589
+ {
590
+ return x0 >= x1;
591
+ }
592
+
593
+ template <class T, class = typename std::enable_if<std::is_scalar<T>::value>::type>
594
+ XSIMD_INLINE bool gt(const T& x0, const T& x1) noexcept
595
+ {
596
+ return x0 > x1;
597
+ }
598
+
599
+ template <class T, class = typename std::enable_if<std::is_scalar<T>::value>::type>
600
+ XSIMD_INLINE bool le(const T& x0, const T& x1) noexcept
601
+ {
602
+ return x0 <= x1;
603
+ }
604
+
605
+ template <class T, class = typename std::enable_if<std::is_scalar<T>::value>::type>
606
+ XSIMD_INLINE bool lt(const T& x0, const T& x1) noexcept
607
+ {
608
+ return x0 < x1;
609
+ }
610
+
611
+ template <class T, class = typename std::enable_if<std::is_scalar<T>::value>::type>
612
+ XSIMD_INLINE bool neq(const T& x0, const T& x1) noexcept
613
+ {
614
+ return x0 != x1;
615
+ }
616
+
617
+ template <class T>
618
+ XSIMD_INLINE bool neq(const std::complex<T>& x0, const std::complex<T>& x1) noexcept
619
+ {
620
+ return !(x0 == x1);
621
+ }
622
+
623
+ #if defined(__APPLE__) && (MAC_OS_X_VERSION_MIN_REQUIRED > 1080)
624
+ XSIMD_INLINE float exp10(const float& x) noexcept
625
+ {
626
+ return __exp10f(x);
627
+ }
628
+ XSIMD_INLINE double exp10(const double& x) noexcept
629
+ {
630
+ return __exp10(x);
631
+ }
632
+ #elif defined(__GLIBC__)
633
+ XSIMD_INLINE float exp10(const float& x) noexcept
634
+ {
635
+ return ::exp10f(x);
636
+ }
637
+ XSIMD_INLINE double exp10(const double& x) noexcept
638
+ {
639
+ return ::exp10(x);
640
+ }
641
+ #elif !defined(__clang__) && defined(__GNUC__) && (__GNUC__ >= 5)
642
+ XSIMD_INLINE float exp10(const float& x) noexcept
643
+ {
644
+ return __builtin_exp10f(x);
645
+ }
646
+ XSIMD_INLINE double exp10(const double& x) noexcept
647
+ {
648
+ return __builtin_exp10(x);
649
+ }
650
+ #elif defined(_WIN32)
651
+ template <class T, class = typename std::enable_if<std::is_scalar<T>::value>::type>
652
+ XSIMD_INLINE T exp10(const T& x) noexcept
653
+ {
654
+ // Very inefficient but other implementations give incorrect results
655
+ // on Windows
656
+ return std::pow(T(10), x);
657
+ }
658
+ #else
659
+ XSIMD_INLINE float exp10(const float& x) noexcept
660
+ {
661
+ const float ln10 = std::log(10.f);
662
+ return std::exp(ln10 * x);
663
+ }
664
+ XSIMD_INLINE double exp10(const double& x) noexcept
665
+ {
666
+ const double ln10 = std::log(10.);
667
+ return std::exp(ln10 * x);
668
+ }
669
+ #endif
670
+
671
+ template <class T, class = typename std::enable_if<std::is_scalar<T>::value>::type>
672
+ XSIMD_INLINE auto rsqrt(const T& x) noexcept -> decltype(std::sqrt(x))
673
+ {
674
+ using float_type = decltype(std::sqrt(x));
675
+ return static_cast<float_type>(1) / std::sqrt(x);
676
+ }
677
+
678
+ namespace detail
679
+ {
680
+ template <class C>
681
+ XSIMD_INLINE C expm1_complex_scalar_impl(const C& val) noexcept
682
+ {
683
+ using T = typename C::value_type;
684
+ T isin = std::sin(val.imag());
685
+ T rem1 = std::expm1(val.real());
686
+ T re = rem1 + T(1.);
687
+ T si = std::sin(val.imag() * T(0.5));
688
+ return std::complex<T>(rem1 - T(2.) * re * si * si, re * isin);
689
+ }
690
+ }
691
+
692
+ template <class T>
693
+ XSIMD_INLINE std::complex<T> expm1(const std::complex<T>& val) noexcept
694
+ {
695
+ return detail::expm1_complex_scalar_impl(val);
696
+ }
697
+
698
+ #ifdef XSIMD_ENABLE_XTL_COMPLEX
699
+ template <class T, bool i3ec>
700
+ XSIMD_INLINE xtl::xcomplex<T, T, i3ec> expm1(const xtl::xcomplex<T, T, i3ec>& val) noexcept
701
+ {
702
+ return detail::expm1_complex_scalar_impl(val);
703
+ }
704
+ #endif
705
+
706
+ namespace detail
707
+ {
708
+ template <class C>
709
+ XSIMD_INLINE C log1p_complex_scalar_impl(const C& val) noexcept
710
+ {
711
+ using T = typename C::value_type;
712
+ C u = C(1.) + val;
713
+ return u == C(1.) ? val : (u.real() <= T(0.) ? log(u) : log(u) * val / (u - C(1.)));
714
+ }
715
+ }
716
+
717
+ template <class T>
718
+ XSIMD_INLINE std::complex<T> log1p(const std::complex<T>& val) noexcept
719
+ {
720
+ return detail::log1p_complex_scalar_impl(val);
721
+ }
722
+
723
+ template <class T>
724
+ XSIMD_INLINE std::complex<T> log2(const std::complex<T>& val) noexcept
725
+ {
726
+ return log(val) / std::log(T(2));
727
+ }
728
+
729
+ template <typename T, class = typename std::enable_if<std::is_scalar<T>::value>::type>
730
+ XSIMD_INLINE T sadd(const T& lhs, const T& rhs) noexcept
731
+ {
732
+ if (std::numeric_limits<T>::is_signed)
733
+ {
734
+ if ((lhs > 0) && (rhs > std::numeric_limits<T>::max() - lhs))
735
+ {
736
+ return std::numeric_limits<T>::max();
737
+ }
738
+ else if ((lhs < 0) && (rhs < std::numeric_limits<T>::lowest() - lhs))
739
+ {
740
+ return std::numeric_limits<T>::lowest();
741
+ }
742
+ else
743
+ {
744
+ return lhs + rhs;
745
+ }
746
+ }
747
+ else
748
+ {
749
+ if (rhs > std::numeric_limits<T>::max() - lhs)
750
+ {
751
+ return std::numeric_limits<T>::max();
752
+ }
753
+ else
754
+ {
755
+ return lhs + rhs;
756
+ }
757
+ }
758
+ }
759
+
760
+ template <typename T, class = typename std::enable_if<std::is_scalar<T>::value>::type>
761
+ XSIMD_INLINE T ssub(const T& lhs, const T& rhs) noexcept
762
+ {
763
+ if (std::numeric_limits<T>::is_signed)
764
+ {
765
+ return sadd(lhs, (T)-rhs);
766
+ }
767
+ else
768
+ {
769
+ if (lhs < rhs)
770
+ {
771
+ return std::numeric_limits<T>::lowest();
772
+ }
773
+ else
774
+ {
775
+ return lhs - rhs;
776
+ }
777
+ }
778
+ }
779
+
780
+ namespace detail
781
+ {
782
+ template <class T>
783
+ struct value_type_or_type_helper
784
+ {
785
+ using type = T;
786
+ };
787
+ template <class T, class A>
788
+ struct value_type_or_type_helper<batch<T, A>>
789
+ {
790
+ using type = T;
791
+ };
792
+
793
+ template <class T>
794
+ using value_type_or_type = typename value_type_or_type_helper<T>::type;
795
+
796
+ template <class T0, class T1>
797
+ XSIMD_INLINE typename std::enable_if<std::is_integral<T1>::value, T0>::type
798
+ ipow(const T0& x, const T1& n) noexcept
799
+ {
800
+ static_assert(std::is_integral<T1>::value, "second argument must be an integer");
801
+ T0 a = x;
802
+ T1 b = n;
803
+ bool const recip = b < 0;
804
+ T0 r(static_cast<value_type_or_type<T0>>(1));
805
+ while (1)
806
+ {
807
+ if (b & 1)
808
+ {
809
+ r *= a;
810
+ }
811
+ b /= 2;
812
+ if (b == 0)
813
+ {
814
+ break;
815
+ }
816
+ a *= a;
817
+ }
818
+ return recip ? static_cast<T0>(1) / r : r;
819
+ }
820
+ }
821
+
822
+ template <class T0, class T1>
823
+ XSIMD_INLINE typename std::enable_if<std::is_integral<T1>::value, T0>::type
824
+ pow(const T0& x, const T1& n) noexcept
825
+ {
826
+ return detail::ipow(x, n);
827
+ }
828
+
829
+ template <class T0, class T1>
830
+ XSIMD_INLINE auto
831
+ pow(const T0& t0, const T1& t1) noexcept
832
+ -> typename std::enable_if<std::is_scalar<T0>::value && std::is_floating_point<T1>::value, decltype(std::pow(t0, t1))>::type
833
+ {
834
+ return std::pow(t0, t1);
835
+ }
836
+
837
+ template <class T0, class T1>
838
+ XSIMD_INLINE typename std::enable_if<std::is_integral<T1>::value, std::complex<T0>>::type
839
+ pow(const std::complex<T0>& t0, const T1& t1) noexcept
840
+ {
841
+ return detail::ipow(t0, t1);
842
+ }
843
+
844
+ template <class T0, class T1>
845
+ XSIMD_INLINE typename std::enable_if<!std::is_integral<T1>::value, std::complex<T0>>::type
846
+ pow(const std::complex<T0>& t0, const T1& t1) noexcept
847
+ {
848
+ return std::pow(t0, t1);
849
+ }
850
+
851
+ template <class T0, class T1>
852
+ XSIMD_INLINE auto
853
+ pow(const T0& t0, const std::complex<T1>& t1) noexcept
854
+ -> typename std::enable_if<std::is_scalar<T0>::value, decltype(std::pow(t0, t1))>::type
855
+ {
856
+ return std::pow(t0, t1);
857
+ }
858
+
859
+ template <class T, class = typename std::enable_if<std::is_scalar<T>::value>::type>
860
+ XSIMD_INLINE T bitofsign(T const& x) noexcept
861
+ {
862
+ return T(x < T(0));
863
+ }
864
+
865
+ XSIMD_INLINE float bitofsign(float const& x) noexcept
866
+ {
867
+ return float(std::signbit(x));
868
+ }
869
+
870
+ XSIMD_INLINE double bitofsign(double const& x) noexcept
871
+ {
872
+ return double(std::signbit(x));
873
+ }
874
+
875
+ XSIMD_INLINE long double bitofsign(long double const& x) noexcept
876
+ {
877
+ return static_cast<long double>(std::signbit(x));
878
+ }
879
+
880
+ template <class T>
881
+ XSIMD_INLINE auto signbit(T const& v) noexcept -> decltype(bitofsign(v))
882
+ {
883
+ return bitofsign(v);
884
+ }
885
+
886
+ XSIMD_INLINE double sign(bool const& v) noexcept
887
+ {
888
+ return v;
889
+ }
890
+
891
+ template <class T, class = typename std::enable_if<std::is_scalar<T>::value>::type>
892
+ XSIMD_INLINE T sign(const T& v) noexcept
893
+ {
894
+ return v < T(0) ? T(-1.) : v == T(0) ? T(0.)
895
+ : T(1.);
896
+ }
897
+
898
+ namespace detail
899
+ {
900
+ template <class C>
901
+ XSIMD_INLINE C sign_complex_scalar_impl(const C& v) noexcept
902
+ {
903
+ using value_type = typename C::value_type;
904
+ if (v.real())
905
+ {
906
+ return C(sign(v.real()), value_type(0));
907
+ }
908
+ else
909
+ {
910
+ return C(sign(v.imag()), value_type(0));
911
+ }
912
+ }
913
+ }
914
+
915
+ template <class T>
916
+ XSIMD_INLINE std::complex<T> sign(const std::complex<T>& v) noexcept
917
+ {
918
+ return detail::sign_complex_scalar_impl(v);
919
+ }
920
+
921
+ #ifdef XSIMD_ENABLE_XTL_COMPLEX
922
+ template <class T, bool i3ec>
923
+ XSIMD_INLINE xtl::xcomplex<T, T, i3ec> sign(const xtl::xcomplex<T, T, i3ec>& v) noexcept
924
+ {
925
+ return detail::sign_complex_scalar_impl(v);
926
+ }
927
+ #endif
928
+
929
+ XSIMD_INLINE double signnz(bool const&) noexcept
930
+ {
931
+ return 1;
932
+ }
933
+
934
+ template <class T, class = typename std::enable_if<std::is_scalar<T>::value>::type>
935
+ XSIMD_INLINE T signnz(const T& v) noexcept
936
+ {
937
+ return v < T(0) ? T(-1.) : T(1.);
938
+ }
939
+
940
+ template <class T, class Tp>
941
+ XSIMD_INLINE typename std::common_type<T, Tp>::type sub(T const& x, Tp const& y) noexcept
942
+ {
943
+ return x - y;
944
+ }
945
+
946
+ template <class T>
947
+ XSIMD_INLINE T decr(T const& x) noexcept
948
+ {
949
+ return x - T(1);
950
+ }
951
+
952
+ template <class T>
953
+ XSIMD_INLINE T decr_if(T const& x, bool mask) noexcept
954
+ {
955
+ return x - T(mask ? 1 : 0);
956
+ }
957
+
958
+ #ifdef XSIMD_ENABLE_XTL_COMPLEX
959
+ template <class T, bool i3ec>
960
+ XSIMD_INLINE xtl::xcomplex<T, T, i3ec> log2(const xtl::xcomplex<T, T, i3ec>& val) noexcept
961
+ {
962
+ return log(val) / log(T(2));
963
+ }
964
+ #endif
965
+
966
+ #ifdef XSIMD_ENABLE_XTL_COMPLEX
967
+ template <class T, bool i3ec>
968
+ XSIMD_INLINE xtl::xcomplex<T, T, i3ec> log1p(const xtl::xcomplex<T, T, i3ec>& val) noexcept
969
+ {
970
+ return detail::log1p_complex_scalar_impl(val);
971
+ }
972
+ #endif
973
+
974
+ template <class T0, class T1>
975
+ XSIMD_INLINE auto min(T0 const& self, T1 const& other) noexcept
976
+ -> typename std::enable_if<std::is_scalar<T0>::value && std::is_scalar<T1>::value,
977
+ typename std::decay<decltype(self > other ? other : self)>::type>::type
978
+ {
979
+ return self > other ? other : self;
980
+ }
981
+
982
+ // numpy defines minimum operator on complex using lexical comparison
983
+ template <class T0, class T1>
984
+ XSIMD_INLINE std::complex<typename std::common_type<T0, T1>::type>
985
+ min(std::complex<T0> const& self, std::complex<T1> const& other) noexcept
986
+ {
987
+ return (self.real() < other.real()) ? (self) : (self.real() == other.real() ? (self.imag() < other.imag() ? self : other) : other);
988
+ }
989
+
990
+ template <class T0, class T1>
991
+ XSIMD_INLINE auto max(T0 const& self, T1 const& other) noexcept
992
+ -> typename std::enable_if<std::is_scalar<T0>::value && std::is_scalar<T1>::value,
993
+ typename std::decay<decltype(self > other ? other : self)>::type>::type
994
+ {
995
+ return self < other ? other : self;
996
+ }
997
+
998
+ // numpy defines maximum operator on complex using lexical comparison
999
+ template <class T0, class T1>
1000
+ XSIMD_INLINE std::complex<typename std::common_type<T0, T1>::type>
1001
+ max(std::complex<T0> const& self, std::complex<T1> const& other) noexcept
1002
+ {
1003
+ return (self.real() > other.real()) ? (self) : (self.real() == other.real() ? (self.imag() > other.imag() ? self : other) : other);
1004
+ }
1005
+
1006
+ template <class T>
1007
+ XSIMD_INLINE typename std::enable_if<std::is_integral<T>::value, T>::type fma(const T& a, const T& b, const T& c) noexcept
1008
+ {
1009
+ return a * b + c;
1010
+ }
1011
+
1012
+ template <class T>
1013
+ XSIMD_INLINE typename std::enable_if<std::is_floating_point<T>::value, T>::type fma(const T& a, const T& b, const T& c) noexcept
1014
+ {
1015
+ return std::fma(a, b, c);
1016
+ }
1017
+
1018
+ template <class T>
1019
+ XSIMD_INLINE typename std::enable_if<std::is_scalar<T>::value, T>::type fms(const T& a, const T& b, const T& c) noexcept
1020
+ {
1021
+ return a * b - c;
1022
+ }
1023
+
1024
+ namespace detail
1025
+ {
1026
+ template <class C>
1027
+ XSIMD_INLINE C fma_complex_scalar_impl(const C& a, const C& b, const C& c) noexcept
1028
+ {
1029
+ return { fms(a.real(), b.real(), fms(a.imag(), b.imag(), c.real())),
1030
+ fma(a.real(), b.imag(), fma(a.imag(), b.real(), c.imag())) };
1031
+ }
1032
+ }
1033
+
1034
+ template <class T>
1035
+ XSIMD_INLINE std::complex<T> fma(const std::complex<T>& a, const std::complex<T>& b, const std::complex<T>& c) noexcept
1036
+ {
1037
+ return detail::fma_complex_scalar_impl(a, b, c);
1038
+ }
1039
+
1040
+ #ifdef XSIMD_ENABLE_XTL_COMPLEX
1041
+ template <class T, bool i3ec>
1042
+ XSIMD_INLINE xtl::xcomplex<T, T, i3ec> fma(const xtl::xcomplex<T, T, i3ec>& a, const xtl::xcomplex<T, T, i3ec>& b, const xtl::xcomplex<T, T, i3ec>& c) noexcept
1043
+ {
1044
+ return detail::fma_complex_scalar_impl(a, b, c);
1045
+ }
1046
+ #endif
1047
+
1048
+ namespace detail
1049
+ {
1050
+ template <class C>
1051
+ XSIMD_INLINE C fms_complex_scalar_impl(const C& a, const C& b, const C& c) noexcept
1052
+ {
1053
+ return { fms(a.real(), b.real(), fma(a.imag(), b.imag(), c.real())),
1054
+ fma(a.real(), b.imag(), fms(a.imag(), b.real(), c.imag())) };
1055
+ }
1056
+ }
1057
+
1058
+ template <class T>
1059
+ XSIMD_INLINE std::complex<T> fms(const std::complex<T>& a, const std::complex<T>& b, const std::complex<T>& c) noexcept
1060
+ {
1061
+ return detail::fms_complex_scalar_impl(a, b, c);
1062
+ }
1063
+
1064
+ #ifdef XSIMD_ENABLE_XTL_COMPLEX
1065
+ template <class T, bool i3ec>
1066
+ XSIMD_INLINE xtl::xcomplex<T, T, i3ec> fms(const xtl::xcomplex<T, T, i3ec>& a, const xtl::xcomplex<T, T, i3ec>& b, const xtl::xcomplex<T, T, i3ec>& c) noexcept
1067
+ {
1068
+ return detail::fms_complex_scalar_impl(a, b, c);
1069
+ }
1070
+ #endif
1071
+
1072
+ template <class T>
1073
+ XSIMD_INLINE typename std::enable_if<std::is_integral<T>::value, T>::type fnma(const T& a, const T& b, const T& c) noexcept
1074
+ {
1075
+ return -(a * b) + c;
1076
+ }
1077
+
1078
+ template <class T>
1079
+ XSIMD_INLINE typename std::enable_if<std::is_floating_point<T>::value, T>::type fnma(const T& a, const T& b, const T& c) noexcept
1080
+ {
1081
+ return std::fma(-a, b, c);
1082
+ }
1083
+
1084
+ namespace detail
1085
+ {
1086
+ template <class C>
1087
+ XSIMD_INLINE C fnma_complex_scalar_impl(const C& a, const C& b, const C& c) noexcept
1088
+ {
1089
+ return { fms(a.imag(), b.imag(), fms(a.real(), b.real(), c.real())),
1090
+ -fma(a.real(), b.imag(), fms(a.imag(), b.real(), c.imag())) };
1091
+ }
1092
+ }
1093
+
1094
+ template <class T>
1095
+ XSIMD_INLINE std::complex<T> fnma(const std::complex<T>& a, const std::complex<T>& b, const std::complex<T>& c) noexcept
1096
+ {
1097
+ return detail::fnma_complex_scalar_impl(a, b, c);
1098
+ }
1099
+
1100
+ #ifdef XSIMD_ENABLE_XTL_COMPLEX
1101
+ template <class T, bool i3ec>
1102
+ XSIMD_INLINE xtl::xcomplex<T, T, i3ec> fnma(const xtl::xcomplex<T, T, i3ec>& a, const xtl::xcomplex<T, T, i3ec>& b, const xtl::xcomplex<T, T, i3ec>& c) noexcept
1103
+ {
1104
+ return detail::fnma_complex_scalar_impl(a, b, c);
1105
+ }
1106
+ #endif
1107
+
1108
+ template <class T>
1109
+ XSIMD_INLINE typename std::enable_if<std::is_integral<T>::value, T>::type fnms(const T& a, const T& b, const T& c) noexcept
1110
+ {
1111
+ return -(a * b) - c;
1112
+ }
1113
+
1114
+ template <class T>
1115
+ XSIMD_INLINE typename std::enable_if<std::is_floating_point<T>::value, T>::type fnms(const T& a, const T& b, const T& c) noexcept
1116
+ {
1117
+ return -std::fma(a, b, c);
1118
+ }
1119
+
1120
+ namespace detail
1121
+ {
1122
+ template <class C>
1123
+ XSIMD_INLINE C fnms_complex_scalar_impl(const C& a, const C& b, const C& c) noexcept
1124
+ {
1125
+ return { fms(a.imag(), b.imag(), fma(a.real(), b.real(), c.real())),
1126
+ -fma(a.real(), b.imag(), fma(a.imag(), b.real(), c.imag())) };
1127
+ }
1128
+ }
1129
+
1130
+ template <class T>
1131
+ XSIMD_INLINE std::complex<T> fnms(const std::complex<T>& a, const std::complex<T>& b, const std::complex<T>& c) noexcept
1132
+ {
1133
+ return detail::fnms_complex_scalar_impl(a, b, c);
1134
+ }
1135
+
1136
+ #ifdef XSIMD_ENABLE_XTL_COMPLEX
1137
+ template <class T, bool i3ec>
1138
+ XSIMD_INLINE xtl::xcomplex<T, T, i3ec> fnms(const xtl::xcomplex<T, T, i3ec>& a, const xtl::xcomplex<T, T, i3ec>& b, const xtl::xcomplex<T, T, i3ec>& c) noexcept
1139
+ {
1140
+ return detail::fnms_complex_scalar_impl(a, b, c);
1141
+ }
1142
+ #endif
1143
+
1144
+ namespace detail
1145
+ {
1146
+ #define XSIMD_HASSINCOS_TRAIT(func) \
1147
+ template <class S> \
1148
+ struct has##func \
1149
+ { \
1150
+ template <class T> \
1151
+ static XSIMD_INLINE auto get(T* ptr) -> decltype(func(std::declval<T>(), std::declval<T*>(), std::declval<T*>()), std::true_type {}); \
1152
+ static XSIMD_INLINE std::false_type get(...); \
1153
+ static constexpr bool value = decltype(get((S*)nullptr))::value; \
1154
+ }
1155
+
1156
+ #define XSIMD_HASSINCOS(func, T) has##func<T>::value
1157
+
1158
+ XSIMD_HASSINCOS_TRAIT(sincos);
1159
+ XSIMD_HASSINCOS_TRAIT(sincosf);
1160
+ XSIMD_HASSINCOS_TRAIT(__sincos);
1161
+ XSIMD_HASSINCOS_TRAIT(__sincosf);
1162
+
1163
+ struct common_sincosf
1164
+ {
1165
+ template <class T>
1166
+ XSIMD_INLINE typename std::enable_if<XSIMD_HASSINCOS(sincosf, T), void>::type
1167
+ operator()(float val, T& s, T& c)
1168
+ {
1169
+ sincosf(val, &s, &c);
1170
+ }
1171
+
1172
+ template <class T>
1173
+ XSIMD_INLINE typename std::enable_if<!XSIMD_HASSINCOS(sincosf, T) && XSIMD_HASSINCOS(__sincosf, T), void>::type
1174
+ operator()(float val, T& s, T& c)
1175
+ {
1176
+ __sincosf(val, &s, &c);
1177
+ }
1178
+
1179
+ template <class T>
1180
+ XSIMD_INLINE typename std::enable_if<!XSIMD_HASSINCOS(sincosf, T) && !XSIMD_HASSINCOS(__sincosf, T), void>::type
1181
+ operator()(float val, T& s, T& c)
1182
+ {
1183
+ s = std::sin(val);
1184
+ c = std::cos(val);
1185
+ }
1186
+ };
1187
+
1188
+ struct common_sincos
1189
+ {
1190
+ template <class T>
1191
+ XSIMD_INLINE typename std::enable_if<XSIMD_HASSINCOS(sincos, T), void>::type
1192
+ operator()(double val, T& s, T& c)
1193
+ {
1194
+ sincos(val, &s, &c);
1195
+ }
1196
+
1197
+ template <class T>
1198
+ XSIMD_INLINE typename std::enable_if<!XSIMD_HASSINCOS(sincos, T) && XSIMD_HASSINCOS(__sincos, T), void>::type
1199
+ operator()(double val, T& s, T& c)
1200
+ {
1201
+ __sincos(val, &s, &c);
1202
+ }
1203
+
1204
+ template <class T>
1205
+ XSIMD_INLINE typename std::enable_if<!XSIMD_HASSINCOS(sincos, T) && !XSIMD_HASSINCOS(__sincos, T), void>::type
1206
+ operator()(double val, T& s, T& c)
1207
+ {
1208
+ s = std::sin(val);
1209
+ c = std::cos(val);
1210
+ }
1211
+ };
1212
+
1213
+ #undef XSIMD_HASSINCOS_TRAIT
1214
+ #undef XSIMD_HASSINCOS
1215
+ }
1216
+
1217
+ XSIMD_INLINE std::pair<float, float> sincos(float val) noexcept
1218
+ {
1219
+ float s, c;
1220
+ detail::common_sincosf {}(val, s, c);
1221
+ return std::make_pair(s, c);
1222
+ }
1223
+
1224
+ XSIMD_INLINE std::pair<double, double> sincos(double val) noexcept
1225
+ {
1226
+ double s, c;
1227
+ detail::common_sincos {}(val, s, c);
1228
+ return std::make_pair(s, c);
1229
+ }
1230
+
1231
+ template <class T>
1232
+ XSIMD_INLINE std::pair<std::complex<T>, std::complex<T>>
1233
+ sincos(const std::complex<T>& val) noexcept
1234
+ {
1235
+ return std::make_pair(std::sin(val), std::cos(val));
1236
+ }
1237
+
1238
+ #ifdef XSIMD_ENABLE_XTL_COMPLEX
1239
+ template <class T>
1240
+ XSIMD_INLINE std::pair<xtl::xcomplex<T>, xtl::xcomplex<T>> sincos(const xtl::xcomplex<T>& val) noexcept
1241
+ {
1242
+ return std::make_pair(sin(val), cos(val));
1243
+ }
1244
+ #endif
1245
+
1246
+ template <class T, class _ = typename std::enable_if<std::is_floating_point<T>::value, void>::type>
1247
+ XSIMD_INLINE T frexp(T const& val, int& exp) noexcept
1248
+ {
1249
+ return std::frexp(val, &exp);
1250
+ }
1251
+
1252
+ template <class T>
1253
+ XSIMD_INLINE T select(bool cond, T const& true_br, T const& false_br) noexcept
1254
+ {
1255
+ return cond ? true_br : false_br;
1256
+ }
1257
+
1258
+ }
1259
+
1260
+ #endif