Skip to content

LAPACK validation: the nonsymmetric EVD fixtures exceed the GET22-style residual threshold (4 dtypes) #112

Closed

Description

@shinaoka

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:

  • linalg::evd::lapack::{f32,f64,c32,c64}::lapack_nonsymmetric_evd_cases
  • linalg::evd::lapack::{f32,f64,c32,c64}::lapack_nonsymmetric_evd_parallel

Run on main 1ac38c6 (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").

Activity

  1. self-assigned this
    on Oct 29, 2026
  2. shinaoka commented on Oct 29, 2026

    @shinaoka
    MemberAuthor

    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.
    • After the fix in evd: scale the input into range as ?GEEV does (#112) #148, every non-graded series is at most 1.74× LAPACK. The two cells above 1.5× are at n = 16 with small absolute values.

    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:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions