sequenzo 0.1.21__cp310-cp310-macosx_11_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of sequenzo might be problematic. Click here for more details.
- sequenzo/__init__.py +240 -0
- sequenzo/big_data/__init__.py +12 -0
- sequenzo/big_data/clara/__init__.py +26 -0
- sequenzo/big_data/clara/clara.py +467 -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 +196 -0
- sequenzo/clustering/__init__.py +30 -0
- sequenzo/clustering/clustering_c_code.cpython-310-darwin.so +0 -0
- sequenzo/clustering/hierarchical_clustering.py +1380 -0
- sequenzo/clustering/src/KMedoid.cpp +262 -0
- sequenzo/clustering/src/PAM.cpp +236 -0
- sequenzo/clustering/src/PAMonce.cpp +234 -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 +20 -0
- sequenzo/data_preprocessing/helpers.py +256 -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/mvad.csv +713 -0
- sequenzo/datasets/pairfam_family.csv +1867 -0
- sequenzo/datasets/polyadic_samplec1.csv +61 -0
- sequenzo/datasets/polyadic_samplep1.csv +61 -0
- sequenzo/datasets/polyadic_seqc1.csv +61 -0
- sequenzo/datasets/polyadic_seqp1.csv +61 -0
- sequenzo/define_sequence_data.py +609 -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 +702 -0
- sequenzo/dissimilarity_measures/get_substitution_cost_matrix.py +241 -0
- sequenzo/dissimilarity_measures/src/DHDdistance.cpp +148 -0
- sequenzo/dissimilarity_measures/src/LCPdistance.cpp +114 -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 +34 -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 +431 -0
- sequenzo/multidomain/combt.py +519 -0
- sequenzo/multidomain/dat.py +89 -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 +43 -0
- sequenzo/prefix_tree/individual_level_indicators.py +1274 -0
- sequenzo/prefix_tree/system_level_indicators.py +465 -0
- sequenzo/prefix_tree/utils.py +54 -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 +48 -0
- sequenzo/suffix_tree/individual_level_indicators.py +1638 -0
- sequenzo/suffix_tree/system_level_indicators.py +456 -0
- sequenzo/suffix_tree/utils.py +56 -0
- sequenzo/visualization/__init__.py +29 -0
- sequenzo/visualization/plot_mean_time.py +194 -0
- sequenzo/visualization/plot_modal_state.py +276 -0
- sequenzo/visualization/plot_most_frequent_sequences.py +147 -0
- sequenzo/visualization/plot_relative_frequency.py +404 -0
- sequenzo/visualization/plot_sequence_index.py +937 -0
- sequenzo/visualization/plot_single_medoid.py +153 -0
- sequenzo/visualization/plot_state_distribution.py +613 -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.21.dist-info/METADATA +308 -0
- sequenzo-0.1.21.dist-info/RECORD +254 -0
- sequenzo-0.1.21.dist-info/WHEEL +5 -0
- sequenzo-0.1.21.dist-info/licenses/LICENSE +28 -0
- sequenzo-0.1.21.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,330 @@
|
|
|
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
|
+
// This file is derived from tsimd (MIT License)
|
|
13
|
+
// https://github.com/ospray/tsimd/blob/master/benchmarks/mandelbrot.cpp
|
|
14
|
+
// Author Jefferson Amstutz / intel
|
|
15
|
+
|
|
16
|
+
#include <cstdio>
|
|
17
|
+
#include <iostream>
|
|
18
|
+
#include <string>
|
|
19
|
+
#include <vector>
|
|
20
|
+
|
|
21
|
+
#include "pico_bench.hpp"
|
|
22
|
+
|
|
23
|
+
#include <xsimd/xsimd.hpp>
|
|
24
|
+
|
|
25
|
+
// helper function to write the rendered image as PPM file
|
|
26
|
+
inline void writePPM(const std::string& fileName,
|
|
27
|
+
const int sizeX,
|
|
28
|
+
const int sizeY,
|
|
29
|
+
const int* pixel)
|
|
30
|
+
{
|
|
31
|
+
FILE* file = fopen(fileName.c_str(), "wb");
|
|
32
|
+
fprintf(file, "P6\n%i %i\n255\n", sizeX, sizeY);
|
|
33
|
+
unsigned char* out = (unsigned char*)alloca(3 * sizeX);
|
|
34
|
+
for (int y = 0; y < sizeY; y++)
|
|
35
|
+
{
|
|
36
|
+
const unsigned char* in = (const unsigned char*)&pixel[(sizeY - 1 - y) * sizeX];
|
|
37
|
+
|
|
38
|
+
for (int x = 0; x < sizeX; x++)
|
|
39
|
+
{
|
|
40
|
+
out[3 * x + 0] = in[4 * x + 0];
|
|
41
|
+
out[3 * x + 1] = in[4 * x + 1];
|
|
42
|
+
out[3 * x + 2] = in[4 * x + 2];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
fwrite(out, 3 * sizeX, sizeof(char), file);
|
|
46
|
+
}
|
|
47
|
+
fprintf(file, "\n");
|
|
48
|
+
fclose(file);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
namespace xsimd
|
|
52
|
+
{
|
|
53
|
+
|
|
54
|
+
template <class arch>
|
|
55
|
+
inline batch<int, arch> mandel(const batch_bool<float, arch>& _active,
|
|
56
|
+
const batch<float, arch>& c_re,
|
|
57
|
+
const batch<float, arch>& c_im,
|
|
58
|
+
int maxIters)
|
|
59
|
+
{
|
|
60
|
+
using float_batch_type = batch<float, arch>;
|
|
61
|
+
using int_batch_type = batch<int, arch>;
|
|
62
|
+
|
|
63
|
+
constexpr std::size_t N = float_batch_type::size;
|
|
64
|
+
|
|
65
|
+
float_batch_type z_re = c_re;
|
|
66
|
+
float_batch_type z_im = c_im;
|
|
67
|
+
int_batch_type vi(0);
|
|
68
|
+
|
|
69
|
+
for (int i = 0; i < maxIters; ++i)
|
|
70
|
+
{
|
|
71
|
+
auto active = _active & ((z_re * z_re + z_im * z_im) <= float_batch_type(4.f));
|
|
72
|
+
if (!xsimd::any(active))
|
|
73
|
+
{
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
float_batch_type new_re = z_re * z_re - z_im * z_im;
|
|
78
|
+
float_batch_type new_im = 2.f * z_re * z_im;
|
|
79
|
+
|
|
80
|
+
z_re = c_re + new_re;
|
|
81
|
+
z_im = c_im + new_im;
|
|
82
|
+
|
|
83
|
+
vi = select(batch_bool_cast<int>(active), vi + 1, vi);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return vi;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
template <class arch>
|
|
90
|
+
void mandelbrot(float x0,
|
|
91
|
+
float y0,
|
|
92
|
+
float x1,
|
|
93
|
+
float y1,
|
|
94
|
+
int width,
|
|
95
|
+
int height,
|
|
96
|
+
int maxIters,
|
|
97
|
+
int output[])
|
|
98
|
+
{
|
|
99
|
+
using float_batch_type = batch<float, arch>;
|
|
100
|
+
using int_batch_type = batch<int, arch>;
|
|
101
|
+
|
|
102
|
+
constexpr std::size_t N = float_batch_type::size;
|
|
103
|
+
float dx = (x1 - x0) / width;
|
|
104
|
+
float dy = (y1 - y0) / height;
|
|
105
|
+
|
|
106
|
+
float arange[N];
|
|
107
|
+
std::iota(&arange[0], &arange[N], 0.f);
|
|
108
|
+
// float_batch_type programIndex(&arange[0], xsimd::aligned_mode());
|
|
109
|
+
|
|
110
|
+
auto programIndex = float_batch_type::load(&arange[0], xsimd::aligned_mode());
|
|
111
|
+
// std::iota(programIndex.begin(), programIndex.end(), 0.f);
|
|
112
|
+
|
|
113
|
+
for (int j = 0; j < height; j++)
|
|
114
|
+
{
|
|
115
|
+
for (int i = 0; i < width; i += N)
|
|
116
|
+
{
|
|
117
|
+
float_batch_type x(x0 + (i + programIndex) * dx);
|
|
118
|
+
float_batch_type y(y0 + j * dy);
|
|
119
|
+
|
|
120
|
+
auto active = x < float_batch_type(width);
|
|
121
|
+
|
|
122
|
+
int base_index = (j * width + i);
|
|
123
|
+
auto result = mandel<arch>(active, x, y, maxIters);
|
|
124
|
+
|
|
125
|
+
// implement masked store!
|
|
126
|
+
// xsimd::store_aligned(result, output + base_index, active);
|
|
127
|
+
int_batch_type prev_data = int_batch_type::load_unaligned(output + base_index);
|
|
128
|
+
select(batch_bool_cast<int>(active), result, prev_data)
|
|
129
|
+
.store_aligned(output + base_index);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
} // namespace xsimd
|
|
135
|
+
|
|
136
|
+
// omp version ////////////////////////////////////////////////////////////////
|
|
137
|
+
|
|
138
|
+
namespace omp
|
|
139
|
+
{
|
|
140
|
+
|
|
141
|
+
#pragma omp declare simd
|
|
142
|
+
template <typename T>
|
|
143
|
+
inline int mandel(T c_re, T c_im, int count)
|
|
144
|
+
{
|
|
145
|
+
T z_re = c_re, z_im = c_im;
|
|
146
|
+
int i;
|
|
147
|
+
for (i = 0; i < count; ++i)
|
|
148
|
+
{
|
|
149
|
+
if (z_re * z_re + z_im * z_im > 4.f)
|
|
150
|
+
{
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
T new_re = z_re * z_re - z_im * z_im;
|
|
155
|
+
T new_im = 2.f * z_re * z_im;
|
|
156
|
+
z_re = c_re + new_re;
|
|
157
|
+
z_im = c_im + new_im;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return i;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
void mandelbrot(float x0, float y0, float x1, float y1, int width,
|
|
164
|
+
int height, int maxIterations, int output[])
|
|
165
|
+
{
|
|
166
|
+
float dx = (x1 - x0) / width;
|
|
167
|
+
float dy = (y1 - y0) / height;
|
|
168
|
+
|
|
169
|
+
for (int j = 0; j < height; j++)
|
|
170
|
+
{
|
|
171
|
+
|
|
172
|
+
#pragma omp simd
|
|
173
|
+
for (int i = 0; i < width; ++i)
|
|
174
|
+
{
|
|
175
|
+
float x = x0 + i * dx;
|
|
176
|
+
float y = y0 + j * dy;
|
|
177
|
+
|
|
178
|
+
int index = (j * width + i);
|
|
179
|
+
output[index] = mandel<float>(x, y, maxIterations);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
} // namespace omp
|
|
185
|
+
|
|
186
|
+
// scalar version /////////////////////////////////////////////////////////////
|
|
187
|
+
|
|
188
|
+
namespace scalar
|
|
189
|
+
{
|
|
190
|
+
|
|
191
|
+
inline int mandel(float c_re, float c_im, int count)
|
|
192
|
+
{
|
|
193
|
+
float z_re = c_re, z_im = c_im;
|
|
194
|
+
int i;
|
|
195
|
+
for (i = 0; i < count; ++i)
|
|
196
|
+
{
|
|
197
|
+
if (z_re * z_re + z_im * z_im > 4.f)
|
|
198
|
+
{
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
float new_re = z_re * z_re - z_im * z_im;
|
|
203
|
+
float new_im = 2.f * z_re * z_im;
|
|
204
|
+
z_re = c_re + new_re;
|
|
205
|
+
z_im = c_im + new_im;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
return i;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
void mandelbrot(float x0, float y0, float x1, float y1,
|
|
212
|
+
int width, int height, int maxIterations, int output[])
|
|
213
|
+
{
|
|
214
|
+
float dx = (x1 - x0) / width;
|
|
215
|
+
float dy = (y1 - y0) / height;
|
|
216
|
+
|
|
217
|
+
for (int j = 0; j < height; j++)
|
|
218
|
+
{
|
|
219
|
+
for (int i = 0; i < width; ++i)
|
|
220
|
+
{
|
|
221
|
+
float x = x0 + i * dx;
|
|
222
|
+
float y = y0 + j * dy;
|
|
223
|
+
|
|
224
|
+
int index = (j * width + i);
|
|
225
|
+
output[index] = mandel(x, y, maxIterations);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
} // namespace scalar
|
|
231
|
+
|
|
232
|
+
// run simd version of mandelbrot benchmark for a specific arch
|
|
233
|
+
template <class arch, class bencher_t, size_t Align>
|
|
234
|
+
void run_arch(
|
|
235
|
+
bencher_t& bencher,
|
|
236
|
+
float x0,
|
|
237
|
+
float y0,
|
|
238
|
+
float x1,
|
|
239
|
+
float y1,
|
|
240
|
+
int width,
|
|
241
|
+
int height,
|
|
242
|
+
int maxIters,
|
|
243
|
+
std::vector<int, xsimd::aligned_allocator<int, Align>>& buffer)
|
|
244
|
+
{
|
|
245
|
+
std::fill(buffer.begin(), buffer.end(), 0);
|
|
246
|
+
auto stats = bencher([&]()
|
|
247
|
+
{ xsimd::mandelbrot<arch>(x0, y0, x1, y1, width, height, maxIters, buffer.data()); });
|
|
248
|
+
|
|
249
|
+
const float scalar_min = stats.min().count();
|
|
250
|
+
|
|
251
|
+
std::cout << '\n'
|
|
252
|
+
<< arch::name() << " " << stats << '\n';
|
|
253
|
+
auto filename = std::string("mandelbrot_") + std::string(arch::name()) + std::string(".ppm");
|
|
254
|
+
writePPM(filename.c_str(), width, height, buffer.data());
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
template <class T>
|
|
258
|
+
struct run_archlist;
|
|
259
|
+
|
|
260
|
+
// run simd version of mandelbrot benchmark for a list
|
|
261
|
+
// of archs
|
|
262
|
+
template <class... Arch>
|
|
263
|
+
struct run_archlist<xsimd::arch_list<Arch...>>
|
|
264
|
+
{
|
|
265
|
+
template <class bencher_t, size_t Align>
|
|
266
|
+
static void run(
|
|
267
|
+
bencher_t& bencher,
|
|
268
|
+
float x0,
|
|
269
|
+
float y0,
|
|
270
|
+
float x1,
|
|
271
|
+
float y1,
|
|
272
|
+
int width,
|
|
273
|
+
int height,
|
|
274
|
+
int maxIters,
|
|
275
|
+
std::vector<int, xsimd::aligned_allocator<int, Align>>& buffer)
|
|
276
|
+
{
|
|
277
|
+
(void)std::initializer_list<int> { (run_arch<Arch>(bencher, x0, y0, x1, x1, width, height, maxIters, buffer), 0)... };
|
|
278
|
+
}
|
|
279
|
+
};
|
|
280
|
+
|
|
281
|
+
int main()
|
|
282
|
+
{
|
|
283
|
+
using namespace std::chrono;
|
|
284
|
+
|
|
285
|
+
const unsigned int width = 1024;
|
|
286
|
+
const unsigned int height = 768;
|
|
287
|
+
const float x0 = -2;
|
|
288
|
+
const float x1 = 1;
|
|
289
|
+
const float y0 = -1;
|
|
290
|
+
const float y1 = 1;
|
|
291
|
+
const int maxIters = 256;
|
|
292
|
+
|
|
293
|
+
std::vector<int, xsimd::aligned_allocator<int>> buf(width * height);
|
|
294
|
+
|
|
295
|
+
auto bencher = pico_bench::Benchmarker<milliseconds> { 64, seconds { 10 } };
|
|
296
|
+
|
|
297
|
+
std::cout << "starting benchmarks (results in 'ms')... " << '\n';
|
|
298
|
+
|
|
299
|
+
// scalar run ///////////////////////////////////////////////////////////////
|
|
300
|
+
|
|
301
|
+
std::fill(buf.begin(), buf.end(), 0);
|
|
302
|
+
|
|
303
|
+
auto stats_scalar = bencher([&]()
|
|
304
|
+
{ scalar::mandelbrot(x0, y0, x1, y1, width, height, maxIters, buf.data()); });
|
|
305
|
+
|
|
306
|
+
const float scalar_min = stats_scalar.min().count();
|
|
307
|
+
|
|
308
|
+
std::cout << '\n'
|
|
309
|
+
<< "scalar " << stats_scalar << '\n';
|
|
310
|
+
|
|
311
|
+
writePPM("mandelbrot_scalar.ppm", width, height, buf.data());
|
|
312
|
+
|
|
313
|
+
// omp run //////////////////////////////////////////////////////////////////
|
|
314
|
+
|
|
315
|
+
std::fill(buf.begin(), buf.end(), 0);
|
|
316
|
+
|
|
317
|
+
auto stats_omp = bencher([&]()
|
|
318
|
+
{ omp::mandelbrot(x0, y0, x1, y1, width, height, maxIters, buf.data()); });
|
|
319
|
+
|
|
320
|
+
const float omp_min = stats_omp.min().count();
|
|
321
|
+
|
|
322
|
+
std::cout << '\n'
|
|
323
|
+
<< "omp " << stats_omp << '\n';
|
|
324
|
+
|
|
325
|
+
writePPM("mandelbrot_omp.ppm", width, height, buf.data());
|
|
326
|
+
|
|
327
|
+
run_archlist<xsimd::supported_architectures>::run(bencher, x0, y0, x1, y1, width, height, maxIters, buf);
|
|
328
|
+
|
|
329
|
+
return 0;
|
|
330
|
+
}
|
|
@@ -0,0 +1,246 @@
|
|
|
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
|
+
// This file is derived from tsimd (MIT License)
|
|
13
|
+
// https://github.com/ospray/tsimd/blob/master/benchmarks/pico_bench.h
|
|
14
|
+
// Author Jefferson Amstutz / intel
|
|
15
|
+
|
|
16
|
+
#ifndef PICO_BENCH_H
|
|
17
|
+
#define PICO_BENCH_H
|
|
18
|
+
|
|
19
|
+
#include <algorithm>
|
|
20
|
+
#include <cassert>
|
|
21
|
+
#include <chrono>
|
|
22
|
+
#include <cmath>
|
|
23
|
+
#include <iterator>
|
|
24
|
+
#include <numeric>
|
|
25
|
+
#include <ostream>
|
|
26
|
+
#include <type_traits>
|
|
27
|
+
#include <utility>
|
|
28
|
+
#include <vector>
|
|
29
|
+
|
|
30
|
+
namespace pico_bench
|
|
31
|
+
{
|
|
32
|
+
/* Statistics on some time measurement value T, e.g. T =
|
|
33
|
+
* std::chrono::milliseconds T must be some std::chrono::duration type
|
|
34
|
+
*/
|
|
35
|
+
template <typename T>
|
|
36
|
+
class Statistics
|
|
37
|
+
{
|
|
38
|
+
using rep = typename T::rep;
|
|
39
|
+
std::vector<T> samples;
|
|
40
|
+
|
|
41
|
+
public:
|
|
42
|
+
std::string time_suffix;
|
|
43
|
+
|
|
44
|
+
Statistics(std::vector<T> s)
|
|
45
|
+
: samples(s)
|
|
46
|
+
{
|
|
47
|
+
std::sort(std::begin(samples), std::end(samples));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
T percentile(const float p) const
|
|
51
|
+
{
|
|
52
|
+
return percentile(p, samples);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Winsorize the data, sets all entries above 100 - limit percentile and
|
|
56
|
+
// below limit percentile to the value of that percentile
|
|
57
|
+
void winsorize(const float limit)
|
|
58
|
+
{
|
|
59
|
+
winsorize(limit, samples);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
T median() const
|
|
63
|
+
{
|
|
64
|
+
return percentile(50.0, samples);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
T median_abs_dev() const
|
|
68
|
+
{
|
|
69
|
+
const auto m = median();
|
|
70
|
+
std::vector<T> deviations;
|
|
71
|
+
deviations.reserve(samples.size());
|
|
72
|
+
std::transform(std::begin(samples),
|
|
73
|
+
std::end(samples),
|
|
74
|
+
std::back_inserter(deviations),
|
|
75
|
+
[&m](const T& t)
|
|
76
|
+
{ return T { std::abs((t - m).count()) }; });
|
|
77
|
+
std::sort(std::begin(deviations), std::end(deviations));
|
|
78
|
+
return percentile(50.0, deviations);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
T mean() const
|
|
82
|
+
{
|
|
83
|
+
const auto m = std::accumulate(std::begin(samples), std::end(samples), T { 0 });
|
|
84
|
+
return m / samples.size();
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
T std_dev() const
|
|
88
|
+
{
|
|
89
|
+
const auto m = mean();
|
|
90
|
+
auto val = std::accumulate(
|
|
91
|
+
std::begin(samples), std::end(samples), T { 0 }, [&m](const T& p, const T& t)
|
|
92
|
+
{ return T { static_cast<rep>(p.count() + std::pow((t - m).count(), 2)) }; });
|
|
93
|
+
return T { static_cast<rep>(std::sqrt(1.0 / static_cast<double>(samples.size())
|
|
94
|
+
* static_cast<double>(val.count()))) };
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
T min() const
|
|
98
|
+
{
|
|
99
|
+
return samples.front();
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
T max() const
|
|
103
|
+
{
|
|
104
|
+
return samples.back();
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
std::size_t size() const
|
|
108
|
+
{
|
|
109
|
+
return samples.size();
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const T& operator[](size_t i) const
|
|
113
|
+
{
|
|
114
|
+
return samples[i];
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
private:
|
|
118
|
+
// Winsorize the data, sets all entries above 100 - limit percentile and
|
|
119
|
+
// below limit percentile to the value of that percentile
|
|
120
|
+
static void winsorize(const float limit, std::vector<T>& samples)
|
|
121
|
+
{
|
|
122
|
+
const auto low = percentile(limit, samples);
|
|
123
|
+
const auto high = percentile(100.0 - limit, samples);
|
|
124
|
+
for (auto& t : samples)
|
|
125
|
+
{
|
|
126
|
+
if (t < low)
|
|
127
|
+
{
|
|
128
|
+
t = low;
|
|
129
|
+
}
|
|
130
|
+
else if (t > high)
|
|
131
|
+
{
|
|
132
|
+
t = high;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
static T percentile(const float p, const std::vector<T>& samples)
|
|
137
|
+
{
|
|
138
|
+
assert(!samples.empty());
|
|
139
|
+
assert(p <= 100.0);
|
|
140
|
+
assert(p >= 0.0);
|
|
141
|
+
if (samples.size() == 1)
|
|
142
|
+
{
|
|
143
|
+
return samples.front();
|
|
144
|
+
}
|
|
145
|
+
if (p == 100.0)
|
|
146
|
+
{
|
|
147
|
+
return samples.back();
|
|
148
|
+
}
|
|
149
|
+
const double rank = p / 100.0 * (static_cast<double>(samples.size()) - 1.0);
|
|
150
|
+
const double low_r = std::floor(rank);
|
|
151
|
+
const double dist = rank - low_r;
|
|
152
|
+
const size_t k = static_cast<size_t>(low_r);
|
|
153
|
+
const auto low = samples[k];
|
|
154
|
+
const auto high = samples[k + 1];
|
|
155
|
+
return T { static_cast<rep>(low.count() + (high - low).count() * dist) };
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
/* Benchmarking measurment using some desired unit of time measurement,
|
|
160
|
+
* e.g. T = std::chrono::milliseconds. T must be some std::chrono::duration
|
|
161
|
+
*/
|
|
162
|
+
template <typename T>
|
|
163
|
+
class Benchmarker
|
|
164
|
+
{
|
|
165
|
+
const size_t MAX_ITER;
|
|
166
|
+
const T MAX_RUNTIME;
|
|
167
|
+
|
|
168
|
+
template <typename Fn>
|
|
169
|
+
struct BenchWrapper
|
|
170
|
+
{
|
|
171
|
+
Fn fn;
|
|
172
|
+
|
|
173
|
+
BenchWrapper(Fn fn)
|
|
174
|
+
: fn(fn)
|
|
175
|
+
{
|
|
176
|
+
}
|
|
177
|
+
T operator()()
|
|
178
|
+
{
|
|
179
|
+
auto start = std::chrono::high_resolution_clock::now();
|
|
180
|
+
fn();
|
|
181
|
+
auto end = std::chrono::high_resolution_clock::now();
|
|
182
|
+
return std::chrono::duration_cast<T>(end - start);
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
public:
|
|
187
|
+
using stats_type = Statistics<T>;
|
|
188
|
+
|
|
189
|
+
// Benchmark the functions either max_iter times or until max_runtime
|
|
190
|
+
// seconds have elapsed max_runtime should be > 0
|
|
191
|
+
Benchmarker(const size_t max_iter, const std::chrono::seconds max_runtime)
|
|
192
|
+
: MAX_ITER(max_iter)
|
|
193
|
+
, MAX_RUNTIME(std::chrono::duration_cast<T>(max_runtime))
|
|
194
|
+
{
|
|
195
|
+
}
|
|
196
|
+
// Create a benchmarker that will run the function for the desired number of
|
|
197
|
+
// iterations, regardless of how long it takes
|
|
198
|
+
Benchmarker(const size_t max_iter)
|
|
199
|
+
: MAX_ITER(max_iter)
|
|
200
|
+
, MAX_RUNTIME(0)
|
|
201
|
+
{
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
template <typename Fn>
|
|
205
|
+
typename std::enable_if<std::is_void<decltype(std::declval<Fn>()())>::value,
|
|
206
|
+
stats_type>::type
|
|
207
|
+
operator()(Fn fn) const
|
|
208
|
+
{
|
|
209
|
+
return (*this)(BenchWrapper<Fn> { fn });
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
template <typename Fn>
|
|
213
|
+
typename std::enable_if<std::is_same<decltype(std::declval<Fn>()()), T>::value,
|
|
214
|
+
stats_type>::type
|
|
215
|
+
operator()(Fn fn) const
|
|
216
|
+
{
|
|
217
|
+
// Do a single un-timed warm up run
|
|
218
|
+
fn();
|
|
219
|
+
T elapsed { 0 };
|
|
220
|
+
std::vector<T> samples;
|
|
221
|
+
for (size_t i = 0; i < MAX_ITER && (MAX_RUNTIME.count() == 0 || elapsed < MAX_RUNTIME);
|
|
222
|
+
++i, elapsed += samples.back())
|
|
223
|
+
{
|
|
224
|
+
samples.push_back(fn());
|
|
225
|
+
}
|
|
226
|
+
return stats_type { samples };
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
} // namespace pico_bench
|
|
230
|
+
|
|
231
|
+
template <typename T>
|
|
232
|
+
std::ostream&
|
|
233
|
+
operator<<(std::ostream& os, const pico_bench::Statistics<T>& stats)
|
|
234
|
+
{
|
|
235
|
+
os << "Statistics:\n"
|
|
236
|
+
<< "\tmax: " << stats.max().count() << stats.time_suffix << "\n"
|
|
237
|
+
<< "\tmin: " << stats.min().count() << stats.time_suffix << "\n"
|
|
238
|
+
<< "\tmedian: " << stats.median().count() << stats.time_suffix << "\n"
|
|
239
|
+
<< "\tmedian abs dev: " << stats.median_abs_dev().count() << stats.time_suffix << "\n"
|
|
240
|
+
<< "\tmean: " << stats.mean().count() << stats.time_suffix << "\n"
|
|
241
|
+
<< "\tstd dev: " << stats.std_dev().count() << stats.time_suffix << "\n"
|
|
242
|
+
<< "\t# of samples: " << stats.size();
|
|
243
|
+
return os;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
#endif
|