use super::tests::*;
use super::*;
use gam_solve::rho_optimizer::OuterObjective;
use ndarray::{Array1, Array2, s};
fn ard_saddle_state() -> (SaeManifoldTerm, Array2<f64>, SaeManifoldRho) {
let (term, mut target, mut rho) = gamma_fd_tiny_fixture();
let (n, p) = (target.nrows(), target.ncols());
for row in 0..n {
for col in 0..p {
let phase = (row as f64 + 0.35) / n as f64;
let theta = std::f64::consts::TAU * phase;
target[[row, col]] += 0.6 * (3.0 * theta + 0.5 * col as f64).sin();
}
}
rho.log_lambda_sparse = -0.5;
for value in rho.log_lambda_smooth.iter_mut() {
*value = -1.0;
}
for axis in rho.log_ard.iter_mut() {
for value in axis.iter_mut() {
*value = -0.5;
}
}
(term, target, rho)
}
#[test]
pub(crate) fn e_attributable_ard_saddle_prices_finite_2336() {
let (mut term, target, rho) = ard_saddle_state();
let priced = term.penalized_quasi_laplace_criterion_with_cache(
target.view(),
&rho,
None,
40,
0.4,
1.0e-6,
1.0e-6,
);
assert!(
matches!(&priced, Ok((value, _, _)) if value.is_finite()),
"post E-attributability fix the ARD-wrinkle saddle must PRICE FINITE, not refuse; got: {:?}",
priced
.as_ref()
.map(|(value, _, _)| *value)
.map_err(|e| format!("{e:?}"))
);
let (term, target, rho) = ard_saddle_state();
let rho_flat = rho.to_flat();
let mut objective =
SaeManifoldOuterObjective::new(term, target, None, rho, 40, 0.4, 1.0e-6, 1.0e-6);
match objective.eval(&rho_flat) {
Ok(evaluation) => assert!(
evaluation.cost.is_finite(),
"an E-attributable saddle-ρ must price FINITE (was +inf refusal), got cost={}",
evaluation.cost
),
Err(err) => panic!(
"#2336: an E-attributable saddle-ρ must be a FINITE outer eval, not a fatal abort; \
got: {err}"
),
}
}
#[test]
fn priced_ard_direct_gradient_matches_fixed_state_value_2434() {
let (mut term, target, rho) = ard_saddle_state();
let (_value, loss, cache) = term
.penalized_quasi_laplace_criterion_with_cache(
target.view(),
&rho,
None,
40,
0.4,
1.0e-6,
1.0e-6,
)
.expect("canonical E-attributable saddle must produce a priced cache");
let total_t = cache.delta_t_len();
let a = term
.materialize_exact_hessian_dense(&rho, target.view(), &cache)
.expect("materialize exact A at the priced state");
let e_diag = term
.materialize_ard_concave_clamp_diagonal(&rho, &cache)
.expect("materialize the clamp-attribution diagonal");
let (eigs, vecs) =
SaeManifoldTerm::cluster_stable_eigh(&a, &e_diag, total_t).expect("stable exact-A eigh");
let max_eig = eigs.iter().copied().fold(f64::NEG_INFINITY, f64::max);
let floor = SaeManifoldTerm::SAE_EXACT_A_PD_FLOOR_REL * max_eig.max(1.0);
let switched = eigs
.iter()
.enumerate()
.filter(|(idx, lambda)| {
if **lambda >= -floor {
return false;
}
let v = vecs.column(*idx);
let e_v = (0..total_t)
.map(|row| e_diag[row] * v[row] * v[row])
.sum::<f64>();
**lambda + e_v >= -floor
})
.count();
assert!(
switched > 0,
"#2434 gate is invalid: the fixture contains no clamp-attributable switched direction"
);
let (analytic, _theta_adjoint) = term
.dense_exact_a_logdet_channels(target.view(), &rho, &loss, &cache)
.expect("complete priced exact-A derivative");
let fixed_state_priced_logdet =
|mut candidate: SaeManifoldTerm, at_rho: &SaeManifoldRho| -> f64 {
let (_criterion, _loss, at_cache) = candidate
.penalized_quasi_laplace_criterion_with_cache(
target.view(),
at_rho,
None,
0,
0.4,
1.0e-6,
1.0e-6,
)
.expect("fixed-state perturbed cache must remain on the priced stratum");
let (log_a, log_a_tt) = candidate
.exact_observed_information_log_dets(at_rho, target.view(), &at_cache)
.expect("fixed-state perturbed exact-A value");
0.5 * (log_a - log_a_tt)
};
let converged_term = term;
let h = 1.0e-5_f64;
let mut checked = 0usize;
let mut max_signal = 0.0_f64;
let mut worst_relative_error = 0.0_f64;
for atom in 0..rho.log_ard.len() {
for axis in 0..rho.log_ard[atom].len() {
let mut plus = rho.clone();
let mut minus = rho.clone();
plus.log_ard[atom][axis] += h;
minus.log_ard[atom][axis] -= h;
let value_plus = fixed_state_priced_logdet(converged_term.clone(), &plus);
let value_minus = fixed_state_priced_logdet(converged_term.clone(), &minus);
let finite_difference = (value_plus - value_minus) / (2.0 * h);
let index = rho.ard_flat_index(atom, axis);
let exact = analytic[index];
let scale = 1.0 + finite_difference.abs().max(exact.abs());
let relative_error = (finite_difference - exact).abs() / scale;
max_signal = max_signal.max(finite_difference.abs().max(exact.abs()));
worst_relative_error = worst_relative_error.max(relative_error);
eprintln!(
"#2434 priced ARD atom={atom} axis={axis}: analytic={exact:.12e} \
fd={finite_difference:.12e} scaled_error={relative_error:.3e}"
);
checked += 1;
}
}
assert!(checked > 0, "#2434 gate found no ARD coordinates");
assert!(
max_signal > 1.0e-6,
"#2434 gate is not load-bearing: every priced ARD derivative is numerically zero"
);
assert!(
worst_relative_error <= 1.0e-4,
"priced exact-A analytic derivative disagrees with the fixed-state central \
difference of its value: worst scaled error {worst_relative_error:.3e}"
);
}
#[test]
fn genuine_saddle_is_infeasible_probe_not_fatal_2336() {
let (mut term, target, rho) = super::tests_logdet_adjoint_780::obb_patchd_fixture(0.02, -6.0);
let refusal = term.penalized_quasi_laplace_criterion_with_cache(
target.view(),
&rho,
None,
40,
0.4,
1.0e-6,
1.0e-6,
);
assert!(
matches!(
refusal,
Err(SaeCriterionError::IndefiniteObservedInformation { block }) if block == "joint"
),
"the genuine (non-E-attributable) saddle specimen must refuse on the joint block; got: {:?}",
refusal.map(|(value, _, _)| value)
);
let (term, target, rho) = super::tests_logdet_adjoint_780::obb_patchd_fixture(0.02, -6.0);
let rho_flat = rho.to_flat();
let mut objective =
SaeManifoldOuterObjective::new(term, target, None, rho, 40, 0.4, 1.0e-6, 1.0e-6);
match objective.eval(&rho_flat) {
Ok(evaluation) => assert!(
evaluation.cost.is_infinite() && evaluation.cost.is_sign_positive(),
"a genuine saddle-ρ must price as +inf infeasible, got cost={}",
evaluation.cost
),
Err(err) => panic!(
"#2336: a genuine indefinite exact A must be an INFEASIBLE probe the outer solver \
can backtrack from, not a fatal abort; got: {err}"
),
}
}
#[test]
fn zz_measure_best_seen_classification_2228() {
let (mut term, target, rho) = ard_saddle_state();
let result = term.penalized_quasi_laplace_criterion_with_cache(
target.view(),
&rho,
None,
40,
0.4,
1.0e-6,
1.0e-6,
);
match result {
Ok((value, _, cache)) => {
let a = term
.materialize_exact_hessian_dense(&rho, target.view(), &cache)
.expect("materialize A at certified best-seen mode");
let e_diag = term
.materialize_ard_concave_clamp_diagonal(&rho, &cache)
.expect("ARD concave-clamp diagonal at the certified mode");
let total_t = cache.delta_t_len();
let (eigs, vecs) = SaeManifoldTerm::cluster_stable_eigh(&a, &e_diag, total_t)
.expect("A eigendecomposition (gate-identical clustering)");
let min_eig = eigs.iter().copied().fold(f64::INFINITY, f64::min);
let max_eig = eigs.iter().copied().fold(f64::NEG_INFINITY, f64::max);
let floor = SaeManifoldTerm::SAE_EXACT_A_PD_FLOOR_REL * max_eig.max(1.0);
eprintln!(
"2228-MEASURE: Ok(value={value:.9e}) certified; min_eig={min_eig:.6e} \
max_eig={max_eig:.6e} floor={floor:.6e}"
);
for (idx, &lambda) in eigs.iter().enumerate() {
if lambda >= -floor {
continue;
}
let v = vecs.column(idx);
let limit = total_t.min(v.len());
let e_v: f64 = (0..limit).map(|j| e_diag[j] * v[j] * v[j]).sum();
let basin = lambda + e_v;
eprintln!(
"2228-MEASURE: dir {idx}: lambda={lambda:.6e} vEv={e_v:.6e} \
basin={basin:.6e} vs -floor={:.6e} => {}",
-floor,
if basin < -floor {
"GENUINE SADDLE (would refuse)"
} else {
"clamp-attributable (priced at basin)"
}
);
}
}
Err(err) => eprintln!("2228-MEASURE: Err({err:?}) => plateau above band (solver stall)"),
}
}
#[test]
fn zz_measure_saddle_escape_linesearch_reconverge_2336() {
use super::{FaerEigh, Side};
let (mut term, target, rho) = ard_saddle_state();
let inner_max_iter = 40usize;
let learning_rate = 0.4;
let ridge_ext_coord = 1.0e-6;
let ridge_beta = 1.0e-6;
let mut rho_fixed = rho.clone();
let initial = term
.run_joint_fit_arrow_schur_for_quasi_laplace(
target.view(),
&mut rho_fixed,
None,
inner_max_iter,
learning_rate,
ridge_ext_coord,
ridge_beta,
)
.expect("initial joint fit to seed the inner state");
let mut loss = initial.loss;
let mut criterion_fixed_point = initial.fixed_point;
let options = ArrowSolveOptions::direct()
.with_gpu_policy(term.gpu_policy)
.with_newton_schur_tikhonov(gam_solve::arrow_schur::SPECTRAL_DEFLATION_REL_FLOOR)
.with_evidence_unit_deflation(gam_solve::arrow_schur::SPECTRAL_DEFLATION_REL_FLOOR);
let mut cache = term
.converge_inner_for_undamped_logdet(
target.view(),
&rho,
&mut rho_fixed,
None,
inner_max_iter,
learning_rate,
ridge_ext_coord,
ridge_beta,
&mut loss,
&mut criterion_fixed_point,
&options,
true,
)
.expect("converge inner to the undamped-logdet optimum (saddle)");
for iter in 0..3usize {
let total_t = cache.delta_t_len();
let a = term
.materialize_exact_hessian_dense(&rho, target.view(), &cache)
.expect("materialize exact A");
let (eigs, vecs) = a.eigh(Side::Lower).expect("A eigh");
let max_eig = eigs.iter().copied().fold(f64::NEG_INFINITY, f64::max);
let mut min_idx = 0usize;
let mut min_eig = f64::INFINITY;
for (i, &v) in eigs.iter().enumerate() {
if v < min_eig {
min_eig = v;
min_idx = i;
}
}
let n_neg = eigs.iter().filter(|&&v| v < 0.0).count();
let obj0 = term
.penalized_objective_total(target.view(), &rho, None, 1.0)
.expect("penalized objective at mode");
let reclass = term.exact_observed_information_log_dets(&rho, target.view(), &cache);
eprintln!(
"2336-ITER{iter}: MODE obj={obj0:.9e} min_eig={min_eig:.6e} max_eig={max_eig:.6e} n_neg={n_neg} reclass={}",
match &reclass {
Ok(_) => "Ok(accepted)".to_string(),
Err(e) => format!("Err({e:?})"),
}
);
let floor = 1.0e-9 * max_eig.max(1.0);
if min_eig >= -floor {
eprintln!(
"2336-ITER{iter}: ACCEPTED — exact A is PD within the criterion floor; escaped"
);
break;
}
let dir = vecs.column(min_idx);
let dir_t = dir.slice(s![..total_t]).to_owned();
let dir_beta = dir.slice(s![total_t..]).to_owned();
let snapshot = term.snapshot_mutable_state();
let mut best: (f64, f64, bool) = (obj0, 0.0, false);
for negate in [false, true] {
let dt = if negate { -&dir_t } else { dir_t.clone() };
let db = if negate { -&dir_beta } else { dir_beta.clone() };
let mut s = 1.0e-3;
while s <= 0.6 {
term.apply_newton_step(dt.view(), db.view(), s)
.expect("line-search trial step");
let cand = term
.penalized_objective_total(target.view(), &rho, None, 1.0)
.expect("line-search objective");
term.restore_mutable_state(&snapshot)
.expect("restore after line-search trial");
if cand.is_finite() && cand < best.0 {
best = (cand, s, negate);
}
s *= 1.4;
}
}
let (obj_min, s_min, negate) = best;
eprintln!(
"2336-ITER{iter}: LINESEARCH s_min={s_min:.6e} negate={negate} obj_min={obj_min:.9e} dL={:.6e} (predicted ½s²|λ|={:.6e})",
obj_min - obj0,
0.5 * s_min * s_min * min_eig.abs()
);
if s_min == 0.0 || !(obj_min < obj0) {
eprintln!(
"2336-ITER{iter}: NO DESCENT along ±v at any tried s — escape structurally unavailable"
);
break;
}
let dt = if negate { -&dir_t } else { dir_t.clone() };
let db = if negate { -&dir_beta } else { dir_beta.clone() };
term.apply_newton_step(dt.view(), db.view(), s_min)
.expect("commit line-search step");
let obj_stepped = term
.penalized_objective_total(target.view(), &rho, None, 1.0)
.expect("objective after step");
cache = term
.converge_inner_for_undamped_logdet(
target.view(),
&rho,
&mut rho_fixed,
None,
inner_max_iter,
learning_rate,
ridge_ext_coord,
ridge_beta,
&mut loss,
&mut criterion_fixed_point,
&options,
true,
)
.expect("re-converge after escape step");
let obj_reconv = term
.penalized_objective_total(target.view(), &rho, None, 1.0)
.expect("objective after re-convergence");
eprintln!(
"2336-ITER{iter}: STEPPED obj={obj_stepped:.9e} (dL_step={:.6e}) -> RECONV obj={obj_reconv:.9e} (dL_reconv={:.6e})",
obj_stepped - obj0,
obj_reconv - obj_stepped
);
}
let a = term
.materialize_exact_hessian_dense(&rho, target.view(), &cache)
.expect("materialize final A");
let (eigs, _) = a.eigh(Side::Lower).expect("final A eigh");
let min_eig = eigs.iter().copied().fold(f64::INFINITY, f64::min);
let max_eig = eigs.iter().copied().fold(f64::NEG_INFINITY, f64::max);
let n_neg = eigs.iter().filter(|&&v| v < 0.0).count();
let obj_final = term
.penalized_objective_total(target.view(), &rho, None, 1.0)
.expect("final objective");
let reclass = term.exact_observed_information_log_dets(&rho, target.view(), &cache);
eprintln!(
"2336-FINAL: obj={obj_final:.9e} min_eig={min_eig:.6e} max_eig={max_eig:.6e} n_neg={n_neg} now_pd_accepted={}",
reclass.is_ok()
);
}
#[test]
fn zz_measure_saddle_gate_desync_2336() {
use super::{FaerEigh, Side};
let inner_max_iter = 40usize;
let learning_rate = 0.4;
let ridge_ext_coord = 1.0e-6;
let ridge_beta = 1.0e-6;
let reach_saddle = |term: &mut SaeManifoldTerm,
target: &Array2<f64>,
rho: &SaeManifoldRho|
-> (
ArrowFactorCache,
SaeManifoldRho,
SaeManifoldLoss,
bool,
ArrowSolveOptions,
) {
let mut rho_fixed = rho.clone();
let initial = term
.run_joint_fit_arrow_schur_for_quasi_laplace(
target.view(),
&mut rho_fixed,
None,
inner_max_iter,
learning_rate,
ridge_ext_coord,
ridge_beta,
)
.expect("initial joint fit");
let mut loss = initial.loss;
let mut criterion_fixed_point = initial.fixed_point;
let options = ArrowSolveOptions::direct()
.with_gpu_policy(term.gpu_policy)
.with_newton_schur_tikhonov(gam_solve::arrow_schur::SPECTRAL_DEFLATION_REL_FLOOR)
.with_evidence_unit_deflation(gam_solve::arrow_schur::SPECTRAL_DEFLATION_REL_FLOOR);
let cache = term
.converge_inner_for_undamped_logdet(
target.view(),
rho,
&mut rho_fixed,
None,
inner_max_iter,
learning_rate,
ridge_ext_coord,
ridge_beta,
&mut loss,
&mut criterion_fixed_point,
&options,
true,
)
.expect("converge inner to saddle");
(cache, rho_fixed, loss, criterion_fixed_point, options)
};
let neg_dir = |term: &SaeManifoldTerm,
target: &Array2<f64>,
rho: &SaeManifoldRho,
cache: &ArrowFactorCache|
-> (f64, Array1<f64>, Array1<f64>) {
let total_t = cache.delta_t_len();
let a = term
.materialize_exact_hessian_dense(rho, target.view(), cache)
.expect("materialize A");
let (eigs, vecs) = a.eigh(Side::Lower).expect("eigh");
let mut min_idx = 0usize;
let mut min_eig = f64::INFINITY;
for (i, &v) in eigs.iter().enumerate() {
if v < min_eig {
min_eig = v;
min_idx = i;
}
}
let dir = vecs.column(min_idx);
(
min_eig,
dir.slice(s![..total_t]).to_owned(),
dir.slice(s![total_t..]).to_owned(),
)
};
let line_search = |term: &mut SaeManifoldTerm,
target: &Array2<f64>,
rho: &SaeManifoldRho,
dir_t: &Array1<f64>,
dir_beta: &Array1<f64>,
obj0: f64|
-> (f64, f64, bool) {
let snapshot = term.snapshot_mutable_state();
let mut best = (obj0, 0.0f64, false);
for negate in [false, true] {
let dt = if negate { -dir_t } else { dir_t.clone() };
let db = if negate { -dir_beta } else { dir_beta.clone() };
let mut s = 1.0e-3;
while s <= 0.6 {
term.apply_newton_step(dt.view(), db.view(), s)
.expect("trial");
let cand = term
.penalized_objective_total(target.view(), rho, None, 1.0)
.expect("trial obj");
term.restore_mutable_state(&snapshot).expect("restore");
if cand.is_finite() && cand < best.0 {
best = (cand, s, negate);
}
s *= 1.4;
}
}
best
};
{
let (mut term, target, rho) = ard_saddle_state();
let (cache, _rf, _loss, _cfp, _opts) = reach_saddle(&mut term, &target, &rho);
term.refresh_decoder_repulsion_gate();
term.refresh_barrier_coactivation_gate();
term.streaming_gates_frozen = true;
let (min_eig, dir_t, dir_beta) = neg_dir(&term, &target, &rho, &cache);
let obj_saddle = term
.penalized_objective_total(target.view(), &rho, None, 1.0)
.expect("obj saddle frozen");
let (obj_min, s_min, negate) =
line_search(&mut term, &target, &rho, &dir_t, &dir_beta, obj_saddle);
let dt = if negate { -&dir_t } else { dir_t.clone() };
let db = if negate { -&dir_beta } else { dir_beta.clone() };
term.apply_newton_step(dt.view(), db.view(), s_min)
.expect("step");
let obj_stepped_frozen = term
.penalized_objective_total(target.view(), &rho, None, 1.0)
.expect("obj stepped frozen");
term.refresh_decoder_repulsion_gate();
term.refresh_barrier_coactivation_gate();
let obj_stepped_refreshed = term
.penalized_objective_total(target.view(), &rho, None, 1.0)
.expect("obj stepped refreshed");
eprintln!(
"2336-GATESHIFT: min_eig={min_eig:.6e} s_min={s_min:.4e} negate={negate} \
obj_saddle={obj_saddle:.9e} obj_min(ls)={obj_min:.9e} dL_step={:.6e} | \
obj_stepped_frozen={obj_stepped_frozen:.9e} obj_stepped_refreshed={obj_stepped_refreshed:.9e} \
GATE_SHIFT={:.6e}",
obj_stepped_frozen - obj_saddle,
obj_stepped_refreshed - obj_stepped_frozen
);
}
{
let (mut term, target, rho) = ard_saddle_state();
let (cache, mut rho_fixed, mut loss, mut cfp, options) =
reach_saddle(&mut term, &target, &rho);
term.refresh_decoder_repulsion_gate();
term.refresh_barrier_coactivation_gate();
term.streaming_gates_frozen = true;
let (min_eig, dir_t, dir_beta) = neg_dir(&term, &target, &rho, &cache);
let obj_saddle = term
.penalized_objective_total(target.view(), &rho, None, 1.0)
.expect("obj saddle frozen B");
let (_om, s_min, negate) =
line_search(&mut term, &target, &rho, &dir_t, &dir_beta, obj_saddle);
let dt = if negate { -&dir_t } else { dir_t.clone() };
let db = if negate { -&dir_beta } else { dir_beta.clone() };
term.apply_newton_step(dt.view(), db.view(), s_min)
.expect("step B");
let obj_stepped = term
.penalized_objective_total(target.view(), &rho, None, 1.0)
.expect("obj stepped B");
let cache2 = term
.converge_inner_for_undamped_logdet(
target.view(),
&rho,
&mut rho_fixed,
None,
inner_max_iter,
learning_rate,
ridge_ext_coord,
ridge_beta,
&mut loss,
&mut cfp,
&options,
true,
)
.expect("re-converge frozen B");
let obj_reconv = term
.penalized_objective_total(target.view(), &rho, None, 1.0)
.expect("obj reconv B");
let a = term
.materialize_exact_hessian_dense(&rho, target.view(), &cache2)
.expect("materialize A B");
let (eigs, _) = a.eigh(Side::Lower).expect("eigh B");
let min_eig2 = eigs.iter().copied().fold(f64::INFINITY, f64::min);
let n_neg2 = eigs.iter().filter(|&&v| v < 0.0).count();
eprintln!(
"2336-FROZENRECONV: min_eig0={min_eig:.6e} s_min={s_min:.4e} negate={negate} \
obj_saddle={obj_saddle:.9e} obj_stepped={obj_stepped:.9e} (dL_step={:.6e}) \
obj_reconv={obj_reconv:.9e} (dL_reconv={:.6e}) min_eig_reconv={min_eig2:.6e} n_neg_reconv={n_neg2}",
obj_stepped - obj_saddle,
obj_reconv - obj_stepped
);
eprintln!(
"2336-FROZENVERDICT: with gates held frozen-consistent, re-convergence dL={:.6e} \
(v2 unfrozen was +1.25e-4 CLIMB). climb_removed={}",
obj_reconv - obj_stepped,
(obj_reconv - obj_stepped) < 1.0e-4
);
}
}
#[test]
fn zz_measure_e_attributability_2336() {
use super::{FaerEigh, Side};
let (mut term, target, rho) = ard_saddle_state();
let inner_max_iter = 40usize;
let learning_rate = 0.4;
let ridge_ext_coord = 1.0e-6;
let ridge_beta = 1.0e-6;
let mut rho_fixed = rho.clone();
let initial = term
.run_joint_fit_arrow_schur_for_quasi_laplace(
target.view(),
&mut rho_fixed,
None,
inner_max_iter,
learning_rate,
ridge_ext_coord,
ridge_beta,
)
.expect("initial joint fit");
let mut loss = initial.loss;
let mut criterion_fixed_point = initial.fixed_point;
let options = ArrowSolveOptions::direct()
.with_gpu_policy(term.gpu_policy)
.with_newton_schur_tikhonov(gam_solve::arrow_schur::SPECTRAL_DEFLATION_REL_FLOOR)
.with_evidence_unit_deflation(gam_solve::arrow_schur::SPECTRAL_DEFLATION_REL_FLOOR);
let cache = term
.converge_inner_for_undamped_logdet(
target.view(),
&rho,
&mut rho_fixed,
None,
inner_max_iter,
learning_rate,
ridge_ext_coord,
ridge_beta,
&mut loss,
&mut criterion_fixed_point,
&options,
true,
)
.expect("converge inner to saddle");
let total_t = cache.delta_t_len();
let a = term
.materialize_exact_hessian_dense(&rho, target.view(), &cache)
.expect("materialize exact A");
let (eigs, vecs) = a.eigh(Side::Lower).expect("A eigh");
let max_eig = eigs.iter().copied().fold(f64::NEG_INFINITY, f64::max);
let floor = 1.0e-9 * max_eig.max(1.0);
let e_diag = term
.materialize_ard_concave_clamp_diagonal(&rho, &cache)
.expect("materialize E_ard diagonal");
eprintln!(
"2336-EATTR: total_t={total_t} beta={} max_eig={max_eig:.6e} floor={floor:.3e} E_diag_sum={:.6e} E_diag_max={:.6e}",
cache.k,
e_diag.iter().sum::<f64>(),
e_diag.iter().copied().fold(f64::NEG_INFINITY, f64::max)
);
let mut n_neg = 0usize;
let mut all_attributable = true;
for (i, &lambda) in eigs.iter().enumerate() {
if lambda >= -floor {
continue;
}
n_neg += 1;
let v = vecs.column(i);
let mut e_v = 0.0_f64;
for j in 0..total_t {
e_v += e_diag[j] * v[j] * v[j];
}
let v_t = v.slice(s![..total_t]).to_owned();
let v_beta = v.slice(s![total_t..]).to_owned();
let dc = term
.apply_exact_hessian_minus_b(
&rho,
target.view(),
&cache,
&SaeArrowVector {
t: v_t.clone(),
beta: v_beta.clone(),
},
)
.expect("apply ΔC");
let vt_dc = v_t.dot(&dc.t) + v_beta.dot(&dc.beta);
let t_frac = (0..total_t).map(|j| v[j] * v[j]).sum::<f64>();
let priced = lambda + e_v;
let attributable = priced >= -floor;
if !attributable {
all_attributable = false;
}
eprintln!(
"2336-EATTR: neg#{n_neg} lambda={lambda:.6e} e_v(ARD)={e_v:.6e} lambda+e_v={priced:.6e} \
attributable={attributable} | full(B-A)v.v={:.6e} t_frac={t_frac:.4e}",
-vt_dc
);
}
eprintln!(
"2336-EATTR: VERDICT n_neg={n_neg} all_attributable={all_attributable} \
=> fixture criterion would be {}",
if all_attributable {
"FINITE (priced)"
} else {
"STILL REFUSED (genuine saddle remains)"
}
);
}