From aa069a875fec88c112476ab75448df55b2c93a66 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 2 Feb 2014 22:23:25 +0000 Subject: [PATCH] better msgs and default handling --- compute | 95 +++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 65 insertions(+), 30 deletions(-) diff --git a/compute b/compute index 222c40f..45076cd 100755 --- a/compute +++ b/compute @@ -1,4 +1,12 @@ #!/usr/bin/perl -w +# +# parses some input about ballots and computes the result according +# to Debian Constitution A.6. +# +# usage: .../compute [...] +# +# + use strict; use utf8; use autodie; @@ -19,7 +27,9 @@ our $quorum = 0; sub addchoice { my $choname = shift @_; - my $cho = $choices{$choname} = { @_, Index => (scalar @choices) }; + my $cho = $choices{$choname} = { + @_, Index => (scalar @choices) + }; push @choices, $choname; return $cho; } @@ -43,30 +53,28 @@ while (<>) { push @invotes_cc, [ $1, "$'" ]; } elsif (m/^quorum = ([0-9.]+)$/) { $quorum = $1+0.0; + } elsif (m/^nodefault$/) { + $defcho = { Index => -1 } } else { die "invalid input"; } } -$defcho ||= $choices{FD}; -if (!$defcho) { - $defcho = addchoice('FD', Desc => "Further Discussion"); -} -my $defi = $defcho->{Index}; -die "FD has smaj?!" if $defcho->{Smaj}; - our @vab; # $vab[$ia][$ib] = V(A,B) # Actually, it's a list of voters who prefer A to B (A.6(3)(1)) # Go through the voters and construct V(A,B) -print "\nPreference matrix\n"; +print "\nParsing \`simple' style ballots\n"; +# actually, we pre-parse them into @invotes_v +# since we want to show them as a tally sheet anyway foreach my $iv (@invotes_cc) { $_ = uc $iv->[1]; foreach my $chn (m/\b\w+\b/g) { - $choices{$chn} or addchoice($chn, Desc => "($chn from voter ballot)"); + next if $choices{$chn}; + addchoice($chn, Desc => "($chn from voter ballot)"); } } @@ -88,7 +96,7 @@ foreach my $iv (@invotes_cc) { foreach (split /\s+/) { foreach (split /=/) { my $cho = $choices{$_}; - $cho or die "unknown option $_ ($voter)"; + $cho or die "unknown choice $_ ($voter)"; my $ix = $cho->{Index}; $ranks[$ix] = $rank; } @@ -103,6 +111,29 @@ foreach my $iv (@invotes_cc) { push @invotes_v, [ $vstr, $voter ]; } +print "\nDetermining default option\n"; + +if ($defcho && $defcho->{Index} > -1) { + print "default option was specified: $choices[$defcho->{Index}]\n"; +} elsif ($defcho) { + print "no default option\n"; +} else { + foreach my $try (qw(FD SQ NOTA)) { + $defcho = $choices{$try}; + last if $defcho; + } + if ($defcho) { + print "guessed default option was: $choices[$defcho->{Index}]\n"; + } else { + print "could not guess default option, assuming there is none\n"; + } +} + +my $defi = $defcho->{Index}; +die "FD has smaj?!" if $defcho->{Smaj}; + +print "\nParsing devotee tally sheet ballots\n"; + foreach my $iv (@invotes_v) { my ($votestr,$voter) = @$iv; eval { @@ -130,6 +161,8 @@ foreach my $iv (@invotes_v) { die "voter $voter $@" if $@; } +print "\nPreference matrix\n"; + our @ch = map { $choices{$_} } @choices; # Print the counts V(A,B) @@ -168,27 +201,29 @@ sub drop ($$) { $ch[$i]{Dropped} = $why; } -print "\nQuorum A.6(2) (quorum is $quorum)\n"; +if (defined $defi) { + print "\nQuorum A.6(2) (quorum is $quorum)\n"; -foreach my $i (0..$#choices) { - next if $ch[$i]{Dropped}; - next if $i == $defi; - my $v = $vab[$i][$defi]; - next if $v >= $quorum; - drop $i, "quorum ($v < $quorum)"; -} + foreach my $i (0..$#choices) { + next if $ch[$i]{Dropped}; + next if $i == $defi; + my $v = $vab[$i][$defi]; + next if $v >= $quorum; + drop $i, "quorum ($v < $quorum)"; + } -print "\nMajority ratio A.6(3)\n"; - -foreach my $i (0..$#choices) { - next if $ch[$i]{Dropped}; - next if $i == $defi; - my $majr = $ch[$i]{Smaj}; - $majr ||= [1,1]; # A.6(3)(3) - my $vad = scalar @{ $vab[$i][$defi] }; - my $vda = scalar @{ $vab[$defi][$i] }; - next if $vad * $majr->[1] > $vda * $majr->[0]; - drop $i, "majority ratio ($vad * $majr->[1] <= $vda * $majr->[0])"; + print "\nMajority ratio A.6(3)\n"; + + foreach my $i (0..$#choices) { + next if $ch[$i]{Dropped}; + next if $i == $defi; + my $majr = $ch[$i]{Smaj}; + $majr ||= [1,1]; # A.6(3)(3) + my $vad = scalar @{ $vab[$i][$defi] }; + my $vda = scalar @{ $vab[$defi][$i] }; + next if $vad * $majr->[1] > $vda * $majr->[0]; + drop $i, "majority ratio ($vad * $majr->[1] <= $vda * $majr->[0])"; + } } print "\nDefeats A.6(4)\n"; -- 2.30.2