use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
pub type SpaceConstraintDto = serde_json::Value;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum SpaceStatusDto {
Running,
Failed,
Succeeded,
Alternatives { count: u32 },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum SearchStrategyDto {
DepthFirst,
BreadthFirst,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChoicePointDto {
pub description: String,
pub alternative_count: u32,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub variable_name: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChoiceSelection {
pub description: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub selected_index: Option<i32>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct SearchStatsDto {
pub nodes_explored: u64,
pub nodes_pruned: u64,
pub backtracks: u64,
pub solve_time_ms: u64,
pub scorer_calls: u64,
pub restarts: u64,
pub learned_clauses: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub forced_choices: Option<Vec<ChoiceSelection>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TraceEventDto {
pub assignment: String,
pub event_type: String,
pub id: u64,
pub value_label: i64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub variable: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SpaceSolutionDto {
pub space_id: String,
pub status: SpaceStatusDto,
#[serde(default)]
pub choices: Vec<ChoiceSelection>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub events: Option<Vec<TraceEventDto>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateSpaceRequest {
pub choice_points: Vec<ChoicePointDto>,
pub constraints: Vec<SpaceConstraintDto>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SpaceResponse {
pub id: String,
pub status: SpaceStatusDto,
pub constraint_count: u32,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub selected_alternative: Option<i32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CommitRequest {
pub alternative_index: u32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum SearchModeDto {
Solutions,
Feasibility,
Scheduling,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VariableFeasibilityDto {
pub can_be_true: bool,
pub can_be_false: bool,
pub verified: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SpaceSearchRequest {
pub strategy: SearchStrategyDto,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_solutions: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub collect_traces: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub use_neural_guidance: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub mode: Option<SearchModeDto>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum SpaceSearchResponse {
Solutions {
solutions: Vec<SpaceSolutionDto>,
count: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
search_stats: Option<SearchStatsDto>,
},
Feasibility {
variables: BTreeMap<String, VariableFeasibilityDto>,
#[serde(default, skip_serializing_if = "Option::is_none")]
search_stats: Option<SearchStatsDto>,
},
}