use argmin::prelude::*;
use argmin::solver::particleswarm::*;
use argmin_testfunctions::himmelblau;
struct Himmelblau {}
impl ArgminOp for Himmelblau {
type Param = Vec<f64>;
type Output = f64;
type Hessian = ();
type Jacobian = ();
type Float = f64;
fn apply(&self, param: &Self::Param) -> Result<Self::Output, Error> {
Ok(himmelblau(param))
}
}
fn run() -> Result<(), Error> {
let init_param: Vec<f64> = vec![0.1, 0.1];
let cost_function = Himmelblau {};
#[cfg(feature = "visualizer")]
let visualizer = Visualizer3d::new()
.delay(std::time::Duration::from_secs(1))
.surface(Surface::new(Himmelblau {}, (-4.0, -4.0, 4.0, 4.0), 0.1));
{
let solver = ParticleSwarm::new((vec![-4.0, -4.0], vec![4.0, 4.0]), 100, 0.5, 0.0, 0.5)?;
let executor = Executor::new(cost_function, solver, init_param).max_iters(15);
#[cfg(feature = "visualizer")]
let executor = executor.add_observer(visualizer, ObserverMode::Always);
let res = executor.run()?;
std::thread::sleep(std::time::Duration::from_secs(1));
println!("{}", res);
}
Ok(())
}
fn main() {
if let Err(ref e) = run() {
println!("{}", e);
}
}