Store tracker info from solution thread, sort by lowest type count first

This commit is contained in:
2026-02-02 00:00:57 +02:00
parent 318b7f6450
commit 2e5568fccb

View File

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