use core::{default::Default, fmt::Debug};
use crate::{initial_solutions::InitialSolutions, opt_problem::*};
use mop_blocks::prelude::Domain;
use mop_common::rand::{distributions::uniform::SampleUniform, thread_rng};
#[derive(Clone, Debug, Default)]
pub struct RandomInitialSolutions {}
impl RandomInitialSolutions {
pub fn new() -> Self {
RandomInitialSolutions {}
}
}
impl<C, D, O, OR> InitialSolutions<OptProblem<C, D, O, OR>> for RandomInitialSolutions
where
D: Domain,
D::Solution: Default,
OR: Copy + Debug + Default + PartialEq + PartialOrd + SampleUniform,
{
fn initial_solutions(&self, op: &mut OptProblem<C, D, O, OR>) {
let (defs, results) = op.parts_mut();
let mut rng = thread_rng();
for _ in 0..defs.results_num() {
let mut c = results.constructor();
c = (0..defs.hard_cstrs().len()).fold(c, |c, _| c.push_hard_cstr(0));
c = (0..defs.objs().len()).fold(c, |c, _| c.push_obj(OR::default()));
c = (0..defs.soft_cstrs().len()).fold(c, |c, _| c.push_soft_cstr(0));
c.commit(OR::default(), defs.domain().new_rnd_solution(&mut rng));
}
}
}