diff --git a/src-tauri/src/scheduler.rs b/src-tauri/src/scheduler.rs index b07f3de..12d0afe 100644 --- a/src-tauri/src/scheduler.rs +++ b/src-tauri/src/scheduler.rs @@ -60,7 +60,7 @@ impl Scheduler { let resident_ids = self.valid_residents(slot, schedule); let solved_in_thread = AtomicBool::new(false); - let solved_schedule = resident_ids.par_iter().find_map_any(|&id| { + let sovled_state = resident_ids.par_iter().find_map_any(|&id| { let mut local_schedule = schedule.clone(); let mut local_tracker = tracker.clone(); @@ -73,8 +73,9 @@ impl Scheduler { slot.next(), &solved_in_thread, ); + match solved { - Ok(true) => Some(local_schedule), + Ok(true) => Some((local_schedule, local_tracker)), Ok(false) => None, Err(e) => { warn!("Search error: {}", e); @@ -83,10 +84,9 @@ impl Scheduler { } }); - // TODO: can return the schedule instead of a bool - - if let Some(solved_schedule) = solved_schedule { + if let Some((solved_schedule, solved_tracker)) = sovled_state { *schedule = solved_schedule; + *tracker = solved_tracker; return Ok(true); } @@ -108,7 +108,7 @@ impl Scheduler { } if self.timer.limit_exceeded() { - anyhow::bail!("Time exceeded. Restrictions too tight"); + bail!("Time exceeded. Restrictions too tight"); } if !slot.is_first() @@ -132,9 +132,10 @@ impl Scheduler { // sort candidates by current workload, add rng for tie breakers let mut valid_resident_ids = self.valid_residents(slot, schedule); valid_resident_ids.sort_unstable_by_key(|res_id| { - let workload = tracker.current_workload(res_id); - let tie_breaker: f64 = rand::rng().random(); - (workload, (tie_breaker * 1000.0) as usize) + let type_count = tracker.get_type_count(res_id, slot.shift_type()); + let workload = tracker.current_workload(res_id); + let tie_breaker: f64 = rand::rng().random(); + (type_count, workload, (tie_breaker * 1000.0) as usize) }); for id in valid_resident_ids { @@ -243,7 +244,5 @@ mod tests { let limit = *scheduler.bounds.max_workloads.get(&r.id).unwrap(); assert!(workload <= limit); } - - println!("{}", schedule.pretty_print(&scheduler.config)); } }