1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-29 16:23:09 +00:00

Delay SEE for scoring captures

Do not calculate SEE on all the moves in MovePicker::score_captures()
but delay until pick_move_from_list() when only the best ones are
double checked against their see value.

If a beta cut-off occurs then we avoid calculating SEE on all
the moves, but just the picked ones.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba 2008-11-01 18:28:49 +01:00
parent 55b6464d40
commit d087b0a34a

View file

@ -206,27 +206,22 @@ void MovePicker::score_captures() {
// Suprisingly, this appears to perform slightly better than SEE based // Suprisingly, this appears to perform slightly better than SEE based
// move ordering. The reason is probably that in a position with a winning // move ordering. The reason is probably that in a position with a winning
// capture, capturing a more valuable (but sufficiently defended) piece // capture, capturing a more valuable (but sufficiently defended) piece
// first usually doesn't hurt. The opponent will have to recapture, and // first usually doesn't hurt. The opponent will have to recapture, and
// the hanging piece will still be hanging (except in the unusual cases // the hanging piece will still be hanging (except in the unusual cases
// where it is possible to recapture with the hanging piece). Exchanging // where it is possible to recapture with the hanging piece). Exchanging
// big pieces before capturing a hanging piece probably helps to reduce // big pieces before capturing a hanging piece probably helps to reduce
// the subtree size. // the subtree size. Instead of calculating SEE here to filter out
// loosing captures, we delay the filtering in pick_move_from_list()
Move m; Move m;
int seeValue;
for (int i = 0; i < numOfMoves; i++) for (int i = 0; i < numOfMoves; i++)
{ {
m = moves[i].move; m = moves[i].move;
seeValue = pos.see(m); if (move_promotion(m))
if (seeValue >= 0) moves[i].score = QueenValueMidgame;
{ else
if (move_promotion(m)) moves[i].score = int(pos.midgame_value_of_piece_on(move_to(m)))
moves[i].score = QueenValueMidgame; -int(pos.type_of_piece_on(move_from(m)));
else
moves[i].score = int(pos.midgame_value_of_piece_on(move_to(m)))
-int(pos.type_of_piece_on(move_from(m)));
} else
moves[i].score = seeValue;
} }
} }
@ -325,26 +320,21 @@ Move MovePicker::pick_move_from_list() {
while (movesPicked < numOfMoves) while (movesPicked < numOfMoves)
{ {
int bestScore = -10000000; bestIndex = find_best_index();
bestIndex = -1;
for (int i = movesPicked; i < numOfMoves; i++) if (bestIndex != -1) // Found a possibly good capture
{ {
if (moves[i].score < 0) move = moves[bestIndex].move;
int seeValue = pos.see(move);
if (seeValue < 0)
{ {
// Losing capture, move it to the badCaptures[] array // Losing capture, move it to the badCaptures[] array
assert(numOfBadCaptures < 63); assert(numOfBadCaptures < 63);
badCaptures[numOfBadCaptures++] = moves[i]; moves[bestIndex].score = seeValue;
moves[i--] = moves[--numOfMoves]; badCaptures[numOfBadCaptures++] = moves[bestIndex];
moves[bestIndex] = moves[--numOfMoves];
continue;
} }
else if (moves[i].score > bestScore)
{
bestIndex = i;
bestScore = moves[i].score;
}
}
if (bestIndex != -1) // Found a good capture
{
move = moves[bestIndex].move;
moves[bestIndex] = moves[movesPicked++]; moves[bestIndex] = moves[movesPicked++];
if ( move != ttMove if ( move != ttMove
&& move != mateKiller && move != mateKiller