X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=appendix-a6.git;a=blobdiff_plain;f=compute;h=bd9ed7c6ab9e0b01d9a89f4cdcff95eed7ec6c07;hp=4021eb7db6c56537ca59f7b69449a643bc4cc83f;hb=6f5838e665e31aa6d3e1216eb6e29884254b0f5a;hpb=fbc40601bc45c332b834d0c2d95f9cc57936eeb4 diff --git a/compute b/compute index 4021eb7..bd9ed7c 100755 --- a/compute +++ b/compute @@ -203,7 +203,7 @@ foreach my $iv (@invotes_v) { my $vchr = $vs[$ix]; if ($vchr eq '-') { $vs[$ix] = 1000; - } elsif ($vchr =~ m/[0-9a-z]/) { + } elsif ($vchr =~ m/[0-9A-Z]/) { $vs[$ix] = ord($vchr); } else { die "bad vote char"; @@ -294,9 +294,9 @@ sub chremain () { return grep { !$ch[$_]{Dropped} } (0..$#ch); } -foreach my $ia (chremain()) { +foreach my $ia (0..$#ch) { $defeats->add_vertex($choices[$ia]); - foreach my $ib (chremain()) { + foreach my $ib (0..$#ch) { my $vab = scalar @{ $vab[$ia][$ib] }; my $vba = scalar @{ $vab[$ib][$ia] }; next unless $vab > $vba; @@ -304,6 +304,13 @@ foreach my $ia (chremain()) { print "defeat: $choices[$ia] beats $choices[$ib]", " ($vab > $vba = +$diff)\n"; $defeats->add_edge($choices[$ia],$choices[$ib]); + my $label = "$diff($vab:$vba)"; + if (@invotes_v < 10) { + $label .= "\n". join ' ', @{ $vab[$ia][$ib] }; + $label .= "\n/". join ' ', @{ $vab[$ib][$ia] }; + } + $defeats->set_edge_attribute($choices[$ia],$choices[$ib], + label => $label); } } @@ -326,14 +333,20 @@ sub weaker ($$) { our $showg = $defeats->deep_copy(); +foreach my $ix (0..$#ch) { + my $cho = $ch[$ix]; + next unless $cho->{Dropped}; + $defeats->delete_vertex($choices[$ix]); +} + our $schwartz; -for (;;) { +for (my $dropiter = 1; ; $dropiter++) { # loop from A6(5) print "defeats graph: $defeats\n"; - print "\nTransitive closure A.6(5)\n"; + print "\nTransitive closure A.6(5) (iteration $dropiter)\n"; my $tdefeats = $defeats->transitive_closure(); @@ -389,6 +402,11 @@ for (;;) { my ($ca,$cb) = @$weakest; print "a weakest defeat is $ca > $cb\n"; $defeats->delete_edge($ca,$cb); + my $label = $showg->get_edge_attribute($ca,$cb,'label'); + $label .= "\ndropped - weakest in iter.$dropiter"; + $showg->set_edge_attribute($ca,$cb,'label',$label); + $showg->set_edge_attribute($ca,$cb,'style','dotted'); + $showg->set_edge_attribute($ca,$cb,'graphviz',{constraint=>0}); } print "\nDefeats within the Schwartz set, go round again\n"; @@ -397,10 +415,13 @@ for (;;) { print "no defeats within the Schwartz set\n"; print "final schwartz set:\n\n"; +my $winxlabel; if ($schwartz->vertices() == 1) { print "WINNER IS:\n"; + $winxlabel = "winner"; } else { print "WINNER IS ONE OF (CASTING VOTE DECIDES):\n"; + $winxlabel = "potential winner"; } printf " %-5s %s\n", $_, $choices{$_}{Desc} @@ -409,10 +430,13 @@ printf " %-5s %s\n", $_, $choices{$_}{Desc} if (defined $gfile) { foreach my $cho (values %choices) { my $chn = $choices[$cho->{Index}]; - my $label = "\\N\n$cho->{Desc}"; + my $label = "$chn\n$cho->{Desc}"; if ($cho->{Dropped}) { $label .= "\nDropped: $cho->{Dropped}"; } + if ($schwartz->has_vertex($chn)) { + $label .= "\n$winxlabel"; + } $showg->set_vertex_attribute($chn, 'label', $label); }