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

Introduce see_sign() and use it to shortcut full see()

Mostly of times we are interested only in the sign of SEE,
namely if a capture is negative or not.

If the capturing piece is smaller then the captured one we
already know SEE cannot be negative and this information
is enough most of the times. And of course it is much
faster to detect then a full SEE.

Note that in case see_sign() is negative then the returned
value is exactly the see() value, this is very important,
especially for ordering capturing moves.

With this patch the calls to the costly see() are reduced
of almost 30%.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba 2009-07-11 09:54:30 +01:00
parent 6f39a3fc80
commit 2a461b4b74
4 changed files with 21 additions and 6 deletions

View file

@ -244,7 +244,7 @@ void MovePicker::score_captures() {
for (int i = 0; i < numOfMoves; i++)
{
m = moves[i].move;
seeValue = pos.see(m);
seeValue = pos.see_sign(m);
if (seeValue >= 0)
{
if (move_is_promotion(m))

View file

@ -1474,6 +1474,22 @@ int Position::see(Move m) const {
return see(move_from(m), move_to(m));
}
int Position::see_sign(Move m) const {
assert(move_is_ok(m));
Square from = move_from(m);
Square to = move_to(m);
// Early return if SEE cannot be negative because capturing piece value
// is not bigger then captured one.
if ( midgame_value_of_piece_on(from) <= midgame_value_of_piece_on(to)
&& type_of_piece_on(from) != KING)
return 1;
return see(from, to);
}
int Position::see(Square from, Square to) const {
// Material values

View file

@ -267,6 +267,7 @@ public:
int see(Square from, Square to) const;
int see(Move m) const;
int see(Square to) const;
int see_sign(Move m) const;
// Accessing hash keys
Key get_key() const;

View file

@ -1561,9 +1561,7 @@ namespace {
// Don't search captures and checks with negative SEE values
if ( !isCheck
&& !move_is_promotion(move)
&& (pos.midgame_value_of_piece_on(move_from(move)) >
pos.midgame_value_of_piece_on(move_to(move)))
&& pos.see(move) < 0)
&& pos.see_sign(move) < 0)
continue;
// Make and search the move.
@ -2240,7 +2238,7 @@ namespace {
if ( pvNode
&& capture
&& pos.type_of_piece_on(move_to(m)) != PAWN
&& pos.see(m) >= 0)
&& pos.see_sign(m) >= 0)
{
result += OnePly/2;
*dangerous = true;
@ -2313,7 +2311,7 @@ namespace {
&& threat != MOVE_NONE
&& piece_is_slider(pos.piece_on(tfrom))
&& bit_is_set(squares_between(tfrom, tto), mto)
&& pos.see(m) >= 0)
&& pos.see_sign(m) >= 0)
return false;
return true;