-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathprimary_states.m
More file actions
223 lines (216 loc) · 8.01 KB
/
primary_states.m
File metadata and controls
223 lines (216 loc) · 8.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
%%%%%%%%%%%%%%%%%%%%%%
%
% By Sam Wang, January 2016.
% GNU license: Distribute freely but retain this header
% Princeton Election Consortium - election.princeton.edu
%
% - generate percentages for primary states
% - do it for the candidates in candidatemeans
% - assign delegates according to descriptions from TheGreenPapers.com:
% http://www.thegreenpapers.com/P16/ccad.phtml
%
% This version of the code does not implement rounding rules.
%
% Statewide quantities of interest:
% Percentage for each candidate (renormalize after IA/NH)
% #1 ranked finisher, and whether that person gets >50%
% which candidates are above threshold (threshold varies by state)
% number of districts
%
% By district or other region:
% Percentage for each candidate (renormalize after IA/NH)
% #1 finisher, and whether that person gets >50%
% number of candidates above threshold
%
%
%%%%%%%%%%%%%%%%%%%%%%
for j=1:length(candidatemeans)
statewide(:,j)=primaries(candidatemeans(j),numstates);
end
for i=1:2
statewide(i,:)=statewide(i,:)/max(sum(statewide(i,:)),100)*100;
end
for i=3:(size(statewide,1))
statewide(i,:)=statewide(i,:)/sum(statewide(i,:))*100;
end
[maxpct,leader]=max(statewide,[],2); % find leader in each state and his percentage
majoritywins=find(maxpct>50); % find states where leader won more than 50%
% delegate_state(irank(1))=delegate_state(irank(1))+statedels(i);
for i=1:(size(statewide,1))
% states(3*i-2:3*i-1)
[pcts,irank]=sort(statewide(i,:),'descend');
foo = zeros(1,length(candidatemeans));
switch i % specialized rules for each state
case 1 % Iowa
foo=round(statewide(i,:)*statedels(i)/100);
case 2 % New Hampshire
above=find(statewide(i,:)>10);
foo(above)=round(statewide(i,above)*statedels(i)/100);
if sum(foo)<statedels(i)
foo(irank(1))=foo(irank(1))+statedels(i)-sum(foo);
end
case 3 % South Carolina
foo(irank(1))=statedels(i);
case 4 % Nevada
above=find(statewide(i,:)>3.33);
abovepct=sum(statewide(i,above));
foo(above)=round(statewide(i,above)*statedels(i)/abovepct);
case 5 % Alaska
above=find(statewide(i,:)>13);
abovepct=sum(statewide(i,above));
foo(above)=round(statewide(i,above)*statedels(i)/abovepct);
if sum(foo)>statedels(i)
foo(irank(1))=foo(irank(1))-sum(foo)+statedels(i); % actual rule
end
if sum(foo)<statedels(i)
foo(irank(1))=foo(irank(1))+sum(foo)-statedels(i); % actual rule
end
case 6 % Alabama
if maxpct(i)>50
foo(irank(1))=statedels(i);
else
above=find(statewide(i,:)>20);
abovepct=sum(statewide(i,above));
foo(above)=round(statewide(i,above)*statedels(i)/abovepct);
end
case 7 % Arkansas
above=find(statewide(i,:)>15);
foo(above)=1;
if maxpct(i)>50
foo(irank(1))=foo(irank(1))+statedels(i)-1;
else
abovepct=sum(statewide(i,above));
foo(above)=foo(above)+round(statewide(i,above)*statedels(i)/abovepct);
end
case 8 % Georgia
if maxpct(i)>50
foo(irank(1))=statedels(i);
else
above=find(statewide(i,:)>20);
if length(above)==0
above=find(statewide(i,:)>15);
end
if length(above)==0
above=find(statewide(i,:)>10);
end
if length(above)==0
above=[1:length(candidatemeans)];
end
abovepct=sum(statewide(i,above));
foo(above)=round(statewide(i,above)*statedels(i)/abovepct);
end
case 9 % Massachusetts
above=find(statewide(i,:)>5);
if isempty(above)
above=[1:length(candidatemeans)];
end
ilast = irank(length(above));
abovepct=sum(statewide(i,above));
foo(above)=foo(above)+round(statewide(i,above)*statedels(i)/abovepct);
while sum(foo)~=statedels(i)
if sum(foo)>statedels(i)
foo(ilast)=foo(ilast)-1;
end
if sum(foo)<statedels(i)
foo(irank(1))=foo(irank(1))+1;
end
end
case 10 % Minnesota
if maxpct(i)>85
foo(irank(1))=statedels(i);
else
above=find(statewide(i,:)>10);
if isempty(above)
above=1:length(candidatemeans);
end
abovepct=sum(statewide(i,above));
j=1;
while and(sum(foo)<statedels(i),j<=length(above))
foo(irank(j))=round(statewide(i,irank(j))*statedels(i)/abovepct);
j=j+1;
end
while sum(foo)>statedels(i)
foo(irank(j-1))=foo(irank(j-1))-1;
end
end
case 11 % Oklahoma
if maxpct(i)>50
foo(irank(1))=statedels(i);
else
above=find(statewide(i,:)>15);
if isempty(above)
above=1:length(candidatemeans);
end
abovepct=sum(statewide(i,above));
foo(above)=round(statewide(i,above)*statedels(i)/abovepct);
end
case 12 % Tennessee
if maxpct(i)>66.7
foo(irank(1))=statedels(i);
else
above=find(statewide(i,:)>20);
if isempty(above)
above=1:length(candidatemeans);
end
abovepct=sum(statewide(i,above));
foo(above)=round(statewide(i,above)*statedels(i)/abovepct);
end
case 13 % Texas
if maxpct(i)>50
foo(irank(1))=statedels(i);
else
above=find(statewide(i,:)>20);
if isempty(above)
above=1:length(candidatemeans);
end
if length(above)==1
above=irank(1:2);
end
abovepct=sum(statewide(i,above));
foo(above)=round(statewide(i,above)*statedels(i)/abovepct);
end
case 14 % Vermont
if maxpct(i)>50
foo(irank(1))=statedels(i);
else
above=find(statewide(i,:)>20);
if length(above)==0
above=find(statewide(i,:)>15);
end
if length(above)==0
above=find(statewide(i,:)>10);
end
if length(above)==0
above=1:length(candidatemeans);
end
abovepct=sum(statewide(i,above));
foo(above)=round(statewide(i,above)*statedels(i)/abovepct);
while sum(foo)-statedels(i)~=0
ilast = irank(length(above));
if sum(foo)>statedels(i)
if foo(ilast)>0
foo(ilast)=foo(ilast)-1;
else
foo(irank(1))=foo(irank(1))-1;
end
end
if sum(foo)<statedels(i)
foo(irank(1))=foo(irank(1))+1;
end
end
end
case 15 % Virginia
foo=round(statewide(i,:)*statedels(i)/100);
otherwise
end
% now a kludge to make sure the total number is correct
while sum(foo)>statedels(i)
foo(irank(1))=foo(irank(1))-1;
end
while sum(foo)<statedels(i)
foo(irank(1))=foo(irank(1))+1;
end
% this is in place of implementing the actual rounding rules
delegate_state=delegate_state+foo;
end
% [delegate_state round(delegate_state/sum(delegate_state)*100)]