use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Snapshot {
pub problem_hash: String,
pub branch_tree: BranchTree,
pub learned_clauses: Vec<Vec<i64>>,
pub prng_state: PrngState,
pub solver_config: SolverConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BranchTree {
pub branches: Vec<BranchInfo>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BranchInfo {
pub id: String,
pub parent_id: Option<String>,
pub depth: u32,
pub status: BranchStatus,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum BranchStatus {
Active,
Failed,
Solved,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PrngState {
pub xorshift_state: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SolverConfig {
pub cpu_workers: usize,
pub gpu_workers: usize,
pub heuristic_weights: HeuristicWeights,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HeuristicWeights {
pub vsids: f64,
pub evsids: f64,
pub lrb: f64,
}
impl Default for HeuristicWeights {
fn default() -> Self {
Self {
vsids: 0.4,
evsids: 0.3,
lrb: 0.3,
}
}
}
impl Snapshot {
pub fn to_json(&self) -> Result<String, serde_json::Error> {
serde_json::to_string_pretty(self)
}
pub fn from_json(json: &str) -> Result<Self, serde_json::Error> {
serde_json::from_str(json)
}
}