X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=appendix-a6.git;a=blobdiff_plain;f=parse;fp=parse;h=53771ce8896e81710192587a8f21ff8507556219;hp=13fe2f23395fabb16bb0a9b15d3bc6496f9454ea;hb=6f2883e49dc9d30693b5bd20e24aa69e0db1f33c;hpb=454c5cdcf27ce0ac28aa9f62585387139690c779 diff --git a/parse b/parse index 13fe2f2..53771ce 100755 --- a/parse +++ b/parse @@ -12,7 +12,8 @@ binmode STDERR, 'encoding(UTF-8)'; our @choices; our %choices; -our @invotes; +our @invotes_v; +our @invotes_cc; our $defcho; our $quorum = 0; @@ -37,7 +38,9 @@ while (<>) { $defcho = $cho; } } elsif (m/^V:\s+(\S+)\s+(\S.*)/) { - push @invotes, [ $1, $2 ]; + push @invotes_v, [ $1, $2 ]; + } elsif (m/^(\S+)\s*\:\:\s*/) { + push @invotes_cc, [ $1, "$'" ]; } elsif (m/^quorum = ([0-9.]+)$/) { $quorum = $1+0.0; } else { @@ -60,7 +63,47 @@ our @vab; print "\nPreference matrix\n"; -foreach my $iv (@invotes) { +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)"); + } +} + +foreach my $iv (@invotes_cc) { + my ($voter) = $iv->[0]; + $_ = uc $iv->[1]; + + s/\t/ /g; + s/\,/ /g; + while (s{\(([^()]+)\)}{ + my $x = $1; $x =~ s/[ =]+/=/g; $x; + }ge) { } + s/[ =]*=[ =*]/=/g; + s/\s+/ /g; + print "# normalised $_ ($voter)\n"; + + my @ranks = (1000,) x @choices; + my $rank = 1; + foreach (split /\s+/) { + foreach (split /=/) { + my $cho = $choices{$_}; + $cho or die "unknown option $_ ($voter)"; + my $ix = $cho->{Index}; + $ranks[$ix] = $rank; + } + $rank++; + } + my $vstr = join '', map { + $_ == 1000 ? "-" : + $_ < 10 ? (sprintf "%d", $_) : + $_ < 36 ? (chr(ord('A') + $_ - 10)) : die + } @ranks; + print "V: $vstr $voter\n"; + push @invotes_v, [ $vstr, $voter ]; +} + +foreach my $iv (@invotes_v) { my ($votestr,$voter) = @$iv; eval { length $votestr eq @choices or die "wrong vote vector length"; @@ -164,26 +207,29 @@ foreach my $ia (chremain()) { next unless $vab > $vba; my $diff = $vab - $vba; print "defeat: $choices[$ia] beats $choices[$ib]", - " ($vab > $vba: $diff)\n"; + " ($vab > $vba = +$diff)\n"; $defeats->add_edge($choices[$ia],$choices[$ib]); } } sub chvab ($$) { my ($ca,$cb) = @_; +print " [chvab($ca,$cb)="; my $v = $vab[ $choices{$ca}{Index} ][ $choices{$cb}{Index} ]; +printf "%d]", scalar @$v; return scalar @$v; } sub weaker ($$) { # A.6(7)(1) my ($def1,$def2) = @_; +print "@$def1 <=WEAKER?=> @$def2 "; my ($ca,$cx) = @$def1; - my ($cb,$cy) = @$def1; - return 1 if chvab($ca, $cx) < chvab($cb, $cy); - return 1 if chvab($ca, $cx) == chvab($cb, $cy) - && chvab($cx, $ca) > chvab($cy, $cb); - return 0; + my ($cb,$cy) = @$def2; + ((print "Y1\n"), return 1) if chvab($ca, $cx) < chvab($cb, $cy); + ((print "Y2\n"), return 1) if chvab($ca, $cx) == chvab($cb, $cy) + && chvab($cx, $ca) > chvab($cy, $cb); + ((print "N\n"), return 0); } our $schwartz; @@ -213,6 +259,8 @@ for (;;) { } } + print "set: ", (join " ", $schwartz->vertices()), "\n"; + print "\nDropping weakest defeats A.6(7)\n"; our @weakest = ();