mirror of
https://github.com/sockspls/badfish
synced 2025-04-30 16:53:09 +00:00
Multiple lazy stages.
An extension of the lazy eval idea: when the score is sufficiently large we now skip more granular parts of the eval. Inspired by an original patch by Moez Jellouli https://tests.stockfishchess.org/tests/view/5f03b2a159f6f03532894529 Credit to him! STC https://tests.stockfishchess.org/tests/view/5f0a862c59f6f03532894924 LLR: 2.95 (-2.94,2.94) {-0.50,1.50} Total: 13504 W: 2684 L: 2472 D: 8348 Ptnml(0-2): 229, 1496, 3111, 1666, 250 LTC https://tests.stockfishchess.org/tests/view/5f0ac0e159f6f0353289495b LLR: 2.94 (-2.94,2.94) {0.25,1.75} Total: 31312 W: 3926 L: 3677 D: 23709 Ptnml(0-2): 185, 2773, 9509, 2986, 203 closes https://github.com/official-stockfish/Stockfish/pull/2814 bench: 4541608
This commit is contained in:
parent
6c197c3964
commit
c3092c54bc
1 changed files with 17 additions and 8 deletions
|
@ -74,7 +74,8 @@ using namespace Trace;
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
// Threshold for lazy and space evaluation
|
// Threshold for lazy and space evaluation
|
||||||
constexpr Value LazyThreshold = Value(1400);
|
constexpr Value LazyThreshold1 = Value(1400);
|
||||||
|
constexpr Value LazyThreshold2 = Value(1300);
|
||||||
constexpr Value SpaceThreshold = Value(12222);
|
constexpr Value SpaceThreshold = Value(12222);
|
||||||
|
|
||||||
// KingAttackWeights[PieceType] contains king attack weights by piece type
|
// KingAttackWeights[PieceType] contains king attack weights by piece type
|
||||||
|
@ -786,7 +787,7 @@ namespace {
|
||||||
&& pos.non_pawn_material(BLACK) == RookValueMg
|
&& pos.non_pawn_material(BLACK) == RookValueMg
|
||||||
&& pos.count<PAWN>(strongSide) - pos.count<PAWN>(~strongSide) <= 1
|
&& pos.count<PAWN>(strongSide) - pos.count<PAWN>(~strongSide) <= 1
|
||||||
&& bool(KingSide & pos.pieces(strongSide, PAWN)) != bool(QueenSide & pos.pieces(strongSide, PAWN))
|
&& bool(KingSide & pos.pieces(strongSide, PAWN)) != bool(QueenSide & pos.pieces(strongSide, PAWN))
|
||||||
&& (attackedBy[~strongSide][KING] & pos.pieces(~strongSide, PAWN)))
|
&& (attacks_bb<KING>(pos.square<KING>(~strongSide)) & pos.pieces(~strongSide, PAWN)))
|
||||||
sf = 36;
|
sf = 36;
|
||||||
else if (pos.count<QUEEN>() == 1)
|
else if (pos.count<QUEEN>() == 1)
|
||||||
sf = 37 + 3 * (pos.count<QUEEN>(WHITE) == 1 ? pos.count<BISHOP>(BLACK) + pos.count<KNIGHT>(BLACK)
|
sf = 37 + 3 * (pos.count<QUEEN>(WHITE) == 1 ? pos.count<BISHOP>(BLACK) + pos.count<KNIGHT>(BLACK)
|
||||||
|
@ -837,9 +838,12 @@ namespace {
|
||||||
score += pe->pawn_score(WHITE) - pe->pawn_score(BLACK);
|
score += pe->pawn_score(WHITE) - pe->pawn_score(BLACK);
|
||||||
|
|
||||||
// Early exit if score is high
|
// Early exit if score is high
|
||||||
Value v = (mg_value(score) + eg_value(score)) / 2;
|
auto lazy_skip = [&](Value lazyThreshold) {
|
||||||
if (abs(v) > LazyThreshold + pos.non_pawn_material() / 64)
|
return abs(mg_value(score) + eg_value(score)) / 2 > lazyThreshold + pos.non_pawn_material() / 64;
|
||||||
return pos.side_to_move() == WHITE ? v : -v;
|
};
|
||||||
|
|
||||||
|
if (lazy_skip(LazyThreshold1))
|
||||||
|
goto make_v;
|
||||||
|
|
||||||
// Main evaluation begins here
|
// Main evaluation begins here
|
||||||
initialize<WHITE>();
|
initialize<WHITE>();
|
||||||
|
@ -856,12 +860,17 @@ namespace {
|
||||||
|
|
||||||
// More complex interactions that require fully populated attack bitboards
|
// More complex interactions that require fully populated attack bitboards
|
||||||
score += king< WHITE>() - king< BLACK>()
|
score += king< WHITE>() - king< BLACK>()
|
||||||
+ threats<WHITE>() - threats<BLACK>()
|
+ passed< WHITE>() - passed< BLACK>();
|
||||||
+ passed< WHITE>() - passed< BLACK>()
|
|
||||||
|
if (lazy_skip(LazyThreshold2))
|
||||||
|
goto make_v;
|
||||||
|
|
||||||
|
score += threats<WHITE>() - threats<BLACK>()
|
||||||
+ space< WHITE>() - space< BLACK>();
|
+ space< WHITE>() - space< BLACK>();
|
||||||
|
|
||||||
|
make_v:
|
||||||
// Derive single value from mg and eg parts of score
|
// Derive single value from mg and eg parts of score
|
||||||
v = winnable(score);
|
Value v = winnable(score);
|
||||||
|
|
||||||
// In case of tracing add all remaining individual evaluation terms
|
// In case of tracing add all remaining individual evaluation terms
|
||||||
if (T)
|
if (T)
|
||||||
|
|
Loading…
Add table
Reference in a new issue