Permalink
Browse files

Do not null search when beta is a mate value

Also do not return unproven mates in null search.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
  • Loading branch information...
1 parent 4c29493 commit dae2f600d69bd957e3626eb86109f46a88b0c9aa @mcostalba committed Dec 15, 2008
Showing with 21 additions and 1 deletion.
  1. +21 −1 src/search.cpp
View
@@ -267,6 +267,7 @@ namespace {
void update_pv(SearchStack ss[], int ply);
void sp_update_pv(SearchStack *pss, SearchStack ss[], int ply);
bool connected_moves(const Position &pos, Move m1, Move m2);
+ bool value_is_mate(Value value);
bool move_is_killer(Move m, const SearchStack& ss);
Depth extension(const Position &pos, Move m, bool pvNode, bool check, bool singleReply, bool mateThreat, bool* dangerous);
bool ok_to_do_nullmove(const Position &pos);
@@ -1176,6 +1177,7 @@ namespace {
if ( allowNullmove
&& depth > OnePly
&& !isCheck
+ && !value_is_mate(beta)
&& ok_to_do_nullmove(pos)
&& approximateEval >= beta - NullMoveMargin)
{
@@ -1201,7 +1203,11 @@ namespace {
pos.undo_null_move(u);
- if (nullValue >= beta)
+ if (value_is_mate(nullValue))
+ {
+ /* Do not return unproven mates */
+ }
+ else if (nullValue >= beta)
{
if (depth < 6 * OnePly)
return beta;
@@ -1298,10 +1304,12 @@ namespace {
&& !moveIsCapture
&& !move_promotion(move))
{
+ // History pruning. See ok_to_prune() definition.
if ( moveCount >= 2 + int(depth)
&& ok_to_prune(pos, move, ss[ply].threatMove, depth))
continue;
+ // Value based pruning.
if (depth < 3 * OnePly && approximateEval < beta)
{
if (futilityValue == VALUE_NONE)
@@ -2120,6 +2128,18 @@ namespace {
}
+ // value_is_mate() checks if the given value is a mate one
+ // eventually compensated for the ply.
+
+ bool value_is_mate(Value value) {
+
+ assert(abs(value) <= VALUE_INFINITE);
+
+ return value <= value_mated_in(PLY_MAX)
+ || value >= value_mate_in(PLY_MAX);
+ }
+
+
// move_is_killer() checks if the given move is among the
// killer moves of that ply.

0 comments on commit dae2f60

Please sign in to comment.