X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fevaluate.cpp;h=566eba6d93433659afa89898dac49de293c50cbb;hb=ca6ce6398b1bd21ff2ac29b2dc27d7c25abbb509;hp=98082c4caafe57fd5da4abe76789800d5fe654b1;hpb=3c92f849ab940fd9ac70e838e6d941827fc69cb6;p=stockfish
diff --git a/src/evaluate.cpp b/src/evaluate.cpp
index 98082c4c..566eba6d 100644
--- a/src/evaluate.cpp
+++ b/src/evaluate.cpp
@@ -18,7 +18,6 @@
along with this program. If not, see .
*/
-#include
#include
#include // For std::memset
#include
@@ -73,17 +72,6 @@ using namespace Trace;
namespace {
- constexpr Bitboard QueenSide = FileABB | FileBBB | FileCBB | FileDBB;
- constexpr Bitboard CenterFiles = FileCBB | FileDBB | FileEBB | FileFBB;
- constexpr Bitboard KingSide = FileEBB | FileFBB | FileGBB | FileHBB;
- constexpr Bitboard Center = (FileDBB | FileEBB) & (Rank4BB | Rank5BB);
-
- constexpr Bitboard KingFlank[FILE_NB] = {
- QueenSide ^ FileDBB, QueenSide, QueenSide,
- CenterFiles, CenterFiles,
- KingSide, KingSide, KingSide ^ FileEBB
- };
-
// Threshold for lazy and space evaluation
constexpr Value LazyThreshold = Value(1500);
constexpr Value SpaceThreshold = Value(12222);
@@ -152,6 +140,7 @@ namespace {
constexpr Score KnightOnQueen = S( 16, 12);
constexpr Score LongDiagonalBishop = S( 45, 0);
constexpr Score MinorBehindPawn = S( 18, 3);
+ constexpr Score Outpost = S( 9, 3);
constexpr Score PawnlessFlank = S( 17, 95);
constexpr Score RestrictedPiece = S( 7, 7);
constexpr Score RookOnPawn = S( 10, 32);
@@ -163,7 +152,6 @@ namespace {
constexpr Score TrappedRook = S( 47, 4);
constexpr Score WeakQueen = S( 49, 15);
constexpr Score WeakUnopposedPawn = S( 12, 23);
- constexpr Score Outpost = S( 9, 3);
#undef S
@@ -240,6 +228,8 @@ namespace {
const Square ksq = pos.square(Us);
+ Bitboard dblAttackByPawn = pawn_double_attacks_bb(pos.pieces(Us, PAWN));
+
// Find our pawns that are blocked or on the first two ranks
Bitboard b = pos.pieces(Us, PAWN) & (shift(pos.pieces()) | LowRanks);
@@ -251,7 +241,8 @@ namespace {
attackedBy[Us][KING] = pos.attacks_from(ksq);
attackedBy[Us][PAWN] = pe->pawn_attacks(Us);
attackedBy[Us][ALL_PIECES] = attackedBy[Us][KING] | attackedBy[Us][PAWN];
- attackedBy2[Us] = attackedBy[Us][KING] & attackedBy[Us][PAWN];
+ attackedBy2[Us] = (attackedBy[Us][KING] & attackedBy[Us][PAWN])
+ | dblAttackByPawn;
// Init our king safety tables
kingRing[Us] = attackedBy[Us][KING];
@@ -268,7 +259,7 @@ namespace {
kingAttacksCount[Them] = kingAttackersWeight[Them] = 0;
// Remove from kingRing[] the squares defended by two pawns
- kingRing[Us] &= ~pawn_double_attacks_bb(pos.pieces(Us, PAWN));
+ kingRing[Us] &= ~dblAttackByPawn;
}
@@ -337,7 +328,7 @@ namespace {
// bishop, bigger when the center files are blocked with pawns.
Bitboard blocked = pos.pieces(Us, PAWN) & shift(pos.pieces());
- score -= BishopPawns * pe->pawns_on_same_color_squares(Us, s)
+ score -= BishopPawns * pos.pawns_on_same_color_squares(Us, s)
* (1 + popcount(blocked & CenterFiles));
// Bonus for bishop on a long diagonal which can "see" both center squares
@@ -367,8 +358,8 @@ namespace {
score += RookOnPawn * popcount(pos.pieces(Them, PAWN) & PseudoAttacks[ROOK][s]);
// Bonus for rook on an open or semi-open file
- if (pe->semiopen_file(Us, file_of(s)))
- score += RookOnFile[bool(pe->semiopen_file(Them, file_of(s)))];
+ if (pos.semiopen_file(Us, file_of(s)))
+ score += RookOnFile[bool(pos.semiopen_file(Them, file_of(s)))];
// Penalty when trapped by the king, even more if the king cannot castle
else if (mob <= 3)
@@ -402,7 +393,8 @@ namespace {
constexpr Bitboard Camp = (Us == WHITE ? AllSquares ^ Rank6BB ^ Rank7BB ^ Rank8BB
: AllSquares ^ Rank1BB ^ Rank2BB ^ Rank3BB);
- Bitboard weak, b, b1, b2, safe, unsafeChecks = 0;
+ Bitboard weak, b1, b2, safe, unsafeChecks = 0;
+ Bitboard rookChecks, queenChecks, bishopChecks, knightChecks;
int kingDanger = 0;
const Square ksq = pos.square(Us);
@@ -422,45 +414,43 @@ namespace {
b2 = attacks_bb(ksq, pos.pieces() ^ pos.pieces(Us, QUEEN));
// Enemy rooks checks
- Bitboard RookCheck = b1
- & safe
- & attackedBy[Them][ROOK];
+ rookChecks = b1 & safe & attackedBy[Them][ROOK];
- if (RookCheck)
+ if (rookChecks)
kingDanger += RookSafeCheck;
else
unsafeChecks |= b1 & attackedBy[Them][ROOK];
// Enemy queen safe checks: we count them only if they are from squares from
// which we can't give a rook check, because rook checks are more valuable.
- Bitboard QueenCheck = (b1 | b2)
- & attackedBy[Them][QUEEN]
- & safe
- & ~attackedBy[Us][QUEEN]
- & ~RookCheck;
+ queenChecks = (b1 | b2)
+ & attackedBy[Them][QUEEN]
+ & safe
+ & ~attackedBy[Us][QUEEN]
+ & ~rookChecks;
- if (QueenCheck)
+ if (queenChecks)
kingDanger += QueenSafeCheck;
// Enemy bishops checks: we count them only if they are from squares from
// which we can't give a queen check, because queen checks are more valuable.
- Bitboard BishopCheck = b2
- & attackedBy[Them][BISHOP]
- & safe
- & ~QueenCheck;
+ bishopChecks = b2
+ & attackedBy[Them][BISHOP]
+ & safe
+ & ~queenChecks;
- if (BishopCheck)
+ if (bishopChecks)
kingDanger += BishopSafeCheck;
else
unsafeChecks |= b2 & attackedBy[Them][BISHOP];
// Enemy knights checks
- b = pos.attacks_from(ksq) & attackedBy[Them][KNIGHT];
+ knightChecks = pos.attacks_from(ksq) & attackedBy[Them][KNIGHT];
- if (b & safe)
+ if (knightChecks & safe)
kingDanger += KnightSafeCheck;
else
- unsafeChecks |= b;
+ unsafeChecks |= knightChecks;
// Unsafe or occupied checking squares will also be considered, as long as
// the square is in the attacker's mobility area.
@@ -482,10 +472,10 @@ namespace {
- 6 * mg_value(score) / 8
+ mg_value(mobility[Them] - mobility[Us])
+ 5 * kingFlankAttacks * kingFlankAttacks / 16
- - 25;
+ - 15;
// Transform the kingDanger units into a Score, and subtract it from the evaluation
- if (kingDanger > 0)
+ if (kingDanger > 100)
score -= make_score(kingDanger * kingDanger / 4096, kingDanger / 16);
// Penalty when our king is on a pawnless flank
@@ -511,7 +501,7 @@ namespace {
constexpr Direction Up = (Us == WHITE ? NORTH : SOUTH);
constexpr Bitboard TRank3BB = (Us == WHITE ? Rank3BB : Rank6BB);
- Bitboard b, weak, defended, nonPawnEnemies, stronglyProtected, safe, restricted;
+ Bitboard b, weak, defended, nonPawnEnemies, stronglyProtected, safe;
Score score = SCORE_ZERO;
// Non-pawn enemies
@@ -561,10 +551,11 @@ namespace {
}
// Bonus for restricting their piece moves
- restricted = attackedBy[Them][ALL_PIECES]
- & ~stronglyProtected
- & attackedBy[Us][ALL_PIECES];
- score += RestrictedPiece * popcount(restricted);
+ b = attackedBy[Them][ALL_PIECES]
+ & ~stronglyProtected
+ & attackedBy[Us][ALL_PIECES];
+
+ score += RestrictedPiece * popcount(b);
// Bonus for enemy unopposed weak pawns
if (pos.pieces(Us, ROOK, QUEEN))
@@ -729,7 +720,7 @@ namespace {
int bonus = popcount(safe) + popcount(behind & safe);
int weight = pos.count(Us)
- - 2 * popcount(pe->semiopenFiles[WHITE] & pe->semiopenFiles[BLACK]);
+ - (16 - pos.count()) / 4;
Score score = make_score(bonus * weight * weight / 16, 0);
@@ -754,12 +745,12 @@ namespace {
&& (pos.pieces(PAWN) & KingSide);
// Compute the initiative bonus for the attacking side
- int complexity = 9 * pe->pawn_asymmetry()
+ int complexity = 9 * pe->passed_count()
+ 11 * pos.count()
+ 9 * outflanking
+ 18 * pawnsOnBothFlanks
+ 49 * !pos.non_pawn_material()
- -121 ;
+ -103 ;
// Now apply the bonus: note that we find the attacking side by extracting
// the sign of the endgame value, and that we carefully cap the bonus so
@@ -787,7 +778,7 @@ namespace {
if ( pos.opposite_bishops()
&& pos.non_pawn_material(WHITE) == BishopValueMg
&& pos.non_pawn_material(BLACK) == BishopValueMg)
- sf = 8 + 4 * pe->pawn_asymmetry();
+ sf = 16 + 4 * pe->passed_count();
else
sf = std::min(40 + (pos.opposite_bishops() ? 2 : 7) * pos.count(strongSide), sf);
@@ -901,7 +892,6 @@ std::string Eval::trace(const Position& pos) {
<< " ------------+-------------+-------------+------------\n"
<< " Material | " << Term(MATERIAL)
<< " Imbalance | " << Term(IMBALANCE)
- << " Initiative | " << Term(INITIATIVE)
<< " Pawns | " << Term(PAWN)
<< " Knights | " << Term(KNIGHT)
<< " Bishops | " << Term(BISHOP)
@@ -912,6 +902,7 @@ std::string Eval::trace(const Position& pos) {
<< " Threats | " << Term(THREAT)
<< " Passed | " << Term(PASSED)
<< " Space | " << Term(SPACE)
+ << " Initiative | " << Term(INITIATIVE)
<< " ------------+-------------+-------------+------------\n"
<< " Total | " << Term(TOTAL);