From 580aefabd6d7007f3b3fa147e99faeb2319c2668 Mon Sep 17 00:00:00 2001 From: KazApps <110339521+KazApps@users.noreply.github.com> Date: Sun, 23 Mar 2025 01:32:42 +0900 Subject: [PATCH 1/4] fix perpetual check bench: 8532849 --- src/datagen/datagen.cpp | 2 +- src/position.cpp | 18 ++++++++++++------ src/position.h | 3 ++- src/search.cpp | 10 +++++++--- 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/datagen/datagen.cpp b/src/datagen/datagen.cpp index 2e4e45d..44b8624 100644 --- a/src/datagen/datagen.cpp +++ b/src/datagen/datagen.cpp @@ -240,7 +240,7 @@ namespace stoat::datagen { if (sennichite == SennichiteStatus::kDraw) { outcome = format::Outcome::kDraw; break; - } else if (sennichite == SennichiteStatus::kWin) { + } else if (sennichite == SennichiteStatus::kWin || sennichite == SennichiteStatus::kLose) { const std::scoped_lock lock{s_printMutex}; auto& errStream = getErrStream(outDir); diff --git a/src/position.cpp b/src/position.cpp index a73196a..e8c4777 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -239,9 +239,9 @@ namespace stoat { newPos.updateAttacks(); if (newPos.isInCheck()) { - ++newPos.m_consecutiveChecks[newPos.stm().idx()]; + ++newPos.m_consecutiveChecks[newPos.stm().flip().idx()]; } else { - newPos.m_consecutiveChecks[newPos.stm().idx()] = 0; + newPos.m_consecutiveChecks[newPos.stm().flip().idx()] = 0; } return newPos; @@ -300,12 +300,12 @@ namespace stoat { SennichiteStatus Position::testSennichite(bool cuteChessWorkaround, std::span keyHistory, i32 limit) const { - const auto end = std::max(0, static_cast(keyHistory.size()) - limit - 1); + const auto end = std::min(static_cast(keyHistory.size()), limit); i32 repetitions = 1; - for (i32 i = static_cast(keyHistory.size()) - 4; i >= end; i -= 2) { - if (keyHistory[i] == key()) { + for (i32 i = 4; i <= end; i += 2) { + if (keyHistory[keyHistory.size() - i] == key()) { --repetitions; if (repetitions == 0) { // Older cutechess versions do not handle perpetuals @@ -313,7 +313,13 @@ namespace stoat { if (cuteChessWorkaround) { return isInCheck() ? SennichiteStatus::kWin : SennichiteStatus::kDraw; } else { - return m_consecutiveChecks[stm().idx()] >= 2 ? SennichiteStatus::kWin : SennichiteStatus::kDraw; + if (i / 2 <= m_consecutiveChecks[stm().idx()]) { + return SennichiteStatus::kLose; + } else if (i / 2 <= m_consecutiveChecks[stm().flip().idx()]) { + return SennichiteStatus::kWin; + } else { + return SennichiteStatus::kDraw; + } } } } diff --git a/src/position.h b/src/position.h index 54ae2e3..5e20a93 100644 --- a/src/position.h +++ b/src/position.h @@ -100,7 +100,8 @@ namespace stoat { enum class SennichiteStatus { kNone = 0, kDraw, - kWin, // perpetual check by opponent + kWin, // perpetual check by opponent + kLose, // perpetual check }; namespace eval::nnue { diff --git a/src/search.cpp b/src/search.cpp index 13fe0fe..13ee859 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -610,10 +610,13 @@ namespace stoat { Score score; if (sennichite == SennichiteStatus::kWin) { - // illegal perpetual --legalMoves; continue; - } else if (sennichite == SennichiteStatus::kDraw) { + } else if (sennichite == SennichiteStatus::kLose) { + score = kScoreMate - ply - 1; + goto skipSearch; + } + else if (sennichite == SennichiteStatus::kDraw) { score = drawScore(thread.loadNodes()); goto skipSearch; } else if (pos.isEnteringKingsWin()) { @@ -776,8 +779,9 @@ namespace stoat { Score score; if (sennichite == SennichiteStatus::kWin) { - // illegal perpetual continue; + } else if (sennichite == SennichiteStatus::kLose) { + score = kScoreMate - ply - 1; } else if (sennichite == SennichiteStatus::kDraw) { score = drawScore(thread.loadNodes()); } else { From 36b4bf3530c75744314dfe0768e76e4c1a4ca107 Mon Sep 17 00:00:00 2001 From: KazApps <110339521+KazApps@users.noreply.github.com> Date: Sun, 23 Mar 2025 01:48:13 +0900 Subject: [PATCH 2/4] version bench: 8532849 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index e982215..9c178d3 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.1.94 +0.1.95 From 6e0e7839313f74cca8935c4bb46148ecea08a93f Mon Sep 17 00:00:00 2001 From: KazApps <110339521+KazApps@users.noreply.github.com> Date: Fri, 20 Jun 2025 12:00:04 +0900 Subject: [PATCH 3/4] fix bug bench: 8532849 --- src/datagen/datagen.cpp | 2 +- src/position.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/datagen/datagen.cpp b/src/datagen/datagen.cpp index 44b8624..7345ad6 100644 --- a/src/datagen/datagen.cpp +++ b/src/datagen/datagen.cpp @@ -85,7 +85,7 @@ namespace stoat::datagen { const auto sennichite = newPos.testSennichite(false, keyHistory); keyHistory.pop_back(); - if (sennichite != SennichiteStatus::kWin) { + if (sennichite != SennichiteStatus::kWin || sennichite != SennichiteStatus::kLose) { return move; } diff --git a/src/position.cpp b/src/position.cpp index e8c4777..bf3a0a1 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -239,9 +239,9 @@ namespace stoat { newPos.updateAttacks(); if (newPos.isInCheck()) { - ++newPos.m_consecutiveChecks[newPos.stm().flip().idx()]; + ++newPos.m_consecutiveChecks[newPos.stm().idx()]; } else { - newPos.m_consecutiveChecks[newPos.stm().flip().idx()] = 0; + newPos.m_consecutiveChecks[newPos.stm().idx()] = 0; } return newPos; @@ -314,9 +314,9 @@ namespace stoat { return isInCheck() ? SennichiteStatus::kWin : SennichiteStatus::kDraw; } else { if (i / 2 <= m_consecutiveChecks[stm().idx()]) { - return SennichiteStatus::kLose; - } else if (i / 2 <= m_consecutiveChecks[stm().flip().idx()]) { return SennichiteStatus::kWin; + } else if (i / 2 <= m_consecutiveChecks[stm().flip().idx()]) { + return SennichiteStatus::kLose; } else { return SennichiteStatus::kDraw; } From c5e26f59bd445582548a7832fcbcc977c2a663e1 Mon Sep 17 00:00:00 2001 From: KazApps <110339521+KazApps@users.noreply.github.com> Date: Fri, 20 Jun 2025 12:05:02 +0900 Subject: [PATCH 4/4] version bench: 5785595 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 71fb8a1..3234805 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.1.100 +0.1.101