Introduce penalty for weak (=unsupported) pawns.

We add a penalty for each pawn which is not protected by another pawn
of the same color.

Passed both short TC
LLR: 2.96 (-2.94,2.94) [-1.50,4.50]
Total: 12107 W: 2411 L: 2272 D: 7424

And long TC
LLR: 2.96 (-2.94,2.94) [0.00,6.00]
Total: 9204 W: 1605 L: 1458 D: 6141

bench: 7682173
This commit is contained in:
snicolet
2014-03-23 23:51:25 +01:00
committed by Marco Costalba
parent 9e72e35942
commit e7362dae78

View File

@@ -60,6 +60,9 @@ namespace {
// Bonus for file distance of the two outermost pawns // Bonus for file distance of the two outermost pawns
const Score PawnsFileSpan = S(0, 15); const Score PawnsFileSpan = S(0, 15);
// Unsupported pawn penalty
const Score UnsupportedPawnPenalty = S(20, 10);
// Weakness of our pawn shelter in front of the king indexed by [rank] // Weakness of our pawn shelter in front of the king indexed by [rank]
const Value ShelterWeakness[RANK_NB] = const Value ShelterWeakness[RANK_NB] =
{ V(100), V(0), V(27), V(73), V(92), V(101), V(101) }; { V(100), V(0), V(27), V(73), V(92), V(101), V(101) };
@@ -86,10 +89,10 @@ namespace {
const Square Right = (Us == WHITE ? DELTA_NE : DELTA_SW); const Square Right = (Us == WHITE ? DELTA_NE : DELTA_SW);
const Square Left = (Us == WHITE ? DELTA_NW : DELTA_SE); const Square Left = (Us == WHITE ? DELTA_NW : DELTA_SE);
Bitboard b; Bitboard b, p;
Square s; Square s;
File f; File f;
bool passed, isolated, doubled, opposed, connected, backward, candidate; bool passed, isolated, doubled, opposed, connected, backward, candidate, unsupported;
Score value = SCORE_ZERO; Score value = SCORE_ZERO;
const Square* pl = pos.list<PAWN>(Us); const Square* pl = pos.list<PAWN>(Us);
@@ -113,12 +116,16 @@ namespace {
// This file cannot be semi-open // This file cannot be semi-open
e->semiopenFiles[Us] &= ~(1 << f); e->semiopenFiles[Us] &= ~(1 << f);
// Our rank plus previous one // Previous rank
b = rank_bb(s) | rank_bb(s - pawn_push(Us)); p = rank_bb(s - pawn_push(Us));
// Flag the pawn as passed, isolated, doubled or // Our rank plus previous one
// connected (but not the backward one). b = rank_bb(s) | p;
// Flag the pawn as passed, isolated, doubled,
// unsupported or connected (but not the backward one).
connected = ourPawns & adjacent_files_bb(f) & b; connected = ourPawns & adjacent_files_bb(f) & b;
unsupported = !(ourPawns & adjacent_files_bb(f) & p);
isolated = !(ourPawns & adjacent_files_bb(f)); isolated = !(ourPawns & adjacent_files_bb(f));
doubled = ourPawns & forward_bb(Us, s); doubled = ourPawns & forward_bb(Us, s);
opposed = theirPawns & forward_bb(Us, s); opposed = theirPawns & forward_bb(Us, s);
@@ -166,6 +173,9 @@ namespace {
if (isolated) if (isolated)
value -= Isolated[opposed][f]; value -= Isolated[opposed][f];
if (unsupported && !isolated)
value -= UnsupportedPawnPenalty;
if (doubled) if (doubled)
value -= Doubled[f]; value -= Doubled[f];