swarmkit/
particle_init.rs1use crate::{Group, Particle, Unit};
8use rand::Rng;
9
10pub trait ParticleInitDependent {
12 type TIn: Unit;
14 type TOut: Unit;
16
17 fn init_pos<R: Rng>(&self, rng: &mut R, p: Self::TIn) -> Vec<Self::TOut>;
19 fn init_vel<R: Rng>(&self, rng: &mut R, p: Self::TIn) -> Vec<Self::TOut>;
21
22 fn init_dep<R: Rng>(&self, rng: &mut R, p: Self::TIn) -> Group<Self::TOut> {
25 let positions = self.init_pos(rng, p);
26 let velocities = self.init_vel(rng, p);
27 debug_assert_eq!(
28 positions.len(),
29 velocities.len(),
30 "init_pos and init_vel must produce equal-length vectors",
31 );
32 let mut group = Group::<Self::TOut>::with_capacity(positions.len());
33 for (pos, vel) in positions.into_iter().zip(velocities) {
34 group.push(Particle {
35 pos,
36 vel,
37 fit: f64::MIN,
38 best_pos: pos,
39 best_fit: f64::MIN,
40 });
41 }
42 group
43 }
44}
45
46pub trait ParticleInit {
48 type T: Unit;
50
51 fn init_pos<R: Rng>(&self, rng: &mut R) -> Vec<Self::T>;
53 fn init_vel<R: Rng>(&self, rng: &mut R) -> Vec<Self::T>;
55
56 fn init<R: Rng>(&self, rng: &mut R) -> Group<Self::T> {
59 let positions = self.init_pos(rng);
60 let velocities = self.init_vel(rng);
61 debug_assert_eq!(
62 positions.len(),
63 velocities.len(),
64 "init_pos and init_vel must produce equal-length vectors",
65 );
66 let mut group = Group::<Self::T>::with_capacity(positions.len());
67 for (pos, vel) in positions.into_iter().zip(velocities) {
68 group.push(Particle {
69 pos,
70 vel,
71 fit: f64::MIN,
72 best_pos: pos,
73 best_fit: f64::MIN,
74 });
75 }
76 group
77 }
78}