Skip to main content

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}