X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fevaluate.cpp;h=ee93f11f13cda2b3e776221282534969c18512ed;hb=e50af36a00ea1df1b395873766408f127dd00c90;hp=031b803417c4c4832f7b6fe5bdb2a3d26618f724;hpb=043a469f83b4c81f94ab991029b4cd49fb05452e;p=stockfish diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 031b8034..ee93f11f 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -31,12 +31,21 @@ namespace { + const Bitboard Center = (FileDBB | FileEBB) & (Rank4BB | Rank5BB); + const Bitboard QueenSide = FileABB | FileBBB | FileCBB | FileDBB; + const Bitboard CenterFiles = FileCBB | FileDBB | FileEBB | FileFBB; + const Bitboard KingSide = FileEBB | FileFBB | FileGBB | FileHBB; + + const Bitboard KingFlank[FILE_NB] = { + QueenSide, QueenSide, QueenSide, CenterFiles, CenterFiles, KingSide, KingSide, KingSide + }; + namespace Trace { enum Tracing {NO_TRACE, TRACE}; enum Term { // The first 8 entries are for PieceType - MATERIAL = 8, IMBALANCE, MOBILITY, THREAT, PASSED, SPACE, TOTAL, TERM_NB + MATERIAL = 8, IMBALANCE, MOBILITY, THREAT, PASSED, SPACE, INITIATIVE, TOTAL, TERM_NB }; double scores[TERM_NB][COLOR_NB][PHASE_NB]; @@ -54,7 +63,7 @@ namespace { std::ostream& operator<<(std::ostream& os, Term t) { - if (t == MATERIAL || t == IMBALANCE || t == Term(PAWN) || t == TOTAL) + if (t == MATERIAL || t == IMBALANCE || t == Term(PAWN) || t == INITIATIVE || t == TOTAL) os << " --- --- | --- --- | "; else os << std::setw(5) << scores[t][WHITE][MG] << " " @@ -204,6 +213,7 @@ namespace { // Assorted bonuses and penalties used by evaluation const Score MinorBehindPawn = S( 16, 0); const Score BishopPawns = S( 8, 12); + const Score LongRangedBishop = S( 22, 0); const Score RookOnPawn = S( 8, 24); const Score TrappedRook = S( 92, 0); const Score WeakQueen = S( 50, 10); @@ -211,7 +221,7 @@ namespace { const Score CloseEnemies = S( 7, 0); const Score PawnlessFlank = S( 20, 80); const Score ThreatByHangingPawn = S( 71, 61); - const Score ThreatBySafePawn = S(182,175); + const Score ThreatBySafePawn = S(192,175); const Score ThreatByRank = S( 16, 3); const Score Hanging = S( 48, 27); const Score WeakUnopposedPawn = S( 5, 25); @@ -338,10 +348,16 @@ namespace { && (pos.pieces(PAWN) & (s + pawn_push(Us)))) score += MinorBehindPawn; - // Penalty for pawns on the same color square as the bishop if (Pt == BISHOP) + { + // Penalty for pawns on the same color square as the bishop score -= BishopPawns * pe->pawns_on_same_color_squares(Us, s); + // Bonus for bishop on a long diagonal which can "see" both center squares + if (more_than_one(Center & (attacks_bb(s, pos.pieces(PAWN)) | s))) + score += LongRangedBishop; + } + // 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. @@ -396,14 +412,6 @@ namespace { // evaluate_king() assigns bonuses and penalties to a king of a given color - const Bitboard QueenSide = FileABB | FileBBB | FileCBB | FileDBB; - const Bitboard CenterFiles = FileCBB | FileDBB | FileEBB | FileFBB; - const Bitboard KingSide = FileEBB | FileFBB | FileGBB | FileHBB; - - const Bitboard KingFlank[FILE_NB] = { - QueenSide, QueenSide, QueenSide, CenterFiles, CenterFiles, KingSide, KingSide, KingSide - }; - template template Score Evaluation::evaluate_king() { @@ -767,6 +775,9 @@ namespace { // that the endgame score will never change sign after the bonus. int v = ((eg > 0) - (eg < 0)) * std::max(initiative, -abs(eg)); + if (T) + Trace::add(INITIATIVE, make_score(0, v)); + return make_score(0, v); } @@ -927,6 +938,7 @@ std::string Eval::trace(const Position& pos) { << " Threats | " << Term(THREAT) << " Passed pawns | " << Term(PASSED) << " Space | " << Term(SPACE) + << " Initiative | " << Term(INITIATIVE) << "----------------+-------------+-------------+-------------\n" << " Total | " << Term(TOTAL);