Shortcut see_sign() when SEE is known negative

This patch cuts 30% of SEE calculations, as a drawback
a returned negative value is no more always correct if
a shortcut is found.

This could impact move order when based on negative see
score as example bad captures and evasions.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba
2009-10-30 13:34:45 +01:00
parent 23de3e16f1
commit 941d923bf8
3 changed files with 24 additions and 7 deletions

View File

@@ -1300,13 +1300,13 @@ void Position::undo_null_move() {
int Position::see(Square to) const {
assert(square_is_ok(to));
return see(SQ_NONE, to);
return see(SQ_NONE, to, false);
}
int Position::see(Move m) const {
assert(move_is_ok(m));
return see(move_from(m), move_to(m));
return see(move_from(m), move_to(m), false);
}
int Position::see_sign(Move m) const {
@@ -1322,10 +1322,10 @@ int Position::see_sign(Move m) const {
&& type_of_piece_on(from) != KING)
return 1;
return see(from, to);
return see(from, to, true);
}
int Position::see(Square from, Square to) const {
int Position::see(Square from, Square to, bool shortcut) const {
// Material values
static const int seeValues[18] = {
@@ -1338,6 +1338,7 @@ int Position::see(Square from, Square to) const {
Bitboard attackers, stmAttackers, b;
assert(!shortcut || from != SQ_NONE);
assert(square_is_ok(from) || from == SQ_NONE);
assert(square_is_ok(to));
@@ -1350,6 +1351,22 @@ int Position::see(Square from, Square to) const {
Piece capture = piece_on(to);
Bitboard occ = occupied_squares();
// If captured piece is defended by enemy pawns or knights then SEE is negative
// when captured piece value is not enough to compensate the lost of capturing one.
if (shortcut)
{
int diff = seeValues[piece] - seeValues[capture];
if ( diff > seeValues[PAWN]
&&(attacks_from<PAWN>(to, us) & pieces(PAWN, them)))
return -(diff - seeValues[PAWN] / 2);
if ( diff > seeValues[KNIGHT]
&& pieces(KNIGHT, them)
&&(pieces(KNIGHT, them) & attacks_from<KNIGHT>(to)))
return -(diff - seeValues[KNIGHT] / 2);
}
// Handle en passant moves
if (st->epSquare == to && type_of_piece_on(from) == PAWN)
{