sapor 0.4.1 → 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a527f30bf6e8c2cc885284da9ce2d738fa4dd3636598e1e17ce7ceaa681f0d30
4
- data.tar.gz: 55de26c7841c888820df2aee2606c0ce2ed14834a0bf5e56ad03ee57ab3d3f74
3
+ metadata.gz: d9db9878d88eba52cd75bd216c3fd4b98f72786aff78b781cd76b4dc9d0d68c6
4
+ data.tar.gz: f5ee7d583d0728b24adf93f1728398043ce77649694f328b1aac1830c80a6e91
5
5
  SHA512:
6
- metadata.gz: 2bfc4afadfd3fa586ffa69d17ac83c230cb4f1410016b7466e4ca40a607f0d219e44577f7ca4535773251767f637afcb1da5c71ec24f1399110db741b897deb6
7
- data.tar.gz: cb3aaf03010ac985332ed7d5ed506d5fa6cda3010207d7d35aa94775630fb155e77f22d1c8fdcf0c58fb2e727b18bd121623589bb8aa50881be5acf7c8498837
6
+ metadata.gz: 2a1dbf105b97217abfaa3cb2065be93f931e08fb670539cab5f35dcdbc74e9a224b7dbc0b6cdaebb5406f04723f33658c40a7be17aceee83a06c127f6c33d0f4
7
+ data.tar.gz: 21f6c3faca8b6300bfcc1800683f56de35cc8046b46bc2739b3a1a2641b64241456cac25e74933a893143aa57d66069a695ee8c34a897b2a0e5b713020ec8749
@@ -118,6 +118,7 @@ require 'sapor/regional_data/portugal_with_a_ch_and_il_without_paf'
118
118
  require 'sapor/regional_data/portugal_with_a_without_paf'
119
119
  require 'sapor/regional_data/portugal_with_ch_and_il_without_paf'
120
120
  require 'sapor/regional_data/portugal_without_paf'
121
+ require 'sapor/regional_data/romania'
121
122
  require 'sapor/regional_data/slovakia'
122
123
  require 'sapor/regional_data/slovenia'
123
124
  require 'sapor/regional_data/spain'
@@ -89,8 +89,8 @@ module Sapor
89
89
  Estonia.instance, Finland.instance, FinlandWithSin.instance,
90
90
  France.instance, Greece.instance, Hungary.instance, Iceland.instance,
91
91
  IcelandWithJ.instance, Ireland.instance, Latvia.instance,
92
- Luxembourg.instance, Netherlands.instance, Slovakia.instance,
93
- Slovenia.instance, Spain.instance, Sweden.instance,
92
+ Luxembourg.instance, Netherlands.instance, Romania.instance,
93
+ Slovakia.instance, Slovenia.instance, Spain.instance, Sweden.instance,
94
94
  Sweden20140914.instance, UnitedKingdom.instance,
95
95
  UnitedKingdomWithBrexit.instance, UnitedKingdomWithBrexitAndChuk.instance,
96
96
  UnitedKingdomWithTig.instance, Utopia.instance]).map do |area|
@@ -51,7 +51,7 @@ module Sapor
51
51
  'Coligação Democrática Unitária (GUE/NGL)'],
52
52
  ['CDS–Partido Popular (EPP)',
53
53
  'Partido Social Democrata (EPP)'],
54
- ['Chega (ECR)'],
54
+ ['Chega (ID)'],
55
55
  ['Partido Socialista (S&D)'],
56
56
  ['LIVRE (Greens/EFA)',
57
57
  'Pessoas–Animais–Natureza (Greens/EFA)']].freeze
