Skip to content
Browse files

Handle UCI command "mate in x moves"

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...
1 parent 3cf6471 commit ce063f59cd0fea215309c719ee56cbf486a5ea80 @mcostalba committed Dec 30, 2012
Showing with 15 additions and 3 deletions.
  1. +12 −1 src/search.cpp
  2. +2 −2 src/search.h
  3. +1 −0 src/uci.cpp
View
13 src/search.cpp
@@ -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"]);
@@ -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)
{
@@ -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
View
4 src/search.h
@@ -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;
};
View
1 src/uci.cpp
@@ -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;
}

0 comments on commit ce063f5

Please sign in to comment.
Something went wrong with that request. Please try again.