use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CpVariable {
pub name: String,
pub lb: i64,
pub ub: i64,
#[serde(default)]
pub is_bool: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IntervalVarDef {
pub name: String,
pub start_var: String,
pub duration: i64,
pub end_var: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OptionalIntervalVarDef {
pub name: String,
pub start_var: String,
pub duration: i64,
pub end_var: String,
pub lit_var: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CpTerm {
pub var: String,
pub coeff: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum ConstraintKind {
LinearLe { terms: Vec<CpTerm>, rhs: i64 },
LinearGe { terms: Vec<CpTerm>, rhs: i64 },
LinearEq { terms: Vec<CpTerm>, rhs: i64 },
AllDifferent { vars: Vec<String> },
NoOverlap { intervals: Vec<String> },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CpSatRequest {
pub id: String,
pub variables: Vec<CpVariable>,
#[serde(default)]
pub interval_vars: Vec<IntervalVarDef>,
#[serde(default)]
pub optional_interval_vars: Vec<OptionalIntervalVarDef>,
pub constraints: Vec<ConstraintKind>,
pub objective_terms: Option<Vec<CpTerm>>,
pub minimize: bool,
pub time_limit_seconds: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CpSatPlan {
pub request_id: String,
pub status: String,
pub assignments: Vec<(String, i64)>,
pub objective_value: Option<i64>,
pub wall_time_seconds: f64,
pub solver: String,
}