From c6c152e94a2bb9c92e71d1bb4803b24d67876302 Mon Sep 17 00:00:00 2001 From: joseph Date: Sun, 30 Nov 2014 15:30:56 -0600 Subject: [PATCH] Allow SF to find mates more easily. Bench: 7698608 --- src/movegen.cpp | 19 +++++++++++++++++++ src/movegen.h | 3 ++- src/search.cpp | 6 ++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/movegen.cpp b/src/movegen.cpp index dab830ba708..d0356a94d13 100644 --- a/src/movegen.cpp +++ b/src/movegen.cpp @@ -416,3 +416,22 @@ ExtMove* generate(const Position& pos, ExtMove* mlist) { return end; } + +template<> +ExtMove* generate(const Position& pos, ExtMove* mlist) { + + ExtMove *end, *cur = mlist; + Bitboard pinned = pos.pinned_pieces(pos.side_to_move()); + Square ksq = pos.king_square(pos.side_to_move()); + + end = pos.checkers() ? generate(pos, mlist) + : generate(pos, mlist); + while (cur != end) + if ( from_sq(cur->move) == ksq + && pos.legal(cur->move, pinned)) + ++cur; + else + cur->move = (--end)->move; + + return end; +} diff --git a/src/movegen.h b/src/movegen.h index c18fa07c0d1..f48c563e837 100644 --- a/src/movegen.h +++ b/src/movegen.h @@ -28,7 +28,8 @@ enum GenType { QUIET_CHECKS, EVASIONS, NON_EVASIONS, - LEGAL + LEGAL, + KING_MOVES }; class Position; diff --git a/src/search.cpp b/src/search.cpp index 0130e85f7c6..037596634ec 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -621,6 +621,7 @@ namespace { // Step 6. Razoring (skipped when in check) if ( !PvNode && depth < 4 * ONE_PLY + && abs(eval) < VALUE_MATE_IN_MAX_PLY && eval + razor_margin(depth) <= alpha && ttMove == MOVE_NONE && !pos.pawn_on_7th(pos.side_to_move())) @@ -649,6 +650,7 @@ namespace { && !ss->skipNullMove && depth >= 2 * ONE_PLY && eval >= beta + && abs(eval) < VALUE_MATE_IN_MAX_PLY && pos.non_pawn_material(pos.side_to_move())) { ss->currentMove = MOVE_NULL; @@ -674,6 +676,9 @@ namespace { if (depth < 12 * ONE_PLY && abs(beta) < VALUE_KNOWN_WIN) return nullValue; + if (MoveList(pos).size() < 1 || MoveList(pos).size() < 6) + R = DEPTH_ZERO; + // Do verification search at high depths ss->skipNullMove = true; Value v = depth-R < ONE_PLY ? qsearch(pos, ss, beta-1, beta, DEPTH_ZERO) @@ -692,6 +697,7 @@ namespace { if ( !PvNode && depth >= 5 * ONE_PLY && !ss->skipNullMove + && abs(eval) < VALUE_MATE_IN_MAX_PLY && abs(beta) < VALUE_MATE_IN_MAX_PLY) { Value rbeta = std::min(beta + 200, VALUE_INFINITE);