esopt 0.2.0

General Evolution-Strategy-Optimizer implementation according to https://arxiv.org/abs/1703.03864 in Rust.
Documentation
//! Simple example.
#![allow(clippy::missing_docs_in_private_items, clippy::print_stdout)]

use esopt::*;

fn main() {
	//create required evaluator
	let eval = ExampleEval { target: 25.0 };

	//create Evolution-Strategy-Optimizer
	let mut es = ES::new_with_sgd(eval, 0.75, 0.0, 0.0); //using evaluator, lr, beta(momentum), lambda(weight decay)
	es.set_params(vec![0.0]) //initial parameters (important to specify the problem dimension, default is vec![0.0])
		.set_std(50.0) //parameter noise standard deviation to approximate the gradient
		.set_samples(10); //number of mirrored samples to use to approximate the gradient

	//track the optimizer's results
	for _ in 0..5 {
		let res = es.optimize(2); //optimize for n steps
		println!("(Score, Gradnorm): {:?}", res);
		println!("Params: {:?}", es.get_params());
	}
}

//carrier object for evaluator, which can include training data or target
// information
#[derive(Clone)]
struct ExampleEval {
	target: Float,
}

//implement Evaluator trait to allow usage in the optimizer
impl Evaluator for ExampleEval {
	//compute the negative absolute error (maximize to get close to target)
	fn eval_test(&self, params: &[Float]) -> Float {
		let error = self.target - params[0];
		-error.abs()
	}

	fn eval_train(&self, params: &[Float], _: usize) -> Float {
		self.eval_test(params)
	}
}