diff --git a/src/search.rs b/src/search.rs index 3c8ea7e13..a42eaa549 100644 --- a/src/search.rs +++ b/src/search.rs @@ -234,6 +234,14 @@ pub fn start(td: &mut ThreadData, report: Report, thread_count: usize) { break; } + if td.id == 0 + && let Limits::Mate(moves) = td.time_manager.limits() + && Score::MATE - td.root_moves[0].score.abs() <= moves as i32 * 2 + { + td.shared.status.set(Status::STOPPED); + break; + } + let multiplier = || { let nodes = { let fraction = td.root_moves[0].nodes as f32 / td.nodes() as f32; diff --git a/src/time.rs b/src/time.rs index e5f8368d5..f069862c7 100644 --- a/src/time.rs +++ b/src/time.rs @@ -8,6 +8,7 @@ pub enum Limits { Depth(i32), Time(u64), Nodes(u64), + Mate(u64), Fischer(u64, u64), Cyclic(u64, u64, u64), } @@ -69,7 +70,7 @@ impl TimeManager { pub fn soft_limit(&self, td: &ThreadData, multiplier: impl Fn() -> f32) -> bool { match self.limits { - Limits::Infinite | Limits::Depth(_) => false, + Limits::Infinite | Limits::Depth(_) | Limits::Mate(_) => false, Limits::Nodes(maximum) => td.shared.nodes.aggregate() >= maximum, Limits::Time(maximum) => self.start_time.elapsed() >= Duration::from_millis(maximum), _ => self.start_time.elapsed() >= Duration::from_secs_f32(self.soft_bound.as_secs_f32() * multiplier()), @@ -82,7 +83,7 @@ impl TimeManager { } match self.limits { - Limits::Infinite | Limits::Depth(_) => false, + Limits::Infinite | Limits::Depth(_) | Limits::Mate(_) => false, Limits::Nodes(maximum) => td.shared.nodes.aggregate() > maximum, _ => td.nodes() & 2047 == 2047 && self.start_time.elapsed() >= self.hard_bound, } diff --git a/src/uci.rs b/src/uci.rs index ad1745123..bcf53b844 100644 --- a/src/uci.rs +++ b/src/uci.rs @@ -402,6 +402,7 @@ fn parse_limits(color: Color, tokens: &[&str]) -> Limits { "depth" if value > 0 => return Limits::Depth(value as i32), "movetime" if value > 0 => return Limits::Time(value), "nodes" if value > 0 => return Limits::Nodes(value), + "mate" if value > 0 => return Limits::Mate(value), "wtime" if Color::White == color => main = Some(value), "btime" if Color::Black == color => main = Some(value),