X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fevaluate.cpp;h=d5a4bb970a954e78379c6917f1752bf8eb4bce43;hp=1bfd9dfd10bba21385fc3dc65ebfcb34bfcc686a;hb=fefb27bab40a1d793fde4f3a0bb7e1e7d66b2fda;hpb=89d9db2979b823449f8f0574617becc33de88607 diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 1bfd9dfd..d5a4bb97 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -27,7 +27,7 @@ #include "material.h" #include "pawns.h" #include "thread.h" -#include "ucioption.h" +#include "uci.h" namespace { @@ -141,8 +141,8 @@ namespace { // Threat[attacking][attacked] contains bonuses according to which piece // type attacks which one. const Score Threat[][PIECE_TYPE_NB] = { - { S(0, 0), S( 7, 39), S(24, 49), S(24, 49), S(41,100), S(41,100) }, // Minor - { S(0, 0), S(15, 39), S(15, 45), S(15, 45), S(15, 45), S(24, 49) } // Major + { S(0, 0), S(0, 38), S(32, 45), S(32, 45), S(41,100), S(35,104) }, // Minor + { S(0, 0), S(7, 28), S(20, 49), S(20, 49), S(8 , 42), S(23, 44) } // Major }; // ThreatenedByPawn[PieceType] contains a penalty according to which piece @@ -491,6 +491,23 @@ namespace { } + // max_piece_type() is a helper function used by evaluate_threats() to get + // the value of the biggest PieceType of color C in 'target' bitboard. + + template + inline PieceType max_piece_type(const Position& pos, const Bitboard target) { + + assert(target & (pos.pieces(C) ^ pos.pieces(C, KING))); + + PieceType pt; + for (pt = QUEEN; pt >= KNIGHT; --pt) + if (target & pos.pieces(C, pt)) + break; + + return pt; + } + + // evaluate_threats() assigns bonuses according to the type of attacking piece // and the type of attacked one. @@ -499,33 +516,34 @@ namespace { const Color Them = (Us == WHITE ? BLACK : WHITE); + enum { Minor, Major }; + Bitboard b, weakEnemies, protectedEnemies; Score score = SCORE_ZERO; - enum { Minor, Major }; - // Protected enemies - protectedEnemies = (pos.pieces(Them) ^ pos.pieces(Them,PAWN)) - & ei.attackedBy[Them][PAWN] + // Enemies defended by a pawn and under our attack by a minor piece + protectedEnemies = (pos.pieces(Them) ^ pos.pieces(Them, PAWN)) + & ei.attackedBy[Them][PAWN] & (ei.attackedBy[Us][KNIGHT] | ei.attackedBy[Us][BISHOP]); if (protectedEnemies) - score += Threat[Minor][type_of(pos.piece_on(lsb(protectedEnemies)))]; + score += Threat[Minor][max_piece_type(pos, protectedEnemies)]; // Enemies not defended by a pawn and under our attack - weakEnemies = pos.pieces(Them) + weakEnemies = pos.pieces(Them) & ~ei.attackedBy[Them][PAWN] - & ei.attackedBy[Us][ALL_PIECES]; + & ei.attackedBy[Us][ALL_PIECES]; // Add a bonus according if the attacking pieces are minor or major if (weakEnemies) { b = weakEnemies & (ei.attackedBy[Us][KNIGHT] | ei.attackedBy[Us][BISHOP]); if (b) - score += Threat[Minor][type_of(pos.piece_on(lsb(b)))]; + score += Threat[Minor][max_piece_type(pos, b)]; b = weakEnemies & (ei.attackedBy[Us][ROOK] | ei.attackedBy[Us][QUEEN]); if (b) - score += Threat[Major][type_of(pos.piece_on(lsb(b)))]; + score += Threat[Major][max_piece_type(pos, b)]; b = weakEnemies & ~ei.attackedBy[Them][ALL_PIECES]; if (b)