Skip to main content

GaussianFixedCache

Struct GaussianFixedCache 

Source
pub struct GaussianFixedCache {
    pub xtwx_orig: Array2<f64>,
    pub xtwy_orig: Array1<f64>,
    pub centered_weighted_y_sq: f64,
    pub row_prediction_is_stale: bool,
    pub xtwx_sparse_orig: Option<Arc<SparseXtwxPrecomputed>>,
}
Expand description

Reusable XᵀWX and XᵀW(y − offset) for Gaussian + Identity REML fits.

The Gaussian-identity P-IRLS short-circuit solves a single linear system (XᵀWX + Σ λ_k S_k + ρ·I) β = XᵀW(y − offset). The right-hand-side matrix and vector are independent of the smoothing parameters λ, so when the outer REML loop evaluates the same problem at many (λ_1, …, λ_k) candidates we only need to assemble them once before the loop and reuse them inside every inner PIRLS call.

Stored in original coordinates (no Qs rotation applied). When the inner solver uses a WorkingReparamTransform, it conjugates / projects these matrices on the fly — that step is O(p³) / O(p²), independent of N.

Fields§

§xtwx_orig: Array2<f64>

XᵀWX in the original coefficient basis. Symmetric, p × p.

§xtwy_orig: Array1<f64>

XᵀW(y − offset) in the original basis. Length p.

§centered_weighted_y_sq: f64

(y − offset)ᵀW(y − offset).

Together with xtwx_orig and xtwy_orig, this is the last scalar sufficient statistic needed to evaluate the Gaussian penalized RSS exactly at any λ without re-streaming the rows.

§row_prediction_is_stale: bool

When true, the caller is deliberately serving a design-moving trial from sufficient statistics and the DesignMatrix rows on the current REML surface may be a stale reference surface. Consumers must not apply those rows for fitted values, RSS, or likelihood summaries.

§xtwx_sparse_orig: Option<Arc<SparseXtwxPrecomputed>>

XᵀWX precomputed for the sparse path, aligned with the symbolic pattern of SparseXtWxCache::new(x) on the original sparse design. None when the design has no sparse form (e.g. dense-only fits).

The sparse REML path rebuilds H = XᵀWX + Sλ + δI per outer evaluation. For Gaussian-Identity the weights never change, so the XᵀWX contribution is invariant across the outer loop and can be scattered from this cached values vector instead of re-doing the O(nnz²/n) SpGEMM each call.

Trait Implementations§

Source§

impl Debug for GaussianFixedCache

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Allocation for T
where T: RefUnwindSafe + Send + Sync,

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> ByRef<T> for T

Source§

fn by_ref(&self) -> &T

Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> DistributionExt for T
where T: ?Sized,

Source§

fn rand<T>(&self, rng: &mut (impl Rng + ?Sized)) -> T
where Self: Distribution<T>,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Imply<T> for U
where T: ?Sized, U: ?Sized,

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

Source§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
Source§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
Source§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
Source§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V