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    pub fn time_limit(&self) -> Option<Duration> {
30        let seconds =
31            self.seconds_spent_limit.unwrap_or(0) + self.minutes_spent_limit.unwrap_or(0) * 60;
32        if seconds > 0 {
33            Some(Duration::from_secs(seconds))
34        } else {
35            None
36        }
37    }
38
39    pub fn unimproved_time_limit(&self) -> Option<Duration> {
40        self.unimproved_seconds_spent_limit.map(Duration::from_secs)
41    }
42}