From 220a4b79e4b6d742a9ca7c278a1962b870500fbc Mon Sep 17 00:00:00 2001 From: tslil Date: Thu, 10 Sep 2026 14:12:41 +0100 Subject: credit Mitchell Riley: we can drop 65 parameters for about the same strength; also train for longer The idea is that the current model is M_theta(board, ply) = "score for player 0", but we can instead create a different model M'_theta(board) = "score for player 0 assuming that it's player 0's move" and for a certain pair of functions sigma, normalise, recover M_theta(board, ply) = sigma(ply) M'_theta(normalise(board, ply)). This pair of functions is sigma(ply) = +/- 1 (parity), and normalise being a conditional interchange of pieces on the board depending on the parity of the ply. The only things stopping this from being completely straightforward is that nn_train.py evaluates M'_theta itself so we need to pass sigma(ply) to the training loop. 6x6 is still untrained. --- include/actions.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'include/actions.h') diff --git a/include/actions.h b/include/actions.h index d96033c..748ea38 100644 --- a/include/actions.h +++ b/include/actions.h @@ -58,10 +58,8 @@ extern int8_t move_deltas[4]; void actions_init(const uint8_t board_size); // Generate the legal actions. The move list is drawn from a static -// per-search-level scratch buffer: one buffer per recursion level, so nested -// generate calls at different levels do not clobber each other. `level' is the -// recursion depth within the current search (0 at the root). The returned -// pointer is valid until the next generate call at the same level. +// per-search-level scratch buffer, per recursion level. The returned pointer is +// valid until the next generate call at the same level. action_t *actions_generate_at(tak_state_p state, uint32_t *num_actions, const uint32_t level); -- cgit v1.3.1