Store tracker info from solution thread, sort by lowest type count first
This commit is contained in:
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user