Distributed engine: allow shared_levels=0
[pachi.git] / t-play / autotest / autotest-worker
blob93a05e04e25e49e0e599a95530ccde0fc2bf33b6
1 #!/bin/sh
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)); args="$args $1"; shift
39 done
40 eval "pair${pairs}_player1='$player'"
41 eval "pair${pairs}_player1_args='$args'"
43 player="$1"; shift
44 args=""; argc=0
45 while [ "$argc" -lt "$(player_param $player argc)" ] && [ "$#" -gt 0 ]; do
46 argc=$((argc+1)); args="$args $1"; shift
47 done
48 eval "pair${pairs}_player2='$player'"
49 eval "pair${pairs}_player2_args='$args'"
51 pairs=$((pairs+1))
53 pairing_param() { # Accessor method
54 pairid="$1"; shift
55 pairattr="$1"; shift
56 pairvar="pair${pairid}_${pairattr}"
57 # XXX: ${!...} is bash-specific?
58 eval "echo \$$pairvar"
61 . rc
64 echo "Loaded $pairs pairings"
66 pair="$((RANDOM % $pairs))"
67 pairid="$(pairing_param $pair id)"
68 echo "Picked pairing #$pair: $pairid"
69 log "starting game with pairing #$pair: $pairid"
72 # Assign players to final colors
73 black="$(pairing_param ${pair} black)"
74 [ "$black" != "a" ] || black="$((1 + RANDOM % 2))"
75 white="$((1+2-black))"
76 p_black="$(player_param $(pairing_param $pair player$black) spec)"; pa_black="$(pairing_param $pair player${black}_args)"
77 p_white="$(player_param $(pairing_param $pair player$white) spec)"; pa_white="$(pairing_param $pair player${white}_args)"
80 # Create player commandlines
81 prun_get() {
82 name="$1"; shift
83 cmdline="$1"; shift
84 # Rest of arguments are in $1, $2, ...
85 eval "$name=\"$cmdline\""
87 prun_get prun_black "$p_black" $pa_black
88 prun_get prun_white "$p_white" $pa_white
89 komi="$(pairing_param $pair komi | sed 's/^h/0.5 -handicap /')"
92 # Run twogtp!
93 rm -f "c/$clientid"/scratch*
94 $twogtp_path -black "$prun_black" -white "$prun_white" -auto -verbose -size "$(pairing_param $pair bsize)" -komi $komi -games 1 -sgffile "c/$clientid/scratch"
96 # Get count of our game
97 mkdir -p "c/$clientid/$pairid"
98 if [ -s "c/$clientid/$pairid/game.dat" ]; then
99 gameno="$(($(tail -n 1 "c/$clientid/$pairid/game.dat" | cut -f 1) + 1))"
100 else
101 gameno=0
103 log "game over, storing as #$gameno; black=player$black (recording black=player2)"
105 # Move result from scratchspace
106 cat "c/$clientid"/scratch.dat | grep -v '^#' | {
107 read GAME RES_B RES_W RES_R ALT DUP LEN TIME_B TIME_W CPU_B CPU_W ERR ERR_MSG
108 GAME="$gameno"
109 if [ "$black" -ne 2 ]; then
110 # Reverse colors
111 _S="$RES_B"; RES_B="$(echo $RES_W | tr 'BW' 'WB')"; RES_W="$(echo $_S | tr 'BW' 'WB')"
112 RES_R="$(echo "$RES_R" | tr 'BW' 'WB')"
113 ALT=1
114 _S="$TIME_B"; TIME_B="$TIME_W"; TIME_W="$_S"
115 _S="$CPU_B"; CPU_B="$CPU_W"; CPU_W="$_S"
117 echo -e "$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"
118 } >>"c/$clientid/$pairid/game.dat"
119 mv "c/$clientid/scratch-0.sgf" "c/$clientid/$pairid/game-$gameno.sgf"