csrk 1.1.4

Sparse Gaussian Process regression with compactly supported radial kernels
Documentation
#[test]
fn save_load_gp_predict_consistency() {
    use csrk::GP;
    use ndarray::{arr1,Array2};

    let dir = std::env::current_dir().unwrap();
    let path = dir.as_path().join("test_gp.h5");
    let fname = path.to_str().unwrap();

    // training data
    let x_train = Array2::from_shape_vec((3,1),
        vec![0.,0.5,1.]).unwrap();
    let y_train = arr1(&[0.0, 1.0, 0.0]);
    let y_err = arr1(&[0.0, 0.0, 0.0]);
    let whitenoise = 1e-8;
    let scale = arr1(&[1.0]);
    let order = 2;

    // build and train
    let gp = GP::train(
        x_train.view(),
        y_train.view(),
        y_err.view(),
        scale.view(),
        whitenoise,
        order,
    );

    // predictions before save
    let eval_points = Array2::from_shape_vec((3,1),
        vec![0.25,0.75,2.0]).unwrap();
    let pred_mean_before = gp.predict_mean(eval_points.view());
    let pred_var_before = gp.predict_var(eval_points.view());

    // save
    gp.save_to_hdf5(fname, "model").unwrap();

    // load
    let mut loaded_gp = GP::load_from_hdf5(fname, "model").unwrap();
    loaded_gp.generate_ldl();

    // predictions after load
    let pred_mean_after = loaded_gp.predict_mean(eval_points.view());
    let pred_var_after = loaded_gp.predict_var(eval_points.view());

    // means should match
    for i in 0..eval_points.nrows() {
        assert!(
            (pred_mean_before[i] - pred_mean_after[i]).abs() < 1e-12,
            "mean mismatch at index {}: {} vs {}",
            i, pred_mean_before[i], pred_mean_after[i]
        );
        assert!(
            (pred_var_before[i] - pred_var_after[i]).abs() < 1e-12,
            "variance mismatch at index {}: {} vs {}",
            i, pred_var_before[i], pred_var_after[i]
        );
    }
    // rm the file
    let _ = std::fs::remove_file(fname);
}