pub struct MeasureJetBasisSpec {
pub center_strategy: CenterStrategy,
pub order_s: f64,
pub alpha: f64,
pub tau0: f64,
pub num_scales: usize,
pub length_scale: f64,
pub double_penalty: bool,
pub learn_length_scale: bool,
pub multiscale: bool,
pub identifiability: MeasureJetIdentifiability,
pub frozen_quadrature: Option<MeasureJetFrozenQuadrature>,
}Expand description
Measure-jet smooth configuration (mjs(x0, …, xd)).
The feature columns are ambient coordinates of data concentrated near an unknown low-dimensional (possibly stratified) set; the term learns the geometry from the empirical measure itself — centers as quadrature nodes, masses as μ-weights, local jet residuals as the roughness carrier — with no graph, mesh, or neighbor-set inside the statistical object.
Fields§
§center_strategy: CenterStrategyCenter/knot selection strategy (deterministic; quadrature of μ).
order_s: f64Continuous smoothness order s ∈ (0, 2); 0.0 sentinel = auto
(MEASURE_JET_DEFAULT_ORDER_S).
alpha: f64Density-normalization exponent α (outer weight q^{1−2α}).
tau0: f64Historical τ coordinate retained for frozen specs and ψ layout. The measure-jet energy itself uses the exact weighted affine projection and is independent of τ; the τ ψ derivatives are therefore zero.
num_scales: usizeNumber of scale nodes; 0 sentinel = auto dyadic band.
length_scale: f64Representer (Gaussian RBF) range ℓ; 0.0 sentinel = auto
(median nearest-center spacing × MEASURE_JET_AUTO_LENGTH_SCALE_FACTOR).
double_penalty: boolAdd a separate function-space affine/null-component penalty alongside the jet-energy penalty. Its strength is independently REML-selected.
learn_length_scale: boolREML-select the representer range ℓ as a design-moving outer dial,
mirroring Matérn’s log_kappa. Default true — ℓ is a basis
coordinate of the same kind as the Matérn κ, not a smoothing parameter,
and a fitted model must choose it.
§Why it cannot be a frozen geometric value (#2761)
The Gaussian kernel is strictly PD for every ℓ > 0, so ℓ does NOT change
the basis rank (always m centers) — but it changes WHICH m-dim
subspace the representers span. λ can only shrink inside a span; it
cannot move one. So a mis-set ℓ is an error no smoothing parameter can
repair, and the size of that error is not small. Measured on
measure_jet_perf_parity’s 1-D-curve-in-3-D Gaussian fixture
(n = 1500, σ = 0.10, 16 centers, p = 15), where span floor is the
least-squares projection residual of the NOISELESS truth onto the
realized design’s column span — the bound no λ can beat:
arm ell edf span floor unpen. LS held-out
frozen (auto ell) 0.5144 14.684 0.152488 0.155484 0.155584
REML-selected ell 3.8813 14.006 0.000014 0.008155 0.009642
matern(k=16) - 14.619 0.006077 0.011989 0.011639
duchon(k=16) - 15.016 0.002443 0.011308 0.010521At the frozen range the fit is already at edf/p = 0.98 and its held-out
RMSE is the span floor: unpenalized least squares on the same design
gives 0.1555, and dropping the null-component penalty moves the fourth
decimal. Freeing ℓ drops the floor by four orders and the held-out RMSE
by 16x, past both comparators, at LOWER edf — nothing is traded for it.
§History (so a fourth flip needs new evidence)
299c83ffc (#1116) introduced this dial default-ON precisely to remove
this fixture’s 13x. a3afd17a2 then found the one place it is unsafe —
a BMS fit shares ONE mjs basis between the marginal mean and the
log-slope surface, and a design-moving kernel scale on shared covariates
is an identifiability hazard that reached a separation runaway — and
contained it AT THE BMS ENTRY POINT with
crate::smooth::freeze_measure_jet_length_scale_learning, which is
still what runs there. b1d94d1a5 (#1041) nevertheless flipped the
GLOBAL default off, and the 13x returned as #2761. The scoped freeze is
the correct containment; the global one buys nothing it does not already
buy and costs every single-surface fit its span alignment.
false freezes ℓ at the auto (or explicit) value with no outer
enrollment. The term builder selects that automatically when the user
pins length_scale= — an explicit range is a request, not a seed —
mirroring the Matérn all_spatial_terms_kappa_fixed short-circuit.
multiscale: boolExplicit opt-in for multiscale mode: the per-scale spectral penalty
split plus the (α, ln τ) outer ψ dials. false (default) keeps the
energy in single-scale mode at ANY center count. The separate
double_penalty null component is available in both modes. There is no
center-count auto-gate; the user opts in via
mjs(…, multiscale=true). Persisted on the spec so freeze→replay enters
the same mode.
identifiability: MeasureJetIdentifiabilityRealized-design identifiability policy (see type docs).
frozen_quadrature: Option<MeasureJetFrozenQuadrature>Fit-time quadrature replay (see type docs). None at fit time;
Some on the frozen predict/ψ-trial path.
Trait Implementations§
Source§impl Clone for MeasureJetBasisSpec
impl Clone for MeasureJetBasisSpec
Source§fn clone(&self) -> MeasureJetBasisSpec
fn clone(&self) -> MeasureJetBasisSpec
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 MeasureJetBasisSpec
impl Debug for MeasureJetBasisSpec
Source§impl Default for MeasureJetBasisSpec
impl Default for MeasureJetBasisSpec
Source§impl<'de> Deserialize<'de> for MeasureJetBasisSpec
impl<'de> Deserialize<'de> for MeasureJetBasisSpec
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Auto Trait Implementations§
impl Freeze for MeasureJetBasisSpec
impl RefUnwindSafe for MeasureJetBasisSpec
impl Send for MeasureJetBasisSpec
impl Sync for MeasureJetBasisSpec
impl Unpin for MeasureJetBasisSpec
impl UnsafeUnpin for MeasureJetBasisSpec
impl UnwindSafe for MeasureJetBasisSpec
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,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
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.