@@ -0,0 +1,107 @@
1
+ #
2
+ # Statistical Analysis of Polling Results (SAPoR)
3
+ # Copyright (C) 2020 Filip van Laenen <f.a.vanlaenen@ieee.org>
4
+ #
5
+ # This file is part of SAPoR.
6
+ #
7
+ # SAPoR is free software: you can redistribute it and/or modify it under the
8
+ # terms of the GNU General Public License as published by the Free Software
9
+ # Foundation, either version 3 of the License, or (at your option) any later
10
+ # version.
11
+ #
12
+ # SAPoR is distributed in the hope that it will be useful, but WITHOUT ANY
13
+ # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14
+ # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
15
+ #
16
+ # You can find a copy of the GNU General Public License in /doc/gpl.txt
17
+ #
18
+
19
+ module Sapor
20
+ #
21
+ # The regional data for Romania.
22
+ #
23
+ class Romania < Area
24
+ include Singleton
25
+
26
+ def area_code
27
+ 'RO'
28
+ end
29
+
30
+ def coalitions
31
+ COALITIONS
32
+ end
33
+
34
+ def no_of_seats
35
+ NO_OF_SEATS
36
+ end
37
+
38
+ def population_size
39
+ POPULATION_SIZE
40
+ end
41
+
42
+ def seats(simulation)
43
+ electoral_system.project(simulation)
44
+ end
45
+
46
+ def threshold
47
+ THRESHOLD
48
+ end
49
+
50
+ private
51
+
52
+ A2020_COALITION = 'Alianța 2020 USR-PLUS'.freeze
53
+ ALDE_PARTY = 'Partidul Alianța Liberalilor și Democraților'.freeze
54
+ # PLUS_PARTY = 'Partidul Libertății, Unității și Solidarității'.freeze
55
+ PMP_PARTY = 'Partidul Mișcarea Populară'.freeze
56
+ PNL_PARTY = 'Partidul Național Liberal'.freeze
57
+ PRO_PARTY = 'PRO România'.freeze
58
+ PSD_PARTY = 'Partidul Social Democrat'.freeze
59
+ UDMR_PARTY = 'Uniunea Democrată Maghiară din România'.freeze
60
+ # USR_PARTY = 'Uniunea Salvați România'.freeze
61
+
62
+ COALITIONS = [[A2020_COALITION, ALDE_PARTY, PMP_PARTY, PNL_PARTY],
63
+ [A2020_COALITION, ALDE_PARTY, PMP_PARTY, PNL_PARTY,
64
+ UDMR_PARTY],
65
+ [A2020_COALITION, ALDE_PARTY, PNL_PARTY],
66
+ [A2020_COALITION, ALDE_PARTY, PNL_PARTY, UDMR_PARTY],
67
+ [A2020_COALITION, PMP_PARTY],
68
+ [A2020_COALITION, PMP_PARTY, PNL_PARTY],
69
+ [A2020_COALITION, PMP_PARTY, PNL_PARTY, UDMR_PARTY],
70
+ [A2020_COALITION, PNL_PARTY],
71
+ [A2020_COALITION, PNL_PARTY, UDMR_PARTY],
72
+ [ALDE_PARTY, PMP_PARTY, PNL_PARTY, UDMR_PARTY],
73
+ [ALDE_PARTY, PNL_PARTY, UDMR_PARTY],
74
+ [ALDE_PARTY, PRO_PARTY, PSD_PARTY],
75
+ [ALDE_PARTY, PSD_PARTY],
76
+ [PMP_PARTY, PNL_PARTY],
77
+ [PMP_PARTY, PNL_PARTY, UDMR_PARTY],
78
+ [PNL_PARTY, UDMR_PARTY],
79
+ # [ALDE_PARTY, PLUS_PARTY, PMP_PARTY, PNL_PARTY, UDMR_PARTY,
80
+ # USR_PARTY],
81
+ [PNL_PARTY],
82
+ [PRO_PARTY, PSD_PARTY]].freeze
83
+
84
+ NO_OF_SEATS = 312
85
+
86
+ # Voter turnout on 11 December 2016
87
+ # Source: Web page with the official results of the elections of 11 December
88
+ # 2016, downloaded on 22 February 2020,
89
+ # https://en.wikipedia.org/wiki/2016_Romanian_legislative_election
90
+ POPULATION_SIZE = 7_047_384
91
+
92
+ THRESHOLD = 0.05
93
+ COALITION_LIST_THRESHOLD = 0.08
94
+ COALITION_LISTS = [A2020_COALITION].freeze
95
+ MINORITY_LISTS = [UDMR_PARTY].freeze
96
+
97
+ def electoral_system
98
+ if @electoral_system.nil?
99
+ @electoral_system = SingleDistrictProportional.new(
100
+ NO_OF_SEATS, DhondtDenominators, THRESHOLD, 0, false,
101
+ COALITION_LIST_THRESHOLD, COALITION_LISTS, MINORITY_LISTS
102
+ )
103
+ end
104
+ @electoral_system
105
+ end
106
+ end
107
+ end
@@ -1,4 +1,4 @@
1
- # encoding: utf-8
1
+
2
2
  #
