pub struct TotalVariationPenalty {
pub weight: f64,
pub n_eff: usize,
pub difference_op: DifferenceOpKind,
pub smoothing_eps: f64,
pub learnable_weight: bool,
pub rho_index: usize,
pub weight_schedule: Option<ScalarWeightSchedule>,
}Expand description
Coordinatewise/anisotropic smoothed-L¹ total variation on a row-major
(n_eff, d) latent block.
Uses the differentiable Huber-style kernel φ(x)=sqrt(x²+ε²)-ε separately
for each edge and latent axis. This is not vector-norm/isotropic edge TV:
the Hessian intentionally has no cross-axis terms. The difference operator
defines the prior shape: forward 1-D differences for ordered context
windows, or graph edges for adjacency-structured atoms. Pair TV with
Orthogonality when piecewise-constant atoms need a gauge-fixed basis.
Fields§
§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 latent coefficient block.
difference_op: DifferenceOpKind§smoothing_eps: f64§learnable_weight: bool§rho_index: usize§weight_schedule: Option<ScalarWeightSchedule>Implementations§
Source§impl TotalVariationPenalty
impl TotalVariationPenalty
pub fn new( weight: f64, n_eff: usize, difference_op: DifferenceOpKind, smoothing_eps: f64, 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 Dᵀ diag(φ''(D T)) D for diagnostics and small graph cases.
pub fn log_det_plus_lambda_i_forward_1d( &self, target: ArrayView1<'_, f64>, rho: ArrayView1<'_, f64>, lambda: f64, ) -> Result<f64, String>
Trait Implementations§
Source§impl AnalyticPenalty for TotalVariationPenalty
impl AnalyticPenalty for TotalVariationPenalty
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 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 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 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 TotalVariationPenalty
impl Clone for TotalVariationPenalty
Source§fn clone(&self) -> TotalVariationPenalty
fn clone(&self) -> TotalVariationPenalty
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 TotalVariationPenalty
impl Debug for TotalVariationPenalty
Source§impl PenaltyManifest for TotalVariationPenalty
impl PenaltyManifest for TotalVariationPenalty
const KIND_TAG: &'static str = "total_variation"
const PYTHON_WRAPPER: &'static str = "TotalVariationPenalty"
const ROW_BLOCK_DIAGONAL: bool = false
fn dispatch_tier(&self) -> PenaltyTier
Auto Trait Implementations§
impl Freeze for TotalVariationPenalty
impl RefUnwindSafe for TotalVariationPenalty
impl Send for TotalVariationPenalty
impl Sync for TotalVariationPenalty
impl Unpin for TotalVariationPenalty
impl UnsafeUnpin for TotalVariationPenalty
impl UnwindSafe for TotalVariationPenalty
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.