mirror of
https://github.com/sockspls/badfish
synced 2025-05-01 17:19:36 +00:00
Some code reformat in evaluate_pieces
No functional change.
This commit is contained in:
parent
7eda7335fd
commit
bcbc9bfd1f
3 changed files with 51 additions and 86 deletions
130
src/evaluate.cpp
130
src/evaluate.cpp
|
@ -150,37 +150,23 @@ namespace {
|
||||||
|
|
||||||
#undef S
|
#undef S
|
||||||
|
|
||||||
const Score BishopPinBonus = make_score(66, 11);
|
|
||||||
|
|
||||||
// Bonus for having the side to move (modified by Joona Kiiski)
|
|
||||||
const Score Tempo = make_score(24, 11);
|
const Score Tempo = make_score(24, 11);
|
||||||
|
|
||||||
// Rooks and queens on the 7th rank
|
const Score BishopPinBonus = make_score(66, 11);
|
||||||
const Score RookOn7thBonus = make_score(11, 20);
|
const Score RookOn7thBonus = make_score(11, 20);
|
||||||
const Score QueenOn7thBonus = make_score( 3, 8);
|
const Score QueenOn7thBonus = make_score( 3, 8);
|
||||||
|
const Score RookOnPawnBonus = make_score(10, 28);
|
||||||
// Rooks and queens attacking pawns on the same rank
|
const Score QueenOnPawnBonus = make_score( 4, 20);
|
||||||
const Score RookOnPawnBonus = make_score(10, 28);
|
const Score RookOpenFileBonus = make_score(43, 21);
|
||||||
const Score QueenOnPawnBonus = make_score( 4, 20);
|
const Score RookHalfOpenFileBonus = make_score(19, 10);
|
||||||
|
const Score BishopPawnsPenalty = make_score(8, 12);
|
||||||
// Rooks on open files (modified by Joona Kiiski)
|
const Score UndefendedMinorPenalty = make_score(25, 10);
|
||||||
const Score RookOpenFileBonus = make_score(43, 21);
|
const Score TrappedRookPenalty = make_score(90, 0);
|
||||||
const Score RookHalfOpenFileBonus = make_score(19, 10);
|
|
||||||
|
|
||||||
// Penalty for rooks trapped inside a friendly king which has lost the
|
|
||||||
// right to castle.
|
|
||||||
const Value TrappedRookPenalty = Value(180);
|
|
||||||
|
|
||||||
// Penalty for bishop with pawns on the same coloured squares
|
|
||||||
const Score BishopPawnsPenalty = make_score(8, 12);
|
|
||||||
|
|
||||||
// Penalty for a bishop on a1/h1 (a8/h8 for black) which is trapped by
|
// Penalty for a bishop on a1/h1 (a8/h8 for black) which is trapped by
|
||||||
// a friendly pawn on b2/g2 (b7/g7 for black). This can obviously only
|
// a friendly pawn on b2/g2 (b7/g7 for black). This can obviously only
|
||||||
// happen in Chess960 games.
|
// happen in Chess960 games.
|
||||||
const Score TrappedBishopA1H1Penalty = make_score(100, 100);
|
const Score TrappedBishopA1H1Penalty = make_score(50, 50);
|
||||||
|
|
||||||
// Penalty for an undefended bishop or knight
|
|
||||||
const Score UndefendedMinorPenalty = make_score(25, 10);
|
|
||||||
|
|
||||||
// The SpaceMask[Color] contains the area of the board which is considered
|
// The SpaceMask[Color] contains the area of the board which is considered
|
||||||
// by the space evaluation. In the middle game, each side is given a bonus
|
// by the space evaluation. In the middle game, each side is given a bonus
|
||||||
|
@ -535,9 +521,7 @@ Value do_evaluate(const Position& pos, Value& margin) {
|
||||||
Score evaluate_pieces(const Position& pos, EvalInfo& ei, Score& mobility, Bitboard mobilityArea) {
|
Score evaluate_pieces(const Position& pos, EvalInfo& ei, Score& mobility, Bitboard mobilityArea) {
|
||||||
|
|
||||||
Bitboard b;
|
Bitboard b;
|
||||||
Square s, ksq;
|
Square s;
|
||||||
int mob;
|
|
||||||
File f;
|
|
||||||
Score score = SCORE_ZERO;
|
Score score = SCORE_ZERO;
|
||||||
|
|
||||||
const Color Them = (Us == WHITE ? BLACK : WHITE);
|
const Color Them = (Us == WHITE ? BLACK : WHITE);
|
||||||
|
@ -548,14 +532,9 @@ Value do_evaluate(const Position& pos, Value& margin) {
|
||||||
while ((s = *pl++) != SQ_NONE)
|
while ((s = *pl++) != SQ_NONE)
|
||||||
{
|
{
|
||||||
// Find attacked squares, including x-ray attacks for bishops and rooks
|
// Find attacked squares, including x-ray attacks for bishops and rooks
|
||||||
if (Piece == KNIGHT || Piece == QUEEN)
|
b = Piece == BISHOP ? attacks_bb<BISHOP>(s, pos.pieces() ^ pos.pieces(Us, QUEEN))
|
||||||
b = pos.attacks_from<Piece>(s);
|
: Piece == ROOK ? attacks_bb< ROOK>(s, pos.pieces() ^ pos.pieces(Us, ROOK, QUEEN))
|
||||||
else if (Piece == BISHOP)
|
: pos.attacks_from<Piece>(s);
|
||||||
b = attacks_bb<BISHOP>(s, pos.pieces() ^ pos.pieces(Us, QUEEN));
|
|
||||||
else if (Piece == ROOK)
|
|
||||||
b = attacks_bb<ROOK>(s, pos.pieces() ^ pos.pieces(Us, ROOK, QUEEN));
|
|
||||||
else
|
|
||||||
assert(false);
|
|
||||||
|
|
||||||
ei.attackedBy[Us][Piece] |= b;
|
ei.attackedBy[Us][Piece] |= b;
|
||||||
|
|
||||||
|
@ -568,9 +547,7 @@ Value do_evaluate(const Position& pos, Value& margin) {
|
||||||
ei.kingAdjacentZoneAttacksCount[Us] += popcount<Max15>(bb);
|
ei.kingAdjacentZoneAttacksCount[Us] += popcount<Max15>(bb);
|
||||||
}
|
}
|
||||||
|
|
||||||
mob = (Piece != QUEEN ? popcount<Max15>(b & mobilityArea)
|
int mob = popcount<Piece == QUEEN ? Full : Max15>(b & mobilityArea);
|
||||||
: popcount<Full >(b & mobilityArea));
|
|
||||||
|
|
||||||
mobility += MobilityBonus[Piece][mob];
|
mobility += MobilityBonus[Piece][mob];
|
||||||
|
|
||||||
// Decrease score if we are attacked by an enemy pawn. Remaining part
|
// Decrease score if we are attacked by an enemy pawn. Remaining part
|
||||||
|
@ -578,8 +555,8 @@ Value do_evaluate(const Position& pos, Value& margin) {
|
||||||
if (ei.attackedBy[Them][PAWN] & s)
|
if (ei.attackedBy[Them][PAWN] & s)
|
||||||
score -= ThreatenedByPawnPenalty[Piece];
|
score -= ThreatenedByPawnPenalty[Piece];
|
||||||
|
|
||||||
// Otherwise give a bonus if we are a bishop and can pin a piece or
|
// Otherwise give a bonus if we are a bishop and can pin a piece or can
|
||||||
// can give a discovered check through an x-ray attack.
|
// give a discovered check through an x-ray attack.
|
||||||
else if ( Piece == BISHOP
|
else if ( Piece == BISHOP
|
||||||
&& (PseudoAttacks[Piece][pos.king_square(Them)] & s)
|
&& (PseudoAttacks[Piece][pos.king_square(Them)] & s)
|
||||||
&& !more_than_one(BetweenBB[s][pos.king_square(Them)] & pos.pieces()))
|
&& !more_than_one(BetweenBB[s][pos.king_square(Them)] & pos.pieces()))
|
||||||
|
@ -594,67 +571,54 @@ Value do_evaluate(const Position& pos, Value& margin) {
|
||||||
&& !(pos.pieces(Them, PAWN) & attack_span_mask(Us, s)))
|
&& !(pos.pieces(Them, PAWN) & attack_span_mask(Us, s)))
|
||||||
score += evaluate_outposts<Piece, Us>(pos, ei, s);
|
score += evaluate_outposts<Piece, Us>(pos, ei, s);
|
||||||
|
|
||||||
if ((Piece == ROOK || Piece == QUEEN) && relative_rank(Us, s) >= RANK_5)
|
if ( (Piece == ROOK || Piece == QUEEN)
|
||||||
|
&& relative_rank(Us, s) >= RANK_5)
|
||||||
{
|
{
|
||||||
// Major piece on 7th rank
|
// Major piece on 7th rank and enemy king trapped on 8th
|
||||||
if ( relative_rank(Us, s) == RANK_7
|
if ( relative_rank(Us, s) == RANK_7
|
||||||
&& relative_rank(Us, pos.king_square(Them)) == RANK_8)
|
&& relative_rank(Us, pos.king_square(Them)) == RANK_8)
|
||||||
score += (Piece == ROOK ? RookOn7thBonus : QueenOn7thBonus);
|
score += Piece == ROOK ? RookOn7thBonus : QueenOn7thBonus;
|
||||||
|
|
||||||
// Major piece attacking pawns on the same rank
|
// Major piece attacking enemy pawns on the same rank
|
||||||
Bitboard pawns = pos.pieces(Them, PAWN) & rank_bb(s);
|
Bitboard pawns = pos.pieces(Them, PAWN) & rank_bb(s);
|
||||||
if (pawns)
|
if (pawns)
|
||||||
score += (Piece == ROOK ? RookOnPawnBonus
|
score += popcount<Max15>(pawns) * (Piece == ROOK ? RookOnPawnBonus : QueenOnPawnBonus);
|
||||||
: QueenOnPawnBonus) * popcount<Max15>(pawns);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Special extra evaluation for bishops
|
|
||||||
if (Piece == BISHOP && pos.is_chess960())
|
|
||||||
{
|
|
||||||
// An important Chess960 pattern: A cornered bishop blocked by
|
|
||||||
// a friendly pawn diagonally in front of it is a very serious
|
|
||||||
// problem, especially when that pawn is also blocked.
|
|
||||||
if (s == relative_square(Us, SQ_A1) || s == relative_square(Us, SQ_H1))
|
|
||||||
{
|
|
||||||
Square d = pawn_push(Us) + (file_of(s) == FILE_A ? DELTA_E : DELTA_W);
|
|
||||||
if (pos.piece_on(s + d) == make_piece(Us, PAWN))
|
|
||||||
{
|
|
||||||
if (!pos.is_empty(s + d + pawn_push(Us)))
|
|
||||||
score -= 2*TrappedBishopA1H1Penalty;
|
|
||||||
else if (pos.piece_on(s + 2*d) == make_piece(Us, PAWN))
|
|
||||||
score -= TrappedBishopA1H1Penalty;
|
|
||||||
else
|
|
||||||
score -= TrappedBishopA1H1Penalty / 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Special extra evaluation for rooks
|
// Special extra evaluation for rooks
|
||||||
if (Piece == ROOK)
|
if (Piece == ROOK)
|
||||||
{
|
{
|
||||||
// Open and half-open files
|
// Give a bonus for a rook on a open or half-open file
|
||||||
f = file_of(s);
|
if (ei.pi->half_open(Us, file_of(s)))
|
||||||
if (ei.pi->file_is_half_open(Us, f))
|
score += ei.pi->half_open(Them, file_of(s)) ? RookOpenFileBonus
|
||||||
{
|
: RookHalfOpenFileBonus;
|
||||||
if (ei.pi->file_is_half_open(Them, f))
|
if (mob > 6 || ei.pi->half_open(Us, file_of(s)))
|
||||||
score += RookOpenFileBonus;
|
|
||||||
else
|
|
||||||
score += RookHalfOpenFileBonus;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mob > 6 || ei.pi->file_is_half_open(Us, f))
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
ksq = pos.king_square(Us);
|
Square ksq = pos.king_square(Us);
|
||||||
|
|
||||||
// Penalize rooks which are trapped inside a king. Penalize more if
|
// Penalize rooks which are trapped inside a king. Penalize more if
|
||||||
// king has lost right to castle.
|
// king has lost right to castle.
|
||||||
if ( ((file_of(ksq) < FILE_E) == (file_of(s) < file_of(ksq)))
|
if ( ((file_of(ksq) < FILE_E) == (file_of(s) < file_of(ksq)))
|
||||||
&& rank_of(ksq) == rank_of(s)
|
&& rank_of(ksq) == rank_of(s)
|
||||||
&& relative_rank(Us, ksq) == RANK_1
|
&& relative_rank(Us, ksq) == RANK_1
|
||||||
&& !ei.pi->has_open_file_on_side(Us, file_of(ksq), file_of(ksq) < FILE_E))
|
&& !ei.pi->half_open_on_side(Us, file_of(ksq), file_of(ksq) < FILE_E))
|
||||||
score -= make_score(pos.can_castle(Us) ? (TrappedRookPenalty - mob * 16) / 2
|
score -= (TrappedRookPenalty - make_score(mob * 8, 0)) * (pos.can_castle(Us) ? 1 : 2);
|
||||||
: (TrappedRookPenalty - mob * 16), 0);
|
}
|
||||||
|
|
||||||
|
// An important Chess960 pattern: A cornered bishop blocked by a friendly
|
||||||
|
// pawn diagonally in front of it is a very serious problem, especially
|
||||||
|
// when that pawn is also blocked.
|
||||||
|
if ( Piece == BISHOP
|
||||||
|
&& pos.is_chess960()
|
||||||
|
&& (s == relative_square(Us, SQ_A1) || s == relative_square(Us, SQ_H1)))
|
||||||
|
{
|
||||||
|
const enum Piece P = make_piece(Us, PAWN);
|
||||||
|
Square d = pawn_push(Us) + (file_of(s) == FILE_A ? DELTA_E : DELTA_W);
|
||||||
|
if (pos.piece_on(s + d) == P)
|
||||||
|
score -= !pos.is_empty(s + d + pawn_push(Us)) ? TrappedBishopA1H1Penalty * 4
|
||||||
|
: pos.piece_on(s + d + d) == P ? TrappedBishopA1H1Penalty * 2
|
||||||
|
: TrappedBishopA1H1Penalty;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,9 +37,10 @@ struct Entry {
|
||||||
Score pawns_value() const { return value; }
|
Score pawns_value() const { return value; }
|
||||||
Bitboard pawn_attacks(Color c) const { return pawnAttacks[c]; }
|
Bitboard pawn_attacks(Color c) const { return pawnAttacks[c]; }
|
||||||
Bitboard passed_pawns(Color c) const { return passedPawns[c]; }
|
Bitboard passed_pawns(Color c) const { return passedPawns[c]; }
|
||||||
int file_is_half_open(Color c, File f) const { return halfOpenFiles[c] & (1 << int(f)); }
|
|
||||||
int pawns_on_same_color_squares(Color c, Square s) const { return pawnsOnSquares[c][!!(BlackSquares & s)]; }
|
int pawns_on_same_color_squares(Color c, Square s) const { return pawnsOnSquares[c][!!(BlackSquares & s)]; }
|
||||||
int has_open_file_on_side(Color c, File f, bool left) const {
|
int half_open(Color c, File f) const { return halfOpenFiles[c] & (1 << int(f)); }
|
||||||
|
int half_open_on_side(Color c, File f, bool left) const {
|
||||||
|
|
||||||
return halfOpenFiles[c] & (left ? ((1 << int(f)) - 1) : ~((1 << int(f+1)) - 1));
|
return halfOpenFiles[c] & (left ? ((1 << int(f)) - 1) : ~((1 << int(f+1)) - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -268,7 +268,7 @@ inline Score make_score(int mg, int eg) { return Score((mg << 16) + eg); }
|
||||||
/// Extracting the signed lower and upper 16 bits it not so trivial because
|
/// Extracting the signed lower and upper 16 bits it not so trivial because
|
||||||
/// according to the standard a simple cast to short is implementation defined
|
/// according to the standard a simple cast to short is implementation defined
|
||||||
/// and so is a right shift of a signed integer.
|
/// and so is a right shift of a signed integer.
|
||||||
inline Value mg_value(Score s) { return Value(((s + 32768) & ~0xffff) / 0x10000); }
|
inline Value mg_value(Score s) { return Value(((s + 0x8000) & ~0xffff) / 0x10000); }
|
||||||
|
|
||||||
/// On Intel 64 bit we have a small speed regression with the standard conforming
|
/// On Intel 64 bit we have a small speed regression with the standard conforming
|
||||||
/// version, so use a faster code in this case that, although not 100% standard
|
/// version, so use a faster code in this case that, although not 100% standard
|
||||||
|
|
Loading…
Add table
Reference in a new issue