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.
- _sequenzo_fastcluster.cpython-310-darwin.so +0 -0
- sequenzo/__init__.py +349 -0
- sequenzo/big_data/__init__.py +12 -0
- sequenzo/big_data/clara/__init__.py +26 -0
- sequenzo/big_data/clara/clara.py +476 -0
- sequenzo/big_data/clara/utils/__init__.py +27 -0
- sequenzo/big_data/clara/utils/aggregatecases.py +92 -0
- sequenzo/big_data/clara/utils/davies_bouldin.py +91 -0
- sequenzo/big_data/clara/utils/get_weighted_diss.cpython-310-darwin.so +0 -0
- sequenzo/big_data/clara/utils/wfcmdd.py +205 -0
- sequenzo/big_data/clara/visualization.py +88 -0
- sequenzo/clustering/KMedoids.py +178 -0
- sequenzo/clustering/__init__.py +30 -0
- sequenzo/clustering/clustering_c_code.cpython-310-darwin.so +0 -0
- sequenzo/clustering/hierarchical_clustering.py +1256 -0
- sequenzo/clustering/sequenzo_fastcluster/fastcluster.py +495 -0
- sequenzo/clustering/sequenzo_fastcluster/src/fastcluster.cpp +1877 -0
- sequenzo/clustering/sequenzo_fastcluster/src/fastcluster_python.cpp +1264 -0
- sequenzo/clustering/src/KMedoid.cpp +263 -0
- sequenzo/clustering/src/PAM.cpp +237 -0
- sequenzo/clustering/src/PAMonce.cpp +265 -0
- sequenzo/clustering/src/cluster_quality.cpp +496 -0
- sequenzo/clustering/src/cluster_quality.h +128 -0
- sequenzo/clustering/src/cluster_quality_backup.cpp +570 -0
- sequenzo/clustering/src/module.cpp +228 -0
- sequenzo/clustering/src/weightedinertia.cpp +111 -0
- sequenzo/clustering/utils/__init__.py +27 -0
- sequenzo/clustering/utils/disscenter.py +122 -0
- sequenzo/data_preprocessing/__init__.py +22 -0
- sequenzo/data_preprocessing/helpers.py +303 -0
- sequenzo/datasets/__init__.py +41 -0
- sequenzo/datasets/biofam.csv +2001 -0
- sequenzo/datasets/biofam_child_domain.csv +2001 -0
- sequenzo/datasets/biofam_left_domain.csv +2001 -0
- sequenzo/datasets/biofam_married_domain.csv +2001 -0
- sequenzo/datasets/chinese_colonial_territories.csv +12 -0
- sequenzo/datasets/country_co2_emissions.csv +194 -0
- sequenzo/datasets/country_co2_emissions_global_deciles.csv +195 -0
- sequenzo/datasets/country_co2_emissions_global_quintiles.csv +195 -0
- sequenzo/datasets/country_co2_emissions_local_deciles.csv +195 -0
- sequenzo/datasets/country_co2_emissions_local_quintiles.csv +195 -0
- sequenzo/datasets/country_gdp_per_capita.csv +194 -0
- sequenzo/datasets/dyadic_children.csv +61 -0
- sequenzo/datasets/dyadic_parents.csv +61 -0
- sequenzo/datasets/mvad.csv +713 -0
- sequenzo/datasets/pairfam_activity_by_month.csv +1028 -0
- sequenzo/datasets/pairfam_activity_by_year.csv +1028 -0
- sequenzo/datasets/pairfam_family_by_month.csv +1028 -0
- sequenzo/datasets/pairfam_family_by_year.csv +1028 -0
- sequenzo/datasets/political_science_aid_shock.csv +166 -0
- sequenzo/datasets/political_science_donor_fragmentation.csv +157 -0
- sequenzo/define_sequence_data.py +1400 -0
- sequenzo/dissimilarity_measures/__init__.py +31 -0
- sequenzo/dissimilarity_measures/c_code.cpython-310-darwin.so +0 -0
- sequenzo/dissimilarity_measures/get_distance_matrix.py +762 -0
- sequenzo/dissimilarity_measures/get_substitution_cost_matrix.py +246 -0
- sequenzo/dissimilarity_measures/src/DHDdistance.cpp +148 -0
- sequenzo/dissimilarity_measures/src/LCPdistance.cpp +114 -0
- sequenzo/dissimilarity_measures/src/LCPspellDistance.cpp +215 -0
- sequenzo/dissimilarity_measures/src/OMdistance.cpp +247 -0
- sequenzo/dissimilarity_measures/src/OMspellDistance.cpp +281 -0
- sequenzo/dissimilarity_measures/src/__init__.py +0 -0
- sequenzo/dissimilarity_measures/src/dist2matrix.cpp +63 -0
- sequenzo/dissimilarity_measures/src/dp_utils.h +160 -0
- sequenzo/dissimilarity_measures/src/module.cpp +40 -0
- sequenzo/dissimilarity_measures/src/setup.py +30 -0
- sequenzo/dissimilarity_measures/src/utils.h +25 -0
- sequenzo/dissimilarity_measures/src/xsimd/.github/cmake-test/main.cpp +6 -0
- sequenzo/dissimilarity_measures/src/xsimd/benchmark/main.cpp +159 -0
- sequenzo/dissimilarity_measures/src/xsimd/benchmark/xsimd_benchmark.hpp +565 -0
- sequenzo/dissimilarity_measures/src/xsimd/docs/source/conf.py +37 -0
- sequenzo/dissimilarity_measures/src/xsimd/examples/mandelbrot.cpp +330 -0
- sequenzo/dissimilarity_measures/src/xsimd/examples/pico_bench.hpp +246 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_arithmetic.hpp +266 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_complex.hpp +112 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_details.hpp +323 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_logical.hpp +218 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_math.hpp +2583 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_memory.hpp +880 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_rounding.hpp +72 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_swizzle.hpp +174 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/common/xsimd_common_trigo.hpp +978 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx.hpp +1924 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx2.hpp +1144 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512bw.hpp +656 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512cd.hpp +28 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512dq.hpp +244 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512er.hpp +20 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512f.hpp +2650 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512ifma.hpp +20 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512pf.hpp +20 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512vbmi.hpp +77 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512vbmi2.hpp +131 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512vnni_avx512bw.hpp +20 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avx512vnni_avx512vbmi2.hpp +20 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_avxvnni.hpp +20 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_common.hpp +24 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_common_fwd.hpp +77 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_constants.hpp +393 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_emulated.hpp +788 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_fma3_avx.hpp +93 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_fma3_avx2.hpp +46 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_fma3_sse.hpp +97 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_fma4.hpp +92 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_i8mm_neon64.hpp +17 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_isa.hpp +142 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_neon.hpp +3142 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_neon64.hpp +1543 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_rvv.hpp +1513 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_scalar.hpp +1260 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_sse2.hpp +2024 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_sse3.hpp +67 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_sse4_1.hpp +339 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_sse4_2.hpp +44 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_ssse3.hpp +186 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_sve.hpp +1155 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_vsx.hpp +892 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/arch/xsimd_wasm.hpp +1780 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/config/xsimd_arch.hpp +240 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/config/xsimd_config.hpp +484 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/config/xsimd_cpuid.hpp +269 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/config/xsimd_inline.hpp +27 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/math/xsimd_rem_pio2.hpp +719 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/memory/xsimd_aligned_allocator.hpp +349 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/memory/xsimd_alignment.hpp +91 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_all_registers.hpp +55 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_api.hpp +2765 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx2_register.hpp +44 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512bw_register.hpp +51 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512cd_register.hpp +51 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512dq_register.hpp +51 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512er_register.hpp +51 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512f_register.hpp +77 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512ifma_register.hpp +51 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512pf_register.hpp +51 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512vbmi2_register.hpp +51 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512vbmi_register.hpp +51 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512vnni_avx512bw_register.hpp +54 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx512vnni_avx512vbmi2_register.hpp +53 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avx_register.hpp +64 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_avxvnni_register.hpp +44 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_batch.hpp +1524 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_batch_constant.hpp +300 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_common_arch.hpp +47 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_emulated_register.hpp +80 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_fma3_avx2_register.hpp +50 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_fma3_avx_register.hpp +50 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_fma3_sse_register.hpp +50 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_fma4_register.hpp +50 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_i8mm_neon64_register.hpp +55 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_neon64_register.hpp +55 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_neon_register.hpp +154 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_register.hpp +94 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_rvv_register.hpp +506 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_sse2_register.hpp +59 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_sse3_register.hpp +49 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_sse4_1_register.hpp +48 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_sse4_2_register.hpp +48 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_ssse3_register.hpp +48 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_sve_register.hpp +156 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_traits.hpp +337 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_utils.hpp +536 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_vsx_register.hpp +77 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/types/xsimd_wasm_register.hpp +59 -0
- sequenzo/dissimilarity_measures/src/xsimd/include/xsimd/xsimd.hpp +75 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/architectures/dummy.cpp +7 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/doc/explicit_use_of_an_instruction_set.cpp +13 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/doc/explicit_use_of_an_instruction_set_mean.cpp +24 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/doc/explicit_use_of_an_instruction_set_mean_aligned.cpp +25 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/doc/explicit_use_of_an_instruction_set_mean_arch_independent.cpp +28 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/doc/explicit_use_of_an_instruction_set_mean_tag_dispatch.cpp +25 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/doc/manipulating_abstract_batches.cpp +7 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/doc/manipulating_parametric_batches.cpp +8 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/doc/sum.hpp +31 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/doc/sum_avx2.cpp +3 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/doc/sum_sse2.cpp +3 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/doc/writing_vectorized_code.cpp +11 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/main.cpp +31 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_api.cpp +230 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_arch.cpp +217 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_basic_math.cpp +183 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_batch.cpp +1049 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_bool.cpp +508 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_cast.cpp +409 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_complex.cpp +712 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_constant.cpp +286 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_float.cpp +141 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_int.cpp +365 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_batch_manip.cpp +308 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_bitwise_cast.cpp +222 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_complex_exponential.cpp +226 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_complex_hyperbolic.cpp +183 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_complex_power.cpp +265 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_complex_trigonometric.cpp +236 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_conversion.cpp +248 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_custom_default_arch.cpp +28 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_error_gamma.cpp +170 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_explicit_batch_instantiation.cpp +32 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_exponential.cpp +202 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_extract_pair.cpp +92 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_fp_manipulation.cpp +77 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_gnu_source.cpp +30 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_hyperbolic.cpp +167 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_load_store.cpp +304 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_memory.cpp +61 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_poly_evaluation.cpp +64 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_power.cpp +184 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_rounding.cpp +199 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_select.cpp +101 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_shuffle.cpp +760 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_sum.cpp +4 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_sum.hpp +34 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_traits.cpp +172 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_trigonometric.cpp +208 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_utils.hpp +611 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_wasm/test_wasm_playwright.py +123 -0
- sequenzo/dissimilarity_measures/src/xsimd/test/test_xsimd_api.cpp +1460 -0
- sequenzo/dissimilarity_measures/utils/__init__.py +16 -0
- sequenzo/dissimilarity_measures/utils/get_LCP_length_for_2_seq.py +44 -0
- sequenzo/dissimilarity_measures/utils/get_sm_trate_substitution_cost_matrix.cpython-310-darwin.so +0 -0
- sequenzo/dissimilarity_measures/utils/seqconc.cpython-310-darwin.so +0 -0
- sequenzo/dissimilarity_measures/utils/seqdss.cpython-310-darwin.so +0 -0
- sequenzo/dissimilarity_measures/utils/seqdur.cpython-310-darwin.so +0 -0
- sequenzo/dissimilarity_measures/utils/seqlength.cpython-310-darwin.so +0 -0
- sequenzo/multidomain/__init__.py +23 -0
- sequenzo/multidomain/association_between_domains.py +311 -0
- sequenzo/multidomain/cat.py +597 -0
- sequenzo/multidomain/combt.py +519 -0
- sequenzo/multidomain/dat.py +81 -0
- sequenzo/multidomain/idcd.py +139 -0
- sequenzo/multidomain/linked_polyad.py +292 -0
- sequenzo/openmp_setup.py +233 -0
- sequenzo/prefix_tree/__init__.py +62 -0
- sequenzo/prefix_tree/hub.py +114 -0
- sequenzo/prefix_tree/individual_level_indicators.py +1321 -0
- sequenzo/prefix_tree/spell_individual_level_indicators.py +580 -0
- sequenzo/prefix_tree/spell_level_indicators.py +297 -0
- sequenzo/prefix_tree/system_level_indicators.py +544 -0
- sequenzo/prefix_tree/utils.py +54 -0
- sequenzo/seqhmm/__init__.py +95 -0
- sequenzo/seqhmm/advanced_optimization.py +305 -0
- sequenzo/seqhmm/bootstrap.py +411 -0
- sequenzo/seqhmm/build_hmm.py +142 -0
- sequenzo/seqhmm/build_mhmm.py +136 -0
- sequenzo/seqhmm/build_nhmm.py +121 -0
- sequenzo/seqhmm/fit_mhmm.py +62 -0
- sequenzo/seqhmm/fit_model.py +61 -0
- sequenzo/seqhmm/fit_nhmm.py +76 -0
- sequenzo/seqhmm/formulas.py +289 -0
- sequenzo/seqhmm/forward_backward_nhmm.py +276 -0
- sequenzo/seqhmm/gradients_nhmm.py +306 -0
- sequenzo/seqhmm/hmm.py +291 -0
- sequenzo/seqhmm/mhmm.py +314 -0
- sequenzo/seqhmm/model_comparison.py +238 -0
- sequenzo/seqhmm/multichannel_em.py +282 -0
- sequenzo/seqhmm/multichannel_utils.py +138 -0
- sequenzo/seqhmm/nhmm.py +270 -0
- sequenzo/seqhmm/nhmm_utils.py +191 -0
- sequenzo/seqhmm/predict.py +137 -0
- sequenzo/seqhmm/predict_mhmm.py +142 -0
- sequenzo/seqhmm/simulate.py +878 -0
- sequenzo/seqhmm/utils.py +218 -0
- sequenzo/seqhmm/visualization.py +910 -0
- sequenzo/sequence_characteristics/__init__.py +40 -0
- sequenzo/sequence_characteristics/complexity_index.py +49 -0
- sequenzo/sequence_characteristics/overall_cross_sectional_entropy.py +220 -0
- sequenzo/sequence_characteristics/plot_characteristics.py +593 -0
- sequenzo/sequence_characteristics/simple_characteristics.py +311 -0
- sequenzo/sequence_characteristics/state_frequencies_and_entropy_per_sequence.py +39 -0
- sequenzo/sequence_characteristics/turbulence.py +155 -0
- sequenzo/sequence_characteristics/variance_of_spell_durations.py +86 -0
- sequenzo/sequence_characteristics/within_sequence_entropy.py +43 -0
- sequenzo/suffix_tree/__init__.py +66 -0
- sequenzo/suffix_tree/hub.py +114 -0
- sequenzo/suffix_tree/individual_level_indicators.py +1679 -0
- sequenzo/suffix_tree/spell_individual_level_indicators.py +493 -0
- sequenzo/suffix_tree/spell_level_indicators.py +248 -0
- sequenzo/suffix_tree/system_level_indicators.py +535 -0
- sequenzo/suffix_tree/utils.py +56 -0
- sequenzo/version_check.py +283 -0
- sequenzo/visualization/__init__.py +29 -0
- sequenzo/visualization/plot_mean_time.py +222 -0
- sequenzo/visualization/plot_modal_state.py +276 -0
- sequenzo/visualization/plot_most_frequent_sequences.py +147 -0
- sequenzo/visualization/plot_relative_frequency.py +405 -0
- sequenzo/visualization/plot_sequence_index.py +1175 -0
- sequenzo/visualization/plot_single_medoid.py +153 -0
- sequenzo/visualization/plot_state_distribution.py +651 -0
- sequenzo/visualization/plot_transition_matrix.py +190 -0
- sequenzo/visualization/utils/__init__.py +23 -0
- sequenzo/visualization/utils/utils.py +310 -0
- sequenzo/with_event_history_analysis/__init__.py +35 -0
- sequenzo/with_event_history_analysis/sequence_analysis_multi_state_model.py +850 -0
- sequenzo/with_event_history_analysis/sequence_history_analysis.py +283 -0
- sequenzo-0.1.31.dist-info/METADATA +286 -0
- sequenzo-0.1.31.dist-info/RECORD +299 -0
- sequenzo-0.1.31.dist-info/WHEEL +5 -0
- sequenzo-0.1.31.dist-info/licenses/LICENSE +28 -0
- 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
|