1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-05-01 09:13:08 +00:00

Greatly speedup has_mate_threat()

Instead of loop across all legal moves to find a mate
loop across possible check moves only.

This reduces more then 10 times the number of moves to
check for a possible mate.

Also rename generate_checks() in generate_non_capture_checks()
so to better clarify what the function does.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba 2009-04-20 09:10:27 +02:00
parent 24485c96ec
commit 7c267587fc
4 changed files with 18 additions and 17 deletions

View file

@ -176,10 +176,10 @@ int generate_noncaptures(const Position& pos, MoveStack* mlist) {
} }
/// generate_checks() generates all pseudo-legal non-capturing, non-promoting /// generate_non_capture_checks() generates all pseudo-legal non-capturing,
/// checks. It returns the number of generated moves. /// non-promoting checks. It returns the number of generated moves.
int generate_checks(const Position& pos, MoveStack* mlist, Bitboard dc) { int generate_non_capture_checks(const Position& pos, MoveStack* mlist, Bitboard dc) {
assert(pos.is_ok()); assert(pos.is_ok());
assert(!pos.is_check()); assert(!pos.is_check());

View file

@ -34,7 +34,7 @@
extern int generate_captures(const Position& pos, MoveStack* mlist); extern int generate_captures(const Position& pos, MoveStack* mlist);
extern int generate_noncaptures(const Position& pos, MoveStack* mlist); extern int generate_noncaptures(const Position& pos, MoveStack* mlist);
extern int generate_checks(const Position& pos, MoveStack* mlist, Bitboard dc); extern int generate_non_capture_checks(const Position& pos, MoveStack* mlist, Bitboard dc);
extern int generate_evasions(const Position& pos, MoveStack* mlist, Bitboard pinned); extern int generate_evasions(const Position& pos, MoveStack* mlist, Bitboard pinned);
extern int generate_legal_moves(const Position& pos, MoveStack* mlist); extern int generate_legal_moves(const Position& pos, MoveStack* mlist);
extern bool move_is_legal(const Position& pos, const Move m, Bitboard pinned); extern bool move_is_legal(const Position& pos, const Move m, Bitboard pinned);

View file

@ -163,7 +163,7 @@ Move MovePicker::get_next_move() {
break; break;
case PH_QCHECKS: case PH_QCHECKS:
numOfMoves = generate_checks(pos, moves, dc); numOfMoves = generate_non_capture_checks(pos, moves, dc);
movesPicked = 0; movesPicked = 0;
break; break;

View file

@ -1903,20 +1903,13 @@ bool Position::is_mate() const {
/// Position::has_mate_threat() tests whether a given color has a mate in one /// Position::has_mate_threat() tests whether a given color has a mate in one
/// from the current position. This function is quite slow, but it doesn't /// from the current position.
/// matter, because it is currently only called from PV nodes, which are rare.
bool Position::has_mate_threat(Color c) { bool Position::has_mate_threat(Color c) {
StateInfo st1, st2; StateInfo st1, st2;
Color stm = side_to_move(); Color stm = side_to_move();
// The following lines are useless and silly, but prevents gcc from
// emitting a stupid warning stating that u1.lastMove and u1.epSquare might
// be used uninitialized.
st1.lastMove = st->lastMove;
st1.epSquare = st->epSquare;
if (is_check()) if (is_check())
return false; return false;
@ -1927,18 +1920,26 @@ bool Position::has_mate_threat(Color c) {
MoveStack mlist[120]; MoveStack mlist[120];
int count; int count;
bool result = false; bool result = false;
Bitboard dc = discovered_check_candidates(sideToMove);
Bitboard pinned = pinned_pieces(sideToMove);
// Generate legal moves // Generate pseudo-legal non-capture and capture check moves
count = generate_legal_moves(*this, mlist); count = generate_non_capture_checks(*this, mlist, dc);
count += generate_captures(*this, mlist + count);
// Loop through the moves, and see if one of them is mate // Loop through the moves, and see if one of them is mate
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
{ {
do_move(mlist[i].move, st2); Move move = mlist[i].move;
if (!pl_move_is_legal(move, pinned))
continue;
do_move(move, st2);
if (is_mate()) if (is_mate())
result = true; result = true;
undo_move(mlist[i].move); undo_move(move);
} }
// Undo null move, if necessary // Undo null move, if necessary