~ruther/ctu-fee-eoa

357cb2eab405c5a05255575b18ea1b5c5f0972e6 — Rutherther 2 days ago 5536e19
feat: add AndTerminatingConditions that ands multiple conditions
1 files changed, 26 insertions(+), 0 deletions(-)

M env/src/main.rs
M env/src/main.rs => env/src/main.rs +26 -0
@@ 312,6 312,32 @@ impl NoBetterForCyclesTerminatingCondition {
    }
}

struct AndTerminatingConditions<'a, T: Clone> {
    terminating_conditions: Vec<&'a mut dyn TerminatingCondition<T>>
}

impl<'a, T: Clone> AndTerminatingConditions<'a, T> {
    pub fn new(terminating_conditions: Vec<&'a mut dyn TerminatingCondition<T>>) -> Self {
        Self {
            terminating_conditions
        }
    }
}

impl<'a, T: Clone> TerminatingCondition<T> for AndTerminatingConditions<'a, T> {
    fn should_terminate(
        self: &mut Self,
        candidate: &LocalSearchCandidate<T>,
        stats: &Vec<LocalSearchCandidate<T>>,
        cycle: usize
    ) -> bool {
        return self.terminating_conditions.iter_mut()
            .all(
                |cond| cond.should_terminate(candidate, stats, cycle)
            )
    }
}

impl<T: Clone> TerminatingCondition<T> for NoBetterForCyclesTerminatingCondition {
    fn should_terminate (
        self: &mut Self,