Skip to content

Commit

Permalink
- Moveからのboolの変換はexplicitを指定とそれに伴う修正。
Browse files Browse the repository at this point in the history
  • Loading branch information
yaneurao committed Oct 14, 2024
1 parent 121f7f8 commit 8d88446
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 38 deletions.
2 changes: 1 addition & 1 deletion source/book/book.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1584,7 +1584,7 @@ namespace BookTools
{
// 非合法手ならUSI::to_moveはMOVE_NONEを返すはず…。
Move move = USI::to_move(pos, token);
if (move == MOVE_NONE)
if (move == Move::none())
break;

// MOVE_NULL,MOVE_WINでは局面を進められないのでここで終了。
Expand Down
8 changes: 4 additions & 4 deletions source/mate/mate_dfpn.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@ namespace Mate::Dfpn32
template <bool or_node>
void init(ExtMove m)
{
lastMove = Move(m);
lastMove = m.to_u32();

if (MoveOrdering)
{
Expand All @@ -251,7 +251,7 @@ namespace Mate::Dfpn32
template <bool or_node>
void init_mate_move(Move move ,int ply = 0)
{
this->lastMove = move;
this->lastMove = move.to_u32();
this->template set_mate<true>(ply);

// これはnullptrを意味する。
Expand Down Expand Up @@ -561,7 +561,7 @@ namespace Mate::Dfpn32
// ただしorノードではdnは最小であってほしい。(これが詰みまでの距離を表現しているので)
// andノードではdnは最大であってほしい。
Move move = or_node ? pick_the_best<true,proof,current>(node) : pick_the_best<false,proof,current>(node);
if (move == MOVE_NONE)
if (move == Move::none())
break;

pv.push_back(move);
Expand Down Expand Up @@ -1139,7 +1139,7 @@ namespace Mate::Dfpn32
if (or_node && !pos.in_check())
{
Move mate_move = Mate::mate_1ply(pos);
if (mate_move != MOVE_NONE)
if (mate_move != Move::none())
{
// 詰んだ
NodeType* child = new_node(1);
Expand Down
5 changes: 4 additions & 1 deletion source/thread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -308,7 +308,10 @@ Thread* ThreadPool::get_best_thread() const {
// いい指し手を発見している可能性があって楽観合議のような効果があるようだ。

Thread* bestThread = threads.front();
std::map<Move, int64_t> votes;

std::unordered_map<Move, int64_t, Move::MoveHash> votes(
2 * std::min(size(), bestThread->rootMoves.size()));

Value minScore = VALUE_NONE;

// Find minimum score of all threads
Expand Down
59 changes: 28 additions & 31 deletions source/types.h
Original file line number Diff line number Diff line change
Expand Up @@ -618,6 +618,14 @@ constexpr bool is_ok(PieceNumber pn) { return pn < PIECE_NUMBER_NB; }
// 指し手
// --------------------

// Based on a congruential pseudo-random number generator
// 合同式による疑似乱数生成器に基づいています。
// ⇨ Move型のhashを生成するときに用いる。

constexpr /*Key*/uint64_t make_key(uint64_t seed) {
return seed * 6364136223846793005ULL + 1442695040888963407ULL;
}

class Move;
class Move16;

Expand Down Expand Up @@ -720,27 +728,33 @@ class Move
return (data >> 7) != (data & 0x7f);
}

// -- 比較

bool operator == (const Move rhs) const { return this->to_u32() == rhs.to_u32(); }
bool operator != (const Move rhs) const { return !(*this == rhs); }

// -- 変換子

// Move16への変換子
Move16 to_move16() const;
constexpr uint16_t to_u16() const { return (uint16_t)data; }
constexpr uint32_t to_u32() const { return (uint32_t)data; }
constexpr operator bool() const { return data; }
constexpr explicit operator bool() const { return data != 0; }

// 暗黙的にboolに変換されて意図しない足し算がなされてしまうことがある。
// 例) Move m; Square s;に対して m + s みたいな足し算。
// これを禁止するのは難しい…。
// -- 比較

bool operator == (const Move rhs) const { return this->to_u32() == rhs.to_u32(); }
bool operator != (const Move rhs) const { return !(*this == rhs); }

// -- 文字列化

// USI形式の文字列にする。
std::string to_usi_string() const { return ::to_usi_string(*this); }

// -- unordered_mapなどで比較するときに用いる。operator<()は定義したくないので、こちらを用いる。
struct MoveHash {
std::size_t operator()(const Move& m) const { return make_key(m.data); }
};

protected:
std::uint32_t data;
};
Expand Down Expand Up @@ -769,6 +783,14 @@ class Move16
int from_to() const { return int(from_sq() + int(is_drop() ? (SQ_NB - 1) : 0)) * int(SQ_NB) + int(to_sq()); }
constexpr bool is_ok() const { return (data >> 7) != (data & 0x7f); }

// -- 比較

// Move16同士とMoveの定数とも比較はできる。
bool operator == (const Move16 rhs) const { return data == rhs.data; }
bool operator != (const Move16 rhs) const { return !(*this == rhs); }
bool operator == (const Move rhs) const { return this->to_u16() == rhs.to_u16(); }
bool operator != (const Move rhs) const { return !(*this == rhs); }

// -- 変換子

// uint16_tのまま取り出す。
Expand All @@ -780,14 +802,6 @@ class Move16
//constexpr operator bool() const { return data; }
// ⇨ これ定義していると余計なバグに悩まされることになる。

// -- 比較

// Move16同士とMoveの定数とも比較はできる。
bool operator == (const Move16 rhs) const { return data == rhs.data; }
bool operator != (const Move16 rhs) const { return !(*this == rhs); }
bool operator == (const Move rhs) const { return this->to_u16() == rhs.to_u16(); }
bool operator != (const Move rhs) const { return !(*this == rhs); }

// -- 文字列化

// USI形式の文字列にする。
Expand Down Expand Up @@ -886,7 +900,7 @@ struct ExtMove : public Move {
operator float() const = delete;
};

// ExtMoveの並べ替えを行なうので比較オペレーターを定義しておく
// partial_insertion_sort()でExtMoveの並べ替えを行なうので比較オペレーターを定義しておく
constexpr bool operator<(const ExtMove& first, const ExtMove& second) {
return first.value < second.value;
}
Expand Down Expand Up @@ -1126,23 +1140,6 @@ struct MoveList {
// 盤面(盤上の駒 + 手駒)に対して、Zobrist Hashでそれに対応する値を計算する。
using Key = uint64_t;

#if 0
// 合同法による擬似乱数生成器
// 探索で、excludedMoveを考慮した局面のhash keyが欲しいので、それを生成するために
// excludedMoveをseedとする擬似乱数を発生させる必要があり、そこで用いられる。
// cf. https://github.com/official-stockfish/Stockfish/commit/de24fcebc873ce2d65b30e039745dbc2e851f443
//
// やねうら王独自拡張
// pos.key()にxorをとるときにbit0(先後フラグ)を潰してはいけないので、
// ここではbit0が0になっている数(偶数)を返すことにした。
// あと、HashKeyとして128bitのkeyを使うとき(特殊用途)は、この関数は128bitの値を返さないといけない。(未対応)
constexpr Key make_key(uint64_t seed) {
return (seed * 6364136223846793005ULL + 1442695040888963407ULL) & ~1ULL;
}

// → この関数はStockfish 16で使わなくなった。
#endif

// --------------------
// 探索
// --------------------
Expand Down
2 changes: 1 addition & 1 deletion source/usi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1176,7 +1176,7 @@ void USI::UnitTest(Test::UnitTester& tester)
while (is >> token)
{
Move m = USI::to_move(pos,token);
if (m == MOVE_NONE)
if (m == Move::none())
fail = true;

pos.do_move(m, si[pos.game_ply()]);
Expand Down

0 comments on commit 8d88446

Please sign in to comment.