gam_problem/pseudo_logdet.rs
1/// How the penalized Hessian's log-determinant and derivatives treat the
2/// spectrum below the stability floor.
3#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
4pub enum PseudoLogdetMode {
5 /// Keep every eigenpair in the smooth spectral regularizer.
6 #[default]
7 Smooth,
8 /// Exclude numerical null-space directions consistently from pseudo-logdet
9 /// and derivative traces.
10 HardPseudo,
11 /// Require a genuine positive-definite Hessian and use its unregularized
12 /// log-determinant, inverse, and derivative kernels. This is the Laplace
13 /// contract at a certified local mode: an indefinite stationary point is
14 /// rejected instead of being converted into a different objective.
15 PositiveDefinite,
16}
17
18#[cfg(test)]
19mod tests {
20 use super::*;
21
22 #[test]
23 fn default_is_smooth() {
24 assert_eq!(PseudoLogdetMode::default(), PseudoLogdetMode::Smooth);
25 }
26
27 #[test]
28 fn variants_are_distinct() {
29 assert_ne!(PseudoLogdetMode::Smooth, PseudoLogdetMode::HardPseudo);
30 assert_ne!(
31 PseudoLogdetMode::HardPseudo,
32 PseudoLogdetMode::PositiveDefinite
33 );
34 assert_ne!(
35 PseudoLogdetMode::PositiveDefinite,
36 PseudoLogdetMode::Smooth
37 );
38 }
39}