From d59bad55df4b8759e53b0ee8673ec8e69c5f5a82 Mon Sep 17 00:00:00 2001 From: johndoknjas Date: Fri, 2 Jan 2026 10:02:39 -0800 Subject: [PATCH 1/3] Ensure hash is always set after threads. --- chess/engine.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/chess/engine.py b/chess/engine.py index 91394019..72b579dc 100644 --- a/chess/engine.py +++ b/chess/engine.py @@ -1875,12 +1875,16 @@ def _parse_uci_bestmove(board: chess.Board, args: str) -> BestMove: return BestMove(move, ponder) -def _chain_config(a: ConfigMapping, b: ConfigMapping) -> Iterator[Tuple[str, ConfigValue]]: - for name, value in a.items(): +def _chain_config(a: ConfigMapping, b: ConfigMapping, with_hash_reordering: bool = True) -> Iterator[Tuple[str, ConfigValue]]: + merged = dict(a) + for k, v in b.items(): + merged.setdefault(k, v) + if with_hash_reordering and 'Hash' in merged and 'Threads' in merged: + hash_val = merged['Hash'] + del merged['Hash'] + merged['Hash'] = hash_val + for name, value in merged.items(): yield name, value - for name, value in b.items(): - if name not in a: - yield name, value class UciOptionMap(MutableMapping[str, T]): From a5bbe3ea49f04b6a153efd278d1d17b073a11fc0 Mon Sep 17 00:00:00 2001 From: johndoknjas Date: Fri, 2 Jan 2026 20:46:19 -0800 Subject: [PATCH 2/3] Remove optional parameter. --- chess/engine.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chess/engine.py b/chess/engine.py index 72b579dc..0a9af75d 100644 --- a/chess/engine.py +++ b/chess/engine.py @@ -1875,11 +1875,11 @@ def _parse_uci_bestmove(board: chess.Board, args: str) -> BestMove: return BestMove(move, ponder) -def _chain_config(a: ConfigMapping, b: ConfigMapping, with_hash_reordering: bool = True) -> Iterator[Tuple[str, ConfigValue]]: +def _chain_config(a: ConfigMapping, b: ConfigMapping) -> Iterator[Tuple[str, ConfigValue]]: merged = dict(a) for k, v in b.items(): merged.setdefault(k, v) - if with_hash_reordering and 'Hash' in merged and 'Threads' in merged: + if 'Hash' in merged and 'Threads' in merged: hash_val = merged['Hash'] del merged['Hash'] merged['Hash'] = hash_val From a28315bbfe31410120e97aa2f2fe56a19043e242 Mon Sep 17 00:00:00 2001 From: Niklas Fiekas Date: Sat, 3 Jan 2026 12:29:26 +0100 Subject: [PATCH 3/3] Comment Hash after Threads --- chess/engine.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/chess/engine.py b/chess/engine.py index 0a9af75d..c66bc0c4 100644 --- a/chess/engine.py +++ b/chess/engine.py @@ -1875,16 +1875,16 @@ def _parse_uci_bestmove(board: chess.Board, args: str) -> BestMove: return BestMove(move, ponder) -def _chain_config(a: ConfigMapping, b: ConfigMapping) -> Iterator[Tuple[str, ConfigValue]]: +def _chain_config(a: ConfigMapping, b: ConfigMapping) -> Iterable[Tuple[str, ConfigValue]]: merged = dict(a) for k, v in b.items(): merged.setdefault(k, v) - if 'Hash' in merged and 'Threads' in merged: - hash_val = merged['Hash'] - del merged['Hash'] - merged['Hash'] = hash_val - for name, value in merged.items(): - yield name, value + if "Hash" in merged and "Threads" in merged: + # Move Hash after Threads, as recommended by Stockfish. + hash_val = merged["Hash"] + del merged["Hash"] + merged["Hash"] = hash_val + return merged.items() class UciOptionMap(MutableMapping[str, T]):