use ndarray::{Array1, Array2, ArrayView2, Axis};
use gam_solve::rho_optimizer::OuterCriterionCertificate;
use crate::front_door::{SaeFitLane, admit_topk_manifold};
use crate::manifold::{
SaeSupportFixedPointReport, SaeSupportOuterRequest, SaeSupportSeedRequest,
SaeSupportSparseTerm, SaeSupportTermSeedRequest, build_sae_support_seed,
SAE_SUPPORT_INNER_FIXED_POINT_MAX_ITER, build_sae_support_term_seed,
run_sae_support_outer, sae_support_effective_atom_dims,
};
use crate::migration_ledger::{BirthSeed, MoveEvidence, MoveReason, MoveStage, SaeMigrationLedger};
use crate::sparse_dict::{
BlockSeedPolicy, BlockSparseConfig, BlockSparseFit, block_sparse_dictionary_transform,
fit_block_sparse_dictionary_with_seed, reconstruct_block_sparse_rows,
};
use crate::tiered::Tier0Mean;
use crate::tiered::code_space::{
CodeSpacePromotionReport, harvest_code_space_promotions, linear_distortion_floor,
};
const FARTHEST_POINT_SEED_MAX_OPS: u128 = 1_000_000_000;
#[derive(Clone, Copy, Debug, PartialEq, Eq, Default)]
pub enum TieredSeedPolicy {
#[default]
Auto,
FarthestPoint,
CoordinatePartition,
}
impl TieredSeedPolicy {
fn resolve(self, n: usize, p: usize, config: &BlockSparseConfig) -> BlockSeedPolicy {
match self {
TieredSeedPolicy::FarthestPoint => BlockSeedPolicy::FarthestPoint,
TieredSeedPolicy::CoordinatePartition => BlockSeedPolicy::CoordinatePartition,
TieredSeedPolicy::Auto => {
let ops = (n as u128)
* (p as u128)
* (config.n_blocks as u128)
* (config.block_size as u128);
if ops > FARTHEST_POINT_SEED_MAX_OPS {
BlockSeedPolicy::CoordinatePartition
} else {
BlockSeedPolicy::FarthestPoint
}
}
}
}
}
#[derive(Clone, Debug)]
pub struct Tier2SupportConfig {
pub atom_basis: String,
pub atom_dim: usize,
pub n_atoms: usize,
pub support_k: usize,
pub initial_smoothness: f64,
pub max_outer_iter: usize,
pub max_inner_iter: usize,
pub inner_tolerance: f64,
pub trust_radius: f64,
pub random_state: u64,
}
impl Default for Tier2SupportConfig {
fn default() -> Self {
Self {
atom_basis: "periodic".to_string(),
atom_dim: 1,
n_atoms: 256,
support_k: 4,
initial_smoothness: 1.0,
max_outer_iter: 64,
max_inner_iter: SAE_SUPPORT_INNER_FIXED_POINT_MAX_ITER,
inner_tolerance: 1.0e-8,
trust_radius: 1.0,
random_state: 0xC0FF_EE00_D15E_A5E5,
}
}
}
#[derive(Clone, Debug)]
pub struct TieredFitConfig {
pub tier1: BlockSparseConfig,
pub tier1_seed: TieredSeedPolicy,
pub tier2_enabled: bool,
pub tier2: Tier2SupportConfig,
}
impl TieredFitConfig {
pub fn linear_bulk(n_blocks: usize, block_size: usize) -> Self {
Self {
tier1: BlockSparseConfig::new(n_blocks, block_size),
tier1_seed: TieredSeedPolicy::Auto,
tier2_enabled: false,
tier2: Tier2SupportConfig::default(),
}
}
pub fn tiered(n_blocks: usize, block_size: usize) -> Self {
Self {
tier1: BlockSparseConfig::new(n_blocks, block_size),
tier1_seed: TieredSeedPolicy::Auto,
tier2_enabled: true,
tier2: Tier2SupportConfig::default(),
}
}
}
#[derive(Clone, Debug)]
pub struct LinearPeelConfig {
pub tier1: BlockSparseConfig,
pub tier1_seed: TieredSeedPolicy,
}
impl LinearPeelConfig {
pub fn derive(output_dim: usize, d_max: usize, support_k: usize) -> Result<Self, String> {
if output_dim == 0 || d_max == 0 || support_k == 0 {
return Err(format!(
"LinearPeelConfig::derive requires P >= 1, d_max >= 1 and support_k >= 1; got \
P={output_dim}, d_max={d_max}, support_k={support_k}"
));
}
let n_blocks = output_dim / d_max;
if n_blocks == 0 {
return Err(format!(
"LinearPeelConfig::derive: a curved atom of dimension d_max={d_max} has no linear \
counterpart in P={output_dim} — the linear bulk cannot carry a block wider than \
the corpus. Reduce d_atom or disable the linear peel"
));
}
let mut tier1 = BlockSparseConfig::new(n_blocks, d_max);
tier1.block_topk = support_k.min(n_blocks);
tier1.aux_k = tier1.block_topk;
tier1.max_epochs = 10 * tier1.max_epochs.max(1);
Ok(Self {
tier1,
tier1_seed: TieredSeedPolicy::Auto,
})
}
}
#[derive(Clone, Debug)]
pub struct LinearPeelState {
pub mean: Array1<f64>,
pub decoder: Array2<f32>,
pub gamma: f32,
pub block_size: usize,
pub block_topk: usize,
pub block_tile: usize,
pub residual_mean: Array1<f64>,
}
fn route_linear_bulk(
mean: &Array1<f64>,
decoder: ArrayView2<'_, f32>,
gamma: f32,
block_size: usize,
block_topk: usize,
block_tile: usize,
z: ArrayView2<'_, f64>,
) -> Result<Array2<f64>, String> {
if z.ncols() != mean.len() {
return Err(format!(
"route_linear_bulk: z has P={} but the peel spans P={}",
z.ncols(),
mean.len()
));
}
let centered = &z - &mean.view().insert_axis(Axis(0));
let centered_f32 = centered.mapv(|value| value as f32);
let (blocks, _gates, codes) = block_sparse_dictionary_transform(
centered_f32.view(),
decoder,
gamma,
block_size,
block_topk,
block_tile,
)?;
let linear = reconstruct_block_sparse_rows(decoder, blocks.view(), codes.view(), block_size)?;
Ok(linear.mapv(|value| value as f64))
}
impl LinearPeelState {
pub fn composed_mean(&self) -> Array1<f64> {
&self.mean + &self.residual_mean
}
pub fn linear_reconstruct(&self, z: ArrayView2<'_, f64>) -> Result<Array2<f64>, String> {
route_linear_bulk(
&self.mean,
self.decoder.view(),
self.gamma,
self.block_size,
self.block_topk,
self.block_tile,
z,
)
}
pub fn offset(&self, z: ArrayView2<'_, f64>) -> Result<Array2<f64>, String> {
let linear = self.linear_reconstruct(z)?;
Ok(&linear + &self.composed_mean().view().insert_axis(Axis(0)))
}
}
#[derive(Clone, Debug)]
pub struct LinearPeel {
pub tier0: Tier0Mean,
pub tier1: BlockSparseFit,
pub linear: Array2<f64>,
pub residual_mean: Array1<f64>,
pub residual: Array2<f64>,
pub baseline_energy: f64,
pub block_tile: usize,
}
impl LinearPeel {
pub fn state(&self) -> LinearPeelState {
LinearPeelState {
mean: self.tier0.mean.clone(),
decoder: self.tier1.decoder.clone(),
gamma: self.tier1.gamma,
block_size: self.tier1.block_size,
block_topk: self.tier1.block_topk,
block_tile: self.block_tile,
residual_mean: self.residual_mean.clone(),
}
}
}
pub fn fit_linear_peel(
z: ArrayView2<'_, f64>,
config: &LinearPeelConfig,
) -> Result<LinearPeel, String> {
let tier0 = Tier0Mean::fit(z)?;
let r0 = tier0.apply(z)?;
let r0_f32 = r0.mapv(|value| value as f32);
let seed_policy = config
.tier1_seed
.resolve(r0_f32.nrows(), r0_f32.ncols(), &config.tier1);
let tier1 = fit_block_sparse_dictionary_with_seed(r0_f32.view(), &config.tier1, seed_policy)?;
let (n_obs, output_dim) = r0.dim();
let linear = route_linear_bulk(
&tier0.mean,
tier1.decoder.view(),
tier1.gamma,
tier1.block_size,
tier1.block_topk,
config.tier1.block_tile,
z,
)?;
if linear.dim() != (n_obs, output_dim) {
return Err(format!(
"fit_linear_peel: Tier-1 reconstruction {:?} does not match residual ({n_obs}, {output_dim})",
linear.dim()
));
}
let tier1_residual = &r0 - &linear;
let residual_mean = tier1_residual
.mean_axis(Axis(0))
.ok_or_else(|| "fit_linear_peel: residual mean_axis returned None".to_string())?;
let residual = &tier1_residual - &residual_mean.view().insert_axis(Axis(0));
let baseline_energy = r0.iter().map(|value| value * value).sum::<f64>();
Ok(LinearPeel {
tier0,
tier1,
linear,
residual_mean,
residual,
baseline_energy,
block_tile: config.tier1.block_tile,
})
}
#[derive(Clone, Debug)]
pub struct Tier2SupportFit {
pub mean: Array1<f64>,
pub term: SaeSupportSparseTerm,
pub lambda_smooth: Vec<f64>,
pub criterion: f64,
pub fixed_point: SaeSupportFixedPointReport,
pub outer_certificate: OuterCriterionCertificate,
pub outer_iterations: usize,
pub requested_atoms: usize,
pub retained_atoms: usize,
pub explained_variance: f64,
}
#[derive(Clone, Debug)]
pub struct TieredFitReport {
pub tier0: Tier0Mean,
pub tier1: BlockSparseFit,
pub tier2: Option<Tier2SupportFit>,
pub code_space: CodeSpacePromotionReport,
pub ledger: SaeMigrationLedger,
pub explained_variance: f64,
}
pub fn fit_tiered(
z: ArrayView2<'_, f64>,
config: &TieredFitConfig,
) -> Result<TieredFitReport, String> {
let peel = fit_linear_peel(
z,
&LinearPeelConfig {
tier1: config.tier1,
tier1_seed: config.tier1_seed,
},
)?;
let mut ledger = SaeMigrationLedger::new();
let n_dead = peel
.tier1
.block_utilization
.iter()
.filter(|&&u| u == 0.0)
.count();
if n_dead > 0 {
ledger.death(
MoveStage::Linear,
MoveReason::DeadRouting,
n_dead,
None,
MoveEvidence::none(),
f64::NAN,
);
}
let tolerance = linear_distortion_floor(peel.residual.view(), peel.baseline_energy)?;
let code_space = harvest_code_space_promotions(&peel.tier1, z.nrows(), tolerance)?;
let census_proposals = code_space.proposals.iter().chain(
code_space
.pair_proposals
.iter()
.map(|verdict| &verdict.proposal),
);
for proposal in census_proposals {
let evidence = MoveEvidence::from_dl_bits(proposal.dl_old - proposal.dl_new);
if proposal.accept {
ledger.birth(
MoveStage::Curved,
BirthSeed::LinearAtom,
1,
None,
evidence,
proposal.dl_new,
);
} else {
ledger.refuse(
MoveStage::Curved,
MoveReason::EvidenceInsufficient,
1,
None,
evidence,
proposal.dl_new,
);
}
}
let (tier2, explained_variance) = if config.tier2_enabled {
let fit = fit_tier2_support(&peel, &config.tier2)?;
record_support_moves(&mut ledger, &fit);
let ev = fit.explained_variance;
(Some(fit), ev)
} else {
(None, peel.tier1.explained_variance)
};
Ok(TieredFitReport {
tier0: peel.tier0,
tier1: peel.tier1,
tier2,
code_space,
ledger,
explained_variance,
})
}
fn fit_tier2_support(
peel: &LinearPeel,
config: &Tier2SupportConfig,
) -> Result<Tier2SupportFit, String> {
let (n_obs, output_dim) = peel.residual.dim();
let mean = peel.residual_mean.clone();
let centered = peel.residual.clone();
let requested_atoms = config.n_atoms;
let atom_basis = vec![config.atom_basis.clone(); requested_atoms];
let atom_dim = vec![config.atom_dim; requested_atoms];
let effective_dims = sae_support_effective_atom_dims(&atom_basis, &atom_dim)?;
let d_max = effective_dims.iter().copied().max().unwrap_or(1);
let admission =
admit_topk_manifold(n_obs, output_dim, requested_atoms, d_max, config.support_k)?;
if admission.lane != SaeFitLane::CurvedStreaming {
return Err(format!(
"fit_tier2_support: the curved refinement is the overcomplete support-sparse lane, \
which requires K > P (CurvedStreaming admission); got lane {:?} at N={n_obs}, \
P={output_dim}, K={requested_atoms}. Widen the Tier-2 dictionary past the residual \
dimension",
admission.lane
));
}
let seed = build_sae_support_seed(SaeSupportSeedRequest {
target: centered.view(),
atom_basis: &atom_basis,
atom_dim: &atom_dim,
support_k: config.support_k,
random_state: config.random_state,
admission,
})?;
let retained_atom_indices = seed.retained_atom_indices;
let retained_atoms = retained_atom_indices.len();
let retained_basis = retained_atom_indices
.iter()
.map(|&atom| atom_basis[atom].clone())
.collect::<Vec<_>>();
let retained_dim = retained_atom_indices
.iter()
.map(|&atom| atom_dim[atom])
.collect::<Vec<_>>();
let term_seed = build_sae_support_term_seed(SaeSupportTermSeedRequest {
assignment: seed.assignment,
atom_basis: retained_basis,
atom_dim: retained_dim,
output_dim,
random_state: config.random_state,
})?;
let ard_precisions = (0..term_seed.term.k_atoms())
.map(|atom| vec![1.0; term_seed.term.assignment.atom_coord_dim(atom)])
.collect::<Vec<_>>();
let outer = run_sae_support_outer(SaeSupportOuterRequest {
term: term_seed.term,
target: centered.clone(),
initial_smoothness: config.initial_smoothness,
ard_precisions,
max_outer_iter: config.max_outer_iter,
max_inner_iter: config.max_inner_iter,
inner_tolerance: config.inner_tolerance,
trust_radius: config.trust_radius,
random_state: config.random_state,
})
.map_err(|error| error.to_string())?;
let curved_centered = outer.term.reconstruct()?;
let mut rss = 0.0f64;
for row in 0..n_obs {
for column in 0..output_dim {
let delta = centered[[row, column]] - curved_centered[[row, column]];
rss += delta * delta;
}
}
let tss = peel.baseline_energy;
let explained_variance = crate::tiered::explained_variance_from_sums(rss, tss);
Ok(Tier2SupportFit {
mean,
term: outer.term,
lambda_smooth: outer.lambda_smooth,
criterion: outer.criterion,
fixed_point: outer.fixed_point,
outer_certificate: outer.outer_certificate,
outer_iterations: outer.outer_iterations,
requested_atoms,
retained_atoms,
explained_variance,
})
}
fn record_support_moves(ledger: &mut SaeMigrationLedger, fit: &Tier2SupportFit) {
if fit.retained_atoms > 0 {
ledger.birth(
MoveStage::Curved,
BirthSeed::LinearAtom,
fit.retained_atoms,
Some(0),
MoveEvidence::none(),
fit.criterion,
);
}
let pruned = fit.requested_atoms - fit.retained_atoms;
if pruned > 0 {
ledger.death(
MoveStage::Curved,
MoveReason::DeadRouting,
pruned,
None,
MoveEvidence::none(),
fit.criterion,
);
}
}
#[cfg(test)]
mod peel_tests {
use super::*;
use ndarray::Array2;
fn planted_bulk_plus_curvature(n: usize) -> Array2<f64> {
let mut z = Array2::<f64>::zeros((n, 4));
for i in 0..n {
let t = i as f64 / n as f64;
let phase = (i as f64) * 0.19;
z[[i, 0]] = 1.5 + (2.0 * t - 1.0);
z[[i, 1]] = -0.5 + (1.0 - 2.0 * t);
z[[i, 2]] = 0.25 + phase.cos();
z[[i, 3]] = -0.75 + phase.sin();
}
z
}
fn chart_curved(
centered: ArrayView2<'_, f64>,
n_atoms: usize,
support_k: usize,
) -> Result<(SaeSupportSparseTerm, SaeSupportFixedPointReport, OuterCriterionCertificate), String>
{
let (n_obs, output_dim) = centered.dim();
let atom_basis = vec!["periodic".to_string(); n_atoms];
let atom_dim = vec![1usize; n_atoms];
let effective_dims = sae_support_effective_atom_dims(&atom_basis, &atom_dim)?;
let d_max = effective_dims.iter().copied().max().unwrap_or(1);
let admission = admit_topk_manifold(n_obs, output_dim, n_atoms, d_max, support_k)?;
let seed = build_sae_support_seed(SaeSupportSeedRequest {
target: centered,
atom_basis: &atom_basis,
atom_dim: &atom_dim,
support_k,
random_state: 0xC0FF_EE00_D15E_A5E5,
admission,
})?;
let retained = seed.retained_atom_indices.clone();
let term_seed = build_sae_support_term_seed(SaeSupportTermSeedRequest {
assignment: seed.assignment,
atom_basis: vec!["periodic".to_string(); retained.len()],
atom_dim: vec![1usize; retained.len()],
output_dim,
random_state: 0xC0FF_EE00_D15E_A5E5,
})?;
let ard_precisions = (0..term_seed.term.k_atoms())
.map(|atom| vec![1.0; term_seed.term.assignment.atom_coord_dim(atom)])
.collect::<Vec<_>>();
let outer = run_sae_support_outer(SaeSupportOuterRequest {
term: term_seed.term,
target: centered.to_owned(),
initial_smoothness: 1.0,
ard_precisions,
max_outer_iter: 32,
max_inner_iter: 256,
inner_tolerance: 1.0e-4,
trust_radius: 1.0,
random_state: 0xC0FF_EE00_D15E_A5E5,
})
.map_err(|error| error.to_string())?;
Ok((outer.term, outer.fixed_point, outer.outer_certificate))
}
#[test]
fn derived_peel_width_mirrors_the_curved_request() {
let config = LinearPeelConfig::derive(16, 2, 3).expect("derives");
assert_eq!(config.tier1.block_size, 2, "b = d_max");
assert_eq!(config.tier1.n_blocks, 8, "G = P / b");
assert_eq!(config.tier1.n_atoms(), 16, "K_lin = P, the identifiable width");
assert_eq!(config.tier1.block_topk, 3, "k = support_k");
let narrow = LinearPeelConfig::derive(4, 1, 9).expect("derives");
assert_eq!(narrow.tier1.block_topk, 4);
let refused = LinearPeelConfig::derive(3, 4, 1);
assert!(
refused.is_err(),
"d_max > P must be refused, not rounded down to a block the caller never asked for"
);
}
#[test]
fn peeled_support_fit_converges_on_planted_bulk_plus_curvature() {
let z = planted_bulk_plus_curvature(96);
let config = LinearPeelConfig::derive(z.ncols(), 1, 2).expect("peel geometry derives");
let peel = fit_linear_peel(z.view(), &config).expect("the linear peel converges");
let (term, fixed_point, certificate) =
chart_curved(peel.residual.view(), 8, 2).expect("the peeled curved fit runs");
assert!(
certificate.certifies() && certificate.is_stationary(),
"the peeled fit must carry a certifying outer stationarity certificate"
);
assert!(
fixed_point.recurred,
"the peeled inner fixed point must have RECURRED; got {fixed_point:?}"
);
assert!(term.k_atoms() >= 1, "the peeled fit must retain a curved atom");
}
#[test]
fn composed_reconstruction_is_mu_plus_linear_plus_curved() {
let z = planted_bulk_plus_curvature(96);
let config = LinearPeelConfig::derive(z.ncols(), 1, 2).expect("peel geometry derives");
let peel = fit_linear_peel(z.view(), &config).expect("the linear peel converges");
for row in 0..z.nrows() {
for column in 0..z.ncols() {
let parts = peel.tier0.mean[column]
+ peel.linear[[row, column]]
+ peel.residual_mean[column]
+ peel.residual[[row, column]];
assert!(
(parts - z[[row, column]]).abs() <= 1.0e-12 * z[[row, column]].abs().max(1.0),
"μ + L + mean(R1) + R1c must reproduce z at ({row}, {column}): {parts} vs {}",
z[[row, column]]
);
}
}
let state = peel.state();
let offset = state.offset(z.view()).expect("offset recomputes");
for row in 0..z.nrows() {
for column in 0..z.ncols() {
let fitted_offset = peel.tier0.mean[column]
+ peel.linear[[row, column]]
+ peel.residual_mean[column];
assert!(
(offset[[row, column]] - fitted_offset).abs() <= 1.0e-12,
"recomputed offset {} != fitted offset {fitted_offset} at ({row}, {column})",
offset[[row, column]]
);
}
}
let (term, _fixed_point, _certificate) =
chart_curved(peel.residual.view(), 8, 2).expect("the peeled curved fit runs");
let curved = term.reconstruct().expect("curved reconstruction");
let composed = &offset + &curved;
for row in 0..z.nrows() {
for column in 0..z.ncols() {
let expected = peel.tier0.mean[column]
+ peel.linear[[row, column]]
+ peel.residual_mean[column]
+ curved[[row, column]];
assert!(
(composed[[row, column]] - expected).abs() <= 1.0e-12,
"composed reconstruction {} != μ + L + mean(R1) + C = {expected} at ({row}, {column})",
composed[[row, column]]
);
}
}
}
#[test]
fn peel_disabled_target_is_the_mean_centered_target() {
let z = planted_bulk_plus_curvature(96);
let training_mean = z.mean_axis(Axis(0)).expect("column mean");
let unpeeled = &z - &training_mean.view().insert_axis(Axis(0));
let config = LinearPeelConfig::derive(z.ncols(), 1, 2).expect("peel geometry derives");
let peel = fit_linear_peel(z.view(), &config).expect("the linear peel converges");
for column in 0..z.ncols() {
assert_eq!(
peel.tier0.mean[column], training_mean[column],
"Tier-0 must be exactly the column mean the unpeeled entry removes"
);
}
let linear_energy: f64 = peel.linear.iter().map(|value| value * value).sum();
assert!(
linear_energy > 0.0,
"the planted straight bulk must give the peel something to remove"
);
let mut max_delta = 0.0f64;
for row in 0..z.nrows() {
for column in 0..z.ncols() {
max_delta = max_delta.max((peel.residual[[row, column]] - unpeeled[[row, column]]).abs());
}
}
assert!(
max_delta > 1.0e-6,
"the peeled target must DIFFER from the mean-centered one; got max delta {max_delta}"
);
match chart_curved(unpeeled.view(), 8, 2) {
Ok((_term, _fixed_point, certificate)) => assert!(
certificate.certifies(),
"an unpeeled fit that returns must return certified"
),
Err(error) => assert!(
error.to_string().contains("did not recur"),
"an unpeeled refusal must be the engine's own stall, got: {error}"
),
}
}
}
#[cfg(test)]
mod fit_tests {
use super::*;
use ndarray::Array2;
#[test]
fn tiered_driver_runs_and_never_pc_reseeds() {
let n = 64;
let p = 6;
let mut z = Array2::<f64>::zeros((n, p));
for i in 0..n {
let t = i as f64 / n as f64;
z[[i, 0]] = 1.0 + (t * 6.28).cos();
z[[i, 1]] = 1.0 + (t * 6.28).sin();
z[[i, 2]] = -0.5 + (t * 3.14).cos();
z[[i, 3]] = -0.5 + (t * 3.14).sin();
}
let mut config = TieredFitConfig::linear_bulk(3, 2);
config.tier1.block_topk = 2;
config.tier1.aux_k = 3;
config.tier1.max_epochs = 200;
let report = fit_tiered(z.view(), &config).expect("tiered fit runs");
assert!(
report.explained_variance.is_finite(),
"composed EV must be finite, got {}",
report.explained_variance
);
assert_eq!(
report.ledger.pc_reseed_events, 0,
"the tiered path must never PC-reseed"
);
assert!(report.tier0.mean.iter().all(|m| m.is_finite()));
assert!(report.tier2.is_none(), "linear_bulk disables Tier-2");
assert!(
!report.tier1.convergence.certified,
"an over-complete linear-bulk fit is BEST-EFFORT (certified=false); got certified=true, frame_residual={} tol={}",
report.tier1.convergence.frame_residual, report.tier1.convergence.tolerance
);
assert!(
report.tier1.convergence.frame_residual.is_finite(),
"the open frame residual must be recorded (finite) on a best-effort certificate"
);
}
#[test]
fn tiered_returns_best_effort_open_certificate_at_k_gg_rank_2275() {
let n = 96usize;
let p = 8usize;
let mut z = Array2::<f64>::zeros((n, p));
for i in 0..n {
let t = (i as f64) * 0.2;
z[[i, 0]] = t.cos();
z[[i, 1]] = t.sin();
}
let mut config = TieredFitConfig::tiered(16, 1); config.tier1.block_topk = 4;
config.tier1.aux_k = 4; config.tier1.max_epochs = 40;
config.tier2.n_atoms = p + 4;
config.tier2.support_k = 1;
let report = fit_tiered(z.view(), &config)
.expect("#2275: best-effort tiered fit must RETURN at K ≫ rank, not error");
assert!(
!report.tier1.convergence.certified,
"K ≫ rank fit must carry an OPEN certificate; got certified=true (frame_residual={}, tol={})",
report.tier1.convergence.frame_residual, report.tier1.convergence.tolerance
);
assert!(
report.tier1.convergence.frame_residual > report.tier1.convergence.tolerance,
"an open certificate must report frame_residual above tolerance; got {} <= {}",
report.tier1.convergence.frame_residual,
report.tier1.convergence.tolerance
);
assert!(
report.tier1.convergence.ev_residual.is_finite(),
"the plateaued objective residual must be recorded (finite); got {}",
report.tier1.convergence.ev_residual
);
assert!(
report.tier1.explained_variance.is_finite(),
"best-effort Tier-1 EV must be finite"
);
assert!(
report.tier2.is_some(),
"#2275: Tier-2 must run on the best-effort Tier-1 residual"
);
assert!(
report.explained_variance.is_finite(),
"composed EV must be finite on the best-effort path"
);
assert_eq!(
report.tier1.convergence.tolerance, config.tier1.tolerance,
"#2275 must NOT soften tolerance; the open certificate uses the configured tol"
);
}
#[test]
fn block_sparse_open_fixed_point_returns_open_certificate_2275() {
use crate::sparse_dict::{
BlockSeedPolicy, BlockSparseConfig, fit_block_sparse_dictionary_with_seed,
};
let n = 96usize;
let p = 8usize;
let mut x = Array2::<f32>::zeros((n, p));
for i in 0..n {
let t = (i as f32) * 0.2;
x[[i, 0]] = t.cos();
x[[i, 1]] = t.sin();
}
let mut config = BlockSparseConfig::new(16, 1);
config.block_topk = 4;
config.aux_k = 4;
config.max_epochs = 40;
let fit = fit_block_sparse_dictionary_with_seed(
x.view(),
&config,
BlockSeedPolicy::FarthestPoint,
)
.expect("#2275: the block entry must RETURN the objective-converged open fit");
let c = &fit.convergence;
assert!(
!c.certified,
"a K ≫ rank fit must carry an OPEN certificate (certified=false); got certified=true (frame_residual={}, tol={})",
c.frame_residual, c.tolerance
);
assert!(
c.frame_residual > c.tolerance,
"an open certificate must report frame_residual above tolerance; got {} <= {}",
c.frame_residual,
c.tolerance
);
assert!(
c.ev_residual.is_finite(),
"the plateaued objective residual must be recorded (finite); got {}",
c.ev_residual
);
assert_eq!(
c.tolerance, config.tolerance,
"#2275 must NOT soften tolerance"
);
}
fn two_circle_fixture_2634() -> Array2<f64> {
let n = 96usize;
let mut z = Array2::<f64>::zeros((n, 4));
for i in 0..n {
let phase = i as f64 * 0.19;
z[[i, 0]] = phase.cos();
z[[i, 1]] = phase.sin();
z[[i, 2]] = (1.7 * phase).cos();
z[[i, 3]] = (1.7 * phase).sin();
}
z
}
#[test]
fn tiered_curved_refinement_is_certified_and_records_promotions() {
let z = two_circle_fixture_2634();
let p = z.ncols();
let mut lin = TieredFitConfig::linear_bulk(2, 1);
lin.tier1.block_topk = 1;
lin.tier1.aux_k = 2;
lin.tier1.max_epochs = 200;
let lin_report = fit_tiered(z.view(), &lin).expect("linear-bulk fit runs");
let ev_lin = lin_report.explained_variance;
let mut tiered = TieredFitConfig::tiered(2, 1);
tiered.tier1.block_topk = 1;
tiered.tier1.aux_k = 2;
tiered.tier1.max_epochs = 200;
tiered.tier2.n_atoms = p + 1;
tiered.tier2.support_k = 1;
tiered.tier2.max_outer_iter = 32;
tiered.tier2.max_inner_iter = 256;
let report = fit_tiered(z.view(), &tiered).expect("tiered fit runs");
let tier2 = report.tier2.as_ref().expect("Tier-2 curved refinement ran");
assert!(
tier2.outer_certificate.certifies() && tier2.outer_certificate.is_stationary(),
"Tier-2 must carry a certifying outer stationarity certificate"
);
assert!(
tier2.fixed_point.recurred,
"Tier-2 inner fixed point must have recurred"
);
assert!(
tier2.retained_atoms >= 1 && tier2.term.k_atoms() == tier2.retained_atoms,
"Tier-2 must retain >=1 occupied curved atom (got {})",
tier2.retained_atoms
);
assert_eq!(
report.ledger.pc_reseed_events, 0,
"the tiered path must never PC-reseed"
);
assert_eq!(
report.ledger.n_births, tier2.retained_atoms,
"every retained curved atom is a promotion off the linear residual"
);
assert!(
report.explained_variance >= ev_lin - 1.0e-9,
"tiered EV {} must not regress pure-linear EV {}",
report.explained_variance,
ev_lin
);
}
#[test]
fn code_space_census_recognizes_and_defers_a_zero_residual_planted_ring() {
use std::f64::consts::TAU;
let n = 96usize;
let mut z = Array2::<f64>::zeros((n, 4));
for i in 0..n {
let theta = TAU * (i as f64) / (n as f64);
z[[i, 0]] = theta.cos();
z[[i, 1]] = theta.sin();
}
let mut config = TieredFitConfig::linear_bulk(1, 2);
config.tier1.block_topk = 1;
config.tier1.max_epochs = 200;
let report = fit_tiered(z.view(), &config).expect("single-block tiered fit runs");
let census = &report.code_space;
assert_eq!(census.n_blocks_scanned, 1);
assert_eq!(
census.n_communities, 1,
"the fired 2-atom block must reach the adjudicator"
);
let proposal = &census.proposals[0];
assert!(
proposal.verdict.recommend_curl,
"the census must recognize the planted ring geometrically: {proposal:?}"
);
assert!(
proposal.dl_new < proposal.dl_old,
"the atomic ledger must prefer the circle (dl_new={}, dl_old={})",
proposal.dl_new,
proposal.dl_old
);
assert!(
proposal.crossover_prescreen_bits <= 0.0,
"with no overcompleteness the prescreen cannot pay: {}",
proposal.crossover_prescreen_bits
);
assert_eq!(census.n_accepted, 0, "deferred, not bought");
assert_eq!(report.ledger.n_births, 0);
assert!(
report.ledger.n_refusals >= 1,
"the ledger must record the deferred promotion"
);
assert_eq!(report.ledger.pc_reseed_events, 0);
}
#[test]
fn auto_seed_switches_at_the_farthest_point_budget() {
let small = TieredFitConfig::linear_bulk(8, 2);
assert_eq!(
small.tier1_seed.resolve(240, 16, &small.tier1),
BlockSeedPolicy::FarthestPoint,
"small-K tiered fit must keep the data-aware seed"
);
let large = TieredFitConfig::linear_bulk(2_500, 4);
assert_eq!(
large.tier1_seed.resolve(100_000, 64, &large.tier1),
BlockSeedPolicy::CoordinatePartition,
"large-K tiered fit must switch to the coordinate-partition seed"
);
let mut forced = TieredFitConfig::linear_bulk(2_500, 4);
forced.tier1_seed = TieredSeedPolicy::FarthestPoint;
assert_eq!(
forced.tier1_seed.resolve(100_000, 64, &forced.tier1),
BlockSeedPolicy::FarthestPoint
);
forced.tier1_seed = TieredSeedPolicy::CoordinatePartition;
assert_eq!(
forced.tier1_seed.resolve(240, 16, &forced.tier1),
BlockSeedPolicy::CoordinatePartition
);
}
#[test]
fn coordinate_seed_carries_a_full_tiered_fit() {
let z = two_circle_fixture_2634();
let p = z.ncols();
let mut config = TieredFitConfig::tiered(2, 1);
config.tier1_seed = TieredSeedPolicy::CoordinatePartition;
config.tier1.block_topk = 1;
config.tier1.aux_k = 2;
config.tier1.max_epochs = 200;
config.tier2.n_atoms = p + 1;
config.tier2.support_k = 1;
config.tier2.max_outer_iter = 24;
config.tier2.max_inner_iter = 128;
let report =
fit_tiered(z.view(), &config).expect("coordinate-seeded tiered fit runs end to end");
assert!(
report.explained_variance.is_finite() && report.explained_variance > 0.0,
"coordinate-seeded composed EV must be finite and positive, got {}",
report.explained_variance
);
assert_eq!(
report.ledger.pc_reseed_events, 0,
"the coordinate-seeded tiered path must never PC-reseed"
);
let tier2 = report
.tier2
.as_ref()
.expect("tiered config must run Tier-2");
assert!(
tier2.outer_certificate.certifies(),
"the Tier-2 support-sparse refinement must return a certified fit"
);
}
#[test]
fn tier2_branch_constructs_the_support_sparse_path() {
let z = two_circle_fixture_2634();
let p = z.ncols();
let mut config = TieredFitConfig::tiered(2, 1);
config.tier1.block_topk = 1;
config.tier1.aux_k = 2;
config.tier1.max_epochs = 200;
config.tier2.atom_basis = "periodic".to_string();
config.tier2.atom_dim = 1;
config.tier2.n_atoms = p + 1;
config.tier2.support_k = 1;
config.tier2.max_outer_iter = 32;
config.tier2.max_inner_iter = 256;
let report = fit_tiered(z.view(), &config).expect("tiny two-circle tiered fit runs");
let tier2 = report
.tier2
.as_ref()
.expect("the Tier-2 curved refinement branch must have run");
assert!(
tier2.outer_certificate.certifies() && tier2.outer_certificate.is_stationary(),
"Tier-2 must return a certifying outer stationarity certificate"
);
assert!(
tier2.fixed_point.recurred,
"Tier-2 inner fixed point must have recurred"
);
assert!(
tier2.retained_atoms >= 1
&& tier2.retained_atoms <= tier2.requested_atoms
&& tier2.term.k_atoms() == tier2.retained_atoms,
"Tier-2 must retain 1..={} occupied curved atoms (got {})",
tier2.requested_atoms,
tier2.retained_atoms
);
assert_eq!(
tier2.lambda_smooth.len(),
tier2.term.k_atoms(),
"each retained curved atom carries its selected smoothing strength"
);
assert_eq!(tier2.mean.len(), p, "the peeled residual mean spans P");
assert!(
tier2.term.atoms.iter().all(|atom| atom
.decoder_coefficients()
.iter()
.all(|value| value.is_finite())),
"every retained curved atom must carry finite decoder coefficients"
);
assert_eq!(
report.ledger.n_births, tier2.retained_atoms,
"every retained curved atom is one curved birth"
);
assert_eq!(
report.ledger.pc_reseed_events, 0,
"the support-sparse Tier-2 path must never PC-reseed"
);
assert!(
report.explained_variance.is_finite(),
"composed EV must be finite, got {}",
report.explained_variance
);
}
}