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