From: Ian Jackson Date: Sun, 21 Aug 2016 20:37:27 +0000 (+0100) Subject: compute-scottish-stv: fixes X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=appendix-a6.git;a=commitdiff_plain;h=5fc4bc0993f2f2dc97c43217b3c0bfc51cdf9415 compute-scottish-stv: fixes --- diff --git a/compute-scottish-stv b/compute-scottish-stv index 57ff8a8..d92db96 100755 --- a/compute-scottish-stv +++ b/compute-scottish-stv @@ -35,15 +35,25 @@ our %tie; open DEBUG, ">.compute.log" or die $!; DEBUG->autoflush(1); -$SIG{__WARN__} = sub { +sub debug_dump () { print DEBUG Dumper(\%tie, \@non_transferable, \%cands, \@allvotes, $stage, $quota); +} + +$SIG{__WARN__} = sub { + $SIG{__DIE__} = undef; + debug_dump; confess $_[0]; }; +$SIG{__DIE__} = sub { + debug_dump; + die $_[0]; +}; + sub unkopt ($$) { my ($what,$opt) = @_; if ($opt =~ m/^[A-Z]/) { @@ -98,6 +108,7 @@ for (;;) { $cands{$_}{Cand} = $_ foreach keys %cands; $_->{Weight} //= 1/1 foreach @allvotes; $_->{TransferredSurplus} //= [ ] foreach @allvotes; +$_->{OrigPrefs} //= [ @{ $_->{Prefs} } ] foreach @allvotes; sub votelog ($$) { my ($vote,$m) = @_; @@ -111,6 +122,7 @@ sub sortballots (@) { # Strips that first preference from the ballot. # If the first preference has been eliminated, strips it # and looks for further preferences. + print DEBUG "sortballots ".(scalar @_)."...\n"; foreach my $v (@_) { my $firstprefs = shift @{ $v->{Prefs} }; my $w = $v->{Weight}; @@ -150,11 +162,11 @@ sub prf { } sub countballots () { - foreach my $cand (sort keys %cands) { - my $c = $cands{$cand}; + foreach my $c (values %cands) { next if $c->{NonCont}; - $c->{Total} = 0; + $c->{Total} = 0/1; $c->{Total} += $_->{Weight} foreach @{ $c->{Votes} }; + print DEBUG "counted $c->{Cand} $c->{Total}\n"; $c->{History}[$stage-1] = $c->{Total}; } @@ -165,7 +177,7 @@ sub countballots () { } sub computequota () { - my $totalvalid = 0; + my $totalvalid = 0/1; $totalvalid += $_->{Total} foreach values %cands; $quota = ($totalvalid / (1 + $seats)) -> bfloor(); prf "quota %10s\n", $quota; @@ -284,7 +296,7 @@ for (;;) { # SLGEO 48 my $surplus = $c->{Total} - $quota; - if ($surplus <= 0) { + if ($surplus <= 0/1) { prf "no surplus\n"; next; } @@ -313,8 +325,9 @@ for (;;) { prf "transfer value of ballots %s: %10s\n", "@$previously", $xfervalue; } - sortballots $v; } + sortballots @{ $c->{Votes} }; + $c->{Votes} = { }; # will crash if we access it again next; } @@ -328,6 +341,8 @@ for (;;) { if ($c) { prf "=== eliminating %s \`%s' ===\n", $c->{Cand}, $c->{Desc}; $c->{NonCont} = 'Eliminated'; + + sortballots @{ $c->{Votes} }; next; }