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 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));
}
}