You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
LAPACK validation: the nonsymmetric EVD fixtures exceed the GET22-style residual threshold (4 dtypes) #112
Known failure in the bounded LAPACK validation (docs/lapack-validation.md, family nonsymmetric_evd). Tracked so the nightly run can treat it as known instead of a new failure.
What fails
cargo test -p t4a-faer --lib -- --include-ignored --exact linalg::evd::lapack::f64::lapack_nonsymmetric_evd_cases and its parallel sibling, at all four dtypes:
Run on main1ac38c6 (evo, CARGO_PROFILE_DEV_DEBUG=0, CARGO_INCREMENTAL=0, 4 cores, scripts/run-lapack-validation.sh):
dtype
principal calls
call failures
diagnostics
f32
1776 (+24 parallel)
0
282 (+24)
f64
1776 (+24 parallel)
0
306 (+24)
c32
1776 (+24 parallel)
0
220 (+24)
c64
1776 (+24 parallel)
0
216 (+24)
Every call returns; the failures are GET22-style right/left eigenvector residual violations above the recorded threshold of 20, which is why the family exits non-zero. A size-129 tightly clustered f64 fixture was confirmed against an 80-decimal-digit computation (docs/lapack-validation.md, phase 2): native residual ratio 39.81 against a reference 39.76, so the residual is the library's, not the reference's.
What would close it
Either the residual comes down for those fixtures, or the family documents why the threshold should differ for them. Until then it is listed in scripts/lapack-known-failures.json under this issue, and a nightly run that fails there is not news.
Record: docs/lapack-validation.md (phases 2 and "Reproduction and scheduled operation").
Stage-by-stage comparison with LAPACK cgeev, as asked (2026-10-29).
Where the c32 gap comes from. On kinds 6/7 at n = 63-65, the Hessenberg backward error is the same with and without first scaling the matrix to unit size: 16-20. The complex Schur backward error is not: 226-258 as is, 67-93 scaled. ?GEEV scales its input into [smlnum, bignum] (smlnum = sqrt(safmin) / eps) before the reduction; faer's evd_imp did not.
Where the gap is more serious. I ran a 372-matrix sweep against LAPACK ?geev, over f32/f64/c32/c64, n = 16-257, and random, Grcar, near-Jordan and graded families, with scales up to the range limits.
Below the bound, the eigenvectors lost every digit. The ratio grew from about 2^-90 (32-bit), and at 2^-100 (32-bit) and 2^-960 (64-bit) and below it was 1e4 to 2e15, where LAPACK gives 2 to 70.
Upstream faer 0.24.4 returns NaN/inf eigenvectors with Ok there.
Fix: #148.evd_imp scales the input as ?GEEV does, by a power of two. The c32 LAPACK group now passes, so the known-failures entry is removed. The upstream record is upstream-reports/faer-028; nothing was posted upstream.
Separate defects found by the sweep, both also present in upstream 0.24.4:
Activity
ci: run the LAPACK validation nightly, with known failures carrying t…
evd: clamp the eigenvector back substitution relative to the eigenval…
evd: clamp the eigenvector back substitution relative to the eigenval…
evd: clamp the eigenvector back substitution relative to the eigenval…
evd: clamp the eigenvector back substitution relative to the eigenval…
upstream-reports: faer-003, the nonsymmetric EVD eigenvector residual…
upstream-reports: three defects that reproduce on upstream faer and p…
evd tests: the GET22 threshold grows like sqrt(n) (#112)
evd tests: the GET22 threshold grows like sqrt(n) (#112)
evd tests: the GET22 threshold grows like sqrt(n) (#112)
evd tests: the GET22 threshold grows like sqrt(n) (#112) (#127)
shinaoka commentedon Oct 29, 2026
Stage-by-stage comparison with LAPACK
cgeev, as asked (2026-10-29).Where the c32 gap comes from. On kinds 6/7 at n = 63-65, the Hessenberg backward error is the same with and without first scaling the matrix to unit size: 16-20. The complex Schur backward error is not: 226-258 as is, 67-93 scaled.
?GEEVscales its input into[smlnum, bignum](smlnum = sqrt(safmin) / eps) before the reduction; faer'sevd_impdid not.Where the gap is more serious. I ran a 372-matrix sweep against LAPACK
?geev, over f32/f64/c32/c64, n = 16-257, and random, Grcar, near-Jordan and graded families, with scales up to the range limits.2^-90(32-bit), and at2^-100(32-bit) and2^-960(64-bit) and below it was 1e4 to 2e15, where LAPACK gives 2 to 70.faer0.24.4 returns NaN/inf eigenvectors withOkthere.Fix: #148.
evd_impscales the input as?GEEVdoes, by a power of two. The c32 LAPACK group now passes, so the known-failures entry is removed. The upstream record isupstream-reports/faer-028; nothing was posted upstream.Separate defects found by the sweep, both also present in upstream 0.24.4:
evd: scale the input into range as ?GEEV does (#112)
upstream-reports, PATCHSET: the EVD input scaling (#112)
evd: pick the input scale from the largest |re| or |im| (#112 post-re…
evd: scale the input into range as ?GEEV does (#112)
upstream-reports, PATCHSET: the EVD input scaling (#112)
evd: pick the input scale from the largest |re| or |im| (#112 post-re…
PATCHSET: the nonsymmetric EVD fixes land together (#112, #144, #145)
evd: nonsymmetric EVD fixes — ?GEEV input scaling, AED sort terminati…
t4a-faer 0.26.0, t4a-faer-traits 0.24.2: release the changes since 0.…