From b4beaca8bc1df0b298884292d64ec4448c1ce0c3 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 2 Feb 2014 18:37:39 +0000 Subject: [PATCH] wip --- parse | 49 ++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/parse b/parse index c9ebc34..8828dee 100755 --- a/parse +++ b/parse @@ -12,6 +12,7 @@ our @choices; our %choices; our @invotes; our $defcho; +our $quorum = 0; sub addchoice { my $choname = shift @_; @@ -34,6 +35,8 @@ while (<>) { } } elsif (m/^V:\s+(\S+)\s+(\S.*)/) { push @invotes, [ $1, $2 ]; + } elsif (m/^quorum = ([0-9.]+)$/) { + $quorum = $1+0.0; } else { die "invalid input"; } @@ -67,16 +70,18 @@ foreach my $iv (@invotes) { foreach my $ib ($ia+1..$#vs) { my $va = $vs[$ia]; my $vb = $vs[$ib]; - if ($va < $vb) { $vab[$ia][$ib]++; } - elsif ($vb < $va) { $vab[$ib][$ia]++; } + if ($va < $vb) { push @{ $vab[$ia][$ib] }, $voter } + elsif ($vb < $va) { push @{ $vab[$ib][$ia] }, $voter } } } }; die "voter $voter $@" if $@; } -foreach my $iy (-2..$#choices) { - foreach my $ix (-2..$#choices) { +our @ch = map { $choices{$_} } @choices; + +foreach my $iy (-2..$#ch) { + foreach my $ix (-2..$#ch) { if ($iy==-1) { if ($ix==-1) { printf "+" or die; @@ -93,9 +98,9 @@ foreach my $iy (-2..$#choices) { printf "%5s ", $choices[$iy] or die $!; } else { my $v = \( $vab[$iy][$ix] ); - $$v += 0; - if ($$v) { - printf "%5d ", $$v or die $!; + $$v ||= [ ]; + if (@$$v) { + printf "%5d ", (scalar @$$v) or die $!; } else { printf "%5s ", "" or die $!; } @@ -104,5 +109,35 @@ foreach my $iy (-2..$#choices) { printf "\n" or die $!; } +sub drop ($$) { + my ($i,$why) = @_; + print "dropping $choices[$i]: $why\n"; + $ch[$i]{Dropped} = $why; +} + +print "# quorum\n" or die; + +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 "# maj. ratio\n" or die; + +foreach my $i (0..$#choices) { + next if $ch[$i]{Dropped}; + next if $i == $defi; + my $majr = $ch[$i]{Smaj}; + $majr ||= [1,1]; + 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])"; +} + + #p %choices; #p @vab; -- 2.30.2