3
3
  # Statistical Analysis of Polling Results (SAPoR)
4
4
  # Copyright (C) 2020 Filip van Laenen <f.a.vanlaenen@ieee.org>
@@ -22,16 +22,24 @@ module Sapor
22
22
  # Class representing a proportional electoral system with only one district.
23
23
  #
24
24
  class SingleDistrictProportional
25
- def initialize(no_of_seats, denominators_class, threshold = 0, bonus = 0)
25
+ def initialize(no_of_seats, denominators_class, threshold = 0, bonus = 0,
26
+ other_eligible = true, coalition_list_threshold = 1,
27
+ coalition_lists = [], minority_lists = [])
26
28
  @no_of_seats = no_of_seats
27
29
  @denominators_class = denominators_class
28
30
  @threshold = threshold
29
31
  @bonus = bonus
32
+ @other_eligible = other_eligible
33
+ @coalition_list_threshold = coalition_list_threshold
34
+ @coalition_lists = coalition_lists
35
+ @minority_lists = minority_lists
30
36
  end
31
37
 
32
38
  def project(simulation)
33
- threshold = simulation.values.inject(:+).to_f * @threshold
34
- quotients = quotients(simulation, threshold)
39
+ votes_sum = simulation.values.inject(:+).to_f
40
+ threshold = votes_sum * @threshold
41
+ coalition_list_threshold = votes_sum * @coalition_list_threshold
42
+ quotients = quotients(simulation, threshold, coalition_list_threshold)
35
43
  sorted_quotients = quotients.sort { |a, b| b.last <=> a.last }
36
44
  seats = sorted_quotients.map(&:first).slice(0, @no_of_seats)
37
45
  result = create_empty_result(simulation)
@@ -46,7 +54,7 @@ module Sapor
46
54
  simulation.each_key do |choice|
47
55
  result[choice] = 0
48
56
  end
49
- result[simulation.max { |a, b| a.last <=> b.last }[0]] = @bonus
57
+ result[simulation.max_by(&:last)[0]] = @bonus
50
58
  result[OTHER] = 0
51
59
  result
52
60
  end
@@ -61,10 +69,15 @@ module Sapor
61
69
  end
62
70
  end
63
71
 
64
- def quotients(votes, threshold)
72
+ def quotients(votes, threshold, coalition_list_threshold)
65
73
  quotients = []
66
74
  votes.each_pair do |choice, new_value|
67
- next if new_value < threshold
75
+ next if choice == OTHER && !@other_eligible
76
+ next unless @minority_lists.include?(choice) ||
77
+ @coalition_lists.include?(choice) &&
78
+ new_value >= coalition_list_threshold ||
79
+ !@coalition_lists.include?(choice) &&
80
+ new_value >= threshold
68
81
  @denominators_class.get(@no_of_seats).each do |d|
69
82
  quotients << [choice, new_value.to_f / d]
70
83
  end
@@ -19,7 +19,7 @@
19
19
 
20
20
  Gem::Specification.new do |gem|
21
21
  gem.name = 'sapor'
22
- gem.version = '0.4.1'
22
+ gem.version = '0.4.2'
23
23
  gem.authors = ['Filip van Laenen']
24
24
  gem.email = ['f.a.vanlaenen@ieee.org']
25
25
 
