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
use crate::Kernel; use std::ops::Add; impl<T> Add<Kernel<T>> for Kernel<T> where T: 'static + ?Sized, { type Output = Self; fn add(self, rhs: Kernel<T>) -> Self::Output { let self_params_len = self.params.len(); let params = [&self.params as &[f64], &rhs.params as &[f64]].concat(); let self_func = self.func; let rhs_func = rhs.func; Self { params, func: Box::new(move |x: &T, x_prime: &T, with_grad: bool, params: &[f64]| { let (fx, dfx) = self_func(x, x_prime, with_grad, ¶ms[..self_params_len])?; let (gx, dgx) = rhs_func(x, x_prime, with_grad, ¶ms[self_params_len..])?; let func = fx + gx; let grad = if !with_grad { None } else { let grad = [dfx.unwrap(), dgx.unwrap()].concat(); Some(grad) }; Ok((func, grad)) }), } } }