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.
Files changed (332) hide show
  1. checksums.yaml +7 -0
  2. data/Area Class Diagram.dia +0 -0
  3. data/Area Class Diagram.png +0 -0
  4. data/Class Diagram.dia +0 -0
  5. data/Class Diagram.png +0 -0
  6. data/Example-Catalonia.md +361 -0
  7. data/Example-Flanders.md +486 -0
  8. data/Example-Greece.md +25 -0
  9. data/Example-Oslo.md +678 -0
  10. data/Example-UnitedKingdom-Referendum.md +132 -0
  11. data/Examples.md +15 -0
  12. data/LICENSE +674 -0
  13. data/README.md +103 -0
  14. data/Rakefile +18 -0
  15. data/Technical Documentation.md +14 -0
  16. data/bin/create_installation_package.sh +49 -0
  17. data/bin/install.sh +45 -0
  18. data/bin/sapor.rb +24 -0
  19. data/bin/sapor.sh +106 -0
  20. data/data/hu/hungary-2014.txt +1680 -0
  21. data/data/hu/hungary_2014_screen_scraper.rb +48 -0
  22. data/data/hu/hungary_2014_to_psv.rb +80 -0
  23. data/data/hu/index-2014.txt +106 -0
  24. data/data/pl/2015-gl-lis-okr.csv +42 -0
  25. data/data/pl/poland_2015_to_psv.rb +79 -0
  26. data/data/pl/poland_2015_to_psv_with_ko_and_rsw.rb +94 -0
  27. data/data/pl/poland_2015_to_psv_with_ko_konf_kp_l_and_zp.rb +100 -0
  28. data/data/pl/poland_2015_to_psv_with_ko_sld_and_wi.rb +92 -0
  29. data/data/pl/poland_2015_to_psv_with_sld.rb +84 -0
  30. data/data/pl/poland_2015_to_psv_with_sld_and_wi.rb +85 -0
  31. data/data/uk/inject_ukip_2015_as_brexit_2019_in_2017.rb +54 -0
  32. data/data/uk/united_kingdom_2015.txt +651 -0
  33. data/data/uk/united_kingdom_2015_to_psv.rb +104 -0
  34. data/data/uk/united_kingdom_2017.txt +651 -0
  35. data/data/uk/united_kingdom_2017_to_psv.rb +104 -0
  36. data/data/uk/united_kingdom_2017_to_psv_with_brexit_and_chuk.rb +113 -0
  37. data/data/uk/united_kingdom_2017_to_psv_with_tig.rb +111 -0
  38. data/lib/sapor.rb +150 -0
  39. data/lib/sapor/binomials_cache.rb +45 -0
  40. data/lib/sapor/combinations_distribution.rb +222 -0
  41. data/lib/sapor/denominators.rb +67 -0
  42. data/lib/sapor/dichotomies.rb +138 -0
  43. data/lib/sapor/dichotomy.rb +164 -0
  44. data/lib/sapor/first_past_the_post.rb +82 -0
  45. data/lib/sapor/largest_remainder.rb +118 -0
  46. data/lib/sapor/log4r_logger.rb +49 -0
  47. data/lib/sapor/log_facade.rb +40 -0
  48. data/lib/sapor/multi_district_leveled_proportional.rb +64 -0
  49. data/lib/sapor/multi_district_proportional.rb +123 -0
  50. data/lib/sapor/multi_district_variable_threshold_proportional.rb +128 -0
  51. data/lib/sapor/number_formatter.rb +45 -0
  52. data/lib/sapor/options.rb +73 -0
  53. data/lib/sapor/poll.rb +286 -0
  54. data/lib/sapor/polychotomy.rb +200 -0
  55. data/lib/sapor/pseudorandom_multirange_enumerator.rb +87 -0
  56. data/lib/sapor/referendum_polychotomy.rb +165 -0
  57. data/lib/sapor/regional_data/area.rb +82 -0
  58. data/lib/sapor/regional_data/austria.rb +84 -0
  59. data/lib/sapor/regional_data/belgium-brussels-2014.psv +46 -0
  60. data/lib/sapor/regional_data/belgium-brussels-20190526.psv +33 -0
  61. data/lib/sapor/regional_data/belgium-flanders-2014.psv +80 -0
  62. data/lib/sapor/regional_data/belgium-flanders-20190526.psv +74 -0
  63. data/lib/sapor/regional_data/belgium-wallonia-2014.psv +114 -0
  64. data/lib/sapor/regional_data/belgium-wallonia-20190526.psv +93 -0
  65. data/lib/sapor/regional_data/belgium.rb +97 -0
  66. data/lib/sapor/regional_data/belgium_brussels.rb +62 -0
  67. data/lib/sapor/regional_data/belgium_flanders.rb +64 -0
  68. data/lib/sapor/regional_data/belgium_wallonia.rb +63 -0
  69. data/lib/sapor/regional_data/catalonia-2012-2015.psv +100 -0
  70. data/lib/sapor/regional_data/catalonia-2012.psv +87 -0
  71. data/lib/sapor/regional_data/catalonia-2015-jxcat.psv +68 -0
  72. data/lib/sapor/regional_data/catalonia-2015-no-jxsi.psv +68 -0
  73. data/lib/sapor/regional_data/catalonia-2015.psv +63 -0
  74. data/lib/sapor/regional_data/catalonia-jxcat.rb +109 -0
  75. data/lib/sapor/regional_data/catalonia-no-jxsi.rb +96 -0
  76. data/lib/sapor/regional_data/catalonia.rb +96 -0
  77. data/lib/sapor/regional_data/denmark-20150618-with-e-and-p.psv +164 -0
  78. data/lib/sapor/regional_data/denmark-20150618-with-e.psv +153 -0
  79. data/lib/sapor/regional_data/denmark-20150618-with-p.psv +153 -0
  80. data/lib/sapor/regional_data/denmark-20150618.psv +142 -0
  81. data/lib/sapor/regional_data/denmark.rb +128 -0
  82. data/lib/sapor/regional_data/denmark_with_e.rb +128 -0
  83. data/lib/sapor/regional_data/denmark_with_e_and_p.rb +128 -0
  84. data/lib/sapor/regional_data/denmark_with_p.rb +128 -0
  85. data/lib/sapor/regional_data/estonia.rb +88 -0
  86. data/lib/sapor/regional_data/european-union-great-britain-20140522-brexit-chuk.psv +172 -0
  87. data/lib/sapor/regional_data/european-union-great-britain-20140522.psv +146 -0
  88. data/lib/sapor/regional_data/european-union-great-britain-20190523.psv +141 -0
  89. data/lib/sapor/regional_data/european-union-ireland-2014-ia-ri-sd.psv +64 -0
  90. data/lib/sapor/regional_data/european-union-ireland-2014-ia-sd.psv +60 -0
  91. data/lib/sapor/regional_data/european-union-ireland-2014-ia.psv +56 -0
  92. data/lib/sapor/regional_data/european-union-ireland-2014-sd.psv +56 -0
  93. data/lib/sapor/regional_data/european-union-ireland-2014.psv +50 -0
  94. data/lib/sapor/regional_data/european-union-ireland-20190524-ia.psv +58 -0
  95. data/lib/sapor/regional_data/european-union-ireland-20190524.psv +52 -0
  96. data/lib/sapor/regional_data/european_union_27_austria.rb +76 -0
  97. data/lib/sapor/regional_data/european_union_27_croatia.rb +81 -0
  98. data/lib/sapor/regional_data/european_union_27_denmark.rb +77 -0
  99. data/lib/sapor/regional_data/european_union_27_estonia.rb +74 -0
  100. data/lib/sapor/regional_data/european_union_27_finland.rb +74 -0
  101. data/lib/sapor/regional_data/european_union_27_ireland.rb +96 -0
  102. data/lib/sapor/regional_data/european_union_27_ireland_with_ia.rb +97 -0
  103. data/lib/sapor/regional_data/european_union_27_italy.rb +84 -0
  104. data/lib/sapor/regional_data/european_union_27_netherlands.rb +81 -0
  105. data/lib/sapor/regional_data/european_union_27_poland.rb +84 -0
  106. data/lib/sapor/regional_data/european_union_27_romania.rb +78 -0
  107. data/lib/sapor/regional_data/european_union_27_slovakia.rb +80 -0
  108. data/lib/sapor/regional_data/european_union_27_spain.rb +82 -0
  109. data/lib/sapor/regional_data/european_union_27_sweden.rb +76 -0
  110. data/lib/sapor/regional_data/european_union_austria.rb +76 -0
  111. data/lib/sapor/regional_data/european_union_bulgaria.rb +81 -0
  112. data/lib/sapor/regional_data/european_union_croatia.rb +81 -0
  113. data/lib/sapor/regional_data/european_union_cyprus.rb +72 -0
  114. data/lib/sapor/regional_data/european_union_czech_republic.rb +82 -0
  115. data/lib/sapor/regional_data/european_union_denmark.rb +77 -0
  116. data/lib/sapor/regional_data/european_union_estonia.rb +74 -0
  117. data/lib/sapor/regional_data/european_union_finland.rb +74 -0
  118. data/lib/sapor/regional_data/european_union_flanders.rb +74 -0
  119. data/lib/sapor/regional_data/european_union_france.rb +84 -0
  120. data/lib/sapor/regional_data/european_union_france_2019.rb +84 -0
  121. data/lib/sapor/regional_data/european_union_french_community_of_belgium.rb +73 -0
  122. data/lib/sapor/regional_data/european_union_germany.rb +86 -0
  123. data/lib/sapor/regional_data/european_union_great_britain.rb +98 -0
  124. data/lib/sapor/regional_data/european_union_greece.rb +77 -0
  125. data/lib/sapor/regional_data/european_union_hungary.rb +76 -0
  126. data/lib/sapor/regional_data/european_union_ireland.rb +96 -0
  127. data/lib/sapor/regional_data/european_union_ireland_with_ia.rb +97 -0
  128. data/lib/sapor/regional_data/european_union_italy.rb +84 -0
  129. data/lib/sapor/regional_data/european_union_latvia.rb +81 -0
  130. data/lib/sapor/regional_data/european_union_lithuania.rb +80 -0
  131. data/lib/sapor/regional_data/european_union_luxembourg.rb +75 -0
  132. data/lib/sapor/regional_data/european_union_malta.rb +71 -0
  133. data/lib/sapor/regional_data/european_union_netherlands.rb +81 -0
  134. data/lib/sapor/regional_data/european_union_northern_ireland.rb +75 -0
  135. data/lib/sapor/regional_data/european_union_poland.rb +84 -0
  136. data/lib/sapor/regional_data/european_union_portugal.rb +75 -0
  137. data/lib/sapor/regional_data/european_union_romania.rb +78 -0
  138. data/lib/sapor/regional_data/european_union_slovakia.rb +81 -0
  139. data/lib/sapor/regional_data/european_union_slovenia.rb +85 -0
  140. data/lib/sapor/regional_data/european_union_spain.rb +82 -0
  141. data/lib/sapor/regional_data/european_union_sweden.rb +76 -0
  142. data/lib/sapor/regional_data/finland-20150419-with-sin.psv +224 -0
  143. data/lib/sapor/regional_data/finland-20150419.psv +212 -0
  144. data/lib/sapor/regional_data/finland.rb +107 -0
  145. data/lib/sapor/regional_data/finland_with_sin.rb +107 -0
  146. data/lib/sapor/regional_data/flanders-2014.psv +96 -0
  147. data/lib/sapor/regional_data/flanders-20190526.psv +87 -0
  148. data/lib/sapor/regional_data/flanders.rb +115 -0
  149. data/lib/sapor/regional_data/france.rb +38 -0
  150. data/lib/sapor/regional_data/greece.rb +92 -0
  151. data/lib/sapor/regional_data/hungary-2014.psv +2104 -0
  152. data/lib/sapor/regional_data/hungary.rb +116 -0
  153. data/lib/sapor/regional_data/iceland-20161029-midflokkurinn.psv +94 -0
  154. data/lib/sapor/regional_data/iceland-20161029.psv +88 -0
  155. data/lib/sapor/regional_data/iceland-20171028.psv +85 -0
  156. data/lib/sapor/regional_data/iceland.rb +133 -0
  157. data/lib/sapor/regional_data/latvia-20141004-kpv-p-par.psv +109 -0
  158. data/lib/sapor/regional_data/latvia-20141004-kpv-par.psv +103 -0
  159. data/lib/sapor/regional_data/latvia-20141004-kpv.psv +97 -0
  160. data/lib/sapor/regional_data/latvia-20141004.psv +89 -0
  161. data/lib/sapor/regional_data/latvia.rb +112 -0
  162. data/lib/sapor/regional_data/latvia_kpv.rb +112 -0
  163. data/lib/sapor/regional_data/latvia_kpv_p_par.rb +112 -0
  164. data/lib/sapor/regional_data/latvia_kpv_par.rb +112 -0
  165. data/lib/sapor/regional_data/luxembourg-20131020.psv +76 -0
  166. data/lib/sapor/regional_data/luxembourg.rb +82 -0
  167. data/lib/sapor/regional_data/netherlands.rb +108 -0
  168. data/lib/sapor/regional_data/norway.rb +425 -0
  169. data/lib/sapor/regional_data/norwegian_municipality.rb +68 -0
  170. data/lib/sapor/regional_data/poland-20151025-with-ko-and-l-without-n-po-r-and-zl.psv +321 -0
  171. 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
  172. data/lib/sapor/regional_data/poland-20151025-with-ko-sld-and-wi-without-n-po-and-zl.psv +403 -0
  173. data/lib/sapor/regional_data/poland-20151025-with-sld-and-wi-without-zl.psv +444 -0
  174. data/lib/sapor/regional_data/poland-20151025-with-sld-without-zl.psv +403 -0
  175. data/lib/sapor/regional_data/poland-20151025.psv +403 -0
  176. data/lib/sapor/regional_data/poland.rb +125 -0
  177. data/lib/sapor/regional_data/poland_with_ko_and_l_without_n_po_r_and_zl.rb +122 -0
  178. 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
  179. data/lib/sapor/regional_data/poland_with_ko_sld_and_wi_without_n_po_and_zl.rb +125 -0
  180. data/lib/sapor/regional_data/poland_with_sld_and_wi_without_zl.rb +126 -0
  181. data/lib/sapor/regional_data/poland_with_sld_without_zl.rb +126 -0
  182. data/lib/sapor/regional_data/portugal-20151004-with-a-and-ch-without-paf.psv +438 -0
  183. data/lib/sapor/regional_data/portugal-20151004-with-a-and-il-without-paf.psv +438 -0
  184. data/lib/sapor/regional_data/portugal-20151004-with-a-ch-and-il-without-paf.psv +461 -0
  185. data/lib/sapor/regional_data/portugal-20151004-with-a-without-paf.psv +415 -0
  186. data/lib/sapor/regional_data/portugal-20151004-with-ch-and-il-without-paf.psv +438 -0
  187. data/lib/sapor/regional_data/portugal-20151004-without-paf.psv +392 -0
  188. data/lib/sapor/regional_data/portugal-20151004.psv +370 -0
  189. data/lib/sapor/regional_data/portugal.rb +101 -0
  190. data/lib/sapor/regional_data/portugal_with_a_and_ch_without_paf.rb +92 -0
  191. data/lib/sapor/regional_data/portugal_with_a_and_il_without_paf.rb +92 -0
  192. data/lib/sapor/regional_data/portugal_with_a_ch_and_il_without_paf.rb +92 -0
  193. data/lib/sapor/regional_data/portugal_with_a_without_paf.rb +92 -0
  194. data/lib/sapor/regional_data/portugal_with_ch_and_il_without_paf.rb +92 -0
  195. data/lib/sapor/regional_data/portugal_without_paf.rb +92 -0
  196. data/lib/sapor/regional_data/slovakia.rb +81 -0
  197. data/lib/sapor/regional_data/slovenia.rb +114 -0
  198. data/lib/sapor/regional_data/spain-20160626.psv +619 -0
  199. data/lib/sapor/regional_data/spain.rb +136 -0
  200. data/lib/sapor/regional_data/sweden.rb +92 -0
  201. data/lib/sapor/regional_data/sweden_20140914.rb +89 -0
  202. data/lib/sapor/regional_data/united_kingdom-2015.psv +4358 -0
  203. data/lib/sapor/regional_data/united_kingdom-20170608-brexit-chuk.psv +5154 -0
  204. data/lib/sapor/regional_data/united_kingdom-20170608-brexit.psv +4521 -0
  205. data/lib/sapor/regional_data/united_kingdom-20170608-tig.psv +4529 -0
  206. data/lib/sapor/regional_data/united_kingdom-20170608.psv +3894 -0
  207. data/lib/sapor/regional_data/united_kingdom.rb +94 -0
  208. data/lib/sapor/regional_data/united_kingdom_with_brexit.rb +110 -0
  209. data/lib/sapor/regional_data/united_kingdom_with_brexit_and_chuk.rb +111 -0
  210. data/lib/sapor/regional_data/united_kingdom_with_tig.rb +111 -0
  211. data/lib/sapor/regional_data/utopia.rb +66 -0
  212. data/lib/sapor/regional_data/wallonia-2014.psv +101 -0
  213. data/lib/sapor/regional_data/wallonia-20190526.psv +88 -0
  214. data/lib/sapor/regional_data/wallonia.rb +112 -0
  215. data/lib/sapor/representatives_polychotomy.rb +338 -0
  216. data/lib/sapor/single_district_proportional.rb +75 -0
  217. data/sapor.gemspec +35 -0
  218. data/spec/integration/area_spec.rb +28 -0
  219. data/spec/integration/poll_spec.rb +112 -0
  220. data/spec/integration/sample.poll +8 -0
  221. data/spec/spec_helper.rb +31 -0
  222. data/spec/unit/area_spec.rb +115 -0
  223. data/spec/unit/austria_spec.rb +76 -0
  224. data/spec/unit/belgium_brussels_spec.rb +58 -0
  225. data/spec/unit/belgium_flanders_spec.rb +62 -0
  226. data/spec/unit/belgium_spec.rb +26 -0
  227. data/spec/unit/belgium_wallonia_spec.rb +65 -0
  228. data/spec/unit/binomials_cache_spec.rb +34 -0
  229. data/spec/unit/catalonia_spec.rb +74 -0
  230. data/spec/unit/combinations_distribution_spec.rb +241 -0
  231. data/spec/unit/denmark_spec.rb +56 -0
  232. data/spec/unit/denmark_with_e_and_p_spec.rb +58 -0
  233. data/spec/unit/denmark_with_e_spec.rb +57 -0
  234. data/spec/unit/denmark_with_p_spec.rb +57 -0
  235. data/spec/unit/denominators_spec.rb +40 -0
  236. data/spec/unit/dichotomies_spec.rb +154 -0
  237. data/spec/unit/dichotomy_spec.rb +320 -0
  238. data/spec/unit/estonia_spec.rb +65 -0
  239. data/spec/unit/european_union_27_austria_spec.rb +61 -0
  240. data/spec/unit/european_union_27_croatia_spec.rb +60 -0
  241. data/spec/unit/european_union_27_denmark_spec.rb +62 -0
  242. data/spec/unit/european_union_27_estonia_spec.rb +94 -0
  243. data/spec/unit/european_union_27_finland_spec.rb +75 -0
  244. data/spec/unit/european_union_27_ireland_spec.rb +72 -0
  245. data/spec/unit/european_union_27_ireland_with_ia_spec.rb +74 -0
  246. data/spec/unit/european_union_27_italy_spec.rb +69 -0
  247. data/spec/unit/european_union_27_netherlands_spec.rb +81 -0
  248. data/spec/unit/european_union_27_poland_spec.rb +69 -0
  249. data/spec/unit/european_union_27_romania_spec.rb +67 -0
  250. data/spec/unit/european_union_27_slovakia_spec.rb +111 -0
  251. data/spec/unit/european_union_27_spain_spec.rb +130 -0
  252. data/spec/unit/european_union_27_sweden_spec.rb +89 -0
  253. data/spec/unit/european_union_austria_spec.rb +61 -0
  254. data/spec/unit/european_union_bulgaria_spec.rb +97 -0
  255. data/spec/unit/european_union_croatia_spec.rb +59 -0
  256. data/spec/unit/european_union_cyprus_spec.rb +65 -0
  257. data/spec/unit/european_union_czech_republic_spec.rb +125 -0
  258. data/spec/unit/european_union_denmark_spec.rb +61 -0
  259. data/spec/unit/european_union_estonia_spec.rb +93 -0
  260. data/spec/unit/european_union_finland_spec.rb +75 -0
  261. data/spec/unit/european_union_flanders_spec.rb +56 -0
  262. data/spec/unit/european_union_france_2019_spec.rb +73 -0
  263. data/spec/unit/european_union_france_spec.rb +73 -0
  264. data/spec/unit/european_union_french_community_of_belgium_spec.rb +61 -0
  265. data/spec/unit/european_union_germany_spec.rb +90 -0
  266. data/spec/unit/european_union_great_britain_spec.rb +87 -0
  267. data/spec/unit/european_union_greece_spec.rb +148 -0
  268. data/spec/unit/european_union_hungary_spec.rb +57 -0
  269. data/spec/unit/european_union_ireland_spec.rb +72 -0
  270. data/spec/unit/european_union_ireland_with_ia_spec.rb +74 -0
  271. data/spec/unit/european_union_italy_spec.rb +69 -0
  272. data/spec/unit/european_union_latvia_spec.rb +76 -0
  273. data/spec/unit/european_union_lithuania_spec.rb +68 -0
  274. data/spec/unit/european_union_luxembourg_spec.rb +63 -0
  275. data/spec/unit/european_union_malta_spec.rb +60 -0
  276. data/spec/unit/european_union_netherlands_spec.rb +81 -0
  277. data/spec/unit/european_union_northern_ireland_spec.rb +66 -0
  278. data/spec/unit/european_union_poland_spec.rb +69 -0
  279. data/spec/unit/european_union_portugal_spec.rb +77 -0
  280. data/spec/unit/european_union_romania_spec.rb +67 -0
  281. data/spec/unit/european_union_slovakia_spec.rb +111 -0
  282. data/spec/unit/european_union_slovenia_spec.rb +77 -0
  283. data/spec/unit/european_union_spain_spec.rb +129 -0
  284. data/spec/unit/european_union_sweden_spec.rb +89 -0
  285. data/spec/unit/finland_spec.rb +65 -0
  286. data/spec/unit/finland_with_sin_spec.rb +67 -0
  287. data/spec/unit/first_past_the_post_spec.rb +54 -0
  288. data/spec/unit/flanders_spec.rb +70 -0
  289. data/spec/unit/france_spec.rb +32 -0
  290. data/spec/unit/greece_spec.rb +118 -0
  291. data/spec/unit/hungary_spec.rb +132 -0
  292. data/spec/unit/iceland_spec.rb +57 -0
  293. data/spec/unit/largest_remainder_spec.rb +79 -0
  294. data/spec/unit/latvia_kpv_p_par_spec.rb +38 -0
  295. data/spec/unit/latvia_kpv_par_spec.rb +38 -0
  296. data/spec/unit/latvia_kpv_spec.rb +38 -0
  297. data/spec/unit/latvia_spec.rb +60 -0
  298. data/spec/unit/luxembourg_spec.rb +54 -0
  299. data/spec/unit/multi_district_leveled_proportional_spec.rb +49 -0
  300. data/spec/unit/multi_district_proportional_spec.rb +81 -0
  301. data/spec/unit/netherlands_spec.rb +107 -0
  302. data/spec/unit/norway_spec.rb +64 -0
  303. data/spec/unit/norwegian_municipality_spec.rb +89 -0
  304. data/spec/unit/number_formatter_spec.rb +173 -0
  305. data/spec/unit/poland_spec.rb +62 -0
  306. data/spec/unit/poland_with_ko_and_l_without_n_po_r_and_zl_spec.rb +60 -0
  307. 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
  308. data/spec/unit/poland_with_ko_sld_and_wi_without_n_po_and_zl_spec.rb +62 -0
  309. data/spec/unit/poland_with_sld_and_wi_without_zl_spec.rb +63 -0
  310. data/spec/unit/poland_with_sld_without_zl_spec.rb +62 -0
  311. data/spec/unit/poll_spec.rb +110 -0
  312. data/spec/unit/portugal_spec.rb +66 -0
  313. data/spec/unit/portugal_with_a_and_ch_without_paf_spec.rb +68 -0
  314. data/spec/unit/portugal_with_a_and_il_without_paf_spec.rb +68 -0
  315. data/spec/unit/portugal_with_a_ch_and_il_without_paf_spec.rb +69 -0
  316. data/spec/unit/portugal_with_a_without_paf_spec.rb +67 -0
  317. data/spec/unit/portugal_with_ch_and_il_without_paf_spec.rb +68 -0
  318. data/spec/unit/portugal_without_paf_spec.rb +66 -0
  319. data/spec/unit/pseudorandom_multirange_enumerator_spec.rb +82 -0
  320. data/spec/unit/referendum_polychotomy_spec.rb +289 -0
  321. data/spec/unit/representatives_polychotomy_spec.rb +332 -0
  322. data/spec/unit/slovakia_spec.rb +99 -0
  323. data/spec/unit/slovenia_spec.rb +80 -0
  324. data/spec/unit/spain_spec.rb +101 -0
  325. data/spec/unit/sweden_20140914_spec.rb +112 -0
  326. data/spec/unit/sweden_spec.rb +113 -0
  327. data/spec/unit/united_kingdom_spec.rb +65 -0
  328. data/spec/unit/united_kingdom_with_brexit_and_chuk_spec.rb +67 -0
  329. data/spec/unit/united_kingdom_with_brexit_spec.rb +66 -0
  330. data/spec/unit/united_kingdom_with_tig_spec.rb +66 -0
  331. data/spec/unit/wallonia_spec.rb +70 -0
  332. metadata +490 -0
