use crate::{
algorithms::particles::{Swarm, SwarmPositionInitializer},
core::Point,
traits::{ProgressStatus, Status, StatusMessage},
DVector, Float,
};
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct SwarmStatus {
pub gbest: Point<DVector<Float>>,
pub initial_gbest: Point<DVector<Float>>,
pub message: StatusMessage,
pub swarm: Swarm,
pub n_f_evals: usize,
}
impl Default for SwarmStatus {
fn default() -> Self {
Self {
gbest: Default::default(),
initial_gbest: Default::default(),
message: Default::default(),
swarm: Swarm::new(SwarmPositionInitializer::Custom(Vec::default())),
n_f_evals: Default::default(),
}
}
}
impl SwarmStatus {
pub fn get_best(&self) -> Point<DVector<Float>> {
self.gbest.clone()
}
}
impl Status for SwarmStatus {
fn reset(&mut self) {
self.gbest = Default::default();
self.initial_gbest = Default::default();
self.message = Default::default();
self.swarm.particles = Default::default();
self.n_f_evals = Default::default();
}
fn message(&self) -> &StatusMessage {
&self.message
}
fn set_message(&mut self) -> &mut StatusMessage {
&mut self.message
}
}
impl ProgressStatus for SwarmStatus {
fn write_progress(&self, out: &mut String) -> std::fmt::Result {
use std::fmt::Write;
write!(
out,
"status={} gbest_fx={} n_f_evals={}",
self.message,
self.gbest.fx.unwrap_or(Float::NAN),
self.n_f_evals
)
}
}