sgrust 0.8.6

A sparse grid library written in Rust.
Documentation
 use std::ops::{Deref, Index};

use serde::{Deserialize, Serialize};

use super::base::Basis;
#[derive(Clone, Serialize, Deserialize, Default)]
#[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize))]
pub struct NodesForLevel(Vec<f64>);

impl Index<u32> for NodesForLevel
{
    type Output=f64;

    fn index(&self, index: u32) -> &Self::Output {
        &self.0[index as usize]
    }
}
impl Deref for NodesForLevel
{
    type Target=Vec<f64>;

    fn deref(&self) -> &Self::Target {
        &self.0
    }
}

#[derive(Clone, Serialize, Deserialize, Default)]
#[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize))]
pub struct WeightsForLevel(Vec<f64>);

impl Index<u32> for WeightsForLevel
{
    type Output=f64;

    fn index(&self, index: u32) -> &Self::Output {
        &self.0[index as usize]
    }
}

impl Deref for WeightsForLevel
{
    type Target=Vec<f64>;

    fn deref(&self) -> &Self::Target {
        &self.0
    }
}

#[derive(Clone, Serialize, Deserialize, Default)]
#[cfg_attr(feature = "rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize))]
pub struct CustomNested
{
    nodes: Vec<NodesForLevel>,
    weights: Vec<WeightsForLevel>,
    quadrature_exactness: Vec<u32>,
    interpolation_exactness: Vec<u32>,
}

impl Basis for CustomNested
{
    fn eval(&self, level: u32, index: u32, x: f64) -> f64 {
        let xl = self.nodes[level as usize][index  - 1];        
        let xr = self.nodes[level as usize][index  + 1];
        let xm = self.nodes[level as usize][index];
        if x < xm
        {
            f64::max(0.0, 1.0-(xm-x)/(xm-xl))
        }
        else
        {
            f64::max(0.0, (xr-x)/(xr-xm))
        }
    }
    fn get_point(&self, level: u32, index: u32) -> f64
    {
        self.nodes[level as usize][index]
    }

    fn eval_deriv(&self, _level: u32, _index: u32, _x: f64) -> f64 {
        panic!("Derivative not implemented for CurtisClenshaw Basis.")
    }

    fn degree(&self) -> usize {
        1
    }

    fn integral(&self, level: u32, index: u32) -> f64 {
        self.weights[level as usize][index]
    }

    fn basis_type(&self) -> super::base::BasisFunction {
        super::base::BasisFunction::CustomBasis
    }

    fn num_nodes(&self, level: u32) -> usize
    {
        self.nodes[level as usize].len()
    }
    
    fn node(&self, level: u32, index: u32) -> f64 {
        self.nodes[level as usize][index]
    }
    
    fn weights(&self, level: u32) -> Vec<f64> {
        self.weights[level as usize].0.clone()
    }
    
    fn nodes(&self, level: u32) -> Vec<f64> {
        self.nodes[level as usize].0.clone()
    }
    
    fn quadrature_exactness(&self, level: u32) -> u32
    {
        self.quadrature_exactness[level as usize]
    }

    fn interpolation_exactness(&self, level: u32) -> u32
    {
        self.interpolation_exactness[level as usize]
    }

}