diff --git a/src/datagen/datagen.cpp b/src/datagen/datagen.cpp index 2e4e45d..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; } @@ -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..bf3a0a1 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -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::kWin; + } else if (i / 2 <= m_consecutiveChecks[stm().flip().idx()]) { + return SennichiteStatus::kLose; + } 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 c8ca88a..808bcb3 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 { 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