Commit fcc5958
Bound the bracket widening in xLARRB and xLARRJ so that a NaN matrix cannot hang xSTEMR
Before bisecting, xLARRB widens the initial interval [W-WERR, W+WERR]
until the Sturm count of the representation agrees with the eigenvalue
index, moving the endpoint by BACK and doubling BACK at every step. In
exact arithmetic that ends quickly, because the count is 0 below the
spectrum and N above it. A NaN pivot is never counted, so with a NaN
in the representation the count can stay short of the index and the
loop runs forever: xSTEMR, and through it xSTEVR, xSYEVR and xHEEVR
with RANGE = 'A', never return for a symmetric tridiagonal matrix with
a NaN in one of its first two rows. The loop also stalls when WERR is
exactly zero, which xLARRE produces for an eigenvalue that dqds returns
as exactly zero.
xLARRJ, which refines the eigenvalues by bisection on the matrix itself
when only eigenvalues are wanted, has the same two widening loops with
the same step and the same hang: xSTEMR with JOBZ = 'N' never returns
for the same matrices.
Start BACK at no less than the minimum interval width 2*PIVMIN, and
stop widening with INFO = 1 once BACK has overflowed, when no further
step can move the endpoint; a finite matrix never gets there, since
BACK passes the spectral diameter within MAXITR doublings. The xLARRB
callers already propagate a nonzero INFO (xLARRV returns -1, xLARRE
-4, xSTEMR 21 or 11) and the drivers then fall back to xSTEBZ and
xSTEIN; the one xLARRB call in xLARRV that ignored INFO now checks it
like the others, in all four precisions. xSTEMR never looked at the
INFO of xLARRJ; it now returns INFO = 3X for a failure there, next to
the documented 1X and 2X codes of xLARRE and xLARRV.
xCHKST gets the case as a regression test: after the size and type
loops it calls xSTEMR with RANGE = 'A' on a tridiagonal matrix whose
first diagonal entry is a NaN, once with JOBZ = 'V' and once with
JOBZ = 'N', so that both refinement paths are covered. Only a
negative INFO is reported as a failure; the test is that the call
returns at all. On the parent all four xeigtst binaries stop
responding there.
Over 100 NaN cases (DSTEMR, SSTEMR, DSYEVR, DSTEVR, ZHEEVR; five NaN
positions; n = 3, 5, 8, 20) the parent hangs in 60, this branch returns
in all of them; with JOBZ = 'N' (xSTEMR in all four precisions, five
NaN positions, n = 3, 5, 8, 20) the parent hangs in 48 of 80, this
branch returns INFO = 31 in every case that hung. 200 finite matrices
give bit-identical eigenvalues from DSTEMR on both, with JOBZ = 'V'
and with JOBZ = 'N'. The full LAPACK test suite passes: 5441941
LAPACK tests, 0 numerical errors, 0 other errors, 40 tests more than
the parent from the new calls.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>1 parent a6c6e74 commit fcc5958
16 files changed
Lines changed: 366 additions & 46 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
702 | 702 | | |
703 | 703 | | |
704 | 704 | | |
| 705 | + | |
| 706 | + | |
| 707 | + | |
| 708 | + | |
705 | 709 | | |
706 | 710 | | |
707 | 711 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
304 | 304 | | |
305 | 305 | | |
306 | 306 | | |
307 | | - | |
| 307 | + | |
| 308 | + | |
308 | 309 | | |
309 | | - | |
310 | | - | |
| 310 | + | |
| 311 | + | |
311 | 312 | | |
312 | 313 | | |
313 | 314 | | |
| |||
752 | 753 | | |
753 | 754 | | |
754 | 755 | | |
| 756 | + | |
| 757 | + | |
| 758 | + | |
| 759 | + | |
755 | 760 | | |
756 | 761 | | |
757 | 762 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
165 | 165 | | |
166 | 166 | | |
167 | 167 | | |
168 | | - | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
169 | 173 | | |
170 | 174 | | |
171 | 175 | | |
| |||
274 | 278 | | |
275 | 279 | | |
276 | 280 | | |
277 | | - | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
278 | 291 | | |
279 | 292 | | |
280 | 293 | | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
281 | 298 | | |
282 | 299 | | |
283 | 300 | | |
| |||
286 | 303 | | |
287 | 304 | | |
288 | 305 | | |
289 | | - | |
| 306 | + | |
290 | 307 | | |
291 | | - | |
292 | 308 | | |
293 | | - | |
294 | | - | |
295 | | - | |
296 | | - | |
297 | | - | |
| 309 | + | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
298 | 318 | | |
299 | 319 | | |
300 | 320 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
137 | 137 | | |
138 | 138 | | |
139 | 139 | | |
140 | | - | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
141 | 145 | | |
142 | 146 | | |
143 | 147 | | |
| |||
190 | 194 | | |
191 | 195 | | |
192 | 196 | | |
193 | | - | |
| 197 | + | |
194 | 198 | | |
195 | 199 | | |
196 | 200 | | |
| |||
249 | 253 | | |
250 | 254 | | |
251 | 255 | | |
252 | | - | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
253 | 266 | | |
254 | 267 | | |
255 | 268 | | |
| |||
260 | 273 | | |
261 | 274 | | |
262 | 275 | | |
263 | | - | |
264 | | - | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
265 | 282 | | |
266 | 283 | | |
267 | 284 | | |
268 | 285 | | |
269 | 286 | | |
270 | | - | |
| 287 | + | |
271 | 288 | | |
272 | 289 | | |
273 | 290 | | |
| |||
278 | 295 | | |
279 | 296 | | |
280 | 297 | | |
281 | | - | |
282 | | - | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
283 | 304 | | |
284 | 305 | | |
285 | 306 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
698 | 698 | | |
699 | 699 | | |
700 | 700 | | |
| 701 | + | |
| 702 | + | |
| 703 | + | |
| 704 | + | |
701 | 705 | | |
702 | 706 | | |
703 | 707 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
287 | 287 | | |
288 | 288 | | |
289 | 289 | | |
290 | | - | |
| 290 | + | |
| 291 | + | |
291 | 292 | | |
292 | | - | |
293 | | - | |
| 293 | + | |
| 294 | + | |
294 | 295 | | |
295 | 296 | | |
296 | 297 | | |
| |||
735 | 736 | | |
736 | 737 | | |
737 | 738 | | |
| 739 | + | |
| 740 | + | |
| 741 | + | |
| 742 | + | |
738 | 743 | | |
739 | 744 | | |
740 | 745 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
165 | 165 | | |
166 | 166 | | |
167 | 167 | | |
168 | | - | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
169 | 173 | | |
170 | 174 | | |
171 | 175 | | |
| |||
274 | 278 | | |
275 | 279 | | |
276 | 280 | | |
277 | | - | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
278 | 291 | | |
279 | 292 | | |
280 | 293 | | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
281 | 298 | | |
282 | 299 | | |
283 | 300 | | |
| |||
286 | 303 | | |
287 | 304 | | |
288 | 305 | | |
289 | | - | |
| 306 | + | |
290 | 307 | | |
291 | | - | |
292 | 308 | | |
293 | | - | |
294 | | - | |
295 | | - | |
296 | | - | |
297 | | - | |
| 309 | + | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
298 | 318 | | |
299 | 319 | | |
300 | 320 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
137 | 137 | | |
138 | 138 | | |
139 | 139 | | |
140 | | - | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
141 | 145 | | |
142 | 146 | | |
143 | 147 | | |
| |||
190 | 194 | | |
191 | 195 | | |
192 | 196 | | |
193 | | - | |
| 197 | + | |
194 | 198 | | |
195 | 199 | | |
196 | 200 | | |
| |||
249 | 253 | | |
250 | 254 | | |
251 | 255 | | |
252 | | - | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
253 | 266 | | |
254 | 267 | | |
255 | 268 | | |
| |||
260 | 273 | | |
261 | 274 | | |
262 | 275 | | |
263 | | - | |
264 | | - | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
265 | 282 | | |
266 | 283 | | |
267 | 284 | | |
268 | 285 | | |
269 | 286 | | |
270 | | - | |
| 287 | + | |
271 | 288 | | |
272 | 289 | | |
273 | 290 | | |
| |||
278 | 295 | | |
279 | 296 | | |
280 | 297 | | |
281 | | - | |
282 | | - | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
283 | 304 | | |
284 | 305 | | |
285 | 306 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
698 | 698 | | |
699 | 699 | | |
700 | 700 | | |
| 701 | + | |
| 702 | + | |
| 703 | + | |
| 704 | + | |
701 | 705 | | |
702 | 706 | | |
703 | 707 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
287 | 287 | | |
288 | 288 | | |
289 | 289 | | |
290 | | - | |
| 290 | + | |
| 291 | + | |
291 | 292 | | |
292 | | - | |
293 | | - | |
| 293 | + | |
| 294 | + | |
294 | 295 | | |
295 | 296 | | |
296 | 297 | | |
| |||
732 | 733 | | |
733 | 734 | | |
734 | 735 | | |
| 736 | + | |
| 737 | + | |
| 738 | + | |
| 739 | + | |
735 | 740 | | |
736 | 741 | | |
737 | 742 | | |
| |||
0 commit comments