1 // Copyright ©2015 The Gonum Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
11 "gonum.org/v1/gonum/floats"
12 "gonum.org/v1/gonum/lapack"
15 type Dgeconer interface {
18 Dgecon(norm lapack.MatrixNorm, n int, a []float64, lda int, anorm float64, work []float64, iwork []int) float64
21 func DgeconTest(t *testing.T, impl Dgeconer) {
22 for _, test := range []struct {
49 condOne: 0.024740155174938,
50 condInf: 0.012034465570035,
52 // Dgecon does not match Dpocon for this case. https://github.com/xianyi/OpenBLAS/issues/664.
55 2.9995576045549965, -2.0898894566158663, 3.965560740124006,
56 -2.0898894566158663, 1.9634729526261008, -2.8681002706874104,
57 3.965560740124006, -2.8681002706874104, 5.502416670471008,
61 condOne: 0.024054837369015203,
62 condInf: 0.024054837369015203,
68 a := make([]float64, len(test.a))
70 ipiv := make([]int, min(m, n))
72 // Find the norms of the original matrix.
73 work := make([]float64, 4*n)
74 oneNorm := impl.Dlange(lapack.MaxColumnSum, m, n, a, lda, work)
75 infNorm := impl.Dlange(lapack.MaxRowSum, m, n, a, lda, work)
77 // Compute LU factorization of a.
78 impl.Dgetrf(m, n, a, lda, ipiv)
80 // Compute the condition number
81 iwork := make([]int, n)
82 condOne := impl.Dgecon(lapack.MaxColumnSum, n, a, lda, oneNorm, work, iwork)
83 condInf := impl.Dgecon(lapack.MaxRowSum, n, a, lda, infNorm, work, iwork)
85 // Error if not the same order, otherwise log the difference.
86 if !floats.EqualWithinAbsOrRel(condOne, test.condOne, 1e0, 1e0) {
87 t.Errorf("One norm mismatch. Want %v, got %v.", test.condOne, condOne)
88 } else if !floats.EqualWithinAbsOrRel(condOne, test.condOne, 1e-14, 1e-14) {
89 log.Printf("Dgecon one norm mismatch. Want %v, got %v.", test.condOne, condOne)
91 if !floats.EqualWithinAbsOrRel(condInf, test.condInf, 1e0, 1e0) {
92 t.Errorf("One norm mismatch. Want %v, got %v.", test.condInf, condInf)
93 } else if !floats.EqualWithinAbsOrRel(condInf, test.condInf, 1e-14, 1e-14) {
94 log.Printf("Dgecon one norm mismatch. Want %v, got %v.", test.condInf, condInf)