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:
parent
6f39a3fc80
commit
2a461b4b74
4 changed files with 21 additions and 6 deletions
|
@ -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))
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue