1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//! # Friedrich : Gaussian Process Regression
//!
//! This library implements [Gaussian Process Regression](https://en.wikipedia.org/wiki/Gaussian_process) in Rust.
//! Our goal is to provide a building block for other algorithms (such as [Bayesian Optimization](https://en.wikipedia.org/wiki/Bayesian_optimization)).
//!
//! Gaussian process have both the ability to extract a lot of information from their training data and to return a prediction and an uncertainty on their prediction.
//! Furthermore, they can handle non-linear phenomenons, take uncertainty on the inputs into account and encode a prior on the output.
//!
//! All of those properties make them an algorithm of choice to perform regression when data is scarce or when having uncertainty bars on the output is a desirable property.
//!
//! However, the `o(n^3)` complexity of the algorithm makes the classical implementation unsuitable for large training datasets.
//!
//! ## Functionalities
//!
//! This implementation lets you:
//!
//! - Define a gaussian process with default parameters or using the builder pattern.
//! - Train it on multidimensional data.
//! - Fit the parameters (kernel, prior and noise) on the training data.
//! - Add additional samples efficiently (`O(n^2)`) and refit the process.
//! - Predict the mean, variance and covariance matrix for given inputs.
//! - Sample the distribution at a given position.
//! - Save and load a trained model with [serde](https://serde.rs/).
//!
//! ## Inputs
//!
//! Most methods of this library can currently work with the following `input -> output` pairs :
//!
//! Input | Output | Description
//! ---|---|---
//! [`Vec<f64>`] | [`f64`] | A single, multidimensional, sample.
//! [`Vec<Vec<f64>>`] | [`Vec<f64>`] | Each inner vector is a training sample.
//! [`DMatrix<f64>`](https://docs.rs/nalgebra/0.29/nalgebra/base/type.DMatrix.html) | [`DVector<f64>`](https://docs.rs/nalgebra/0.29/nalgebra/base/type.DVector.html) | Using a [nalgebra](https://www.nalgebra.org/) matrix with one row per sample.
//! [`Array1<f64>`](https://docs.rs/ndarray/0.15/ndarray/type.Array1.html) | [`f64`] | A single sample stored in a [ndarray](https://crates.io/crates/ndarray) array (using the `friedrich_ndarray` feature).
//! [`Array2<f64>`](https://docs.rs/ndarray/0.15/ndarray/type.Array2.html) | [`Array1<f64>`](https://docs.rs/ndarray/0.15/ndarray/type.Array1.html) | Each row is a sample (using the `friedrich_ndarray` feature).
//!
//! See the [`Input`] trait if you want to add you own input type.
//!
mod algebra;
mod conversion;
pub mod gaussian_process;
mod parameters;
pub use algebra::{SMatrix, SRowVector, SVector};
pub use conversion::Input;
pub use parameters::*;