Skip to content

Commit

Permalink
Bonus for reachable outpost
Browse files Browse the repository at this point in the history
Give a bonus for outpost squares which in reach of a bishop or knight.

STC:
LLR: 2.96 (-2.94,2.94) [0.00,5.00]
Total: 22725 W: 4570 L: 4339 D: 13816

LTC:
LLR: 2.96 (-2.94,2.94) [0.00,5.00]
Total: 15019 W: 2333 L: 2157 D: 10529

Bench: 8503181

Resolves #495
  • Loading branch information
locutus2 authored and zamar committed Nov 14, 2015
1 parent 76ed0ab commit cccf3c8
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 7 deletions.
29 changes: 23 additions & 6 deletions src/evaluate.cpp
Expand Up @@ -141,13 +141,25 @@ namespace {
S(112,125), S(113,127), S(117,137), S(122,143) }
};

// Mask of allowed outpost squares indexed by color
const Bitboard OutpostMask[COLOR_NB] = {
Rank4BB | Rank5BB | Rank6BB, Rank5BB | Rank4BB | Rank3BB
};

// Outpost[knight/bishop][supported by pawn] contains bonuses for knights and
// bishops outposts, bigger if outpost piece is supported by a pawn.
const Score Outpost[][2] = {
{ S(42,11), S(63,17) }, // Knights
{ S(18, 5), S(27, 8) } // Bishops
};

// ReachableOutpost[knight/bishop][supported by pawn] contains bonuses for knights and
// bishops which can reach a outpost square in one move, bigger if outpost square is supported by a pawn.
const Score ReachableOutpost[][2] = {
{ S(21, 5), S(31, 8) }, // Knights
{ S( 8, 2), S(13, 4) } // Bishops
};

// Threat[minor/rook][attacked PieceType] contains
// bonuses according to which piece type attacks which one.
// Attacks on lesser pieces which are pawn defended are not considered.
Expand Down Expand Up @@ -257,7 +269,7 @@ namespace {
template<PieceType Pt, Color Us, bool DoTrace>
Score evaluate_pieces(const Position& pos, EvalInfo& ei, Score* mobility, const Bitboard* mobilityArea) {

Bitboard b;
Bitboard b, bb;
Square s;
Score score = SCORE_ZERO;

Expand All @@ -283,7 +295,7 @@ namespace {
{
ei.kingAttackersCount[Us]++;
ei.kingAttackersWeight[Us] += KingAttackWeights[Pt];
Bitboard bb = b & ei.attackedBy[Them][KING];
bb = b & ei.attackedBy[Them][KING];
if (bb)
ei.kingAdjacentZoneAttacksCount[Us] += popcount<Max15>(bb);
}
Expand All @@ -299,11 +311,16 @@ namespace {

if (Pt == BISHOP || Pt == KNIGHT)
{
// Bonus for outpost square
if ( relative_rank(Us, s) >= RANK_4
&& relative_rank(Us, s) <= RANK_6
&& !(pos.pieces(Them, PAWN) & pawn_attack_span(Us, s)))
// Bonus for outpost squares
bb = OutpostMask[Us] & ~ei.pi->pawn_attacks_span(Them);
if (bb & s)
score += Outpost[Pt == BISHOP][!!(ei.attackedBy[Us][PAWN] & s)];
else
{
bb &= b & ~pos.pieces(Us);
if (bb)
score += ReachableOutpost[Pt == BISHOP][!!(ei.attackedBy[Us][PAWN] & bb)];
}

// Bonus when behind a pawn
if ( relative_rank(Us, s) < RANK_5
Expand Down
4 changes: 3 additions & 1 deletion src/pawns.cpp
Expand Up @@ -116,7 +116,7 @@ namespace {
Bitboard ourPawns = pos.pieces(Us , PAWN);
Bitboard theirPawns = pos.pieces(Them, PAWN);

e->passedPawns[Us] = 0;
e->passedPawns[Us] = e->pawnAttacksSpan[Us] = 0;
e->kingSquares[Us] = SQ_NONE;
e->semiopenFiles[Us] = 0xFF;
e->pawnAttacks[Us] = shift_bb<Right>(ourPawns) | shift_bb<Left>(ourPawns);
Expand All @@ -133,6 +133,8 @@ namespace {
// This file cannot be semi-open
e->semiopenFiles[Us] &= ~(1 << f);

e->pawnAttacksSpan[Us] |= pawn_attack_span(Us, s);

// Flag the pawn
neighbours = ourPawns & adjacent_files_bb(f);
doubled = ourPawns & forward_bb(Us, s);
Expand Down
2 changes: 2 additions & 0 deletions src/pawns.h
Expand Up @@ -35,6 +35,7 @@ struct Entry {
Score pawns_score() const { return score; }
Bitboard pawn_attacks(Color c) const { return pawnAttacks[c]; }
Bitboard passed_pawns(Color c) const { return passedPawns[c]; }
Bitboard pawn_attacks_span(Color c) const { return pawnAttacksSpan[c]; }
int pawn_span(Color c) const { return pawnSpan[c]; }
int pawn_asymmetry() const { return asymmetry; }

Expand Down Expand Up @@ -66,6 +67,7 @@ struct Entry {
Score score;
Bitboard passedPawns[COLOR_NB];
Bitboard pawnAttacks[COLOR_NB];
Bitboard pawnAttacksSpan[COLOR_NB];
Square kingSquares[COLOR_NB];
Score kingSafety[COLOR_NB];
int castlingRights[COLOR_NB];
Expand Down

0 comments on commit cccf3c8

Please sign in to comment.