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,1155 @@
|
|
|
1
|
+
/***************************************************************************
|
|
2
|
+
* Copyright (c) Johan Mabille, Sylvain Corlay, Wolf Vollprecht and *
|
|
3
|
+
* Martin Renou *
|
|
4
|
+
* Copyright (c) QuantStack *
|
|
5
|
+
* Copyright (c) Serge Guelton *
|
|
6
|
+
* Copyright (c) Yibo Cai *
|
|
7
|
+
* *
|
|
8
|
+
* Distributed under the terms of the BSD 3-Clause License. *
|
|
9
|
+
* *
|
|
10
|
+
* The full license is in the file LICENSE, distributed with this software. *
|
|
11
|
+
****************************************************************************/
|
|
12
|
+
|
|
13
|
+
#ifndef XSIMD_SVE_HPP
|
|
14
|
+
#define XSIMD_SVE_HPP
|
|
15
|
+
|
|
16
|
+
#include <complex>
|
|
17
|
+
#include <type_traits>
|
|
18
|
+
|
|
19
|
+
#include "../types/xsimd_sve_register.hpp"
|
|
20
|
+
|
|
21
|
+
namespace xsimd
|
|
22
|
+
{
|
|
23
|
+
template <typename T, class A, T... Values>
|
|
24
|
+
struct batch_constant;
|
|
25
|
+
|
|
26
|
+
namespace kernel
|
|
27
|
+
{
|
|
28
|
+
namespace detail
|
|
29
|
+
{
|
|
30
|
+
using xsimd::index;
|
|
31
|
+
using xsimd::types::detail::sve_vector_type;
|
|
32
|
+
|
|
33
|
+
// predicate creation
|
|
34
|
+
XSIMD_INLINE svbool_t sve_ptrue_impl(index<1>) noexcept { return svptrue_b8(); }
|
|
35
|
+
XSIMD_INLINE svbool_t sve_ptrue_impl(index<2>) noexcept { return svptrue_b16(); }
|
|
36
|
+
XSIMD_INLINE svbool_t sve_ptrue_impl(index<4>) noexcept { return svptrue_b32(); }
|
|
37
|
+
XSIMD_INLINE svbool_t sve_ptrue_impl(index<8>) noexcept { return svptrue_b64(); }
|
|
38
|
+
|
|
39
|
+
template <class T>
|
|
40
|
+
svbool_t sve_ptrue() noexcept { return sve_ptrue_impl(index<sizeof(T)> {}); }
|
|
41
|
+
|
|
42
|
+
// count active lanes in a predicate
|
|
43
|
+
XSIMD_INLINE uint64_t sve_pcount_impl(svbool_t p, index<1>) noexcept { return svcntp_b8(p, p); }
|
|
44
|
+
XSIMD_INLINE uint64_t sve_pcount_impl(svbool_t p, index<2>) noexcept { return svcntp_b16(p, p); }
|
|
45
|
+
XSIMD_INLINE uint64_t sve_pcount_impl(svbool_t p, index<4>) noexcept { return svcntp_b32(p, p); }
|
|
46
|
+
XSIMD_INLINE uint64_t sve_pcount_impl(svbool_t p, index<8>) noexcept { return svcntp_b64(p, p); }
|
|
47
|
+
|
|
48
|
+
template <class T>
|
|
49
|
+
XSIMD_INLINE uint64_t sve_pcount(svbool_t p) noexcept { return sve_pcount_impl(p, index<sizeof(T)> {}); }
|
|
50
|
+
|
|
51
|
+
// enable for signed integers
|
|
52
|
+
template <class T>
|
|
53
|
+
using sve_enable_signed_int_t = typename std::enable_if<std::is_integral<T>::value && std::is_signed<T>::value, int>::type;
|
|
54
|
+
|
|
55
|
+
// enable for unsigned integers
|
|
56
|
+
template <class T>
|
|
57
|
+
using sve_enable_unsigned_int_t = typename std::enable_if<std::is_integral<T>::value && !std::is_signed<T>::value, int>::type;
|
|
58
|
+
|
|
59
|
+
// enable for floating points
|
|
60
|
+
template <class T>
|
|
61
|
+
using sve_enable_floating_point_t = typename std::enable_if<std::is_floating_point<T>::value, int>::type;
|
|
62
|
+
|
|
63
|
+
// enable for signed integers or floating points
|
|
64
|
+
template <class T>
|
|
65
|
+
using sve_enable_signed_int_or_floating_point_t = typename std::enable_if<std::is_signed<T>::value, int>::type;
|
|
66
|
+
|
|
67
|
+
// enable for all SVE supported types
|
|
68
|
+
template <class T>
|
|
69
|
+
using sve_enable_all_t = typename std::enable_if<std::is_arithmetic<T>::value, int>::type;
|
|
70
|
+
} // namespace detail
|
|
71
|
+
|
|
72
|
+
/*********
|
|
73
|
+
* Load *
|
|
74
|
+
*********/
|
|
75
|
+
|
|
76
|
+
namespace detail
|
|
77
|
+
{
|
|
78
|
+
// "char" is not allowed in SVE load/store operations
|
|
79
|
+
using sve_fix_char_t_impl = typename std::conditional<std::is_signed<char>::value, int8_t, uint8_t>::type;
|
|
80
|
+
|
|
81
|
+
template <class T>
|
|
82
|
+
using sve_fix_char_t = typename std::conditional<std::is_same<char, typename std::decay<T>::type>::value,
|
|
83
|
+
sve_fix_char_t_impl, T>::type;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
87
|
+
XSIMD_INLINE batch<T, A> load_aligned(T const* src, convert<T>, requires_arch<sve>) noexcept
|
|
88
|
+
{
|
|
89
|
+
return svld1(detail::sve_ptrue<T>(), reinterpret_cast<detail::sve_fix_char_t<T> const*>(src));
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
93
|
+
XSIMD_INLINE batch<T, A> load_unaligned(T const* src, convert<T>, requires_arch<sve>) noexcept
|
|
94
|
+
{
|
|
95
|
+
return load_aligned<A>(src, convert<T>(), sve {});
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// load_complex
|
|
99
|
+
template <class A, class T, detail::sve_enable_floating_point_t<T> = 0>
|
|
100
|
+
XSIMD_INLINE batch<std::complex<T>, A> load_complex_aligned(std::complex<T> const* mem, convert<std::complex<T>>, requires_arch<sve>) noexcept
|
|
101
|
+
{
|
|
102
|
+
const T* buf = reinterpret_cast<const T*>(mem);
|
|
103
|
+
const auto tmp = svld2(detail::sve_ptrue<T>(), buf);
|
|
104
|
+
const auto real = svget2(tmp, 0);
|
|
105
|
+
const auto imag = svget2(tmp, 1);
|
|
106
|
+
return batch<std::complex<T>, A> { real, imag };
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
template <class A, class T, detail::sve_enable_floating_point_t<T> = 0>
|
|
110
|
+
XSIMD_INLINE batch<std::complex<T>, A> load_complex_unaligned(std::complex<T> const* mem, convert<std::complex<T>>, requires_arch<sve>) noexcept
|
|
111
|
+
{
|
|
112
|
+
return load_complex_aligned<A>(mem, convert<std::complex<T>> {}, sve {});
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/*********
|
|
116
|
+
* Store *
|
|
117
|
+
*********/
|
|
118
|
+
|
|
119
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
120
|
+
XSIMD_INLINE void store_aligned(T* dst, batch<T, A> const& src, requires_arch<sve>) noexcept
|
|
121
|
+
{
|
|
122
|
+
svst1(detail::sve_ptrue<T>(), reinterpret_cast<detail::sve_fix_char_t<T>*>(dst), src);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
126
|
+
XSIMD_INLINE void store_unaligned(T* dst, batch<T, A> const& src, requires_arch<sve>) noexcept
|
|
127
|
+
{
|
|
128
|
+
store_aligned<A>(dst, src, sve {});
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// store_complex
|
|
132
|
+
template <class A, class T, detail::sve_enable_floating_point_t<T> = 0>
|
|
133
|
+
XSIMD_INLINE void store_complex_aligned(std::complex<T>* dst, batch<std::complex<T>, A> const& src, requires_arch<sve>) noexcept
|
|
134
|
+
{
|
|
135
|
+
using v2type = typename std::conditional<(sizeof(T) == 4), svfloat32x2_t, svfloat64x2_t>::type;
|
|
136
|
+
v2type tmp {};
|
|
137
|
+
tmp = svset2(tmp, 0, src.real());
|
|
138
|
+
tmp = svset2(tmp, 1, src.imag());
|
|
139
|
+
T* buf = reinterpret_cast<T*>(dst);
|
|
140
|
+
svst2(detail::sve_ptrue<T>(), buf, tmp);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
template <class A, class T, detail::sve_enable_floating_point_t<T> = 0>
|
|
144
|
+
XSIMD_INLINE void store_complex_unaligned(std::complex<T>* dst, batch<std::complex<T>, A> const& src, requires_arch<sve>) noexcept
|
|
145
|
+
{
|
|
146
|
+
store_complex_aligned(dst, src, sve {});
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/******************
|
|
150
|
+
* scatter/gather *
|
|
151
|
+
******************/
|
|
152
|
+
|
|
153
|
+
namespace detail
|
|
154
|
+
{
|
|
155
|
+
template <class T, class U>
|
|
156
|
+
using sve_enable_sg_t = typename std::enable_if<(sizeof(T) == sizeof(U) && (sizeof(T) == 4 || sizeof(T) == 8)), int>::type;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// scatter
|
|
160
|
+
template <class A, class T, class U, detail::sve_enable_sg_t<T, U> = 0>
|
|
161
|
+
XSIMD_INLINE void scatter(batch<T, A> const& src, T* dst, batch<U, A> const& index, kernel::requires_arch<sve>) noexcept
|
|
162
|
+
{
|
|
163
|
+
svst1_scatter_index(detail::sve_ptrue<T>(), dst, index.data, src.data);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// gather
|
|
167
|
+
template <class A, class T, class U, detail::sve_enable_sg_t<T, U> = 0>
|
|
168
|
+
XSIMD_INLINE batch<T, A> gather(batch<T, A> const&, T const* src, batch<U, A> const& index, kernel::requires_arch<sve>) noexcept
|
|
169
|
+
{
|
|
170
|
+
return svld1_gather_index(detail::sve_ptrue<T>(), src, index.data);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/********************
|
|
174
|
+
* Scalar to vector *
|
|
175
|
+
********************/
|
|
176
|
+
|
|
177
|
+
// broadcast
|
|
178
|
+
template <class A, class T, detail::enable_sized_unsigned_t<T, 1> = 0>
|
|
179
|
+
XSIMD_INLINE batch<T, A> broadcast(T arg, requires_arch<sve>) noexcept
|
|
180
|
+
{
|
|
181
|
+
return svdup_n_u8(uint8_t(arg));
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
template <class A, class T, detail::enable_sized_signed_t<T, 1> = 0>
|
|
185
|
+
XSIMD_INLINE batch<T, A> broadcast(T arg, requires_arch<sve>) noexcept
|
|
186
|
+
{
|
|
187
|
+
return svdup_n_s8(int8_t(arg));
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
template <class A, class T, detail::enable_sized_unsigned_t<T, 2> = 0>
|
|
191
|
+
XSIMD_INLINE batch<T, A> broadcast(T arg, requires_arch<sve>) noexcept
|
|
192
|
+
{
|
|
193
|
+
return svdup_n_u16(uint16_t(arg));
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
template <class A, class T, detail::enable_sized_signed_t<T, 2> = 0>
|
|
197
|
+
XSIMD_INLINE batch<T, A> broadcast(T arg, requires_arch<sve>) noexcept
|
|
198
|
+
{
|
|
199
|
+
return svdup_n_s16(int16_t(arg));
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
template <class A, class T, detail::enable_sized_unsigned_t<T, 4> = 0>
|
|
203
|
+
XSIMD_INLINE batch<T, A> broadcast(T arg, requires_arch<sve>) noexcept
|
|
204
|
+
{
|
|
205
|
+
return svdup_n_u32(uint32_t(arg));
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
template <class A, class T, detail::enable_sized_signed_t<T, 4> = 0>
|
|
209
|
+
XSIMD_INLINE batch<T, A> broadcast(T arg, requires_arch<sve>) noexcept
|
|
210
|
+
{
|
|
211
|
+
return svdup_n_s32(int32_t(arg));
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
template <class A, class T, detail::enable_sized_unsigned_t<T, 8> = 0>
|
|
215
|
+
XSIMD_INLINE batch<T, A> broadcast(T arg, requires_arch<sve>) noexcept
|
|
216
|
+
{
|
|
217
|
+
return svdup_n_u64(uint64_t(arg));
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
template <class A, class T, detail::enable_sized_signed_t<T, 8> = 0>
|
|
221
|
+
XSIMD_INLINE batch<T, A> broadcast(T arg, requires_arch<sve>) noexcept
|
|
222
|
+
{
|
|
223
|
+
return svdup_n_s64(int64_t(arg));
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
template <class A>
|
|
227
|
+
XSIMD_INLINE batch<float, A> broadcast(float arg, requires_arch<sve>) noexcept
|
|
228
|
+
{
|
|
229
|
+
return svdup_n_f32(arg);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
template <class A>
|
|
233
|
+
XSIMD_INLINE batch<double, A> broadcast(double arg, requires_arch<sve>) noexcept
|
|
234
|
+
{
|
|
235
|
+
return svdup_n_f64(arg);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
template <class A, class T, detail::sve_enable_floating_point_t<T> = 0>
|
|
239
|
+
XSIMD_INLINE batch<T, A> broadcast(T val, requires_arch<sve>) noexcept
|
|
240
|
+
{
|
|
241
|
+
return broadcast<sve>(val, sve {});
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**************
|
|
245
|
+
* Arithmetic *
|
|
246
|
+
**************/
|
|
247
|
+
|
|
248
|
+
// add
|
|
249
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
250
|
+
XSIMD_INLINE batch<T, A> add(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<sve>) noexcept
|
|
251
|
+
{
|
|
252
|
+
return svadd_x(detail::sve_ptrue<T>(), lhs, rhs);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// sadd
|
|
256
|
+
template <class A, class T, detail::enable_integral_t<T> = 0>
|
|
257
|
+
XSIMD_INLINE batch<T, A> sadd(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<sve>) noexcept
|
|
258
|
+
{
|
|
259
|
+
return svqadd(lhs, rhs);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// sub
|
|
263
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
264
|
+
XSIMD_INLINE batch<T, A> sub(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<sve>) noexcept
|
|
265
|
+
{
|
|
266
|
+
return svsub_x(detail::sve_ptrue<T>(), lhs, rhs);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// ssub
|
|
270
|
+
template <class A, class T, detail::enable_integral_t<T> = 0>
|
|
271
|
+
XSIMD_INLINE batch<T, A> ssub(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<sve>) noexcept
|
|
272
|
+
{
|
|
273
|
+
return svqsub(lhs, rhs);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// mul
|
|
277
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
278
|
+
XSIMD_INLINE batch<T, A> mul(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<sve>) noexcept
|
|
279
|
+
{
|
|
280
|
+
return svmul_x(detail::sve_ptrue<T>(), lhs, rhs);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// div
|
|
284
|
+
template <class A, class T, typename std::enable_if<sizeof(T) >= 4, int>::type = 0>
|
|
285
|
+
XSIMD_INLINE batch<T, A> div(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<sve>) noexcept
|
|
286
|
+
{
|
|
287
|
+
return svdiv_x(detail::sve_ptrue<T>(), lhs, rhs);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// max
|
|
291
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
292
|
+
XSIMD_INLINE batch<T, A> max(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<sve>) noexcept
|
|
293
|
+
{
|
|
294
|
+
return svmax_x(detail::sve_ptrue<T>(), lhs, rhs);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// min
|
|
298
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
299
|
+
XSIMD_INLINE batch<T, A> min(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<sve>) noexcept
|
|
300
|
+
{
|
|
301
|
+
return svmin_x(detail::sve_ptrue<T>(), lhs, rhs);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
// neg
|
|
305
|
+
template <class A, class T, detail::enable_sized_unsigned_t<T, 1> = 0>
|
|
306
|
+
XSIMD_INLINE batch<T, A> neg(batch<T, A> const& arg, requires_arch<sve>) noexcept
|
|
307
|
+
{
|
|
308
|
+
return svreinterpret_u8(svneg_x(detail::sve_ptrue<T>(), svreinterpret_s8(arg)));
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
template <class A, class T, detail::enable_sized_unsigned_t<T, 2> = 0>
|
|
312
|
+
XSIMD_INLINE batch<T, A> neg(batch<T, A> const& arg, requires_arch<sve>) noexcept
|
|
313
|
+
{
|
|
314
|
+
return svreinterpret_u16(svneg_x(detail::sve_ptrue<T>(), svreinterpret_s16(arg)));
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
template <class A, class T, detail::enable_sized_unsigned_t<T, 4> = 0>
|
|
318
|
+
XSIMD_INLINE batch<T, A> neg(batch<T, A> const& arg, requires_arch<sve>) noexcept
|
|
319
|
+
{
|
|
320
|
+
return svreinterpret_u32(svneg_x(detail::sve_ptrue<T>(), svreinterpret_s32(arg)));
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
template <class A, class T, detail::enable_sized_unsigned_t<T, 8> = 0>
|
|
324
|
+
XSIMD_INLINE batch<T, A> neg(batch<T, A> const& arg, requires_arch<sve>) noexcept
|
|
325
|
+
{
|
|
326
|
+
return svreinterpret_u64(svneg_x(detail::sve_ptrue<T>(), svreinterpret_s64(arg)));
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
template <class A, class T, detail::sve_enable_signed_int_or_floating_point_t<T> = 0>
|
|
330
|
+
XSIMD_INLINE batch<T, A> neg(batch<T, A> const& arg, requires_arch<sve>) noexcept
|
|
331
|
+
{
|
|
332
|
+
return svneg_x(detail::sve_ptrue<T>(), arg);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// abs
|
|
336
|
+
template <class A, class T, detail::sve_enable_unsigned_int_t<T> = 0>
|
|
337
|
+
XSIMD_INLINE batch<T, A> abs(batch<T, A> const& arg, requires_arch<sve>) noexcept
|
|
338
|
+
{
|
|
339
|
+
return arg;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
template <class A, class T, detail::sve_enable_signed_int_or_floating_point_t<T> = 0>
|
|
343
|
+
XSIMD_INLINE batch<T, A> abs(batch<T, A> const& arg, requires_arch<sve>) noexcept
|
|
344
|
+
{
|
|
345
|
+
return svabs_x(detail::sve_ptrue<T>(), arg);
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
// fma: x * y + z
|
|
349
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
350
|
+
XSIMD_INLINE batch<T, A> fma(batch<T, A> const& x, batch<T, A> const& y, batch<T, A> const& z, requires_arch<sve>) noexcept
|
|
351
|
+
{
|
|
352
|
+
return svmad_x(detail::sve_ptrue<T>(), x, y, z);
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
// fnma: z - x * y
|
|
356
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
357
|
+
XSIMD_INLINE batch<T, A> fnma(batch<T, A> const& x, batch<T, A> const& y, batch<T, A> const& z, requires_arch<sve>) noexcept
|
|
358
|
+
{
|
|
359
|
+
return svmsb_x(detail::sve_ptrue<T>(), x, y, z);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
// fms: x * y - z
|
|
363
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
364
|
+
XSIMD_INLINE batch<T, A> fms(batch<T, A> const& x, batch<T, A> const& y, batch<T, A> const& z, requires_arch<sve>) noexcept
|
|
365
|
+
{
|
|
366
|
+
return -fnma(x, y, z, sve {});
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
// fnms: - x * y - z
|
|
370
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
371
|
+
XSIMD_INLINE batch<T, A> fnms(batch<T, A> const& x, batch<T, A> const& y, batch<T, A> const& z, requires_arch<sve>) noexcept
|
|
372
|
+
{
|
|
373
|
+
return -fma(x, y, z, sve {});
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
/**********************
|
|
377
|
+
* Logical operations *
|
|
378
|
+
**********************/
|
|
379
|
+
|
|
380
|
+
// bitwise_and
|
|
381
|
+
template <class A, class T, detail::enable_integral_t<T> = 0>
|
|
382
|
+
XSIMD_INLINE batch<T, A> bitwise_and(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<sve>) noexcept
|
|
383
|
+
{
|
|
384
|
+
return svand_x(detail::sve_ptrue<T>(), lhs, rhs);
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
template <class A>
|
|
388
|
+
XSIMD_INLINE batch<float, A> bitwise_and(batch<float, A> const& lhs, batch<float, A> const& rhs, requires_arch<sve>) noexcept
|
|
389
|
+
{
|
|
390
|
+
const auto lhs_bits = svreinterpret_u32(lhs);
|
|
391
|
+
const auto rhs_bits = svreinterpret_u32(rhs);
|
|
392
|
+
const auto result_bits = svand_x(detail::sve_ptrue<float>(), lhs_bits, rhs_bits);
|
|
393
|
+
return svreinterpret_f32(result_bits);
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
template <class A>
|
|
397
|
+
XSIMD_INLINE batch<double, A> bitwise_and(batch<double, A> const& lhs, batch<double, A> const& rhs, requires_arch<sve>) noexcept
|
|
398
|
+
{
|
|
399
|
+
const auto lhs_bits = svreinterpret_u64(lhs);
|
|
400
|
+
const auto rhs_bits = svreinterpret_u64(rhs);
|
|
401
|
+
const auto result_bits = svand_x(detail::sve_ptrue<double>(), lhs_bits, rhs_bits);
|
|
402
|
+
return svreinterpret_f64(result_bits);
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
406
|
+
XSIMD_INLINE batch_bool<T, A> bitwise_and(batch_bool<T, A> const& lhs, batch_bool<T, A> const& rhs, requires_arch<sve>) noexcept
|
|
407
|
+
{
|
|
408
|
+
return svand_z(detail::sve_ptrue<T>(), lhs, rhs);
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
// bitwise_andnot
|
|
412
|
+
template <class A, class T, detail::enable_integral_t<T> = 0>
|
|
413
|
+
XSIMD_INLINE batch<T, A> bitwise_andnot(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<sve>) noexcept
|
|
414
|
+
{
|
|
415
|
+
return svbic_x(detail::sve_ptrue<T>(), lhs, rhs);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
template <class A>
|
|
419
|
+
XSIMD_INLINE batch<float, A> bitwise_andnot(batch<float, A> const& lhs, batch<float, A> const& rhs, requires_arch<sve>) noexcept
|
|
420
|
+
{
|
|
421
|
+
const auto lhs_bits = svreinterpret_u32(lhs);
|
|
422
|
+
const auto rhs_bits = svreinterpret_u32(rhs);
|
|
423
|
+
const auto result_bits = svbic_x(detail::sve_ptrue<float>(), lhs_bits, rhs_bits);
|
|
424
|
+
return svreinterpret_f32(result_bits);
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
template <class A>
|
|
428
|
+
XSIMD_INLINE batch<double, A> bitwise_andnot(batch<double, A> const& lhs, batch<double, A> const& rhs, requires_arch<sve>) noexcept
|
|
429
|
+
{
|
|
430
|
+
const auto lhs_bits = svreinterpret_u64(lhs);
|
|
431
|
+
const auto rhs_bits = svreinterpret_u64(rhs);
|
|
432
|
+
const auto result_bits = svbic_x(detail::sve_ptrue<double>(), lhs_bits, rhs_bits);
|
|
433
|
+
return svreinterpret_f64(result_bits);
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
437
|
+
XSIMD_INLINE batch_bool<T, A> bitwise_andnot(batch_bool<T, A> const& lhs, batch_bool<T, A> const& rhs, requires_arch<sve>) noexcept
|
|
438
|
+
{
|
|
439
|
+
return svbic_z(detail::sve_ptrue<T>(), lhs, rhs);
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
// bitwise_or
|
|
443
|
+
template <class A, class T, detail::enable_integral_t<T> = 0>
|
|
444
|
+
XSIMD_INLINE batch<T, A> bitwise_or(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<sve>) noexcept
|
|
445
|
+
{
|
|
446
|
+
return svorr_x(detail::sve_ptrue<T>(), lhs, rhs);
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
template <class A>
|
|
450
|
+
XSIMD_INLINE batch<float, A> bitwise_or(batch<float, A> const& lhs, batch<float, A> const& rhs, requires_arch<sve>) noexcept
|
|
451
|
+
{
|
|
452
|
+
const auto lhs_bits = svreinterpret_u32(lhs);
|
|
453
|
+
const auto rhs_bits = svreinterpret_u32(rhs);
|
|
454
|
+
const auto result_bits = svorr_x(detail::sve_ptrue<float>(), lhs_bits, rhs_bits);
|
|
455
|
+
return svreinterpret_f32(result_bits);
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
template <class A>
|
|
459
|
+
XSIMD_INLINE batch<double, A> bitwise_or(batch<double, A> const& lhs, batch<double, A> const& rhs, requires_arch<sve>) noexcept
|
|
460
|
+
{
|
|
461
|
+
const auto lhs_bits = svreinterpret_u64(lhs);
|
|
462
|
+
const auto rhs_bits = svreinterpret_u64(rhs);
|
|
463
|
+
const auto result_bits = svorr_x(detail::sve_ptrue<double>(), lhs_bits, rhs_bits);
|
|
464
|
+
return svreinterpret_f64(result_bits);
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
468
|
+
XSIMD_INLINE batch_bool<T, A> bitwise_or(batch_bool<T, A> const& lhs, batch_bool<T, A> const& rhs, requires_arch<sve>) noexcept
|
|
469
|
+
{
|
|
470
|
+
return svorr_z(detail::sve_ptrue<T>(), lhs, rhs);
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
// bitwise_xor
|
|
474
|
+
template <class A, class T, detail::enable_integral_t<T> = 0>
|
|
475
|
+
XSIMD_INLINE batch<T, A> bitwise_xor(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<sve>) noexcept
|
|
476
|
+
{
|
|
477
|
+
return sveor_x(detail::sve_ptrue<T>(), lhs, rhs);
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
template <class A>
|
|
481
|
+
XSIMD_INLINE batch<float, A> bitwise_xor(batch<float, A> const& lhs, batch<float, A> const& rhs, requires_arch<sve>) noexcept
|
|
482
|
+
{
|
|
483
|
+
const auto lhs_bits = svreinterpret_u32(lhs);
|
|
484
|
+
const auto rhs_bits = svreinterpret_u32(rhs);
|
|
485
|
+
const auto result_bits = sveor_x(detail::sve_ptrue<float>(), lhs_bits, rhs_bits);
|
|
486
|
+
return svreinterpret_f32(result_bits);
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
template <class A>
|
|
490
|
+
XSIMD_INLINE batch<double, A> bitwise_xor(batch<double, A> const& lhs, batch<double, A> const& rhs, requires_arch<sve>) noexcept
|
|
491
|
+
{
|
|
492
|
+
const auto lhs_bits = svreinterpret_u64(lhs);
|
|
493
|
+
const auto rhs_bits = svreinterpret_u64(rhs);
|
|
494
|
+
const auto result_bits = sveor_x(detail::sve_ptrue<double>(), lhs_bits, rhs_bits);
|
|
495
|
+
return svreinterpret_f64(result_bits);
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
499
|
+
XSIMD_INLINE batch_bool<T, A> bitwise_xor(batch_bool<T, A> const& lhs, batch_bool<T, A> const& rhs, requires_arch<sve>) noexcept
|
|
500
|
+
{
|
|
501
|
+
return sveor_z(detail::sve_ptrue<T>(), lhs, rhs);
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
// bitwise_not
|
|
505
|
+
template <class A, class T, detail::enable_integral_t<T> = 0>
|
|
506
|
+
XSIMD_INLINE batch<T, A> bitwise_not(batch<T, A> const& arg, requires_arch<sve>) noexcept
|
|
507
|
+
{
|
|
508
|
+
return svnot_x(detail::sve_ptrue<T>(), arg);
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
template <class A>
|
|
512
|
+
XSIMD_INLINE batch<float, A> bitwise_not(batch<float, A> const& arg, requires_arch<sve>) noexcept
|
|
513
|
+
{
|
|
514
|
+
const auto arg_bits = svreinterpret_u32(arg);
|
|
515
|
+
const auto result_bits = svnot_x(detail::sve_ptrue<float>(), arg_bits);
|
|
516
|
+
return svreinterpret_f32(result_bits);
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
template <class A>
|
|
520
|
+
XSIMD_INLINE batch<double, A> bitwise_not(batch<double, A> const& arg, requires_arch<sve>) noexcept
|
|
521
|
+
{
|
|
522
|
+
const auto arg_bits = svreinterpret_u64(arg);
|
|
523
|
+
const auto result_bits = svnot_x(detail::sve_ptrue<double>(), arg_bits);
|
|
524
|
+
return svreinterpret_f64(result_bits);
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
528
|
+
XSIMD_INLINE batch_bool<T, A> bitwise_not(batch_bool<T, A> const& arg, requires_arch<sve>) noexcept
|
|
529
|
+
{
|
|
530
|
+
return svnot_z(detail::sve_ptrue<T>(), arg);
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
/**********
|
|
534
|
+
* Shifts *
|
|
535
|
+
**********/
|
|
536
|
+
|
|
537
|
+
namespace detail
|
|
538
|
+
{
|
|
539
|
+
template <class A, class T, class U>
|
|
540
|
+
XSIMD_INLINE batch<U, A> sve_to_unsigned_batch_impl(batch<T, A> const& arg, index<1>) noexcept
|
|
541
|
+
{
|
|
542
|
+
return svreinterpret_u8(arg);
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
template <class A, class T, class U>
|
|
546
|
+
XSIMD_INLINE batch<U, A> sve_to_unsigned_batch_impl(batch<T, A> const& arg, index<2>) noexcept
|
|
547
|
+
{
|
|
548
|
+
return svreinterpret_u16(arg);
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
template <class A, class T, class U>
|
|
552
|
+
XSIMD_INLINE batch<U, A> sve_to_unsigned_batch_impl(batch<T, A> const& arg, index<4>) noexcept
|
|
553
|
+
{
|
|
554
|
+
return svreinterpret_u32(arg);
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
template <class A, class T, class U>
|
|
558
|
+
XSIMD_INLINE batch<U, A> sve_to_unsigned_batch_impl(batch<T, A> const& arg, index<8>) noexcept
|
|
559
|
+
{
|
|
560
|
+
return svreinterpret_u64(arg);
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
template <class A, class T, class U = as_unsigned_integer_t<T>>
|
|
564
|
+
XSIMD_INLINE batch<U, A> sve_to_unsigned_batch(batch<T, A> const& arg) noexcept
|
|
565
|
+
{
|
|
566
|
+
return sve_to_unsigned_batch_impl<A, T, U>(arg, index<sizeof(T)> {});
|
|
567
|
+
}
|
|
568
|
+
} // namespace detail
|
|
569
|
+
|
|
570
|
+
// bitwise_lshift
|
|
571
|
+
template <class A, class T, detail::enable_integral_t<T> = 0>
|
|
572
|
+
XSIMD_INLINE batch<T, A> bitwise_lshift(batch<T, A> const& arg, int n, requires_arch<sve>) noexcept
|
|
573
|
+
{
|
|
574
|
+
constexpr std::size_t size = sizeof(typename batch<T, A>::value_type) * 8;
|
|
575
|
+
assert(0 <= n && static_cast<std::size_t>(n) < size && "index in bounds");
|
|
576
|
+
return svlsl_x(detail::sve_ptrue<T>(), arg, n);
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
template <class A, class T, detail::enable_integral_t<T> = 0>
|
|
580
|
+
XSIMD_INLINE batch<T, A> bitwise_lshift(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<sve>) noexcept
|
|
581
|
+
{
|
|
582
|
+
return svlsl_x(detail::sve_ptrue<T>(), lhs, detail::sve_to_unsigned_batch<A, T>(rhs));
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
// bitwise_rshift
|
|
586
|
+
template <class A, class T, detail::sve_enable_unsigned_int_t<T> = 0>
|
|
587
|
+
XSIMD_INLINE batch<T, A> bitwise_rshift(batch<T, A> const& arg, int n, requires_arch<sve>) noexcept
|
|
588
|
+
{
|
|
589
|
+
constexpr std::size_t size = sizeof(typename batch<T, A>::value_type) * 8;
|
|
590
|
+
assert(0 <= n && static_cast<std::size_t>(n) < size && "index in bounds");
|
|
591
|
+
return svlsr_x(detail::sve_ptrue<T>(), arg, static_cast<T>(n));
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
template <class A, class T, detail::sve_enable_unsigned_int_t<T> = 0>
|
|
595
|
+
XSIMD_INLINE batch<T, A> bitwise_rshift(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<sve>) noexcept
|
|
596
|
+
{
|
|
597
|
+
return svlsr_x(detail::sve_ptrue<T>(), lhs, rhs);
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
template <class A, class T, detail::sve_enable_signed_int_t<T> = 0>
|
|
601
|
+
XSIMD_INLINE batch<T, A> bitwise_rshift(batch<T, A> const& arg, int n, requires_arch<sve>) noexcept
|
|
602
|
+
{
|
|
603
|
+
constexpr std::size_t size = sizeof(typename batch<T, A>::value_type) * 8;
|
|
604
|
+
assert(0 <= n && static_cast<std::size_t>(n) < size && "index in bounds");
|
|
605
|
+
return svasr_x(detail::sve_ptrue<T>(), arg, static_cast<as_unsigned_integer_t<T>>(n));
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
template <class A, class T, detail::sve_enable_signed_int_t<T> = 0>
|
|
609
|
+
XSIMD_INLINE batch<T, A> bitwise_rshift(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<sve>) noexcept
|
|
610
|
+
{
|
|
611
|
+
return svasr_x(detail::sve_ptrue<T>(), lhs, detail::sve_to_unsigned_batch<A, T>(rhs));
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
/**************
|
|
615
|
+
* Reductions *
|
|
616
|
+
**************/
|
|
617
|
+
|
|
618
|
+
// reduce_add
|
|
619
|
+
template <class A, class T, class V = typename batch<T, A>::value_type, detail::sve_enable_all_t<T> = 0>
|
|
620
|
+
XSIMD_INLINE V reduce_add(batch<T, A> const& arg, requires_arch<sve>) noexcept
|
|
621
|
+
{
|
|
622
|
+
// sve integer reduction results are promoted to 64 bits
|
|
623
|
+
return static_cast<V>(svaddv(detail::sve_ptrue<T>(), arg));
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
// reduce_max
|
|
627
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
628
|
+
XSIMD_INLINE T reduce_max(batch<T, A> const& arg, requires_arch<sve>) noexcept
|
|
629
|
+
{
|
|
630
|
+
return svmaxv(detail::sve_ptrue<T>(), arg);
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
// reduce_min
|
|
634
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
635
|
+
XSIMD_INLINE T reduce_min(batch<T, A> const& arg, requires_arch<sve>) noexcept
|
|
636
|
+
{
|
|
637
|
+
return svminv(detail::sve_ptrue<T>(), arg);
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
// haddp
|
|
641
|
+
template <class A, class T, detail::sve_enable_floating_point_t<T> = 0>
|
|
642
|
+
XSIMD_INLINE batch<T, A> haddp(const batch<T, A>* row, requires_arch<sve>) noexcept
|
|
643
|
+
{
|
|
644
|
+
constexpr std::size_t size = batch<T, A>::size;
|
|
645
|
+
T sums[size];
|
|
646
|
+
for (std::size_t i = 0; i < size; ++i)
|
|
647
|
+
{
|
|
648
|
+
sums[i] = reduce_add(row[i], sve {});
|
|
649
|
+
}
|
|
650
|
+
return svld1(detail::sve_ptrue<T>(), sums);
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
/***************
|
|
654
|
+
* Comparisons *
|
|
655
|
+
***************/
|
|
656
|
+
|
|
657
|
+
// eq
|
|
658
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
659
|
+
XSIMD_INLINE batch_bool<T, A> eq(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<sve>) noexcept
|
|
660
|
+
{
|
|
661
|
+
return svcmpeq(detail::sve_ptrue<T>(), lhs, rhs);
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
665
|
+
XSIMD_INLINE batch_bool<T, A> eq(batch_bool<T, A> const& lhs, batch_bool<T, A> const& rhs, requires_arch<sve>) noexcept
|
|
666
|
+
{
|
|
667
|
+
const auto neq_result = sveor_z(detail::sve_ptrue<T>(), lhs, rhs);
|
|
668
|
+
return svnot_z(detail::sve_ptrue<T>(), neq_result);
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
// neq
|
|
672
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
673
|
+
XSIMD_INLINE batch_bool<T, A> neq(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<sve>) noexcept
|
|
674
|
+
{
|
|
675
|
+
return svcmpne(detail::sve_ptrue<T>(), lhs, rhs);
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
679
|
+
XSIMD_INLINE batch_bool<T, A> neq(batch_bool<T, A> const& lhs, batch_bool<T, A> const& rhs, requires_arch<sve>) noexcept
|
|
680
|
+
{
|
|
681
|
+
return sveor_z(detail::sve_ptrue<T>(), lhs, rhs);
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
// lt
|
|
685
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
686
|
+
XSIMD_INLINE batch_bool<T, A> lt(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<sve>) noexcept
|
|
687
|
+
{
|
|
688
|
+
return svcmplt(detail::sve_ptrue<T>(), lhs, rhs);
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
// le
|
|
692
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
693
|
+
XSIMD_INLINE batch_bool<T, A> le(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<sve>) noexcept
|
|
694
|
+
{
|
|
695
|
+
return svcmple(detail::sve_ptrue<T>(), lhs, rhs);
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
// gt
|
|
699
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
700
|
+
XSIMD_INLINE batch_bool<T, A> gt(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<sve>) noexcept
|
|
701
|
+
{
|
|
702
|
+
return svcmpgt(detail::sve_ptrue<T>(), lhs, rhs);
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
// ge
|
|
706
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
707
|
+
XSIMD_INLINE batch_bool<T, A> ge(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<sve>) noexcept
|
|
708
|
+
{
|
|
709
|
+
return svcmpge(detail::sve_ptrue<T>(), lhs, rhs);
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
/***************
|
|
713
|
+
* Permutation *
|
|
714
|
+
***************/
|
|
715
|
+
|
|
716
|
+
// rotate_left
|
|
717
|
+
template <size_t N, class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
718
|
+
XSIMD_INLINE batch<T, A> rotate_left(batch<T, A> const& a, requires_arch<sve>) noexcept
|
|
719
|
+
{
|
|
720
|
+
return svext(a, a, N);
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
// swizzle (dynamic)
|
|
724
|
+
template <class A, class T, class I>
|
|
725
|
+
XSIMD_INLINE batch<T, A> swizzle(batch<T, A> const& arg, batch<I, A> indices, requires_arch<sve>) noexcept
|
|
726
|
+
{
|
|
727
|
+
return svtbl(arg, indices);
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
template <class A, class T, class I>
|
|
731
|
+
XSIMD_INLINE batch<std::complex<T>, A> swizzle(batch<std::complex<T>, A> const& self,
|
|
732
|
+
batch<I, A> indices,
|
|
733
|
+
requires_arch<sve>) noexcept
|
|
734
|
+
{
|
|
735
|
+
const auto real = swizzle(self.real(), indices, sve {});
|
|
736
|
+
const auto imag = swizzle(self.imag(), indices, sve {});
|
|
737
|
+
return batch<std::complex<T>>(real, imag);
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
// swizzle (static)
|
|
741
|
+
template <class A, class T, class I, I... idx>
|
|
742
|
+
XSIMD_INLINE batch<T, A> swizzle(batch<T, A> const& arg, batch_constant<I, A, idx...> indices, requires_arch<sve>) noexcept
|
|
743
|
+
{
|
|
744
|
+
static_assert(batch<T, A>::size == sizeof...(idx), "invalid swizzle indices");
|
|
745
|
+
return swizzle(arg, indices.as_batch(), sve {});
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
template <class A, class T, class I, I... idx>
|
|
749
|
+
XSIMD_INLINE batch<std::complex<T>, A> swizzle(batch<std::complex<T>, A> const& arg,
|
|
750
|
+
batch_constant<I, A, idx...> indices,
|
|
751
|
+
requires_arch<sve>) noexcept
|
|
752
|
+
{
|
|
753
|
+
static_assert(batch<std::complex<T>, A>::size == sizeof...(idx), "invalid swizzle indices");
|
|
754
|
+
return swizzle(arg, indices.as_batch(), sve {});
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
/*************
|
|
758
|
+
* Selection *
|
|
759
|
+
*************/
|
|
760
|
+
|
|
761
|
+
// extract_pair
|
|
762
|
+
namespace detail
|
|
763
|
+
{
|
|
764
|
+
template <class A, class T>
|
|
765
|
+
XSIMD_INLINE batch<T, A> sve_extract_pair(batch<T, A> const&, batch<T, A> const& /*rhs*/, std::size_t, ::xsimd::detail::index_sequence<>) noexcept
|
|
766
|
+
{
|
|
767
|
+
assert(false && "extract_pair out of bounds");
|
|
768
|
+
return batch<T, A> {};
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
template <class A, class T, size_t I, size_t... Is>
|
|
772
|
+
XSIMD_INLINE batch<T, A> sve_extract_pair(batch<T, A> const& lhs, batch<T, A> const& rhs, std::size_t n, ::xsimd::detail::index_sequence<I, Is...>) noexcept
|
|
773
|
+
{
|
|
774
|
+
if (n == I)
|
|
775
|
+
{
|
|
776
|
+
return svext(rhs, lhs, I);
|
|
777
|
+
}
|
|
778
|
+
else
|
|
779
|
+
{
|
|
780
|
+
return sve_extract_pair(lhs, rhs, n, ::xsimd::detail::index_sequence<Is...>());
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
template <class A, class T, size_t... Is>
|
|
785
|
+
XSIMD_INLINE batch<T, A> sve_extract_pair_impl(batch<T, A> const& lhs, batch<T, A> const& rhs, std::size_t n, ::xsimd::detail::index_sequence<0, Is...>) noexcept
|
|
786
|
+
{
|
|
787
|
+
if (n == 0)
|
|
788
|
+
{
|
|
789
|
+
return rhs;
|
|
790
|
+
}
|
|
791
|
+
else
|
|
792
|
+
{
|
|
793
|
+
return sve_extract_pair(lhs, rhs, n, ::xsimd::detail::index_sequence<Is...>());
|
|
794
|
+
}
|
|
795
|
+
}
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
799
|
+
XSIMD_INLINE batch<T, A> extract_pair(batch<T, A> const& lhs, batch<T, A> const& rhs, std::size_t n, requires_arch<sve>) noexcept
|
|
800
|
+
{
|
|
801
|
+
constexpr std::size_t size = batch<T, A>::size;
|
|
802
|
+
assert(n < size && "index in bounds");
|
|
803
|
+
return detail::sve_extract_pair_impl(lhs, rhs, n, ::xsimd::detail::make_index_sequence<size>());
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
// select
|
|
807
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
808
|
+
XSIMD_INLINE batch<T, A> select(batch_bool<T, A> const& cond, batch<T, A> const& a, batch<T, A> const& b, requires_arch<sve>) noexcept
|
|
809
|
+
{
|
|
810
|
+
return svsel(cond, a, b);
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
template <class A, class T, bool... b>
|
|
814
|
+
XSIMD_INLINE batch<T, A> select(batch_bool_constant<T, A, b...> const&, batch<T, A> const& true_br, batch<T, A> const& false_br, requires_arch<sve>) noexcept
|
|
815
|
+
{
|
|
816
|
+
return select(batch_bool<T, A> { b... }, true_br, false_br, sve {});
|
|
817
|
+
}
|
|
818
|
+
|
|
819
|
+
// zip_lo
|
|
820
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
821
|
+
XSIMD_INLINE batch<T, A> zip_lo(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<sve>) noexcept
|
|
822
|
+
{
|
|
823
|
+
return svzip1(lhs, rhs);
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
// zip_hi
|
|
827
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
828
|
+
XSIMD_INLINE batch<T, A> zip_hi(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<sve>) noexcept
|
|
829
|
+
{
|
|
830
|
+
return svzip2(lhs, rhs);
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
/*****************************
|
|
834
|
+
* Floating-point arithmetic *
|
|
835
|
+
*****************************/
|
|
836
|
+
|
|
837
|
+
// rsqrt
|
|
838
|
+
template <class A, class T, detail::sve_enable_floating_point_t<T> = 0>
|
|
839
|
+
XSIMD_INLINE batch<T, A> rsqrt(batch<T, A> const& arg, requires_arch<sve>) noexcept
|
|
840
|
+
{
|
|
841
|
+
return svrsqrte(arg);
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
// sqrt
|
|
845
|
+
template <class A, class T, detail::sve_enable_floating_point_t<T> = 0>
|
|
846
|
+
XSIMD_INLINE batch<T, A> sqrt(batch<T, A> const& arg, requires_arch<sve>) noexcept
|
|
847
|
+
{
|
|
848
|
+
return svsqrt_x(detail::sve_ptrue<T>(), arg);
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
// reciprocal
|
|
852
|
+
template <class A, class T, detail::sve_enable_floating_point_t<T> = 0>
|
|
853
|
+
XSIMD_INLINE batch<T, A> reciprocal(const batch<T, A>& arg, requires_arch<sve>) noexcept
|
|
854
|
+
{
|
|
855
|
+
return svrecpe(arg);
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
/******************************
|
|
859
|
+
* Floating-point conversions *
|
|
860
|
+
******************************/
|
|
861
|
+
|
|
862
|
+
// fast_cast
|
|
863
|
+
namespace detail
|
|
864
|
+
{
|
|
865
|
+
template <class A, class T, detail::enable_sized_integral_t<T, 4> = 0>
|
|
866
|
+
XSIMD_INLINE batch<float, A> fast_cast(batch<T, A> const& arg, batch<float, A> const&, requires_arch<sve>) noexcept
|
|
867
|
+
{
|
|
868
|
+
return svcvt_f32_x(detail::sve_ptrue<T>(), arg);
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
template <class A, class T, detail::enable_sized_integral_t<T, 8> = 0>
|
|
872
|
+
XSIMD_INLINE batch<double, A> fast_cast(batch<T, A> const& arg, batch<double, A> const&, requires_arch<sve>) noexcept
|
|
873
|
+
{
|
|
874
|
+
return svcvt_f64_x(detail::sve_ptrue<T>(), arg);
|
|
875
|
+
}
|
|
876
|
+
|
|
877
|
+
template <class A>
|
|
878
|
+
XSIMD_INLINE batch<int32_t, A> fast_cast(batch<float, A> const& arg, batch<int32_t, A> const&, requires_arch<sve>) noexcept
|
|
879
|
+
{
|
|
880
|
+
return svcvt_s32_x(detail::sve_ptrue<float>(), arg);
|
|
881
|
+
}
|
|
882
|
+
|
|
883
|
+
template <class A>
|
|
884
|
+
XSIMD_INLINE batch<uint32_t, A> fast_cast(batch<float, A> const& arg, batch<uint32_t, A> const&, requires_arch<sve>) noexcept
|
|
885
|
+
{
|
|
886
|
+
return svcvt_u32_x(detail::sve_ptrue<float>(), arg);
|
|
887
|
+
}
|
|
888
|
+
|
|
889
|
+
template <class A>
|
|
890
|
+
XSIMD_INLINE batch<int64_t, A> fast_cast(batch<double, A> const& arg, batch<int64_t, A> const&, requires_arch<sve>) noexcept
|
|
891
|
+
{
|
|
892
|
+
return svcvt_s64_x(detail::sve_ptrue<double>(), arg);
|
|
893
|
+
}
|
|
894
|
+
|
|
895
|
+
template <class A>
|
|
896
|
+
XSIMD_INLINE batch<uint64_t, A> fast_cast(batch<double, A> const& arg, batch<uint64_t, A> const&, requires_arch<sve>) noexcept
|
|
897
|
+
{
|
|
898
|
+
return svcvt_u64_x(detail::sve_ptrue<double>(), arg);
|
|
899
|
+
}
|
|
900
|
+
}
|
|
901
|
+
|
|
902
|
+
/*********
|
|
903
|
+
* Miscs *
|
|
904
|
+
*********/
|
|
905
|
+
|
|
906
|
+
// set
|
|
907
|
+
template <class A, class T, class... Args>
|
|
908
|
+
XSIMD_INLINE batch<T, A> set(batch<T, A> const&, requires_arch<sve>, Args... args) noexcept
|
|
909
|
+
{
|
|
910
|
+
return detail::sve_vector_type<T> { args... };
|
|
911
|
+
}
|
|
912
|
+
|
|
913
|
+
template <class A, class T, class... Args>
|
|
914
|
+
XSIMD_INLINE batch<std::complex<T>, A> set(batch<std::complex<T>, A> const&, requires_arch<sve>,
|
|
915
|
+
Args... args_complex) noexcept
|
|
916
|
+
{
|
|
917
|
+
return batch<std::complex<T>>(detail::sve_vector_type<T> { args_complex.real()... },
|
|
918
|
+
detail::sve_vector_type<T> { args_complex.imag()... });
|
|
919
|
+
}
|
|
920
|
+
|
|
921
|
+
template <class A, class T, class... Args>
|
|
922
|
+
XSIMD_INLINE batch_bool<T, A> set(batch_bool<T, A> const&, requires_arch<sve>, Args... args) noexcept
|
|
923
|
+
{
|
|
924
|
+
using U = as_unsigned_integer_t<T>;
|
|
925
|
+
const auto values = detail::sve_vector_type<U> { static_cast<U>(args)... };
|
|
926
|
+
const auto zero = broadcast<A, U>(static_cast<U>(0), sve {});
|
|
927
|
+
return svcmpne(detail::sve_ptrue<T>(), values, zero);
|
|
928
|
+
}
|
|
929
|
+
|
|
930
|
+
// insert
|
|
931
|
+
namespace detail
|
|
932
|
+
{
|
|
933
|
+
// generate index sequence (iota)
|
|
934
|
+
XSIMD_INLINE svuint8_t sve_iota_impl(index<1>) noexcept { return svindex_u8(0, 1); }
|
|
935
|
+
XSIMD_INLINE svuint16_t sve_iota_impl(index<2>) noexcept { return svindex_u16(0, 1); }
|
|
936
|
+
XSIMD_INLINE svuint32_t sve_iota_impl(index<4>) noexcept { return svindex_u32(0, 1); }
|
|
937
|
+
XSIMD_INLINE svuint64_t sve_iota_impl(index<8>) noexcept { return svindex_u64(0, 1); }
|
|
938
|
+
|
|
939
|
+
template <class T, class V = sve_vector_type<as_unsigned_integer_t<T>>>
|
|
940
|
+
XSIMD_INLINE V sve_iota() noexcept { return sve_iota_impl(index<sizeof(T)> {}); }
|
|
941
|
+
} // namespace detail
|
|
942
|
+
|
|
943
|
+
template <class A, class T, size_t I, detail::sve_enable_all_t<T> = 0>
|
|
944
|
+
XSIMD_INLINE batch<T, A> insert(batch<T, A> const& arg, T val, index<I>, requires_arch<sve>) noexcept
|
|
945
|
+
{
|
|
946
|
+
// create a predicate with only the I-th lane activated
|
|
947
|
+
const auto iota = detail::sve_iota<T>();
|
|
948
|
+
const auto index_predicate = svcmpeq(detail::sve_ptrue<T>(), iota, static_cast<as_unsigned_integer_t<T>>(I));
|
|
949
|
+
return svsel(index_predicate, broadcast<A, T>(val, sve {}), arg);
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
// first
|
|
953
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
954
|
+
XSIMD_INLINE T first(batch<T, A> const& self, requires_arch<sve>) noexcept
|
|
955
|
+
{
|
|
956
|
+
return self.data[0];
|
|
957
|
+
}
|
|
958
|
+
|
|
959
|
+
// all
|
|
960
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
961
|
+
XSIMD_INLINE bool all(batch_bool<T, A> const& arg, requires_arch<sve>) noexcept
|
|
962
|
+
{
|
|
963
|
+
return detail::sve_pcount<T>(arg) == batch_bool<T, A>::size;
|
|
964
|
+
}
|
|
965
|
+
|
|
966
|
+
// any
|
|
967
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
968
|
+
XSIMD_INLINE bool any(batch_bool<T, A> const& arg, requires_arch<sve>) noexcept
|
|
969
|
+
{
|
|
970
|
+
return svptest_any(arg, arg);
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
// bitwise_cast
|
|
974
|
+
template <class A, class T, class R, detail::sve_enable_all_t<T> = 0, detail::enable_sized_unsigned_t<R, 1> = 0>
|
|
975
|
+
XSIMD_INLINE batch<R, A> bitwise_cast(batch<T, A> const& arg, batch<R, A> const&, requires_arch<sve>) noexcept
|
|
976
|
+
{
|
|
977
|
+
return svreinterpret_u8(arg);
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
template <class A, class T, class R, detail::sve_enable_all_t<T> = 0, detail::enable_sized_signed_t<R, 1> = 0>
|
|
981
|
+
XSIMD_INLINE batch<R, A> bitwise_cast(batch<T, A> const& arg, batch<R, A> const&, requires_arch<sve>) noexcept
|
|
982
|
+
{
|
|
983
|
+
return svreinterpret_s8(arg);
|
|
984
|
+
}
|
|
985
|
+
|
|
986
|
+
template <class A, class T, class R, detail::sve_enable_all_t<T> = 0, detail::enable_sized_unsigned_t<R, 2> = 0>
|
|
987
|
+
XSIMD_INLINE batch<R, A> bitwise_cast(batch<T, A> const& arg, batch<R, A> const&, requires_arch<sve>) noexcept
|
|
988
|
+
{
|
|
989
|
+
return svreinterpret_u16(arg);
|
|
990
|
+
}
|
|
991
|
+
|
|
992
|
+
template <class A, class T, class R, detail::sve_enable_all_t<T> = 0, detail::enable_sized_signed_t<R, 2> = 0>
|
|
993
|
+
XSIMD_INLINE batch<R, A> bitwise_cast(batch<T, A> const& arg, batch<R, A> const&, requires_arch<sve>) noexcept
|
|
994
|
+
{
|
|
995
|
+
return svreinterpret_s16(arg);
|
|
996
|
+
}
|
|
997
|
+
|
|
998
|
+
template <class A, class T, class R, detail::sve_enable_all_t<T> = 0, detail::enable_sized_unsigned_t<R, 4> = 0>
|
|
999
|
+
XSIMD_INLINE batch<R, A> bitwise_cast(batch<T, A> const& arg, batch<R, A> const&, requires_arch<sve>) noexcept
|
|
1000
|
+
{
|
|
1001
|
+
return svreinterpret_u32(arg);
|
|
1002
|
+
}
|
|
1003
|
+
|
|
1004
|
+
template <class A, class T, class R, detail::sve_enable_all_t<T> = 0, detail::enable_sized_signed_t<R, 4> = 0>
|
|
1005
|
+
XSIMD_INLINE batch<R, A> bitwise_cast(batch<T, A> const& arg, batch<R, A> const&, requires_arch<sve>) noexcept
|
|
1006
|
+
{
|
|
1007
|
+
return svreinterpret_s32(arg);
|
|
1008
|
+
}
|
|
1009
|
+
|
|
1010
|
+
template <class A, class T, class R, detail::sve_enable_all_t<T> = 0, detail::enable_sized_unsigned_t<R, 8> = 0>
|
|
1011
|
+
XSIMD_INLINE batch<R, A> bitwise_cast(batch<T, A> const& arg, batch<R, A> const&, requires_arch<sve>) noexcept
|
|
1012
|
+
{
|
|
1013
|
+
return svreinterpret_u64(arg);
|
|
1014
|
+
}
|
|
1015
|
+
|
|
1016
|
+
template <class A, class T, class R, detail::sve_enable_all_t<T> = 0, detail::enable_sized_signed_t<R, 8> = 0>
|
|
1017
|
+
XSIMD_INLINE batch<R, A> bitwise_cast(batch<T, A> const& arg, batch<R, A> const&, requires_arch<sve>) noexcept
|
|
1018
|
+
{
|
|
1019
|
+
return svreinterpret_s64(arg);
|
|
1020
|
+
}
|
|
1021
|
+
|
|
1022
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
1023
|
+
XSIMD_INLINE batch<float, A> bitwise_cast(batch<T, A> const& arg, batch<float, A> const&, requires_arch<sve>) noexcept
|
|
1024
|
+
{
|
|
1025
|
+
return svreinterpret_f32(arg);
|
|
1026
|
+
}
|
|
1027
|
+
|
|
1028
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
1029
|
+
XSIMD_INLINE batch<double, A> bitwise_cast(batch<T, A> const& arg, batch<double, A> const&, requires_arch<sve>) noexcept
|
|
1030
|
+
{
|
|
1031
|
+
return svreinterpret_f64(arg);
|
|
1032
|
+
}
|
|
1033
|
+
|
|
1034
|
+
// batch_bool_cast
|
|
1035
|
+
template <class A, class T_out, class T_in, detail::sve_enable_all_t<T_in> = 0>
|
|
1036
|
+
XSIMD_INLINE batch_bool<T_out, A> batch_bool_cast(batch_bool<T_in, A> const& arg, batch_bool<T_out, A> const&, requires_arch<sve>) noexcept
|
|
1037
|
+
{
|
|
1038
|
+
return arg.data;
|
|
1039
|
+
}
|
|
1040
|
+
|
|
1041
|
+
// from_bool
|
|
1042
|
+
template <class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
1043
|
+
XSIMD_INLINE batch<T, A> from_bool(batch_bool<T, A> const& arg, requires_arch<sve>) noexcept
|
|
1044
|
+
{
|
|
1045
|
+
return select(arg, batch<T, A>(1), batch<T, A>(0));
|
|
1046
|
+
}
|
|
1047
|
+
|
|
1048
|
+
// slide_left
|
|
1049
|
+
namespace detail
|
|
1050
|
+
{
|
|
1051
|
+
template <size_t N>
|
|
1052
|
+
struct sve_slider_left
|
|
1053
|
+
{
|
|
1054
|
+
template <class A, class T>
|
|
1055
|
+
XSIMD_INLINE batch<T, A> operator()(batch<T, A> const& arg) noexcept
|
|
1056
|
+
{
|
|
1057
|
+
using u8_vector = batch<uint8_t, A>;
|
|
1058
|
+
const auto left = svdup_n_u8(0);
|
|
1059
|
+
const auto right = bitwise_cast(arg, u8_vector {}, sve {}).data;
|
|
1060
|
+
const u8_vector result(svext(left, right, u8_vector::size - N));
|
|
1061
|
+
return bitwise_cast(result, batch<T, A> {}, sve {});
|
|
1062
|
+
}
|
|
1063
|
+
};
|
|
1064
|
+
|
|
1065
|
+
template <>
|
|
1066
|
+
struct sve_slider_left<0>
|
|
1067
|
+
{
|
|
1068
|
+
template <class A, class T>
|
|
1069
|
+
XSIMD_INLINE batch<T, A> operator()(batch<T, A> const& arg) noexcept
|
|
1070
|
+
{
|
|
1071
|
+
return arg;
|
|
1072
|
+
}
|
|
1073
|
+
};
|
|
1074
|
+
} // namespace detail
|
|
1075
|
+
|
|
1076
|
+
template <size_t N, class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
1077
|
+
XSIMD_INLINE batch<T, A> slide_left(batch<T, A> const& arg, requires_arch<sve>) noexcept
|
|
1078
|
+
{
|
|
1079
|
+
return detail::sve_slider_left<N>()(arg);
|
|
1080
|
+
}
|
|
1081
|
+
|
|
1082
|
+
// slide_right
|
|
1083
|
+
namespace detail
|
|
1084
|
+
{
|
|
1085
|
+
template <size_t N>
|
|
1086
|
+
struct sve_slider_right
|
|
1087
|
+
{
|
|
1088
|
+
template <class A, class T>
|
|
1089
|
+
XSIMD_INLINE batch<T, A> operator()(batch<T, A> const& arg) noexcept
|
|
1090
|
+
{
|
|
1091
|
+
using u8_vector = batch<uint8_t, A>;
|
|
1092
|
+
const auto left = bitwise_cast(arg, u8_vector {}, sve {}).data;
|
|
1093
|
+
const auto right = svdup_n_u8(0);
|
|
1094
|
+
const u8_vector result(svext(left, right, N));
|
|
1095
|
+
return bitwise_cast(result, batch<T, A> {}, sve {});
|
|
1096
|
+
}
|
|
1097
|
+
};
|
|
1098
|
+
|
|
1099
|
+
template <>
|
|
1100
|
+
struct sve_slider_right<batch<uint8_t, sve>::size>
|
|
1101
|
+
{
|
|
1102
|
+
template <class A, class T>
|
|
1103
|
+
XSIMD_INLINE batch<T, A> operator()(batch<T, A> const&) noexcept
|
|
1104
|
+
{
|
|
1105
|
+
return batch<T, A> {};
|
|
1106
|
+
}
|
|
1107
|
+
};
|
|
1108
|
+
} // namespace detail
|
|
1109
|
+
|
|
1110
|
+
template <size_t N, class A, class T, detail::sve_enable_all_t<T> = 0>
|
|
1111
|
+
XSIMD_INLINE batch<T, A> slide_right(batch<T, A> const& arg, requires_arch<sve>) noexcept
|
|
1112
|
+
{
|
|
1113
|
+
return detail::sve_slider_right<N>()(arg);
|
|
1114
|
+
}
|
|
1115
|
+
|
|
1116
|
+
// isnan
|
|
1117
|
+
template <class A, class T, detail::sve_enable_floating_point_t<T> = 0>
|
|
1118
|
+
XSIMD_INLINE batch_bool<T, A> isnan(batch<T, A> const& arg, requires_arch<sve>) noexcept
|
|
1119
|
+
{
|
|
1120
|
+
return !(arg == arg);
|
|
1121
|
+
}
|
|
1122
|
+
|
|
1123
|
+
// nearbyint
|
|
1124
|
+
template <class A, class T, detail::sve_enable_floating_point_t<T> = 0>
|
|
1125
|
+
XSIMD_INLINE batch<T, A> nearbyint(batch<T, A> const& arg, requires_arch<sve>) noexcept
|
|
1126
|
+
{
|
|
1127
|
+
return svrintx_x(detail::sve_ptrue<T>(), arg);
|
|
1128
|
+
}
|
|
1129
|
+
|
|
1130
|
+
// nearbyint_as_int
|
|
1131
|
+
template <class A>
|
|
1132
|
+
XSIMD_INLINE batch<int32_t, A> nearbyint_as_int(batch<float, A> const& arg, requires_arch<sve>) noexcept
|
|
1133
|
+
{
|
|
1134
|
+
const auto nearest = svrintx_x(detail::sve_ptrue<float>(), arg);
|
|
1135
|
+
return svcvt_s32_x(detail::sve_ptrue<float>(), nearest);
|
|
1136
|
+
}
|
|
1137
|
+
|
|
1138
|
+
template <class A>
|
|
1139
|
+
XSIMD_INLINE batch<int64_t, A> nearbyint_as_int(batch<double, A> const& arg, requires_arch<sve>) noexcept
|
|
1140
|
+
{
|
|
1141
|
+
const auto nearest = svrintx_x(detail::sve_ptrue<double>(), arg);
|
|
1142
|
+
return svcvt_s64_x(detail::sve_ptrue<double>(), nearest);
|
|
1143
|
+
}
|
|
1144
|
+
|
|
1145
|
+
// ldexp
|
|
1146
|
+
template <class A, class T, detail::sve_enable_floating_point_t<T> = 0>
|
|
1147
|
+
XSIMD_INLINE batch<T, A> ldexp(const batch<T, A>& x, const batch<as_integer_t<T>, A>& exp, requires_arch<sve>) noexcept
|
|
1148
|
+
{
|
|
1149
|
+
return svscale_x(detail::sve_ptrue<T>(), x, exp);
|
|
1150
|
+
}
|
|
1151
|
+
|
|
1152
|
+
} // namespace kernel
|
|
1153
|
+
} // namespace xsimd
|
|
1154
|
+
|
|
1155
|
+
#endif
|