X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fevaluate.cpp;h=23ab62ec5ab178123612d14fea547c3e36daad06;hp=69a7ea37ffeb293d461069192ad515ad0234aa29;hb=57a3334322df005d567fc7db9afef82c495df83d;hpb=728ce2195c505b73305d21a326cee4010d5dbf0e diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 69a7ea37..23ab62ec 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -146,12 +146,6 @@ namespace { // friendly pawn on the rook file. const Score RookOnFile[2] = { S(20, 7), S(45, 20) }; - // ThreatBySafePawn[PieceType] contains bonuses according to which piece - // type is attacked by a pawn which is protected or is not attacked. - const Score ThreatBySafePawn[PIECE_TYPE_NB] = { - S(0, 0), S(0, 0), S(176, 139), S(131, 127), S(217, 218), S(203, 215) - }; - // ThreatByMinor/ByRook[attacked PieceType] contains bonuses according to // which piece type attacks which one. Attacks on lesser pieces which are // pawn-defended are not considered. @@ -179,7 +173,7 @@ namespace { S( 9, 10), S( 2, 10), S( 1, -8), S(-20,-12), S(-20,-12), S( 1, -8), S( 2, 10), S( 9, 10) }; - + // Protector[PieceType-2][distance] contains a protecting bonus for our king, // indexed by piece type and distance between the piece and the king. const Score Protector[4][8] = { @@ -190,19 +184,20 @@ namespace { }; // Assorted bonuses and penalties used by evaluation - const Score MinorBehindPawn = S(16, 0); - const Score BishopPawns = S( 8, 12); - const Score RookOnPawn = S( 8, 24); - const Score TrappedRook = S(92, 0); - const Score WeakQueen = S(50, 10); - const Score OtherCheck = S(10, 10); - const Score CloseEnemies = S( 7, 0); - const Score PawnlessFlank = S(20, 80); - const Score ThreatByHangingPawn = S(71, 61); - const Score ThreatByRank = S(16, 3); - const Score Hanging = S(48, 27); - const Score ThreatByPawnPush = S(38, 22); - const Score HinderPassedPawn = S( 7, 0); + const Score MinorBehindPawn = S( 16, 0); + const Score BishopPawns = S( 8, 12); + const Score RookOnPawn = S( 8, 24); + const Score TrappedRook = S( 92, 0); + const Score WeakQueen = S( 50, 10); + const Score OtherCheck = S( 10, 10); + 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 ThreatByRank = S( 16, 3); + const Score Hanging = S( 48, 27); + const Score ThreatByPawnPush = S( 38, 22); + const Score HinderPassedPawn = S( 7, 0); // 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 @@ -302,7 +297,7 @@ namespace { int mob = popcount(b & ei.mobilityArea[Us]); mobility[Us] += MobilityBonus[Pt-2][mob]; - + // Bonus for this piece as a king protector score += Protector[Pt-2][distance(s, pos.square(Us))]; @@ -482,7 +477,7 @@ namespace { // Transform the kingDanger units into a Score, and substract it from the evaluation if (kingDanger > 0) - score -= make_score(std::min(kingDanger * kingDanger / 4096, 2 * int(BishopValueMg)), 0); + score -= make_score(kingDanger * kingDanger / 4096, 0); } // King tropism: firstly, find squares that opponent attacks in our king flank @@ -539,8 +534,7 @@ namespace { if (weak ^ safeThreats) score += ThreatByHangingPawn; - while (safeThreats) - score += ThreatBySafePawn[type_of(pos.piece_on(pop_lsb(&safeThreats)))]; + score += ThreatBySafePawn * popcount(safeThreats); } // Squares strongly protected by the opponent, either because they attack the @@ -726,10 +720,9 @@ namespace { // ...count safe + (behind & safe) with a single popcount. int bonus = popcount((Us == WHITE ? safe << 32 : safe >> 32) | (behind & safe)); - bonus = std::min(16, bonus); int weight = pos.count(Us) - 2 * ei.pe->open_files(); - return make_score(bonus * weight * weight / 18, 0); + return make_score(bonus * weight * weight / 16, 0); } @@ -740,11 +733,10 @@ namespace { int kingDistance = distance(pos.square(WHITE), pos.square(BLACK)) - distance(pos.square(WHITE), pos.square(BLACK)); - int pawns = pos.count(WHITE) + pos.count(BLACK); bool bothFlanks = (pos.pieces(PAWN) & QueenSide) && (pos.pieces(PAWN) & KingSide); // Compute the initiative bonus for the attacking side - int initiative = 8 * (asymmetry + kingDistance - 17) + 12 * pawns + 16 * bothFlanks; + int initiative = 8 * (asymmetry + kingDistance - 17) + 12 * pos.count() + 16 * bothFlanks; // Now apply the bonus: note that we find the attacking side by extracting // the sign of the endgame value, and that we carefully cap the bonus so @@ -847,7 +839,7 @@ Value Eval::evaluate(const Position& pos) { - evaluate_passer_pawns(pos, ei); // Evaluate space for both sides, only during opening - if (pos.non_pawn_material(WHITE) + pos.non_pawn_material(BLACK) >= 12222) + if (pos.non_pawn_material() >= 12222) score += evaluate_space(pos, ei) - evaluate_space(pos, ei); @@ -870,7 +862,7 @@ Value Eval::evaluate(const Position& pos) { Trace::add(IMBALANCE, ei.me->imbalance()); Trace::add(PAWN, ei.pe->pawns_score()); Trace::add(MOBILITY, mobility[WHITE], mobility[BLACK]); - if (pos.non_pawn_material(WHITE) + pos.non_pawn_material(BLACK) >= 12222) + if (pos.non_pawn_material() >= 12222) Trace::add(SPACE, evaluate_space(pos, ei) , evaluate_space(pos, ei)); Trace::add(TOTAL, score);