From b2afb008646c0e4d6edd04f059d28fabad1a5b36 Mon Sep 17 00:00:00 2001 From: yaneurao Date: Thu, 28 Nov 2024 00:03:58 +0900 Subject: [PATCH] =?UTF-8?q?-=20ponder=5Fcandidate=E3=81=AE=E5=87=A6?= =?UTF-8?q?=E7=90=86=E3=80=81=E5=BE=A9=E6=B4=BB=E3=80=82=20-=20ponder?= =?UTF-8?q?=E3=81=AE=E6=8C=87=E3=81=97=E6=89=8B=E3=80=81legal=20moves?= =?UTF-8?q?=E5=85=A8=E9=83=A8=E7=94=9F=E6=88=90=E3=81=97=E3=81=A6=E5=88=A4?= =?UTF-8?q?=E5=AE=9A=E3=81=97=E3=81=A6=E3=81=84=E3=81=9F=E3=81=AE=E3=82=92?= =?UTF-8?q?=E3=82=84=E3=82=81=E3=81=A6=E9=AB=98=E9=80=9F=E5=8C=96=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../engine/yaneuraou-engine/yaneuraou-search.cpp | 2 +- source/search.h | 2 +- source/types.cpp | 16 +++++++++++++--- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/source/engine/yaneuraou-engine/yaneuraou-search.cpp b/source/engine/yaneuraou-engine/yaneuraou-search.cpp index 9c4a64724..9918546bf 100644 --- a/source/engine/yaneuraou-engine/yaneuraou-search.cpp +++ b/source/engine/yaneuraou-engine/yaneuraou-search.cpp @@ -837,7 +837,7 @@ SKIP_SEARCH:; // pvにはbestmoveのときの読み筋(PV)が格納されているので、ponderとしてpv[1]があればそれを出力してやる。 // また、pv[1]がない場合(rootでfail highを起こしたなど)、置換表からひねり出してみる。 if (bestThread->rootMoves[0].pv.size() > 1 - || bestThread->rootMoves[0].extract_ponder_from_tt(TT, rootPos)) + || bestThread->rootMoves[0].extract_ponder_from_tt(TT, rootPos, Threads.main()->ponder_candidate)) std::cout << " ponder " << bestThread->rootMoves[0].pv[1]; std::cout << sync_endl; diff --git a/source/search.h b/source/search.h index ee115ef42..717b65309 100644 --- a/source/search.h +++ b/source/search.h @@ -82,7 +82,7 @@ struct RootMove // GUIに返すponder moveをできる限り準備しようとしますが、 // そうでない場合、「ponder on」の際に考えるべきものが何もなくなります。 - bool extract_ponder_from_tt(const TranspositionTable& tt, Position& pos); + bool extract_ponder_from_tt(const TranspositionTable& tt, Position& pos, Move ponder_candidate); // std::count(),std::find()などで指し手と比較するときに必要。 bool operator==(const Move& m) const { return pv[0] == m; } diff --git a/source/types.cpp b/source/types.cpp index 6a5ba731c..8706c2820 100644 --- a/source/types.cpp +++ b/source/types.cpp @@ -114,7 +114,7 @@ namespace Search { // GUIに返すponder moveをできる限り準備しようとしますが、 // そうでない場合、「ponder on」の際に考えるべきものが何もなくなります。 - bool RootMove::extract_ponder_from_tt(const TranspositionTable& tt, Position& pos) + bool RootMove::extract_ponder_from_tt(const TranspositionTable& tt, Position& pos, Move ponder_candidate) { StateInfo st; @@ -131,8 +131,18 @@ namespace Search { auto [ttHit, ttData, ttWriter] = tt.probe(pos.key(), pos); if (ttHit) { - if (MoveList(pos).contains(ttData.move)) - pv.push_back(ttData.move); + Move m = ttData.move; + //if (MoveList(pos).contains(ttData.move)) + // ⇨ Stockfishのこのコード、pseudo_legalとlegalで十分なのではないか? + if (pos.pseudo_legal_s(m) && pos.legal(m)) + pv.push_back(m); + } + // 置換表にもなかったので以前のiteration時のpv[1]をほじくり返す。 + else if (ponder_candidate) + { + Move m = ponder_candidate; + if (pos.pseudo_legal_s(m) && pos.legal(m)) + pv.push_back(m); } pos.undo_move(pv[0]);