sapor 0.3.3
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.
- checksums.yaml +7 -0
- data/Area Class Diagram.dia +0 -0
- data/Area Class Diagram.png +0 -0
- data/Class Diagram.dia +0 -0
- data/Class Diagram.png +0 -0
- data/Example-Catalonia.md +361 -0
- data/Example-Flanders.md +486 -0
- data/Example-Greece.md +25 -0
- data/Example-Oslo.md +678 -0
- data/Example-UnitedKingdom-Referendum.md +132 -0
- data/Examples.md +15 -0
- data/LICENSE +674 -0
- data/README.md +103 -0
- data/Rakefile +18 -0
- data/Technical Documentation.md +14 -0
- data/bin/create_installation_package.sh +49 -0
- data/bin/install.sh +45 -0
- data/bin/sapor.rb +24 -0
- data/bin/sapor.sh +106 -0
- data/data/hu/hungary-2014.txt +1680 -0
- data/data/hu/hungary_2014_screen_scraper.rb +48 -0
- data/data/hu/hungary_2014_to_psv.rb +80 -0
- data/data/hu/index-2014.txt +106 -0
- data/data/pl/2015-gl-lis-okr.csv +42 -0
- data/data/pl/poland_2015_to_psv.rb +79 -0
- data/data/pl/poland_2015_to_psv_with_ko_and_rsw.rb +94 -0
- data/data/pl/poland_2015_to_psv_with_ko_konf_kp_l_and_zp.rb +100 -0
- data/data/pl/poland_2015_to_psv_with_ko_sld_and_wi.rb +92 -0
- data/data/pl/poland_2015_to_psv_with_sld.rb +84 -0
- data/data/pl/poland_2015_to_psv_with_sld_and_wi.rb +85 -0
- data/data/uk/inject_ukip_2015_as_brexit_2019_in_2017.rb +54 -0
- data/data/uk/united_kingdom_2015.txt +651 -0
- data/data/uk/united_kingdom_2015_to_psv.rb +104 -0
- data/data/uk/united_kingdom_2017.txt +651 -0
- data/data/uk/united_kingdom_2017_to_psv.rb +104 -0
- data/data/uk/united_kingdom_2017_to_psv_with_brexit_and_chuk.rb +113 -0
- data/data/uk/united_kingdom_2017_to_psv_with_tig.rb +111 -0
- data/lib/sapor.rb +150 -0
- data/lib/sapor/binomials_cache.rb +45 -0
- data/lib/sapor/combinations_distribution.rb +222 -0
- data/lib/sapor/denominators.rb +67 -0
- data/lib/sapor/dichotomies.rb +138 -0
- data/lib/sapor/dichotomy.rb +164 -0
- data/lib/sapor/first_past_the_post.rb +82 -0
- data/lib/sapor/largest_remainder.rb +118 -0
- data/lib/sapor/log4r_logger.rb +49 -0
- data/lib/sapor/log_facade.rb +40 -0
- data/lib/sapor/multi_district_leveled_proportional.rb +64 -0
- data/lib/sapor/multi_district_proportional.rb +123 -0
- data/lib/sapor/multi_district_variable_threshold_proportional.rb +128 -0
- data/lib/sapor/number_formatter.rb +45 -0
- data/lib/sapor/options.rb +73 -0
- data/lib/sapor/poll.rb +286 -0
- data/lib/sapor/polychotomy.rb +200 -0
- data/lib/sapor/pseudorandom_multirange_enumerator.rb +87 -0
- data/lib/sapor/referendum_polychotomy.rb +165 -0
- data/lib/sapor/regional_data/area.rb +82 -0
- data/lib/sapor/regional_data/austria.rb +84 -0
- data/lib/sapor/regional_data/belgium-brussels-2014.psv +46 -0
- data/lib/sapor/regional_data/belgium-brussels-20190526.psv +33 -0
- data/lib/sapor/regional_data/belgium-flanders-2014.psv +80 -0
- data/lib/sapor/regional_data/belgium-flanders-20190526.psv +74 -0
- data/lib/sapor/regional_data/belgium-wallonia-2014.psv +114 -0
- data/lib/sapor/regional_data/belgium-wallonia-20190526.psv +93 -0
- data/lib/sapor/regional_data/belgium.rb +97 -0
- data/lib/sapor/regional_data/belgium_brussels.rb +62 -0
- data/lib/sapor/regional_data/belgium_flanders.rb +64 -0
- data/lib/sapor/regional_data/belgium_wallonia.rb +63 -0
- data/lib/sapor/regional_data/catalonia-2012-2015.psv +100 -0
- data/lib/sapor/regional_data/catalonia-2012.psv +87 -0
- data/lib/sapor/regional_data/catalonia-2015-jxcat.psv +68 -0
- data/lib/sapor/regional_data/catalonia-2015-no-jxsi.psv +68 -0
- data/lib/sapor/regional_data/catalonia-2015.psv +63 -0
- data/lib/sapor/regional_data/catalonia-jxcat.rb +109 -0
- data/lib/sapor/regional_data/catalonia-no-jxsi.rb +96 -0
- data/lib/sapor/regional_data/catalonia.rb +96 -0
- data/lib/sapor/regional_data/denmark-20150618-with-e-and-p.psv +164 -0
- data/lib/sapor/regional_data/denmark-20150618-with-e.psv +153 -0
- data/lib/sapor/regional_data/denmark-20150618-with-p.psv +153 -0
- data/lib/sapor/regional_data/denmark-20150618.psv +142 -0
- data/lib/sapor/regional_data/denmark.rb +128 -0
- data/lib/sapor/regional_data/denmark_with_e.rb +128 -0
- data/lib/sapor/regional_data/denmark_with_e_and_p.rb +128 -0
- data/lib/sapor/regional_data/denmark_with_p.rb +128 -0
- data/lib/sapor/regional_data/estonia.rb +88 -0
- data/lib/sapor/regional_data/european-union-great-britain-20140522-brexit-chuk.psv +172 -0
- data/lib/sapor/regional_data/european-union-great-britain-20140522.psv +146 -0
- data/lib/sapor/regional_data/european-union-great-britain-20190523.psv +141 -0
- data/lib/sapor/regional_data/european-union-ireland-2014-ia-ri-sd.psv +64 -0
- data/lib/sapor/regional_data/european-union-ireland-2014-ia-sd.psv +60 -0
- data/lib/sapor/regional_data/european-union-ireland-2014-ia.psv +56 -0
- data/lib/sapor/regional_data/european-union-ireland-2014-sd.psv +56 -0
- data/lib/sapor/regional_data/european-union-ireland-2014.psv +50 -0
- data/lib/sapor/regional_data/european-union-ireland-20190524-ia.psv +58 -0
- data/lib/sapor/regional_data/european-union-ireland-20190524.psv +52 -0
- data/lib/sapor/regional_data/european_union_27_austria.rb +76 -0
- data/lib/sapor/regional_data/european_union_27_croatia.rb +81 -0
- data/lib/sapor/regional_data/european_union_27_denmark.rb +77 -0
- data/lib/sapor/regional_data/european_union_27_estonia.rb +74 -0
- data/lib/sapor/regional_data/european_union_27_finland.rb +74 -0
- data/lib/sapor/regional_data/european_union_27_ireland.rb +96 -0
- data/lib/sapor/regional_data/european_union_27_ireland_with_ia.rb +97 -0
- data/lib/sapor/regional_data/european_union_27_italy.rb +84 -0
- data/lib/sapor/regional_data/european_union_27_netherlands.rb +81 -0
- data/lib/sapor/regional_data/european_union_27_poland.rb +84 -0
- data/lib/sapor/regional_data/european_union_27_romania.rb +78 -0
- data/lib/sapor/regional_data/european_union_27_slovakia.rb +80 -0
- data/lib/sapor/regional_data/european_union_27_spain.rb +82 -0
- data/lib/sapor/regional_data/european_union_27_sweden.rb +76 -0
- data/lib/sapor/regional_data/european_union_austria.rb +76 -0
- data/lib/sapor/regional_data/european_union_bulgaria.rb +81 -0
- data/lib/sapor/regional_data/european_union_croatia.rb +81 -0
- data/lib/sapor/regional_data/european_union_cyprus.rb +72 -0
- data/lib/sapor/regional_data/european_union_czech_republic.rb +82 -0
- data/lib/sapor/regional_data/european_union_denmark.rb +77 -0
- data/lib/sapor/regional_data/european_union_estonia.rb +74 -0
- data/lib/sapor/regional_data/european_union_finland.rb +74 -0
- data/lib/sapor/regional_data/european_union_flanders.rb +74 -0
- data/lib/sapor/regional_data/european_union_france.rb +84 -0
- data/lib/sapor/regional_data/european_union_france_2019.rb +84 -0
- data/lib/sapor/regional_data/european_union_french_community_of_belgium.rb +73 -0
- data/lib/sapor/regional_data/european_union_germany.rb +86 -0
- data/lib/sapor/regional_data/european_union_great_britain.rb +98 -0
- data/lib/sapor/regional_data/european_union_greece.rb +77 -0
- data/lib/sapor/regional_data/european_union_hungary.rb +76 -0
- data/lib/sapor/regional_data/european_union_ireland.rb +96 -0
- data/lib/sapor/regional_data/european_union_ireland_with_ia.rb +97 -0
- data/lib/sapor/regional_data/european_union_italy.rb +84 -0
- data/lib/sapor/regional_data/european_union_latvia.rb +81 -0
- data/lib/sapor/regional_data/european_union_lithuania.rb +80 -0
- data/lib/sapor/regional_data/european_union_luxembourg.rb +75 -0
- data/lib/sapor/regional_data/european_union_malta.rb +71 -0
- data/lib/sapor/regional_data/european_union_netherlands.rb +81 -0
- data/lib/sapor/regional_data/european_union_northern_ireland.rb +75 -0
- data/lib/sapor/regional_data/european_union_poland.rb +84 -0
- data/lib/sapor/regional_data/european_union_portugal.rb +75 -0
- data/lib/sapor/regional_data/european_union_romania.rb +78 -0
- data/lib/sapor/regional_data/european_union_slovakia.rb +81 -0
- data/lib/sapor/regional_data/european_union_slovenia.rb +85 -0
- data/lib/sapor/regional_data/european_union_spain.rb +82 -0
- data/lib/sapor/regional_data/european_union_sweden.rb +76 -0
- data/lib/sapor/regional_data/finland-20150419-with-sin.psv +224 -0
- data/lib/sapor/regional_data/finland-20150419.psv +212 -0
- data/lib/sapor/regional_data/finland.rb +107 -0
- data/lib/sapor/regional_data/finland_with_sin.rb +107 -0
- data/lib/sapor/regional_data/flanders-2014.psv +96 -0
- data/lib/sapor/regional_data/flanders-20190526.psv +87 -0
- data/lib/sapor/regional_data/flanders.rb +115 -0
- data/lib/sapor/regional_data/france.rb +38 -0
- data/lib/sapor/regional_data/greece.rb +92 -0
- data/lib/sapor/regional_data/hungary-2014.psv +2104 -0
- data/lib/sapor/regional_data/hungary.rb +116 -0
- data/lib/sapor/regional_data/iceland-20161029-midflokkurinn.psv +94 -0
- data/lib/sapor/regional_data/iceland-20161029.psv +88 -0
- data/lib/sapor/regional_data/iceland-20171028.psv +85 -0
- data/lib/sapor/regional_data/iceland.rb +133 -0
- data/lib/sapor/regional_data/latvia-20141004-kpv-p-par.psv +109 -0
- data/lib/sapor/regional_data/latvia-20141004-kpv-par.psv +103 -0
- data/lib/sapor/regional_data/latvia-20141004-kpv.psv +97 -0
- data/lib/sapor/regional_data/latvia-20141004.psv +89 -0
- data/lib/sapor/regional_data/latvia.rb +112 -0
- data/lib/sapor/regional_data/latvia_kpv.rb +112 -0
- data/lib/sapor/regional_data/latvia_kpv_p_par.rb +112 -0
- data/lib/sapor/regional_data/latvia_kpv_par.rb +112 -0
- data/lib/sapor/regional_data/luxembourg-20131020.psv +76 -0
- data/lib/sapor/regional_data/luxembourg.rb +82 -0
- data/lib/sapor/regional_data/netherlands.rb +108 -0
- data/lib/sapor/regional_data/norway.rb +425 -0
- data/lib/sapor/regional_data/norwegian_municipality.rb +68 -0
- data/lib/sapor/regional_data/poland-20151025-with-ko-and-l-without-n-po-r-and-zl.psv +321 -0
- data/lib/sapor/regional_data/poland-20151025-with-ko-konf-kp-l-and-zp-without-k-k15-n-pis-po-psl-r-and-zl.psv +280 -0
- data/lib/sapor/regional_data/poland-20151025-with-ko-sld-and-wi-without-n-po-and-zl.psv +403 -0
- data/lib/sapor/regional_data/poland-20151025-with-sld-and-wi-without-zl.psv +444 -0
- data/lib/sapor/regional_data/poland-20151025-with-sld-without-zl.psv +403 -0
- data/lib/sapor/regional_data/poland-20151025.psv +403 -0
- data/lib/sapor/regional_data/poland.rb +125 -0
- data/lib/sapor/regional_data/poland_with_ko_and_l_without_n_po_r_and_zl.rb +122 -0
- data/lib/sapor/regional_data/poland_with_ko_konf_kp_l_and_zp_without_k_k15_n_pis_po_psl_r_and_zl.rb +123 -0
- data/lib/sapor/regional_data/poland_with_ko_sld_and_wi_without_n_po_and_zl.rb +125 -0
- data/lib/sapor/regional_data/poland_with_sld_and_wi_without_zl.rb +126 -0
- data/lib/sapor/regional_data/poland_with_sld_without_zl.rb +126 -0
- data/lib/sapor/regional_data/portugal-20151004-with-a-and-ch-without-paf.psv +438 -0
- data/lib/sapor/regional_data/portugal-20151004-with-a-and-il-without-paf.psv +438 -0
- data/lib/sapor/regional_data/portugal-20151004-with-a-ch-and-il-without-paf.psv +461 -0
- data/lib/sapor/regional_data/portugal-20151004-with-a-without-paf.psv +415 -0
- data/lib/sapor/regional_data/portugal-20151004-with-ch-and-il-without-paf.psv +438 -0
- data/lib/sapor/regional_data/portugal-20151004-without-paf.psv +392 -0
- data/lib/sapor/regional_data/portugal-20151004.psv +370 -0
- data/lib/sapor/regional_data/portugal.rb +101 -0
- data/lib/sapor/regional_data/portugal_with_a_and_ch_without_paf.rb +92 -0
- data/lib/sapor/regional_data/portugal_with_a_and_il_without_paf.rb +92 -0
- data/lib/sapor/regional_data/portugal_with_a_ch_and_il_without_paf.rb +92 -0
- data/lib/sapor/regional_data/portugal_with_a_without_paf.rb +92 -0
- data/lib/sapor/regional_data/portugal_with_ch_and_il_without_paf.rb +92 -0
- data/lib/sapor/regional_data/portugal_without_paf.rb +92 -0
- data/lib/sapor/regional_data/slovakia.rb +81 -0
- data/lib/sapor/regional_data/slovenia.rb +114 -0
- data/lib/sapor/regional_data/spain-20160626.psv +619 -0
- data/lib/sapor/regional_data/spain.rb +136 -0
- data/lib/sapor/regional_data/sweden.rb +92 -0
- data/lib/sapor/regional_data/sweden_20140914.rb +89 -0
- data/lib/sapor/regional_data/united_kingdom-2015.psv +4358 -0
- data/lib/sapor/regional_data/united_kingdom-20170608-brexit-chuk.psv +5154 -0
- data/lib/sapor/regional_data/united_kingdom-20170608-brexit.psv +4521 -0
- data/lib/sapor/regional_data/united_kingdom-20170608-tig.psv +4529 -0
- data/lib/sapor/regional_data/united_kingdom-20170608.psv +3894 -0
- data/lib/sapor/regional_data/united_kingdom.rb +94 -0
- data/lib/sapor/regional_data/united_kingdom_with_brexit.rb +110 -0
- data/lib/sapor/regional_data/united_kingdom_with_brexit_and_chuk.rb +111 -0
- data/lib/sapor/regional_data/united_kingdom_with_tig.rb +111 -0
- data/lib/sapor/regional_data/utopia.rb +66 -0
- data/lib/sapor/regional_data/wallonia-2014.psv +101 -0
- data/lib/sapor/regional_data/wallonia-20190526.psv +88 -0
- data/lib/sapor/regional_data/wallonia.rb +112 -0
- data/lib/sapor/representatives_polychotomy.rb +338 -0
- data/lib/sapor/single_district_proportional.rb +75 -0
- data/sapor.gemspec +35 -0
- data/spec/integration/area_spec.rb +28 -0
- data/spec/integration/poll_spec.rb +112 -0
- data/spec/integration/sample.poll +8 -0
- data/spec/spec_helper.rb +31 -0
- data/spec/unit/area_spec.rb +115 -0
- data/spec/unit/austria_spec.rb +76 -0
- data/spec/unit/belgium_brussels_spec.rb +58 -0
- data/spec/unit/belgium_flanders_spec.rb +62 -0
- data/spec/unit/belgium_spec.rb +26 -0
- data/spec/unit/belgium_wallonia_spec.rb +65 -0
- data/spec/unit/binomials_cache_spec.rb +34 -0
- data/spec/unit/catalonia_spec.rb +74 -0
- data/spec/unit/combinations_distribution_spec.rb +241 -0
- data/spec/unit/denmark_spec.rb +56 -0
- data/spec/unit/denmark_with_e_and_p_spec.rb +58 -0
- data/spec/unit/denmark_with_e_spec.rb +57 -0
- data/spec/unit/denmark_with_p_spec.rb +57 -0
- data/spec/unit/denominators_spec.rb +40 -0
- data/spec/unit/dichotomies_spec.rb +154 -0
- data/spec/unit/dichotomy_spec.rb +320 -0
- data/spec/unit/estonia_spec.rb +65 -0
- data/spec/unit/european_union_27_austria_spec.rb +61 -0
- data/spec/unit/european_union_27_croatia_spec.rb +60 -0
- data/spec/unit/european_union_27_denmark_spec.rb +62 -0
- data/spec/unit/european_union_27_estonia_spec.rb +94 -0
- data/spec/unit/european_union_27_finland_spec.rb +75 -0
- data/spec/unit/european_union_27_ireland_spec.rb +72 -0
- data/spec/unit/european_union_27_ireland_with_ia_spec.rb +74 -0
- data/spec/unit/european_union_27_italy_spec.rb +69 -0
- data/spec/unit/european_union_27_netherlands_spec.rb +81 -0
- data/spec/unit/european_union_27_poland_spec.rb +69 -0
- data/spec/unit/european_union_27_romania_spec.rb +67 -0
- data/spec/unit/european_union_27_slovakia_spec.rb +111 -0
- data/spec/unit/european_union_27_spain_spec.rb +130 -0
- data/spec/unit/european_union_27_sweden_spec.rb +89 -0
- data/spec/unit/european_union_austria_spec.rb +61 -0
- data/spec/unit/european_union_bulgaria_spec.rb +97 -0
- data/spec/unit/european_union_croatia_spec.rb +59 -0
- data/spec/unit/european_union_cyprus_spec.rb +65 -0
- data/spec/unit/european_union_czech_republic_spec.rb +125 -0
- data/spec/unit/european_union_denmark_spec.rb +61 -0
- data/spec/unit/european_union_estonia_spec.rb +93 -0
- data/spec/unit/european_union_finland_spec.rb +75 -0
- data/spec/unit/european_union_flanders_spec.rb +56 -0
- data/spec/unit/european_union_france_2019_spec.rb +73 -0
- data/spec/unit/european_union_france_spec.rb +73 -0
- data/spec/unit/european_union_french_community_of_belgium_spec.rb +61 -0
- data/spec/unit/european_union_germany_spec.rb +90 -0
- data/spec/unit/european_union_great_britain_spec.rb +87 -0
- data/spec/unit/european_union_greece_spec.rb +148 -0
- data/spec/unit/european_union_hungary_spec.rb +57 -0
- data/spec/unit/european_union_ireland_spec.rb +72 -0
- data/spec/unit/european_union_ireland_with_ia_spec.rb +74 -0
- data/spec/unit/european_union_italy_spec.rb +69 -0
- data/spec/unit/european_union_latvia_spec.rb +76 -0
- data/spec/unit/european_union_lithuania_spec.rb +68 -0
- data/spec/unit/european_union_luxembourg_spec.rb +63 -0
- data/spec/unit/european_union_malta_spec.rb +60 -0
- data/spec/unit/european_union_netherlands_spec.rb +81 -0
- data/spec/unit/european_union_northern_ireland_spec.rb +66 -0
- data/spec/unit/european_union_poland_spec.rb +69 -0
- data/spec/unit/european_union_portugal_spec.rb +77 -0
- data/spec/unit/european_union_romania_spec.rb +67 -0
- data/spec/unit/european_union_slovakia_spec.rb +111 -0
- data/spec/unit/european_union_slovenia_spec.rb +77 -0
- data/spec/unit/european_union_spain_spec.rb +129 -0
- data/spec/unit/european_union_sweden_spec.rb +89 -0
- data/spec/unit/finland_spec.rb +65 -0
- data/spec/unit/finland_with_sin_spec.rb +67 -0
- data/spec/unit/first_past_the_post_spec.rb +54 -0
- data/spec/unit/flanders_spec.rb +70 -0
- data/spec/unit/france_spec.rb +32 -0
- data/spec/unit/greece_spec.rb +118 -0
- data/spec/unit/hungary_spec.rb +132 -0
- data/spec/unit/iceland_spec.rb +57 -0
- data/spec/unit/largest_remainder_spec.rb +79 -0
- data/spec/unit/latvia_kpv_p_par_spec.rb +38 -0
- data/spec/unit/latvia_kpv_par_spec.rb +38 -0
- data/spec/unit/latvia_kpv_spec.rb +38 -0
- data/spec/unit/latvia_spec.rb +60 -0
- data/spec/unit/luxembourg_spec.rb +54 -0
- data/spec/unit/multi_district_leveled_proportional_spec.rb +49 -0
- data/spec/unit/multi_district_proportional_spec.rb +81 -0
- data/spec/unit/netherlands_spec.rb +107 -0
- data/spec/unit/norway_spec.rb +64 -0
- data/spec/unit/norwegian_municipality_spec.rb +89 -0
- data/spec/unit/number_formatter_spec.rb +173 -0
- data/spec/unit/poland_spec.rb +62 -0
- data/spec/unit/poland_with_ko_and_l_without_n_po_r_and_zl_spec.rb +60 -0
- data/spec/unit/poland_with_ko_konf_kp_l_and_zp_without_k_k15_n_pis_po_psl_r_and_zl_spec.rb +59 -0
- data/spec/unit/poland_with_ko_sld_and_wi_without_n_po_and_zl_spec.rb +62 -0
- data/spec/unit/poland_with_sld_and_wi_without_zl_spec.rb +63 -0
- data/spec/unit/poland_with_sld_without_zl_spec.rb +62 -0
- data/spec/unit/poll_spec.rb +110 -0
- data/spec/unit/portugal_spec.rb +66 -0
- data/spec/unit/portugal_with_a_and_ch_without_paf_spec.rb +68 -0
- data/spec/unit/portugal_with_a_and_il_without_paf_spec.rb +68 -0
- data/spec/unit/portugal_with_a_ch_and_il_without_paf_spec.rb +69 -0
- data/spec/unit/portugal_with_a_without_paf_spec.rb +67 -0
- data/spec/unit/portugal_with_ch_and_il_without_paf_spec.rb +68 -0
- data/spec/unit/portugal_without_paf_spec.rb +66 -0
- data/spec/unit/pseudorandom_multirange_enumerator_spec.rb +82 -0
- data/spec/unit/referendum_polychotomy_spec.rb +289 -0
- data/spec/unit/representatives_polychotomy_spec.rb +332 -0
- data/spec/unit/slovakia_spec.rb +99 -0
- data/spec/unit/slovenia_spec.rb +80 -0
- data/spec/unit/spain_spec.rb +101 -0
- data/spec/unit/sweden_20140914_spec.rb +112 -0
- data/spec/unit/sweden_spec.rb +113 -0
- data/spec/unit/united_kingdom_spec.rb +65 -0
- data/spec/unit/united_kingdom_with_brexit_and_chuk_spec.rb +67 -0
- data/spec/unit/united_kingdom_with_brexit_spec.rb +66 -0
- data/spec/unit/united_kingdom_with_tig_spec.rb +66 -0
- data/spec/unit/wallonia_spec.rb +70 -0
- metadata +490 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
#
|
|
3
|
+
# Statistical Analysis of Polling Results (SAPoR)
|
|
4
|
+
# Copyright (C) 2016 Filip van Laenen <f.a.vanlaenen@ieee.org>
|
|
5
|
+
#
|
|
6
|
+
# This file is part of SAPoR.
|
|
7
|
+
#
|
|
8
|
+
# SAPoR is free software: you can redistribute it and/or modify it under the
|
|
9
|
+
# terms of the GNU General Public License as published by the Free Software
|
|
10
|
+
# Foundation, either version 3 of the License, or (at your option) any later
|
|
11
|
+
# version.
|
|
12
|
+
#
|
|
13
|
+
# SAPoR is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
14
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
15
|
+
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
16
|
+
#
|
|
17
|
+
# You can find a copy of the GNU General Public License in /doc/gpl.txt
|
|
18
|
+
#
|
|
19
|
+
|
|
20
|
+
require 'spec_helper'
|
|
21
|
+
|
|
22
|
+
describe Sapor::BelgiumBrussels, '#area_code' do
|
|
23
|
+
it 'returns BE[BRU] as the area code' do
|
|
24
|
+
expect(Sapor::BelgiumBrussels.instance.area_code).to eq('BE[BRU]')
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
describe Sapor::BelgiumBrussels, '#no_of_seats' do
|
|
29
|
+
it 'returns 15 as the number of seats' do
|
|
30
|
+
expect(Sapor::BelgiumBrussels.instance.no_of_seats).to eq(15)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
describe Sapor::BelgiumBrussels, '#population_size' do
|
|
35
|
+
it 'returns a population size of 501,459' do
|
|
36
|
+
expect(Sapor::BelgiumBrussels.instance.population_size).to eq(501_459)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
describe Sapor::BelgiumBrussels, '#seats' do
|
|
41
|
+
it 'calculates the number of seats for the election of 2014' do
|
|
42
|
+
belgium_brussels = Sapor::BelgiumBrussels.instance
|
|
43
|
+
results = belgium_brussels.overall_election_results_of_2019
|
|
44
|
+
seats = belgium_brussels.seats(results)
|
|
45
|
+
expect(seats['Ecolo']).to eq(4)
|
|
46
|
+
expect(seats['Parti Socialiste']).to eq(3)
|
|
47
|
+
expect(seats['Mouvement Réformateur']).to eq(3)
|
|
48
|
+
expect(seats['Parti du Travail de Belgique']).to eq(2)
|
|
49
|
+
expect(seats['DéFI']).to eq(2)
|
|
50
|
+
expect(seats['Centre démocrate humaniste']).to eq(1)
|
|
51
|
+
expect(seats['Nieuw-Vlaamse Alliantie']).to eq(0)
|
|
52
|
+
expect(seats['Listes Destexhe']).to eq(0)
|
|
53
|
+
expect(seats['Open Vlaamse Liberalen en Democraten']).to eq(0)
|
|
54
|
+
expect(seats['Parti Populaire']).to eq(0)
|
|
55
|
+
expect(seats['Vlaams Belang']).to eq(0)
|
|
56
|
+
expect(seats['Christen-Democratisch en Vlaams']).to eq(0)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
#
|
|
3
|
+
# Statistical Analysis of Polling Results (SAPoR)
|
|
4
|
+
# Copyright (C) 2016 Filip van Laenen <f.a.vanlaenen@ieee.org>
|
|
5
|
+
#
|
|
6
|
+
# This file is part of SAPoR.
|
|
7
|
+
#
|
|
8
|
+
# SAPoR is free software: you can redistribute it and/or modify it under the
|
|
9
|
+
# terms of the GNU General Public License as published by the Free Software
|
|
10
|
+
# Foundation, either version 3 of the License, or (at your option) any later
|
|
11
|
+
# version.
|
|
12
|
+
#
|
|
13
|
+
# SAPoR is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
14
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
15
|
+
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
16
|
+
#
|
|
17
|
+
# You can find a copy of the GNU General Public License in /doc/gpl.txt
|
|
18
|
+
#
|
|
19
|
+
|
|
20
|
+
require 'spec_helper'
|
|
21
|
+
|
|
22
|
+
describe Sapor::BelgiumFlanders, '#area_code' do
|
|
23
|
+
it 'returns BE[VLG] as the area code' do
|
|
24
|
+
expect(Sapor::BelgiumFlanders.instance.area_code).to eq('BE[VLG]')
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
describe Sapor::BelgiumFlanders, '#no_of_seats' do
|
|
29
|
+
it 'returns 87 as the number of seats' do
|
|
30
|
+
expect(Sapor::BelgiumFlanders.instance.no_of_seats).to eq(87)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
describe Sapor::BelgiumFlanders, '#population_size' do
|
|
35
|
+
it 'returns a population size of 4,206,305' do
|
|
36
|
+
expect(Sapor::BelgiumFlanders.instance.population_size).to eq(4_206_305)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
describe Sapor::BelgiumFlanders, '#seats' do
|
|
41
|
+
it 'calculates the number of seats for the election of 2019' do
|
|
42
|
+
belgium_flanders = Sapor::BelgiumFlanders.instance
|
|
43
|
+
results = belgium_flanders.overall_election_results_of_2019
|
|
44
|
+
seats = belgium_flanders.seats(results)
|
|
45
|
+
expect(seats['Nieuw-Vlaamse Alliantie']).to eq(25)
|
|
46
|
+
expect(seats['Vlaams Belang']).to eq(18)
|
|
47
|
+
expect(seats['Open Vlaamse Liberalen en Democraten']).to eq(12)
|
|
48
|
+
expect(seats['Christen-Democratisch en Vlaams']).to eq(12)
|
|
49
|
+
expect(seats['Socialistische Partij Anders']).to eq(9)
|
|
50
|
+
expect(seats['Groen']).to eq(8)
|
|
51
|
+
expect(seats['Partij van de Arbeid van België']).to eq(3)
|
|
52
|
+
expect(seats['Belgische Unie – Union Belge']).to eq(0)
|
|
53
|
+
expect(seats['de coöperatie']).to eq(0)
|
|
54
|
+
expect(seats['DéFI']).to eq(0)
|
|
55
|
+
expect(seats['Democratisch-Solidair Appèl']).to eq(0)
|
|
56
|
+
expect(seats['DierAnimal']).to eq(0)
|
|
57
|
+
expect(seats['Partij Vrede en Solidariteit']).to eq(0)
|
|
58
|
+
expect(seats['Piratenpartij']).to eq(0)
|
|
59
|
+
expect(seats['PRO']).to eq(0)
|
|
60
|
+
expect(seats['Volt']).to eq(0)
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
#
|
|
3
|
+
# Statistical Analysis of Polling Results (SAPoR)
|
|
4
|
+
# Copyright (C) 2016 Filip van Laenen <f.a.vanlaenen@ieee.org>
|
|
5
|
+
#
|
|
6
|
+
# This file is part of SAPoR.
|
|
7
|
+
#
|
|
8
|
+
# SAPoR is free software: you can redistribute it and/or modify it under the
|
|
9
|
+
# terms of the GNU General Public License as published by the Free Software
|
|
10
|
+
# Foundation, either version 3 of the License, or (at your option) any later
|
|
11
|
+
# version.
|
|
12
|
+
#
|
|
13
|
+
# SAPoR is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
14
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
15
|
+
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
16
|
+
#
|
|
17
|
+
# You can find a copy of the GNU General Public License in /doc/gpl.txt
|
|
18
|
+
#
|
|
19
|
+
|
|
20
|
+
require 'spec_helper'
|
|
21
|
+
|
|
22
|
+
describe Sapor::Belgium, '#threshold' do
|
|
23
|
+
it 'returns a threshold of 5%' do
|
|
24
|
+
expect(Sapor::Belgium.instance.threshold).to eq(0.05)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
#
|
|
3
|
+
# Statistical Analysis of Polling Results (SAPoR)
|
|
4
|
+
# Copyright (C) 2016 Filip van Laenen <f.a.vanlaenen@ieee.org>
|
|
5
|
+
#
|
|
6
|
+
# This file is part of SAPoR.
|
|
7
|
+
#
|
|
8
|
+
# SAPoR is free software: you can redistribute it and/or modify it under the
|
|
9
|
+
# terms of the GNU General Public License as published by the Free Software
|
|
10
|
+
# Foundation, either version 3 of the License, or (at your option) any later
|
|
11
|
+
# version.
|
|
12
|
+
#
|
|
13
|
+
# SAPoR is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
14
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
15
|
+
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
16
|
+
#
|
|
17
|
+
# You can find a copy of the GNU General Public License in /doc/gpl.txt
|
|
18
|
+
#
|
|
19
|
+
|
|
20
|
+
require 'spec_helper'
|
|
21
|
+
|
|
22
|
+
describe Sapor::BelgiumWallonia, '#area_code' do
|
|
23
|
+
it 'returns BE[WAL] as the area code' do
|
|
24
|
+
expect(Sapor::BelgiumWallonia.instance.area_code).to eq('BE[WAL]')
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
describe Sapor::BelgiumWallonia, '#no_of_seats' do
|
|
29
|
+
it 'returns 48 as the number of seats' do
|
|
30
|
+
expect(Sapor::BelgiumWallonia.instance.no_of_seats).to eq(48)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
describe Sapor::BelgiumWallonia, '#population_size' do
|
|
35
|
+
it 'returns a population size of 2,072,774' do
|
|
36
|
+
expect(Sapor::BelgiumWallonia.instance.population_size).to eq(2_072_774)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
describe Sapor::BelgiumWallonia, '#seats' do
|
|
41
|
+
it 'calculates the number of seats for the election of 2019' do
|
|
42
|
+
belgium_wallonia = Sapor::BelgiumWallonia.instance
|
|
43
|
+
results = belgium_wallonia.overall_election_results_of_2019
|
|
44
|
+
seats = belgium_wallonia.seats(results)
|
|
45
|
+
expect(seats['Parti Socialiste']).to eq(17)
|
|
46
|
+
expect(seats['Mouvement Réformateur']).to eq(11)
|
|
47
|
+
expect(seats['Ecolo']).to eq(9)
|
|
48
|
+
expect(seats['Parti du Travail de Belgique']).to eq(7)
|
|
49
|
+
expect(seats['Centre démocrate humaniste']).to eq(4)
|
|
50
|
+
expect(seats['DéFI']).to eq(0)
|
|
51
|
+
expect(seats['AGIR']).to eq(0)
|
|
52
|
+
expect(seats['Collectif Citoyen']).to eq(0)
|
|
53
|
+
expect(seats['DierAnimal']).to eq(0)
|
|
54
|
+
expect(seats['La Droite']).to eq(0)
|
|
55
|
+
expect(seats['Les Belges d’Abord']).to eq(0)
|
|
56
|
+
expect(seats['Listes Destexhe']).to eq(0)
|
|
57
|
+
expect(seats['Lutte Ouvrière']).to eq(0)
|
|
58
|
+
expect(seats['NATION']).to eq(0)
|
|
59
|
+
expect(seats['Parti Communiste de Belgique']).to eq(0)
|
|
60
|
+
expect(seats['Parti Populaire']).to eq(0)
|
|
61
|
+
expect(seats['Turquoise']).to eq(0)
|
|
62
|
+
expect(seats['Vlaams Belang']).to eq(0)
|
|
63
|
+
expect(seats['Wallonie Insoumise']).to eq(0)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
#
|
|
3
|
+
# Statistical Analysis of Polling Results (SAPoR)
|
|
4
|
+
# Copyright (C) 2016 Filip van Laenen <f.a.vanlaenen@ieee.org>
|
|
5
|
+
#
|
|
6
|
+
# This file is part of SAPoR.
|
|
7
|
+
#
|
|
8
|
+
# SAPoR is free software: you can redistribute it and/or modify it under the
|
|
9
|
+
# terms of the GNU General Public License as published by the Free Software
|
|
10
|
+
# Foundation, either version 3 of the License, or (at your option) any later
|
|
11
|
+
# version.
|
|
12
|
+
#
|
|
13
|
+
# SAPoR is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
14
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
15
|
+
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
16
|
+
#
|
|
17
|
+
# You can find a copy of the GNU General Public License in /doc/gpl.txt
|
|
18
|
+
#
|
|
19
|
+
|
|
20
|
+
require 'spec_helper'
|
|
21
|
+
|
|
22
|
+
describe Sapor::BinomialsCache, '#binomial' do
|
|
23
|
+
it 'returns the correct binomial' do
|
|
24
|
+
actual = Sapor::BinomialsCache.binomial(10, 20)
|
|
25
|
+
expected = 10.large_float_binomial_by_product_of_divisions(20)
|
|
26
|
+
expect(actual).to eq(expected)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it 'returns the same binomial when asked a second time' do
|
|
30
|
+
first = Sapor::BinomialsCache.binomial(10, 21)
|
|
31
|
+
second = Sapor::BinomialsCache.binomial(10, 21)
|
|
32
|
+
expect(second).to eq(first)
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
#
|
|
3
|
+
# Statistical Analysis of Polling Results (SAPoR)
|
|
4
|
+
# Copyright (C) 2016 Filip van Laenen <f.a.vanlaenen@ieee.org>
|
|
5
|
+
#
|
|
6
|
+
# This file is part of SAPoR.
|
|
7
|
+
#
|
|
8
|
+
# SAPoR is free software: you can redistribute it and/or modify it under the
|
|
9
|
+
# terms of the GNU General Public License as published by the Free Software
|
|
10
|
+
# Foundation, either version 3 of the License, or (at your option) any later
|
|
11
|
+
# version.
|
|
12
|
+
#
|
|
13
|
+
# SAPoR is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
14
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
15
|
+
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
16
|
+
#
|
|
17
|
+
# You can find a copy of the GNU General Public License in /doc/gpl.txt
|
|
18
|
+
#
|
|
19
|
+
|
|
20
|
+
require 'spec_helper'
|
|
21
|
+
|
|
22
|
+
describe Sapor::Catalonia, '#area_code' do
|
|
23
|
+
it 'returns ES-CT as the area code' do
|
|
24
|
+
expect(Sapor::Catalonia.instance.area_code).to eq('ES-CT')
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
describe Sapor::Catalonia, '#coalitions' do
|
|
29
|
+
it 'returns JS and JS+CUP as the coalitions to track' do
|
|
30
|
+
expect(Sapor::Catalonia.instance.coalitions).to include(['Junts pel Sí'])
|
|
31
|
+
expect(Sapor::Catalonia.instance.coalitions).to \
|
|
32
|
+
include(['Junts pel Sí', 'Candidatura d’Unitat Popular'])
|
|
33
|
+
expect(Sapor::Catalonia.instance.coalitions).to \
|
|
34
|
+
include(['Ciutadans–Partido de la Ciudadanía',
|
|
35
|
+
'Partit dels Socialistes de Catalunya (PSC-PSOE)',
|
|
36
|
+
'Catalunya en Comú', 'Partit Popular'])
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
describe Sapor::Catalonia, '#no_of_seats' do
|
|
41
|
+
it 'returns 135 as the number of seats' do
|
|
42
|
+
expect(Sapor::Catalonia.instance.no_of_seats).to eq(135)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
describe Sapor::Catalonia, '#population_size' do
|
|
47
|
+
it 'returns a population size of 5,510,853' do
|
|
48
|
+
expect(Sapor::Catalonia.instance.population_size).to eq(5_510_853)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
describe Sapor::Catalonia, '#seats' do
|
|
53
|
+
it 'calculates the number of seats for the election of 2015 correctly' do
|
|
54
|
+
catalonia = Sapor::Catalonia.instance
|
|
55
|
+
results = catalonia.overall_election_results_of_2015
|
|
56
|
+
seats = catalonia.seats(results)
|
|
57
|
+
expect(seats['Junts pel Sí']).to eq(62)
|
|
58
|
+
expect(seats['Ciutadans–Partido de la Ciudadanía']).to eq(25)
|
|
59
|
+
expect(seats['Partit dels Socialistes de Catalunya (PSC-PSOE)']).to eq(16)
|
|
60
|
+
expect(seats['Catalunya en Comú']).to eq(11)
|
|
61
|
+
expect(seats['Partit Popular']).to eq(11)
|
|
62
|
+
expect(seats['Candidatura d’Unitat Popular']).to eq(10)
|
|
63
|
+
expect(seats['Unió Democràtica de Catalunya']).to eq(0)
|
|
64
|
+
expect(seats['Partit Animalista contra el Maltractament Animal']).to eq(0)
|
|
65
|
+
expect(seats['Pirates de Catalunya–Per decidir-ho tot']).to eq(0)
|
|
66
|
+
expect(seats['Guanyem Catalunya']).to eq(0)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
describe Sapor::Catalonia, '#threshold' do
|
|
71
|
+
it 'returns a threshold of 3%' do
|
|
72
|
+
expect(Sapor::Catalonia.instance.threshold).to eq(0.03)
|
|
73
|
+
end
|
|
74
|
+
end
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
#
|
|
3
|
+
# Statistical Analysis of Polling Results (SAPoR)
|
|
4
|
+
# Copyright (C) 2016 Filip van Laenen <f.a.vanlaenen@ieee.org>
|
|
5
|
+
#
|
|
6
|
+
# This file is part of SAPoR.
|
|
7
|
+
#
|
|
8
|
+
# SAPoR is free software: you can redistribute it and/or modify it under the
|
|
9
|
+
# terms of the GNU General Public License as published by the Free Software
|
|
10
|
+
# Foundation, either version 3 of the License, or (at your option) any later
|
|
11
|
+
# version.
|
|
12
|
+
#
|
|
13
|
+
# SAPoR is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
14
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
15
|
+
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
16
|
+
#
|
|
17
|
+
# You can find a copy of the GNU General Public License in /doc/gpl.txt
|
|
18
|
+
#
|
|
19
|
+
|
|
20
|
+
require 'spec_helper'
|
|
21
|
+
|
|
22
|
+
describe Sapor::CombinationsDistribution, '#new' do
|
|
23
|
+
it 'creates an empty distribution' do
|
|
24
|
+
distribution = Sapor::CombinationsDistribution.new
|
|
25
|
+
expect(distribution).to be_empty
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
describe Sapor::CombinationsDistribution, '#[]=' do
|
|
30
|
+
it 'sets a value-combinations pair' do
|
|
31
|
+
distribution = Sapor::CombinationsDistribution.new
|
|
32
|
+
distribution[1] = 2
|
|
33
|
+
expect(distribution[1]).to eq(2)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
describe Sapor::CombinationsDistribution, '#+' do
|
|
38
|
+
it 'adds two combiation distributions together' do
|
|
39
|
+
a = Sapor::CombinationsDistribution.new
|
|
40
|
+
a[10] = 2
|
|
41
|
+
a[21] = 3
|
|
42
|
+
a[23] = 11
|
|
43
|
+
b = Sapor::CombinationsDistribution.new
|
|
44
|
+
b[10] = 5
|
|
45
|
+
b[21] = 7
|
|
46
|
+
b[29] = 13
|
|
47
|
+
sum = Sapor::CombinationsDistribution.new
|
|
48
|
+
sum[10] = 7
|
|
49
|
+
sum[21] = 10
|
|
50
|
+
sum[23] = 11
|
|
51
|
+
sum[29] = 13
|
|
52
|
+
expect((a + b)[10]).to eq(sum[10])
|
|
53
|
+
expect((a + b)[21]).to eq(sum[21])
|
|
54
|
+
expect((a + b)[23]).to eq(sum[23])
|
|
55
|
+
expect((a + b)[29]).to eq(sum[29])
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
describe Sapor::CombinationsDistribution, '#confidence_interval' do
|
|
60
|
+
it 'returns the single value as boundaries (default)' do
|
|
61
|
+
distribution = Sapor::CombinationsDistribution.new
|
|
62
|
+
distribution[5] = 2
|
|
63
|
+
expect(distribution.confidence_interval(0.95)).to eq([5, 5])
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it 'returns the full interval as boundaries if single value (extensive)' do
|
|
67
|
+
distribution = Sapor::CombinationsDistribution.new
|
|
68
|
+
distribution[5] = 2
|
|
69
|
+
expect(distribution.confidence_interval(0.95, 10)).to eq([0, 10])
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
it 'returns the boundaries (default)' do
|
|
73
|
+
distribution = Sapor::CombinationsDistribution.new
|
|
74
|
+
distribution[3] = 2
|
|
75
|
+
distribution[7] = 2
|
|
76
|
+
expect(distribution.confidence_interval(0.95)).to eq([3, 7])
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
it 'returns the full interval as boundaries (extensive)' do
|
|
80
|
+
distribution = Sapor::CombinationsDistribution.new
|
|
81
|
+
distribution[3] = 2
|
|
82
|
+
distribution[7] = 2
|
|
83
|
+
expect(distribution.confidence_interval(0.95, 10)).to eq([0, 10])
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
it 'returns the full interval if level too high' do
|
|
87
|
+
distribution = Sapor::CombinationsDistribution.new
|
|
88
|
+
distribution[5] = 1
|
|
89
|
+
distribution[10] = 98
|
|
90
|
+
distribution[15] = 1
|
|
91
|
+
expect(distribution.confidence_interval(0.99)).to eq([5, 15])
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
it 'returns the values in between as boundaries (even)' do
|
|
95
|
+
distribution = Sapor::CombinationsDistribution.new
|
|
96
|
+
distribution[5] = 1
|
|
97
|
+
distribution[10] = 98
|
|
98
|
+
distribution[15] = 1
|
|
99
|
+
expect(distribution.confidence_interval(0.95)).to eq([8, 12])
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
it 'returns the values in between as boundaries (odd)' do
|
|
103
|
+
distribution = Sapor::CombinationsDistribution.new
|
|
104
|
+
distribution[6] = 1.to_lf
|
|
105
|
+
distribution[10] = 98.to_lf
|
|
106
|
+
distribution[14] = 1.to_lf
|
|
107
|
+
expect(distribution.confidence_interval(0.95)).to eq([8, 12])
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
describe Sapor::CombinationsDistribution, '#confidence_interval_values' do
|
|
112
|
+
it 'extracts the single value as confidence interval value' do
|
|
113
|
+
distribution = Sapor::CombinationsDistribution.new
|
|
114
|
+
distribution[5] = 2.to_lf
|
|
115
|
+
expect(distribution.confidence_interval_values(0.95)).to eq([5])
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
it 'extracts all values as confidence intervalue values' do
|
|
119
|
+
distribution = Sapor::CombinationsDistribution.new
|
|
120
|
+
distribution[3] = 2.to_lf
|
|
121
|
+
distribution[7] = 2.to_lf
|
|
122
|
+
expect(distribution.confidence_interval_values(0.95).sort).to eq([3, 7])
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
it 'extracts the middle values as confidence interval values' do
|
|
126
|
+
distribution = Sapor::CombinationsDistribution.new
|
|
127
|
+
distribution[5] = 1.to_lf
|
|
128
|
+
distribution[10] = 98.to_lf
|
|
129
|
+
distribution[15] = 1.to_lf
|
|
130
|
+
expect(distribution.confidence_interval_values(0.95)).to eq([10])
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
describe Sapor::CombinationsDistribution, '#empty?' do
|
|
135
|
+
it 'returns true if no value-combinations pair has been added' do
|
|
136
|
+
distribution = Sapor::CombinationsDistribution.new
|
|
137
|
+
expect(distribution.empty?).to be true
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
it 'returns false if a value-combinations pair has been added' do
|
|
141
|
+
distribution = Sapor::CombinationsDistribution.new
|
|
142
|
+
distribution[1] = 2.to_lf
|
|
143
|
+
expect(distribution.empty?).to be false
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
describe Sapor::CombinationsDistribution, '#most_probable_rounded_fraction' do
|
|
148
|
+
it "returns the median rounded fraction if there's more than one with" \
|
|
149
|
+
' maximal probability' do
|
|
150
|
+
distribution = Sapor::CombinationsDistribution.new
|
|
151
|
+
distribution[500] = 2.to_lf
|
|
152
|
+
expect(distribution.most_probable_rounded_fraction(1000)).to eq(0.5)
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
it 'returns the rounded fraction with the maximal probability' do
|
|
156
|
+
distribution = Sapor::CombinationsDistribution.new
|
|
157
|
+
distribution[199] = 2.to_lf
|
|
158
|
+
distribution[200] = 3.to_lf
|
|
159
|
+
distribution[201] = 2.to_lf
|
|
160
|
+
expect(distribution.most_probable_rounded_fraction(1000)).to eq(0.2)
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
describe Sapor::CombinationsDistribution, '#most_probable_value' do
|
|
165
|
+
it "returns the single value if there's only one value" do
|
|
166
|
+
distribution = Sapor::CombinationsDistribution.new
|
|
167
|
+
distribution[1] = 2
|
|
168
|
+
expect(distribution.most_probable_value).to eq(1)
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
it 'returns the first of two values if that has the greatest number ' \
|
|
172
|
+
'of combinations' do
|
|
173
|
+
distribution = Sapor::CombinationsDistribution.new
|
|
174
|
+
distribution[1] = 2
|
|
175
|
+
distribution[2] = 1
|
|
176
|
+
expect(distribution.most_probable_value).to eq(1)
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
it 'returns the second of two values if that has the greatest number ' \
|
|
180
|
+
'of combinations' do
|
|
181
|
+
distribution = Sapor::CombinationsDistribution.new
|
|
182
|
+
distribution[1] = 1
|
|
183
|
+
distribution[2] = 2
|
|
184
|
+
expect(distribution.most_probable_value).to eq(2)
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
describe Sapor::CombinationsDistribution, '#size' do
|
|
189
|
+
it 'returns 0 for an empty distribution' do
|
|
190
|
+
distribution = Sapor::CombinationsDistribution.new
|
|
191
|
+
expect(distribution.size).to eq(0)
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
it 'returns 1 when a value-combinations pair has been added' do
|
|
195
|
+
distribution = Sapor::CombinationsDistribution.new
|
|
196
|
+
distribution[1] = 2
|
|
197
|
+
expect(distribution.size).to eq(1)
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
describe Sapor::CombinationsDistribution, '#threshold_probability' do
|
|
202
|
+
it 'returns 1 if the single value is above the threshold' do
|
|
203
|
+
distribution = Sapor::CombinationsDistribution.new
|
|
204
|
+
distribution[5] = 2.to_lf
|
|
205
|
+
expect(distribution.threshold_probability(0.1, 10)).to eq(1)
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
it 'returns 0 if the single value is below the threshold' do
|
|
209
|
+
distribution = Sapor::CombinationsDistribution.new
|
|
210
|
+
distribution[5] = 2.to_lf
|
|
211
|
+
expect(distribution.threshold_probability(0.6, 10)).to eq(0)
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
it 'returns 0.8 if the threshold is between combinations 2 and 8' do
|
|
215
|
+
distribution = Sapor::CombinationsDistribution.new
|
|
216
|
+
distribution[2] = 2.to_lf
|
|
217
|
+
distribution[7] = 8.to_lf
|
|
218
|
+
expect(distribution.threshold_probability(0.5, 10)).to eq(0.8)
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
it 'includes the probability at the threshold' do
|
|
222
|
+
distribution = Sapor::CombinationsDistribution.new
|
|
223
|
+
distribution[2] = 2.to_lf
|
|
224
|
+
distribution[5] = 5.to_lf
|
|
225
|
+
distribution[7] = 3.to_lf
|
|
226
|
+
expect(distribution.threshold_probability(0.5, 10)).to eq(0.8)
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
describe Sapor::CombinationsDistribution, '#values' do
|
|
231
|
+
it 'returns an empty array for an empty distribution' do
|
|
232
|
+
distribution = Sapor::CombinationsDistribution.new
|
|
233
|
+
expect(distribution.values).to eq([])
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
it 'returns 1 when a value-combinations pair has been added' do
|
|
237
|
+
distribution = Sapor::CombinationsDistribution.new
|
|
238
|
+
distribution[1] = 2
|
|
239
|
+
expect(distribution.values).to eq([1])
|
|
240
|
+
end
|
|
241
|
+
end
|