1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-30 08:43:09 +00:00

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

@ -1171,8 +1171,8 @@ namespace {
Square b8 = relative_square(us, (square_file(s) == FILE_A) ? SQ_B8 : SQ_G8); Square b8 = relative_square(us, (square_file(s) == FILE_A) ? SQ_B8 : SQ_G8);
if ( pos.piece_on(b6) == piece_of_color_and_type(opposite_color(us), PAWN) if ( pos.piece_on(b6) == piece_of_color_and_type(opposite_color(us), PAWN)
&& pos.see(s, b6) < 0 && pos.see(s, b6, false) < 0
&& pos.see(s, b8) < 0) && pos.see(s, b8, false) < 0)
{ {
ei.mgValue -= Sign[us] * TrappedBishopA7H7Penalty; ei.mgValue -= Sign[us] * TrappedBishopA7H7Penalty;
ei.egValue -= Sign[us] * TrappedBishopA7H7Penalty; ei.egValue -= Sign[us] * TrappedBishopA7H7Penalty;

View file

@ -1300,13 +1300,13 @@ void Position::undo_null_move() {
int Position::see(Square to) const { int Position::see(Square to) const {
assert(square_is_ok(to)); assert(square_is_ok(to));
return see(SQ_NONE, to); return see(SQ_NONE, to, false);
} }
int Position::see(Move m) const { int Position::see(Move m) const {
assert(move_is_ok(m)); 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 { int Position::see_sign(Move m) const {
@ -1322,10 +1322,10 @@ int Position::see_sign(Move m) const {
&& type_of_piece_on(from) != KING) && type_of_piece_on(from) != KING)
return 1; 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 // Material values
static const int seeValues[18] = { static const int seeValues[18] = {
@ -1338,6 +1338,7 @@ int Position::see(Square from, Square to) const {
Bitboard attackers, stmAttackers, b; Bitboard attackers, stmAttackers, b;
assert(!shortcut || from != SQ_NONE);
assert(square_is_ok(from) || from == SQ_NONE); assert(square_is_ok(from) || from == SQ_NONE);
assert(square_is_ok(to)); assert(square_is_ok(to));
@ -1350,6 +1351,22 @@ int Position::see(Square from, Square to) const {
Piece capture = piece_on(to); Piece capture = piece_on(to);
Bitboard occ = occupied_squares(); 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 // Handle en passant moves
if (st->epSquare == to && type_of_piece_on(from) == PAWN) if (st->epSquare == to && type_of_piece_on(from) == PAWN)
{ {

View file

@ -229,7 +229,7 @@ public:
void undo_null_move(); void undo_null_move();
// Static exchange evaluation // Static exchange evaluation
int see(Square from, Square to) const; int see(Square from, Square to, bool shortcut) const;
int see(Move m) const; int see(Move m) const;
int see(Square to) const; int see(Square to) const;
int see_sign(Move m) const; int see_sign(Move m) const;