use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SchedulingAgent {
pub id: usize,
pub name: String,
pub capabilities: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SchedulingTask {
pub id: usize,
pub name: String,
pub required_capability: String,
pub duration_min: i64,
pub release_min: i64,
pub deadline_min: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SchedulingRequest {
pub id: String,
pub agents: Vec<SchedulingAgent>,
pub tasks: Vec<SchedulingTask>,
pub horizon_min: i64,
#[serde(default = "default_time_limit")]
pub time_limit_seconds: f64,
}
fn default_time_limit() -> f64 {
30.0
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TaskAssignment {
pub task_id: usize,
pub task_name: String,
pub agent_id: usize,
pub agent_name: String,
pub start_min: i64,
pub end_min: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SchedulingPlan {
pub request_id: String,
pub assignments: Vec<TaskAssignment>,
pub tasks_total: usize,
pub tasks_scheduled: usize,
pub makespan_min: i64,
pub solver: String,
pub status: String,
pub wall_time_seconds: f64,
}
impl SchedulingPlan {
pub fn throughput_ratio(&self) -> f64 {
if self.tasks_total == 0 {
return 0.0;
}
self.tasks_scheduled as f64 / self.tasks_total as f64
}
}