X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=compute-scottish-stv;h=57ff8a87f2fa5578403cca323d60766036aae648;hb=713371c66a17509427438ad9fe7e30ad54cf227e;hp=6fde10308b409753d9f877e1df709300d2558fa3;hpb=a4f2fc687bb9e16c33a59619acafe2cc21833ee1;p=appendix-a6.git diff --git a/compute-scottish-stv b/compute-scottish-stv index 6fde103..57ff8a8 100755 --- a/compute-scottish-stv +++ b/compute-scottish-stv @@ -155,9 +155,13 @@ sub countballots () { next if $c->{NonCont}; $c->{Total} = 0; $c->{Total} += $_->{Weight} foreach @{ $c->{Votes} }; - prf "candidate %-10s: %10s votes\n", $cand, $c->{Total}; $c->{History}[$stage-1] = $c->{Total}; } + + foreach my $c (reverse sort total_history_cmp + grep { !$_->{NonCont} } values %cands) { + prf "candidate %-10s: %10s votes\n", $c->{Cand}, $c->{Total}; + } } sub computequota () { @@ -170,13 +174,15 @@ sub computequota () { sub total_history_cmp () { my $ha = $a->{History}; my $hb = $b->{History}; + my $m = "stage $stage history cmp $a->{Cand} $b->{Cand}"; + print DEBUG "$m...\n"; foreach my $s (reverse 0 .. $stage-1) { my $d = $ha->[$s] <=> $hb->[$s]; next unless $d; - print DEBUG "history cmp $a->{Cand} $b->{Cand}". - " => $d (#$s $ha->[$s] $hb->[$s])\n"; + print DEBUG "$m => $d (#$s $ha->[$s] $hb->[$s])\n"; return $d; } + print DEBUG "$m => 0\n"; return 0; } @@ -205,13 +211,14 @@ sub select_best_worst ($$$$) { for (;;) { my $nextc = $maybe[$nequal]; + last unless $nextc; # Only interested in those who compare equal according to the # history (SLGEO 49(2)); NB our history includes the current # round. last if $signum*($a = $maybe[0], $b = $nextc, total_history_cmp) > 0; - $nextc++; + $nequal++; } if ($nequal > 1 && !$wanttiebreak->($maybe[0]{Total})) { @@ -244,15 +251,13 @@ sub elect_core ($) { $c->{NonCont} = 'Elected'; } -$stage = 1; - -sortballots @allvotes; -countballots(); -computequota(); +$stage = 0; for (;;) { $stage++; + sortballots @allvotes if $stage == 1; + my $seats_remain = $seats - grep { ($_->{NonCont} // '') eq 'Elected' } values %cands; if (continuing() <= $seats_remain) { @@ -265,6 +270,8 @@ for (;;) { countballots(); + computequota if $stage == 1; + my $c = select_best_worst sub { $_->{Total} >= $quota }, sub { $_ > $quota }, @@ -319,7 +326,7 @@ for (;;) { -1, 'eliminating'; if ($c) { - prf "=== eliminating %s (%s) ===\n", $c->{Cand}, $c->{Desc}; + prf "=== eliminating %s \`%s' ===\n", $c->{Cand}, $c->{Desc}; $c->{NonCont} = 'Eliminated'; next; }