ferrox/scheduling/
problem.rs1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Serialize, Deserialize)]
5pub struct SchedulingAgent {
6 pub id: usize,
7 pub name: String,
8 pub capabilities: Vec<String>,
10}
11
12#[derive(Debug, Clone, Serialize, Deserialize)]
14pub struct SchedulingTask {
15 pub id: usize,
16 pub name: String,
17 pub required_capability: String,
19 pub duration_min: i64,
21 pub release_min: i64,
23 pub deadline_min: i64,
25}
26
27#[derive(Debug, Clone, Serialize, Deserialize)]
29pub struct SchedulingRequest {
30 pub id: String,
31 pub agents: Vec<SchedulingAgent>,
32 pub tasks: Vec<SchedulingTask>,
33 pub horizon_min: i64,
35 #[serde(default = "default_time_limit")]
37 pub time_limit_seconds: f64,
38}
39
40fn default_time_limit() -> f64 {
41 30.0
42}
43
44#[derive(Debug, Clone, Serialize, Deserialize)]
46pub struct TaskAssignment {
47 pub task_id: usize,
48 pub task_name: String,
49 pub agent_id: usize,
50 pub agent_name: String,
51 pub start_min: i64,
52 pub end_min: i64,
53}
54
55#[derive(Debug, Clone, Serialize, Deserialize)]
57pub struct SchedulingPlan {
58 pub request_id: String,
59 pub assignments: Vec<TaskAssignment>,
60 pub tasks_total: usize,
61 pub tasks_scheduled: usize,
62 pub makespan_min: i64,
64 pub solver: String,
66 pub status: String,
68 pub wall_time_seconds: f64,
69}
70
71impl SchedulingPlan {
72 pub fn throughput_ratio(&self) -> f64 {
74 if self.tasks_total == 0 {
75 return 0.0;
76 }
77 self.tasks_scheduled as f64 / self.tasks_total as f64
78 }
79}