@@ -0,0 +1,69 @@
1
+
2
+ #
3
+ # Statistical Analysis of Polling Results (SAPoR)
4
+ # Copyright (C) 2020 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::Romania, '#area_code' do
23
+ it 'returns RO as the area code' do
24
+ expect(Sapor::Romania.instance.area_code).to eq('RO')
25
+ end
26
+ end
27
+
28
+ describe Sapor::Romania, '#no_of_seats' do
29
+ it 'returns 312 as the number of seats' do
30
+ expect(Sapor::Romania.instance.no_of_seats).to eq(312)
31
+ end
32
+ end
33
+
34
+ describe Sapor::Romania, '#population_size' do
35
+ it 'returns a population size of 7,047,384' do
36
+ expect(Sapor::Romania.instance.population_size).to \
37
+ eq(7_047_384)
38
+ end
39
+ end
40
+
41
+ describe Sapor::Romania, '#seats' do
42
+ it 'calculates the number of seats for the election of 2014' do
43
+ results = { 'Partidul Social Democrat' => 3_204_864,
44
+ 'Partidul Național Liberal' => 1_412_377,
45
+ 'Uniunea Salvați România' => 625_154,
46
+ 'Uniunea Democrată Maghiară din România' => 435_969,
47
+ 'Partidul Alianța Liberalilor și Democraților' => 396_386,
48
+ 'Partidul Mișcarea Populară' => 376_891,
49
+ 'Partidul România Unită' => 196_397,
50
+ 'Partidul România Mare' => 73_264,
51
+ 'Partidul Ecologist Român' => 62_414,
52
+ 'Alianța Noastră România' => 61_206,
53
+ 'Partidul Socialist Român' => 24_580,
54
+ 'Partida Romilor „Pro Europa”' => 13_126 }
55
+ seats = Sapor::Romania.instance.seats(results)
56
+ expect(seats['Partidul Social Democrat']).to eq(154 + 2)
57
+ expect(seats['Partidul Național Liberal']).to eq(69 - 1)
58
+ expect(seats['Uniunea Salvați România']).to eq(30)
59
+ expect(seats['Uniunea Democrată Maghiară din România']).to eq(21)
60
+ expect(seats['Partidul Alianța Liberalilor și Democraților']).to eq(20 - 1)
61
+ expect(seats['Partidul Mișcarea Populară']).to eq(18)
62
+ expect(seats['Partidul România Unită']).to eq(0)
63
+ expect(seats['Partidul România Mare']).to eq(0)
64
+ expect(seats['Partidul Ecologist Român']).to eq(0)
65
+ expect(seats['Alianța Noastră România']).to eq(0)
66
+ expect(seats['Partidul Socialist Român']).to eq(0)
67
+ expect(seats['Partida Romilor „Pro Europa”']).to eq(0)
68
+ end
69
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sapor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Filip van Laenen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-17 00:00:00.000000000 Z
11
+ date: 2020-02-27 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: SAPoR
14
14
  email:
@@ -208,6 +208,7 @@ files:
208
208
  - lib/sapor/regional_data/portugal_with_a_without_paf.rb
209
209
  - lib/sapor/regional_data/portugal_with_ch_and_il_without_paf.rb
210
210
  - lib/sapor/regional_data/portugal_without_paf.rb
211
+ - lib/sapor/regional_data/romania.rb
211
212
  - lib/sapor/regional_data/slovakia.rb
212
213
  - lib/sapor/regional_data/slovenia.rb
213
214
  - lib/sapor/regional_data/spain-20160626.psv
@@ -320,6 +321,7 @@ files:
320
321
  - spec/unit/pseudorandom_multirange_enumerator_spec.rb
321
322
  - spec/unit/referendum_polychotomy_spec.rb
322
323
  - spec/unit/representatives_polychotomy_spec.rb
324
+ - spec/unit/romania_spec.rb
323
325
  - spec/unit/slovakia_spec.rb
324
326
  - spec/unit/slovenia_spec.rb
325
327
  - spec/unit/spain_spec.rb
@@ -445,6 +447,7 @@ test_files:
445
447
  - spec/unit/pseudorandom_multirange_enumerator_spec.rb
446
448
  - spec/unit/referendum_polychotomy_spec.rb
447
449
  - spec/unit/representatives_polychotomy_spec.rb
450
+ - spec/unit/romania_spec.rb
448
451
  - spec/unit/slovakia_spec.rb
449
452
  - spec/unit/slovenia_spec.rb
450
453
  - spec/unit/spain_spec.rb