diff --git a/source/engine/dlshogi-engine/UctSearch.cpp b/source/engine/dlshogi-engine/UctSearch.cpp index c1b064c85..17845c7cb 100644 --- a/source/engine/dlshogi-engine/UctSearch.cpp +++ b/source/engine/dlshogi-engine/UctSearch.cpp @@ -984,12 +984,14 @@ namespace dlshogi // Policy Bookに従う。 u32 total = 0; - for (size_t i = 0; i < POLICY_BOOK_NUM; ++i) + size_t k1; + for (k1 = 0; k1 < POLICY_BOOK_NUM; ++k1) { - if (policy_book_entry->move_freq[i].move16 == Move16::none()) + if (policy_book_entry->move_freq[k1].move16 == Move16::none()) break; - total += policy_book_entry->move_freq[i].freq; + total += policy_book_entry->move_freq[k1].freq; } + // ⇨ k1個だけ有効なmoveがあることがわかった。 // 元のPolicyの按分率 // @@ -1008,14 +1010,14 @@ namespace dlshogi for (ChildNumType j = 0; j < child_num; j++) { - uct_child[j].nnrate = legal_move_probabilities[j] * (1.0f - book_policy_ratio); + uct_child[j].nnrate = (1.0f - book_policy_ratio) * legal_move_probabilities[j]; // PolicyBookに出現していた指し手であれば、それで按分する。 - for (size_t k = 0 ; k < POLICY_BOOK_NUM; ++k) + for (size_t k2 = 0 ; k2 < k1; ++k2) { - if (policy_book_entry->move_freq[k].move16 == uct_child[j].move.to_move16()) + if (uct_child[j].move.to_move16() == policy_book_entry->move_freq[k2].move16) { - uct_child[j].nnrate += book_policy_ratio * policy_book_entry->move_freq[k].freq / total; + uct_child[j].nnrate += book_policy_ratio * policy_book_entry->move_freq[k2].freq / total; break; } } diff --git a/source/engine/dlshogi-engine/YaneuraOu_dlshogi_bridge.cpp b/source/engine/dlshogi-engine/YaneuraOu_dlshogi_bridge.cpp index 80ee796ad..bcdea9b2d 100644 --- a/source/engine/dlshogi-engine/YaneuraOu_dlshogi_bridge.cpp +++ b/source/engine/dlshogi-engine/YaneuraOu_dlshogi_bridge.cpp @@ -518,7 +518,13 @@ namespace dlshogi { return (u64)searcher.search_limits.nodes_searched; } +} +// USIの"gameover"に対して呼び出されるハンドラ。 +void gameover_handler(const std::string& cmd) +{ + // dlshogiのゲームオーバーのハンドラを呼び出す。 + searcher.GameOver(); } #endif // defined(YANEURAOU_ENGINE_DEEP) diff --git a/source/engine/dlshogi-engine/dlshogi_searcher.cpp b/source/engine/dlshogi-engine/dlshogi_searcher.cpp index 4e795c8d3..44ddf6e08 100644 --- a/source/engine/dlshogi-engine/dlshogi_searcher.cpp +++ b/source/engine/dlshogi-engine/dlshogi_searcher.cpp @@ -178,6 +178,13 @@ namespace dlshogi // 対局終了時に呼び出されるハンドラ void DlshogiSearcher::GameOver() { +#if defined(ENABLE_POLICY_BOOK_LEARN) + // 今回の棋譜をPolicyBookを書き出す必要がある。 + auto last_position_cmd = Threads.main()->last_position_cmd_string; + auto sfen = last_position_cmd.substr(strlen("position ")); + policy_book.append_sfen_to_db_bin(sfen); +#endif + } // 投了の閾値設定 diff --git a/source/misc.cpp b/source/misc.cpp index 29c9a3e3b..7b1be214a 100644 --- a/source/misc.cpp +++ b/source/misc.cpp @@ -1496,9 +1496,9 @@ namespace SystemIO // === BinaryWriter === // ファイルのopen - Tools::Result BinaryWriter::Open(const std::string& filename) + Tools::Result BinaryWriter::Open(const std::string& filename, bool append) { - fp = fopen(filename.c_str(), "wb"); + fp = fopen(filename.c_str(), append ? "ab" : "wb"); if (fp == nullptr) return Tools::Result(Tools::ResultCode::FileOpenError); diff --git a/source/misc.h b/source/misc.h index 5448253fb..1ce9bed2e 100644 --- a/source/misc.h +++ b/source/misc.h @@ -741,7 +741,8 @@ namespace SystemIO { public: // ファイルのopen - Tools::Result Open(const std::string& filename); + // append == trueで呼び出すと、このあとWriteしたものはファイル末尾に追記される。 + Tools::Result Open(const std::string& filename, bool append = false); // ptrの指すメモリからsize[byte]だけファイルに書き込む。 // ※ sizeは2GB制限があるので気をつけて。 diff --git a/source/usi.cpp b/source/usi.cpp index 7c12f3879..260f1e85d 100644 --- a/source/usi.cpp +++ b/source/usi.cpp @@ -126,7 +126,7 @@ void bench_cmd(Position& pos, istringstream& is); // "gameover"コマンドに対するハンドラ -#if defined(USE_GAMEOVER_HANDLER) +#if defined(USE_GAMEOVER_HANDLER) || defined(YANEURAOU_ENGINE_DEEP) void gameover_handler(const string& cmd); #endif @@ -678,10 +678,12 @@ void usi_cmdexec(Position& pos, StateListPtr& states, string& cmd) // gameoverに対してbestmoveは返すべきではないのかも知れないが、 // それを言えばstopにだって…。 -#if defined(USE_GAMEOVER_HANDLER) - // "gameover"コマンドに対するハンドラを呼び出したいのか? +#if defined(USE_GAMEOVER_HANDLER) || defined(YANEURAOU_ENGINE_DEEP) + if (token == "gameover") + // "gameover"コマンドに対するハンドラを呼び出したいのか? gameover_handler(cmd); + #endif // "go infinite" , "go ponder"などで思考を終えて寝てるかも知れないが、