pub struct RowPrecisionPriorPenalty {
pub lambda_per_row: Array3<f64>,
pub weight: f64,
pub n_eff: usize,
pub learnable_weight: bool,
pub rho_index: usize,
pub target: PsiSlice,
pub weight_schedule: Option<ScalarWeightSchedule>,
}Expand description
Fixed zero-mean Gaussian row-precision prior on the latent block.
Evaluates the row-wise precision energy ½ μ Σ_n t_nᵀ Λ_n t_n, with the
ρ-dependent Gaussian precision normalizer when μ is learnable. Callers
pass one positive-definite precision matrix per row. This is not the iVAE
conditional-mean gauge ½ μ ||t - h(u)||²; use LatentIdMode::AuxPrior
for the ridge/linear projection-residual gauge.
Fields§
§lambda_per_row: Array3<f64>§weight: f64Base strength. If learnable_weight is true, the resolved strength is
weight * exp(rho[rho_index]); otherwise it is fixed at weight.
n_eff: usizeNumber of rows in the row-major matrix-valued latent block.
learnable_weight: bool§rho_index: usize§target: PsiSlice§weight_schedule: Option<ScalarWeightSchedule>Implementations§
Source§impl RowPrecisionPriorPenalty
impl RowPrecisionPriorPenalty
pub fn new( target: PsiSlice, lambda_per_row: Array3<f64>, weight: f64, n_eff: usize, learnable_weight: bool, ) -> Result<Self, String>
Sourcepub fn with_weight_schedule(self, schedule: ScalarWeightSchedule) -> Self
pub fn with_weight_schedule(self, schedule: ScalarWeightSchedule) -> Self
Attach a scalar weight schedule, seeding the current weight from the schedule’s stored iteration counter.
pub fn diag_target( &self, target: ArrayView1<'_, f64>, rho: ArrayView1<'_, f64>, ) -> Array1<f64>
Sourcepub fn as_dense(
&self,
target: ArrayView1<'_, f64>,
rho: ArrayView1<'_, f64>,
) -> Array2<f64>
pub fn as_dense( &self, target: ArrayView1<'_, f64>, rho: ArrayView1<'_, f64>, ) -> Array2<f64>
Materialize the row-block-diagonal Hessian for exact spectral paths.
pub fn log_det_plus_lambda_i( &self, rho: ArrayView1<'_, f64>, lambda: f64, ) -> Result<f64, String>
Trait Implementations§
Source§impl AnalyticPenalty for RowPrecisionPriorPenalty
impl AnalyticPenalty for RowPrecisionPriorPenalty
Source§fn tier(&self) -> PenaltyTier
fn tier(&self) -> PenaltyTier
Source§fn value(&self, target: ArrayView1<'_, f64>, rho: ArrayView1<'_, f64>) -> f64
fn value(&self, target: ArrayView1<'_, f64>, rho: ArrayView1<'_, f64>) -> f64
P(target; ρ). The strength factor
exp(ρ) (or whatever parameterization the penalty uses) is folded in.Source§fn grad_target(
&self,
target: ArrayView1<'_, f64>,
rho: ArrayView1<'_, f64>,
) -> Array1<f64>
fn grad_target( &self, target: ArrayView1<'_, f64>, rho: ArrayView1<'_, f64>, ) -> Array1<f64>
∂P/∂target, same length as target.Source§fn hessian_diag(
&self,
target: ArrayView1<'_, f64>,
rho: ArrayView1<'_, f64>,
) -> Option<Array1<f64>>
fn hessian_diag( &self, target: ArrayView1<'_, f64>, rho: ArrayView1<'_, f64>, ) -> Option<Array1<f64>>
diag(∂²P/∂target²) when the Hessian is
block-diagonal. Returns None for penalties whose Hessian is dense
(Isometry); those implement Self::hvp instead. The default
signals “no closed-form diagonal” by returning None for any
non-empty target — concrete penalties either override with their
own analytic diagonal or rely on the matrix-free hvp path.Source§fn hvp(
&self,
target: ArrayView1<'_, f64>,
rho: ArrayView1<'_, f64>,
v: ArrayView1<'_, f64>,
) -> Array1<f64>
fn hvp( &self, target: ArrayView1<'_, f64>, rho: ArrayView1<'_, f64>, v: ArrayView1<'_, f64>, ) -> Array1<f64>
H v = (∂²P/∂target²) v, in closed form. Read moreSource§fn grad_rho(
&self,
target: ArrayView1<'_, f64>,
rho: ArrayView1<'_, f64>,
) -> Array1<f64>
fn grad_rho( &self, target: ArrayView1<'_, f64>, rho: ArrayView1<'_, f64>, ) -> Array1<f64>
Self::rho_count.Source§fn rho_count(&self) -> usize
fn rho_count(&self) -> usize
Source§fn apply_schedule(&mut self, iter: usize)
fn apply_schedule(&mut self, iter: usize)
Source§fn psd_majorizer_diag(
&self,
target: ArrayView1<'_, f64>,
rho: ArrayView1<'_, f64>,
) -> Option<Array1<f64>>
fn psd_majorizer_diag( &self, target: ArrayView1<'_, f64>, rho: ArrayView1<'_, f64>, ) -> Option<Array1<f64>>
diag(B(target; ρ)) with
B ⪰ ∂²P/∂target² everywhere and B ⪰ 0. This is a different
operator from Self::hessian_diag: for nonconvex penalties (log
sparsity, JumpReLU) the exact Hessian is indefinite, but the inner
Newton / PIRLS solve and the log-det / preconditioner pipeline require
a PSD curvature block. For convex penalties the majorizer coincides
with the exact Hessian, so the default simply delegates to
Self::hessian_diag; nonconvex penalties override.Source§fn psd_majorizer_hvp(
&self,
target: ArrayView1<'_, f64>,
rho: ArrayView1<'_, f64>,
v: ArrayView1<'_, f64>,
) -> Array1<f64>
fn psd_majorizer_hvp( &self, target: ArrayView1<'_, f64>, rho: ArrayView1<'_, f64>, v: ArrayView1<'_, f64>, ) -> Array1<f64>
B(target; ρ) v
(see Self::psd_majorizer_diag). For convex penalties this is the
exact Hessian-vector product, so the default delegates to
Self::hvp; nonconvex penalties override to return their PSD
surrogate instead of the indefinite true Hessian.Source§impl Clone for RowPrecisionPriorPenalty
impl Clone for RowPrecisionPriorPenalty
Source§fn clone(&self) -> RowPrecisionPriorPenalty
fn clone(&self) -> RowPrecisionPriorPenalty
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for RowPrecisionPriorPenalty
impl Debug for RowPrecisionPriorPenalty
Source§impl PenaltyManifest for RowPrecisionPriorPenalty
impl PenaltyManifest for RowPrecisionPriorPenalty
const KIND_TAG: &'static str = "row_precision_prior"
const PYTHON_WRAPPER: &'static str = "AuxConditionalPriorPenalty"
const ROW_BLOCK_DIAGONAL: bool = true
fn dispatch_tier(&self) -> PenaltyTier
Auto Trait Implementations§
impl Freeze for RowPrecisionPriorPenalty
impl RefUnwindSafe for RowPrecisionPriorPenalty
impl Send for RowPrecisionPriorPenalty
impl Sync for RowPrecisionPriorPenalty
impl Unpin for RowPrecisionPriorPenalty
impl UnsafeUnpin for RowPrecisionPriorPenalty
impl UnwindSafe for RowPrecisionPriorPenalty
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> 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 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.