sequenzo 0.1.21__cp311-cp311-macosx_11_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of sequenzo might be problematic. Click here for more details.

Files changed (260) hide show
  1. sequenzo/__init__.py +240 -0
  2. sequenzo/big_data/__init__.py +12 -0
  3. sequenzo/big_data/clara/__init__.py +26 -0
  4. sequenzo/big_data/clara/clara.py +467 -0
  5. sequenzo/big_data/clara/utils/__init__.py +27 -0
  6. sequenzo/big_data/clara/utils/aggregatecases.py +92 -0
  7. sequenzo/big_data/clara/utils/davies_bouldin.py +91 -0
  8. sequenzo/big_data/clara/utils/get_weighted_diss.cpython-311-darwin.so +0 -0
  9. sequenzo/big_data/clara/utils/wfcmdd.py +205 -0
  10. sequenzo/big_data/clara/visualization.py +88 -0
  11. sequenzo/clustering/KMedoids.py +196 -0
  12. sequenzo/clustering/__init__.py +30 -0
  13. sequenzo/clustering/clustering_c_code.cpython-311-darwin.so +0 -0
  14. sequenzo/clustering/hierarchical_clustering.py +1380 -0
  15. sequenzo/clustering/src/KMedoid.cpp +262 -0
  16. sequenzo/clustering/src/PAM.cpp +236 -0
  17. sequenzo/clustering/src/PAMonce.cpp +234 -0
  18. sequenzo/clustering/src/cluster_quality.cpp +496 -0
  19. sequenzo/clustering/src/cluster_quality.h +128 -0
  20. sequenzo/clustering/src/cluster_quality_backup.cpp +570 -0
  21. sequenzo/clustering/src/module.cpp +228 -0
  22. sequenzo/clustering/src/weightedinertia.cpp +111 -0
  23. sequenzo/clustering/utils/__init__.py +27 -0
  24. sequenzo/clustering/utils/disscenter.py +122 -0
  25. sequenzo/data_preprocessing/__init__.py +20 -0
  26. sequenzo/data_preprocessing/helpers.py +256 -0
  27. sequenzo/datasets/__init__.py +41 -0
  28. sequenzo/datasets/biofam.csv +2001 -0
  29. sequenzo/datasets/biofam_child_domain.csv +2001 -0
  30. sequenzo/datasets/biofam_left_domain.csv +2001 -0
  31. sequenzo/datasets/biofam_married_domain.csv +2001 -0
  32. sequenzo/datasets/chinese_colonial_territories.csv +12 -0
  33. sequenzo/datasets/country_co2_emissions.csv +194 -0
  34. sequenzo/datasets/country_co2_emissions_global_deciles.csv +195 -0
  35. sequenzo/datasets/country_co2_emissions_global_quintiles.csv +195 -0
  36. sequenzo/datasets/country_co2_emissions_local_deciles.csv +195 -0
  37. sequenzo/datasets/country_co2_emissions_local_quintiles.csv +195 -0
  38. sequenzo/datasets/country_gdp_per_capita.csv +194 -0
  39. sequenzo/datasets/mvad.csv +713 -0
  40. sequenzo/datasets/pairfam_family.csv +1867 -0
  41. sequenzo/datasets/polyadic_samplec1.csv +61 -0
  42. sequenzo/datasets/polyadic_samplep1.csv +61 -0
  43. sequenzo/datasets/polyadic_seqc1.csv +61 -0
  44. sequenzo/datasets/polyadic_seqp1.csv +61 -0
  45. sequenzo/define_sequence_data.py +609 -0
  46. sequenzo/dissimilarity_measures/__init__.py +31 -0
  47. sequenzo/dissimilarity_measures/c_code.cpython-311-darwin.so +0 -0
  48. sequenzo/dissimilarity_measures/get_distance_matrix.py +702 -0
  49. sequenzo/dissimilarity_measures/get_substitution_cost_matrix.py +241 -0
  50. sequenzo/dissimilarity_measures/src/DHDdistance.cpp +148 -0
  51. sequenzo/dissimilarity_measures/src/LCPdistance.cpp +114 -0
  52. sequenzo/dissimilarity_measures/src/OMdistance.cpp +247 -0
  53. sequenzo/dissimilarity_measures/src/OMspellDistance.cpp +281 -0
  54. sequenzo/dissimilarity_measures/src/__init__.py +0 -0
  55. sequenzo/dissimilarity_measures/src/dist2matrix.cpp +63 -0
  56. sequenzo/dissimilarity_measures/src/dp_utils.h +160 -0
  57. sequenzo/dissimilarity_measures/src/module.cpp +34 -0
  58. sequenzo/dissimilarity_measures/src/setup.py +30 -0
  59. sequenzo/dissimilarity_measures/src/utils.h +25 -0
  60. sequenzo/dissimilarity_measures/src/xsimd/.github/cmake-test/main.cpp +6 -0
  61. sequenzo/dissimilarity_measures/src/xsimd/benchmark/main.cpp +159 -0
  62. sequenzo/dissimilarity_measures/src/xsimd/benchmark/xsimd_benchmark.hpp +565 -0
  63. sequenzo/dissimilarity_measures/src/xsimd/docs/source/conf.py +37 -0
  64. sequenzo/dissimilarity_measures/src/xsimd/examples/mandelbrot.cpp +330 -0
  65. sequenzo/dissimilarity_measures/src/xsimd/examples/pico_bench.hpp +246 -0
  66. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_arithmetic.hpp +266 -0
  67. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_complex.hpp +112 -0
  68. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_details.hpp +323 -0
  69. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_logical.hpp +218 -0
  70. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_math.hpp +2583 -0
  71. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_memory.hpp +880 -0
  72. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_rounding.hpp +72 -0
  73. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_swizzle.hpp +174 -0
  74. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_trigo.hpp +978 -0
  75. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx.hpp +1924 -0
  76. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx2.hpp +1144 -0
  77. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512bw.hpp +656 -0
  78. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512cd.hpp +28 -0
  79. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512dq.hpp +244 -0
  80. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512er.hpp +20 -0
  81. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512f.hpp +2650 -0
  82. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512ifma.hpp +20 -0
  83. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512pf.hpp +20 -0
  84. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512vbmi.hpp +77 -0
  85. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512vbmi2.hpp +131 -0
  86. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512vnni_avx512bw.hpp +20 -0
  87. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512vnni_avx512vbmi2.hpp +20 -0
  88. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avxvnni.hpp +20 -0
  89. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_common.hpp +24 -0
  90. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_common_fwd.hpp +77 -0
  91. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_constants.hpp +393 -0
  92. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_emulated.hpp +788 -0
  93. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_fma3_avx.hpp +93 -0
  94. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_fma3_avx2.hpp +46 -0
  95. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_fma3_sse.hpp +97 -0
  96. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_fma4.hpp +92 -0
  97. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_i8mm_neon64.hpp +17 -0
  98. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_isa.hpp +142 -0
  99. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_neon.hpp +3142 -0
  100. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_neon64.hpp +1543 -0
  101. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_rvv.hpp +1513 -0
  102. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_scalar.hpp +1260 -0
  103. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_sse2.hpp +2024 -0
  104. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_sse3.hpp +67 -0
  105. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_sse4_1.hpp +339 -0
  106. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_sse4_2.hpp +44 -0
  107. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_ssse3.hpp +186 -0
  108. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_sve.hpp +1155 -0
  109. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_vsx.hpp +892 -0
  110. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_wasm.hpp +1780 -0
  111. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/config/xsimd_arch.hpp +240 -0
  112. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/config/xsimd_config.hpp +484 -0
  113. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/config/xsimd_cpuid.hpp +269 -0
  114. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/config/xsimd_inline.hpp +27 -0
  115. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/math/xsimd_rem_pio2.hpp +719 -0
  116. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/memory/xsimd_aligned_allocator.hpp +349 -0
  117. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/memory/xsimd_alignment.hpp +91 -0
  118. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_all_registers.hpp +55 -0
  119. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_api.hpp +2765 -0
  120. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx2_register.hpp +44 -0
  121. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512bw_register.hpp +51 -0
  122. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512cd_register.hpp +51 -0
  123. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512dq_register.hpp +51 -0
  124. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512er_register.hpp +51 -0
  125. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512f_register.hpp +77 -0
  126. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512ifma_register.hpp +51 -0
  127. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512pf_register.hpp +51 -0
  128. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512vbmi2_register.hpp +51 -0
  129. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512vbmi_register.hpp +51 -0
  130. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512vnni_avx512bw_register.hpp +54 -0
  131. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512vnni_avx512vbmi2_register.hpp +53 -0
  132. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx_register.hpp +64 -0
  133. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avxvnni_register.hpp +44 -0
  134. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_batch.hpp +1524 -0
  135. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_batch_constant.hpp +300 -0
  136. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_common_arch.hpp +47 -0
  137. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_emulated_register.hpp +80 -0
  138. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_fma3_avx2_register.hpp +50 -0
  139. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_fma3_avx_register.hpp +50 -0
  140. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_fma3_sse_register.hpp +50 -0
  141. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_fma4_register.hpp +50 -0
  142. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_i8mm_neon64_register.hpp +55 -0
  143. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_neon64_register.hpp +55 -0
  144. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_neon_register.hpp +154 -0
  145. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_register.hpp +94 -0
  146. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_rvv_register.hpp +506 -0
  147. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_sse2_register.hpp +59 -0
  148. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_sse3_register.hpp +49 -0
  149. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_sse4_1_register.hpp +48 -0
  150. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_sse4_2_register.hpp +48 -0
  151. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_ssse3_register.hpp +48 -0
  152. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_sve_register.hpp +156 -0
  153. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_traits.hpp +337 -0
  154. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_utils.hpp +536 -0
  155. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_vsx_register.hpp +77 -0
  156. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_wasm_register.hpp +59 -0
  157. sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/xsimd.hpp +75 -0
  158. sequenzo/dissimilarity_measures/src/xsimd/test/architectures/dummy.cpp +7 -0
  159. sequenzo/dissimilarity_measures/src/xsimd/test/doc/explicit_use_of_an_instruction_set.cpp +13 -0
  160. sequenzo/dissimilarity_measures/src/xsimd/test/doc/explicit_use_of_an_instruction_set_mean.cpp +24 -0
  161. sequenzo/dissimilarity_measures/src/xsimd/test/doc/explicit_use_of_an_instruction_set_mean_aligned.cpp +25 -0
  162. sequenzo/dissimilarity_measures/src/xsimd/test/doc/explicit_use_of_an_instruction_set_mean_arch_independent.cpp +28 -0
  163. sequenzo/dissimilarity_measures/src/xsimd/test/doc/explicit_use_of_an_instruction_set_mean_tag_dispatch.cpp +25 -0
  164. sequenzo/dissimilarity_measures/src/xsimd/test/doc/manipulating_abstract_batches.cpp +7 -0
  165. sequenzo/dissimilarity_measures/src/xsimd/test/doc/manipulating_parametric_batches.cpp +8 -0
  166. sequenzo/dissimilarity_measures/src/xsimd/test/doc/sum.hpp +31 -0
  167. sequenzo/dissimilarity_measures/src/xsimd/test/doc/sum_avx2.cpp +3 -0
  168. sequenzo/dissimilarity_measures/src/xsimd/test/doc/sum_sse2.cpp +3 -0
  169. sequenzo/dissimilarity_measures/src/xsimd/test/doc/writing_vectorized_code.cpp +11 -0
  170. sequenzo/dissimilarity_measures/src/xsimd/test/main.cpp +31 -0
  171. sequenzo/dissimilarity_measures/src/xsimd/test/test_api.cpp +230 -0
  172. sequenzo/dissimilarity_measures/src/xsimd/test/test_arch.cpp +217 -0
  173. sequenzo/dissimilarity_measures/src/xsimd/test/test_basic_math.cpp +183 -0
  174. sequenzo/dissimilarity_measures/src/xsimd/test/test_batch.cpp +1049 -0
  175. sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_bool.cpp +508 -0
  176. sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_cast.cpp +409 -0
  177. sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_complex.cpp +712 -0
  178. sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_constant.cpp +286 -0
  179. sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_float.cpp +141 -0
  180. sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_int.cpp +365 -0
  181. sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_manip.cpp +308 -0
  182. sequenzo/dissimilarity_measures/src/xsimd/test/test_bitwise_cast.cpp +222 -0
  183. sequenzo/dissimilarity_measures/src/xsimd/test/test_complex_exponential.cpp +226 -0
  184. sequenzo/dissimilarity_measures/src/xsimd/test/test_complex_hyperbolic.cpp +183 -0
  185. sequenzo/dissimilarity_measures/src/xsimd/test/test_complex_power.cpp +265 -0
  186. sequenzo/dissimilarity_measures/src/xsimd/test/test_complex_trigonometric.cpp +236 -0
  187. sequenzo/dissimilarity_measures/src/xsimd/test/test_conversion.cpp +248 -0
  188. sequenzo/dissimilarity_measures/src/xsimd/test/test_custom_default_arch.cpp +28 -0
  189. sequenzo/dissimilarity_measures/src/xsimd/test/test_error_gamma.cpp +170 -0
  190. sequenzo/dissimilarity_measures/src/xsimd/test/test_explicit_batch_instantiation.cpp +32 -0
  191. sequenzo/dissimilarity_measures/src/xsimd/test/test_exponential.cpp +202 -0
  192. sequenzo/dissimilarity_measures/src/xsimd/test/test_extract_pair.cpp +92 -0
  193. sequenzo/dissimilarity_measures/src/xsimd/test/test_fp_manipulation.cpp +77 -0
  194. sequenzo/dissimilarity_measures/src/xsimd/test/test_gnu_source.cpp +30 -0
  195. sequenzo/dissimilarity_measures/src/xsimd/test/test_hyperbolic.cpp +167 -0
  196. sequenzo/dissimilarity_measures/src/xsimd/test/test_load_store.cpp +304 -0
  197. sequenzo/dissimilarity_measures/src/xsimd/test/test_memory.cpp +61 -0
  198. sequenzo/dissimilarity_measures/src/xsimd/test/test_poly_evaluation.cpp +64 -0
  199. sequenzo/dissimilarity_measures/src/xsimd/test/test_power.cpp +184 -0
  200. sequenzo/dissimilarity_measures/src/xsimd/test/test_rounding.cpp +199 -0
  201. sequenzo/dissimilarity_measures/src/xsimd/test/test_select.cpp +101 -0
  202. sequenzo/dissimilarity_measures/src/xsimd/test/test_shuffle.cpp +760 -0
  203. sequenzo/dissimilarity_measures/src/xsimd/test/test_sum.cpp +4 -0
  204. sequenzo/dissimilarity_measures/src/xsimd/test/test_sum.hpp +34 -0
  205. sequenzo/dissimilarity_measures/src/xsimd/test/test_traits.cpp +172 -0
  206. sequenzo/dissimilarity_measures/src/xsimd/test/test_trigonometric.cpp +208 -0
  207. sequenzo/dissimilarity_measures/src/xsimd/test/test_utils.hpp +611 -0
  208. sequenzo/dissimilarity_measures/src/xsimd/test/test_wasm/test_wasm_playwright.py +123 -0
  209. sequenzo/dissimilarity_measures/src/xsimd/test/test_xsimd_api.cpp +1460 -0
  210. sequenzo/dissimilarity_measures/utils/__init__.py +16 -0
  211. sequenzo/dissimilarity_measures/utils/get_LCP_length_for_2_seq.py +44 -0
  212. sequenzo/dissimilarity_measures/utils/get_sm_trate_substitution_cost_matrix.cpython-311-darwin.so +0 -0
  213. sequenzo/dissimilarity_measures/utils/seqconc.cpython-311-darwin.so +0 -0
  214. sequenzo/dissimilarity_measures/utils/seqdss.cpython-311-darwin.so +0 -0
  215. sequenzo/dissimilarity_measures/utils/seqdur.cpython-311-darwin.so +0 -0
  216. sequenzo/dissimilarity_measures/utils/seqlength.cpython-311-darwin.so +0 -0
  217. sequenzo/multidomain/__init__.py +23 -0
  218. sequenzo/multidomain/association_between_domains.py +311 -0
  219. sequenzo/multidomain/cat.py +431 -0
  220. sequenzo/multidomain/combt.py +519 -0
  221. sequenzo/multidomain/dat.py +89 -0
  222. sequenzo/multidomain/idcd.py +139 -0
  223. sequenzo/multidomain/linked_polyad.py +292 -0
  224. sequenzo/openmp_setup.py +233 -0
  225. sequenzo/prefix_tree/__init__.py +43 -0
  226. sequenzo/prefix_tree/individual_level_indicators.py +1274 -0
  227. sequenzo/prefix_tree/system_level_indicators.py +465 -0
  228. sequenzo/prefix_tree/utils.py +54 -0
  229. sequenzo/sequence_characteristics/__init__.py +40 -0
  230. sequenzo/sequence_characteristics/complexity_index.py +49 -0
  231. sequenzo/sequence_characteristics/overall_cross_sectional_entropy.py +220 -0
  232. sequenzo/sequence_characteristics/plot_characteristics.py +593 -0
  233. sequenzo/sequence_characteristics/simple_characteristics.py +311 -0
  234. sequenzo/sequence_characteristics/state_frequencies_and_entropy_per_sequence.py +39 -0
  235. sequenzo/sequence_characteristics/turbulence.py +155 -0
  236. sequenzo/sequence_characteristics/variance_of_spell_durations.py +86 -0
  237. sequenzo/sequence_characteristics/within_sequence_entropy.py +43 -0
  238. sequenzo/suffix_tree/__init__.py +48 -0
  239. sequenzo/suffix_tree/individual_level_indicators.py +1638 -0
  240. sequenzo/suffix_tree/system_level_indicators.py +456 -0
  241. sequenzo/suffix_tree/utils.py +56 -0
  242. sequenzo/visualization/__init__.py +29 -0
  243. sequenzo/visualization/plot_mean_time.py +194 -0
  244. sequenzo/visualization/plot_modal_state.py +276 -0
  245. sequenzo/visualization/plot_most_frequent_sequences.py +147 -0
  246. sequenzo/visualization/plot_relative_frequency.py +404 -0
  247. sequenzo/visualization/plot_sequence_index.py +937 -0
  248. sequenzo/visualization/plot_single_medoid.py +153 -0
  249. sequenzo/visualization/plot_state_distribution.py +613 -0
  250. sequenzo/visualization/plot_transition_matrix.py +190 -0
  251. sequenzo/visualization/utils/__init__.py +23 -0
  252. sequenzo/visualization/utils/utils.py +310 -0
  253. sequenzo/with_event_history_analysis/__init__.py +35 -0
  254. sequenzo/with_event_history_analysis/sequence_analysis_multi_state_model.py +850 -0
  255. sequenzo/with_event_history_analysis/sequence_history_analysis.py +283 -0
  256. sequenzo-0.1.21.dist-info/METADATA +308 -0
  257. sequenzo-0.1.21.dist-info/RECORD +254 -0
  258. sequenzo-0.1.21.dist-info/WHEEL +5 -0
  259. sequenzo-0.1.21.dist-info/licenses/LICENSE +28 -0
  260. sequenzo-0.1.21.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1780 @@
