X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fevaluate.cpp;h=5750d82a7281bbd9ff91f6b22f137b9e9fac0600;hb=4e72e2a964754611de85536c13ae069f85839b85;hp=deb8211ab7d5d86d3f214f0b9e5f11231d786ee6;hpb=c8589903777b6e0289640b43fae966ded442af48;p=stockfish
diff --git a/src/evaluate.cpp b/src/evaluate.cpp
index deb8211a..5750d82a 100644
--- a/src/evaluate.cpp
+++ b/src/evaluate.cpp
@@ -18,6 +18,7 @@
along with this program. If not, see .
*/
+#include
#include
#include // For std::memset
#include
@@ -186,9 +187,8 @@ namespace {
// is also calculated is ALL_PIECES.
Bitboard attackedBy[COLOR_NB][PIECE_TYPE_NB];
- // attackedBy2[color] are the squares attacked by 2 pieces of a given color,
- // possibly via x-ray or by one pawn and one piece. Diagonal x-ray through
- // pawn or squares attacked by 2 pawns are not explicitly added.
+ // attackedBy2[color] are the squares attacked by at least 2 units of a given
+ // color, including x-rays. But diagonal x-rays through pawns are not computed.
Bitboard attackedBy2[COLOR_NB];
// kingRing[color] are the squares adjacent to the king, plus (only for a
@@ -228,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);
@@ -239,7 +241,7 @@ 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] = dblAttackByPawn | (attackedBy[Us][KING] & attackedBy[Us][PAWN]);
// Init our king safety tables
kingRing[Us] = attackedBy[Us][KING];
@@ -256,7 +258,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;
}
@@ -306,11 +308,11 @@ namespace {
bb = OutpostRanks & ~pe->pawn_attacks_span(Them);
if (bb & s)
score += Outpost * (Pt == KNIGHT ? 4 : 2)
- * (1 + bool(attackedBy[Us][PAWN] & s));
+ * ((attackedBy[Us][PAWN] & s) ? 2 : 1);
else if (bb &= b & ~pos.pieces(Us))
score += Outpost * (Pt == KNIGHT ? 2 : 1)
- * (1 + bool(attackedBy[Us][PAWN] & bb));
+ * ((attackedBy[Us][PAWN] & bb) ? 2 : 1);
// Knight and Bishop bonus for being right behind a pawn
if (shift(pos.pieces(PAWN)) & s)
@@ -325,7 +327,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
@@ -355,8 +357,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.is_semiopen_file(Us, file_of(s)))
+ score += RookOnFile[bool(pos.is_semiopen_file(Them, file_of(s)))];
// Penalty when trapped by the king, even more if the king cannot castle
else if (mob <= 3)
@@ -464,15 +466,16 @@ namespace {
+ 69 * kingAttacksCount[Them]
+ 185 * popcount(kingRing[Us] & weak)
- 100 * bool(attackedBy[Us][KNIGHT] & attackedBy[Us][KING])
+ - 35 * bool(attackedBy[Us][BISHOP] & attackedBy[Us][KING])
+ 150 * popcount(pos.blockers_for_king(Us) | unsafeChecks)
- 873 * !pos.count(Them)
- 6 * mg_value(score) / 8
+ mg_value(mobility[Them] - mobility[Us])
+ 5 * kingFlankAttacks * kingFlankAttacks / 16
- - 25;
+ - 7;
// 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
@@ -668,7 +671,7 @@ namespace {
bonus += make_score(k * w, k * w);
}
- } // rank > RANK_3
+ } // r > RANK_3
// Scale down bonus for candidate passers which need more than one
// pawn push to become passed, or have a pawn in front of them.
@@ -713,11 +716,11 @@ namespace {
// Find all squares which are at most three squares behind some friendly pawn
Bitboard behind = pos.pieces(Us, PAWN);
behind |= shift(behind);
- behind |= shift(shift(behind));
+ behind |= shift(behind);
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);
@@ -773,8 +776,7 @@ namespace {
if (sf == SCALE_FACTOR_NORMAL)
{
if ( pos.opposite_bishops()
- && pos.non_pawn_material(WHITE) == BishopValueMg
- && pos.non_pawn_material(BLACK) == BishopValueMg)
+ && pos.non_pawn_material() == 2 * BishopValueMg)
sf = 16 + 4 * pe->passed_count();
else
sf = std::min(40 + (pos.opposite_bishops() ? 2 : 7) * pos.count(strongSide), sf);