};
// Assorted bonuses and penalties used by evaluation
- const Score KingOnPawnOne = S(0 , 64);
- const Score KingOnPawnMany = S(0 ,128);
+ const Score KingOnOne = S(2 , 58);
+ const Score KingOnMany = S(6 ,125);
const Score RookOnPawn = S(10, 28);
const Score RookOpenFile = S(43, 21);
const Score RookSemiOpenFile = S(19, 10);
& ei.attackedBy[Them][PAWN]
& (ei.attackedBy[Us][KNIGHT] | ei.attackedBy[Us][BISHOP]);
- if(protectedEnemies)
+ if (protectedEnemies)
score += Threat[Minor][type_of(pos.piece_on(lsb(protectedEnemies)))];
// Enemies not defended by a pawn and under our attack
if (b)
score += more_than_one(b) ? Hanging * popcount<Max15>(b) : Hanging;
- b = weakEnemies & pos.pieces(Them, PAWN) & ei.attackedBy[Us][KING];
+ b = weakEnemies & ei.attackedBy[Us][KING];
if (b)
- score += more_than_one(b) ? KingOnPawnMany : KingOnPawnOne;
+ score += more_than_one(b) ? KingOnMany : KingOnOne;
}
if (Trace)
mbonus += k * rr, ebonus += k * rr;
}
- else if(pos.pieces(Us) & blockSq)
+ else if (pos.pieces(Us) & blockSq)
mbonus += rr * 3 + r * 2 + 3, ebonus += rr + r * 2;
} // rr != 0
}
- // evaluate_unstoppable_pawns() scores the most advanced among the passed and
- // candidate pawns. In case both players have no pieces but pawns, this is
- // somewhat related to the possibility that pawns are unstoppable.
+ // evaluate_unstoppable_pawns() scores the most advanced passed pawn. In case
+ // both players have no pieces but pawns, this is somewhat related to the
+ // possibility that pawns are unstoppable.
Score evaluate_unstoppable_pawns(Color us, const EvalInfo& ei) {
- Bitboard b = ei.pi->passed_pawns(us) | ei.pi->candidate_pawns(us);
+ Bitboard b = ei.pi->passed_pawns(us);
return b ? Unstoppable * int(relative_rank(us, frontmost_sq(us, b))) : SCORE_ZERO;
}
// If we have a specialized evaluation function for the current material
// configuration, call it and return.
if (ei.mi->specialized_eval_exists())
- return ei.mi->evaluate(pos);
+ return ei.mi->evaluate(pos) + Eval::Tempo;
// Probe the pawn hash table
ei.pi = Pawns::probe(pos, thisThread->pawnsTable);
Tracing::sf = sf;
}
- return pos.side_to_move() == WHITE ? v : -v;
+ return (pos.side_to_move() == WHITE ? v : -v) + Eval::Tempo;
}
/// of the position always from the point of view of the side to move.
Value evaluate(const Position& pos) {
- return do_evaluate<false>(pos) + Tempo;
+ return do_evaluate<false>(pos);
}