Why is it that GNU Go has move evaluations of 0.0 for all possible
moves at the end of the game, but it has a specific best move? This
quirk resulted in SlugGo making end game errors because I had not
expected that GNU Go would do that.
GNU Go's policy is to fill all liberties, partly because filling
a liberty is worth one point in Chinese rules, and partly because
mistakes can be made while filling a liberty if backfilling is
needed, so the best discipline is to play this part of the
endgame out to the end.
Therefore there's the function fill_liberty() whose purpose
is to propose a move to fill a liberty. It is called from genmove:
if (val < 0.0
&& fill_liberty(move, color)
&& (!allowed_moves || allowed_moves[*move])) {
val = 1.0;
TRACE("Filling a liberty at %1m\n", *move);
record_top_move(*move, val);
move_considered(*move, val);
time_report(1, "fill liberty", NO_MOVE, 1.0);
}
Of course it has to propose a particular move.