1
+ /***************************************************************************
2
+ * Copyright (c) Johan Mabille, Sylvain Corlay, Wolf Vollprecht and *
3
+ * Martin Renou *
4
+ * Copyright (c) QuantStack *
5
+ * Copyright (c) Serge Guelton *
6
+ * Copyright (c) Anutosh Bhat *
7
+ * *
8
+ * Distributed under the terms of the BSD 3-Clause License. *
9
+ * *
10
+ * The full license is in the file LICENSE, distributed with this software. *
11
+ ****************************************************************************/
12
+
13
+ #ifndef XSIMD_WASM_HPP
14
+ #define XSIMD_WASM_HPP
15
+
16
+ #include <type_traits>
17
+
18
+ #include "../types/xsimd_wasm_register.hpp"
19
+
20
+ namespace xsimd
21
+ {
22
+ template <typename T, class A, bool... Values>
23
+ struct batch_bool_constant;
24
+
25
+ template <class T_out, class T_in, class A>
26
+ XSIMD_INLINE batch<T_out, A> bitwise_cast(batch<T_in, A> const& x) noexcept;
27
+
28
+ template <typename T, class A, T... Values>
29
+ struct batch_constant;
30
+
31
+ namespace kernel
32
+ {
33
+ using namespace types;
34
+
35
+ // fwd
36
+ template <class A, class T, size_t I>
37
+ XSIMD_INLINE batch<T, A> insert(batch<T, A> const& self, T val, index<I>, requires_arch<common>) noexcept;
38
+ template <class A, typename T, typename ITy, ITy... Indices>
39
+ XSIMD_INLINE batch<T, A> shuffle(batch<T, A> const& x, batch<T, A> const& y, batch_constant<ITy, A, Indices...>, requires_arch<common>) noexcept;
40
+ template <class A, class T>
41
+ XSIMD_INLINE batch<T, A> avg(batch<T, A> const&, batch<T, A> const&, requires_arch<common>) noexcept;
42
+ template <class A, class T>
43
+ XSIMD_INLINE void transpose(batch<T, A>* matrix_begin, batch<T, A>* matrix_end, requires_arch<common>) noexcept;
44
+
45
+ // abs
46
+ template <class A, class T, typename std::enable_if<std::is_integral<T>::value && std::is_signed<T>::value, void>::type>
47
+ XSIMD_INLINE batch<T, A> abs(batch<T, A> const& self, requires_arch<wasm>) noexcept
48
+ {
49
+ XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
50
+ {
51
+ return wasm_i8x16_abs(self);
52
+ }
53
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
54
+ {
55
+ return wasm_i16x8_abs(self);
56
+ }
57
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
58
+ {
59
+ return wasm_i32x4_abs(self);
60
+ }
61
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
62
+ {
63
+ return wasm_i64x2_abs(self);
64
+ }
65
+ else
66
+ {
67
+ assert(false && "unsupported arch/op combination");
68
+ return {};
69
+ }
70
+ }
71
+
72
+ template <class A>
73
+ XSIMD_INLINE batch<float, A> abs(batch<float, A> const& self, requires_arch<wasm>) noexcept
74
+ {
75
+ return wasm_f32x4_abs(self);
76
+ }
77
+
78
+ template <class A>
79
+ XSIMD_INLINE batch<double, A> abs(batch<double, A> const& self, requires_arch<wasm>) noexcept
80
+ {
81
+ return wasm_f64x2_abs(self);
82
+ }
83
+
84
+ // add
85
+ template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
86
+ XSIMD_INLINE batch<T, A> add(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
87
+ {
88
+ XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
89
+ {
90
+ return wasm_i8x16_add(self, other);
91
+ }
92
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
93
+ {
94
+ return wasm_i16x8_add(self, other);
95
+ }
96
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
97
+ {
98
+ return wasm_i32x4_add(self, other);
99
+ }
100
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
101
+ {
102
+ return wasm_i64x2_add(self, other);
103
+ }
104
+ else
105
+ {
106
+ assert(false && "unsupported arch/op combination");
107
+ return {};
108
+ }
109
+ }
110
+
111
+ template <class A>
112
+ XSIMD_INLINE batch<float, A> add(batch<float, A> const& self, batch<float, A> const& other, requires_arch<wasm>) noexcept
113
+ {
114
+ return wasm_f32x4_add(self, other);
115
+ }
116
+
117
+ template <class A>
118
+ XSIMD_INLINE batch<double, A> add(batch<double, A> const& self, batch<double, A> const& other, requires_arch<wasm>) noexcept
119
+ {
120
+ return wasm_f64x2_add(self, other);
121
+ }
122
+
123
+ // avgr
124
+ template <class A, class T, class = typename std::enable_if<std::is_unsigned<T>::value, void>::type>
125
+ XSIMD_INLINE batch<T, A> avgr(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
126
+ {
127
+ XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
128
+ {
129
+ return wasm_u8x16_avgr(self, other);
130
+ }
131
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
132
+ {
133
+ return wasm_u16x8_avgr(self, other);
134
+ }
135
+ else
136
+ {
137
+ return avgr(self, other, common {});
138
+ }
139
+ }
140
+
141
+ // avg
142
+ template <class A, class T, class = typename std::enable_if<std::is_unsigned<T>::value, void>::type>
143
+ XSIMD_INLINE batch<T, A> avg(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
144
+ {
145
+ XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
146
+ {
147
+ auto adj = ((self ^ other) << 7) >> 7;
148
+ return avgr(self, other, A {}) - adj;
149
+ }
150
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
151
+ {
152
+ auto adj = ((self ^ other) << 15) >> 15;
153
+ return avgr(self, other, A {}) - adj;
154
+ }
155
+ else
156
+ {
157
+ return avg(self, other, common {});
158
+ }
159
+ }
160
+
161
+ // all
162
+ template <class A>
163
+ XSIMD_INLINE bool all(batch_bool<float, A> const& self, requires_arch<wasm>) noexcept
164
+ {
165
+ return wasm_i32x4_bitmask(self) == 0x0F;
166
+ }
167
+ template <class A>
168
+ XSIMD_INLINE bool all(batch_bool<double, A> const& self, requires_arch<wasm>) noexcept
169
+ {
170
+ return wasm_i64x2_bitmask(self) == 0x03;
171
+ }
172
+ template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
173
+ XSIMD_INLINE bool all(batch_bool<T, A> const& self, requires_arch<wasm>) noexcept
174
+ {
175
+ return wasm_i8x16_bitmask(self) == 0xFFFF;
176
+ }
177
+
178
+ // any
179
+ template <class A>
180
+ XSIMD_INLINE bool any(batch_bool<float, A> const& self, requires_arch<wasm>) noexcept
181
+ {
182
+ return wasm_i32x4_bitmask(self) != 0;
183
+ }
184
+ template <class A>
185
+ XSIMD_INLINE bool any(batch_bool<double, A> const& self, requires_arch<wasm>) noexcept
186
+ {
187
+ return wasm_i64x2_bitmask(self) != 0;
188
+ }
189
+ template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
190
+ XSIMD_INLINE bool any(batch_bool<T, A> const& self, requires_arch<wasm>) noexcept
191
+ {
192
+ return wasm_i8x16_bitmask(self) != 0;
193
+ }
194
+
195
+ // batch_bool_cast
196
+ template <class A, class T_out, class T_in>
197
+ XSIMD_INLINE batch_bool<T_out, A> batch_bool_cast(batch_bool<T_in, A> const& self, batch_bool<T_out, A> const&, requires_arch<wasm>) noexcept
198
+ {
199
+ return { bitwise_cast<T_out>(batch<T_in, A>(self.data)).data };
200
+ }
201
+
202
+ // bitwise_and
203
+ template <class A, class T>
204
+ XSIMD_INLINE batch<T, A> bitwise_and(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
205
+ {
206
+ return wasm_v128_and(self, other);
207
+ }
208
+
209
+ template <class A, class T>
210
+ XSIMD_INLINE batch_bool<T, A> bitwise_and(batch_bool<T, A> const& self, batch_bool<T, A> const& other, requires_arch<wasm>) noexcept
211
+ {
212
+ return wasm_v128_and(self, other);
213
+ }
214
+
215
+ // bitwise_andnot
216
+ template <class A, class T>
217
+ XSIMD_INLINE batch<T, A> bitwise_andnot(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
218
+ {
219
+ return wasm_v128_andnot(self, other);
220
+ }
221
+
222
+ template <class A, class T>
223
+ XSIMD_INLINE batch_bool<T, A> bitwise_andnot(batch_bool<T, A> const& self, batch_bool<T, A> const& other, requires_arch<wasm>) noexcept
224
+ {
225
+ return wasm_v128_andnot(self, other);
226
+ }
227
+
228
+ // bitwise_cast
229
+ template <class A, class T, class Tp>
230
+ XSIMD_INLINE batch<Tp, A> bitwise_cast(batch<T, A> const& self, batch<Tp, A> const&, requires_arch<wasm>) noexcept
231
+ {
232
+ return batch<Tp, A>(self.data);
233
+ }
234
+
235
+ // bitwise_or
236
+ template <class A, class T>
237
+ XSIMD_INLINE batch<T, A> bitwise_or(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
238
+ {
239
+ return wasm_v128_or(self, other);
240
+ }
241
+
242
+ template <class A, class T>
243
+ XSIMD_INLINE batch_bool<T, A> bitwise_or(batch_bool<T, A> const& self, batch_bool<T, A> const& other, requires_arch<wasm>) noexcept
244
+ {
245
+ return wasm_v128_or(self, other);
246
+ }
247
+
248
+ // bitwise_lshift
249
+ template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
250
+ XSIMD_INLINE batch<T, A> bitwise_lshift(batch<T, A> const& self, int32_t other, requires_arch<wasm>) noexcept
251
+ {
252
+ XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
253
+ {
254
+ return wasm_i8x16_shl(self, other);
255
+ }
256
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
257
+ {
258
+ return wasm_i16x8_shl(self, other);
259
+ }
260
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
261
+ {
262
+ return wasm_i32x4_shl(self, other);
263
+ }
264
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
265
+ {
266
+ return wasm_i64x2_shl(self, other);
267
+ }
268
+ else
269
+ {
270
+ assert(false && "unsupported arch/op combination");
271
+ return {};
272
+ }
273
+ }
274
+
275
+ // bitwise_rshift
276
+ template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
277
+ XSIMD_INLINE batch<T, A> bitwise_rshift(batch<T, A> const& self, int32_t other, requires_arch<wasm>) noexcept
278
+ {
279
+ if (std::is_signed<T>::value)
280
+ {
281
+ XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
282
+ {
283
+ return wasm_i8x16_shr(self, other);
284
+ }
285
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
286
+ {
287
+ return wasm_i16x8_shr(self, other);
288
+ }
289
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
290
+ {
291
+ return wasm_i32x4_shr(self, other);
292
+ }
293
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
294
+ {
295
+ return wasm_i64x2_shr(self, other);
296
+ }
297
+ else
298
+ {
299
+ assert(false && "unsupported arch/op combination");
300
+ return {};
301
+ }
302
+ }
303
+ else
304
+ {
305
+ XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
306
+ {
307
+ return wasm_u8x16_shr(self, other);
308
+ }
309
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
310
+ {
311
+ return wasm_u16x8_shr(self, other);
312
+ }
313
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
314
+ {
315
+ return wasm_u32x4_shr(self, other);
316
+ }
317
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
318
+ {
319
+ return wasm_u64x2_shr(self, other);
320
+ }
321
+ else
322
+ {
323
+ assert(false && "unsupported arch/op combination");
324
+ return {};
325
+ }
326
+ }
327
+ }
328
+
329
+ // bitwise_not
330
+ template <class A, class T>
331
+ XSIMD_INLINE batch<T, A> bitwise_not(batch<T, A> const& self, requires_arch<wasm>) noexcept
332
+ {
333
+ return wasm_v128_not(self);
334
+ }
335
+
336
+ template <class A, class T>
337
+ XSIMD_INLINE batch_bool<T, A> bitwise_not(batch_bool<T, A> const& self, requires_arch<wasm>) noexcept
338
+ {
339
+ return wasm_v128_not(self);
340
+ }
341
+
342
+ // bitwise_xor
343
+ template <class A, class T>
344
+ XSIMD_INLINE batch<T, A> bitwise_xor(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
345
+ {
346
+ return wasm_v128_xor(self, other);
347
+ }
348
+
349
+ template <class A, class T>
350
+ XSIMD_INLINE batch_bool<T, A> bitwise_xor(batch_bool<T, A> const& self, batch_bool<T, A> const& other, requires_arch<wasm>) noexcept
351
+ {
352
+ return wasm_v128_xor(self, other);
353
+ }
354
+
355
+ // broadcast
356
+ template <class A>
357
+ batch<float, A> XSIMD_INLINE broadcast(float val, requires_arch<wasm>) noexcept
358
+ {
359
+ return wasm_f32x4_splat(val);
360
+ }
361
+ template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
362
+ XSIMD_INLINE batch<T, A> broadcast(T val, requires_arch<wasm>) noexcept
363
+ {
364
+ XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
365
+ {
366
+ return wasm_i8x16_splat(val);
367
+ }
368
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
369
+ {
370
+ return wasm_i16x8_splat(val);
371
+ }
372
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
373
+ {
374
+ return wasm_i32x4_splat(val);
375
+ }
376
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
377
+ {
378
+ return wasm_i64x2_splat(val);
379
+ }
380
+ else
381
+ {
382
+ assert(false && "unsupported arch/op combination");
383
+ return {};
384
+ }
385
+ }
386
+ template <class A>
387
+ XSIMD_INLINE batch<double, A> broadcast(double val, requires_arch<wasm>) noexcept
388
+ {
389
+ return wasm_f64x2_splat(val);
390
+ }
391
+
392
+ // ceil
393
+ template <class A>
394
+ XSIMD_INLINE batch<float, A> ceil(batch<float, A> const& self, requires_arch<wasm>) noexcept
395
+ {
396
+ return wasm_f32x4_ceil(self);
397
+ }
398
+ template <class A>
399
+ XSIMD_INLINE batch<double, A> ceil(batch<double, A> const& self, requires_arch<wasm>) noexcept
400
+ {
401
+ return wasm_f64x2_ceil(self);
402
+ }
403
+
404
+ // div
405
+ template <class A>
406
+ XSIMD_INLINE batch<float, A> div(batch<float, A> const& self, batch<float, A> const& other, requires_arch<wasm>) noexcept
407
+ {
408
+ return wasm_f32x4_div(self, other);
409
+ }
410
+ template <class A>
411
+ XSIMD_INLINE batch<double, A> div(batch<double, A> const& self, batch<double, A> const& other, requires_arch<wasm>) noexcept
412
+ {
413
+ return wasm_f64x2_div(self, other);
414
+ }
415
+
416
+ // eq
417
+ template <class A>
418
+ XSIMD_INLINE batch_bool<float, A> eq(batch<float, A> const& self, batch<float, A> const& other, requires_arch<wasm>) noexcept
419
+ {
420
+ return wasm_f32x4_eq(self, other);
421
+ }
422
+ template <class A>
423
+ XSIMD_INLINE batch_bool<float, A> eq(batch_bool<float, A> const& self, batch_bool<float, A> const& other, requires_arch<wasm>) noexcept
424
+ {
425
+ return wasm_i32x4_eq(self, other);
426
+ }
427
+ template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
428
+ XSIMD_INLINE batch_bool<T, A> eq(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
429
+ {
430
+ XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
431
+ {
432
+ return wasm_i8x16_eq(self, other);
433
+ }
434
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
435
+ {
436
+ return wasm_i16x8_eq(self, other);
437
+ }
438
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
439
+ {
440
+ return wasm_i32x4_eq(self, other);
441
+ }
442
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
443
+ {
444
+ return wasm_i64x2_eq(self, other);
445
+ }
446
+ else
447
+ {
448
+ assert(false && "unsupported arch/op combination");
449
+ return {};
450
+ }
451
+ }
452
+ template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
453
+ XSIMD_INLINE batch_bool<T, A> eq(batch_bool<T, A> const& self, batch_bool<T, A> const& other, requires_arch<wasm>) noexcept
454
+ {
455
+ XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
456
+ {
457
+ return wasm_i8x16_eq(self, other);
458
+ }
459
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
460
+ {
461
+ return wasm_i16x8_eq(self, other);
462
+ }
463
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
464
+ {
465
+ return wasm_i32x4_eq(self, other);
466
+ }
467
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
468
+ {
469
+ return wasm_i64x2_eq(self, other);
470
+ }
471
+ else
472
+ {
473
+ assert(false && "unsupported arch/op combination");
474
+ return {};
475
+ }
476
+ }
477
+ template <class A>
478
+ XSIMD_INLINE batch_bool<double, A> eq(batch<double, A> const& self, batch<double, A> const& other, requires_arch<wasm>) noexcept
479
+ {
480
+ return wasm_f64x2_eq(self, other);
481
+ }
482
+ template <class A>
483
+ XSIMD_INLINE batch_bool<double, A> eq(batch_bool<double, A> const& self, batch_bool<double, A> const& other, requires_arch<wasm>) noexcept
484
+ {
485
+ return wasm_i64x2_eq(self, other);
486
+ }
487
+
488
+ // fast_cast
489
+ namespace detail
490
+ {
491
+ template <class A>
492
+ XSIMD_INLINE batch<float, A> fast_cast(batch<int32_t, A> const& self, batch<float, A> const&, requires_arch<wasm>) noexcept
493
+ {
494
+ return wasm_f32x4_convert_i32x4(self);
495
+ }
496
+
497
+ template <class A>
498
+ XSIMD_INLINE batch<double, A> fast_cast(batch<uint64_t, A> const& x, batch<double, A> const&, requires_arch<wasm>) noexcept
499
+ {
500
+ // from https://stackoverflow.com/questions/41144668/how-to-efficiently-perform-double-int64-conversions-with-sse-avx
501
+ // adapted to wasm
502
+ v128_t xH = wasm_u64x2_shr(x, 32);
503
+ xH = wasm_v128_or(xH, wasm_f64x2_splat(19342813113834066795298816.)); // 2^84
504
+ v128_t mask = wasm_i16x8_make(0xFFFF, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000);
505
+ v128_t xL = wasm_v128_or(wasm_v128_and(mask, x), wasm_v128_andnot(wasm_f64x2_splat(0x0010000000000000), mask)); // 2^52
506
+ v128_t f = wasm_f64x2_sub(xH, wasm_f64x2_splat(19342813118337666422669312.)); // 2^84 + 2^52
507
+ return wasm_f64x2_add(f, xL);
508
+ }
509
+
510
+ template <class A>
511
+ XSIMD_INLINE batch<double, A> fast_cast(batch<int64_t, A> const& x, batch<double, A> const&, requires_arch<wasm>) noexcept
512
+ {
513
+ // from https://stackoverflow.com/questions/41144668/how-to-efficiently-perform-double-int64-conversions-with-sse-avx
514
+ // adapted to wasm
515
+ v128_t xH = wasm_i32x4_shr(x, 16);
516
+ xH = wasm_v128_and(xH, wasm_i16x8_make(0x0000, 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0xFFFF));
517
+ xH = wasm_i64x2_add(xH, wasm_f64x2_splat(442721857769029238784.)); // 3*2^67
518
+ v128_t mask = wasm_i16x8_make(0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000);
519
+ v128_t xL = wasm_v128_or(wasm_v128_and(mask, x), wasm_v128_andnot(wasm_f64x2_splat(0x0010000000000000), mask)); // 2^52
520
+ v128_t f = wasm_f64x2_sub(xH, wasm_f64x2_splat(442726361368656609280.)); // 3*2^67 + 2^52
521
+ return wasm_f64x2_add(f, xL);
522
+ }
523
+
524
+ template <class A>
525
+ XSIMD_INLINE batch<int32_t, A> fast_cast(batch<float, A> const& self, batch<int32_t, A> const&, requires_arch<wasm>) noexcept
526
+ {
527
+ return wasm_i32x4_make(
528
+ static_cast<int32_t>(wasm_f32x4_extract_lane(self, 0)),
529
+ static_cast<int32_t>(wasm_f32x4_extract_lane(self, 1)),
530
+ static_cast<int32_t>(wasm_f32x4_extract_lane(self, 2)),
531
+ static_cast<int32_t>(wasm_f32x4_extract_lane(self, 3)));
532
+ }
533
+ }
534
+ // first
535
+ template <class A>
536
+ XSIMD_INLINE float first(batch<float, A> const& self, requires_arch<wasm>) noexcept
537
+ {
538
+ return wasm_f32x4_extract_lane(self, 0);
539
+ }
540
+ template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
541
+ XSIMD_INLINE T first(batch<T, A> const& self, requires_arch<wasm>) noexcept
542
+ {
543
+ XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
544
+ {
545
+ return wasm_i8x16_extract_lane(self, 0);
546
+ }
547
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
548
+ {
549
+ return wasm_i16x8_extract_lane(self, 0);
550
+ }
551
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
552
+ {
553
+ return wasm_i32x4_extract_lane(self, 0);
554
+ }
555
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
556
+ {
557
+ return wasm_i64x2_extract_lane(self, 0);
558
+ }
559
+ else
560
+ {
561
+ assert(false && "unsupported arch/op combination");
562
+ return {};
563
+ }
564
+ }
565
+ template <class A>
566
+ XSIMD_INLINE double first(batch<double, A> const& self, requires_arch<wasm>) noexcept
567
+ {
568
+ return wasm_f64x2_extract_lane(self, 0);
569
+ }
570
+
571
+ // floor
572
+ template <class A>
573
+ XSIMD_INLINE batch<float, A> floor(batch<float, A> const& self, requires_arch<wasm>) noexcept
574
+ {
575
+ return wasm_f32x4_floor(self);
576
+ }
577
+
578
+ template <class A>
579
+ XSIMD_INLINE batch<double, A> floor(batch<double, A> const& self, requires_arch<wasm>) noexcept
580
+ {
581
+ return wasm_f64x2_floor(self);
582
+ }
583
+
584
+ // from_mask
585
+ template <class A>
586
+ XSIMD_INLINE batch_bool<float, A> from_mask(batch_bool<float, A> const&, uint64_t mask, requires_arch<wasm>) noexcept
587
+ {
588
+ alignas(A::alignment()) static const uint32_t lut[][4] = {
589
+ { 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
590
+ { 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000 },
591
+ { 0x00000000, 0xFFFFFFFF, 0x00000000, 0x00000000 },
592
+ { 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000 },
593
+ { 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000000 },
594
+ { 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000 },
595
+ { 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000 },
596
+ { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000 },
597
+ { 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF },
598
+ { 0xFFFFFFFF, 0x00000000, 0x00000000, 0xFFFFFFFF },
599
+ { 0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF },
600
+ { 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF },
601
+ { 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF },
602
+ { 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF },
603
+ { 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF },
604
+ { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF },
605
+ };
606
+ assert(!(mask & ~0xFul) && "inbound mask");
607
+ return wasm_v128_load((const v128_t*)lut[mask]);
608
+ }
609
+ template <class A>
610
+ XSIMD_INLINE batch_bool<double, A> from_mask(batch_bool<double, A> const&, uint64_t mask, requires_arch<wasm>) noexcept
611
+ {
612
+ alignas(A::alignment()) static const uint64_t lut[][4] = {
613
+ { 0x0000000000000000ul, 0x0000000000000000ul },
614
+ { 0xFFFFFFFFFFFFFFFFul, 0x0000000000000000ul },
615
+ { 0x0000000000000000ul, 0xFFFFFFFFFFFFFFFFul },
616
+ { 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul },
617
+ };
618
+ assert(!(mask & ~0x3ul) && "inbound mask");
619
+ return wasm_v128_load((const v128_t*)lut[mask]);
620
+ }
621
+ template <class T, class A, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
622
+ XSIMD_INLINE batch_bool<T, A> from_mask(batch_bool<T, A> const&, uint64_t mask, requires_arch<wasm>) noexcept
623
+ {
624
+ alignas(A::alignment()) static const uint64_t lut64[] = {
625
+ 0x0000000000000000,
626
+ 0x000000000000FFFF,
627
+ 0x00000000FFFF0000,
628
+ 0x00000000FFFFFFFF,
629
+ 0x0000FFFF00000000,
630
+ 0x0000FFFF0000FFFF,
631
+ 0x0000FFFFFFFF0000,
632
+ 0x0000FFFFFFFFFFFF,
633
+ 0xFFFF000000000000,
634
+ 0xFFFF00000000FFFF,
635
+ 0xFFFF0000FFFF0000,
636
+ 0xFFFF0000FFFFFFFF,
637
+ 0xFFFFFFFF00000000,
638
+ 0xFFFFFFFF0000FFFF,
639
+ 0xFFFFFFFFFFFF0000,
640
+ 0xFFFFFFFFFFFFFFFF,
641
+ };
642
+ alignas(A::alignment()) static const uint32_t lut32[] = {
643
+ 0x00000000,
644
+ 0x000000FF,
645
+ 0x0000FF00,
646
+ 0x0000FFFF,
647
+ 0x00FF0000,
648
+ 0x00FF00FF,
649
+ 0x00FFFF00,
650
+ 0x00FFFFFF,
651
+ 0xFF000000,
652
+ 0xFF0000FF,
653
+ 0xFF00FF00,
654
+ 0xFF00FFFF,
655
+ 0xFFFF0000,
656
+ 0xFFFF00FF,
657
+ 0xFFFFFF00,
658
+ 0xFFFFFFFF,
659
+ };
660
+ alignas(A::alignment()) static const uint32_t lut16[][4] = {
661
+ { 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
662
+ { 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000 },
663
+ { 0x00000000, 0xFFFFFFFF, 0x00000000, 0x00000000 },
664
+ { 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000 },
665
+ { 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000000 },
666
+ { 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000 },
667
+ { 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000 },
668
+ { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000 },
669
+ { 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF },
670
+ { 0xFFFFFFFF, 0x00000000, 0x00000000, 0xFFFFFFFF },
671
+ { 0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF },
672
+ { 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF },
673
+ { 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF },
674
+ { 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF },
675
+ { 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF },
676
+ { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF },
677
+ };
678
+ alignas(A::alignment()) static const uint64_t lut8[][4] = {
679
+ { 0x0000000000000000ul, 0x0000000000000000ul },
680
+ { 0xFFFFFFFFFFFFFFFFul, 0x0000000000000000ul },
681
+ { 0x0000000000000000ul, 0xFFFFFFFFFFFFFFFFul },
682
+ { 0xFFFFFFFFFFFFFFFFul, 0xFFFFFFFFFFFFFFFFul },
683
+ };
684
+ XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
685
+ {
686
+ assert(!(mask & ~0xFFFF) && "inbound mask");
687
+ return wasm_i32x4_make(lut32[mask & 0xF], lut32[(mask >> 4) & 0xF], lut32[(mask >> 8) & 0xF], lut32[mask >> 12]);
688
+ }
689
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
690
+ {
691
+ assert(!(mask & ~0xFF) && "inbound mask");
692
+ return wasm_i64x2_make(lut64[mask & 0xF], lut64[mask >> 4]);
693
+ }
694
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
695
+ {
696
+ assert(!(mask & ~0xFul) && "inbound mask");
697
+ return wasm_v128_load((const v128_t*)lut16[mask]);
698
+ }
699
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
700
+ {
701
+ assert(!(mask & ~0x3ul) && "inbound mask");
702
+ return wasm_v128_load((const v128_t*)lut8[mask]);
703
+ }
704
+ }
705
+
706
+ // ge
707
+ template <class A>
708
+ XSIMD_INLINE batch_bool<float, A> ge(batch<float, A> const& self, batch<float, A> const& other, requires_arch<wasm>) noexcept
709
+ {
710
+ return wasm_f32x4_ge(self, other);
711
+ }
712
+ template <class A>
713
+ XSIMD_INLINE batch_bool<double, A> ge(batch<double, A> const& self, batch<double, A> const& other, requires_arch<wasm>) noexcept
714
+ {
715
+ return wasm_f64x2_ge(self, other);
716
+ }
717
+
718
+ // gt
719
+ template <class A>
720
+ XSIMD_INLINE batch_bool<float, A> gt(batch<float, A> const& self, batch<float, A> const& other, requires_arch<wasm>) noexcept
721
+ {
722
+ return wasm_f32x4_gt(self, other);
723
+ }
724
+ template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
725
+ XSIMD_INLINE batch_bool<T, A> gt(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
726
+ {
727
+ if (std::is_signed<T>::value)
728
+ {
729
+ XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
730
+ {
731
+ return wasm_i8x16_gt(self, other);
732
+ }
733
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
734
+ {
735
+ return wasm_i16x8_gt(self, other);
736
+ }
737
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
738
+ {
739
+ return wasm_i32x4_gt(self, other);
740
+ }
741
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
742
+ {
743
+ return wasm_i64x2_gt(self, other);
744
+ }
745
+ else
746
+ {
747
+ assert(false && "unsupported arch/op combination");
748
+ return {};
749
+ }
750
+ }
751
+ else
752
+ {
753
+ XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
754
+ {
755
+ return wasm_u8x16_gt(self, other);
756
+ }
757
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
758
+ {
759
+ return wasm_u16x8_gt(self, other);
760
+ }
761
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
762
+ {
763
+ return wasm_u32x4_gt(self, other);
764
+ }
765
+ else
766
+ {
767
+ return gt(self, other, common {});
768
+ }
769
+ }
770
+ }
771
+
772
+ template <class A>
773
+ XSIMD_INLINE batch_bool<double, A> gt(batch<double, A> const& self, batch<double, A> const& other, requires_arch<wasm>) noexcept
774
+ {
775
+ return wasm_f64x2_gt(self, other);
776
+ }
777
+
778
+ // haddp
779
+ template <class A>
780
+ XSIMD_INLINE batch<float, A> haddp(batch<float, A> const* row, requires_arch<wasm>) noexcept
781
+ {
782
+ v128_t tmp0 = wasm_i32x4_shuffle(row[0], row[1], 0, 4, 1, 5);
783
+ v128_t tmp1 = wasm_i32x4_shuffle(row[0], row[1], 2, 6, 3, 7);
784
+ v128_t tmp2 = wasm_i32x4_shuffle(row[2], row[3], 2, 6, 3, 7);
785
+ tmp0 = wasm_f32x4_add(tmp0, tmp1);
786
+ tmp1 = wasm_i32x4_shuffle(row[2], row[3], 0, 4, 1, 5);
787
+ tmp1 = wasm_f32x4_add(tmp1, tmp2);
788
+ tmp2 = wasm_i32x4_shuffle(tmp1, tmp0, 6, 7, 2, 3);
789
+ tmp0 = wasm_i32x4_shuffle(tmp0, tmp1, 0, 1, 4, 5);
790
+ return wasm_f32x4_add(tmp0, tmp2);
791
+ }
792
+ template <class A>
793
+ XSIMD_INLINE batch<double, A> haddp(batch<double, A> const* row, requires_arch<wasm>) noexcept
794
+ {
795
+ return wasm_f64x2_add(wasm_i64x2_shuffle(row[0], row[1], 0, 2),
796
+ wasm_i64x2_shuffle(row[0], row[1], 1, 3));
797
+ }
798
+
799
+ // insert
800
+ template <class A, size_t I>
801
+ XSIMD_INLINE batch<float, A> insert(batch<float, A> const& self, float val, index<I> pos, requires_arch<wasm>) noexcept
802
+ {
803
+ return wasm_f32x4_replace_lane(self, pos, val);
804
+ }
805
+ template <class A, class T, size_t I, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
806
+ XSIMD_INLINE batch<T, A> insert(batch<T, A> const& self, T val, index<I> pos, requires_arch<wasm>) noexcept
807
+ {
808
+ if (std::is_signed<T>::value)
809
+ {
810
+ XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
811
+ {
812
+ return wasm_i8x16_replace_lane(self, pos, val);
813
+ }
814
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
815
+ {
816
+ return wasm_i16x8_replace_lane(self, pos, val);
817
+ }
818
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
819
+ {
820
+ return wasm_i32x4_replace_lane(self, pos, val);
821
+ }
822
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
823
+ {
824
+ return wasm_i64x2_replace_lane(self, pos, val);
825
+ }
826
+ else
827
+ {
828
+ assert(false && "unsupported arch/op combination");
829
+ return {};
830
+ }
831
+ }
832
+ else
833
+ {
834
+ XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
835
+ {
836
+ return wasm_u8x16_replace_lane(self, pos, val);
837
+ }
838
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
839
+ {
840
+ return wasm_u16x8_replace_lane(self, pos, val);
841
+ }
842
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
843
+ {
844
+ return wasm_u32x4_replace_lane(self, pos, val);
845
+ }
846
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
847
+ {
848
+ return wasm_u64x2_replace_lane(self, pos, val);
849
+ }
850
+ else
851
+ {
852
+ assert(false && "unsupported arch/op combination");
853
+ return {};
854
+ }
855
+ }
856
+ }
857
+
858
+ template <class A, size_t I>
859
+ XSIMD_INLINE batch<double, A> insert(batch<double, A> const& self, double val, index<I> pos, requires_arch<wasm>) noexcept
860
+ {
861
+ return wasm_f64x2_replace_lane(self, pos, val);
862
+ }
863
+
864
+ // isnan
865
+ template <class A>
866
+ XSIMD_INLINE batch_bool<float, A> isnan(batch<float, A> const& self, requires_arch<wasm>) noexcept
867
+ {
868
+ return wasm_v128_or(wasm_f32x4_ne(self, self), wasm_f32x4_ne(self, self));
869
+ }
870
+ template <class A>
871
+ XSIMD_INLINE batch_bool<double, A> isnan(batch<double, A> const& self, requires_arch<wasm>) noexcept
872
+ {
873
+ return wasm_v128_or(wasm_f64x2_ne(self, self), wasm_f64x2_ne(self, self));
874
+ }
875
+
876
+ // le
877
+ template <class A>
878
+ XSIMD_INLINE batch_bool<float, A> le(batch<float, A> const& self, batch<float, A> const& other, requires_arch<wasm>) noexcept
879
+ {
880
+ return wasm_f32x4_le(self, other);
881
+ }
882
+ template <class A>
883
+ XSIMD_INLINE batch_bool<double, A> le(batch<double, A> const& self, batch<double, A> const& other, requires_arch<wasm>) noexcept
884
+ {
885
+ return wasm_f64x2_le(self, other);
886
+ }
887
+
888
+ // load_aligned
889
+ template <class A>
890
+ XSIMD_INLINE batch<float, A> load_aligned(float const* mem, convert<float>, requires_arch<wasm>) noexcept
891
+ {
892
+ return wasm_v128_load(mem);
893
+ }
894
+ template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
895
+ XSIMD_INLINE batch<T, A> load_aligned(T const* mem, convert<T>, requires_arch<wasm>) noexcept
896
+ {
897
+ return wasm_v128_load((v128_t const*)mem);
898
+ }
899
+ template <class A>
900
+ XSIMD_INLINE batch<double, A> load_aligned(double const* mem, convert<double>, requires_arch<wasm>) noexcept
901
+ {
902
+ return wasm_v128_load(mem);
903
+ }
904
+
905
+ // load_complex
906
+ namespace detail
907
+ {
908
+ template <class A>
909
+ XSIMD_INLINE batch<std::complex<float>, A> load_complex(batch<float, A> const& hi, batch<float, A> const& lo, requires_arch<wasm>) noexcept
910
+ {
911
+ return { wasm_i32x4_shuffle(hi, lo, 0, 2, 4, 6), wasm_i32x4_shuffle(hi, lo, 1, 3, 5, 7) };
912
+ }
913
+ template <class A>
914
+ XSIMD_INLINE batch<std::complex<double>, A> load_complex(batch<double, A> const& hi, batch<double, A> const& lo, requires_arch<wasm>) noexcept
915
+ {
916
+ return { wasm_i64x2_shuffle(hi, lo, 0, 2), wasm_i64x2_shuffle(hi, lo, 1, 3) };
917
+ }
918
+ }
919
+
920
+ // load_unaligned
921
+ template <class A>
922
+ XSIMD_INLINE batch<float, A> load_unaligned(float const* mem, convert<float>, requires_arch<wasm>) noexcept
923
+ {
924
+ return wasm_v128_load(mem);
925
+ }
926
+ template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
927
+ XSIMD_INLINE batch<T, A> load_unaligned(T const* mem, convert<T>, requires_arch<wasm>) noexcept
928
+ {
929
+ return wasm_v128_load((v128_t const*)mem);
930
+ }
931
+ template <class A>
932
+ XSIMD_INLINE batch<double, A> load_unaligned(double const* mem, convert<double>, requires_arch<wasm>) noexcept
933
+ {
934
+ return wasm_v128_load(mem);
935
+ }
936
+
937
+ // lt
938
+ template <class A>
939
+ XSIMD_INLINE batch_bool<float, A> lt(batch<float, A> const& self, batch<float, A> const& other, requires_arch<wasm>) noexcept
940
+ {
941
+ return wasm_f32x4_lt(self, other);
942
+ }
943
+ template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
944
+ XSIMD_INLINE batch_bool<T, A> lt(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
945
+ {
946
+ if (std::is_signed<T>::value)
947
+ {
948
+ XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
949
+ {
950
+ return wasm_i8x16_lt(self, other);
951
+ }
952
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
953
+ {
954
+ return wasm_i16x8_lt(self, other);
955
+ }
956
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
957
+ {
958
+ return wasm_i32x4_lt(self, other);
959
+ }
960
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
961
+ {
962
+ return wasm_i64x2_lt(self, other);
963
+ }
964
+ else
965
+ {
966
+ assert(false && "unsupported arch/op combination");
967
+ return {};
968
+ }
969
+ }
970
+ else
971
+ {
972
+ XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
973
+ {
974
+ return wasm_u8x16_lt(self, other);
975
+ }
976
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
977
+ {
978
+ return wasm_u16x8_lt(self, other);
979
+ }
980
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
981
+ {
982
+ return wasm_u32x4_lt(self, other);
983
+ }
984
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
985
+ {
986
+ auto xself = wasm_v128_xor(self, wasm_i64x2_splat(std::numeric_limits<int64_t>::lowest()));
987
+ auto xother = wasm_v128_xor(other, wasm_i64x2_splat(std::numeric_limits<int64_t>::lowest()));
988
+ v128_t tmp1 = wasm_i64x2_sub(xself, xother);
989
+ v128_t tmp2 = wasm_v128_xor(xself, xother);
990
+ v128_t tmp3 = wasm_v128_andnot(xself, xother);
991
+ v128_t tmp4 = wasm_v128_andnot(tmp1, tmp2);
992
+ v128_t tmp5 = wasm_v128_or(tmp3, tmp4);
993
+ v128_t tmp6 = wasm_i32x4_shr(tmp5, 31);
994
+ return wasm_i32x4_shuffle(tmp6, wasm_i32x4_splat(0), 1, 1, 3, 3);
995
+ }
996
+ else
997
+ {
998
+ assert(false && "unsupported arch/op combination");
999
+ return {};
1000
+ }
1001
+ }
1002
+ }
1003
+
1004
+ template <class A>
1005
+ XSIMD_INLINE batch_bool<double, A> lt(batch<double, A> const& self, batch<double, A> const& other, requires_arch<wasm>) noexcept
1006
+ {
1007
+ return wasm_f64x2_lt(self, other);
1008
+ }
1009
+
1010
+ // mask
1011
+ template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
1012
+ XSIMD_INLINE uint64_t mask(batch_bool<T, A> const& self, requires_arch<wasm>) noexcept
1013
+ {
1014
+ XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
1015
+ {
1016
+ return wasm_i8x16_bitmask(self);
1017
+ }
1018
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
1019
+ {
1020
+ return wasm_i16x8_bitmask(self);
1021
+ }
1022
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
1023
+ {
1024
+ return wasm_i32x4_bitmask(self);
1025
+ }
1026
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
1027
+ {
1028
+ return wasm_i64x2_bitmask(self);
1029
+ }
1030
+ else
1031
+ {
1032
+ assert(false && "unsupported arch/op combination");
1033
+ return {};
1034
+ }
1035
+ }
1036
+ template <class A>
1037
+ XSIMD_INLINE uint64_t mask(batch_bool<float, A> const& self, requires_arch<wasm>) noexcept
1038
+ {
1039
+ return wasm_i32x4_bitmask(self);
1040
+ }
1041
+
1042
+ template <class A>
1043
+ XSIMD_INLINE uint64_t mask(batch_bool<double, A> const& self, requires_arch<wasm>) noexcept
1044
+ {
1045
+ return wasm_i64x2_bitmask(self);
1046
+ }
1047
+
1048
+ // max
1049
+ template <class A>
1050
+ XSIMD_INLINE batch<float, A> max(batch<float, A> const& self, batch<float, A> const& other, requires_arch<wasm>) noexcept
1051
+ {
1052
+ return wasm_f32x4_pmax(self, other);
1053
+ }
1054
+ template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
1055
+ XSIMD_INLINE batch<T, A> max(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
1056
+ {
1057
+ return select(self > other, self, other);
1058
+ }
1059
+ template <class A>
1060
+ XSIMD_INLINE batch<double, A> max(batch<double, A> const& self, batch<double, A> const& other, requires_arch<wasm>) noexcept
1061
+ {
1062
+ return wasm_f64x2_pmax(self, other);
1063
+ }
1064
+
1065
+ // min
1066
+ template <class A>
1067
+ XSIMD_INLINE batch<float, A> min(batch<float, A> const& self, batch<float, A> const& other, requires_arch<wasm>) noexcept
1068
+ {
1069
+ return wasm_f32x4_pmin(self, other);
1070
+ }
1071
+ template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
1072
+ XSIMD_INLINE batch<T, A> min(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
1073
+ {
1074
+ return select(self <= other, self, other);
1075
+ }
1076
+ template <class A>
1077
+ XSIMD_INLINE batch<double, A> min(batch<double, A> const& self, batch<double, A> const& other, requires_arch<wasm>) noexcept
1078
+ {
1079
+ return wasm_f64x2_pmin(self, other);
1080
+ }
1081
+
1082
+ // mul
1083
+ template <class A>
1084
+ XSIMD_INLINE batch<float, A> mul(batch<float, A> const& self, batch<float, A> const& other, requires_arch<wasm>) noexcept
1085
+ {
1086
+ return wasm_f32x4_mul(self, other);
1087
+ }
1088
+ template <class A>
1089
+ XSIMD_INLINE batch<double, A> mul(batch<double, A> const& self, batch<double, A> const& other, requires_arch<wasm>) noexcept
1090
+ {
1091
+ return wasm_f64x2_mul(self, other);
1092
+ }
1093
+
1094
+ // neg
1095
+ template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
1096
+ XSIMD_INLINE batch<T, A> neg(batch<T, A> const& self, requires_arch<wasm>) noexcept
1097
+ {
1098
+ XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
1099
+ {
1100
+ return wasm_i8x16_neg(self);
1101
+ }
1102
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
1103
+ {
1104
+ return wasm_i16x8_neg(self);
1105
+ }
1106
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
1107
+ {
1108
+ return wasm_i32x4_neg(self);
1109
+ }
1110
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
1111
+ {
1112
+ return wasm_i64x2_neg(self);
1113
+ }
1114
+ else
1115
+ {
1116
+ assert(false && "unsupported arch/op combination");
1117
+ return {};
1118
+ }
1119
+ }
1120
+
1121
+ template <class A>
1122
+ XSIMD_INLINE batch<float, A> neg(batch<float, A> const& self, requires_arch<wasm>) noexcept
1123
+ {
1124
+ return wasm_f32x4_neg(self);
1125
+ }
1126
+
1127
+ template <class A>
1128
+ XSIMD_INLINE batch<double, A> neg(batch<double, A> const& self, requires_arch<wasm>) noexcept
1129
+ {
1130
+ return wasm_f64x2_neg(self);
1131
+ }
1132
+
1133
+ // neq
1134
+ template <class A>
1135
+ XSIMD_INLINE batch_bool<float, A> neq(batch<float, A> const& self, batch<float, A> const& other, requires_arch<wasm>) noexcept
1136
+ {
1137
+ return wasm_f32x4_ne(self, other);
1138
+ }
1139
+ template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
1140
+ XSIMD_INLINE batch_bool<T, A> neq(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
1141
+ {
1142
+ return ~(self == other);
1143
+ }
1144
+ template <class A>
1145
+ XSIMD_INLINE batch_bool<float, A> neq(batch_bool<float, A> const& self, batch_bool<float, A> const& other, requires_arch<wasm>) noexcept
1146
+ {
1147
+ return wasm_f32x4_ne(self, other);
1148
+ }
1149
+ template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
1150
+ XSIMD_INLINE batch_bool<T, A> neq(batch_bool<T, A> const& self, batch_bool<T, A> const& other, requires_arch<wasm>) noexcept
1151
+ {
1152
+ return ~(self == other);
1153
+ }
1154
+
1155
+ template <class A>
1156
+ XSIMD_INLINE batch_bool<double, A> neq(batch<double, A> const& self, batch<double, A> const& other, requires_arch<wasm>) noexcept
1157
+ {
1158
+ return wasm_f64x2_ne(self, other);
1159
+ }
1160
+ template <class A>
1161
+ XSIMD_INLINE batch_bool<double, A> neq(batch_bool<double, A> const& self, batch_bool<double, A> const& other, requires_arch<wasm>) noexcept
1162
+ {
1163
+ return wasm_f64x2_ne(self, other);
1164
+ }
1165
+
1166
+ // reciprocal
1167
+ template <class A>
1168
+ XSIMD_INLINE batch<float, A> reciprocal(batch<float, A> const& self, requires_arch<wasm>) noexcept
1169
+ {
1170
+ v128_t one = wasm_f32x4_splat(1.0f);
1171
+ return wasm_f32x4_div(one, self);
1172
+ }
1173
+ template <class A>
1174
+ XSIMD_INLINE batch<double, A> reciprocal(batch<double, A> const& self, requires_arch<wasm>) noexcept
1175
+ {
1176
+ v128_t one = wasm_f64x2_splat(1.0);
1177
+ return wasm_f64x2_div(one, self);
1178
+ }
1179
+
1180
+ // reduce_add
1181
+ template <class A>
1182
+ XSIMD_INLINE float reduce_add(batch<float, A> const& self, requires_arch<wasm>) noexcept
1183
+ {
1184
+ v128_t tmp0 = wasm_f32x4_add(self, wasm_i32x4_shuffle(self, self, 6, 7, 2, 3));
1185
+ v128_t tmp1 = wasm_i32x4_shuffle(tmp0, tmp0, 1, 0, 4, 4);
1186
+ v128_t tmp2 = wasm_f32x4_add(tmp0, tmp1);
1187
+ v128_t tmp3 = wasm_i32x4_shuffle(tmp0, tmp2, 4, 1, 2, 3);
1188
+ return wasm_f32x4_extract_lane(tmp3, 0);
1189
+ }
1190
+ template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
1191
+ XSIMD_INLINE T reduce_add(batch<T, A> const& self, requires_arch<wasm>) noexcept
1192
+ {
1193
+ XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
1194
+ {
1195
+ v128_t tmp0 = wasm_i32x4_shuffle(self, wasm_i32x4_splat(0), 2, 3, 0, 0);
1196
+ v128_t tmp1 = wasm_i32x4_add(self, tmp0);
1197
+ v128_t tmp2 = wasm_i32x4_shuffle(tmp1, wasm_i32x4_splat(0), 1, 0, 0, 0);
1198
+ v128_t tmp3 = wasm_i32x4_add(tmp1, tmp2);
1199
+ return wasm_i32x4_extract_lane(tmp3, 0);
1200
+ }
1201
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
1202
+ {
1203
+ v128_t tmp0 = wasm_i32x4_shuffle(self, wasm_i32x4_splat(0), 2, 3, 0, 0);
1204
+ v128_t tmp1 = wasm_i64x2_add(self, tmp0);
1205
+ return wasm_i64x2_extract_lane(tmp1, 0);
1206
+ }
1207
+ else
1208
+ {
1209
+ return reduce_add(self, common {});
1210
+ }
1211
+ }
1212
+ template <class A>
1213
+ XSIMD_INLINE double reduce_add(batch<double, A> const& self, requires_arch<wasm>) noexcept
1214
+ {
1215
+ v128_t tmp0 = wasm_i64x2_shuffle(self, self, 1, 3);
1216
+ v128_t tmp1 = wasm_f64x2_add(self, tmp0);
1217
+ v128_t tmp2 = wasm_i64x2_shuffle(tmp0, tmp1, 2, 1);
1218
+ return wasm_f64x2_extract_lane(tmp2, 0);
1219
+ }
1220
+
1221
+ // reduce_mul
1222
+ template <class A>
1223
+ XSIMD_INLINE float reduce_mul(batch<float, A> const& self, requires_arch<wasm>) noexcept
1224
+ {
1225
+ v128_t tmp0 = wasm_f32x4_mul(self, wasm_i32x4_shuffle(self, self, 6, 7, 2, 3));
1226
+ v128_t tmp1 = wasm_i32x4_shuffle(tmp0, tmp0, 1, 0, 4, 4);
1227
+ v128_t tmp2 = wasm_f32x4_mul(tmp0, tmp1);
1228
+ v128_t tmp3 = wasm_i32x4_shuffle(tmp0, tmp2, 4, 1, 2, 3);
1229
+ return wasm_f32x4_extract_lane(tmp3, 0);
1230
+ }
1231
+ template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
1232
+ XSIMD_INLINE T reduce_mul(batch<T, A> const& self, requires_arch<wasm>) noexcept
1233
+ {
1234
+ XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
1235
+ {
1236
+ v128_t tmp0 = wasm_i32x4_shuffle(self, wasm_i32x4_splat(0), 2, 3, 0, 0);
1237
+ v128_t tmp1 = wasm_i32x4_mul(self, tmp0);
1238
+ v128_t tmp2 = wasm_i32x4_shuffle(tmp1, wasm_i32x4_splat(0), 1, 0, 0, 0);
1239
+ v128_t tmp3 = wasm_i32x4_mul(tmp1, tmp2);
1240
+ return wasm_i32x4_extract_lane(tmp3, 0);
1241
+ }
1242
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
1243
+ {
1244
+ v128_t tmp0 = wasm_i32x4_shuffle(self, wasm_i32x4_splat(0), 2, 3, 0, 0);
1245
+ v128_t tmp1 = wasm_i64x2_mul(self, tmp0);
1246
+ return wasm_i64x2_extract_lane(tmp1, 0);
1247
+ }
1248
+ else
1249
+ {
1250
+ return reduce_mul(self, common {});
1251
+ }
1252
+ }
1253
+ template <class A>
1254
+ XSIMD_INLINE double reduce_mul(batch<double, A> const& self, requires_arch<wasm>) noexcept
1255
+ {
1256
+ v128_t tmp0 = wasm_i64x2_shuffle(self, self, 1, 3);
1257
+ v128_t tmp1 = wasm_f64x2_mul(self, tmp0);
1258
+ v128_t tmp2 = wasm_i64x2_shuffle(tmp0, tmp1, 2, 1);
1259
+ return wasm_f64x2_extract_lane(tmp2, 0);
1260
+ }
1261
+
1262
+ // rsqrt
1263
+ template <class A>
1264
+ XSIMD_INLINE batch<float, A> rsqrt(batch<float, A> const& self, requires_arch<wasm>) noexcept
1265
+ {
1266
+ v128_t one = wasm_f32x4_splat(1.0f);
1267
+ return wasm_f32x4_div(one, wasm_f32x4_sqrt(self));
1268
+ }
1269
+ template <class A>
1270
+ XSIMD_INLINE batch<double, A> rsqrt(batch<double, A> const& self, requires_arch<wasm>) noexcept
1271
+ {
1272
+ v128_t one = wasm_f64x2_splat(1.0);
1273
+ return wasm_f64x2_div(one, wasm_f64x2_sqrt(self));
1274
+ }
1275
+
1276
+ // slide_left
1277
+ template <size_t N, class A, class T>
1278
+ XSIMD_INLINE batch<T, A> slide_left(batch<T, A> const& x, requires_arch<wasm>) noexcept
1279
+ {
1280
+ return wasm_i8x16_shuffle(
1281
+ wasm_i64x2_const(0, 0), x, ((N) & 0xF0) ? 0 : 16 - ((N) & 0xF),
1282
+ ((N) & 0xF0) ? 0 : 17 - ((N) & 0xF), ((N) & 0xF0) ? 0 : 18 - ((N) & 0xF),
1283
+ ((N) & 0xF0) ? 0 : 19 - ((N) & 0xF), ((N) & 0xF0) ? 0 : 20 - ((N) & 0xF),
1284
+ ((N) & 0xF0) ? 0 : 21 - ((N) & 0xF), ((N) & 0xF0) ? 0 : 22 - ((N) & 0xF),
1285
+ ((N) & 0xF0) ? 0 : 23 - ((N) & 0xF), ((N) & 0xF0) ? 0 : 24 - ((N) & 0xF),
1286
+ ((N) & 0xF0) ? 0 : 25 - ((N) & 0xF), ((N) & 0xF0) ? 0 : 26 - ((N) & 0xF),
1287
+ ((N) & 0xF0) ? 0 : 27 - ((N) & 0xF), ((N) & 0xF0) ? 0 : 28 - ((N) & 0xF),
1288
+ ((N) & 0xF0) ? 0 : 29 - ((N) & 0xF), ((N) & 0xF0) ? 0 : 30 - ((N) & 0xF),
1289
+ ((N) & 0xF0) ? 0 : 31 - ((N) & 0xF));
1290
+ }
1291
+
1292
+ // slide_right
1293
+ template <size_t N, class A, class T>
1294
+ XSIMD_INLINE batch<T, A> slide_right(batch<T, A> const& x, requires_arch<wasm>) noexcept
1295
+ {
1296
+ return wasm_i8x16_shuffle(
1297
+ x, wasm_i64x2_const(0, 0), ((N) & 0xF0) ? 16 : ((N) & 0xF) + 0,
1298
+ ((N) & 0xF0) ? 16 : ((N) & 0xF) + 1, ((N) & 0xF0) ? 16 : ((N) & 0xF) + 2,
1299
+ ((N) & 0xF0) ? 16 : ((N) & 0xF) + 3, ((N) & 0xF0) ? 16 : ((N) & 0xF) + 4,
1300
+ ((N) & 0xF0) ? 16 : ((N) & 0xF) + 5, ((N) & 0xF0) ? 16 : ((N) & 0xF) + 6,
1301
+ ((N) & 0xF0) ? 16 : ((N) & 0xF) + 7, ((N) & 0xF0) ? 16 : ((N) & 0xF) + 8,
1302
+ ((N) & 0xF0) ? 16 : ((N) & 0xF) + 9, ((N) & 0xF0) ? 16 : ((N) & 0xF) + 10,
1303
+ ((N) & 0xF0) ? 16 : ((N) & 0xF) + 11, ((N) & 0xF0) ? 16 : ((N) & 0xF) + 12,
1304
+ ((N) & 0xF0) ? 16 : ((N) & 0xF) + 13, ((N) & 0xF0) ? 16 : ((N) & 0xF) + 14,
1305
+ ((N) & 0xF0) ? 16 : ((N) & 0xF) + 15);
1306
+ }
1307
+
1308
+ // sadd
1309
+ template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
1310
+ XSIMD_INLINE batch<T, A> sadd(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
1311
+ {
1312
+ if (std::is_signed<T>::value)
1313
+ {
1314
+ XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
1315
+ {
1316
+ return wasm_i8x16_add_sat(self, other);
1317
+ }
1318
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
1319
+ {
1320
+ return wasm_i16x8_add_sat(self, other);
1321
+ }
1322
+ else
1323
+ {
1324
+ return sadd(self, other, common {});
1325
+ }
1326
+ }
1327
+ else
1328
+ {
1329
+ XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
1330
+ {
1331
+ return wasm_u8x16_add_sat(self, other);
1332
+ }
1333
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
1334
+ {
1335
+ return wasm_u16x8_add_sat(self, other);
1336
+ }
1337
+ else
1338
+ {
1339
+ return sadd(self, other, common {});
1340
+ }
1341
+ }
1342
+ }
1343
+
1344
+ // select
1345
+ template <class A>
1346
+ XSIMD_INLINE batch<float, A> select(batch_bool<float, A> const& cond, batch<float, A> const& true_br, batch<float, A> const& false_br, requires_arch<wasm>) noexcept
1347
+ {
1348
+ return wasm_v128_or(wasm_v128_and(cond, true_br), wasm_v128_andnot(false_br, cond));
1349
+ }
1350
+
1351
+ template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
1352
+ XSIMD_INLINE batch<T, A> select(batch_bool<T, A> const& cond, batch<T, A> const& true_br, batch<T, A> const& false_br, requires_arch<wasm>) noexcept
1353
+ {
1354
+ return wasm_v128_or(wasm_v128_and(cond, true_br), wasm_v128_andnot(false_br, cond));
1355
+ }
1356
+ template <class A, class T, bool... Values, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
1357
+ XSIMD_INLINE batch<T, A> select(batch_bool_constant<T, A, Values...> const&, batch<T, A> const& true_br, batch<T, A> const& false_br, requires_arch<wasm>) noexcept
1358
+ {
1359
+ return select(batch_bool<T, A> { Values... }, true_br, false_br, wasm {});
1360
+ }
1361
+ template <class A>
1362
+ XSIMD_INLINE batch<double, A> select(batch_bool<double, A> const& cond, batch<double, A> const& true_br, batch<double, A> const& false_br, requires_arch<wasm>) noexcept
1363
+ {
1364
+ return wasm_v128_or(wasm_v128_and(cond, true_br), wasm_v128_andnot(false_br, cond));
1365
+ }
1366
+
1367
+ // shuffle
1368
+ template <class A, class ITy, ITy I0, ITy I1, ITy I2, ITy I3>
1369
+ XSIMD_INLINE batch<float, A> shuffle(batch<float, A> const& x, batch<float, A> const& y, batch_constant<ITy, A, I0, I1, I2, I3>, requires_arch<wasm>) noexcept
1370
+ {
1371
+ return wasm_i32x4_shuffle(x, y, I0, I1, I2, I3);
1372
+ }
1373
+
1374
+ template <class A, class ITy, ITy I0, ITy I1>
1375
+ XSIMD_INLINE batch<double, A> shuffle(batch<double, A> const& x, batch<double, A> const& y, batch_constant<ITy, A, I0, I1>, requires_arch<wasm>) noexcept
1376
+ {
1377
+ return wasm_i64x2_shuffle(x, y, I0, I1);
1378
+ }
1379
+
1380
+ // set
1381
+ template <class A, class... Values>
1382
+ XSIMD_INLINE batch<float, A> set(batch<float, A> const&, requires_arch<wasm>, Values... values) noexcept
1383
+ {
1384
+ static_assert(sizeof...(Values) == batch<float, A>::size, "consistent init");
1385
+ return wasm_f32x4_make(values...);
1386
+ }
1387
+
1388
+ template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
1389
+ XSIMD_INLINE batch<T, A> set(batch<T, A> const&, requires_arch<wasm>, T v0, T v1) noexcept
1390
+ {
1391
+ return wasm_i64x2_make(v0, v1);
1392
+ }
1393
+
1394
+ template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
1395
+ XSIMD_INLINE batch<T, A> set(batch<T, A> const&, requires_arch<wasm>, T v0, T v1, T v2, T v3) noexcept
1396
+ {
1397
+ return wasm_i32x4_make(v0, v1, v2, v3);
1398
+ }
1399
+
1400
+ template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
1401
+ XSIMD_INLINE batch<T, A> set(batch<T, A> const&, requires_arch<wasm>, T v0, T v1, T v2, T v3, T v4, T v5, T v6, T v7) noexcept
1402
+ {
1403
+ return wasm_i16x8_make(v0, v1, v2, v3, v4, v5, v6, v7);
1404
+ }
1405
+
1406
+ template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
1407
+ XSIMD_INLINE batch<T, A> set(batch<T, A> const&, requires_arch<wasm>, T v0, T v1, T v2, T v3, T v4, T v5, T v6, T v7, T v8, T v9, T v10, T v11, T v12, T v13, T v14, T v15) noexcept
1408
+ {
1409
+ return wasm_i8x16_make(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15);
1410
+ }
1411
+
1412
+ template <class A, class... Values>
1413
+ XSIMD_INLINE batch<double, A> set(batch<double, A> const&, requires_arch<wasm>, Values... values) noexcept
1414
+ {
1415
+ static_assert(sizeof...(Values) == batch<double, A>::size, "consistent init");
1416
+ return wasm_f64x2_make(values...);
1417
+ }
1418
+
1419
+ template <class A, class T, class... Values, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
1420
+ XSIMD_INLINE batch_bool<T, A> set(batch_bool<T, A> const&, requires_arch<wasm>, Values... values) noexcept
1421
+ {
1422
+ return set(batch<T, A>(), A {}, static_cast<T>(values ? -1LL : 0LL)...).data;
1423
+ }
1424
+
1425
+ template <class A, class... Values>
1426
+ XSIMD_INLINE batch_bool<float, A> set(batch_bool<float, A> const&, requires_arch<wasm>, Values... values) noexcept
1427
+ {
1428
+ static_assert(sizeof...(Values) == batch_bool<float, A>::size, "consistent init");
1429
+ return set(batch<int32_t, A>(), A {}, static_cast<int32_t>(values ? -1LL : 0LL)...).data;
1430
+ }
1431
+
1432
+ template <class A, class... Values>
1433
+ XSIMD_INLINE batch_bool<double, A> set(batch_bool<double, A> const&, requires_arch<wasm>, Values... values) noexcept
1434
+ {
1435
+ static_assert(sizeof...(Values) == batch_bool<double, A>::size, "consistent init");
1436
+ return set(batch<int64_t, A>(), A {}, static_cast<int64_t>(values ? -1LL : 0LL)...).data;
1437
+ }
1438
+
1439
+ // ssub
1440
+ template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
1441
+ XSIMD_INLINE batch<T, A> ssub(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
1442
+ {
1443
+ if (std::is_signed<T>::value)
1444
+ {
1445
+ XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
1446
+ {
1447
+ return wasm_i8x16_sub_sat(self, other);
1448
+ }
1449
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
1450
+ {
1451
+ return wasm_i16x8_sub_sat(self, other);
1452
+ }
1453
+ else
1454
+ {
1455
+ return ssub(self, other, common {});
1456
+ }
1457
+ }
1458
+ else
1459
+ {
1460
+ XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
1461
+ {
1462
+ return wasm_u8x16_sub_sat(self, other);
1463
+ }
1464
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
1465
+ {
1466
+ return wasm_u16x8_sub_sat(self, other);
1467
+ }
1468
+ else
1469
+ {
1470
+ return ssub(self, other, common {});
1471
+ }
1472
+ }
1473
+ }
1474
+
1475
+ // store_aligned
1476
+ template <class A>
1477
+ XSIMD_INLINE void store_aligned(float* mem, batch<float, A> const& self, requires_arch<wasm>) noexcept
1478
+ {
1479
+ return wasm_v128_store(mem, self);
1480
+ }
1481
+ template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
1482
+ XSIMD_INLINE void store_aligned(T* mem, batch<T, A> const& self, requires_arch<wasm>) noexcept
1483
+ {
1484
+ return wasm_v128_store((v128_t*)mem, self);
1485
+ }
1486
+ template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
1487
+ XSIMD_INLINE void store_aligned(T* mem, batch_bool<T, A> const& self, requires_arch<wasm>) noexcept
1488
+ {
1489
+ return wasm_v128_store((v128_t*)mem, self);
1490
+ }
1491
+ template <class A>
1492
+ XSIMD_INLINE void store_aligned(double* mem, batch<double, A> const& self, requires_arch<wasm>) noexcept
1493
+ {
1494
+ return wasm_v128_store(mem, self);
1495
+ }
1496
+
1497
+ // store_complex
1498
+ namespace detail
1499
+ {
1500
+ // complex_low
1501
+ template <class A>
1502
+ XSIMD_INLINE batch<float, A> complex_low(batch<std::complex<float>, A> const& self, requires_arch<wasm>) noexcept
1503
+ {
1504
+ return wasm_i32x4_shuffle(self.real(), self.imag(), 0, 4, 1, 5);
1505
+ }
1506
+ // complex_high
1507
+ template <class A>
1508
+ XSIMD_INLINE batch<float, A> complex_high(batch<std::complex<float>, A> const& self, requires_arch<wasm>) noexcept
1509
+ {
1510
+ return wasm_i32x4_shuffle(self.real(), self.imag(), 2, 6, 3, 7);
1511
+ }
1512
+ template <class A>
1513
+ XSIMD_INLINE batch<double, A> complex_low(batch<std::complex<double>, A> const& self, requires_arch<wasm>) noexcept
1514
+ {
1515
+ return wasm_i64x2_shuffle(self.real(), self.imag(), 0, 2);
1516
+ }
1517
+ template <class A>
1518
+ XSIMD_INLINE batch<double, A> complex_high(batch<std::complex<double>, A> const& self, requires_arch<wasm>) noexcept
1519
+ {
1520
+ return wasm_i64x2_shuffle(self.real(), self.imag(), 1, 3);
1521
+ }
1522
+ }
1523
+
1524
+ // store_unaligned
1525
+ template <class A>
1526
+ XSIMD_INLINE void store_unaligned(float* mem, batch<float, A> const& self, requires_arch<wasm>) noexcept
1527
+ {
1528
+ return wasm_v128_store(mem, self);
1529
+ }
1530
+ template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
1531
+ XSIMD_INLINE void store_unaligned(T* mem, batch<T, A> const& self, requires_arch<wasm>) noexcept
1532
+ {
1533
+ return wasm_v128_store((v128_t*)mem, self);
1534
+ }
1535
+ template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
1536
+ XSIMD_INLINE void store_unaligned(T* mem, batch_bool<T, A> const& self, requires_arch<wasm>) noexcept
1537
+ {
1538
+ return wasm_v128_store((v128_t*)mem, self);
1539
+ }
1540
+ template <class A>
1541
+ XSIMD_INLINE void store_unaligned(double* mem, batch<double, A> const& self, requires_arch<wasm>) noexcept
1542
+ {
1543
+ return wasm_v128_store(mem, self);
1544
+ }
1545
+
1546
+ // sub
1547
+ template <class A>
1548
+ XSIMD_INLINE batch<float, A> sub(batch<float, A> const& self, batch<float, A> const& other, requires_arch<wasm>) noexcept
1549
+ {
1550
+ return wasm_f32x4_sub(self, other);
1551
+ }
1552
+ template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
1553
+ XSIMD_INLINE batch<T, A> sub(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
1554
+ {
1555
+ XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
1556
+ {
1557
+ return wasm_i8x16_sub(self, other);
1558
+ }
1559
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
1560
+ {
1561
+ return wasm_i16x8_sub(self, other);
1562
+ }
1563
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
1564
+ {
1565
+ return wasm_i32x4_sub(self, other);
1566
+ }
1567
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
1568
+ {
1569
+ return wasm_i64x2_sub(self, other);
1570
+ }
1571
+ else
1572
+ {
1573
+ assert(false && "unsupported arch/op combination");
1574
+ return {};
1575
+ }
1576
+ }
1577
+ template <class A>
1578
+ XSIMD_INLINE batch<double, A> sub(batch<double, A> const& self, batch<double, A> const& other, requires_arch<wasm>) noexcept
1579
+ {
1580
+ return wasm_f64x2_sub(self, other);
1581
+ }
1582
+
1583
+ // sqrt
1584
+ template <class A>
1585
+ XSIMD_INLINE batch<float, A> sqrt(batch<float, A> const& val, requires_arch<wasm>) noexcept
1586
+ {
1587
+ return wasm_f32x4_sqrt(val);
1588
+ }
1589
+ template <class A>
1590
+ XSIMD_INLINE batch<double, A> sqrt(batch<double, A> const& val, requires_arch<wasm>) noexcept
1591
+ {
1592
+ return wasm_f64x2_sqrt(val);
1593
+ }
1594
+
1595
+ // swizzle
1596
+ template <class A, uint32_t V0, uint32_t V1, uint32_t V2, uint32_t V3>
1597
+ XSIMD_INLINE batch<float, A> swizzle(batch<float, A> const& self, batch_constant<uint32_t, A, V0, V1, V2, V3>, requires_arch<wasm>) noexcept
1598
+ {
1599
+ return wasm_i32x4_shuffle(self, self, V0, V1, V2, V3);
1600
+ }
1601
+
1602
+ template <class A, uint64_t V0, uint64_t V1>
1603
+ XSIMD_INLINE batch<double, A> swizzle(batch<double, A> const& self, batch_constant<uint64_t, A, V0, V1>, requires_arch<wasm>) noexcept
1604
+ {
1605
+ return wasm_i64x2_shuffle(self, self, V0, V1);
1606
+ }
1607
+
1608
+ template <class A, uint64_t V0, uint64_t V1>
1609
+ XSIMD_INLINE batch<uint64_t, A> swizzle(batch<uint64_t, A> const& self, batch_constant<uint64_t, A, V0, V1>, requires_arch<wasm>) noexcept
1610
+ {
1611
+ return wasm_i64x2_shuffle(self, self, V0, V1);
1612
+ }
1613
+
1614
+ template <class A, uint64_t V0, uint64_t V1>
1615
+ XSIMD_INLINE batch<int64_t, A> swizzle(batch<int64_t, A> const& self, batch_constant<uint64_t, A, V0, V1> mask, requires_arch<wasm>) noexcept
1616
+ {
1617
+ return bitwise_cast<int64_t>(swizzle(bitwise_cast<uint64_t>(self), mask, wasm {}));
1618
+ }
1619
+
1620
+ template <class A, uint32_t V0, uint32_t V1, uint32_t V2, uint32_t V3>
1621
+ XSIMD_INLINE batch<uint32_t, A> swizzle(batch<uint32_t, A> const& self, batch_constant<uint32_t, A, V0, V1, V2, V3>, requires_arch<wasm>) noexcept
1622
+ {
1623
+ return wasm_i32x4_shuffle(self, self, V0, V1, V2, V3);
1624
+ }
1625
+
1626
+ template <class A, uint32_t V0, uint32_t V1, uint32_t V2, uint32_t V3>
1627
+ XSIMD_INLINE batch<int32_t, A> swizzle(batch<int32_t, A> const& self, batch_constant<uint32_t, A, V0, V1, V2, V3> mask, requires_arch<wasm>) noexcept
1628
+ {
1629
+ return bitwise_cast<int32_t>(swizzle(bitwise_cast<uint32_t>(self), mask, wasm {}));
1630
+ }
1631
+
1632
+ template <class A, uint16_t V0, uint16_t V1, uint16_t V2, uint16_t V3, uint16_t V4, uint16_t V5, uint16_t V6, uint16_t V7>
1633
+ XSIMD_INLINE batch<uint16_t, A> swizzle(batch<uint16_t, A> const& self, batch_constant<uint16_t, A, V0, V1, V2, V3, V4, V5, V6, V7>, requires_arch<wasm>) noexcept
1634
+ {
1635
+ return wasm_i16x8_shuffle(self, self, V0, V1, V2, V3, V4, V5, V6, V7);
1636
+ }
1637
+
1638
+ template <class A, uint16_t V0, uint16_t V1, uint16_t V2, uint16_t V3, uint16_t V4, uint16_t V5, uint16_t V6, uint16_t V7>
1639
+ XSIMD_INLINE batch<int16_t, A> swizzle(batch<int16_t, A> const& self, batch_constant<uint16_t, A, V0, V1, V2, V3, V4, V5, V6, V7> mask, requires_arch<wasm>) noexcept
1640
+ {
1641
+ return bitwise_cast<int16_t>(swizzle(bitwise_cast<uint16_t>(self), mask, wasm {}));
1642
+ }
1643
+
1644
+ template <class A, uint8_t V0, uint8_t V1, uint8_t V2, uint8_t V3, uint8_t V4, uint8_t V5, uint8_t V6, uint8_t V7,
1645
+ uint8_t V8, uint8_t V9, uint8_t V10, uint8_t V11, uint8_t V12, uint8_t V13, uint8_t V14, uint8_t V15>
1646
+ XSIMD_INLINE batch<uint8_t, A> swizzle(batch<uint8_t, A> const& self, batch_constant<uint8_t, A, V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15>, requires_arch<wasm>) noexcept
1647
+ {
1648
+ return wasm_i8x16_shuffle(self, self, V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15);
1649
+ }
1650
+
1651
+ template <class A, uint8_t V0, uint8_t V1, uint8_t V2, uint8_t V3, uint8_t V4, uint8_t V5, uint8_t V6, uint8_t V7,
1652
+ uint8_t V8, uint8_t V9, uint8_t V10, uint8_t V11, uint8_t V12, uint8_t V13, uint8_t V14, uint8_t V15>
1653
+ XSIMD_INLINE batch<int8_t, A> swizzle(batch<int8_t, A> const& self, batch_constant<uint8_t, A, V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15> mask, requires_arch<wasm>) noexcept
1654
+ {
1655
+ return bitwise_cast<int8_t>(swizzle(bitwise_cast<uint8_t>(self), mask, wasm {}));
1656
+ }
1657
+
1658
+ // transpose
1659
+ template <class A, class T>
1660
+ XSIMD_INLINE void transpose(batch<T, A>* matrix_begin, batch<T, A>* matrix_end, requires_arch<wasm>) noexcept
1661
+ {
1662
+ assert((matrix_end - matrix_begin == batch<T, A>::size) && "correctly sized matrix");
1663
+ (void)matrix_end;
1664
+ XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
1665
+ {
1666
+ auto r0 = matrix_begin[0], r1 = matrix_begin[1], r2 = matrix_begin[2], r3 = matrix_begin[3];
1667
+
1668
+ auto t0 = wasm_i32x4_shuffle(r0, r1, 0, 4, 1, 5); // r0[0] r1[0] r0[1] r1[1]
1669
+ auto t1 = wasm_i32x4_shuffle(r0, r1, 2, 6, 3, 7); // r0[2] r1[2] r0[3] r1[3]
1670
+
1671
+ auto t2 = wasm_i32x4_shuffle(r2, r3, 0, 4, 1, 5); // r2[0] r3[0] r2[1] r3[1]
1672
+ auto t3 = wasm_i32x4_shuffle(r2, r3, 2, 6, 3, 7); // r2[2] r3[2] r2[3] r3[3]
1673
+
1674
+ matrix_begin[0] = wasm_i32x4_shuffle(t0, t2, 0, 1, 4, 5); // r0[0] r1[0] r2[0] r3[0]
1675
+ matrix_begin[1] = wasm_i32x4_shuffle(t0, t2, 2, 3, 6, 7); // r0[1] r1[1] r2[1] r3[1]
1676
+ matrix_begin[2] = wasm_i32x4_shuffle(t1, t3, 0, 1, 4, 5); // r0[2] r1[2] r2[2] r3[2]
1677
+ matrix_begin[3] = wasm_i32x4_shuffle(t1, t3, 2, 3, 6, 7); // r0[3] r1[3] r2[3] r3[3]
1678
+ }
1679
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
1680
+ {
1681
+ auto r0 = matrix_begin[0], r1 = matrix_begin[1];
1682
+
1683
+ matrix_begin[0] = wasm_i64x2_shuffle(r0, r1, 0, 2);
1684
+ matrix_begin[1] = wasm_i64x2_shuffle(r0, r1, 1, 3);
1685
+ }
1686
+ else
1687
+ {
1688
+ transpose(matrix_begin, matrix_end, common {});
1689
+ }
1690
+ }
1691
+
1692
+ // trunc
1693
+ template <class A>
1694
+ XSIMD_INLINE batch<float, A> trunc(batch<float, A> const& self, requires_arch<wasm>) noexcept
1695
+ {
1696
+ return wasm_f32x4_trunc(self);
1697
+ }
1698
+ template <class A>
1699
+ XSIMD_INLINE batch<double, A> trunc(batch<double, A> const& self, requires_arch<wasm>) noexcept
1700
+ {
1701
+ return wasm_f64x2_trunc(self);
1702
+ }
1703
+
1704
+ // zip_hi
1705
+ template <class A>
1706
+ XSIMD_INLINE batch<float, A> zip_hi(batch<float, A> const& self, batch<float, A> const& other, requires_arch<wasm>) noexcept
1707
+ {
1708
+ return wasm_i32x4_shuffle(self, other, 2, 6, 3, 7);
1709
+ }
1710
+ template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
1711
+ XSIMD_INLINE batch<T, A> zip_hi(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
1712
+ {
1713
+ XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
1714
+ {
1715
+ return wasm_i8x16_shuffle(self, other, 8, 24, 9, 25, 10, 26, 11, 27, 12, 28, 13, 29, 14, 30, 15, 31);
1716
+ }
1717
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
1718
+ {
1719
+ return wasm_i16x8_shuffle(self, other, 4, 12, 5, 13, 6, 14, 7, 15);
1720
+ }
1721
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
1722
+ {
1723
+ return wasm_i32x4_shuffle(self, other, 2, 6, 3, 7);
1724
+ }
1725
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
1726
+ {
1727
+ return wasm_i64x2_shuffle(self, other, 1, 3);
1728
+ }
1729
+ else
1730
+ {
1731
+ assert(false && "unsupported arch/op combination");
1732
+ return {};
1733
+ }
1734
+ }
1735
+ template <class A>
1736
+ XSIMD_INLINE batch<double, A> zip_hi(batch<double, A> const& self, batch<double, A> const& other, requires_arch<wasm>) noexcept
1737
+ {
1738
+ return wasm_i64x2_shuffle(self, other, 1, 3);
1739
+ }
1740
+
1741
+ // zip_lo
1742
+ template <class A>
1743
+ XSIMD_INLINE batch<float, A> zip_lo(batch<float, A> const& self, batch<float, A> const& other, requires_arch<wasm>) noexcept
1744
+ {
1745
+ return wasm_i32x4_shuffle(self, other, 0, 4, 1, 5);
1746
+ }
1747
+ template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type>
1748
+ XSIMD_INLINE batch<T, A> zip_lo(batch<T, A> const& self, batch<T, A> const& other, requires_arch<wasm>) noexcept
1749
+ {
1750
+ XSIMD_IF_CONSTEXPR(sizeof(T) == 1)
1751
+ {
1752
+ return wasm_i8x16_shuffle(self, other, 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23);
1753
+ }
1754
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 2)
1755
+ {
1756
+ return wasm_i16x8_shuffle(self, other, 0, 8, 1, 9, 2, 10, 3, 11);
1757
+ }
1758
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 4)
1759
+ {
1760
+ return wasm_i32x4_shuffle(self, other, 0, 4, 1, 5);
1761
+ }
1762
+ else XSIMD_IF_CONSTEXPR(sizeof(T) == 8)
1763
+ {
1764
+ return wasm_i64x2_shuffle(self, other, 0, 2);
1765
+ }
1766
+ else
1767
+ {
1768
+ assert(false && "unsupported arch/op combination");
1769
+ return {};
1770
+ }
1771
+ }
1772
+ template <class A>
1773
+ XSIMD_INLINE batch<double, A> zip_lo(batch<double, A> const& self, batch<double, A> const& other, requires_arch<wasm>) noexcept
1774
+ {
1775
+ return wasm_i64x2_shuffle(self, other, 0, 2);
1776
+ }
1777
+ }
1778
+ }
1779
+
1780
+ #endif