1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-30 16:53:09 +00:00

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.
This commit is contained in:
Marco Costalba 2012-12-30 11:40:20 +01:00
parent 3cf6471738
commit ce063f59cd
3 changed files with 15 additions and 3 deletions

View file

@ -194,7 +194,7 @@ void Search::think() {
goto finalize; 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"]); Move bookMove = book.probe(RootPos, Options["Book File"], Options["Best Book Move"]);
@ -410,6 +410,12 @@ namespace {
if (depth > 2 && BestMoveChanges) if (depth > 2 && BestMoveChanges)
bestMoveNeverChanged = false; 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? // Do we have time for the next iteration? Can we stop searching now?
if (Limits.use_time_management() && !Signals.stopOnPonderhit) if (Limits.use_time_management() && !Signals.stopOnPonderhit)
{ {
@ -602,6 +608,11 @@ namespace {
ss->staticEval, ss->evalMargin); 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 // Update gain for the parent non-capture move given the static position
// evaluation before and after the move. // evaluation before and after the move.
if ( (move = (ss-1)->currentMove) != MOVE_NULL if ( (move = (ss-1)->currentMove) != MOVE_NULL

View file

@ -80,9 +80,9 @@ struct RootMove {
struct LimitsType { struct LimitsType {
LimitsType() { memset(this, 0, sizeof(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 file

@ -215,6 +215,7 @@ namespace {
else if (token == "depth") is >> limits.depth; else if (token == "depth") is >> limits.depth;
else if (token == "nodes") is >> limits.nodes; else if (token == "nodes") is >> limits.nodes;
else if (token == "movetime") is >> limits.movetime; else if (token == "movetime") is >> limits.movetime;
else if (token == "mate") is >> limits.mate;
else if (token == "infinite") limits.infinite = true; else if (token == "infinite") limits.infinite = true;
else if (token == "ponder") limits.ponder = true; else if (token == "ponder") limits.ponder = true;
} }