From 89e846c476bb94ca0f120a7a5aecc53c2863c713 Mon Sep 17 00:00:00 2001 From: Hisayori Noda Date: Thu, 4 Jul 2019 23:44:58 +0900 Subject: [PATCH] Fixed a bug that Learner::qsearch() recognizes stalemate as checkmated. --- src/learn/learner.cpp | 19 +++++++++++-------- src/position.cpp | 9 --------- src/position.h | 3 --- src/search.cpp | 13 +++++++++---- 4 files changed, 20 insertions(+), 24 deletions(-) diff --git a/src/learn/learner.cpp b/src/learn/learner.cpp index a0a3833a..c143e451 100644 --- a/src/learn/learner.cpp +++ b/src/learn/learner.cpp @@ -502,15 +502,17 @@ void MultiThinkGenSfen::thread_worker(size_t thread_id) break; } + if (pos.is_draw(ply)) { + // Do not write if draw. + break; + } + // 全駒されて詰んでいたりしないか? - if (pos.is_mated()) + if (MoveList(pos).size() == 0) { - if (pos.checkers()) { - // (この局面の一つ前の局面までは書き出す) - // Write the packed fens if checkmate. - // Do not write if stalemate. - flush_psv(-1); - } + // (この局面の一つ前の局面までは書き出す) + // Write the positions other than this position if checkmated. + flush_psv(-1); break; } @@ -1965,7 +1967,8 @@ void LearnerThink::thread_worker(size_t thread_id) // 全駒されて詰んでいる可能性がある。 // また宣言勝ちの局面はPVの指し手でleafに行けないので学習から除外しておく。 // (そのような教師局面自体を書き出すべきではないのだが古い生成ルーチンで書き出しているかも知れないので) - if (pos.is_mated()) + // Skip the position if there are no legal moves (=checkmated or stalemate). + if (MoveList(pos).size() == 0) goto RetryRead; // 読み込めたので試しに表示してみる。 diff --git a/src/position.cpp b/src/position.cpp index 91f3ab8e..fefeac92 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -1483,12 +1483,3 @@ PieceNumber Position::piece_no_of(Square sq) const return n; } #endif // defined(EVAL_NNUE) - -#if defined(EVAL_LEARN) -// ǖʂŎw肪ȂeXgBw萶[`p̂őȂBTɂ͎gȂƁB -bool Position::is_mated() const -{ - // sŋl߂łp^[͂Ȃ̂LEGAL_ALLłKv͂ȂB - return MoveList(*this).size() == 0; -} -#endif // EVAL_LEARN diff --git a/src/position.h b/src/position.h index 547320ea..6efe37e7 100644 --- a/src/position.h +++ b/src/position.h @@ -192,9 +192,6 @@ public: #endif // defined(EVAL_NNUE) || defined(EVAL_LEARN) #if defined(EVAL_LEARN) - // ǖʂŎw肪ȂeXgBw萶[`p̂őȂBTɂ͎gȂƁB - bool is_mated() const; - // -- sfenwp // packꂽsfen𓾂BɎw肵obt@ɕԂB diff --git a/src/search.cpp b/src/search.cpp index b176e0b9..fa423d6e 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -1854,21 +1854,26 @@ namespace Learner { Stack stack[MAX_PLY + 10], * ss = stack + 7; Move pv[MAX_PLY + 1]; - std::vector pvs; init_for_search(pos, ss); ss->pv = pv; // Ƃ肠_~[łǂobt@ȂƂȂB + if (pos.is_draw(0)) { + // Return draw value if draw. + return { VALUE_DRAW, {} }; + } + // l܂Ă̂ - if (pos.is_mated()) + if (MoveList(pos).size() == 0) { - pvs.push_back(MOVE_NONE); - return ValueAndPV(mated_in(/*ss->ply*/ 0 + 1), pvs); + // Return the mated value if checkmated. + return { mated_in(/*ss->ply*/ 0 + 1), {} }; } auto bestValue = ::qsearch(pos, ss, -VALUE_INFINITE, VALUE_INFINITE, DEPTH_ZERO); // ꂽPVԂB + std::vector pvs; for (Move* p = &ss->pv[0]; is_ok(*p); ++p) pvs.push_back(*p);