ecrs 0.1.0-beta.4

Evolutionary computation tools & algorithms
Documentation
use super::ProbingPolicy;
use std::time::Instant;

pub struct GenerationInterval {
    last_log_generation: usize,
    log_interval: usize,
}

impl GenerationInterval {
    pub fn new(log_interval: usize) -> GenerationInterval {
        GenerationInterval {
            last_log_generation: 0,
            log_interval,
        }
    }
}

impl ProbingPolicy for GenerationInterval {
    fn on_begin(&mut self) -> bool {
        true
    }

    fn on_end(&mut self, generation: usize) -> bool {
        generation > self.last_log_generation
    }

    fn on_new_generation(&mut self, generation: usize) -> bool {
        if generation % self.log_interval == 0 {
            self.last_log_generation = generation;
            true
        } else {
            false
        }
    }
}

pub struct ElapsedTime {
    last_log_time: Instant,
    log_interval: usize,
    last_log_generation: usize,
}

impl ElapsedTime {
    pub fn new(log_interval: usize) -> ElapsedTime {
        ElapsedTime {
            last_log_time: Instant::now(),
            log_interval,
            last_log_generation: 0,
        }
    }
}

impl ProbingPolicy for ElapsedTime {
    fn on_begin(&mut self) -> bool {
        self.last_log_time = Instant::now();
        true
    }

    fn on_end(&mut self, generation: usize) -> bool {
        generation > self.last_log_generation
    }

    fn on_new_generation(&mut self, generation: usize) -> bool {
        if self.last_log_time.elapsed().as_secs() >= self.log_interval as u64 {
            self.last_log_time = Instant::now();
            self.last_log_generation = generation;
            true
        } else {
            false
        }
    }
}