#![allow(dead_code)]
mod algebra;
mod conversion;
mod gaussian_process;
mod parameters;
use chrono::Duration;
use crate::gaussian_process::GaussianProcess;
fn main()
{
{
let training_inputs = vec![vec![0.8], vec![1.2], vec![3.8], vec![4.2]];
let training_outputs = vec![3.0, 4.0, -2.0, -2.0];
let mut gp = GaussianProcess::default(training_inputs, training_outputs);
let input = vec![1.];
let mean = gp.predict(&input);
let var = gp.predict_variance(&input);
println!("prediction: {} ± {}", mean, var.sqrt());
let likelihood = gp.likelihood();
println!("likelihood of the current model : {}", likelihood);
let additional_inputs = vec![vec![0.], vec![1.], vec![2.], vec![5.]];
let additional_outputs = vec![2.0, 3.0, -1.0, -2.0];
let fit_prior = true;
let fit_kernel = true;
let max_iter = 100;
let convergence_fraction = 0.05;
let max_time = Duration::seconds(3600);
gp.add_samples(&additional_inputs, &additional_outputs);
gp.fit_parameters(fit_prior, fit_kernel, max_iter, convergence_fraction, max_time);
println!("model is now updated.");
let inputs = vec![vec![1.0], vec![2.0], vec![3.0]];
let outputs = gp.predict(&inputs);
println!("predictions: {:?}", outputs);
let new_inputs = vec![vec![1.0], vec![2.0]];
let sampler = gp.sample_at(&new_inputs);
let mut rng = rand::rng();
for i in 1..=5
{
println!("sample {} : {:?}", i, sampler.sample(&mut rng));
}
}
{
let training_inputs = vec![vec![0.8, 0.1], vec![1.2, 0.2], vec![3.8, 0.3], vec![4.2, 0.5]];
let training_outputs = vec![3.0, 4.0, -2.0, -2.0];
let gp = GaussianProcess::default(training_inputs, training_outputs);
let input = vec![1., 0.4];
let mean = gp.predict(&input);
let var = gp.predict_variance(&input);
println!("prediction: {} ± {}", mean, var.sqrt());
}
}