[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[gnugo-devel] trevor_1_14.1
From: |
Trevor Morris |
Subject: |
[gnugo-devel] trevor_1_14.1 |
Date: |
Wed, 07 Nov 2001 12:36:07 -0500 |
http://www.public32.com/games/go/trevor_1_14.1
- regression view includes node counts, SGF link, and -t output.
- GTP echo_err added to allow echoing to STDERR.
- owl tuning.
The "-t" output is most cool.
Here's a preview:
http://www.public32.com/regtest/?trevor:200
After this gets into CVS, I'll run another regression, so the trace
information will be available in the usual place.
Index: interface/play_gtp.c
===================================================================
RCS file: /cvsroot/gnugo/gnugo/interface/play_gtp.c,v
retrieving revision 1.41
diff -u -b -r1.41 play_gtp.c
--- interface/play_gtp.c 2001/11/07 05:41:30 1.41
+++ interface/play_gtp.c 2001/11/07 17:30:43
@@ -82,6 +82,7 @@
DECLARE(gtp_dragon_stones);
DECLARE(gtp_dump_stack);
DECLARE(gtp_echo);
+DECLARE(gtp_echo_err);
DECLARE(gtp_eval_eye);
DECLARE(gtp_final_score);
DECLARE(gtp_final_status);
@@ -157,6 +158,7 @@
{"dragon_stones", gtp_dragon_stones},
{"dump_stack", gtp_dump_stack},
{"echo" , gtp_echo},
+ {"echo_err" , gtp_echo_err},
{"estimate_score", gtp_estimate_score},
{"eval_eye", gtp_eval_eye},
{"final_score", gtp_final_score},
@@ -285,6 +287,8 @@
}
+
+
/* Function: Report the version number of the program.
* Arguments: none
* Fails: never
@@ -2299,6 +2303,19 @@
{
return gtp_success(id, "%s", s);
}
+
+
+/* Function: Echo the parameter to stdout AND stderr
+ * Arguments: string
+ * Fails: never
+ * Returns: nothing
+ */
+static int
+gtp_echo_err(char *s, int id)
+{
+ fprintf(stderr, "%s", s);
+ return gtp_success(id, "%s", s);
+}
/* Function: List all known commands
* Arguments: none
Index: patterns/owl_defendpats.db
===================================================================
RCS file: /cvsroot/gnugo/gnugo/patterns/owl_defendpats.db,v
retrieving revision 1.21
diff -u -b -r1.21 owl_defendpats.db
--- patterns/owl_defendpats.db 2001/11/06 16:36:51 1.21
+++ patterns/owl_defendpats.db 2001/11/07 17:30:50
@@ -699,6 +699,20 @@
:8,-,value(80)
+# new pattern (3.1.14) trevor
+# see trevor:401
+# Possible to sacrifice to gain tempo here.
+Pattern D217c
+
+O.X? expand eye-space
+O.*.
+.x..
+
+:8,s,value(10)
+
+
+
+
Pattern D218
xx...X. slide (usually inferior to play on third line)
@@ -1941,6 +1955,21 @@
; !x_somewhere(a) || !x_somewhere(b)
+
+
+# new pattern (3.1.14) trevor
+# Needed in trevor:403
+
+Pattern D624
+
+O.?? Block on first line to make eye.
+O.OX
+ox*?
+
+:8,-,value(40)
+
+
+
#########################################################
# #
# Make eyeshape in the center #
@@ -3590,6 +3619,34 @@
;owl_escape_value(a)>0
+Pattern D1134
+# tm new pattern (3.1.14)
+# Give a very low value, unless add lots of constraints.
+# See trevor:520.
+
+XXO Cut!
+O*X
+OX.
+?..
+
+:8,-,value(5)
+
+
+Pattern D1135
+# tm new pattern (3.1.14)
+# See trevor:330
+
+O*. connect out, threaten cut
+X.?
+
+:8,-,value(35)
+
+O*a
+cB?
+
+; owl_escape_value(a)>0 &&
+; oplay_attack(*,a,c)
+
########################################################
# #
Index: regression/eval3.sh
===================================================================
RCS file: /cvsroot/gnugo/gnugo/regression/eval3.sh,v
retrieving revision 1.2
diff -u -b -r1.2 eval3.sh
--- regression/eval3.sh 2001/10/28 14:38:17 1.2
+++ regression/eval3.sh 2001/11/07 17:30:50
@@ -1,5 +1,4 @@
#!/bin/sh
nice -n 19 ./regress.pl \
- --goprog "../interface/gnugo.exe --mode gtp --quiet" \
--verbose 1 \
-a 1
Index: regression/regress.pl
===================================================================
RCS file: /cvsroot/gnugo/gnugo/regression/regress.pl,v
retrieving revision 1.8
diff -u -b -r1.8 regress.pl
--- regression/regress.pl 2001/10/30 16:42:00 1.8
+++ regression/regress.pl 2001/11/07 17:30:55
@@ -36,7 +36,6 @@
package REGRESS;
-use IPC::Open2;
use IPC::Open3;
use IO::Handle;
use Getopt::Long;
@@ -47,6 +46,7 @@
use strict;
use warnings;
+use Carp;
STDOUT->autoflush(1);
@@ -84,7 +84,7 @@
"KO_READING", ""
);
-
+my $trace_output="";
my $cur_passed;
my $result;
my $correct_re;
@@ -111,6 +111,7 @@
my $filepos;
my $goprog_in ; # stdin of computer player
my $goprog_out; # stdout of computer player
+my $goprog_err; # stderr of computer player
my $passes;
my $unexpected_pass;
my $failures;
@@ -132,6 +133,9 @@
my @failed_links;
my @FAILED_links;
+my @counters = qw/life_node owl_node reading_node trymove/;
+
+my %counters;
my $next_cmd = "";
my $prev_cmd = "";
@@ -150,6 +154,10 @@
exit;
}
+if (!$goprog) {
+ $goprog = "../interface/gnugo.exe --mode gtp --quiet -t";
+}
+
die $helpstring unless defined $goprog;
@@ -171,20 +179,20 @@
# create FileHandles
$goprog_in = new FileHandle; # stdin of computer player
$goprog_out = new FileHandle; # stdout of computer player
-$pidg = open2($goprog_out, $goprog_in, $goprog);
+$goprog_err = new FileHandle; # stdout of computer player
+print "Go program: $goprog\n" if $verbose > 1;
+$pidg = open3($goprog_in, $goprog_out, $goprog_err, $goprog);
print "goprog pid: $pidg\n" if $verbose > 1;
my ($goprog_exe) = split (" ", $goprog);
$goprog_timestamp = (stat $goprog_exe)->mtime;
go_command("name");
-#print $goprog_in "name\n";
$_ = <$goprog_out>;
if (/^=\s*(.*)/) {
($goprog_name = $1) =~ s/\s*$//;
}
<$goprog_out>;
go_command("version");
-#print $goprog_in "version\n";
$_ = <$goprog_out>;
if (/^=\s*(.*)/) {
($goprog_version = $1) =~ s/\s*$//;
@@ -194,7 +202,7 @@
print "Name: " . $goprog_name ." ". $goprog_version . "\n" if $verbose > 1;
if ($one_gg_process) {
- go_command("quit");#print $goprog_in "quit\n";
+ go_command("quit");
print "waiting\n" if $verbose > 2;
waitpid $pidg, 0;
print "done waiting\n" if $verbose > 2;
@@ -229,16 +237,45 @@
sub regress_file {
+ $testfile = shift;
+ print "$testfile\n" if $verbose;
+
+ foreach (@counters) {
+ go_command("reset_${_}_counter");
+ eat();
+ }
+
+ -e "html" or mkdir "html" or die "Couldn't create html";
+ -e "html/$testfile" or mkdir "html/$testfile" or die "Couldn't create
html/$testfile";
+
+ my $childpid;
unless ($one_gg_process) {
$goprog_in = new FileHandle; # stdin of computer player
$goprog_out = new FileHandle; # stdout of computer player
- $pidg = open2($goprog_out, $goprog_in, $goprog);
+ $goprog_err = new FileHandle; # stderr of computer player
+ $pidg = open3($goprog_in, $goprog_out, $goprog_err, $goprog);
print "goprog pid: $pidg\n" if $verbose > 1;
+ unless ($childpid = fork) {
+ #Child.
+ chdir "html/$testfile" ;
+ open (TRACER, ">tracer.ttt");
+ while (<$goprog_err>) {
+ print TRACER $_;
+ if (/^FINISHED PROBLEM: (.*)/) {
+ close TRACER or die "Couldn't close temp trace file";
+ my $thisgtp = $1;
+ my ($num) = $thisgtp =~ /^(\d+)/ or die "Missing number: $thisgtp";
+ rename "tracer.ttt", "$num.trace"
+ or die "Couldn't rename tracer: $testfile, $num";
+ open (TRACER, ">tracer.ttt");
+ }
+ }
+ close TRACER;
+ exit;
}
+ }
- $testfile = shift;
- print "$testfile\n" if $verbose;
#main bit.
$pidt = open ($testfile_out,"<$testfile");
@@ -257,10 +294,10 @@
$filepos = 0;
go_command("cputime");
$cputime = <$goprog_out>;
- print "cputime: $cputime\n" if $verbose > 1 or 1;
+ print "cputime: $cputime\n" if $verbose > 1;
($cputime) = ($cputime =~ /((\d|\.)+)/);
- print "cputime: $cputime\n" if $verbose > 1 or 1;
<$goprog_out>;
+
my $skipping = 0;
while (defined($next_cmd))
{
@@ -280,6 +317,9 @@
if ($3) { $fail = 1} else { $fail = 0};
if ($4) {$ignore = 1} else {$ignore = 0};
+ go_command("echo_err FINISHED PROBLEM: $prev_cmd\n");
+ eat(); #ignore output!
+
my $old_skipping = $skipping;
$skipping = $numbers && ($num =~ $numbers);
if ($old_skipping) {
@@ -327,9 +367,9 @@
$top_moves = 1;
}
}
- go_command($next_cmd); #print $goprog_in "$next_cmd\n";
+ go_command($next_cmd);
if ($top_moves) {
- $top_moves = eat_move($goprog_out);
+ $top_moves = eat_one();
if ($top_moves) {
($result, $_) = split(/ /, $top_moves, 2);
} else {
@@ -338,7 +378,7 @@
}
print "TopMoves:$top_moves\n" if $verbose > 1;
} else {
- $result = eat_move($goprog_out);
+ $result = eat_one();
if (!defined($result)) {$result="";}
}
print "RES: $result\n" if $verbose > 1;
@@ -365,7 +405,7 @@
. "$unexpected_fail unexpected $fail_string\n";
unless ($one_gg_process) {
- go_command("quit");#print $goprog_in "quit\n";
+ go_command("quit");
print "waiting\n" if $verbose > 2;
waitpid $pidg, 0;
print "done waiting\n" if $verbose > 2;
@@ -404,19 +444,34 @@
$html_whole_gtp =~ /$listval=(.*?)<BR>/;
if (defined($1)) {$astxt = $1;} else {$astxt = "";};
print $brd "<$listval>$astxt</$listval>\n";
+ }
+ print $brd "<COUNTERS ";
+ foreach (@counters) {
+ go_command("get_${_}_counter");
+ my $counts = eat_one();
+ defined($counts) or confess "Missing count";
+ defined($counters{$_}) or confess "Missing counter";
+ my $countdelta = $counts - $counters{$_};
+ $counters{$_} = $counts;
+ print $brd address@hidden $_="$countdelta"@;
}
- print $brd "<NODES owl=123 reading=123>\n";
+ print $brd ">\n";
+
go_command("cputime");
my $new_cputime = <$goprog_out>;
($new_cputime) = ($new_cputime =~ /((\d|\.)+)/);
- print "cputime: ".$new_cputime."\n" if $verbose > 1 or 1;
+ print "cputime: ".$new_cputime."\n" if $verbose > 1;
<$goprog_out>;
- print $brd "<TIME wall=0.123 CPU=" . sprintf("%.5f", $new_cputime -
$cputime) . ">\n";
+ print $brd "<TIME wall=0.0 CPU=" . sprintf("%.5f", $new_cputime -
$cputime) . ">\n";
$cputime = $new_cputime;
print $brd "<GTP_COMMAND>$prev_cmd</GTP_COMMAND>\n";
print $brd $brdout;
+
+ print $brd "<TRACE_OUTPUT>$trace_output</TRACE_OUTPUT>\n";
+ $trace_output= "";
+
print $brd "</GOPROB>\n";
close $brd;
}
@@ -433,11 +488,7 @@
sub eat_board {
go_command("query_boardsize");
- my $line = "";
- while ($line eq "") {
- chop($line = <$goprog_out>) or die "No response!";
- }
- <$goprog_out>;
+ my $line = eat();
(undef, $boardsize) = split(' ', $line, 2);
$boardsize = $boardsize + 0;
my $linesleft = $boardsize + 2;
@@ -665,23 +716,32 @@
}
-sub eat_move {
- my $h = shift;
-# ignore empty lines
+sub eat() {
+ # ignore empty lines
my $line = "";
while ($line eq "") {
- chop($line = <$h>) or die "No response!";
+ chop($line = <$goprog_out>) or die "No response!";
+ $line =~ s/\s*$//smg;
}
- $line =~ s/\s*$//;
- my ($equals, $move) = split(' ', $line, 2);
- $line = <$h>;
+ <$goprog_out>;
+ return $line;
+}
+
+
+sub eat_one {
+ my ($equals, $move) = split(' ', eat(), 2);
return $move;
}
sub go_command {
- $_ = shift;
- print $goprog_in "$_\n";
- print "CMD:$_\n" if $verbose > 1;
+ my $cmd = shift;
+ print $goprog_in "$cmd\n";
+ print "CMD:$cmd\n" if $verbose > 1;
+ foreach (@counters) {
+ if ($cmd =~ /reset_${_}_counter/) {
+ $counters{$_} = 0;
+ }
+ }
}
Index: regression/regress.plx
===================================================================
RCS file: /cvsroot/gnugo/gnugo/regression/regress.plx,v
retrieving revision 1.2
diff -u -b -r1.2 regress.plx
--- regression/regress.plx 2001/11/01 15:14:12 1.2
+++ regression/regress.plx 2001/11/07 17:30:57
@@ -31,6 +31,15 @@
# It is designed to be run as a CGI script.
+
+#BEGIN {
+# use CGI::Carp qw(carpout);
+# my $errfile = "C:/temp/web.err";
+# #open (WEBERR, ">$errfile") or die "Couldn't open $errfile.";
+# carpout(STDOUT);
+#}
+#
+
use strict;
use warnings;
use FindBin;
@@ -38,11 +47,10 @@
use GoImage::Stone;
+#use CGI::Carp;
use CGI qw/:standard/;
-print "Content-type: text/html\n\n";
-
my %colors = ("ALIVE", "green",
"DEAD", "cyan",
"CRITICAL", "red",
@@ -50,16 +58,37 @@
"UNCHECKED", "magenta");
my $query = new CGI;
+my ($tstfile, $num, $sortby, $sgf, $reset, $trace);
-my $tstfile = $query->param("tstfile");
-if ($tstfile && !($tstfile =~ /^[a-zA-Z0-9_]+\.tst$/)) {
- print "bad test file: $tstfile\n";
+($tstfile, $num) = ($query->query_string() =~ /keywords=(.*)%3A(.*)/);
+
+if (!$tstfile) {
+ $tstfile = $query->param("tstfile");
+ $num = $query->param("num");
+ $sortby = $query->param("sortby");
+ $sgf = $query->param("sgf");
+ $reset = $query->param("reset");
+ $trace = $query->param("trace");
}
+
-my $num = $query->param("num");
-my $sortby = $query->param("sortby");
-my $reset = $query->param("reset");
+print "HTTP/1.0 200 OK\r\n";
+print "Content-type: " .
+ do {
+ my $plain = $trace;
+ if ($sgf) { "application/x-go-sgf" }
+ elsif ($plain) { "text/plain" }
+ else {"text/html"; }
+ } . "\r\n\r\n";
+
+if ($tstfile) {
+ $tstfile .= '.tst' if $tstfile !~ /.tst$/;
+}
+if ($tstfile && !($tstfile =~ /^[a-zA-Z0-9_]+\.tst$/)) {
+ print "bad test file: $tstfile\n";
+ exit;
+}
if ($reset) {
unlink glob("html/*.html");
@@ -67,6 +96,19 @@
print "Cleaned up!<HR>\n";
}
+if ($trace) {
+ open (TRACER, "html/$tstfile/$num.trace") or
+ do {print "Couldn't find trace file: $!"; exit;};
+ while (<TRACER>) {
+ print;
+ }
+ close TRACER;
+ exit;
+}
+
+
+
+
my %points;
my %attribs;
@@ -115,7 +157,7 @@
@address@hidden = (0,0,0,0);
foreach my $k1 (sort keys %hha) { #$k1 = filename
- print I qq@<TR>\n <TD><A
href="regress.plx?tstfile=$k1&sortby=result">$k1</A></TD>\n@;
+ print I qq@<TR>\n <TD><A
href="?tstfile=$k1&sortby=result">$k1</A></TD>\n@;
foreach my $k2 (@pflist) {
my $c = 0;
$c = @{$hha{$k1}{$k2}} if $hha{$k1}{$k2};
@@ -123,7 +165,7 @@
if (!($k2 =~ /passed/) and $c) {
print I " <TD>$c:<BR>\n";
foreach (sort {$a<=>$b} @{$hha{$k1}{$k2}}) {
- print I qq@ <A HREF="regress.plx?tstfile=$k1&num=$_">$_</A>\n@;
+ print I qq@ <A HREF="?tstfile=$k1&num=$_">$_</A>\n@;
}
print I " </TD>\n";
} else {
@@ -158,6 +200,7 @@
$_;
}
+my @counters = qw/life_node owl_node reading_node trymove/;
if ($num) {
#CASE 2 - problem detail.
@@ -167,18 +210,41 @@
close FILE;
game_parse($content);
+ if ($sgf) {
+ &sgfFile;
+ exit;
+ }
+
print qq@<HTML><HEAD><TITLE>$tstfile test $attribs{"num"}
details.</TITLE></HEAD>\n@;
print qq@<BODY><TABLE border=1>\n@;
- print qq@<TR><TD>number:</TD><TD>$attribs{"num"}</TD></TR>\n@;
- print qq@<TR><TD>status:</TD><TD>$attribs{"status"}</TD></TR>\n@;
- print qq@<TR><TD>correct:</TD><TD>$attribs{"correct"}</TD></TR>\n@;
- print qq@<TR><TD>answer:</TD><TD>$attribs{"answer"}</TD></TR>\n@;
- print qq@<TR><TD>gtp:</TD><TD>$attribs{"gtp_command"}</TD></TR>\n@;
- print qq@<TR><TD>description:</TD><TD>$attribs{"description"}</TD></TR>\n@;
- print qq@<TR><TD>category:</TD><TD>$attribs{"category"}</TD></TR>\n@;
- print qq@<TR><TD>severity:</TD><TD>$attribs{"severity"}</TD></TR>\n@;
- print qq@</TABLE>\n\n@;
+ print qq@
+ <TR>
+ <TD>number:</TD><TD>$attribs{"num"}</TD><TD> </TD>
+ <TD>cputime:</TD><TD>$attribs{"cputime"}</TD>
+ </TR><TR>
+ <TD>status:</TD><TD>$attribs{"status"}</TD><TD> </TD>
+ <TD>$counters[0]:</TD><TD>$attribs{"$counters[0]_counter"}</TD>
+ <TR>
+ <TD>correct:</TD><TD>$attribs{"correct"}</TD><TD> </TD>
+ <TD>$counters[1]:</TD><TD>$attribs{"$counters[1]_counter"}</TD>
+ <TR>
+ <TD>answer:</TD><TD>$attribs{"answer"}</TD><TD> </TD>
+ <TD>$counters[2]:</TD><TD>$attribs{"$counters[2]_counter"}</TD>
+ <TR>
+ <TD>gtp:</TD><TD>$attribs{"gtp_command"}</TD><TD> </TD>
+ <TD>$counters[3]:</TD><TD>$attribs{"$counters[3]_counter"}</TD>
+ </TR><TR><TD>category:</TD><TD>$attribs{"category"}</TD>
+ </TR><TR><TD>severity:</TD><TD>$attribs{"severity"}</TD>
+ </TR><TR><TD>description:</TD><TD>$attribs{"description"}</TD>
+ </TR>
+</TABLE>\n\n@;
print qq@<HR>\n\n@;
+ print qq@
+<TABLE border=0>
+<TR><TD><A HREF="?tstfile=$tstfile&num=$num&sgf=1">SGF File</A>
+</TD><TD> <A
HREF="?tstfile=$tstfile&num=$num&trace=1">Trace File</A>
+</TD></TR></TABLE>
+@;
my $boardsize = $attribs{"boardsize"}; #need to add to export.
@@ -226,22 +292,23 @@
my $gtpall = $attribs{gtp_all};
$gtpall =~ s/<BR>//mg;
$gtpall =~ s/\s+$//mg;
- $gtpall =~ address@hidden ((?:\w|[-.\\/])+) \s* (\d*) @xm or die
$attribs{gtp_all};
+ $gtpall =~ address@hidden ((?:\w|[-.\\/])+) \s* (\d*) @xm
+ or $gtpall =~m/(.*?)/; #Problems!!!!
+
my $cmdline = "gq -l $1 " . ($2 ? "-L $2 " : "");
- if ($gtpall =~ m@ .* (owl_[attackdefend]*) \s* ([A-Z]\d{1,2}) \s* $ @x) {
+ if ($gtpall =~ m@ .* (owl_(?:attack|defend)*) \s* ([A-Z]\d{1,2}) \s* $
@x) {
$cmdline .= "--decide-dragon $2 -o x.sgf" ;
} elsif ($gtpall =~ m@ .* (gg_genmove\s+[whiteblack]*) \s* address@hidden) {
$cmdline .= "-t";
- } elsif ($gtpall =~ m@ .* ([attackdefend]*) \s* ([A-Z]\d{1,2}) \s* $ @x) {
+ } elsif ($gtpall =~ m@ .* (attack|defend) \s* ([A-Z]\d{1,2}) \s* $ @x) {
$cmdline .= "--decide-string $2 -o x.sgf";
} else {
- $cmdline .= " <BR> (directive unrecognized): '$gtpall'";
+ $cmdline .= " <BR> (directive unrecognized)";
}
print qq@<HR>\n\n@;
print qq@<TABLE border=1>\n@;
print qq@ <TR><TD>CMD Line Hint:</TD><TD>$cmdline</TD></TR>\n@;
print qq@ <TR><TD>Full
GTP:</TD><TD>$attribs{gtp_all}</TD></TR>\n</TABLE>\n@;
- print qq@<HR>\nSGF board not generated - does anybody care?@;
print "\n\n</HTML>";
# print %attribs;
@@ -275,13 +342,13 @@
print TF "<H3>$tstfile regression results - _VERSION_</H3>\n";
print TF qq@<TABLE border=1>
<tr>
- <TH><A HREF="regress.plx?tstfile=$tstfile&sortby=filepos">line</A></TH>
- <TH><A href="regress.plx?tstfile=$tstfile&sortby=num">number</A></TH>
- <TH><A href="regress.plx?tstfile=$tstfile&sortby=result">result</A></TH>
+ <TH><A HREF="?tstfile=$tstfile&sortby=filepos">line</A></TH>
+ <TH><A href="?tstfile=$tstfile&sortby=num">number</A></TH>
+ <TH><A href="?tstfile=$tstfile&sortby=result">result</A></TH>
<TH>expected </TH>
<TH>got</TH>
<TH>gtp</TH>
- <TH><A href="regress.plx?tstfile=$tstfile&sortby=cputime">cputime</A></TH>
+ <TH><A href="?tstfile=$tstfile&sortby=cputime">cputime</A></TH>
</TR>\n@;
my @files = glob("html/$tstfile/*.xml");
@@ -343,7 +410,7 @@
foreach my $curfile (sort {filesby($sortby)} keys %files) {
my %h = %{$files{$curfile}};
- my $numURL = qq@<A
HREF="regress.plx?tstfile=$tstfile&num=$h{num}">$h{num}</A>@;
+ my $numURL = qq@<A HREF="?tstfile=$tstfile&num=$h{num}">$h{num}</A>@;
my $r = $h{result};
$r =~ address@hidden([A-Z]*)$@<B>$1</B>@;
print TF
"<TR><TD>$h{filepos}</TD><TD>$numURL</TD><TD>$r</TD><TD>$h{expected}</TD>"
@@ -393,8 +460,14 @@
if $content =~ m@<SEVERITY>(.*?)</SEVERITY>@s;
$attribs{"gtp_command"} = $1
if $content =~ m@<GTP_COMMAND>(.*?)</GTP_COMMAND>@s;
+ $attribs{"cputime"} = $1
+ if $content =~ m@<TIME.*?CPU=((\d|\.)*)@s;
$attribs{"boardsize"} = $1
if $content =~ m@<BOARD[^>]*size=(\d+)@s;
+ foreach (@counters) {
+ $attribs{$_."_counter"} = $1
+ if $content =~ m@<COUNTER[^>]*$_="?(\d+)@s;
+ }
$content =~ address@hidden<POINT@<address@hidden;
while ($content =~ s@<POINT(.*?)></POINT>@@s) {
my $pattr = $1;
@@ -423,16 +496,45 @@
}
+sub sgfFile() {
+ my $boardsize = $attribs{"boardsize"}; #need to add to export.
-#sub GTPtoSGF {
-# $_ = shift;
-# if (! /([A-Z])([0-9]{1,2})/) {
-# return ;
-# }
-# $_ = ord($1) - ord("A") + 1;
-# if ($_ > (ord("I") - ord("A") + 1)) { $_--; }
-# chr(ord("a") + $_ - 1) . chr(ord("a") + $boardsize - $2);
-#}
-#
-#
+ my $ret="";
+ $ret .= "(;\nFF[4]GM[1]SZ[$boardsize]\nAP[regress.plx]\n";
+
+ for (my $j = $boardsize; $j > 0; $j--) {
+ my $jA = $j;
+ $jA .= " " if ($j <= 9);
+ for (my $i = 1; $i <= $boardsize; $i++) {
+ my $iA = ord('A') + $i - 1;
+ if ($iA >= ord('I')) { $iA++; }
+ $iA = chr($iA);
+ my $coord = $iA.$j;
+ my $bw = pval($coord, "stone");
+
+ if ($bw eq "black") {
+ $ret .= "AB\[" . GTPtoSGF($coord, $boardsize) . "]";
+ } elsif ($bw eq "white") {
+ $ret .= "AW\[" . GTPtoSGF($coord, $boardsize) . "]";
+ }
+ }
+ }
+ $ret.=")";
+
+ $ret =~ s/((A[BW]\[..\]){12})/$1\n/g;
+
+ print $ret;
+}
+
+
+sub GTPtoSGF {
+ local $_ = shift;
+ my $boardsize = shift;
+ if (! /([A-Z])([0-9]{1,2})/) {
+ return ;
+ }
+ $_ = ord($1) - ord("A") + 1;
+ if ($_ > (ord("I") - ord("A") + 1)) { $_--; }
+ chr(ord("a") + $_ - 1) . chr(ord("a") + $boardsize - $2);
+}
- [gnugo-devel] trevor_1_14.1,
Trevor Morris <=