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,142 @@
1
+ # Statistical Analysis of Polling Results (SAPoR)
2
+ # Copyright (C) 2016 Filip van Laenen <f.a.vanlaenen@ieee.org>
3
+ #
4
+ # This file is part of SAPoR.
5
+ #
6
+ # SAPoR is free software: you can redistribute it and/or modify it under the
7
+ # terms of the GNU General Public License as published by the Free Software
8
+ # Foundation, either version 3 of the License, or (at your option) any later
9
+ # version.
10
+ #
11
+ # SAPoR is distributed in the hope that it will be useful, but WITHOUT ANY
12
+ # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
13
+ # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
14
+ #
15
+ # You can find a copy of the GNU General Public License in /doc/gpl.txt
16
+ #
17
+
18
+ # Source: "Resultater - Hele landet - Folketingsvalg torsdag 18. juni 2015 -
19
+ # Danmarks Statistik". Retrieved on 28 December 2018.
20
+ # URL: http://www.dst.dk/valg/Valg1487635/valgopg/valgopgHL.htm
21
+
22
+ # Extended with Nye Borgerlige equal to Det Konservative Folkeparti
23
+
24
+ Københavns Storkreds | Socialdemokraterne | 96,753
25
+ Københavns Storkreds | Radikale Venstre | 40578
26
+ Københavns Storkreds | Det Konservative Folkeparti | 13471
27
+ Københavns Storkreds | Nye Borgerlige | 13471
28
+ Københavns Storkreds | Socialistisk Folkeparti | 28260
29
+ Københavns Storkreds | Liberal Alliance | 37935
30
+ Københavns Storkreds | Kristendemokraterne | 1599
31
+ Københavns Storkreds | Dansk Folkeparti | 49575
32
+ Københavns Storkreds | Venstre | 44721
33
+ Københavns Storkreds | Enhedslisten–De Rød-Grønne | 71140
34
+ Københavns Storkreds | Alternativet | 48475
35
+
36
+ Københavns Omegns Storkreds | Socialdemokraterne | 90361
37
+ Københavns Omegns Storkreds | Radikale Venstre | 16710
38
+ Københavns Omegns Storkreds | Det Konservative Folkeparti | 13840
39
+ Københavns Omegns Storkreds | Nye Borgerlige | 13840
40
+ Københavns Omegns Storkreds | Socialistisk Folkeparti | 14619
41
+ Københavns Omegns Storkreds | Liberal Alliance | 25982
42
+ Københavns Omegns Storkreds | Kristendemokraterne | 1365
43
+ Københavns Omegns Storkreds | Dansk Folkeparti | 62419
44
+ Københavns Omegns Storkreds | Venstre | 46092
45
+ Københavns Omegns Storkreds | Enhedslisten–De Rød-Grønne | 25364
46
+ Københavns Omegns Storkreds | Alternativet | 13575
47
+
48
+ Nordsjællands Storkreds | Socialdemokraterne | 64822
49
+ Nordsjællands Storkreds | Radikale Venstre | 17515
50
+ Nordsjællands Storkreds | Det Konservative Folkeparti | 15123
51
+ Nordsjællands Storkreds | Nye Borgerlige | 15123
52
+ Nordsjællands Storkreds | Socialistisk Folkeparti | 11182
53
+ Nordsjællands Storkreds | Liberal Alliance | 32744
54
+ Nordsjællands Storkreds | Kristendemokraterne | 1680
55
+ Nordsjællands Storkreds | Dansk Folkeparti | 53980
56
+ Nordsjællands Storkreds | Venstre | 59155
57
+ Nordsjællands Storkreds | Enhedslisten–De Rød-Grønne | 18171
58
+ Nordsjællands Storkreds | Alternativet | 12957
59
+
60
+ Bornholms Storkreds | Socialdemokraterne | 8683
61
+ Bornholms Storkreds | Radikale Venstre | 427
62
+ Bornholms Storkreds | Det Konservative Folkeparti | 441
63
+ Bornholms Storkreds | Nye Borgerlige | 441
64
+ Bornholms Storkreds | Socialistisk Folkeparti | 716
65
+ Bornholms Storkreds | Liberal Alliance | 1037
66
+ Bornholms Storkreds | Kristendemokraterne | 749
67
+ Bornholms Storkreds | Dansk Folkeparti | 5168
68
+ Bornholms Storkreds | Venstre | 5257
69
+ Bornholms Storkreds | Enhedslisten–De Rød-Grønne | 2175
70
+ Bornholms Storkreds | Alternativet | 1299
71
+
72
+ Sjællands Storkreds | Socialdemokraterne | 146464
73
+ Sjællands Storkreds | Radikale Venstre | 16906
74
+ Sjællands Storkreds | Det Konservative Folkeparti | 15083
75
+ Sjællands Storkreds | Nye Borgerlige | 15083
76
+ Sjællands Storkreds | Socialistisk Folkeparti | 20575
77
+ Sjællands Storkreds | Liberal Alliance | 32598
78
+ Sjællands Storkreds | Kristendemokraterne | 1996
79
+ Sjællands Storkreds | Dansk Folkeparti | 134195
80
+ Sjællands Storkreds | Venstre | 102818
81
+ Sjællands Storkreds | Enhedslisten–De Rød-Grønne | 35374
82
+ Sjællands Storkreds | Alternativet | 18202
83
+
84
+ Fyns Storkreds | Socialdemokraterne | 90061
85
+ Fyns Storkreds | Radikale Venstre | 10513
86
+ Fyns Storkreds | Det Konservative Folkeparti | 10849
87
+ Fyns Storkreds | Nye Borgerlige | 10849
88
+ Fyns Storkreds | Socialistisk Folkeparti | 13790
89
+ Fyns Storkreds | Liberal Alliance | 20271
90
+ Fyns Storkreds | Kristendemokraterne | 1293
91
+ Fyns Storkreds | Dansk Folkeparti | 67913
92
+ Fyns Storkreds | Venstre | 56673
93
+ Fyns Storkreds | Enhedslisten–De Rød-Grønne | 26575
94
+ Fyns Storkreds | Alternativet | 14165
95
+
96
+ Sydjyllands Storkreds | Socialdemokraterne | 104391
97
+ Sydjyllands Storkreds | Radikale Venstre | 13962
98
+ Sydjyllands Storkreds | Det Konservative Folkeparti | 9625
99
+ Sydjyllands Storkreds | Nye Borgerlige | 9625
100
+ Sydjyllands Storkreds | Socialistisk Folkeparti | 13508
101
+ Sydjyllands Storkreds | Liberal Alliance | 33277
102
+ Sydjyllands Storkreds | Kristendemokraterne | 4792
103
+ Sydjyllands Storkreds | Dansk Folkeparti | 126058
104
+ Sydjyllands Storkreds | Venstre | 104483
105
+ Sydjyllands Storkreds | Enhedslisten–De Rød-Grønne | 22614
106
+ Sydjyllands Storkreds | Alternativet | 11551
107
+
108
+ Østjyllands Storkreds | Socialdemokraterne | 132320
109
+ Østjyllands Storkreds | Radikale Venstre | 23876
110
+ Østjyllands Storkreds | Det Konservative Folkeparti | 13490
111
+ Østjyllands Storkreds | Nye Borgerlige | 13490
112
+ Østjyllands Storkreds | Socialistisk Folkeparti | 21100
113
+ Østjyllands Storkreds | Liberal Alliance | 40101
114
+ Østjyllands Storkreds | Kristendemokraterne | 4627
115
+ Østjyllands Storkreds | Dansk Folkeparti | 91621
116
+ Østjyllands Storkreds | Venstre | 90528
117
+ Østjyllands Storkreds | Enhedslisten–De Rød-Grønne | 35960
118
+ Østjyllands Storkreds | Alternativet | 29587
119
+
120
+ Vestjyllands Storkreds | Socialdemokraterne | 80122
121
+ Vestjyllands Storkreds | Radikale Venstre | 9183
122
+ Vestjyllands Storkreds | Det Konservative Folkeparti | 15928
123
+ Vestjyllands Storkreds | Nye Borgerlige | 15928
124
+ Vestjyllands Storkreds | Socialistisk Folkeparti | 11720
125
+ Vestjyllands Storkreds | Liberal Alliance | 19377
126
+ Vestjyllands Storkreds | Kristendemokraterne | 7646
127
+ Vestjyllands Storkreds | Dansk Folkeparti | 69657
128
+ Vestjyllands Storkreds | Venstre | 89537
129
+ Vestjyllands Storkreds | Enhedslisten–De Rød-Grønne | 14531
130
+ Vestjyllands Storkreds | Alternativet | 8642
131
+
132
+ Nordjyllands Storkreds | Socialdemokraterne | 110963
133
+ Nordjyllands Storkreds | Radikale Venstre | 11339
134
+ Nordjyllands Storkreds | Det Konservative Folkeparti | 10153
135
+ Nordjyllands Storkreds | Nye Borgerlige | 10153
136
+ Nordjyllands Storkreds | Socialistisk Folkeparti | 12108
137
+ Nordjyllands Storkreds | Liberal Alliance | 21807
138
+ Nordjyllands Storkreds | Kristendemokraterne | 3330
139
+ Nordjyllands Storkreds | Dansk Folkeparti | 81160
140
+ Nordjyllands Storkreds | Venstre | 85924
141
+ Nordjyllands Storkreds | Enhedslisten–De Rød-Grønne | 22559
142
+ Nordjyllands Storkreds | Alternativet | 10335
@@ -0,0 +1,128 @@
1
+ # Statistical Analysis of Polling Results (SAPoR)
2
+ # Copyright (C) 2016 Filip van Laenen <f.a.vanlaenen@ieee.org>
3
+ #
4
+ # This file is part of SAPoR.
5
+ #
6
+ # SAPoR is free software: you can redistribute it and/or modify it under the
7
+ # terms of the GNU General Public License as published by the Free Software
8
+ # Foundation, either version 3 of the License, or (at your option) any later
9
+ # version.
10
+ #
11
+ # SAPoR is distributed in the hope that it will be useful, but WITHOUT ANY
12
+ # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
13
+ # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
14
+ #
15
+ # You can find a copy of the GNU General Public License in /doc/gpl.txt
16
+ #
17
+
18
+ module Sapor
19
+ #
20
+ # The regional data for Denmark.
21
+ #
22
+ class Denmark < Area
23
+ include Singleton
24
+
25
+ def area_code
26
+ 'DK'
27
+ end
28
+
29
+ def coalitions
30
+ COALITIONS
31
+ end
32
+
33
+ def no_of_seats
34
+ NO_OF_SEATS
35
+ end
36
+
37
+ def overall_election_results_of_2015
38
+ if @overall_election_results_of_2015.nil?
39
+ @overall_election_results_of_2015 = \
40
+ summarize_election_results(election_results_of_2015)
41
+ end
42
+ @overall_election_results_of_2015
43
+ end
44
+
45
+ def population_size
46
+ POPULATION_SIZE
47
+ end
48
+
49
+ def seats(simulation)
50
+ electoral_system.project(simulation)
51
+ end
52
+
53
+ private
54
+
55
+ A_PARTY = 'Socialdemokraterne'.freeze
56
+ B_PARTY = 'Radikale Venstre'.freeze
57
+ C_PARTY = 'Det Konservative Folkeparti'.freeze
58
+ D_PARTY = 'Nye Borgerlige'.freeze
59
+ E_PARTY = 'Klaus Riskær Pedersen'.freeze
60
+ F_PARTY = 'Socialistisk Folkeparti'.freeze
61
+ I_PARTY = 'Liberal Alliance'.freeze
62
+ K_PARTY = 'Kristendemokraterne'.freeze
63
+ O_PARTY = 'Dansk Folkeparti'.freeze
64
+ P_PARTY = 'Stram Kurs'.freeze
65
+ V_PARTY = 'Venstre'.freeze
66
+ OE_PARTY = 'Enhedslisten–De Rød-Grønne'.freeze
67
+ AA_PARTY = 'Alternativet'.freeze
68
+
69
+ COALITIONS = [[A_PARTY, B_PARTY],
70
+ [A_PARTY, B_PARTY, F_PARTY],
71
+ [A_PARTY, B_PARTY, F_PARTY, OE_PARTY],
72
+ [A_PARTY, B_PARTY, F_PARTY, OE_PARTY, AA_PARTY],
73
+ [A_PARTY, F_PARTY, OE_PARTY],
74
+ [A_PARTY, F_PARTY, OE_PARTY, AA_PARTY],
75
+ [C_PARTY, D_PARTY, E_PARTY, I_PARTY, K_PARTY, O_PARTY,
76
+ P_PARTY, V_PARTY],
77
+ [C_PARTY, D_PARTY, E_PARTY, I_PARTY, K_PARTY, O_PARTY,
78
+ V_PARTY],
79
+ [C_PARTY, D_PARTY, E_PARTY, I_PARTY, O_PARTY, V_PARTY],
80
+ [C_PARTY, D_PARTY, I_PARTY, K_PARTY, O_PARTY, V_PARTY],
81
+ [C_PARTY, D_PARTY, I_PARTY, O_PARTY, V_PARTY],
82
+ [C_PARTY, I_PARTY, K_PARTY, O_PARTY, V_PARTY],
83
+ [C_PARTY, I_PARTY, O_PARTY, V_PARTY],
84
+ [C_PARTY, I_PARTY, V_PARTY],
85
+ [C_PARTY, V_PARTY],
86
+ [V_PARTY]].freeze
87
+
88
+ # Voter turnout on 18 June 2015
89
+ # http://www.dst.dk/valg/Valg1487635/valgopg/valgopgHL.htm
90
+ POPULATION_SIZE = 3_518_987
91
+
92
+ DIRECT_SEAT_DISTRIBUTION = { 'Københavns Storkreds' => 16,
93
+ 'Københavns Omegns Storkreds' => 11,
94
+ 'Nordsjællands Storkreds' => 10,
95
+ 'Bornholms Storkreds' => 2,
96
+ 'Sjællands Storkreds' => 20,
97
+ 'Fyns Storkreds' => 12,
98
+ 'Sydjyllands Storkreds' => 18,
99
+ 'Østjyllands Storkreds' => 18,
100
+ 'Vestjyllands Storkreds' => 13,
101
+ 'Nordjyllands Storkreds' => 15 }.freeze
102
+
103
+ LEVELING_THRESHOLD = 0.02
104
+
105
+ NO_OF_LEVELING_SEATS = 40
106
+
107
+ NO_OF_SEATS = NO_OF_LEVELING_SEATS + \
108
+ DIRECT_SEAT_DISTRIBUTION.values.inject(:+)
109
+
110
+ def election_results_of_2015
111
+ if @election_results_of_2015.nil?
112
+ @election_results_of_2015 = load_election_results(
113
+ 'denmark-20150618.psv'
114
+ )
115
+ end
116
+ @election_results_of_2015
117
+ end
118
+
119
+ def electoral_system
120
+ if @electoral_system.nil?
121
+ @electoral_system = LargestRemainder.new(NO_OF_SEATS, HareQuota,
122
+ LEVELING_THRESHOLD)
123
+
124
+ end
125
+ @electoral_system
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,128 @@
1
+ # Statistical Analysis of Polling Results (SAPoR)
2
+ # Copyright (C) 2016 Filip van Laenen <f.a.vanlaenen@ieee.org>
3
+ #
4
+ # This file is part of SAPoR.
5
+ #
6
+ # SAPoR is free software: you can redistribute it and/or modify it under the
7
+ # terms of the GNU General Public License as published by the Free Software
8
+ # Foundation, either version 3 of the License, or (at your option) any later
9
+ # version.
10
+ #
11
+ # SAPoR is distributed in the hope that it will be useful, but WITHOUT ANY
12
+ # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
13
+ # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
14
+ #
15
+ # You can find a copy of the GNU General Public License in /doc/gpl.txt
16
+ #
17
+
18
+ module Sapor
19
+ #
20
+ # The regional data for Denmark, extended with E.
21
+ #
22
+ class DenmarkWithE < Area
23
+ include Singleton
24
+
25
+ def area_code
26
+ 'DK∪{E}'
27
+ end
28
+
29
+ def coalitions
30
+ COALITIONS
31
+ end
32
+
33
+ def no_of_seats
34
+ NO_OF_SEATS
35
+ end
36
+
37
+ def overall_election_results_of_2015
38
+ if @overall_election_results_of_2015.nil?
39
+ @overall_election_results_of_2015 = \
40
+ summarize_election_results(election_results_of_2015)
41
+ end
42
+ @overall_election_results_of_2015
43
+ end
44
+
45
+ def population_size
46
+ POPULATION_SIZE
47
+ end
48
+
49
+ def seats(simulation)
50
+ electoral_system.project(simulation)
51
+ end
52
+
53
+ private
54
+
55
+ A_PARTY = 'Socialdemokraterne'.freeze
56
+ B_PARTY = 'Radikale Venstre'.freeze
57
+ C_PARTY = 'Det Konservative Folkeparti'.freeze
58
+ D_PARTY = 'Nye Borgerlige'.freeze
59
+ E_PARTY = 'Klaus Riskær Pedersen'.freeze
60
+ F_PARTY = 'Socialistisk Folkeparti'.freeze
61
+ I_PARTY = 'Liberal Alliance'.freeze
62
+ K_PARTY = 'Kristendemokraterne'.freeze
63
+ O_PARTY = 'Dansk Folkeparti'.freeze
64
+ P_PARTY = 'Stram Kurs'.freeze
65
+ V_PARTY = 'Venstre'.freeze
66
+ OE_PARTY = 'Enhedslisten–De Rød-Grønne'.freeze
67
+ AA_PARTY = 'Alternativet'.freeze
68
+
69
+ COALITIONS = [[A_PARTY, B_PARTY],
70
+ [A_PARTY, B_PARTY, F_PARTY],
71
+ [A_PARTY, B_PARTY, F_PARTY, OE_PARTY],
72
+ [A_PARTY, B_PARTY, F_PARTY, OE_PARTY, AA_PARTY],
73
+ [A_PARTY, F_PARTY, OE_PARTY],
74
+ [A_PARTY, F_PARTY, OE_PARTY, AA_PARTY],
75
+ [C_PARTY, D_PARTY, E_PARTY, I_PARTY, K_PARTY, O_PARTY,
76
+ P_PARTY, V_PARTY],
77
+ [C_PARTY, D_PARTY, E_PARTY, I_PARTY, K_PARTY, O_PARTY,
78
+ V_PARTY],
79
+ [C_PARTY, D_PARTY, E_PARTY, I_PARTY, O_PARTY, V_PARTY],
80
+ [C_PARTY, D_PARTY, I_PARTY, K_PARTY, O_PARTY, V_PARTY],
81
+ [C_PARTY, D_PARTY, I_PARTY, O_PARTY, V_PARTY],
82
+ [C_PARTY, I_PARTY, K_PARTY, O_PARTY, V_PARTY],
83
+ [C_PARTY, I_PARTY, O_PARTY, V_PARTY],
84
+ [C_PARTY, I_PARTY, V_PARTY],
85
+ [C_PARTY, V_PARTY],
86
+ [V_PARTY]].freeze
87
+
88
+ # Voter turnout on 18 June 2015
89
+ # http://www.dst.dk/valg/Valg1487635/valgopg/valgopgHL.htm
90
+ POPULATION_SIZE = 3_518_987
91
+
92
+ DIRECT_SEAT_DISTRIBUTION = { 'Københavns Storkreds' => 16,
93
+ 'Københavns Omegns Storkreds' => 11,
94
+ 'Nordsjællands Storkreds' => 10,
95
+ 'Bornholms Storkreds' => 2,
96
+ 'Sjællands Storkreds' => 20,
97
+ 'Fyns Storkreds' => 12,
98
+ 'Sydjyllands Storkreds' => 18,
99
+ 'Østjyllands Storkreds' => 18,
100
+ 'Vestjyllands Storkreds' => 13,
101
+ 'Nordjyllands Storkreds' => 15 }.freeze
102
+
103
+ LEVELING_THRESHOLD = 0.02
104
+
105
+ NO_OF_LEVELING_SEATS = 40
106
+
107
+ NO_OF_SEATS = NO_OF_LEVELING_SEATS + \
108
+ DIRECT_SEAT_DISTRIBUTION.values.inject(:+)
109
+
110
+ def election_results_of_2015
111
+ if @election_results_of_2015.nil?
112
+ @election_results_of_2015 = load_election_results(
113
+ 'denmark-20150618-with-e.psv'
114
+ )
115
+ end
116
+ @election_results_of_2015
117
+ end
118
+
119
+ def electoral_system
120
+ if @electoral_system.nil?
121
+ @electoral_system = LargestRemainder.new(NO_OF_SEATS, HareQuota,
122
+ LEVELING_THRESHOLD)
123
+
124
+ end
125
+ @electoral_system
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,128 @@
1
+ # Statistical Analysis of Polling Results (SAPoR)
2
+ # Copyright (C) 2016 Filip van Laenen <f.a.vanlaenen@ieee.org>
3
+ #
4
+ # This file is part of SAPoR.
5
+ #
6
+ # SAPoR is free software: you can redistribute it and/or modify it under the
7
+ # terms of the GNU General Public License as published by the Free Software
8
+ # Foundation, either version 3 of the License, or (at your option) any later
9
+ # version.
10
+ #
11
+ # SAPoR is distributed in the hope that it will be useful, but WITHOUT ANY
12
+ # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
13
+ # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
14
+ #
15
+ # You can find a copy of the GNU General Public License in /doc/gpl.txt
16
+ #
17
+
18
+ module Sapor
19
+ #
20
+ # The regional data for Denmark, extended with E and P.
21
+ #
22
+ class DenmarkWithEAndP < Area
23
+ include Singleton
24
+
25
+ def area_code
26
+ 'DK∪{E,P}'
27
+ end
28
+
29
+ def coalitions
30
+ COALITIONS
31
+ end
32
+
33
+ def no_of_seats
34
+ NO_OF_SEATS
35
+ end
36
+
37
+ def overall_election_results_of_2015
38
+ if @overall_election_results_of_2015.nil?
39
+ @overall_election_results_of_2015 = \
40
+ summarize_election_results(election_results_of_2015)
41
+ end
42
+ @overall_election_results_of_2015
43
+ end
44
+
45
+ def population_size
46
+ POPULATION_SIZE
47
+ end
48
+
49
+ def seats(simulation)
50
+ electoral_system.project(simulation)
51
+ end
52
+
53
+ private
54
+
55
+ A_PARTY = 'Socialdemokraterne'.freeze
56
+ B_PARTY = 'Radikale Venstre'.freeze
57
+ C_PARTY = 'Det Konservative Folkeparti'.freeze
58
+ D_PARTY = 'Nye Borgerlige'.freeze
59
+ E_PARTY = 'Klaus Riskær Pedersen'.freeze
60
+ F_PARTY = 'Socialistisk Folkeparti'.freeze
61
+ I_PARTY = 'Liberal Alliance'.freeze
62
+ K_PARTY = 'Kristendemokraterne'.freeze
63
+ O_PARTY = 'Dansk Folkeparti'.freeze
64
+ P_PARTY = 'Stram Kurs'.freeze
65
+ V_PARTY = 'Venstre'.freeze
66
+ OE_PARTY = 'Enhedslisten–De Rød-Grønne'.freeze
67
+ AA_PARTY = 'Alternativet'.freeze
68
+
69
+ COALITIONS = [[A_PARTY, B_PARTY],
70
+ [A_PARTY, B_PARTY, F_PARTY],
71
+ [A_PARTY, B_PARTY, F_PARTY, OE_PARTY],
72
+ [A_PARTY, B_PARTY, F_PARTY, OE_PARTY, AA_PARTY],
73
+ [A_PARTY, F_PARTY, OE_PARTY],
74
+ [A_PARTY, F_PARTY, OE_PARTY, AA_PARTY],
75
+ [C_PARTY, D_PARTY, E_PARTY, I_PARTY, K_PARTY, O_PARTY,
76
+ P_PARTY, V_PARTY],
77
+ [C_PARTY, D_PARTY, E_PARTY, I_PARTY, K_PARTY, O_PARTY,
78
+ V_PARTY],
79
+ [C_PARTY, D_PARTY, E_PARTY, I_PARTY, O_PARTY, V_PARTY],
80
+ [C_PARTY, D_PARTY, I_PARTY, K_PARTY, O_PARTY, V_PARTY],
81
+ [C_PARTY, D_PARTY, I_PARTY, O_PARTY, V_PARTY],
82
+ [C_PARTY, I_PARTY, K_PARTY, O_PARTY, V_PARTY],
83
+ [C_PARTY, I_PARTY, O_PARTY, V_PARTY],
84
+ [C_PARTY, I_PARTY, V_PARTY],
85
+ [C_PARTY, V_PARTY],
86
+ [V_PARTY]].freeze
87
+
88
+ # Voter turnout on 18 June 2015
89
+ # http://www.dst.dk/valg/Valg1487635/valgopg/valgopgHL.htm
90
+ POPULATION_SIZE = 3_518_987
91
+
92
+ DIRECT_SEAT_DISTRIBUTION = { 'Københavns Storkreds' => 16,
93
+ 'Københavns Omegns Storkreds' => 11,
94
+ 'Nordsjællands Storkreds' => 10,
95
+ 'Bornholms Storkreds' => 2,
96
+ 'Sjællands Storkreds' => 20,
97
+ 'Fyns Storkreds' => 12,
98
+ 'Sydjyllands Storkreds' => 18,
99
+ 'Østjyllands Storkreds' => 18,
100
+ 'Vestjyllands Storkreds' => 13,
101
+ 'Nordjyllands Storkreds' => 15 }.freeze
102
+
103
+ LEVELING_THRESHOLD = 0.02
104
+
105
+ NO_OF_LEVELING_SEATS = 40
106
+
107
+ NO_OF_SEATS = NO_OF_LEVELING_SEATS + \
108
+ DIRECT_SEAT_DISTRIBUTION.values.inject(:+)
109
+
110
+ def election_results_of_2015
111
+ if @election_results_of_2015.nil?
112
+ @election_results_of_2015 = load_election_results(
113
+ 'denmark-20150618-with-e-and-p.psv'
114
+ )
115
+ end
116
+ @election_results_of_2015
117
+ end
118
+
119
+ def electoral_system
120
+ if @electoral_system.nil?
121
+ @electoral_system = LargestRemainder.new(NO_OF_SEATS, HareQuota,
122
+ LEVELING_THRESHOLD)
123
+
124
+ end
125
+ @electoral_system
126
+ end
127
+ end
128
+ end