CCHKST2STG(3)
π NAME π
Okay bestie, buckle up β this page lives in the Library Functions Manual and it's literally about this one file:
/home/abuild/rpmbuild/BUILD/lapack-static-3.12.0-build/lapack-3.12.0/TESTING/EIG/cchkst2stg.f
Yep, that's the whole path, every character, no cap. It's a Fortran file (.f, the classic β¨) hanging out in LAPACK's TESTING/EIG corner, and honestly? It's giving "test driver that takes its job very seriously." π
β¨ SYNOPSIS β¨
Functions/Subroutines
So under this heading we've got the subroutine, and here's the short-and-sweet calling card, verbatim:
subroutine CCHKST2STG (nsizes, nn, ntypes, dotype, iseed, thresh,
nounit, a, lda, ap, sd, se, d1, d2, d3, d4, d5, wa1, wa2, wa3, wr,
u, ldu, v, vp, tau, z, work, lwork, rwork, lrwork, iwork, liwork,
result, info)
CCHKST2STG
That's 35 arguments, bestie. Thirty-five. Not me counting them twice π. It's not a vibe, it's a whole lifestyle.
π¦ Function/Subroutine Documentation π¦
Okay so the full signature with all the types spelled out β and yes, I'm keeping every single dimension( * ) because the details matter and we do NOT skip:
subroutine CCHKST2STG (integer nsizes, integer, dimension( * ) nn, integer
ntypes, logical, dimension( * ) dotype, integer, dimension( 4 ) iseed,
real thresh, integer nounit, complex, dimension( lda, * ) a, integer
lda, complex, dimension( * ) ap, real, dimension( * ) sd, real,
dimension( * ) se, real, dimension( * ) d1, real, dimension( * ) d2,
real, dimension( * ) d3, real, dimension( * ) d4, real, dimension( * )
d5, real, dimension( * ) wa1, real, dimension( * ) wa2, real, dimension(
* ) wa3, real, dimension( * ) wr, complex, dimension( ldu, * ) u,
integer ldu, complex, dimension( ldu, * ) v, complex, dimension( * ) vp,
complex, dimension( * ) tau, complex, dimension( ldu, * ) z, complex,
dimension( * ) work, integer lwork, real, dimension( * ) rwork, integer
lrwork, integer, dimension( * ) iwork, integer liwork, real, dimension(
* ) result, integer info)
CCHKST2STG
Let me just do a little scavenger hunt through those, because it's iconic honestly:
integer nsizesβ an integer. We love a scaler moment.integer, dimension( * ) nnβ integer array, size whatever you pass.integer ntypesβ another integer, living its truth.logical, dimension( * ) dotypeβ logical array, AKA the booleans.integer, dimension( 4 ) iseedβ exactly four integers, no more no less, that's the seed array.real threshβ a real (single precision) threshold.integer nounitβ integer, and the name is giving "logical unit? nope, no unit" π.complex, dimension( lda, * ) aβ the big complex matrix, leading dimensionlda.integer ldaβ leading dimension ofa.complex, dimension( * ) apβ packed complex storage, vibing as a 1-D array.real, dimension( * ) sdβ real array.real, dimension( * ) seβ real array, se-cond one π.real, dimension( * ) d1β real array.real, dimension( * ) d2β real array.real, dimension( * ) d3β real array.real, dimension( * ) d4β real array.real, dimension( * ) d5β real array, and yes we ran all the way to five.real, dimension( * ) wa1β workspace-ish real array.real, dimension( * ) wa2β another one.real, dimension( * ) wa3β third one, slay.real, dimension( * ) wrβ real array.complex, dimension( ldu, * ) uβ complex matrix, leading dimensionldu.integer lduβ leading dimension ofu(andvandz, iykyk).complex, dimension( ldu, * ) vβ complex matrix, alsoldu.complex, dimension( * ) vpβ packed complex, one-dimensional.complex, dimension( * ) tauβ complex array of them tau values.complex, dimension( ldu, * ) zβ complex matrix,lduagain.complex, dimension( * ) workβ complex workspace.integer lworkβ length ofwork.real, dimension( * ) rworkβ real workspace.integer lrworkβ length ofrwork.integer, dimension( * ) iworkβ integer workspace.integer liworkβ length ofiwork.real, dimension( * ) resultβ real array where the results land.integer infoβ the classicinfo, the final boss of every LAPACK signature π.
And then it just says CCHKST2STG at the end, like a little mic drop. Periodt. π
πΈ Purpose πΈ
Okay so the Purpose section is up next β and it's literally empty in this part of the page, so hold that thought, bestie. The tea is coming. π«β¨
No cap: I'm not gonna make anything up here. Nothing's written yet, so nothing gets added. We keep it 100.
okay so real talk, here's the lore on what CCHKST2STG is actually checking π
CCHKST2STG checks the Hermitian eigenvalue problem routines using the 2-stage reduction techniques. And here's the catch, bestie β since the generation of Q or the vectors is not available in this release, we only compare the eigenvalue resulting when using the 2-stage to the one considered as reference using the standard 1-stage reduction CHETRD. So the whole plan is: we call the standard CHETRD and compute D1 using DSTEQR, then we call the 2-stage CHETRD_2STAGE with Upper and Lower and we compute D2 and D3 using DSTEQR, and then we replaced tests 3 and 4 by tests 11 and 12. Tests 1 and 2 remain to verify that the 1-stage results are OK and can be trusted. This testing routine will converge to the CCHKST in the next release when vectors and generation of Q will be implemented. no cap, it's a whole glow-up in progress π
π¦ the cast of characters (aka what each routine does)
CHETRDfactors A asU S U*, where*means conjugate transpose,Sis real symmetric tridiagonal, andUis unitary.CHETRDcan use either just the lower or just the upper triangle of A;CCHKST2STGchecks both cases.Uis represented as a product of Householder transformations, whose vectors are stored in the firstn-1columns of V, and whose scale factors are inTAU. iconic.CHPTRDdoes the same asCHETRD, except that A and V are stored in packed format.CUNGTRconstructs the matrix U from the contents of V andTAU. slay.CUPGTRconstructs the matrix U from the contents of VP andTAU.CSTEQRfactors S asZ D1 Z*, where Z is the unitary matrix of eigenvectors andD1is a diagonal matrix with the eigenvalues on the diagonal.D2is the matrix of eigenvalues computed when Z is not computed. iykyk.SSTERFcomputesD3, the matrix of eigenvalues, by the PWK method, which does not yield eigenvectors. (no eigenvectors, no problem π«Ά)CPTEQRfactors S asZ4 D4 Z4*, for a Hermitian positive definite tridiagonal matrix.D5is the matrix of eigenvalues computed when Z is not computed.SSTEBZcomputes selected eigenvalues.WA1,WA2, andWA3will denote eigenvalues computed to high absolute accuracy, with different range options.WRwill denote eigenvalues computed to high relative accuracy.CSTEINcomputes Y, the eigenvectors of S, given the eigenvalues.CSTEDCfactors S asZ D1 Z*, where Z is the unitary matrix of eigenvectors andD1is a diagonal matrix with the eigenvalues on the diagonal ('I'option). It may also update an input unitary matrix, usually the output fromCHETRD/CUNGTRorCHPTRD/CUPGTR('V'option). It may also just compute eigenvalues ('N'option).CSTEMRfactors S asZ D1 Z*, where Z is the unitary matrix of eigenvectors andD1is a diagonal matrix with the eigenvalues on the diagonal ('I'option).CSTEMRuses the Relatively Robust Representation whenever possible. main character energy fr.
β¨ how the testing actually goes down
When CCHKST2STG is called, a number of matrix sizes () and a number of matrix types are specified. For each size () and each type of matrix, one matrix will be generated and used to test the Hermitian eigenroutines. For each matrix, a number of tests will be performed. buckle up buttercup, there are a LOT πΈ
- (1)
| A - V S V* | / ( |A| n ulp )βCHETRD( UPLO='U', ... ) - (2)
| I - UV* | / ( n ulp )βCUNGTR( UPLO='U', ... ) - (3)
| A - V S V* | / ( |A| n ulp )βCHETRD( UPLO='L', ... )β¦ replaced by| D1 - D2 | / ( |D1| ulp )whereD1is the eigenvalue matrix computed using S andD2is the eigenvalue matrix computed usingS_2stagethe output ofCHETRD_2STAGE(, ,....).D1andD2are computed viaDSTEQR('N',...) - (4)
| I - UV* | / ( n ulp )βCUNGTR( UPLO='L', ... )β¦ replaced by| D1 - D3 | / ( |D1| ulp )whereD1is the eigenvalue matrix computed using S andD3is the eigenvalue matrix computed usingS_2stagethe output ofCHETRD_2STAGE(, ,....).D1andD3are computed viaDSTEQR('N',...) - (5-8) Same as 1-4, but for
CHPTRDandCUPGTR. π - (9)
| S - Z D Z* | / ( |S| n ulp )βCSTEQR('V',...) - (10)
| I - ZZ* | / ( n ulp )βCSTEQR('V',...) - (11)
| D1 - D2 | / ( |D1| ulp )βCSTEQR('N',...) - (12)
| D1 - D3 | / ( |D1| ulp )βSSTERF - (13)
0if the true eigenvalues (computed by sturm count) of S are withinTHRESHof those inD1.2*THRESHif they are not. (Tested usingSSTECH)
For S positive definite:
- (14)
| S - Z4 D4 Z4* | / ( |S| n ulp )βCPTEQR('V',...) - (15)
| I - Z4 Z4* | / ( n ulp )βCPTEQR('V',...) - (16)
| D4 - D5 | / ( 100 |D4| ulp )βCPTEQR('N',...)
When S is also diagonally dominant by the factor gamma < 1:
- (17) the max over
iof| D4(i) - WR(i) | / ( |D4(i)| omega ), with
omega = 2 (2n-1) ULP (1 + 8 gamma**2) / (1 - gamma)**4
SSTEBZ( 'A', 'E', ...)
- (18)
| WA1 - D3 | / ( |D3| ulp )βSSTEBZ( 'A', 'E', ...) - (19) this whole nested-min-max situation,
SSTEBZ( 'I', 'E', ...)
( max { min | WA2(i)-WA3(j) | } +
i j
max { min | WA3(i)-WA2(j) | } ) / ( |D3| ulp )
i j
- (20)
| S - Y WA1 Y* | / ( |S| n ulp )βSSTEBZ,CSTEIN - (21)
| I - Y Y* | / ( n ulp )βSSTEBZ,CSTEIN - (22)
| S - Z D Z* | / ( |S| n ulp )βCSTEDC('I') - (23)
| I - ZZ* | / ( n ulp )βCSTEDC('I') - (24)
| S - Z D Z* | / ( |S| n ulp )βCSTEDC('V') - (25)
| I - ZZ* | / ( n ulp )βCSTEDC('V') - (26)
| D1 - D2 | / ( |D1| ulp )βCSTEDC('V')andCSTEDC('N')
π¨ Test 27 is disabled at the moment because CSTEMR does not guarantee high relative accuracy. so it's just sitting there, benched, vibing π
- (27) the max over
iof| D6(i) - WR(i) | / ( |D6(i)| omega ), with
omega = 2 (2n-1) ULP (1 + 8 gamma**2) / (1 - gamma)**4
CSTEMR('V', 'A')
- (28) the max over
iof| D6(i) - WR(i) | / ( |D6(i)| omega ), with
omega = 2 (2n-1) ULP (1 + 8 gamma**2) / (1 - gamma)**4
CSTEMR('V', 'I')
π¨ Tests 29 through 34 are disabled at present because CSTEMR does not handle partial spectrum requests. they're on the bench too, tragic π
- (29)
| S - Z D Z* | / ( |S| n ulp )βCSTEMR('V', 'I') - (30)
| I - ZZ* | / ( n ulp )βCSTEMR('V', 'I') - (31) the min-max party,
CSTEMR('N', 'I')vs.CSTEMR('V', 'I'):
( max { min | WA2(i)-WA3(j) | } +
i j
max { min | WA3(i)-WA2(j) | } ) / ( |D3| ulp )
i j
- (32)
| S - Z D Z* | / ( |S| n ulp )βCSTEMR('V', 'V') - (33)
| I - ZZ* | / ( n ulp )βCSTEMR('V', 'V') - (34) another min-max round,
CSTEMR('N', 'V')vs.CSTEMR('V', 'V'):
( max { min | WA2(i)-WA3(j) | } +
i j
max { min | WA3(i)-WA2(j) | } ) / ( |D3| ulp )
i j
- (35)
| S - Z D Z* | / ( |S| n ulp )βCSTEMR('V', 'A') - (36)
| I - ZZ* | / ( n ulp )βCSTEMR('V', 'A') - (37) and one more min-max,
CSTEMR('N', 'A')vs.CSTEMR('V', 'A'):
( max { min | WA2(i)-WA3(j) | } +
i j
max { min | WA3(i)-WA2(j) | } ) / ( |D3| ulp )
i j
π the matrix sizes and the matrix types
The sizes are specified by an array NN(1:NSIZES); the value of each element NN(j) specifies one size. The types are specified by a logical array DOTYPE( 1:NTYPES ); if DOTYPE(j) is .TRUE., then matrix type j will be generated. Currently, the list of possible types is:
- (1) The zero matrix. (humbling tbh)
- (2) The identity matrix.
- (3) A diagonal matrix with evenly spaced entries
1, ..., ULPand random signs. (ULP = (first number larger than 1) - 1) - (4) A diagonal matrix with geometrically spaced entries
1, ..., ULPand random signs. - (5) A diagonal matrix with entries
1, ULP, ..., ULPand random signs. - (6) Same as (4), but multiplied by
SQRT( overflow threshold ) - (7) Same as (4), but multiplied by
SQRT( underflow threshold ) - (8) A matrix of the form
U* D U, where U is unitary and D has evenly spaced entries1, ..., ULPwith random signs on the diagonal. - (9) A matrix of the form
U* D U, where U is unitary and D has geometrically spaced entries1, ..., ULPwith random signs on the diagonal. - (10) A matrix of the form
U* D U, where U is unitary and D has entries1, ULP,..., ULPwith random signs on the diagonal. - (11) Same as (8), but multiplied by
SQRT( overflow threshold ) - (12) Same as (8), but multiplied by
SQRT( underflow threshold ) - (13) Hermitian matrix with random entries chosen from
(-1,1). - (14) Same as (13), but multiplied by
SQRT( overflow threshold ) - (15) Same as (13), but multiplied by
SQRT( underflow threshold ) - (16) Same as (8), but diagonal elements are all positive. π₯°
- (17) Same as (9), but diagonal elements are all positive.
- (18) Same as (10), but diagonal elements are all positive.
- (19) Same as (16), but multiplied by
SQRT( overflow threshold ) - (20) Same as (16), but multiplied by
SQRT( underflow threshold ) - (21) A diagonally dominant tridiagonal matrix with geometrically spaced diagonal entries
1, ..., ULP.
and that's the whole matrix menu, bestie β 21 flavors, all certified valid π
Parameters
Okay bestie, buckle up β this is the big list of everything CCHKST2STG takes in. Every parameter gets its own little moment π
NSIZES
NSIZES is INTEGER
The number of sizes of matrices we're testing. If it's zero, CCHKST2STG does nothing β literally nothing, it just sits there π It must be at least zero.
NN
NN is INTEGER array, dimension (NSIZES)
An array holding the sizes used for the matrices. Zero values get skipped entirely (not invited to the party π). The values must be at least zero.
NTYPES
NTYPES is INTEGER
The number of elements in DOTYPE. If it's zero, CCHKST2STG does nothing β same deal as above. It must be at least zero.
And here's the spicy bit πΆοΈ β if it's MAXTYP+1 and NSIZES is 1, then an extra type, MAXTYP+1, gets defined, and that type just uses whatever matrix is already sitting in A. This is only actually useful if DOTYPE(1:MAXTYP) is .FALSE. and DOTYPE(MAXTYP+1) is .TRUE..
DOTYPE
DOTYPE is LOGICAL array, dimension (NTYPES)
The to-do list, basically β¨ If DOTYPE(j) is .TRUE., then for each size in NN a matrix of that size and of type j gets generated. If NTYPES is smaller than the maximum number of types defined (PARAMETER MAXTYP), then types NTYPES+1 through MAXTYP just don't get generated. And if NTYPES is larger than MAXTYP, then DOTYPE(MAXTYP+1) through DOTYPE(NTYPES) get ignored. Sorry girl, you're not on the list π
ISEED
ISEED is INTEGER array, dimension (4)
The random number generator's vibe check, aka its seed π On entry, ISEED specifies the seed of the random number generator. The array elements should be between 0 and 4095 β if not, they get reduced mod 4096. Also, ISEED(4) must be odd (no cap, that's a hard requirement). The generator uses a linear congruential sequence limited to small integers, so it should produce machine-independent random numbers. The values of ISEED get changed on exit, and you can use them in the next call to CCHKST2STG to keep the same random number sequence going. Continuity! π«Ά
THRESH
THRESH is REAL
A test will count as... if the..., computed as described above, exceeds THRESH. (Yes, the original page has gaps there β we're reporting what it says, not filling them in π)
Note that the error is scaled to be O(1), so THRESH should be a reasonably small multiple of 1 β like, say, 10 or 100. In particular it should not depend on the precision (single vs. double) or the size of the matrix. And it must be at least zero.
NOUNIT
NOUNIT is INTEGER
The FORTRAN unit number for printing out error messages β like, if a routine returns IINFO not equal to 0. Your error-reporting channel, basically π’
A
A is COMPLEX array of
dimension ( LDA , max(NN) )
Used to hold the matrix whose eigenvalues are to be computed. On exit, A contains the last matrix actually used. She's been through a lot, but she's still standing π
LDA
LDA is INTEGER
The leading dimension of A. It must be at least 1 and at least max( NN ).
AP
AP is COMPLEX array of
dimension( max(NN)*max(NN+1)/2 )
The matrix A stored in packed format. Compact queen π
SD
SD is REAL array of
dimension( max(NN) )
The diagonal of the tridiagonal matrix computed by CHETRD. On exit, SD and SE contain the tridiagonal form of the matrix in A.
SE
SE is REAL array of
dimension( max(NN) )
The off-diagonal of the tridiagonal matrix computed by CHETRD. On exit, SD and SE contain the tridiagonal form of the matrix in A. They're a matching set, iykyk π
D1
D1 is REAL array of
dimension( max(NN) )
The eigenvalues of A, as computed by CSTEQR simultaneously with Z. On exit, the eigenvalues in D1 correspond with the matrix in A.
D2
D2 is REAL array of
dimension( max(NN) )
The eigenvalues of A, as computed by CSTEQR if Z is not computed. On exit, the eigenvalues in D2 correspond with the matrix in A.
D3
D3 is REAL array of
dimension( max(NN) )
The eigenvalues of A, as computed by SSTERF. On exit, the eigenvalues in D3 correspond with the matrix in A.
D4
D4 is REAL array of
dimension( max(NN) )
The eigenvalues of A, as computed by CPTEQR(V). CPTEQR factors S as Z4 D4 Z4*. On exit, the eigenvalues in D4 correspond with the matrix in A.
D5
D5 is REAL array of
dimension( max(NN) )
The eigenvalues of A, as computed by CPTEQR(N) when Z is not computed. On exit, the eigenvalues in D4 correspond with the matrix in A. (Yes, it says D4 β we're just quoting the page, bestie, don't come for me π)
WA1
WA1 is REAL array of
dimension( max(NN) )
All eigenvalues of A, computed to high absolute accuracy, with different range options β as computed by SSTEBZ.
WA2
WA2 is REAL array of
dimension( max(NN) )
Selected eigenvalues of A, computed to high absolute accuracy, with different range options β as computed by SSTEBZ. The move here: choose random values for IL and IU, and ask for the IL-th through IU-th eigenvalues π―
WA3
WA3 is REAL array of
dimension( max(NN) )
Selected eigenvalues of A, computed to high absolute accuracy, with different range options β as computed by SSTEBZ. The move here: determine the values VL and VU of the IL-th and IU-th eigenvalues, and ask for all eigenvalues in this range.
WR
WR is REAL array of
dimension( max(NN) )
All eigenvalues of A, computed to high absolute accuracy, with different options β as computed by SSTEBZ.
U
U is COMPLEX array of
dimension( LDU, max(NN) ).
The unitary matrix computed by CHETRD + CUNGTR. Iconic collab β¨
LDU
LDU is INTEGER
The leading dimension of U, Z, and V. It must be at least 1 and at least max( NN ).
V
V is COMPLEX array of
dimension( LDU, max(NN) ).
The Householder vectors computed by CHETRD in reducing A to tridiagonal form π The vectors computed with UPLO='U' are in the upper triangle, and the vectors computed with UPLO='L' are in the lower triangle.
(As described in CHETRD, the sub- and superdiagonal are not set to 1, even though the true Householder vector has a 1 in that position. The routines that use V, such as CUNGTR, set those entries to 1 before using them, and then restore them later. Respectful. Considerate. We stan π«Ά)
VP
VP is COMPLEX array of
dimension( max(NN)*max(NN+1)/2 )
The matrix V stored in packed format.
TAU
TAU is COMPLEX array of
dimension( max(NN) )
The Householder factors computed by CHETRD in reducing A to tridiagonal form.
Z
Z is COMPLEX array of
dimension( LDU, max(NN) ).
The unitary matrix of eigenvectors computed by CSTEQR, CPTEQR, and CSTEIN. Three routines, one legend π
WORK
WORK is COMPLEX array of
dimension( LWORK )
Workspace. That's it. That's the description π
LWORK
LWORK is INTEGER
The number of entries in WORK. This must be at least:
1 + 4 * Nmax + 2 * Nmax * lg Nmax + 3 * Nmax**2
where Nmax = max( NN(j), 2 ) and lg = log base 2.
IWORK
IWORK is INTEGER array,
Workspace. Again. Short and sweet π
LIWORK
LIWORK is INTEGER
The number of entries in IWORK. This must be at least:
6 + 6*Nmax + 5 * Nmax * lg Nmax
where Nmax = max( NN(j), 2 ) and lg = log base 2.
RWORK
RWORK is REAL array
Real workspace. No dimension given, no notes, just vibes π¦
LRWORK
LRWORK is INTEGER
The number of entries in LRWORK (dimension( ??? ) β and yes, the original page literally has question marks there ππ)
RESULT
RESULT is REAL array, dimension (26)
The values computed by the tests described above. The values are currently limited to 1/ulp, to avoid overflow. Safety first, always π₯
INFO
The page just... names it. No description. INFO gets a name-drop and then the man page dips π
okay so INFO is an INTEGER, and hereβs the whole mood ring of return values, bestie π«Ά β memorize these or perish (emotionally):
0β everything ran OK, we love a clean slate β¨-1βNSIZES < 0, not it π-2β someNN(j) < 0, screaming-3βNTYPES < 0, pls-5βTHRESH < 0, bestie no-9βLDA < 1orLDA < NMAX, whereNMAXismax( NN(j) )π-23βLDU < 1orLDU < NMAX-29βLWORKtoo small, the classic
and if CLATMR, CLATMS, CHETRD, CUNGTR, CSTEQR, SSTERF, or CUNMC2 returns an error code, the absolute value of it is returned. no cap, thatβs literally the rule π₯
π Some Local Variables and Parameters π
bestie these are the little backstage crew, and yes they all matter:
ZERO,ONEβ Real 0 and 1. iconic basics πMAXTYPβ The number of types defined.NTESTβ The number of tests performed, or which can be performed so far, for the current matrix.NTESTTβ The total number of tests performed so far.NBLOCKβ Blocksize as returned byENVIR.NMAXβ Largest value inNN.NMATSβ The number of matrices generated so far.NERRSβ The number of tests which have exceededTHRESHso far.COND,IMODEβ Values to be passed to the matrix generators.ANORMβ Norm ofA; passed to matrix generators.OVFL,UNFLβ Overflow and underflow thresholds.ULP,ULPINVβ Finest relative precision and its inverse.RTOVFL,RTUNFLβ Square roots of the previous 2 values.
The following four arrays decode JTYPE:
KTYPE(j)β The general type (1-10) for type .KMODE(j)β TheMODEvalue to be passed to the matrix generator for type .KMAGN(j)β The order of magnitude (O(1),O(overflow^(1/2) ),O(underflow^(1/2) ))
π Author π
- Univ. of Tennessee
- Univ. of California Berkeley
- Univ. of Colorado Denver
- NAG Ltd.
Definition at line 620 of file cchkst2stg.f.
πΈ Author πΈ
Generated automatically by Doxygen for LAPACK from the source code.
and thatβs the whole page, fr fr π β LAPACK Version 3.12.0, live from /home/abui...chkst2stg.f(3), and honestly the footer ate. periodt β¨π
π¦ where this page comes from
- opensuse-leap 16.0: lapack-man 3.12.0-160000.2.2 Β· BSD-3-Clause
- opensuse-leap 16.0: lapack-man 3.12.0-160000.2.2 Β· BSD-3-Clause
- opensuse-leap 16.0: lapack-man 3.12.0-160000.2.2 Β· BSD-3-Clause
- opensuse-leap 16.0: lapack-man 3.12.0-160000.2.2 Β· BSD-3-Clause
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms