Skip to content

Commit

Permalink
- 定数VALUE_KNOWN_WIN削除
Browse files Browse the repository at this point in the history
  - ちょっと枝刈りの挙動が変わったかも。
- null moveの適用depth、13未満→14未満に変更。
- MSVCでwarning 4127,4146,4800の抑制。
- typedefのところusingで書き直す。
  • Loading branch information
yaneurao committed Oct 14, 2023
1 parent a0085fc commit 8b8865b
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 29 deletions.
2 changes: 2 additions & 0 deletions source/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -674,6 +674,8 @@ constexpr bool pretty_jp = false;
#define HASH_KEY_BITS 64
#endif

// ここ、typedef ではなく usingで書きたいが、現時点でKey64が未定義なので…。

#if HASH_KEY_BITS <= 64
#define HASH_KEY Key64
#elif HASH_KEY_BITS <= 128
Expand Down
4 changes: 2 additions & 2 deletions source/engine/yaneuraou-engine/yaneuraou-param.h
Original file line number Diff line number Diff line change
Expand Up @@ -133,11 +133,11 @@ PARAM_DEFINE PARAM_NULL_MOVE_MARGIN4 = 198;


// null moveでbeta値を上回ったときに、これ以下ならreturnするdepth。適用depth。
// 元の値 = 13
// 元の値 = 14
// 他のNULL_MOVEの値が悪いと、この枝刈りを適用しないほうが強くなるわけで、
// このdepthがどんどん高い値に発散してしまうので注意。
// [PARAM] min:4,max:16,step:1,interval:1,time_rate:1,fixed
PARAM_DEFINE PARAM_NULL_MOVE_RETURN_DEPTH = 13;
PARAM_DEFINE PARAM_NULL_MOVE_RETURN_DEPTH = 14;


//
Expand Down
32 changes: 13 additions & 19 deletions source/engine/yaneuraou-engine/yaneuraou-search.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1879,16 +1879,11 @@ namespace {
&& depth < PARAM_FUTILITY_RETURN_DEPTH/*8*/
&& eval - futility_margin(depth, improving) - (ss - 1)->statScore / 256 >= beta
&& eval >= beta
&& eval < VALUE_KNOWN_WIN + MAX_PLY * 2 /*26305*/) // larger than VALUE_KNOWN_WIN, but smaller than TB wins.

// 詰み絡み等だとmate distance pruningで枝刈りされるはずで、ここでは枝刈りしない。
// Stockfishでは、上の最後の条件は、
// && eval < 26305) // larger than VALUE_KNOWN_WIN, but smaller than TB wins.
// となっているが、StockfishではVALUE_KNOWN_WIN == 10000で、これより十分大きく、
// TB winより小さな値として26305となっている。
// やねうら王では、VALUE_KNOWN_WINは mateと1000しか離れていないため、
// VALUE_KNOWN_WIN + MAX_PLY * 2で代用する。(そこまではfutility pruningして良いという考え)
// そこを超えるとmateのスコアになってくるので futilityで刈るのは危ない。
&& eval < 29462) // smaller than TB wins

// 29462の根拠はよくわからないが、VALUE_TB_WIN_IN_MAX_PLY より少し小さい値にしたいようだ。
// そこまではfutility pruningで枝刈りして良いと言うことなのだろう。
// また、詰み絡み等だとmate distance pruningで枝刈りされるはずで、ここでは枝刈りしない。

