pub struct RandomEffectOperator {
pub group_ids: Vec<Option<usize>>,
pub n: usize,
pub num_groups: usize,
}Expand description
Implicit design operator for random-intercept effects.
Instead of materializing an n × q one-hot matrix, stores only the O(n) integer group-label vector. All matvecs, Gram assembly, and weighted-normal products operate in O(n) time and O(n + q) memory.
Fields§
§group_ids: Vec<Option<usize>>For each observation, the column index of its group (0..num_groups),
or None if the observation’s level was not in the kept set (prediction
with unseen levels).
n: usizeNumber of observations.
num_groups: usizeNumber of groups (columns).
Implementations§
Source§impl RandomEffectOperator
impl RandomEffectOperator
pub fn new(group_ids: Vec<Option<usize>>, num_groups: usize) -> Self
Sourcepub fn weighted_cross_with_dense(
&self,
dense: &Array2<f64>,
weights: &Array1<f64>,
) -> Result<Array2<f64>, String>
pub fn weighted_cross_with_dense( &self, dense: &Array2<f64>, weights: &Array1<f64>, ) -> Result<Array2<f64>, String>
For a dense block X_dense (n × p_dense) and weights w, compute X_dense’ diag(w) X_re → (p_dense × num_groups) matrix.
Column g of the result = Σ_{i: group[i]=g} w[i] * X_dense.row(i). Total cost: O(n × p_dense).
Sourcepub fn weighted_cross_with_re(
&self,
other: &RandomEffectOperator,
weights: &Array1<f64>,
) -> Result<Array2<f64>, String>
pub fn weighted_cross_with_re( &self, other: &RandomEffectOperator, weights: &Array1<f64>, ) -> Result<Array2<f64>, String>
For two RE operators, compute X_re_a’ diag(w) X_re_b → (qa × qb). Entry (a, b) = Σ_{i: group_a[i]=a AND group_b[i]=b} w[i]. Cost: O(n).
Trait Implementations§
Source§impl Clone for RandomEffectOperator
impl Clone for RandomEffectOperator
Source§fn clone(&self) -> RandomEffectOperator
fn clone(&self) -> RandomEffectOperator
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl DenseDesignOperator for RandomEffectOperator
impl DenseDesignOperator for RandomEffectOperator
Source§fn quadratic_form_diag(
&self,
middle: &Array2<f64>,
) -> Result<Array1<f64>, String>
fn quadratic_form_diag( &self, middle: &Array2<f64>, ) -> Result<Array1<f64>, String>
diag(X M X’) for one-hot X: out[i] = M[group[i], group[i]].
Source§fn to_dense(&self) -> Array2<f64>
fn to_dense(&self) -> Array2<f64>
Materialize the full n × q one-hot matrix (fallback for diagnostics).
fn compute_xtwy( &self, weights: &Array1<f64>, y: &Array1<f64>, ) -> Result<Array1<f64>, String>
Source§fn row_chunk_into(
&self,
rows: Range<usize>,
out: ArrayViewMut2<'_, f64>,
) -> Result<(), MatrixMaterializationError>
fn row_chunk_into( &self, rows: Range<usize>, out: ArrayViewMut2<'_, f64>, ) -> Result<(), MatrixMaterializationError>
Source§fn try_row_chunk(
&self,
rows: Range<usize>,
) -> Result<Array2<f64>, MatrixMaterializationError>
fn try_row_chunk( &self, rows: Range<usize>, ) -> Result<Array2<f64>, MatrixMaterializationError>
row_chunk_into.Source§fn as_dense_ref(&self) -> Option<&Array2<f64>>
fn as_dense_ref(&self) -> Option<&Array2<f64>>
Source§fn materialization_policy(&self) -> Option<MaterializationPolicy>
fn materialization_policy(&self) -> Option<MaterializationPolicy>
Source§fn apply_columns(&self, cols: &[usize]) -> Array2<f64>
fn apply_columns(&self, cols: &[usize]) -> Array2<f64>
nrows × cols.len() dense block
whose k-th column is apply(e_{cols[k]}). Read morefn estimated_dense_bytes(&self) -> usize
fn try_to_dense_with_policy( &self, policy: &MaterializationPolicy, context: &'static str, ) -> Result<Arc<Array2<f64>>, MatrixMaterializationError>
Source§fn try_to_dense_governed_with_policy(
&self,
policy: &MaterializationPolicy,
context: &'static str,
) -> Result<Governed<Array2<f64>>, MatrixMaterializationError>
fn try_to_dense_governed_with_policy( &self, policy: &MaterializationPolicy, context: &'static str, ) -> Result<Governed<Array2<f64>>, MatrixMaterializationError>
Source§impl LinearOperator for RandomEffectOperator
impl LinearOperator for RandomEffectOperator
Source§fn apply(&self, vector: &Array1<f64>) -> Array1<f64>
fn apply(&self, vector: &Array1<f64>) -> Array1<f64>
Forward: out[i] = β[group[i]], or 0 if unmatched.
Source§fn apply_transpose(&self, vector: &Array1<f64>) -> Array1<f64>
fn apply_transpose(&self, vector: &Array1<f64>) -> Array1<f64>
Transpose: out[g] = Σ_{i: group[i]=g} v[i].
Source§fn diag_xtw_x(&self, weights: &Array1<f64>) -> Result<Array2<f64>, String>
fn diag_xtw_x(&self, weights: &Array1<f64>) -> Result<Array2<f64>, String>
X’WX for a one-hot design is diagonal: D[g,g] = Σ_{i: group[i]=g} w[i].
Source§fn diag_gram(&self, weights: &Array1<f64>) -> Result<Array1<f64>, String>
fn diag_gram(&self, weights: &Array1<f64>) -> Result<Array1<f64>, String>
Diagonal of X’WX: per-group weight sums.
Source§fn apply_weighted_normal(
&self,
weights: FiniteSignedWeightsView<'_>,
vector: &Array1<f64>,
penalty: Option<&Array2<f64>>,
ridge: f64,
) -> Array1<f64>
fn apply_weighted_normal( &self, weights: FiniteSignedWeightsView<'_>, vector: &Array1<f64>, penalty: Option<&Array2<f64>>, ridge: f64, ) -> Array1<f64>
Fused X’WXβ + Sβ + ridge·β. O(n + q).
fn nrows(&self) -> usize
fn ncols(&self) -> usize
fn uses_matrix_free_pcg(&self) -> bool
Source§fn xt_diag_x_signed_op(
&self,
weights: FiniteSignedWeightsView<'_>,
) -> Result<Array2<f64>, String>
fn xt_diag_x_signed_op( &self, weights: FiniteSignedWeightsView<'_>, ) -> Result<Array2<f64>, String>
XᵀWX with sign-honest
weights. Returns a dense Array2<f64> because the result is symmetric
but not guaranteed PSD (so consumers cannot assume the SymmetricMatrix
PSD contract). Default impl delegates to diag_xtw_x for legacy
operators; overriding impls may take a sign-aware fast path.Source§fn xt_diag_x_psd_op(
&self,
weights: PsdWeightsView<'_>,
) -> Result<SymmetricMatrix, String>
fn xt_diag_x_psd_op( &self, weights: PsdWeightsView<'_>, ) -> Result<SymmetricMatrix, String>
XᵀWX with w ≥ 0 discharged at the
PsdWeightsView constructor. Returns a typed SymmetricMatrix so
downstream consumers can route through PSD-only solvers (Cholesky).
Default impl wraps the signed path’s Array2 in SymmetricMatrix::Dense.fn solve_system_matrix_free_pcg_try( &self, weights: &Array1<f64>, rhs: &Array1<f64>, penalty: Option<&Array2<f64>>, baseridge: f64, ) -> Result<Array1<f64>, String>
fn solve_system_matrix_free_pcg_with_info_try( &self, weights: &Array1<f64>, rhs: &Array1<f64>, penalty: Option<&Array2<f64>>, baseridge: f64, ) -> Result<(Array1<f64>, PcgSolveInfo), String>
fn factorize_system( &self, weights: &Array1<f64>, penalty: Option<&Array2<f64>>, ) -> Result<Box<dyn FactorizedSystem>, String>
fn solve_system( &self, weights: &Array1<f64>, rhs: &Array1<f64>, penalty: Option<&Array2<f64>>, ) -> Result<Array1<f64>, String>
fn solve_systemwith_policy( &self, weights: &Array1<f64>, rhs: &Array1<f64>, penalty: Option<&Array2<f64>>, ridge_floor: f64, ridge_policy: RidgePolicy, ) -> Result<Array1<f64>, String>
Auto Trait Implementations§
impl Freeze for RandomEffectOperator
impl RefUnwindSafe for RandomEffectOperator
impl Send for RandomEffectOperator
impl Sync for RandomEffectOperator
impl Unpin for RandomEffectOperator
impl UnsafeUnpin for RandomEffectOperator
impl UnwindSafe for RandomEffectOperator
Blanket Implementations§
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
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 more