@@ -0,0 +1,94 @@
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
+ module Sapor
21
+ #
22
+ # The regional data for the United Kingdom.
23
+ #
24
+ class UnitedKingdom < Area
25
+ include Singleton
26
+
27
+ def area_code
28
+ 'UK'
29
+ end
30
+
31
+ def coalitions
32
+ [['Conservative Party'], ['Conservative Party', 'Liberal Democrats'],
33
+ ['Conservative Party', 'Plaid Cymru'],
34
+ ['Conservative Party', 'Plaid Cymru', 'Scottish National Party'],
35
+ ['Conservative Party', 'Scottish National Party'],
36
+ ['Labour Party'], ['Labour Party', 'Liberal Democrats'],
37
+ ['Labour Party', 'Liberal Democrats', 'Plaid Cymru'],
38
+ ['Labour Party', 'Liberal Democrats', 'Plaid Cymru',
39
+ 'Scottish National Party'],
40
+ ['Labour Party', 'Liberal Democrats', 'Scottish National Party'],
41
+ ['Labour Party', 'Plaid Cymru'],
42
+ ['Labour Party', 'Plaid Cymru', 'Scottish National Party'],
43
+ ['Labour Party', 'Scottish National Party']]
44
+ end
45
+
46
+ def no_of_seats
47
+ election_results_of_2017.size
48
+ end
49
+
50
+ def overall_election_results_of_2017
51
+ if @overall_election_results_of_2017.nil?
52
+ @overall_election_results_of_2017 = \
53
+ summarize_election_results(election_results_of_2017)
54
+ end
55
+ @overall_election_results_of_2017
56
+ end
57
+
58
+ def population_size
59
+ # Source: Wikipedia article the general election in the United Kingdom,
60
+ # retrieved on 17 November 2018.
61
+ # URL: https://en.wikipedia.org/wiki/United_Kingdom_general_election,_2017
62
+ 32_204_124
63
+ end
64
+
65
+ def seats(simulation)
66
+ electoral_system.project(simulation)
67
+ end
68
+
69
+ def threshold
70
+ nil
71
+ end
72
+
73
+ private
74
+
75
+ def election_results_of_2017
76
+ if @election_results_of_2017.nil?
77
+ @election_results_of_2017 = load_election_results(
78
+ 'united_kingdom-20170608.psv'
79
+ )
80
+ end
81
+ @election_results_of_2017
82
+ end
83
+
84
+ def electoral_system
85
+ if @electoral_system.nil?
86
+ @electoral_system = FirstPastThePost.new(
87
+ overall_election_results_of_2017,
88
+ election_results_of_2017
89
+ )
90
+ end
91
+ @electoral_system
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,110 @@
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
+ module Sapor
21
+ #
22
+ # The regional data for the United Kingdom extended with Brexit Party.
23
+ #
24
+ class UnitedKingdomWithBrexit < Area
25
+ include Singleton
26
+
27
+ def area_code
28
+ 'UK∪{BREXIT}'
29
+ end
30
+
31
+ BREX_PARTY = 'Brexit Party'.freeze
32
+ CHUK_PARTY = 'Change UK'.freeze
33
+ CON_PARTY = 'Conservative Party'.freeze
34
+ GREEN_PARTY = 'Green Party'.freeze
35
+ LAB_PARTY = 'Labour Party'.freeze
36
+ LD_PARTY = 'Liberal Democrats'.freeze
37
+ PC_PARTY = 'Plaid Cymru'.freeze
38
+ SNP_PARTY = 'Scottish National Party'.freeze
39
+
40
+ def coalitions
41
+ [[BREX_PARTY, CON_PARTY],
42
+ [CON_PARTY],
43
+ [CON_PARTY, LD_PARTY],
44
+ [CON_PARTY, LD_PARTY, CHUK_PARTY],
45
+ [CON_PARTY, PC_PARTY],
46
+ [CON_PARTY, PC_PARTY, SNP_PARTY],
47
+ [CON_PARTY, SNP_PARTY],
48
+ [CON_PARTY, CHUK_PARTY],
49
+ [LAB_PARTY],
50
+ [LAB_PARTY, GREEN_PARTY, LD_PARTY, PC_PARTY, SNP_PARTY],
51
+ [LAB_PARTY, LD_PARTY],
52
+ [LAB_PARTY, LD_PARTY, PC_PARTY],
53
+ [LAB_PARTY, LD_PARTY, PC_PARTY, SNP_PARTY],
54
+ [LAB_PARTY, LD_PARTY, SNP_PARTY],
55
+ [LAB_PARTY, LD_PARTY, CHUK_PARTY],
56
+ [LAB_PARTY, PC_PARTY],
57
+ [LAB_PARTY, PC_PARTY, SNP_PARTY],
58
+ [LAB_PARTY, SNP_PARTY],
59
+ [LAB_PARTY, CHUK_PARTY]]
60
+ end
61
+
62
+ def no_of_seats
63
+ election_results_of_2017.size
64
+ end
65
+
66
+ def overall_election_results_of_2017
67
+ if @overall_election_results_of_2017.nil?
68
+ @overall_election_results_of_2017 = \
69
+ summarize_election_results(election_results_of_2017)
70
+ end
71
+ @overall_election_results_of_2017
72
+ end
73
+
74
+ def population_size
75
+ # Source: Wikipedia article the general election in the United Kingdom,
76
+ # retrieved on 17 November 2018.
77
+ # URL: https://en.wikipedia.org/wiki/United_Kingdom_general_election,_2017
78
+ 32_204_124
79
+ end
80
+
81
+ def seats(simulation)
82
+ electoral_system.project(simulation)
83
+ end
84
+
85
+ def threshold
86
+ nil
87
+ end
88
+
89
+ private
90
+
91
+ def election_results_of_2017
92
+ if @election_results_of_2017.nil?
93
+ @election_results_of_2017 = load_election_results(
94
+ 'united_kingdom-20170608-brexit.psv'
95
+ )
96
+ end
97
+ @election_results_of_2017
98
+ end
99
+
100
+ def electoral_system
101
+ if @electoral_system.nil?
102
+ @electoral_system = FirstPastThePost.new(
103
+ overall_election_results_of_2017,
104
+ election_results_of_2017
105
+ )
106
+ end
107
+ @electoral_system
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,111 @@
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
+ module Sapor
21
+ #
22
+ # The regional data for the United Kingdom extended with Brexit Party and
23
+ # Change UK.
24
+ #
25
+ class UnitedKingdomWithBrexitAndChuk < Area
26
+ include Singleton
27
+
28
+ def area_code
29
+ 'UK∪{BREXIT,ChUK}'
30
+ end
31
+
32
+ BREX_PARTY = 'Brexit Party'.freeze
33
+ CHUK_PARTY = 'Change UK'.freeze
34
+ CON_PARTY = 'Conservative Party'.freeze
35
+ GREEN_PARTY = 'Green Party'.freeze
36
+ LAB_PARTY = 'Labour Party'.freeze
37
+ LD_PARTY = 'Liberal Democrats'.freeze
38
+ PC_PARTY = 'Plaid Cymru'.freeze
39
+ SNP_PARTY = 'Scottish National Party'.freeze
40
+
41
+ def coalitions
42
+ [[BREX_PARTY, CON_PARTY],
43
+ [CON_PARTY],
44
+ [CON_PARTY, LD_PARTY],
45
+ [CON_PARTY, LD_PARTY, CHUK_PARTY],
46
+ [CON_PARTY, PC_PARTY],
47
+ [CON_PARTY, PC_PARTY, SNP_PARTY],
48
+ [CON_PARTY, SNP_PARTY],
49
+ [CON_PARTY, CHUK_PARTY],
50
+ [LAB_PARTY],
51
+ [LAB_PARTY, GREEN_PARTY, LD_PARTY, PC_PARTY, SNP_PARTY],
52
+ [LAB_PARTY, LD_PARTY],
53
+ [LAB_PARTY, LD_PARTY, PC_PARTY],
54
+ [LAB_PARTY, LD_PARTY, PC_PARTY, SNP_PARTY],
55
+ [LAB_PARTY, LD_PARTY, SNP_PARTY],
56
+ [LAB_PARTY, LD_PARTY, CHUK_PARTY],
57
+ [LAB_PARTY, PC_PARTY],
58
+ [LAB_PARTY, PC_PARTY, SNP_PARTY],
59
+ [LAB_PARTY, SNP_PARTY],
60
+ [LAB_PARTY, CHUK_PARTY]]
61
+ end
62
+
63
+ def no_of_seats
64
+ election_results_of_2017.size
65
+ end
66
+
67
+ def overall_election_results_of_2017
68
+ if @overall_election_results_of_2017.nil?
69
+ @overall_election_results_of_2017 = \
70
+ summarize_election_results(election_results_of_2017)
71
+ end
72
+ @overall_election_results_of_2017
73
+ end
74
+
75
+ def population_size
76
+ # Source: Wikipedia article the general election in the United Kingdom,
77
+ # retrieved on 17 November 2018.
78
+ # URL: https://en.wikipedia.org/wiki/United_Kingdom_general_election,_2017
79
+ 32_204_124
80
+ end
81
+
82
+ def seats(simulation)
83
+ electoral_system.project(simulation)
84
+ end
85
+
86
+ def threshold
87
+ nil
88
+ end
89
+
90
+ private
91
+
92
+ def election_results_of_2017
93
+ if @election_results_of_2017.nil?
94
+ @election_results_of_2017 = load_election_results(
95
+ 'united_kingdom-20170608-brexit-chuk.psv'
96
+ )
97
+ end
98
+ @election_results_of_2017
99
+ end
100
+
101
+ def electoral_system
102
+ if @electoral_system.nil?
103
+ @electoral_system = FirstPastThePost.new(
104
+ overall_election_results_of_2017,
105
+ election_results_of_2017
106
+ )
107
+ end
108
+ @electoral_system
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,111 @@
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
+ module Sapor
21
+ #
22
+ # The regional data for the United Kingdom extended with The Independent
23
+ # Group.
24
+ #
25
+ class UnitedKingdomWithTig < Area
26
+ include Singleton
27
+
28
+ def area_code
29
+ 'UK∪{TIG}'
30
+ end
31
+
32
+ BREX_PARTY = 'Brexit Party'.freeze
33
+ CHUK_PARTY = 'Change UK'.freeze
34
+ CON_PARTY = 'Conservative Party'.freeze
35
+ GREEN_PARTY = 'Green Party'.freeze
36
+ LAB_PARTY = 'Labour Party'.freeze
37
+ LD_PARTY = 'Liberal Democrats'.freeze
38
+ PC_PARTY = 'Plaid Cymru'.freeze
39
+ SNP_PARTY = 'Scottish National Party'.freeze
40
+
41
+ def coalitions
42
+ [[BREX_PARTY, CON_PARTY],
43
+ [CON_PARTY],
44
+ [CON_PARTY, LD_PARTY],
45
+ [CON_PARTY, LD_PARTY, CHUK_PARTY],
46
+ [CON_PARTY, PC_PARTY],
47
+ [CON_PARTY, PC_PARTY, SNP_PARTY],
48
+ [CON_PARTY, SNP_PARTY],
49
+ [CON_PARTY, CHUK_PARTY],
50
+ [LAB_PARTY],
51
+ [LAB_PARTY, GREEN_PARTY, LD_PARTY, PC_PARTY, SNP_PARTY],
52
+ [LAB_PARTY, LD_PARTY],
53
+ [LAB_PARTY, LD_PARTY, PC_PARTY],
54
+ [LAB_PARTY, LD_PARTY, PC_PARTY, SNP_PARTY],
55
+ [LAB_PARTY, LD_PARTY, SNP_PARTY],
56
+ [LAB_PARTY, LD_PARTY, CHUK_PARTY],
57
+ [LAB_PARTY, PC_PARTY],
58
+ [LAB_PARTY, PC_PARTY, SNP_PARTY],
59
+ [LAB_PARTY, SNP_PARTY],
60
+ [LAB_PARTY, CHUK_PARTY]]
61
+ end
62
+
63
+ def no_of_seats
64
+ election_results_of_2017.size
65
+ end
66
+
67
+ def overall_election_results_of_2017
68
+ if @overall_election_results_of_2017.nil?
69
+ @overall_election_results_of_2017 = \
70
+ summarize_election_results(election_results_of_2017)
71
+ end
72
+ @overall_election_results_of_2017
73
+ end
74
+
75
+ def population_size
76
+ # Source: Wikipedia article the general election in the United Kingdom,
77
+ # retrieved on 17 November 2018.
78
+ # URL: https://en.wikipedia.org/wiki/United_Kingdom_general_election,_2017
79
+ 32_204_124
80
+ end
81
+
82
+ def seats(simulation)
83
+ electoral_system.project(simulation)
84
+ end
85
+
86
+ def threshold
87
+ nil
88
+ end
89
+
90
+ private
91
+
92
+ def election_results_of_2017
93
+ if @election_results_of_2017.nil?
94
+ @election_results_of_2017 = load_election_results(
95
+ 'united_kingdom-20170608-tig.psv'
96
+ )
97
+ end
98
+ @election_results_of_2017
99
+ end
100
+
101
+ def electoral_system
102
+ if @electoral_system.nil?
103
+ @electoral_system = FirstPastThePost.new(
104
+ overall_election_results_of_2017,
105
+ election_results_of_2017
106
+ )
107
+ end
108
+ @electoral_system
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,66 @@
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
+ module Sapor
21
+ #
22
+ # The regional data for Utopia, an area for testing purposes.
23
+ #
24
+ class Utopia
25
+ include Singleton
26
+
27
+ LAST_ELECTION_RESULT = { 'Red' => 91_811, 'Green' => 190_934,
28
+ 'Blue' => 290_647, 'Yellow' => 356_473 }
29
+
30
+ LAST_DETAILED_ELECTION_RESULT = { 'North' => { 'Red' => 50, 'Green' => 70
31
+ },
32
+ 'South' => { 'Red' => 70, 'Green' => 50,
33
+ 'Blue' => 100 },
34
+ 'East' => { 'Red' => 90, 'Green' => 70,
35
+ 'Blue' => 90 },
36
+ 'West' => { 'Red' => 110, 'Green' => 50,
37
+ 'Yellow' => 120 } }
38
+
39
+ ELECTORAL_SYSTEM = FirstPastThePost.new(LAST_ELECTION_RESULT,
40
+ LAST_DETAILED_ELECTION_RESULT)
41
+
42
+ def area_code
43
+ 'UT'
44
+ end
45
+
46
+ def coalitions
47
+ [%w(Red Green), %w(Red Blue)]
48
+ end
49
+
50
+ def population_size
51
+ 1_000_000
52
+ end
53
+
54
+ def threshold
55
+ nil
56
+ end
57
+
58
+ def no_of_seats
59
+ LAST_DETAILED_ELECTION_RESULT.size
60
+ end
61
+
62
+ def seats(simulation)
63
+ ELECTORAL_SYSTEM.project(simulation)
64
+ end
65
+ end
66
+ end