-
-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathmain.rs
More file actions
67 lines (61 loc) · 2.13 KB
/
Copy pathmain.rs
File metadata and controls
67 lines (61 loc) · 2.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
use solverforge::{SolverEvent, SolverManager, SolverTerminalReason};
mod domain;
use domain::{Nurse, Schedule, Shift};
static MANAGER: SolverManager<Schedule> = SolverManager::new();
fn main() {
let schedule = Schedule {
nurses: vec![
Nurse {
id: 0,
name: "Amina".to_string(),
},
Nurse {
id: 1,
name: "Bruno".to_string(),
},
Nurse {
id: 2,
name: "Chiara".to_string(),
},
],
shifts: (0..6)
.flat_map(|day| {
(0..2).map(move |slot| Shift {
id: day * 2 + slot,
day: day as i64,
slot,
required: true,
nurse_idx: None,
})
})
.collect(),
score: None,
};
let (job_id, mut events) = MANAGER.solve(schedule).expect("solver job should start");
while let Some(event) = events.blocking_recv() {
match event {
SolverEvent::Completed { metadata, solution } => {
assert!(matches!(
metadata.terminal_reason,
Some(
SolverTerminalReason::Completed | SolverTerminalReason::TerminatedByConfig
)
));
println!("score: {}", solution.score.expect("completed score"));
for shift in solution.shifts {
let nurse = shift
.nurse_idx
.and_then(|idx| solution.nurses.get(idx))
.map(|nurse| nurse.name.as_str())
.unwrap_or("unassigned");
println!("day {} slot {} -> {nurse}", shift.day, shift.slot);
}
MANAGER.delete(job_id).expect("delete completed job");
break;
}
SolverEvent::Failed { error, .. } => panic!("solver failed: {error}"),
SolverEvent::Cancelled { .. } => panic!("solver was cancelled"),
_ => {}
}
}
}