From 2eaee49e874572d17f6682d10abc737f00c38e1c Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 2 Feb 2014 20:40:14 +0000 Subject: [PATCH] seems to work --- parse | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/parse b/parse index c04d33b..adb3d7d 100755 --- a/parse +++ b/parse @@ -147,10 +147,15 @@ foreach my $i (0..$#choices) { my $defeats = Graph::Directed->new; # A.6(4) -foreach my $ia (0..$#ch) { - foreach my $ib (0..$#ch) { - my $vab = $vab[$ia][$ib]; - my $vba = $vab[$ib][$ia]; +sub chremain () { + return grep { !$ch[$_]{Dropped} } (0..$#ch); +} + +foreach my $ia (chremain()) { + $defeats->add_vertex($ia); + foreach my $ib (chremain()) { + my $vab = scalar @{ $vab[$ia][$ib] }; + my $vba = scalar @{ $vab[$ib][$ia] }; next unless $vab > $vba; print "defeat: $choices[$ia] beats $choices[$ib] ($vab > $vba)\n"; $defeats->add_vertex($ia,$ib); @@ -168,6 +173,8 @@ sub weaker ($$) { return 0; } +print "defeats graph: $defeats\n"; + our $schwartz; for (;;) { @@ -177,14 +184,16 @@ for (;;) { my $tdefeats = $defeats->transitive_closure(); - print "# schwartz set A.6(6)\n"; + print "closure graph: $tdefeats\n"; + + print "# Schwartz set A.6(6)\n"; $schwartz = $defeats->copy(); - foreach my $ia (0..$#ch) { - foreach my $ib (0..$#ch) { - next if $tdefeats->has_edge($ia,$b); - next if !$tdefeats->has_edge($b,$ia); + foreach my $ia (chremain()) { + foreach my $ib (chremain()) { + next if $tdefeats->has_edge($ia,$ib); + next if !$tdefeats->has_edge($ib,$ia); print "not in Schwartz set: $choices[$ia] because $choices[$ib]\n"; $schwartz->delete_vertex($ia); last; @@ -195,7 +204,7 @@ for (;;) { our @weakest = (); - foreach my $edge (@{ $schwartz->edges() }) { + foreach my $edge ($schwartz->edges()) { if (!@weakest) { # no weakest edges yet } elsif (weaker($edge, $weakest[0])) { @@ -213,8 +222,8 @@ for (;;) { last unless @weakest; printf "weakest defeats %d > %d", - (scalar @{ $vab[$_->[0]][$_->[1]]) }, - (scalar @{ $vab[$_->[1]][$_->[0]]) }; + (scalar @{ $vab[$_->[0]][$_->[1]] }), + (scalar @{ $vab[$_->[1]][$_->[0]] }); foreach my $weakest (@weakest) { my ($ia,$ib) = @$weakest; print "weakest defeat $choices[$ia] > $choices[$ib]\n"; @@ -227,7 +236,8 @@ for (;;) { print "# no defeats within the Schwartz set\n"; print "FINAL SCHWARTZ SET:\n"; -print $choices[$_] foreach (@{ $schwartz->nodes() }); +printf " %-5s %s\n", $choices[$_], $ch[$_]{Desc} + foreach ($schwartz->vertices()); print ".\n"; -- 2.30.2