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,1543 @@
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_NEON64_HPP
13
+ #define XSIMD_NEON64_HPP
14
+
15
+ #include <complex>
16
+ #include <cstddef>
17
+ #include <tuple>
18
+
19
+ #include "../types/xsimd_neon64_register.hpp"
20
+ #include "../types/xsimd_utils.hpp"
21
+
22
+ namespace xsimd
23
+ {
24
+ template <typename T, class A, bool... Values>
25
+ struct batch_bool_constant;
26
+
27
+ namespace kernel
28
+ {
29
+ using namespace types;
30
+
31
+ // first
32
+ template <class A>
33
+ XSIMD_INLINE double first(batch<double, A> const& self, requires_arch<neon64>) noexcept
34
+ {
35
+ return vgetq_lane_f64(self, 0);
36
+ }
37
+
38
+ /*******
39
+ * all *
40
+ *******/
41
+
42
+ template <class A, class T, detail::enable_sized_t<T, 4> = 0>
43
+ XSIMD_INLINE bool all(batch_bool<T, A> const& arg, requires_arch<neon64>) noexcept
44
+ {
45
+ return vminvq_u32(arg) == ~0U;
46
+ }
47
+
48
+ template <class A, class T, detail::enable_sized_t<T, 1> = 0>
49
+ XSIMD_INLINE bool all(batch_bool<T, A> const& arg, requires_arch<neon64>) noexcept
50
+ {
51
+ return all(batch_bool<uint32_t, A>(vreinterpretq_u32_u8(arg)), neon64 {});
52
+ }
53
+
54
+ template <class A, class T, detail::enable_sized_t<T, 2> = 0>
55
+ XSIMD_INLINE bool all(batch_bool<T, A> const& arg, requires_arch<neon64>) noexcept
56
+ {
57
+ return all(batch_bool<uint32_t, A>(vreinterpretq_u32_u16(arg)), neon64 {});
58
+ }
59
+
60
+ template <class A, class T, detail::enable_sized_t<T, 8> = 0>
61
+ XSIMD_INLINE bool all(batch_bool<T, A> const& arg, requires_arch<neon64>) noexcept
62
+ {
63
+ return all(batch_bool<uint32_t, A>(vreinterpretq_u32_u64(arg)), neon64 {});
64
+ }
65
+
66
+ /*******
67
+ * any *
68
+ *******/
69
+
70
+ template <class A, class T, detail::enable_sized_t<T, 4> = 0>
71
+ XSIMD_INLINE bool any(batch_bool<T, A> const& arg, requires_arch<neon64>) noexcept
72
+ {
73
+ return vmaxvq_u32(arg) != 0;
74
+ }
75
+
76
+ template <class A, class T, detail::enable_sized_t<T, 1> = 0>
77
+ XSIMD_INLINE bool any(batch_bool<T, A> const& arg, requires_arch<neon64>) noexcept
78
+ {
79
+ return any(batch_bool<uint32_t, A>(vreinterpretq_u32_u8(arg)), neon64 {});
80
+ }
81
+
82
+ template <class A, class T, detail::enable_sized_t<T, 2> = 0>
83
+ XSIMD_INLINE bool any(batch_bool<T, A> const& arg, requires_arch<neon64>) noexcept
84
+ {
85
+ return any(batch_bool<uint32_t, A>(vreinterpretq_u32_u16(arg)), neon64 {});
86
+ }
87
+
88
+ template <class A, class T, detail::enable_sized_t<T, 8> = 0>
89
+ XSIMD_INLINE bool any(batch_bool<T, A> const& arg, requires_arch<neon64>) noexcept
90
+ {
91
+ return any(batch_bool<uint32_t, A>(vreinterpretq_u32_u64(arg)), neon64 {});
92
+ }
93
+
94
+ /*************
95
+ * broadcast *
96
+ *************/
97
+
98
+ // Required to avoid ambiguous call
99
+ template <class A, class T>
100
+ XSIMD_INLINE batch<T, A> broadcast(T val, requires_arch<neon64>) noexcept
101
+ {
102
+ return broadcast<A>(val, neon {});
103
+ }
104
+
105
+ template <class A>
106
+ XSIMD_INLINE batch<double, A> broadcast(double val, requires_arch<neon64>) noexcept
107
+ {
108
+ return vdupq_n_f64(val);
109
+ }
110
+
111
+ /*******
112
+ * set *
113
+ *******/
114
+
115
+ template <class A>
116
+ XSIMD_INLINE batch<double, A> set(batch<double, A> const&, requires_arch<neon64>, double d0, double d1) noexcept
117
+ {
118
+ return float64x2_t { d0, d1 };
119
+ }
120
+
121
+ template <class A>
122
+ XSIMD_INLINE batch_bool<double, A> set(batch_bool<double, A> const&, requires_arch<neon64>, bool b0, bool b1) noexcept
123
+ {
124
+ using register_type = typename batch_bool<double, A>::register_type;
125
+ using unsigned_type = as_unsigned_integer_t<double>;
126
+ return register_type { static_cast<unsigned_type>(b0 ? -1LL : 0LL),
127
+ static_cast<unsigned_type>(b1 ? -1LL : 0LL) };
128
+ }
129
+
130
+ /*************
131
+ * from_bool *
132
+ *************/
133
+
134
+ template <class A>
135
+ XSIMD_INLINE batch<double, A> from_bool(batch_bool<double, A> const& arg, requires_arch<neon64>) noexcept
136
+ {
137
+ return vreinterpretq_f64_u64(vandq_u64(arg, vreinterpretq_u64_f64(vdupq_n_f64(1.))));
138
+ }
139
+
140
+ /********
141
+ * load *
142
+ ********/
143
+ #if defined(__clang__) || defined(__GNUC__)
144
+ #define xsimd_aligned_load(inst, type, expr) inst((type)__builtin_assume_aligned(expr, 16))
145
+ #elif defined(_MSC_VER)
146
+ #define xsimd_aligned_load(inst, type, expr) inst##_ex((type)expr, 128)
147
+ #else
148
+ #define xsimd_aligned_load(inst, type, expr) inst((type)expr)
149
+ #endif
150
+
151
+ template <class A>
152
+ XSIMD_INLINE batch<double, A> load_aligned(double const* src, convert<double>, requires_arch<neon64>) noexcept
153
+ {
154
+ return xsimd_aligned_load(vld1q_f64, double*, src);
155
+ }
156
+
157
+ template <class A>
158
+ XSIMD_INLINE batch<double, A> load_unaligned(double const* src, convert<double>, requires_arch<neon64>) noexcept
159
+ {
160
+ return vld1q_f64(src);
161
+ }
162
+ #undef xsimd_aligned_load
163
+
164
+ /*********
165
+ * store *
166
+ *********/
167
+
168
+ template <class A>
169
+ XSIMD_INLINE void store_aligned(double* dst, batch<double, A> const& src, requires_arch<neon64>) noexcept
170
+ {
171
+ vst1q_f64(dst, src);
172
+ }
173
+
174
+ template <class A>
175
+ XSIMD_INLINE void store_unaligned(double* dst, batch<double, A> const& src, requires_arch<neon64>) noexcept
176
+ {
177
+ return store_aligned<A>(dst, src, A {});
178
+ }
179
+
180
+ /****************
181
+ * load_complex *
182
+ ****************/
183
+
184
+ template <class A>
185
+ XSIMD_INLINE batch<std::complex<double>, A> load_complex_aligned(std::complex<double> const* mem, convert<std::complex<double>>, requires_arch<neon64>) noexcept
186
+ {
187
+ using real_batch = batch<double, A>;
188
+ const double* buf = reinterpret_cast<const double*>(mem);
189
+ float64x2x2_t tmp = vld2q_f64(buf);
190
+ real_batch real = tmp.val[0],
191
+ imag = tmp.val[1];
192
+ return batch<std::complex<double>, A> { real, imag };
193
+ }
194
+
195
+ template <class A>
196
+ XSIMD_INLINE batch<std::complex<double>, A> load_complex_unaligned(std::complex<double> const* mem, convert<std::complex<double>> cvt, requires_arch<neon64>) noexcept
197
+ {
198
+ return load_complex_aligned<A>(mem, cvt, A {});
199
+ }
200
+
201
+ /*****************
202
+ * store_complex *
203
+ *****************/
204
+
205
+ template <class A>
206
+ XSIMD_INLINE void store_complex_aligned(std::complex<double>* dst, batch<std::complex<double>, A> const& src, requires_arch<neon64>) noexcept
207
+ {
208
+ float64x2x2_t tmp;
209
+ tmp.val[0] = src.real();
210
+ tmp.val[1] = src.imag();
211
+ double* buf = reinterpret_cast<double*>(dst);
212
+ vst2q_f64(buf, tmp);
213
+ }
214
+
215
+ template <class A>
216
+ XSIMD_INLINE void store_complex_unaligned(std::complex<double>* dst, batch<std::complex<double>, A> const& src, requires_arch<neon64>) noexcept
217
+ {
218
+ store_complex_aligned(dst, src, A {});
219
+ }
220
+
221
+ /*******
222
+ * neg *
223
+ *******/
224
+
225
+ template <class A, class T, detail::enable_sized_unsigned_t<T, 8> = 0>
226
+ XSIMD_INLINE batch<T, A> neg(batch<T, A> const& rhs, requires_arch<neon64>) noexcept
227
+ {
228
+ return vreinterpretq_u64_s64(vnegq_s64(vreinterpretq_s64_u64(rhs)));
229
+ }
230
+
231
+ template <class A, class T, detail::enable_sized_signed_t<T, 8> = 0>
232
+ XSIMD_INLINE batch<T, A> neg(batch<T, A> const& rhs, requires_arch<neon64>) noexcept
233
+ {
234
+ return vnegq_s64(rhs);
235
+ }
236
+
237
+ template <class A>
238
+ XSIMD_INLINE batch<double, A> neg(batch<double, A> const& rhs, requires_arch<neon64>) noexcept
239
+ {
240
+ return vnegq_f64(rhs);
241
+ }
242
+
243
+ /*******
244
+ * add *
245
+ *******/
246
+
247
+ template <class A>
248
+ XSIMD_INLINE batch<double, A> add(batch<double, A> const& lhs, batch<double, A> const& rhs, requires_arch<neon64>) noexcept
249
+ {
250
+ return vaddq_f64(lhs, rhs);
251
+ }
252
+
253
+ /********
254
+ * sadd *
255
+ ********/
256
+
257
+ template <class A>
258
+ XSIMD_INLINE batch<double, A> sadd(batch<double, A> const& lhs, batch<double, A> const& rhs, requires_arch<neon64>) noexcept
259
+ {
260
+ return add(lhs, rhs, neon64 {});
261
+ }
262
+
263
+ /*******
264
+ * sub *
265
+ *******/
266
+
267
+ template <class A>
268
+ XSIMD_INLINE batch<double, A> sub(batch<double, A> const& lhs, batch<double, A> const& rhs, requires_arch<neon64>) noexcept
269
+ {
270
+ return vsubq_f64(lhs, rhs);
271
+ }
272
+
273
+ /********
274
+ * ssub *
275
+ ********/
276
+
277
+ template <class A>
278
+ XSIMD_INLINE batch<double, A> ssub(batch<double, A> const& lhs, batch<double, A> const& rhs, requires_arch<neon64>) noexcept
279
+ {
280
+ return sub(lhs, rhs, neon64 {});
281
+ }
282
+
283
+ /*******
284
+ * mul *
285
+ *******/
286
+
287
+ template <class A>
288
+ XSIMD_INLINE batch<double, A> mul(batch<double, A> const& lhs, batch<double, A> const& rhs, requires_arch<neon64>) noexcept
289
+ {
290
+ return vmulq_f64(lhs, rhs);
291
+ }
292
+
293
+ /*******
294
+ * div *
295
+ *******/
296
+
297
+ #if defined(XSIMD_FAST_INTEGER_DIVISION)
298
+ template <class A, class T, detail::enable_sized_unsigned_t<T, 8> = 0>
299
+ XSIMD_INLINE batch<T, A> div(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<neon64>) noexcept
300
+ {
301
+ return vcvtq_u64_f64(vcvtq_f64_u64(lhs) / vcvtq_f64_u64(rhs));
302
+ }
303
+
304
+ template <class A, class T, detail::enable_sized_signed_t<T, 8> = 0>
305
+ XSIMD_INLINE batch<T, A> div(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<neon64>) noexcept
306
+ {
307
+ return vcvtq_s64_f64(vcvtq_f64_s64(lhs) / vcvtq_f64_s64(rhs));
308
+ }
309
+ #endif
310
+ template <class A>
311
+ XSIMD_INLINE batch<double, A> div(batch<double, A> const& lhs, batch<double, A> const& rhs, requires_arch<neon64>) noexcept
312
+ {
313
+ return vdivq_f64(lhs, rhs);
314
+ }
315
+
316
+ /******
317
+ * eq *
318
+ ******/
319
+
320
+ template <class A, class T, detail::enable_sized_unsigned_t<T, 8> = 0>
321
+ XSIMD_INLINE batch_bool<T, A> eq(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<neon64>) noexcept
322
+ {
323
+ return vceqq_u64(lhs, rhs);
324
+ }
325
+
326
+ template <class A, class T, detail::enable_sized_signed_t<T, 8> = 0>
327
+ XSIMD_INLINE batch_bool<T, A> eq(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<neon64>) noexcept
328
+ {
329
+ return vceqq_s64(lhs, rhs);
330
+ }
331
+
332
+ template <class A>
333
+ XSIMD_INLINE batch_bool<double, A> eq(batch<double, A> const& lhs, batch<double, A> const& rhs, requires_arch<neon64>) noexcept
334
+ {
335
+ return vceqq_f64(lhs, rhs);
336
+ }
337
+
338
+ template <class A, class T, detail::enable_sized_unsigned_t<T, 8> = 0>
339
+ XSIMD_INLINE batch_bool<T, A> eq(batch_bool<T, A> const& lhs, batch_bool<T, A> const& rhs, requires_arch<neon64>) noexcept
340
+ {
341
+ return vceqq_u64(lhs, rhs);
342
+ }
343
+
344
+ template <class A, class T, detail::enable_sized_signed_t<T, 8> = 0>
345
+ XSIMD_INLINE batch_bool<T, A> eq(batch_bool<T, A> const& lhs, batch_bool<T, A> const& rhs, requires_arch<neon64>) noexcept
346
+ {
347
+ return vceqq_u64(lhs, rhs);
348
+ }
349
+
350
+ template <class A>
351
+ XSIMD_INLINE batch_bool<double, A> eq(batch_bool<double, A> const& lhs, batch_bool<double, A> const& rhs, requires_arch<neon64>) noexcept
352
+ {
353
+ return vceqq_u64(lhs, rhs);
354
+ }
355
+
356
+ /*************
357
+ * fast_cast *
358
+ *************/
359
+ namespace detail
360
+ {
361
+ template <class A>
362
+ XSIMD_INLINE batch<double, A> fast_cast(batch<int64_t, A> const& x, batch<double, A> const&, requires_arch<neon64>) noexcept
363
+ {
364
+ return vcvtq_f64_s64(x);
365
+ }
366
+
367
+ template <class A>
368
+ XSIMD_INLINE batch<double, A> fast_cast(batch<uint64_t, A> const& x, batch<double, A> const&, requires_arch<neon64>) noexcept
369
+ {
370
+ return vcvtq_f64_u64(x);
371
+ }
372
+
373
+ template <class A>
374
+ XSIMD_INLINE batch<int64_t, A> fast_cast(batch<double, A> const& x, batch<int64_t, A> const&, requires_arch<neon64>) noexcept
375
+ {
376
+ return vcvtq_s64_f64(x);
377
+ }
378
+
379
+ template <class A>
380
+ XSIMD_INLINE batch<uint64_t, A> fast_cast(batch<double, A> const& x, batch<uint64_t, A> const&, requires_arch<neon64>) noexcept
381
+ {
382
+ return vcvtq_u64_f64(x);
383
+ }
384
+
385
+ }
386
+
387
+ /******
388
+ * lt *
389
+ ******/
390
+
391
+ template <class A, class T, detail::enable_sized_unsigned_t<T, 8> = 0>
392
+ XSIMD_INLINE batch_bool<T, A> lt(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<neon64>) noexcept
393
+ {
394
+ return vcltq_u64(lhs, rhs);
395
+ }
396
+
397
+ template <class A, class T, detail::enable_sized_signed_t<T, 8> = 0>
398
+ XSIMD_INLINE batch_bool<T, A> lt(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<neon64>) noexcept
399
+ {
400
+ return vcltq_s64(lhs, rhs);
401
+ }
402
+
403
+ template <class A>
404
+ XSIMD_INLINE batch_bool<double, A> lt(batch<double, A> const& lhs, batch<double, A> const& rhs, requires_arch<neon64>) noexcept
405
+ {
406
+ return vcltq_f64(lhs, rhs);
407
+ }
408
+
409
+ /******
410
+ * le *
411
+ ******/
412
+
413
+ template <class A, class T, detail::enable_sized_unsigned_t<T, 8> = 0>
414
+ XSIMD_INLINE batch_bool<T, A> le(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<neon64>) noexcept
415
+ {
416
+ return vcleq_u64(lhs, rhs);
417
+ }
418
+
419
+ template <class A, class T, detail::enable_sized_signed_t<T, 8> = 0>
420
+ XSIMD_INLINE batch_bool<T, A> le(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<neon64>) noexcept
421
+ {
422
+ return vcleq_s64(lhs, rhs);
423
+ }
424
+
425
+ template <class A>
426
+ XSIMD_INLINE batch_bool<double, A> le(batch<double, A> const& lhs, batch<double, A> const& rhs, requires_arch<neon64>) noexcept
427
+ {
428
+ return vcleq_f64(lhs, rhs);
429
+ }
430
+
431
+ /******
432
+ * gt *
433
+ ******/
434
+
435
+ template <class A, class T, detail::enable_sized_unsigned_t<T, 8> = 0>
436
+ XSIMD_INLINE batch_bool<T, A> gt(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<neon64>) noexcept
437
+ {
438
+ return vcgtq_u64(lhs, rhs);
439
+ }
440
+
441
+ template <class A, class T, detail::enable_sized_signed_t<T, 8> = 0>
442
+ XSIMD_INLINE batch_bool<T, A> gt(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<neon64>) noexcept
443
+ {
444
+ return vcgtq_s64(lhs, rhs);
445
+ }
446
+
447
+ template <class A>
448
+ XSIMD_INLINE batch_bool<double, A> gt(batch<double, A> const& lhs, batch<double, A> const& rhs, requires_arch<neon64>) noexcept
449
+ {
450
+ return vcgtq_f64(lhs, rhs);
451
+ }
452
+
453
+ /******
454
+ * ge *
455
+ ******/
456
+
457
+ template <class A, class T, detail::enable_sized_unsigned_t<T, 8> = 0>
458
+ XSIMD_INLINE batch_bool<T, A> ge(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<neon64>) noexcept
459
+ {
460
+ return vcgeq_u64(lhs, rhs);
461
+ }
462
+
463
+ template <class A, class T, detail::enable_sized_signed_t<T, 8> = 0>
464
+ XSIMD_INLINE batch_bool<T, A> ge(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<neon64>) noexcept
465
+ {
466
+ return vcgeq_s64(lhs, rhs);
467
+ }
468
+
469
+ template <class A>
470
+ XSIMD_INLINE batch_bool<double, A> ge(batch<double, A> const& lhs, batch<double, A> const& rhs, requires_arch<neon64>) noexcept
471
+ {
472
+ return vcgeq_f64(lhs, rhs);
473
+ }
474
+
475
+ /*******************
476
+ * batch_bool_cast *
477
+ *******************/
478
+
479
+ template <class A, class T_out, class T_in>
480
+ 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<neon64>) noexcept
481
+ {
482
+ using register_type = typename batch_bool<T_out, A>::register_type;
483
+ return register_type(self);
484
+ }
485
+
486
+ /***************
487
+ * bitwise_and *
488
+ ***************/
489
+
490
+ template <class A>
491
+ XSIMD_INLINE batch<double, A> bitwise_and(batch<double, A> const& lhs, batch<double, A> const& rhs, requires_arch<neon64>) noexcept
492
+ {
493
+ return vreinterpretq_f64_u64(vandq_u64(vreinterpretq_u64_f64(lhs),
494
+ vreinterpretq_u64_f64(rhs)));
495
+ }
496
+
497
+ template <class A>
498
+ XSIMD_INLINE batch_bool<double, A> bitwise_and(batch_bool<double, A> const& lhs, batch_bool<double, A> const& rhs, requires_arch<neon64>) noexcept
499
+ {
500
+ return vandq_u64(lhs, rhs);
501
+ }
502
+
503
+ /**************
504
+ * bitwise_or *
505
+ **************/
506
+
507
+ template <class A>
508
+ XSIMD_INLINE batch<double, A> bitwise_or(batch<double, A> const& lhs, batch<double, A> const& rhs, requires_arch<neon64>) noexcept
509
+ {
510
+ return vreinterpretq_f64_u64(vorrq_u64(vreinterpretq_u64_f64(lhs),
511
+ vreinterpretq_u64_f64(rhs)));
512
+ }
513
+
514
+ template <class A>
515
+ XSIMD_INLINE batch_bool<double, A> bitwise_or(batch_bool<double, A> const& lhs, batch_bool<double, A> const& rhs, requires_arch<neon64>) noexcept
516
+ {
517
+ return vorrq_u64(lhs, rhs);
518
+ }
519
+
520
+ /***************
521
+ * bitwise_xor *
522
+ ***************/
523
+
524
+ template <class A>
525
+ XSIMD_INLINE batch<double, A> bitwise_xor(batch<double, A> const& lhs, batch<double, A> const& rhs, requires_arch<neon64>) noexcept
526
+ {
527
+ return vreinterpretq_f64_u64(veorq_u64(vreinterpretq_u64_f64(lhs),
528
+ vreinterpretq_u64_f64(rhs)));
529
+ }
530
+
531
+ template <class A>
532
+ XSIMD_INLINE batch_bool<double, A> bitwise_xor(batch_bool<double, A> const& lhs, batch_bool<double, A> const& rhs, requires_arch<neon64>) noexcept
533
+ {
534
+ return veorq_u64(lhs, rhs);
535
+ }
536
+
537
+ /*******
538
+ * neq *
539
+ *******/
540
+
541
+ template <class A>
542
+ XSIMD_INLINE batch_bool<double, A> neq(batch_bool<double, A> const& lhs, batch_bool<double, A> const& rhs, requires_arch<neon64>) noexcept
543
+ {
544
+ return bitwise_xor(lhs, rhs, A {});
545
+ }
546
+
547
+ /***************
548
+ * bitwise_not *
549
+ ***************/
550
+
551
+ template <class A>
552
+ XSIMD_INLINE batch<double, A> bitwise_not(batch<double, A> const& rhs, requires_arch<neon64>) noexcept
553
+ {
554
+ return vreinterpretq_f64_u32(vmvnq_u32(vreinterpretq_u32_f64(rhs)));
555
+ }
556
+
557
+ template <class A>
558
+ XSIMD_INLINE batch_bool<double, A> bitwise_not(batch_bool<double, A> const& rhs, requires_arch<neon64>) noexcept
559
+ {
560
+ return detail::bitwise_not_u64(rhs);
561
+ }
562
+
563
+ /******************
564
+ * bitwise_andnot *
565
+ ******************/
566
+
567
+ template <class A>
568
+ XSIMD_INLINE batch<double, A> bitwise_andnot(batch<double, A> const& lhs, batch<double, A> const& rhs, requires_arch<neon64>) noexcept
569
+ {
570
+ return vreinterpretq_f64_u64(vbicq_u64(vreinterpretq_u64_f64(lhs),
571
+ vreinterpretq_u64_f64(rhs)));
572
+ }
573
+
574
+ template <class A>
575
+ XSIMD_INLINE batch_bool<double, A> bitwise_andnot(batch_bool<double, A> const& lhs, batch_bool<double, A> const& rhs, requires_arch<neon64>) noexcept
576
+ {
577
+ return vbicq_u64(lhs, rhs);
578
+ }
579
+
580
+ /*******
581
+ * min *
582
+ *******/
583
+
584
+ template <class A>
585
+ XSIMD_INLINE batch<double, A> min(batch<double, A> const& lhs, batch<double, A> const& rhs, requires_arch<neon64>) noexcept
586
+ {
587
+ return vminq_f64(lhs, rhs);
588
+ }
589
+
590
+ /*******
591
+ * max *
592
+ *******/
593
+
594
+ template <class A>
595
+ XSIMD_INLINE batch<double, A> max(batch<double, A> const& lhs, batch<double, A> const& rhs, requires_arch<neon64>) noexcept
596
+ {
597
+ return vmaxq_f64(lhs, rhs);
598
+ }
599
+
600
+ /*******
601
+ * abs *
602
+ *******/
603
+
604
+ template <class A, class T, detail::enable_sized_unsigned_t<T, 8> = 0>
605
+ XSIMD_INLINE batch<T, A> abs(batch<T, A> const& rhs, requires_arch<neon64>) noexcept
606
+ {
607
+ return rhs;
608
+ }
609
+
610
+ template <class A, class T, detail::enable_sized_signed_t<T, 8> = 0>
611
+ XSIMD_INLINE batch<T, A> abs(batch<T, A> const& rhs, requires_arch<neon64>) noexcept
612
+ {
613
+ return vabsq_s64(rhs);
614
+ }
615
+
616
+ template <class A>
617
+ XSIMD_INLINE batch<double, A> abs(batch<double, A> const& rhs, requires_arch<neon64>) noexcept
618
+ {
619
+ return vabsq_f64(rhs);
620
+ }
621
+
622
+ template <class A>
623
+ XSIMD_INLINE batch<int32_t, A> nearbyint_as_int(batch<float, A> const& self,
624
+ requires_arch<neon64>) noexcept
625
+ {
626
+ return vcvtnq_s32_f32(self);
627
+ }
628
+
629
+ #if !defined(__GNUC__)
630
+ template <class A>
631
+ XSIMD_INLINE batch<int64_t, A> nearbyint_as_int(batch<double, A> const& self,
632
+ requires_arch<neon64>) noexcept
633
+ {
634
+ return vcvtnq_s64_f64(self);
635
+ }
636
+ #endif
637
+
638
+ /**************
639
+ * reciprocal *
640
+ **************/
641
+
642
+ template <class A>
643
+ XSIMD_INLINE batch<double, A>
644
+ reciprocal(const batch<double, A>& x,
645
+ kernel::requires_arch<neon64>) noexcept
646
+ {
647
+ return vrecpeq_f64(x);
648
+ }
649
+
650
+ /********
651
+ * rsqrt *
652
+ ********/
653
+
654
+ template <class A>
655
+ XSIMD_INLINE batch<double, A> rsqrt(batch<double, A> const& rhs, requires_arch<neon64>) noexcept
656
+ {
657
+ return vrsqrteq_f64(rhs);
658
+ }
659
+
660
+ /********
661
+ * sqrt *
662
+ ********/
663
+
664
+ template <class A>
665
+ XSIMD_INLINE batch<double, A> sqrt(batch<double, A> const& rhs, requires_arch<neon64>) noexcept
666
+ {
667
+ return vsqrtq_f64(rhs);
668
+ }
669
+
670
+ /********************
671
+ * Fused operations *
672
+ ********************/
673
+
674
+ #ifdef __ARM_FEATURE_FMA
675
+ template <class A>
676
+ XSIMD_INLINE batch<double, A> fma(batch<double, A> const& x, batch<double, A> const& y, batch<double, A> const& z, requires_arch<neon64>) noexcept
677
+ {
678
+ return vfmaq_f64(z, x, y);
679
+ }
680
+
681
+ template <class A>
682
+ XSIMD_INLINE batch<double, A> fms(batch<double, A> const& x, batch<double, A> const& y, batch<double, A> const& z, requires_arch<neon64>) noexcept
683
+ {
684
+ return vfmaq_f64(-z, x, y);
685
+ }
686
+ #endif
687
+
688
+ /*********
689
+ * haddp *
690
+ *********/
691
+
692
+ template <class A>
693
+ XSIMD_INLINE batch<double, A> haddp(const batch<double, A>* row, requires_arch<neon64>) noexcept
694
+ {
695
+ return vpaddq_f64(row[0], row[1]);
696
+ }
697
+
698
+ /**********
699
+ * insert *
700
+ **********/
701
+
702
+ template <class A, size_t I>
703
+ XSIMD_INLINE batch<double, A> insert(batch<double, A> const& self, double val, index<I>, requires_arch<neon64>) noexcept
704
+ {
705
+ return vsetq_lane_f64(val, self, I);
706
+ }
707
+
708
+ /******************
709
+ * reducer macros *
710
+ ******************/
711
+
712
+ // Wrap reducer intrinsics so we can pass them as function pointers
713
+ // - OP: intrinsics name prefix, e.g., vorrq
714
+
715
+ #define WRAP_REDUCER_INT_EXCLUDING_64(OP) \
716
+ namespace wrap \
717
+ { \
718
+ XSIMD_INLINE uint8_t OP##_u8(uint8x16_t a) noexcept \
719
+ { \
720
+ return ::OP##_u8(a); \
721
+ } \
722
+ XSIMD_INLINE int8_t OP##_s8(int8x16_t a) noexcept \
723
+ { \
724
+ return ::OP##_s8(a); \
725
+ } \
726
+ XSIMD_INLINE uint16_t OP##_u16(uint16x8_t a) noexcept \
727
+ { \
728
+ return ::OP##_u16(a); \
729
+ } \
730
+ XSIMD_INLINE int16_t OP##_s16(int16x8_t a) noexcept \
731
+ { \
732
+ return ::OP##_s16(a); \
733
+ } \
734
+ XSIMD_INLINE uint32_t OP##_u32(uint32x4_t a) noexcept \
735
+ { \
736
+ return ::OP##_u32(a); \
737
+ } \
738
+ XSIMD_INLINE int32_t OP##_s32(int32x4_t a) noexcept \
739
+ { \
740
+ return ::OP##_s32(a); \
741
+ } \
742
+ }
743
+
744
+ #define WRAP_REDUCER_INT(OP) \
745
+ WRAP_REDUCER_INT_EXCLUDING_64(OP) \
746
+ namespace wrap \
747
+ { \
748
+ XSIMD_INLINE uint64_t OP##_u64(uint64x2_t a) noexcept \
749
+ { \
750
+ return ::OP##_u64(a); \
751
+ } \
752
+ XSIMD_INLINE int64_t OP##_s64(int64x2_t a) noexcept \
753
+ { \
754
+ return ::OP##_s64(a); \
755
+ } \
756
+ }
757
+
758
+ #define WRAP_REDUCER_FLOAT(OP) \
759
+ namespace wrap \
760
+ { \
761
+ XSIMD_INLINE float OP##_f32(float32x4_t a) noexcept \
762
+ { \
763
+ return ::OP##_f32(a); \
764
+ } \
765
+ XSIMD_INLINE double OP##_f64(float64x2_t a) noexcept \
766
+ { \
767
+ return ::OP##_f64(a); \
768
+ } \
769
+ }
770
+
771
+ namespace detail
772
+ {
773
+ template <class R>
774
+ struct reducer_return_type_impl;
775
+
776
+ template <>
777
+ struct reducer_return_type_impl<uint8x16_t>
778
+ {
779
+ using type = uint8_t;
780
+ };
781
+
782
+ template <>
783
+ struct reducer_return_type_impl<int8x16_t>
784
+ {
785
+ using type = int8_t;
786
+ };
787
+
788
+ template <>
789
+ struct reducer_return_type_impl<uint16x8_t>
790
+ {
791
+ using type = uint16_t;
792
+ };
793
+
794
+ template <>
795
+ struct reducer_return_type_impl<int16x8_t>
796
+ {
797
+ using type = int16_t;
798
+ };
799
+
800
+ template <>
801
+ struct reducer_return_type_impl<uint32x4_t>
802
+ {
803
+ using type = uint32_t;
804
+ };
805
+
806
+ template <>
807
+ struct reducer_return_type_impl<int32x4_t>
808
+ {
809
+ using type = int32_t;
810
+ };
811
+
812
+ template <>
813
+ struct reducer_return_type_impl<uint64x2_t>
814
+ {
815
+ using type = uint64_t;
816
+ };
817
+
818
+ template <>
819
+ struct reducer_return_type_impl<int64x2_t>
820
+ {
821
+ using type = int64_t;
822
+ };
823
+
824
+ template <>
825
+ struct reducer_return_type_impl<float32x4_t>
826
+ {
827
+ using type = float;
828
+ };
829
+
830
+ template <>
831
+ struct reducer_return_type_impl<float64x2_t>
832
+ {
833
+ using type = double;
834
+ };
835
+
836
+ template <class R>
837
+ using reducer_return_type = typename reducer_return_type_impl<R>::type;
838
+
839
+ template <class... T>
840
+ struct neon_reducer_dispatcher_impl : neon_dispatcher_base<reducer_return_type, T...>
841
+ {
842
+ };
843
+
844
+ using neon_reducer_dispatcher = neon_reducer_dispatcher_impl<uint8x16_t, int8x16_t,
845
+ uint16x8_t, int16x8_t,
846
+ uint32x4_t, int32x4_t,
847
+ uint64x2_t, int64x2_t,
848
+ float32x4_t, float64x2_t>;
849
+ template <class T>
850
+ using enable_neon64_type_t = typename std::enable_if<std::is_integral<T>::value || std::is_same<T, float>::value || std::is_same<T, double>::value,
851
+ int>::type;
852
+ }
853
+
854
+ /**************
855
+ * reduce_add *
856
+ **************/
857
+
858
+ WRAP_REDUCER_INT(vaddvq)
859
+ WRAP_REDUCER_FLOAT(vaddvq)
860
+
861
+ template <class A, class T, detail::enable_neon64_type_t<T> = 0>
862
+ XSIMD_INLINE typename batch<T, A>::value_type reduce_add(batch<T, A> const& arg, requires_arch<neon64>) noexcept
863
+ {
864
+ using register_type = typename batch<T, A>::register_type;
865
+ const detail::neon_reducer_dispatcher::unary dispatcher = {
866
+ std::make_tuple(wrap::vaddvq_u8, wrap::vaddvq_s8, wrap::vaddvq_u16, wrap::vaddvq_s16,
867
+ wrap::vaddvq_u32, wrap::vaddvq_s32, wrap::vaddvq_u64, wrap::vaddvq_s64,
868
+ wrap::vaddvq_f32, wrap::vaddvq_f64)
869
+ };
870
+ return dispatcher.apply(register_type(arg));
871
+ }
872
+
873
+ /**************
874
+ * reduce_max *
875
+ **************/
876
+
877
+ WRAP_REDUCER_INT_EXCLUDING_64(vmaxvq)
878
+ WRAP_REDUCER_FLOAT(vmaxvq)
879
+
880
+ namespace wrap
881
+ {
882
+ XSIMD_INLINE uint64_t vmaxvq_u64(uint64x2_t a) noexcept
883
+ {
884
+ return std::max(vdupd_laneq_u64(a, 0), vdupd_laneq_u64(a, 1));
885
+ }
886
+
887
+ XSIMD_INLINE int64_t vmaxvq_s64(int64x2_t a) noexcept
888
+ {
889
+ return std::max(vdupd_laneq_s64(a, 0), vdupd_laneq_s64(a, 1));
890
+ }
891
+ }
892
+
893
+ template <class A, class T, detail::enable_neon64_type_t<T> = 0>
894
+ XSIMD_INLINE typename batch<T, A>::value_type reduce_max(batch<T, A> const& arg, requires_arch<neon64>) noexcept
895
+ {
896
+ using register_type = typename batch<T, A>::register_type;
897
+ const detail::neon_reducer_dispatcher::unary dispatcher = {
898
+ std::make_tuple(wrap::vmaxvq_u8, wrap::vmaxvq_s8, wrap::vmaxvq_u16, wrap::vmaxvq_s16,
899
+ wrap::vmaxvq_u32, wrap::vmaxvq_s32, wrap::vmaxvq_u64, wrap::vmaxvq_s64,
900
+ wrap::vmaxvq_f32, wrap::vmaxvq_f64)
901
+ };
902
+ return dispatcher.apply(register_type(arg));
903
+ }
904
+
905
+ /**************
906
+ * reduce_min *
907
+ **************/
908
+
909
+ WRAP_REDUCER_INT_EXCLUDING_64(vminvq)
910
+ WRAP_REDUCER_FLOAT(vminvq)
911
+
912
+ namespace wrap
913
+ {
914
+ XSIMD_INLINE uint64_t vminvq_u64(uint64x2_t a) noexcept
915
+ {
916
+ return std::min(vdupd_laneq_u64(a, 0), vdupd_laneq_u64(a, 1));
917
+ }
918
+
919
+ XSIMD_INLINE int64_t vminvq_s64(int64x2_t a) noexcept
920
+ {
921
+ return std::min(vdupd_laneq_s64(a, 0), vdupd_laneq_s64(a, 1));
922
+ }
923
+ }
924
+
925
+ template <class A, class T, detail::enable_neon64_type_t<T> = 0>
926
+ XSIMD_INLINE typename batch<T, A>::value_type reduce_min(batch<T, A> const& arg, requires_arch<neon64>) noexcept
927
+ {
928
+ using register_type = typename batch<T, A>::register_type;
929
+ const detail::neon_reducer_dispatcher::unary dispatcher = {
930
+ std::make_tuple(wrap::vminvq_u8, wrap::vminvq_s8, wrap::vminvq_u16, wrap::vminvq_s16,
931
+ wrap::vminvq_u32, wrap::vminvq_s32, wrap::vminvq_u64, wrap::vminvq_s64,
932
+ wrap::vminvq_f32, wrap::vminvq_f64)
933
+ };
934
+ return dispatcher.apply(register_type(arg));
935
+ }
936
+
937
+ #undef WRAP_REDUCER_INT_EXCLUDING_64
938
+ #undef WRAP_REDUCER_INT
939
+ #undef WRAP_REDUCER_FLOAT
940
+
941
+ /**********
942
+ * select *
943
+ **********/
944
+
945
+ template <class A>
946
+ XSIMD_INLINE batch<double, A> select(batch_bool<double, A> const& cond, batch<double, A> const& a, batch<double, A> const& b, requires_arch<neon64>) noexcept
947
+ {
948
+ return vbslq_f64(cond, a, b);
949
+ }
950
+
951
+ template <class A, bool... b>
952
+ XSIMD_INLINE batch<double, A> select(batch_bool_constant<double, A, b...> const&,
953
+ batch<double, A> const& true_br,
954
+ batch<double, A> const& false_br,
955
+ requires_arch<neon64>) noexcept
956
+ {
957
+ return select(batch_bool<double, A> { b... }, true_br, false_br, neon64 {});
958
+ }
959
+
960
+ template <class A>
961
+ XSIMD_INLINE void transpose(batch<double, A>* matrix_begin, batch<double, A>* matrix_end, requires_arch<neon64>) noexcept
962
+ {
963
+ assert((matrix_end - matrix_begin == batch<double, A>::size) && "correctly sized matrix");
964
+ (void)matrix_end;
965
+ auto r0 = matrix_begin[0], r1 = matrix_begin[1];
966
+ matrix_begin[0] = vzip1q_f64(r0, r1);
967
+ matrix_begin[1] = vzip2q_f64(r0, r1);
968
+ }
969
+
970
+ template <class A, class T, detail::enable_sized_unsigned_t<T, 8> = 0>
971
+ XSIMD_INLINE void transpose(batch<T, A>* matrix_begin, batch<T, A>* matrix_end, requires_arch<neon64>) noexcept
972
+ {
973
+ assert((matrix_end - matrix_begin == batch<T, A>::size) && "correctly sized matrix");
974
+ (void)matrix_end;
975
+ auto r0 = matrix_begin[0], r1 = matrix_begin[1];
976
+ matrix_begin[0] = vzip1q_u64(r0, r1);
977
+ matrix_begin[1] = vzip2q_u64(r0, r1);
978
+ }
979
+
980
+ template <class A, class T, detail::enable_sized_signed_t<T, 8> = 0>
981
+ XSIMD_INLINE void transpose(batch<T, A>* matrix_begin, batch<T, A>* matrix_end, requires_arch<neon64>) noexcept
982
+ {
983
+ assert((matrix_end - matrix_begin == batch<T, A>::size) && "correctly sized matrix");
984
+ (void)matrix_end;
985
+ auto r0 = matrix_begin[0], r1 = matrix_begin[1];
986
+ matrix_begin[0] = vzip1q_s64(r0, r1);
987
+ matrix_begin[1] = vzip2q_s64(r0, r1);
988
+ }
989
+
990
+ /**********
991
+ * zip_lo *
992
+ **********/
993
+ template <class A, class T, detail::enable_sized_unsigned_t<T, 1> = 0>
994
+ XSIMD_INLINE batch<T, A> zip_lo(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<neon64>) noexcept
995
+ {
996
+ return vzip1q_u8(lhs, rhs);
997
+ }
998
+
999
+ template <class A, class T, detail::enable_sized_signed_t<T, 1> = 0>
1000
+ XSIMD_INLINE batch<T, A> zip_lo(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<neon64>) noexcept
1001
+ {
1002
+ return vzip1q_s8(lhs, rhs);
1003
+ }
1004
+
1005
+ template <class A, class T, detail::enable_sized_unsigned_t<T, 2> = 0>
1006
+ XSIMD_INLINE batch<T, A> zip_lo(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<neon64>) noexcept
1007
+ {
1008
+ return vzip1q_u16(lhs, rhs);
1009
+ }
1010
+
1011
+ template <class A, class T, detail::enable_sized_signed_t<T, 2> = 0>
1012
+ XSIMD_INLINE batch<T, A> zip_lo(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<neon64>) noexcept
1013
+ {
1014
+ return vzip1q_s16(lhs, rhs);
1015
+ }
1016
+
1017
+ template <class A, class T, detail::enable_sized_unsigned_t<T, 4> = 0>
1018
+ XSIMD_INLINE batch<T, A> zip_lo(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<neon64>) noexcept
1019
+ {
1020
+ return vzip1q_u32(lhs, rhs);
1021
+ }
1022
+
1023
+ template <class A, class T, detail::enable_sized_signed_t<T, 4> = 0>
1024
+ XSIMD_INLINE batch<T, A> zip_lo(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<neon64>) noexcept
1025
+ {
1026
+ return vzip1q_s32(lhs, rhs);
1027
+ }
1028
+
1029
+ template <class A, class T, detail::enable_sized_unsigned_t<T, 8> = 0>
1030
+ XSIMD_INLINE batch<T, A> zip_lo(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<neon64>) noexcept
1031
+ {
1032
+ return vzip1q_u64(lhs, rhs);
1033
+ }
1034
+
1035
+ template <class A, class T, detail::enable_sized_signed_t<T, 8> = 0>
1036
+ XSIMD_INLINE batch<T, A> zip_lo(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<neon64>) noexcept
1037
+ {
1038
+ return vzip1q_s64(lhs, rhs);
1039
+ }
1040
+
1041
+ template <class A>
1042
+ XSIMD_INLINE batch<float, A> zip_lo(batch<float, A> const& lhs, batch<float, A> const& rhs, requires_arch<neon64>) noexcept
1043
+ {
1044
+ return vzip1q_f32(lhs, rhs);
1045
+ }
1046
+
1047
+ template <class A>
1048
+ XSIMD_INLINE batch<double, A> zip_lo(batch<double, A> const& lhs, batch<double, A> const& rhs, requires_arch<neon64>) noexcept
1049
+ {
1050
+ return vzip1q_f64(lhs, rhs);
1051
+ }
1052
+
1053
+ /**********
1054
+ * zip_hi *
1055
+ **********/
1056
+
1057
+ template <class A, class T, detail::enable_sized_unsigned_t<T, 1> = 0>
1058
+ XSIMD_INLINE batch<T, A> zip_hi(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<neon64>) noexcept
1059
+ {
1060
+ return vzip2q_u8(lhs, rhs);
1061
+ }
1062
+
1063
+ template <class A, class T, detail::enable_sized_signed_t<T, 1> = 0>
1064
+ XSIMD_INLINE batch<T, A> zip_hi(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<neon64>) noexcept
1065
+ {
1066
+ return vzip2q_s8(lhs, rhs);
1067
+ }
1068
+
1069
+ template <class A, class T, detail::enable_sized_unsigned_t<T, 2> = 0>
1070
+ XSIMD_INLINE batch<T, A> zip_hi(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<neon64>) noexcept
1071
+ {
1072
+ return vzip2q_u16(lhs, rhs);
1073
+ }
1074
+
1075
+ template <class A, class T, detail::enable_sized_signed_t<T, 2> = 0>
1076
+ XSIMD_INLINE batch<T, A> zip_hi(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<neon64>) noexcept
1077
+ {
1078
+ return vzip2q_s16(lhs, rhs);
1079
+ }
1080
+
1081
+ template <class A, class T, detail::enable_sized_unsigned_t<T, 4> = 0>
1082
+ XSIMD_INLINE batch<T, A> zip_hi(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<neon64>) noexcept
1083
+ {
1084
+ return vzip2q_u32(lhs, rhs);
1085
+ }
1086
+
1087
+ template <class A, class T, detail::enable_sized_signed_t<T, 4> = 0>
1088
+ XSIMD_INLINE batch<T, A> zip_hi(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<neon64>) noexcept
1089
+ {
1090
+ return vzip2q_s32(lhs, rhs);
1091
+ }
1092
+
1093
+ template <class A, class T, detail::enable_sized_unsigned_t<T, 8> = 0>
1094
+ XSIMD_INLINE batch<T, A> zip_hi(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<neon64>) noexcept
1095
+ {
1096
+ return vzip2q_u64(lhs, rhs);
1097
+ }
1098
+
1099
+ template <class A, class T, detail::enable_sized_signed_t<T, 8> = 0>
1100
+ XSIMD_INLINE batch<T, A> zip_hi(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<neon64>) noexcept
1101
+ {
1102
+ return vzip2q_s64(lhs, rhs);
1103
+ }
1104
+
1105
+ template <class A>
1106
+ XSIMD_INLINE batch<float, A> zip_hi(batch<float, A> const& lhs, batch<float, A> const& rhs, requires_arch<neon64>) noexcept
1107
+ {
1108
+ return vzip2q_f32(lhs, rhs);
1109
+ }
1110
+
1111
+ template <class A>
1112
+ XSIMD_INLINE batch<double, A> zip_hi(batch<double, A> const& lhs, batch<double, A> const& rhs, requires_arch<neon64>) noexcept
1113
+ {
1114
+ return vzip2q_f64(lhs, rhs);
1115
+ }
1116
+
1117
+ /****************
1118
+ * extract_pair *
1119
+ ****************/
1120
+
1121
+ namespace detail
1122
+ {
1123
+ template <class A, size_t I, size_t... Is>
1124
+ XSIMD_INLINE batch<double, A> extract_pair(batch<double, A> const& lhs, batch<double, A> const& rhs, std::size_t n,
1125
+ ::xsimd::detail::index_sequence<I, Is...>) noexcept
1126
+ {
1127
+ if (n == I)
1128
+ {
1129
+ return vextq_f64(rhs, lhs, I);
1130
+ }
1131
+ else
1132
+ {
1133
+ return extract_pair(lhs, rhs, n, ::xsimd::detail::index_sequence<Is...>());
1134
+ }
1135
+ }
1136
+ }
1137
+
1138
+ template <class A>
1139
+ XSIMD_INLINE batch<double, A> extract_pair(batch<double, A> const& lhs, batch<double, A> const& rhs, std::size_t n, requires_arch<neon64>) noexcept
1140
+ {
1141
+ constexpr std::size_t size = batch<double, A>::size;
1142
+ assert(n < size && "index in bounds");
1143
+ return detail::extract_pair(lhs, rhs, n, ::xsimd::detail::make_index_sequence<size>());
1144
+ }
1145
+
1146
+ /******************
1147
+ * bitwise_rshift *
1148
+ ******************/
1149
+
1150
+ template <class A, class T, detail::enable_sized_unsigned_t<T, 8> = 0>
1151
+ XSIMD_INLINE batch<T, A> bitwise_rshift(batch<T, A> const& lhs, int n, requires_arch<neon64>) noexcept
1152
+ {
1153
+ return bitwise_rshift<A>(lhs, n, neon {});
1154
+ }
1155
+
1156
+ template <class A, class T, detail::enable_sized_unsigned_t<T, 8> = 0>
1157
+ XSIMD_INLINE batch<T, A> bitwise_rshift(batch<T, A> const& lhs, batch<as_signed_integer_t<T>, A> const& rhs, requires_arch<neon64>) noexcept
1158
+ {
1159
+ return vshlq_u64(lhs, vnegq_s64(rhs));
1160
+ }
1161
+
1162
+ template <class A, class T, detail::enable_sized_signed_t<T, 8> = 0>
1163
+ XSIMD_INLINE batch<T, A> bitwise_rshift(batch<T, A> const& lhs, int n, requires_arch<neon64>) noexcept
1164
+ {
1165
+ return bitwise_rshift<A>(lhs, n, neon {});
1166
+ }
1167
+
1168
+ template <class A, class T, detail::enable_sized_signed_t<T, 8> = 0>
1169
+ XSIMD_INLINE batch<T, A> bitwise_rshift(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<neon64>) noexcept
1170
+ {
1171
+ return vshlq_s64(lhs, vnegq_s64(rhs));
1172
+ }
1173
+
1174
+ /****************
1175
+ * bitwise_cast *
1176
+ ****************/
1177
+
1178
+ #define WRAP_CAST(SUFFIX, TYPE) \
1179
+ namespace wrap \
1180
+ { \
1181
+ XSIMD_INLINE float64x2_t vreinterpretq_f64_##SUFFIX(TYPE a) noexcept \
1182
+ { \
1183
+ return ::vreinterpretq_f64_##SUFFIX(a); \
1184
+ } \
1185
+ XSIMD_INLINE TYPE vreinterpretq_##SUFFIX##_f64(float64x2_t a) noexcept \
1186
+ { \
1187
+ return ::vreinterpretq_##SUFFIX##_f64(a); \
1188
+ } \
1189
+ }
1190
+
1191
+ WRAP_CAST(u8, uint8x16_t)
1192
+ WRAP_CAST(s8, int8x16_t)
1193
+ WRAP_CAST(u16, uint16x8_t)
1194
+ WRAP_CAST(s16, int16x8_t)
1195
+ WRAP_CAST(u32, uint32x4_t)
1196
+ WRAP_CAST(s32, int32x4_t)
1197
+ WRAP_CAST(u64, uint64x2_t)
1198
+ WRAP_CAST(s64, int64x2_t)
1199
+ WRAP_CAST(f32, float32x4_t)
1200
+
1201
+ #undef WRAP_CAST
1202
+
1203
+ template <class A, class T>
1204
+ XSIMD_INLINE batch<double, A> bitwise_cast(batch<T, A> const& arg, batch<double, A> const&, requires_arch<neon64>) noexcept
1205
+ {
1206
+ using caster_type = detail::bitwise_caster_impl<float64x2_t,
1207
+ uint8x16_t, int8x16_t,
1208
+ uint16x8_t, int16x8_t,
1209
+ uint32x4_t, int32x4_t,
1210
+ uint64x2_t, int64x2_t,
1211
+ float32x4_t>;
1212
+ const caster_type caster = {
1213
+ std::make_tuple(wrap::vreinterpretq_f64_u8, wrap::vreinterpretq_f64_s8, wrap::vreinterpretq_f64_u16, wrap::vreinterpretq_f64_s16,
1214
+ wrap::vreinterpretq_f64_u32, wrap::vreinterpretq_f64_s32, wrap::vreinterpretq_f64_u64, wrap::vreinterpretq_f64_s64,
1215
+ wrap::vreinterpretq_f64_f32)
1216
+ };
1217
+ using register_type = typename batch<T, A>::register_type;
1218
+ return caster.apply(register_type(arg));
1219
+ }
1220
+
1221
+ namespace detail
1222
+ {
1223
+ template <class S, class... R>
1224
+ struct bitwise_caster_neon64
1225
+ {
1226
+ using container_type = std::tuple<R (*)(S)...>;
1227
+ container_type m_func;
1228
+
1229
+ template <class V>
1230
+ V apply(float64x2_t rhs) const
1231
+ {
1232
+ using func_type = V (*)(float64x2_t);
1233
+ auto func = xsimd::detail::get<func_type>(m_func);
1234
+ return func(rhs);
1235
+ }
1236
+ };
1237
+ }
1238
+
1239
+ template <class A, class R>
1240
+ XSIMD_INLINE batch<R, A> bitwise_cast(batch<double, A> const& arg, batch<R, A> const&, requires_arch<neon64>) noexcept
1241
+ {
1242
+ using caster_type = detail::bitwise_caster_neon64<float64x2_t,
1243
+ uint8x16_t, int8x16_t,
1244
+ uint16x8_t, int16x8_t,
1245
+ uint32x4_t, int32x4_t,
1246
+ uint64x2_t, int64x2_t,
1247
+ float32x4_t>;
1248
+ const caster_type caster = {
1249
+ std::make_tuple(wrap::vreinterpretq_u8_f64, wrap::vreinterpretq_s8_f64, wrap::vreinterpretq_u16_f64, wrap::vreinterpretq_s16_f64,
1250
+ wrap::vreinterpretq_u32_f64, wrap::vreinterpretq_s32_f64, wrap::vreinterpretq_u64_f64, wrap::vreinterpretq_s64_f64,
1251
+ wrap::vreinterpretq_f32_f64)
1252
+ };
1253
+ using src_register_type = typename batch<double, A>::register_type;
1254
+ using dst_register_type = typename batch<R, A>::register_type;
1255
+ return caster.apply<dst_register_type>(src_register_type(arg));
1256
+ }
1257
+
1258
+ template <class A>
1259
+ XSIMD_INLINE batch<double, A> bitwise_cast(batch<double, A> const& arg, batch<double, A> const&, requires_arch<neon64>) noexcept
1260
+ {
1261
+ return arg;
1262
+ }
1263
+
1264
+ /*********
1265
+ * isnan *
1266
+ *********/
1267
+
1268
+ template <class A>
1269
+ XSIMD_INLINE batch_bool<double, A> isnan(batch<double, A> const& arg, requires_arch<neon64>) noexcept
1270
+ {
1271
+ return !(arg == arg);
1272
+ }
1273
+
1274
+ /****************
1275
+ * rotate_left *
1276
+ ****************/
1277
+ template <size_t N, class A>
1278
+ XSIMD_INLINE batch<double, A> rotate_left(batch<double, A> const& a, requires_arch<neon64>) noexcept
1279
+ {
1280
+ return vextq_f64(a, a, N);
1281
+ }
1282
+ }
1283
+
1284
+ template <typename T, class A, T... Values>
1285
+ struct batch_constant;
1286
+
1287
+ namespace kernel
1288
+ {
1289
+ /*********************
1290
+ * swizzle (dynamic) *
1291
+ *********************/
1292
+ template <class A>
1293
+ XSIMD_INLINE batch<uint8_t, A> swizzle(batch<uint8_t, A> const& self, batch<uint8_t, A> idx,
1294
+ requires_arch<neon64>) noexcept
1295
+ {
1296
+ return vqtbl1q_u8(self, idx);
1297
+ }
1298
+
1299
+ template <class A>
1300
+ XSIMD_INLINE batch<int8_t, A> swizzle(batch<int8_t, A> const& self, batch<uint8_t, A> idx,
1301
+ requires_arch<neon64>) noexcept
1302
+ {
1303
+ return vqtbl1q_s8(self, idx);
1304
+ }
1305
+
1306
+ template <class A>
1307
+ XSIMD_INLINE batch<uint16_t, A> swizzle(batch<uint16_t, A> const& self,
1308
+ batch<uint16_t, A> idx,
1309
+ requires_arch<neon64>) noexcept
1310
+ {
1311
+ using batch_type = batch<uint8_t, A>;
1312
+ using index_type = batch<uint8_t, A>;
1313
+ return vreinterpretq_u16_u8(swizzle(batch_type(vreinterpretq_u8_u16(self)),
1314
+ index_type(vreinterpretq_u8_u16(idx * 0x0202 + 0x0100)),
1315
+ neon64 {}));
1316
+ }
1317
+
1318
+ template <class A>
1319
+ XSIMD_INLINE batch<int16_t, A> swizzle(batch<int16_t, A> const& self,
1320
+ batch<uint16_t, A> idx,
1321
+ requires_arch<neon64>) noexcept
1322
+ {
1323
+ return bitwise_cast<int16_t>(swizzle(bitwise_cast<uint16_t>(self), idx, neon64 {}));
1324
+ }
1325
+
1326
+ template <class A>
1327
+ XSIMD_INLINE batch<uint32_t, A> swizzle(batch<uint32_t, A> const& self,
1328
+ batch<uint32_t, A> idx,
1329
+ requires_arch<neon64>) noexcept
1330
+ {
1331
+ using batch_type = batch<uint8_t, A>;
1332
+ using index_type = batch<uint8_t, A>;
1333
+ return vreinterpretq_u32_u8(swizzle(batch_type(vreinterpretq_u8_u32(self)),
1334
+ index_type(vreinterpretq_u8_u32(idx * 0x04040404 + 0x03020100)),
1335
+ neon64 {}));
1336
+ }
1337
+
1338
+ template <class A>
1339
+ XSIMD_INLINE batch<int32_t, A> swizzle(batch<int32_t, A> const& self,
1340
+ batch<uint32_t, A> idx,
1341
+ requires_arch<neon64>) noexcept
1342
+ {
1343
+ return bitwise_cast<int32_t>(swizzle(bitwise_cast<uint32_t>(self), idx, neon64 {}));
1344
+ }
1345
+
1346
+ template <class A>
1347
+ XSIMD_INLINE batch<uint64_t, A> swizzle(batch<uint64_t, A> const& self,
1348
+ batch<uint64_t, A> idx,
1349
+ requires_arch<neon64>) noexcept
1350
+ {
1351
+ using batch_type = batch<uint8_t, A>;
1352
+ using index_type = batch<uint8_t, A>;
1353
+ return vreinterpretq_u64_u8(swizzle(batch_type(vreinterpretq_u8_u64(self)),
1354
+ index_type(vreinterpretq_u8_u64(idx * 0x0808080808080808ull + 0x0706050403020100ull)),
1355
+ neon64 {}));
1356
+ }
1357
+
1358
+ template <class A>
1359
+ XSIMD_INLINE batch<int64_t, A> swizzle(batch<int64_t, A> const& self,
1360
+ batch<uint64_t, A> idx,
1361
+ requires_arch<neon64>) noexcept
1362
+ {
1363
+ return bitwise_cast<int64_t>(swizzle(bitwise_cast<uint64_t>(self), idx, neon64 {}));
1364
+ }
1365
+
1366
+ template <class A>
1367
+ XSIMD_INLINE batch<float, A> swizzle(batch<float, A> const& self,
1368
+ batch<uint32_t, A> idx,
1369
+ requires_arch<neon64>) noexcept
1370
+ {
1371
+ return bitwise_cast<float>(swizzle(bitwise_cast<uint32_t>(self), idx, neon64 {}));
1372
+ }
1373
+
1374
+ template <class A>
1375
+ XSIMD_INLINE batch<double, A> swizzle(batch<double, A> const& self,
1376
+ batch<uint64_t, A> idx,
1377
+ requires_arch<neon64>) noexcept
1378
+ {
1379
+ return bitwise_cast<double>(swizzle(bitwise_cast<uint64_t>(self), idx, neon64 {}));
1380
+ }
1381
+
1382
+ /********************
1383
+ * swizzle (static) *
1384
+ ********************/
1385
+
1386
+ namespace detail
1387
+ {
1388
+ using ::xsimd::batch_constant;
1389
+ using ::xsimd::detail::integer_sequence;
1390
+ using ::xsimd::detail::make_integer_sequence;
1391
+
1392
+ template <class CB1, class CB2, class IS>
1393
+ struct index_burst_impl;
1394
+
1395
+ template <typename T1, class A, typename T2, T2... V,
1396
+ T2... incr>
1397
+ struct index_burst_impl<batch_constant<T1, A>, batch_constant<T2, A, V...>,
1398
+ integer_sequence<T2, incr...>>
1399
+ {
1400
+ using type = batch_constant<T2, A, V...>;
1401
+ };
1402
+
1403
+ template <typename T1, class A, T1 V0, T1... V1,
1404
+ typename T2, T2... V2, T2... incr>
1405
+ struct index_burst_impl<batch_constant<T1, A, V0, V1...>, batch_constant<T2, A, V2...>,
1406
+ integer_sequence<T2, incr...>>
1407
+ {
1408
+ using next_input = batch_constant<T1, A, V1...>;
1409
+ using next_output = batch_constant<T2, A, V2..., (V0 + incr)...>;
1410
+ using type = typename index_burst_impl<next_input, next_output, integer_sequence<T2, incr...>>::type;
1411
+ };
1412
+
1413
+ template <class B, class T>
1414
+ struct index_burst;
1415
+
1416
+ template <typename Tp, class A, Tp... V, typename T>
1417
+ struct index_burst<batch_constant<Tp, A, V...>, T>
1418
+ {
1419
+ static constexpr size_t mul = sizeof(Tp) / sizeof(T);
1420
+ using input = batch_constant<Tp, A, (mul * V)...>;
1421
+ using output = batch_constant<T, A>;
1422
+ using type = typename index_burst_impl<input, output, make_integer_sequence<T, mul>>::type;
1423
+ };
1424
+
1425
+ template <class B, typename T>
1426
+ using index_burst_t = typename index_burst<B, T>::type;
1427
+
1428
+ template <typename T, class B>
1429
+ XSIMD_INLINE index_burst_t<B, T> burst_index(B)
1430
+ {
1431
+ return index_burst_t<B, T>();
1432
+ }
1433
+ }
1434
+
1435
+ 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,
1436
+ uint8_t V8, uint8_t V9, uint8_t V10, uint8_t V11, uint8_t V12, uint8_t V13, uint8_t V14, uint8_t V15>
1437
+ XSIMD_INLINE batch<uint8_t, A> swizzle(batch<uint8_t, A> const& self,
1438
+ batch_constant<uint8_t, A, V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15> idx,
1439
+ requires_arch<neon64>) noexcept
1440
+ {
1441
+ return vqtbl1q_u8(self, batch<uint8_t, A>(idx));
1442
+ }
1443
+
1444
+ 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,
1445
+ uint8_t V8, uint8_t V9, uint8_t V10, uint8_t V11, uint8_t V12, uint8_t V13, uint8_t V14, uint8_t V15>
1446
+ XSIMD_INLINE batch<int8_t, A> swizzle(batch<int8_t, A> const& self,
1447
+ batch_constant<uint8_t, A, V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15> idx,
1448
+ requires_arch<neon64>) noexcept
1449
+ {
1450
+ return vqtbl1q_s8(self, batch<uint8_t, A>(idx));
1451
+ }
1452
+
1453
+ 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>
1454
+ XSIMD_INLINE batch<uint16_t, A> swizzle(batch<uint16_t, A> const& self,
1455
+ batch_constant<uint16_t, A, V0, V1, V2, V3, V4, V5, V6, V7> idx,
1456
+ requires_arch<neon64>) noexcept
1457
+ {
1458
+ using batch_type = batch<uint8_t, A>;
1459
+ return vreinterpretq_u16_u8(swizzle<A>(batch_type(vreinterpretq_u8_u16(self)), detail::burst_index<uint8_t>(idx), A()));
1460
+ }
1461
+
1462
+ 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>
1463
+ XSIMD_INLINE batch<int16_t, A> swizzle(batch<int16_t, A> const& self,
1464
+ batch_constant<uint16_t, A, V0, V1, V2, V3, V4, V5, V6, V7> idx,
1465
+ requires_arch<neon64>) noexcept
1466
+ {
1467
+ using batch_type = batch<int8_t, A>;
1468
+ return vreinterpretq_s16_s8(swizzle<A>(batch_type(vreinterpretq_s8_s16(self)), detail::burst_index<uint8_t>(idx), A()));
1469
+ }
1470
+
1471
+ template <class A, uint32_t V0, uint32_t V1, uint32_t V2, uint32_t V3>
1472
+ XSIMD_INLINE batch<uint32_t, A> swizzle(batch<uint32_t, A> const& self,
1473
+ batch_constant<uint32_t, A, V0, V1, V2, V3> idx,
1474
+ requires_arch<neon64>) noexcept
1475
+ {
1476
+ using batch_type = batch<uint8_t, A>;
1477
+ return vreinterpretq_u32_u8(swizzle<A>(batch_type(vreinterpretq_u8_u32(self)), detail::burst_index<uint8_t>(idx), A()));
1478
+ }
1479
+
1480
+ template <class A, uint32_t V0, uint32_t V1, uint32_t V2, uint32_t V3>
1481
+ XSIMD_INLINE batch<int32_t, A> swizzle(batch<int32_t, A> const& self,
1482
+ batch_constant<uint32_t, A, V0, V1, V2, V3> idx,
1483
+ requires_arch<neon64>) noexcept
1484
+ {
1485
+ using batch_type = batch<int8_t, A>;
1486
+ return vreinterpretq_s32_s8(swizzle<A>(batch_type(vreinterpretq_s8_s32(self)), detail::burst_index<uint8_t>(idx), A()));
1487
+ }
1488
+
1489
+ template <class A, uint64_t V0, uint64_t V1>
1490
+ XSIMD_INLINE batch<uint64_t, A> swizzle(batch<uint64_t, A> const& self,
1491
+ batch_constant<uint64_t, A, V0, V1> idx,
1492
+ requires_arch<neon64>) noexcept
1493
+ {
1494
+ using batch_type = batch<uint8_t, A>;
1495
+ return vreinterpretq_u64_u8(swizzle<A>(batch_type(vreinterpretq_u8_u64(self)), detail::burst_index<uint8_t>(idx), A()));
1496
+ }
1497
+
1498
+ template <class A, uint64_t V0, uint64_t V1>
1499
+ XSIMD_INLINE batch<int64_t, A> swizzle(batch<int64_t, A> const& self,
1500
+ batch_constant<uint64_t, A, V0, V1> idx,
1501
+ requires_arch<neon64>) noexcept
1502
+ {
1503
+ using batch_type = batch<int8_t, A>;
1504
+ return vreinterpretq_s64_s8(swizzle<A>(batch_type(vreinterpretq_s8_s64(self)), detail::burst_index<uint8_t>(idx), A()));
1505
+ }
1506
+
1507
+ template <class A, uint32_t V0, uint32_t V1, uint32_t V2, uint32_t V3>
1508
+ XSIMD_INLINE batch<float, A> swizzle(batch<float, A> const& self,
1509
+ batch_constant<uint32_t, A, V0, V1, V2, V3> idx,
1510
+ requires_arch<neon64>) noexcept
1511
+ {
1512
+ using batch_type = batch<uint8_t, A>;
1513
+ return vreinterpretq_f32_u8(swizzle<A>(batch_type(vreinterpretq_u8_f32(self)), detail::burst_index<uint8_t>(idx), A()));
1514
+ }
1515
+
1516
+ template <class A, uint64_t V0, uint64_t V1>
1517
+ XSIMD_INLINE batch<double, A> swizzle(batch<double, A> const& self,
1518
+ batch_constant<uint64_t, A, V0, V1> idx,
1519
+ requires_arch<neon64>) noexcept
1520
+ {
1521
+ using batch_type = batch<uint8_t, A>;
1522
+ return vreinterpretq_f64_u8(swizzle<A>(batch_type(vreinterpretq_u8_f64(self)), detail::burst_index<uint8_t>(idx), A()));
1523
+ }
1524
+
1525
+ template <class A, uint32_t V0, uint32_t V1, uint32_t V2, uint32_t V3>
1526
+ XSIMD_INLINE batch<std::complex<float>, A> swizzle(batch<std::complex<float>, A> const& self,
1527
+ batch_constant<uint32_t, A, V0, V1, V2, V3> idx,
1528
+ requires_arch<neon64>) noexcept
1529
+ {
1530
+ return batch<std::complex<float>>(swizzle(self.real(), idx, A()), swizzle(self.imag(), idx, A()));
1531
+ }
1532
+
1533
+ template <class A, uint64_t V0, uint64_t V1>
1534
+ XSIMD_INLINE batch<std::complex<double>, A> swizzle(batch<std::complex<double>, A> const& self,
1535
+ batch_constant<uint64_t, A, V0, V1> idx,
1536
+ requires_arch<neon64>) noexcept
1537
+ {
1538
+ return batch<std::complex<double>>(swizzle(self.real(), idx, A()), swizzle(self.imag(), idx, A()));
1539
+ }
1540
+ }
1541
+ }
1542
+
1543
+ #endif