Skip to content

Commit

Permalink
- Move class導入。
Browse files Browse the repository at this point in the history
- Move16のmember method追加。
  • Loading branch information
yaneurao committed Oct 12, 2024
1 parent 004ad63 commit 5066434
Show file tree
Hide file tree
Showing 33 changed files with 562 additions and 501 deletions.
29 changes: 14 additions & 15 deletions source/book/book.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,12 +48,12 @@ namespace Book

// Aperyの指し手の変換。
uint16_t convert_move_to_apery(Move16 m) {
const uint16_t ispromote = is_promote(m) ? (1 << 14) : 0;
const uint16_t from = ((is_drop(m)?
(static_cast<uint16_t>(move_dropped_piece(m)) + SQ_NB - 1):
static_cast<uint16_t>(from_sq(m))
const uint16_t ispromote = m.is_promote() ? (1 << 14) : 0;
const uint16_t from = ((m.is_drop()?
(static_cast<uint16_t>(m.move_dropped_piece()) + SQ_NB - 1):
static_cast<uint16_t>(m.from_sq())
) & 0x7f) << 7;
const uint16_t to = static_cast<uint16_t>(to_sq(m)) & 0x7f;
const uint16_t to = static_cast<uint16_t>(m.to_sq()) & 0x7f;
return (ispromote | from | to);
}

Expand Down Expand Up @@ -1105,7 +1105,7 @@ namespace Book
// だから、
// 1. rest_plyの残りがあるならもう1手は出力しないといけないのでponderを出力して良い。
// 2. 但し、この時、ponderが登録されていない(MOVE_NONE)なら出力しない。
if (rest_ply >= 1 && ponderMove16 != MOVE_NONE)
if (rest_ply >= 1 && ponderMove16.to_u16() != MOVE_NONE)
result += " " + ponderMove16.to_usi_string();

} else {
Expand Down Expand Up @@ -1348,7 +1348,7 @@ namespace Book
value = Value(bestBookMove.value);

// ponderが登録されていなければ、bestMoveで一手進めてそこの局面のbestを拾ってくる。
if (!is_ok((Move)ponderMove.to_u16()))
if (!ponderMove.is_ok())
{
Move best = rootPos.to_move(bestMove);
if (rootPos.pseudo_legal_s<true>(best) && rootPos.legal(best))
Expand Down Expand Up @@ -1379,7 +1379,7 @@ namespace Book
Move16 bestMove16, ponderMove16;
Value value;
if (!probe_impl(pos, silent, bestMove16, ponderMove16, value))
return MOVE_NONE;
return Move::none();

Move bestMove = pos.to_move(bestMove16);

Expand Down Expand Up @@ -1440,11 +1440,11 @@ namespace Book
// 定跡ファイルに2手目が書いてあったなら、それをponder用に出力する。
// これが合法手でなかったら将棋所が弾くと思う。
// (ただし、"ponder resign"などと出力してしまうと投了と判定されてしまうらしいので
// 普通の指し手でなければならない。これは、is_ok(Move)で判定できる。)
if (is_ok((Move)ponderMove16.to_u16()))
// 普通の指し手でなければならない。これは、Move16.is_ok()で判定できる。)
if (ponderMove16.is_ok())
{
if (r.pv.size() <= 1)
r.pv.push_back(MOVE_NONE);
r.pv.push_back(Move::none());

// これ32bit Moveに変換してあげるほうが親切なのか…。
StateInfo si;
Expand Down Expand Up @@ -1497,7 +1497,7 @@ namespace Book
string moves1 = "1g1f 2g2f 3g3f 4g4f 5g5f 6f6e 7f7e 8e8d 9g9f 1i1h 9i9h 2h3i 6h6g 6h7i 7g8f 7g9e 8h7h 8h8f 8h8g 8h9h 3h3i 3h4h 5h4h 5h6g 5i4h 5i4i 5i6i";
string moves2 = string();
for(auto m : MoveList<LEGAL_ALL>(pos))
moves2 += (moves2.empty() ? "" : " ") + to_usi_string(m.move);
moves2 += (moves2.empty() ? "" : " ") + to_usi_string(Move(m));

tester.test("feed_position_string" , moves1 == moves2);
}
Expand Down Expand Up @@ -1588,7 +1588,7 @@ namespace BookTools
break;

// MOVE_NULL,MOVE_WINでは局面を進められないのでここで終了。
if (!is_ok(move))
if (!move.is_ok())
break;

si.emplace_back(StateInfo());
Expand Down Expand Up @@ -1635,9 +1635,8 @@ namespace BookTools
StateInfo si2;
vector<string> sfens;

for (auto ml : MoveList<LEGAL_ALL>(pos))
for (auto m : MoveList<LEGAL_ALL>(pos))
{
auto m = ml.move;
pos.do_move(m, si2);
sfens.emplace_back("sfen " + pos.sfen());
pos.undo_move(m);
Expand Down
4 changes: 2 additions & 2 deletions source/book/makebook2015.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ namespace Book
for (size_t i = 0; i < m ; ++i)
{
const auto& rootMoves = th->rootMoves[i];
Move nextMove = (rootMoves.pv.size() >= 1) ? rootMoves.pv[1] : MOVE_NONE;
Move nextMove = (rootMoves.pv.size() >= 1) ? rootMoves.pv[1] : Move::none();

// 出現頻度は、バージョンナンバーを100倍したものにしておく)
// ⇨ ENGINE_VERSIONに数字以外の文字列入れたいことがあるので、これは良くない仕様。
Expand Down Expand Up @@ -410,7 +410,7 @@ namespace Book
}

// MOVE_WIN,MOVE_RESIGNでは局面を進められないのでここで終了。
if (!is_ok(move))
if (!move.is_ok())
break;

append_to_sf();
Expand Down
4 changes: 2 additions & 2 deletions source/book/makebook2023.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -779,7 +779,7 @@ namespace MakeBook2023
// value = draw_value
// depth = ∞
// draw_state = 先後ともに回避できない
BookMove book_move(Move16(move.move),
BookMove book_move(move.to_move16(),
ValueDepth(
draw_value(REPETITION_DRAW, book_node.color()),
BOOK_DEPTH_INF
Expand Down Expand Up @@ -1084,7 +1084,7 @@ namespace MakeBook2023
const auto& book_move = node.moves[i];

// MOVE_NONEならこの枝はないものとして扱う。
if (book_move.move == MOVE_NONE)
if (book_move.move.to_u16() == MOVE_NONE)
continue;

if (book_move.vd.is_superior(best, node.color()))
Expand Down
5 changes: 4 additions & 1 deletion source/engine.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
/*
// 作業中
#if 0
/*
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
Copyright (C) 2004-2024 The Stockfish developers (see AUTHORS file)

Expand Down Expand Up @@ -350,3 +352,4 @@ namespace Stockfish {
}

}
#endif
16 changes: 8 additions & 8 deletions source/engine/dlshogi-engine/Node.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,25 +44,25 @@ namespace dlshogi
// ChildNodes::IsMoveWin(move)のように用いる。
// これはその子ノードへの指し手moveによって、相手が勝ちになるかという判定なので、
// これがtrueであれば現局面は負けの局面ということである。
static bool IsMoveWin(Move m) { return m & VALUE_WIN; }
static bool IsMoveLose(Move m) { return m & VALUE_LOSE; }
static bool IsMoveDraw(Move m) { return m & VALUE_DRAW; }
static bool IsMoveWin(Move m) { return m.to_u32() & VALUE_WIN; }
static bool IsMoveLose(Move m) { return m.to_u32() & VALUE_LOSE; }
static bool IsMoveDraw(Move m) { return m.to_u32() & VALUE_DRAW; }

// メモリ節約のため、moveの最上位バイトでWin/Lose/Drawの状態を表す
// (32bit型のMoveでは、ここは使っていないはずなので)
bool IsWin () const { return IsMoveWin (move); }
bool IsLose() const { return IsMoveLose(move); }
bool IsDraw() const { return IsMoveDraw(move); }
void SetWin () { move = (Move)(move | VALUE_WIN); }
void SetLose() { move = (Move)(move | VALUE_LOSE); }
void SetDraw() { move = (Move)(move | VALUE_DRAW); }
void SetWin () { move = Move(move.to_u32() | VALUE_WIN); }
void SetLose() { move = Move(move.to_u32() | VALUE_LOSE); }
void SetDraw() { move = Move(move.to_u32() | VALUE_DRAW); }
// → SetDraw()したときに、win = DRAW_VALUEにしたほうが良くないかな…。

// 親局面(Node)で、このedgeに至るための指し手
// 上位8bitをWin/Loseのフラグに使っているので、直接値比較をしないこと。getMove()を用いること。
// またこの指し手でdo_move()する時は、getMove()した方行うこと。
Move move;
Move getMove() const { return Move(move & 0xffffff); }
Move getMove() const { return Move(move.to_u32() & 0xffffff); }

// Policy Networkが返してきた、moveが選ばれる確率を正規化したもの。
float nnrate;
Expand Down Expand Up @@ -190,7 +190,7 @@ namespace dlshogi
child = std::make_unique<ChildNode[]>(ml.size());
auto* child_node = child.get();
for (auto m : ml)
(child_node++)->move = m.move;
(child_node++)->move = m;

// 子ノードの数 = 生成された指し手の数
child_num = (ChildNumType)ml.size();
Expand Down
12 changes: 6 additions & 6 deletions source/engine/dlshogi-engine/PrintInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,11 +58,11 @@ namespace dlshogi::UctPrint
// その訪問回数
NodeCountType move_count;

BestMove() : move(MOVE_NONE), wp(0), node(nullptr), move_count(0){}
BestMove() : move(Move::none()), wp(0), node(nullptr), move_count(0){}
BestMove(Move move_,WinType wp_,Node* node_, NodeCountType move_count) :move(move_), wp(wp_) , node(node_) , move_count(move_count) {}
};

BestMovePonder::BestMovePonder() : move(MOVE_NONE), wp(0), ponder(MOVE_NONE) {}
BestMovePonder::BestMovePonder() : move(Move::none()), wp(0), ponder(Move::none()) {}


// あるnodeの子ノードのbestなやつを選択する。
Expand All @@ -86,7 +86,7 @@ namespace dlshogi::UctPrint
}

// あるnodeの子ノードのbestのやつの指し手を返す。
// 詰みの局面ならMOVE_NONEが返る
// 詰みの局面ならMove::none()が返る
std::vector<BestMove> select_best_moves(const Node* node , ChildNumType multiPv)
{
std::vector<BestMove> bests;
Expand Down Expand Up @@ -200,7 +200,7 @@ namespace dlshogi::UctPrint
{
// 詰みを見つけているのでそれを出力する。
const ChildNode* uct_child = rootNode->child.get();
Move move = MOVE_NONE;
Move move = Move::none();
int ply = rootNode->mate_ply;
// 何手で詰むかわからないので最大手数で初期化。
if (ply == 0)
Expand Down Expand Up @@ -236,7 +236,7 @@ namespace dlshogi::UctPrint
if (!silent)
sync_cout << "info score mate " << ply << nps.str() << sync_endl;

return BestMovePonder(move, 1.0, MOVE_NONE);
return BestMovePonder(move, 1.0, Move::none());
}
#endif

Expand All @@ -246,7 +246,7 @@ namespace dlshogi::UctPrint
if (bests.size() == 0)
return BestMovePonder();

Move ponder = MOVE_NONE;
Move ponder = Move::none();
for(ChildNumType i = 0; i < (ChildNumType)bests.size() ; ++i)
{
auto best = bests[i];
Expand Down
2 changes: 1 addition & 1 deletion source/engine/dlshogi-engine/PvMateSearch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ namespace dlshogi

// 詰みの場合、ノードを更新
Move mate_move = dfpn.mate_dfpn(pos, nodes_limit);
if (is_ok(mate_move)) {
if (mate_move.is_ok()) {
// 詰みを発見した。

// rootで詰みを発見したのでメッセージを出力しておく。
Expand Down
10 changes: 5 additions & 5 deletions source/engine/dlshogi-engine/UctSearch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -635,25 +635,25 @@ namespace dlshogi
// Mate::mate_odd_ply()は自分に王手がかかっていても詰みを読めるが遅い。
// leaf nodeでもdf-pn mate solverを用いることにする。

// MOVE_NONE(詰み不明) , MOVE_NULL(不詰)ではない 。これらはis_ok(m) == false
// Move::none()(詰み不明) , Move::null()(不詰)ではない 。これらはis_ok(m) == false
Move mate_move = mate_solver.mate_dfpn(*pos, options.leaf_dfpn_nodes_limit);
if (mate_move == MOVE_NULL)
if (mate_move == Move::null())
{
// 不詰を証明したので、このnodeでは詰み探索をしたことを記録しておく。
// (そうするとPvMateでmate探索が端折れる)
child_node->dfpn_proven_unsolvable = true;
}
else {
isMate = is_ok(mate_move);
isMate = mate_move.is_ok();
}
}
if (!isMate)
// 宣言勝ち
isMate = pos->DeclarationWin() != MOVE_NONE;
isMate = pos->DeclarationWin() != Move::none();

#else
// mateが絡むとdlshogiと異なるノードを探索してしまうのでログ調査する時はオフにする。
bool isMate = (pos->DeclarationWin() != MOVE_NONE); // 宣言勝ち
bool isMate = (pos->DeclarationWin() != Move::none()); // 宣言勝ち
#endif

// 詰みの場合、ValueNetの値を上書き
Expand Down
14 changes: 7 additions & 7 deletions source/engine/dlshogi-engine/dlshogi_searcher.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -364,7 +364,7 @@ namespace dlshogi
// pos : 探索開始局面
// game_root_sfen : ゲーム開始局面のsfen文字列
// moves : ゲーム開始局面からの手順
// ponderMove : [Out] ponderの指し手(ないときはMOVE_NONEが代入される)
// ponderMove : [Out] ponderの指し手(ないときはMove::none()が代入される)
// 返し値 : この局面でのbestな指し手
// ponderの場合は、呼び出し元で待機すること。
Move DlshogiSearcher::UctSearchGenmove(Position* pos, const std::string& game_root_sfen , const std::vector<Move>& moves, Move& ponderMove)
Expand All @@ -374,7 +374,7 @@ namespace dlshogi
searcher.Stop(false);

// これ[Out]なのでとりあえず初期化しておかないと忘れてしまう。
ponderMove = MOVE_NONE;
ponderMove = Move::none();

// 探索停止フラグをreset。
// → やねうら王では使わない。Threads.stopかsearch_limits.interruptionを使う。
Expand Down Expand Up @@ -422,7 +422,7 @@ namespace dlshogi
const ChildNumType child_num = current_root->child_num;
if (child_num == 0) {
// 投了しておく。
return MOVE_RESIGN;
return Move::resign();
}

// ---------------------
Expand Down Expand Up @@ -459,7 +459,7 @@ namespace dlshogi
// 定跡にhitしている以上、合法手がここに格納されているはず。
// ただし定跡DBによっては、2手目が格納されていないことはある。
Move bestMove = th->rootMoves[0].pv[0];
ponderMove = th->rootMoves[0].pv.size() >= 2 ? th->rootMoves[0].pv[1] : MOVE_NONE;
ponderMove = th->rootMoves[0].pv.size() >= 2 ? th->rootMoves[0].pv[1] : Move::none();

return bestMove;
}
Expand Down Expand Up @@ -519,7 +519,7 @@ namespace dlshogi
// → やねうら王では、stopが来るまで待機して返す。
// dlshogiの実装はいったんUCT探索を終了させるようになっているのでコメントアウト。
//if (pondering)
// return MOVE_NONE;
// return Move::none();

// あとで
// 探索の延長判定
Expand All @@ -531,8 +531,8 @@ namespace dlshogi

// 評価値が投了値を下回っていたら投了
if (best.wp < search_options.RESIGN_THRESHOLD) {
ponderMove = MOVE_NONE;
return MOVE_RESIGN;
ponderMove = Move::none();
return Move::resign();
}

// それに対するponderの指し手もあるはずなのでそれをセットしておく。
Expand Down
8 changes: 4 additions & 4 deletions source/engine/tanuki-mate-engine/tanuki-mate-search.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -569,7 +569,7 @@ namespace MateEngine
// thpn child = thpn - pn(n) + pn(n1);
// thdn child = min(thdn, dn(n2) + 1);
// }
Move best_move = MOVE_NONE; // gccで初期化していないという警告がでるのでその回避
Move best_move = Move::none(); // gccで初期化していないという警告がでるのでその回避
int thpn_child;
int thdn_child;
if (or_node) {
Expand Down Expand Up @@ -622,7 +622,7 @@ namespace MateEngine
thdn_child = std::min(thdn, second_best_dn + 1);
}

if (best_move == MOVE_NONE && or_node){
if (best_move == Move::none() && or_node){
entry.pn = kInfinitePnDn;
entry.dn = 0;
return;
Expand Down Expand Up @@ -737,7 +737,7 @@ namespace MateEngine

struct MateState {
int num_moves_to_mate = kSearching;
Move move_to_mate = Move::MOVE_NONE;
Move move_to_mate = Move::none();
};

// 詰み手順を1つ返す
Expand Down Expand Up @@ -799,7 +799,7 @@ namespace MateEngine
}

auto best_num_moves_to_mate = or_node ? int_max : int_min;
auto best_move_to_mate = Move::MOVE_NONE;
auto best_move_to_mate = Move::none();
const auto& entry = transposition_table.LookUp(pos, root_color);

for (const auto& move : move_picker) {
Expand Down
Loading

0 comments on commit 5066434

Please sign in to comment.