Skip to content

Commit

Permalink
Handle UCI command "mate in x moves"
Browse files Browse the repository at this point in the history
Following a user request I added the handling of UCI:

go mate x

Currently we just return from a PV node if x moves have been
done. Probably not the best approach. I have looked at Fruit/Toga
sources and there is even simpler: engine falls back on a fixed
depth search.

No functional change.
  • Loading branch information
mcostalba committed Dec 30, 2012
1 parent 3cf6471 commit ce063f5
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 3 deletions.
13 changes: 12 additions & 1 deletion src/search.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@ void Search::think() {
goto finalize;
}

if (Options["OwnBook"] && !Limits.infinite)
if (Options["OwnBook"] && !Limits.infinite && !Limits.mate)
{
Move bookMove = book.probe(RootPos, Options["Book File"], Options["Best Book Move"]);

Expand Down Expand Up @@ -410,6 +410,12 @@ namespace {
if (depth > 2 && BestMoveChanges)
bestMoveNeverChanged = false;

// Do we have found a "mate in x"?
if ( Limits.mate
&& bestValue >= VALUE_MATE_IN_MAX_PLY
&& VALUE_MATE - bestValue <= 2 * Limits.mate)
Signals.stop = true;

// Do we have time for the next iteration? Can we stop searching now?
if (Limits.use_time_management() && !Signals.stopOnPonderhit)
{
Expand Down Expand Up @@ -602,6 +608,11 @@ namespace {
ss->staticEval, ss->evalMargin);
}

// Handling of UCI command 'mate in x moves'. We simply return if after
// 'x' moves we still have not checkmated the opponent.
if (PvNode && !RootNode && !inCheck && Limits.mate && ss->ply > 2 * Limits.mate)
return eval;

// Update gain for the parent non-capture move given the static position
// evaluation before and after the move.
if ( (move = (ss-1)->currentMove) != MOVE_NULL
Expand Down
4 changes: 2 additions & 2 deletions src/search.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,9 +80,9 @@ struct RootMove {
struct LimitsType {

LimitsType() { memset(this, 0, sizeof(LimitsType)); }
bool use_time_management() const { return !(movetime | depth | nodes | infinite); }
bool use_time_management() const { return !(mate | movetime | depth | nodes | infinite); }

int time[COLOR_NB], inc[COLOR_NB], movestogo, depth, nodes, movetime, infinite, ponder;
int time[COLOR_NB], inc[COLOR_NB], movestogo, depth, nodes, movetime, mate, infinite, ponder;
};


Expand Down
1 change: 1 addition & 0 deletions src/uci.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,7 @@ namespace {
else if (token == "depth") is >> limits.depth;
else if (token == "nodes") is >> limits.nodes;
else if (token == "movetime") is >> limits.movetime;
else if (token == "mate") is >> limits.mate;
else if (token == "infinite") limits.infinite = true;
else if (token == "ponder") limits.ponder = true;
}
Expand Down

0 comments on commit ce063f5

Please sign in to comment.