chess_inator/contrib/fast-chess-branch.sh

83 lines
2.5 KiB
Bash
Executable File

#!/bin/sh
# Runs a fast-chess (https://github.com/Disservin/fastchess) tournament based
# on two branches of the chess_inator
# (https://github.com/dogeystamp/chess_inator) engine.
#
# Example usage:
#
# cd chess_tournaments
# fast-chess-branch.sh quiescence no-quiescence -openings file=8moves_v3.pgn format=pgn order=random -each tc=300+0.1 -rounds 12 -repeat -concurrency 8 -recover -sprt elo0=0 elo1=10 alpha=0.05 beta=0.05
#
# Do not use `main` as a branch, or any other branch already checked out in
# another directory. You need to be in a chess_inator Git repository to run
# this script. Ensure that the repository you're in is a throw-away worktree.
# Create one using
#
# git worktree add ../chess_tournaments
#
# inside the original chess_inator repo.
# Also, get an opening book from Stockfish's books:
#
# curl -O https://github.com/official-stockfish/books/raw/refs/heads/master/8moves_v3.pgn.zip
#
# The sprt mode is a statistical hypothesis testing mode that will tell you how
# probably the first branch is better than the second branch. The Elo ratings
# given are the "indifference zone" where the result is acceptable. To check
# that the engine hasn't had a regression, set them to [-10, 0]. To check for
# an improvement, use [0, 10]. Alpha and beta are probabilities for statistical
# errors. The tournament automatically ends when a statistically significant
# result is obtained.
#
# By default, a PGN file will be exported with the games played, and the
# fast-chess SPRT output will be appended. This comment may interfere with
# importing the PGN. But Lichess will ignore it, so it's probably fine.
set -e
BRANCH1="$1"
BRANCH2="$2"
# if this line fails it's because you don't have enough arguments
shift 2
COMM1=$(git rev-parse --short "$BRANCH1")
COMM2=$(git rev-parse --short "$BRANCH2")
mkdir -p games
PGN=games/"$BRANCH1"__"$BRANCH2".pgn
rm -f engine1 engine2
if [ -f "$PGN" ]; then
rm -i "$PGN"
fi
git switch "$BRANCH1"
cargo build --release
cp target/release/chess_inator engine1
git switch "$BRANCH2"
cargo build --release
cp target/release/chess_inator engine2
OUTPUT=$(mktemp)
fastchess \
-engine cmd=engine1 name="c_i $BRANCH1 ($COMM1)" \
-engine cmd=engine2 name="c_i $BRANCH2 ($COMM2)" \
-pgnout file="$PGN" \
timeleft=true \
$@ \
2>&1 | tee -a "$OUTPUT"
printf "\n{" >> "$PGN"
# match between ------- markers in fastchess output, strip newline and then output to PGN
awk '/-{50}/{f+=1; print; next} f%2' "$OUTPUT" \
| head -c -1 \
>> "$PGN"
printf "}" >> "$PGN"
rm "$OUTPUT"