From 8b8865bf6cd9e0f6e5abbf3a757621f447ffa52b Mon Sep 17 00:00:00 2001 From: yaneurao Date: Sun, 15 Oct 2023 02:35:01 +0900 Subject: [PATCH] =?UTF-8?q?-=20=E5=AE=9A=E6=95=B0VALUE=5FKNOWN=5FWIN?= =?UTF-8?q?=E5=89=8A=E9=99=A4=20=20=20-=20=E3=81=A1=E3=82=87=E3=81=A3?= =?UTF-8?q?=E3=81=A8=E6=9E=9D=E5=88=88=E3=82=8A=E3=81=AE=E6=8C=99=E5=8B=95?= =?UTF-8?q?=E3=81=8C=E5=A4=89=E3=82=8F=E3=81=A3=E3=81=9F=E3=81=8B=E3=82=82?= =?UTF-8?q?=E3=80=82=20-=20null=20move=E3=81=AE=E9=81=A9=E7=94=A8depth?= =?UTF-8?q?=E3=80=8113=E6=9C=AA=E6=BA=80=E2=86=9214=E6=9C=AA=E6=BA=80?= =?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4=E3=80=82=20-=20MSVC=E3=81=A7warning?= =?UTF-8?q?=204127,4146,4800=E3=81=AE=E6=8A=91=E5=88=B6=E3=80=82=20-=20typ?= =?UTF-8?q?edef=E3=81=AE=E3=81=A8=E3=81=93=E3=82=8Dusing=E3=81=A7=E6=9B=B8?= =?UTF-8?q?=E3=81=8D=E7=9B=B4=E3=81=99=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/config.h | 2 ++ .../engine/yaneuraou-engine/yaneuraou-param.h | 4 +-- .../yaneuraou-engine/yaneuraou-search.cpp | 32 ++++++++----------- source/types.h | 25 ++++++++++----- 4 files changed, 34 insertions(+), 29 deletions(-) diff --git a/source/config.h b/source/config.h index e2b9b02f6..0a663650f 100644 --- a/source/config.h +++ b/source/config.h @@ -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 diff --git a/source/engine/yaneuraou-engine/yaneuraou-param.h b/source/engine/yaneuraou-engine/yaneuraou-param.h index d371b641c..4f9da6bb7 100644 --- a/source/engine/yaneuraou-engine/yaneuraou-param.h +++ b/source/engine/yaneuraou-engine/yaneuraou-param.h @@ -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; // diff --git a/source/engine/yaneuraou-engine/yaneuraou-search.cpp b/source/engine/yaneuraou-engine/yaneuraou-search.cpp index 96f839246..955a765ea 100644 --- a/source/engine/yaneuraou-engine/yaneuraou-search.cpp +++ b/source/engine/yaneuraou-engine/yaneuraou-search.cpp @@ -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を返したほうが良いらしい。 @@ -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); // 再帰的な検証は認めていない。 @@ -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に入る前の準備 // ----------------------- @@ -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) @@ -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 : これ入れたほうがいいのか? ) { diff --git a/source/types.h b/source/types.h index a3bfbadef..5b2901bd5 100644 --- a/source/types.h +++ b/source/types.h @@ -21,6 +21,22 @@ #include // std::max()を使うので仕方ない #include // 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 + // -------------------- // 型の最小値・最大値 // -------------------- @@ -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 { @@ -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の判定なんかをしようと思ったときに