Skip to content
This repository has been archived by the owner on Nov 2, 2022. It is now read-only.

Commit

Permalink
- yo_cluster
Browse files Browse the repository at this point in the history
  - クラスター本体が終了しているのにエンジン停止しないの修正。
    - 対応が簡単ではないようなのでやめる。quitコマンドで終了するようにはできた。
  - start_pondering()で各エンジンに"go ponder"でその局面を思考させるコードを追加。
  - 先行して go ponderするコードを書く。
    - their_search_sfen と our_search_sfenが必要。
    - 与えられた局面に対して遷移確率の高い上位の偶数局面と奇数局面を拾ってくるルーチンが必要。(少し書いた)
  - EngineNegotiatorState → EngineStateにrename
  • Loading branch information
yaneurao committed Apr 28, 2022
1 parent c65d5f7 commit 4f0be71
Show file tree
Hide file tree
Showing 3 changed files with 143 additions and 58 deletions.
18 changes: 9 additions & 9 deletions source/engine/dlshogi-engine/YaneuraOu_dlshogi_bridge.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -445,11 +445,11 @@ namespace dlshogi
// node : 探索開始node
// tv : 訪問回数上位 n
// ply : rootからの手数
void dfs_for_node_visited(Node* node, TopVisited& tv , int ply = 0)
void dfs_for_node_visited(Node* node, TopVisited& tv , int ply, bool same_color)
{
// rootではない偶数局面で、その訪問回数が現在のn thより多いならそれを記録する。
if ( ply != 0
&& (ply % 2) == 0
&& (ply % 2) == (same_color ? 0 : 1)
&& node->move_count > tv.nth_nodes()
)
tv.append(node->move_count);
Expand All @@ -465,7 +465,7 @@ namespace dlshogi
if (move_count > tv.nth_nodes())
// このnodeを再帰的に辿る必要がある。
// 超えていないものは辿らない、すなわち枝刈りする。
dfs_for_node_visited(node->child_nodes[i].get(), tv , ply + 1);
dfs_for_node_visited(node->child_nodes[i].get(), tv , ply + 1, same_color);
}
}

Expand All @@ -476,11 +476,11 @@ namespace dlshogi
// sfens : 訪問回数上位 n のnodeまでのroot nodeからの手順文字列(先頭にスペースが入る)
// → これは返し値
// pv : rootから現在の局面までの手順
void dfs_for_sfen(Node* node, TopVisited& tv , int ply , SfenNodeList& snlist , std::vector<Move>& pv)
void dfs_for_sfen(Node* node, TopVisited& tv , int ply , bool same_color, SfenNodeList& snlist , std::vector<Move>& pv)
{
// rootではない偶数局面で、その訪問回数が現在のn thより多いならそれを記録する。
if ( ply != 0
&& (ply % 2) == 0
&& (ply % 2) == (same_color ? 0 : 1)
&& node->move_count >= tv.nth_nodes()
&& snlist.size() < tv.size()
)
Expand Down Expand Up @@ -508,14 +508,14 @@ namespace dlshogi
// このnodeを再帰的に辿る必要がある。
// move_count以下のものは辿らない、すなわち枝刈りする。
pv.push_back(m);
dfs_for_sfen(node->child_nodes[i].get(), tv , ply + 1, snlist, pv);
dfs_for_sfen(node->child_nodes[i].get(), tv , ply + 1, same_color, snlist, pv);
pv.pop_back();
}
}
}

// 訪問回数上位 n 個の局面のsfen文字列を返す。文字列の先頭にスペースが入る。
void GetTopVisitedNodes(size_t n, SfenNodeList& snlist)
void GetTopVisitedNodes(size_t n, SfenNodeList& snlist, bool same_color)
{
// root node
Node* root_node = searcher.search_limits.current_root;
Expand All @@ -524,12 +524,12 @@ namespace dlshogi
// そのあとx以上の訪問回数を持つ偶数node(rootと同じ手番を持つnode)を列挙すれば良い。

TopVisited tv(n);
dfs_for_node_visited(root_node , tv);
dfs_for_node_visited(root_node, tv , 0, same_color);

// n番目まで訪問回数が確定したので、再度dfsして局面を取り出す。

std::vector<Move> pv;
dfs_for_sfen(root_node, tv, 0 , snlist, pv);
dfs_for_sfen (root_node, tv , 0, same_color, snlist, pv);

// 上位n個(同じ訪問回数のものがあると溢れてる可能性があるのでsortして上位n個を取り出す。)
std::sort(snlist.begin(), snlist.end());
Expand Down
4 changes: 3 additions & 1 deletion source/engine/dlshogi-engine/dlshogi_min.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,15 +40,17 @@ namespace dlshogi {

// 訪問回数上位 n 個の局面のsfen文字列を返す。(ただし探索開始局面と同じ手番になるように偶数手になるように)
// ここで得られた文字列は、探索開始局面のsfenに指し手として文字列の結合をして使う。文字列の先頭にスペースが入る。
// same_colorはtrueならrootと同じ手番の局面(偶数局面)、falseならrootと異なる手番の局面(奇数局面)を返す。
// 例)
//  探索開始局面 = "startpos"
// same_color = true
//  返ってきたsfens = [" 7g7f 8c8d", " 2g2f 3c3d"]
//
// この時、実際にposition文字列として有効なsfen文字列は、
// "startpos moves 7g7f 8c8d"
// "startpos moves 2g2f 3c3d"
// なので、そうなるように文字列を結合すること。
extern void GetTopVisitedNodes(size_t n, SfenNodeList& sfens);
extern void GetTopVisitedNodes(size_t n, SfenNodeList& sfens, bool same_color);

// 探索したノード数を返す。
// これは、ThreadPool classがnodes_searched()で返す値とは異なる。
Expand Down
Loading

0 comments on commit 4f0be71

Please sign in to comment.