use crate::{
core::Point,
traits::{CostFunction, Observer},
DVector, Float,
};
use parking_lot::Mutex;
use serde::{Deserialize, Serialize};
use std::sync::Arc;
pub mod pso;
pub use pso::{PSOConfig, PSO};
pub mod swarm;
pub use swarm::{
Swarm, SwarmBoundaryMethod, SwarmParticle, SwarmPositionInitializer, SwarmTopology,
SwarmUpdateMethod, SwarmVelocityInitializer,
};
pub mod swarm_status;
pub use swarm_status::SwarmStatus;
#[derive(Clone, Serialize, Deserialize)]
pub struct TrackingSwarmObserver {
pub history: Vec<Vec<SwarmParticle>>,
pub best_history: Vec<Point<DVector<Float>>>,
}
impl TrackingSwarmObserver {
pub fn new() -> Arc<Mutex<Self>> {
Arc::new(Mutex::new(Self {
history: Vec::new(),
best_history: Vec::new(),
}))
}
}
impl<P, U, E> Observer<PSO, P, SwarmStatus, U, E, PSOConfig> for TrackingSwarmObserver
where
P: CostFunction<U, E>,
{
fn observe(
&mut self,
_current_step: usize,
_algorithm: &PSO,
_problem: &P,
status: &SwarmStatus,
_args: &U,
_config: &PSOConfig,
) {
self.history.push(status.swarm.particles.clone());
self.best_history.push(status.gbest.clone());
}
}