mirror of
https://github.com/sockspls/badfish
synced 2025-05-01 01:03:09 +00:00
Merge new pawn storm evaluation
More accuracy in pawn storm evaluation directly from iPhone Glaurung. Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
parent
ef8acdc73b
commit
320630ca1a
1 changed files with 62 additions and 51 deletions
113
src/pawns.cpp
113
src/pawns.cpp
|
@ -120,14 +120,12 @@ namespace {
|
||||||
0, 0, 0, 0, 0, 0, 0, 0
|
0, 0, 0, 0, 0, 0, 0, 0
|
||||||
};
|
};
|
||||||
|
|
||||||
// Pawn storm open file bonuses by file:
|
// Pawn storm open file bonuses by file
|
||||||
const int KStormOpenFileBonus[8] = {
|
const int KStormOpenFileBonus[8] = { 45, 45, 30, 0, 0, 0, 0, 0 };
|
||||||
45, 45, 30, 0, 0, 0, 0, 0
|
const int QStormOpenFileBonus[8] = { 0, 0, 0, 0, 0, 30, 45, 30 };
|
||||||
};
|
|
||||||
|
|
||||||
const int QStormOpenFileBonus[8] = {
|
// Pawn storm lever bonuses by file
|
||||||
0, 0, 0, 0, 0, 30, 45, 30
|
const int StormLeverBonus[8] = { 20, 20, 10, 0, 0, 10, 20, 20 };
|
||||||
};
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -200,6 +198,7 @@ PawnInfo *PawnInfoTable::get_pawn_info(const Position &pos) {
|
||||||
Bitboard ourPawns = pos.pawns(us);
|
Bitboard ourPawns = pos.pawns(us);
|
||||||
Bitboard theirPawns = pos.pawns(them);
|
Bitboard theirPawns = pos.pawns(them);
|
||||||
Bitboard pawns = ourPawns;
|
Bitboard pawns = ourPawns;
|
||||||
|
int bonus;
|
||||||
|
|
||||||
// Initialize pawn storm scores by giving bonuses for open files
|
// Initialize pawn storm scores by giving bonuses for open files
|
||||||
for (File f = FILE_A; f <= FILE_H; f++)
|
for (File f = FILE_A; f <= FILE_H; f++)
|
||||||
|
@ -227,54 +226,66 @@ PawnInfo *PawnInfoTable::get_pawn_info(const Position &pos) {
|
||||||
isolated = pos.pawn_is_isolated(us, s);
|
isolated = pos.pawn_is_isolated(us, s);
|
||||||
doubled = pos.pawn_is_doubled(us, s);
|
doubled = pos.pawn_is_doubled(us, s);
|
||||||
|
|
||||||
// We calculate kingside and queenside pawn storm scores
|
// We calculate kingside and queenside pawn storm
|
||||||
// for both colors. These are used when evaluating middle
|
// scores for both colors. These are used when evaluating
|
||||||
// game positions with opposite side castling.
|
// middle game positions with opposite side castling.
|
||||||
//
|
//
|
||||||
// Each pawn is given a base score given by a piece square table
|
// Each pawn is given a base score given by a piece square table
|
||||||
// (KStormTable[] or QStormTable[]). This score is increased if
|
// (KStormTable[] or QStormTable[]). Pawns which seem to have good
|
||||||
// there are enemy pawns on adjacent files in front of the pawn.
|
// chances of creating an open file by exchanging itself against an
|
||||||
// This is because we want to be able to open files against the
|
// enemy pawn on an adjacent file gets an additional bonus.
|
||||||
// enemy king, and to avoid blocking the pawn structure (e.g. white
|
|
||||||
// pawns on h6, g5, black pawns on h7, g6, f7).
|
|
||||||
|
|
||||||
// Kingside and queenside pawn storms
|
// Kingside pawn storms
|
||||||
int KBonus = KStormTable[relative_square(us, s)];
|
bonus = KStormTable[relative_square(us, s)];
|
||||||
int QBonus = QStormTable[relative_square(us, s)];
|
if (f >= FILE_F)
|
||||||
bool outPostFlag = (KBonus > 0 && (outpost_mask(us, s) & theirPawns));
|
{
|
||||||
bool passedFlag = (QBonus > 0 && (passed_pawn_mask(us, s) & theirPawns));
|
Bitboard b = outpost_mask(us, s) & theirPawns & (FileFBB | FileGBB | FileHBB);
|
||||||
|
while (b)
|
||||||
switch (f) {
|
{
|
||||||
|
Square s2 = pop_1st_bit(&b);
|
||||||
case FILE_A:
|
if (!(theirPawns & neighboring_files_bb(s2) & rank_bb(s2)))
|
||||||
QBonus += passedFlag * QBonus / 2;
|
{
|
||||||
break;
|
// The enemy pawn has no pawn beside itself, which makes it
|
||||||
|
// particularly vulnerable. Big bonus, especially against a
|
||||||
case FILE_B:
|
// weakness on the rook file.
|
||||||
QBonus += passedFlag * (QBonus / 2 + QBonus / 4);
|
if (square_file(s2) == FILE_H)
|
||||||
break;
|
bonus += 4*StormLeverBonus[f] - 8*square_distance(s, s2);
|
||||||
|
else
|
||||||
case FILE_C:
|
bonus += 2*StormLeverBonus[f] - 4*square_distance(s, s2);
|
||||||
QBonus += passedFlag * QBonus / 2;
|
} else
|
||||||
break;
|
// There is at least one enemy pawn beside the enemy pawn we look
|
||||||
|
// at, which means that the pawn has somewhat better chances of
|
||||||
case FILE_F:
|
// defending itself by advancing. Smaller bonus.
|
||||||
KBonus += outPostFlag * KBonus / 4;
|
bonus += StormLeverBonus[f] - 2*square_distance(s, s2);
|
||||||
break;
|
|
||||||
|
|
||||||
case FILE_G:
|
|
||||||
KBonus += outPostFlag * (KBonus / 2 + KBonus / 4);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FILE_H:
|
|
||||||
KBonus += outPostFlag * KBonus / 2;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
pi->ksStormValue[us] += KBonus;
|
}
|
||||||
pi->qsStormValue[us] += QBonus;
|
pi->ksStormValue[us] += bonus;
|
||||||
|
|
||||||
|
// Queenside pawn storms
|
||||||
|
bonus = QStormTable[relative_square(us, s)];
|
||||||
|
if (f <= FILE_C)
|
||||||
|
{
|
||||||
|
Bitboard b = outpost_mask(us, s) & theirPawns & (FileABB | FileBBB | FileCBB);
|
||||||
|
while (b)
|
||||||
|
{
|
||||||
|
Square s2 = pop_1st_bit(&b);
|
||||||
|
if (!(theirPawns & neighboring_files_bb(s2) & rank_bb(s2)))
|
||||||
|
{
|
||||||
|
// The enemy pawn has no pawn beside itself, which makes it
|
||||||
|
// particularly vulnerable. Big bonus, especially against a
|
||||||
|
// weakness on the rook file.
|
||||||
|
if (square_file(s2) == FILE_A)
|
||||||
|
bonus += 4*StormLeverBonus[f] - 16*square_distance(s, s2);
|
||||||
|
else
|
||||||
|
bonus += 2*StormLeverBonus[f] - 8*square_distance(s, s2);
|
||||||
|
} else
|
||||||
|
// There is at least one enemy pawn beside the enemy pawn we look
|
||||||
|
// at, which means that the pawn has somewhat better chances of
|
||||||
|
// defending itself by advancing. Smaller bonus.
|
||||||
|
bonus += StormLeverBonus[f] - 4*square_distance(s, s2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pi->qsStormValue[us] += bonus;
|
||||||
|
|
||||||
// Member of a pawn chain (but not the backward one)? We could speed up
|
// Member of a pawn chain (but not the backward one)? We could speed up
|
||||||
// the test a little by introducing an array of masks indexed by color
|
// the test a little by introducing an array of masks indexed by color
|
||||||
|
|
Loading…
Add table
Reference in a new issue