use crate::*;
#[inline]
pub(crate) fn pow2(x: f64) -> f64 {
x * x
}
pub fn diff<R, C, S>(arr: na::Matrix<f64, R, C, S>) -> na::OMatrix<f64, R, na::Dyn>
where
R: na::DimName,
C: na::Dim,
S: na::Storage<f64, R, C>,
na::DefaultAllocator: na::allocator::Allocator<f64, R, C>,
{
let head = arr.columns_range(..arr.ncols() - 1);
let tail = arr.columns_range(1..);
tail - head
}
pub fn cumsum<R, C, S>(arr: na::Matrix<f64, R, C, S>) -> na::OMatrix<f64, R, C>
where
R: na::Dim,
C: na::Dim,
S: na::Storage<f64, R, C>,
na::DefaultAllocator: na::allocator::Allocator<f64, R, C>,
{
let mut arr = arr.into_owned();
arr.column_iter_mut().reduce(|prev, mut next| {
next += prev;
next
});
arr
}
pub fn valid_curve<C, const D: usize>(curve: C) -> Option<C>
where
C: Curve<D>,
{
let c = curve.as_curve();
(c.len() > 2 && c.iter().flatten().all(|x| x.is_finite())).then_some(curve)
}