use num::{NumCast, Zero};
use crate::tools::RandomVectorCreator;
use crate::particleswarm::{CoordinatesInitializer, VelocityInitializer};
pub struct RandomCoordinatesInitializer<T> {
intervals: Vec<(T, T)>,
particles_count: usize,
vector_creator: RandomVectorCreator,
}
impl<T> RandomCoordinatesInitializer<T> {
pub fn new(intervals: Vec<(T, T)>, particles_count: usize) -> Self {
Self {
intervals,
particles_count,
vector_creator: RandomVectorCreator::new(),
}
}
}
impl<T: NumCast + PartialOrd> CoordinatesInitializer<T> for RandomCoordinatesInitializer<T> {
fn get_coordinates(&mut self) -> Vec<Vec<T>> {
(0..self.particles_count)
.map(|_| self.vector_creator.create_vec(&self.intervals))
.collect()
}
}
pub struct RandomVelocityInitializer<T> {
intervals: Vec<(T, T)>,
particles_count: usize,
vector_creator: RandomVectorCreator,
}
impl<T> RandomVelocityInitializer<T> {
pub fn new(intervals: Vec<(T, T)>, particles_count: usize) -> Self {
Self {
intervals,
particles_count,
vector_creator: RandomVectorCreator::new(),
}
}
}
impl<T: NumCast + PartialOrd> VelocityInitializer<T> for RandomVelocityInitializer<T> {
fn get_velocity(&mut self) -> Vec<Vec<T>> {
(0..self.particles_count)
.map(|_| self.vector_creator.create_vec(&self.intervals))
.collect()
}
}
pub struct ZeroVelocityInitializer {
dimension: usize,
particles_count: usize,
}
impl ZeroVelocityInitializer {
pub fn new(dimension: usize, particles_count: usize) -> Self {
Self { dimension, particles_count }
}
}
impl<T: NumCast + PartialOrd + Zero + Clone> VelocityInitializer<T> for ZeroVelocityInitializer {
fn get_velocity(&mut self) -> Vec<Vec<T>> {
(0..self.particles_count)
.map(|_| vec![T::zero(); self.dimension])
.collect()
}
}