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
use crate::opensrdk_linear_algebra::*;
use opensrdk_kernel_method::*;
use rayon::prelude::*;

pub fn kernel_matrix<T>(
    kernel: &impl PositiveDefiniteKernel<T>,
    params: &[f64],
    x: &[T],
    x_prime: &[T],
) -> Result<Matrix, KernelError>
where
    T: Value,
{
    let m = x.len();
    let n = x_prime.len();

    let elems = (0..n)
        .into_par_iter()
        .flat_map(|j| {
            (0..m)
                .into_par_iter()
                .map(move |i| Ok(kernel.value(params, &x[i], &x_prime[j])?))
        })
        .collect::<Result<Vec<_>, KernelError>>()?;

    let k = Matrix::from(m, elems);

    Ok(k.unwrap())
}