use rusty_machine::linalg::{Matrix, Vector};
use rusty_machine::learning::gp::{GaussianProcess, ConstMean};
use rusty_machine::learning::toolkit::kernel::SquaredExp;
use rusty_machine::learning::SupModel;

fn main() {
    // 首先获取一些数据。

    // 一些示例训练数据。
    let inputs = Matrix::new(3,3,vec![1.,1.,1.,2.,2.,2.,3.,3.,3.]);
    let targets = Vector::new(vec![0.,1.,0.]);

    // 一些示例测试数据。
    let test_inputs = Matrix::new(2,3, vec![1.5,1.5,1.5,2.5,2.5,2.5]);

    // 现在设置好我们的模组
    // 这几乎是rusty-machine 中最复杂的模组了！

    // 设置平方指数核函数，长度参数 2，宽度参数 1。
    let ker = SquaredExp::new(2., 1.);

    // 零函数
    let zero_mean = ConstMean::default();

    // 用核函数，平均值, 噪声0.5来构建一个高斯过程。
    let mut gp = GaussianProcess::new(ker, zero_mean, 0.5);

    // 现在我们可以训练并且用这个模组进行预测了。

    // 训练模组！
    gp.train(&inputs, &targets).unwrap();

    // 使用测试数据来测试预测。
    let outputs = gp.predict(&test_inputs).unwrap();

    println!("{:?}", outputs);
}