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 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 type_count = tracker.get_type_count(res_id, slot.shift_type());
|
||||||
let workload = tracker.current_workload(res_id);
|
let workload = tracker.current_workload(res_id);
|
||||||
let tie_breaker: f64 = rand::rng().random();
|
let tie_breaker: f64 = rand::rng().random();
|
||||||
(workload, (tie_breaker * 1000.0) as usize)
|
(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));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user