Merge pull request #50 from lemonsqueeze/can_countercap
[pachi.git] / t-play / autotest / autotest-worker
blob737ec57612faacc78dc7ebbdba92fb9a16e243d6
1 #!/bin/bash
2 # This is autotest Go-testing framework worker. It picks a random
3 # pairing among the ones defined in the rc file, and plays a single game.
5 clientid="$1"; shift
6 . ./autotest-lib
9 # Load rc file. First, prepare functions for the endeavor:
10 echo "Loading rc file..."
12 player() {
13 playerid="$1"; shift
14 playerspec="$1"; shift
15 playerargc="$1"; shift
17 eval "${playerid}_spec='$playerspec'"
18 eval "${playerid}_argc='$playerargc'"
20 player_param() { # Accessor method
21 playerid="$1"; shift
22 playerattr="$1"; shift
23 playervar="${playerid}_${playerattr}"
24 # XXX: ${!...} is bash-specific?
25 eval "echo \$$playervar"
28 pairs=0
29 pairing() {
30 eval "pair${pairs}_id='$(pairid "$@")'"
31 eval "pair${pairs}_bsize='$1'"; shift
32 eval "pair${pairs}_komi='$1'"; shift
33 eval "pair${pairs}_black='$1'"; shift
35 player="$1"; shift
36 args=""; argc=0
37 while [ "$argc" -lt "$(player_param $player argc)" ] && [ "$#" -gt 0 ]; do
38 argc=$((argc+1))
39 args="$args $1"; shift
40 done
41 eval "pair${pairs}_player1='$player'"
42 eval "pair${pairs}_player1_args='$args'"
44 player="$1"; shift
45 args=""; argc=0
46 while [ "$argc" -lt "$(player_param $player argc)" ] && [ "$#" -gt 0 ]; do
47 argc=$((argc+1))
48 args="$args $1"; shift
49 done
50 eval "pair${pairs}_player2='$player'"
51 eval "pair${pairs}_player2_args='$args'"
53 pairs=$((pairs+1))
55 pairing_param() { # Accessor method
56 pairid="$1"; shift
57 pairattr="$1"; shift
58 pairvar="pair${pairid}_${pairattr}"
59 # XXX: ${!...} is bash-specific?
60 eval "echo \$$pairvar"
63 . ./rc
66 echo "Loaded $pairs pairings"
68 # XXX RANDOM is bash-specific
69 pair="$((RANDOM % $pairs))"
70 pairid="$(pairing_param $pair id)"
71 echo "Picked pairing #$pair: $pairid"
73 log "starting game with pairing #$pair: $pairid"
76 # Assign players to final colors
77 black="$(pairing_param ${pair} black)"
78 # XXX RANDOM is bash-specific
79 [ "$black" != "a" ] || black="$((1 + RANDOM % 2))"
80 white="$((1+2-black))"
81 p_black="$(player_param $(pairing_param $pair player$black) spec)"; pa_black="$(pairing_param $pair player${black}_args)"
82 p_white="$(player_param $(pairing_param $pair player$white) spec)"; pa_white="$(pairing_param $pair player${white}_args)"
85 # Create player commandlines
86 prun_get() {
87 name="$1"; shift
88 cmdline="$1"; shift
89 # Rest of arguments are in $1, $2, ...
90 eval "$name=\"$cmdline\""
92 prun_get prun_black "$p_black" $pa_black
93 prun_get prun_white "$p_white" $pa_white
94 komi="$(pairing_param $pair komi | sed 's/^h/0.5 -handicap /')"
97 # Run twogtp!
98 rm -f "c/$clientid"/scratch*
99 echo $twogtp_path -black "$prun_black" -white "$prun_white" -auto -verbose -size "$(pairing_param $pair bsize)" -komi $komi -games 1 -sgffile "c/$clientid/scratch"
100 $twogtp_path -black "$prun_black" -white "$prun_white" -auto -verbose -size "$(pairing_param $pair bsize)" -komi $komi -games 1 -sgffile "c/$clientid/scratch"
102 # Get count of our game
103 mkdir -p "c/$clientid/$pairid"
104 if [ -s "c/$clientid/$pairid/game.dat" ]; then
105 gameno="$(($(tail -n 1 "c/$clientid/$pairid/game.dat" | cut -f 1) + 1))"
106 else
107 gameno=0
109 log "game over, storing as #$gameno; black=player$black (recording black=player2)"
111 # Move result from scratchspace
112 cat "c/$clientid"/scratch.dat | grep -v '^#' | {
113 read GAME RES_B RES_W RES_R ALT DUP LEN TIME_B TIME_W CPU_B CPU_W ERR ERR_MSG
114 GAME="$gameno"
115 if [ "$black" -ne 2 ]; then
116 # Reverse colors
117 _S="$RES_B"; RES_B="$(echo $RES_W | tr 'BW' 'WB')"; RES_W="$(echo $_S | tr 'BW' 'WB')"
118 RES_R="$(echo "$RES_R" | tr 'BW' 'WB')"
119 ALT=1
120 _S="$TIME_B"; TIME_B="$TIME_W"; TIME_W="$_S"
121 _S="$CPU_B"; CPU_B="$CPU_W"; CPU_W="$_S"
123 printf "$GAME\t$RES_B\t$RES_W\t$RES_R\t$ALT\t$DUP\t$LEN\t$TIME_B\t$TIME_W\t$CPU_B\t$CPU_W\t$ERR\t$ERR_MSG\n"
124 } >>"c/$clientid/$pairid/game.dat"
125 mv "c/$clientid/scratch-0.sgf" "c/$clientid/$pairid/game-$gameno.sgf"