Skip to main content

solverforge_config/
termination.rs

1use std::time::Duration;
2
3use serde::{Deserialize, Serialize};
4
5/// Termination configuration.
6#[derive(Debug, Clone, Default, Deserialize, Serialize)]
7#[serde(rename_all = "snake_case")]
8pub struct TerminationConfig {
9    /// Maximum seconds to spend solving.
10    pub seconds_spent_limit: Option<u64>,
11
12    /// Maximum minutes to spend solving.
13    pub minutes_spent_limit: Option<u64>,
14
15    /// Target best score to achieve (as string, e.g., "0hard/0soft").
16    pub best_score_limit: Option<String>,
17
18    /// Maximum number of steps.
19    pub step_count_limit: Option<u64>,
20
21    /// Maximum unimproved steps before terminating.
22    pub unimproved_step_count_limit: Option<u64>,
23
24    /// Maximum seconds without improvement.
25    pub unimproved_seconds_spent_limit: Option<u64>,
26}
27
28impl TerminationConfig {
29    /// Returns the time limit as a Duration, if any.
30    pub fn time_limit(&self) -> Option<Duration> {
31        let seconds =
32            self.seconds_spent_limit.unwrap_or(0) + self.minutes_spent_limit.unwrap_or(0) * 60;
33        if seconds > 0 {
34            Some(Duration::from_secs(seconds))
35        } else {
36            None
37        }
38    }
39
40    /// Returns the unimproved time limit as a Duration, if any.
41    pub fn unimproved_time_limit(&self) -> Option<Duration> {
42        self.unimproved_seconds_spent_limit.map(Duration::from_secs)
43    }
44}