7 binmode STDIN, 'encoding(UTF-8)' or die;
8 binmode STDOUT, 'encoding(UTF-8)' or die;
9 binmode STDERR, 'encoding(UTF-8)' or die;
18 my $choname = shift @_;
19 my $cho = $choices{$choname} = { @_, Index => (scalar @choices) };
20 push @choices, $choname;
28 if (m/^([A-Z]+)\s*\=\s*(\S.*)$/) {
29 my ($choname, $desc) = ($1,$2);
30 my $cho = addchoice($choname, Desc => $desc);
31 if ($desc =~ m/\[(\d+):(\d+)\]/) {
32 $cho->{Smaj} = [$1,$2];
33 } elsif ($desc =~ m/\[default\]/) {
36 } elsif (m/^V:\s+(\S+)\s+(\S.*)/) {
37 push @invotes, [ $1, $2 ];
38 } elsif (m/^quorum = ([0-9.]+)$/) {
45 $defcho ||= $choices{FD};
47 $defcho = addchoice('FD', Desc => "Further Discussion");
49 my $defi = $defcho->{Index};
50 die "FD has smaj?!" if $defcho->{Smaj};
52 our @vab; # $vab[$ia][$ib] = V(A,B)
54 foreach my $iv (@invotes) {
55 my ($votestr,$voter) = @$iv;
57 length $votestr eq @choices or die "wrong vote vector length";
58 my @vs = split //, $votestr;
59 foreach my $ix (0..$#vs) {
63 } elsif ($vchr =~ m/[0-9a-z]/) {
64 $vs[$ix] = ord($vchr);
69 foreach my $ia (0..$#vs) {
70 foreach my $ib ($ia+1..$#vs) {
73 if ($va < $vb) { push @{ $vab[$ia][$ib] }, $voter }
74 elsif ($vb < $va) { push @{ $vab[$ib][$ia] }, $voter }
78 die "voter $voter $@" if $@;
81 our @ch = map { $choices{$_} } @choices;
83 foreach my $iy (-2..$#ch) {
84 foreach my $ix (-2..$#ch) {
89 printf "------" or die;
93 } elsif ($ix==-2 && $iy==-2) {
94 printf "V(Y,X)" or die;
96 printf "%5s ", $choices[$ix] or die $!;
98 printf "%5s ", $choices[$iy] or die $!;
100 my $v = \( $vab[$iy][$ix] );
103 printf "%5d ", (scalar @$$v) or die $!;
105 printf "%5s ", "" or die $!;
109 printf "\n" or die $!;
114 print "dropping $choices[$i]: $why\n";
115 $ch[$i]{Dropped} = $why;
118 print "# quorum\n" or die;
120 foreach my $i (0..$#choices) {
121 next if $ch[$i]{Dropped};
123 my $v = $vab[$i][$defi];
124 next if $v >= $quorum;
125 drop $i, "quorum ($v < $quorum)";
128 print "# maj. ratio\n" or die;
130 foreach my $i (0..$#choices) {
131 next if $ch[$i]{Dropped};
133 my $majr = $ch[$i]{Smaj};
135 my $vad = scalar @{ $vab[$i][$defi] };
136 my $vda = scalar @{ $vab[$defi][$i] };
137 next if $vad * $majr->[1] > $vda * $majr->[0];
138 drop $i, "majority ratio ($vad * $majr->[1] <= $vda * $majr->[0])";