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
use super::Kernel;
use rayon::prelude::*;
use std::fmt::Debug;

#[derive(Clone, Debug, Default)]
pub struct Linear;

impl Kernel<Vec<f64>> for Linear {
    fn get_params(&self) -> &[f64] {
        &[]
    }

    fn set_params(&mut self, _: &[f64]) -> Result<(), String> {
        Ok(())
    }

    fn value(&self, x: &Vec<f64>, x_prime: &Vec<f64>) -> Result<f64, String> {
        Ok(x.par_iter()
            .zip(x_prime.par_iter())
            .map(|(x_i, x_prime_i)| x_i * x_prime_i)
            .sum())
    }

    fn grad(
        &self,
        _: &Vec<f64>,
        _: &Vec<f64>,
    ) -> Result<Box<dyn Fn(&[f64]) -> Result<Vec<f64>, String>>, String> {
        Ok(Box::new(|_| Ok(vec![])))
    }
}