use super::*;
use crate::construction::enablers::*;
use crate::models::Extras;
custom_extra_property!(ReservedTimes typeof ReservedTimesIndex);
#[derive(Default)]
pub struct RescheduleReservedTime {}
impl HeuristicSolutionProcessing for RescheduleReservedTime {
type Solution = InsertionContext;
fn post_process(&self, mut solution: Self::Solution) -> Self::Solution {
if let Some((reserved_times_idx, reserved_times_fn)) = get_reserved_times_index_and_fn(&solution) {
solution
.solution
.routes
.iter_mut()
.filter(|route_ctx| reserved_times_idx.contains_key(&route_ctx.route().actor))
.for_each(|route_ctx| {
optimize_reserved_times_schedule(route_ctx.route_mut(), &reserved_times_fn);
route_ctx.mark_stale(false);
});
solution
} else {
solution
}
}
}
fn get_reserved_times_index_and_fn(insertion_ctx: &InsertionContext) -> Option<(ReservedTimesIndex, ReservedTimesFn)> {
insertion_ctx.problem.extras.get_reserved_times().and_then(|reserved_times_idx| {
let reserved_times_idx = reserved_times_idx.as_ref().clone();
create_reserved_times_fn(reserved_times_idx.clone())
.ok()
.map(|reserved_times_fn| (reserved_times_idx, reserved_times_fn))
})
}