return eval;
// 次のようにするより、単にevalを返したほうが良いらしい。
Expand Down Expand Up @@ -1945,11 +1940,11 @@ namespace {
// これをもう少しちゃんと検証しなおす。

// Do not return unproven mate or TB scores
// 証明されていないmate scoreはreturnで返さない。
if (nullValue >= VALUE_TB_WIN_IN_MAX_PLY)
nullValue = beta;
// 証明されていないmate scoreやTB scoreはreturnで返さない。

nullValue = std::min(nullValue, VALUE_TB_WIN_IN_MAX_PLY-1);

if (thisThread->nmpMinPly || (abs(beta) < VALUE_KNOWN_WIN && depth < PARAM_NULL_MOVE_RETURN_DEPTH/*13*/ ))
if (thisThread->nmpMinPly || depth < PARAM_NULL_MOVE_RETURN_DEPTH/*14*/)
return nullValue;

ASSERT_LV3(!thisThread->nmpMinPly); // 再帰的な検証は認めていない。
Expand Down Expand Up @@ -2116,12 +2111,11 @@ namespace {
&& (tte->bound() & BOUND_LOWER)
&& tte->depth() >= depth - 3
&& ttValue >= probCutBeta
&& abs(ttValue) <= VALUE_KNOWN_WIN
&& abs(beta) <= VALUE_KNOWN_WIN
&& abs(ttValue) < VALUE_TB_WIN_IN_MAX_PLY
&& abs(beta) < VALUE_TB_WIN_IN_MAX_PLY
)
return probCutBeta;


// -----------------------
// moves loopに入る前の準備
// -----------------------
Expand Down Expand Up @@ -2378,7 +2372,7 @@ namespace {
&& move == ttMove
&& !excludedMove // 再帰的なsingular延長を除外する。
/* && ttValue != VALUE_NONE Already implicit in the next condition */
&& abs(ttValue) < VALUE_KNOWN_WIN // 詰み絡みのスコアはsingular extensionはしない。(Stockfish 10~)
&& abs(ttValue) < VALUE_TB_WIN_IN_MAX_PLY // 詰み絡みのスコアはsingular extensionはしない。(Stockfish 10~)
&& (tte->bound() & BOUND_LOWER)
&& tte->depth() >= depth - 3)
// このnodeについてある程度調べたことが置換表によって証明されている。(ttMove == moveなのでttMove != MOVE_NONE)
Expand Down Expand Up @@ -3263,7 +3257,7 @@ namespace {
if ( bestValue > VALUE_TB_LOSS_IN_MAX_PLY
&& !givesCheck
&& to_sq(move) != prevSq
&& futilityBase > -VALUE_KNOWN_WIN
&& futilityBase > VALUE_TB_LOSS_IN_MAX_PLY
// && type_of(move) != PROMOTION) // TODO : これ入れたほうがいいのか?
)
{
Expand Down
25 changes: 17 additions & 8 deletions source/types.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,22 @@
#include <algorithm> // std::max()を使うので仕方ない
#include <limits> // std::numeric_limitsを使うので仕方ない

#if defined(_MSC_VER)
// Disable some silly and noisy warnings from MSVC compiler
#pragma warning(disable: 4127) // Conditional expression is constant
#pragma warning(disable: 4146) // Unary minus operator applied to unsigned type
#pragma warning(disable: 4800) // Forcing value to bool 'true' or 'false'
#endif

/// Predefined macros hell:
///
/// __GNUC__ Compiler is GCC, Clang or ICX
/// __clang__ Compiler is Clang or ICX
/// __INTEL_LLVM_COMPILER Compiler is ICX
/// _MSC_VER Compiler is MSVC
/// _WIN32 Building on Windows (any)
/// _WIN64 Building on Windows 64 bit

// --------------------
// 型の最小値・最大値
// --------------------
Expand Down Expand Up @@ -358,7 +374,7 @@ static bool aligned(Square sq1, Square sq2, Square sq3/* is ksq */)
constexpr int MAX_PLY = MAX_PLY_NUM;

// 探索深さを表現する型
typedef int Depth;
using Depth = int;

enum : int {

Expand Down Expand Up @@ -422,13 +438,6 @@ enum Value: int32_t
VALUE_MATE_IN_MAX_PLY = VALUE_MATE - MAX_PLY , // MAX_PLYでの詰みのときのスコア。
VALUE_MATED_IN_MAX_PLY = -VALUE_MATE_IN_MAX_PLY , // MAX_PLYで詰まされるときのスコア。


// 勝ち手順が何らか証明されているときのスコア下限値
// Stockfishでは10000に設定されているが、あまり低い数字にすると、
// 評価値(evaluate()の返し値)がこれを超えてしまい、誤動作する。
// やねうら王では、ぎりぎりの値にしておきたい。
VALUE_KNOWN_WIN = int(VALUE_MATE_IN_MAX_PLY) - 1000,

// 千日手による優等局面への突入したときのスコア
// これある程度離しておかないと、置換表に書き込んで、相手番から見て、これから
// singularの判定なんかをしようと思ったときに
Expand Down

0 comments on commit 8b8865b

Please sign in to comment.