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: boolWhen 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§
Auto Trait Implementations§
impl Freeze for GaussianFixedCache
impl RefUnwindSafe for GaussianFixedCache
impl Send for GaussianFixedCache
impl Sync for GaussianFixedCache
impl Unpin for GaussianFixedCache
impl UnsafeUnpin for GaussianFixedCache
impl UnwindSafe for GaussianFixedCache
Blanket Implementations§
impl<T> Allocation for T
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> DistributionExt for Twhere
T: ?Sized,
impl<T> DistributionExt for Twhere
T: ?Sized,
impl<T, U> Imply<T> for U
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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 moreSource§impl<T> Pointable for T
impl<T> Pointable for T
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.