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/blas"
14 func newGeneralFrom(a GeneralCols) General {
19 Data: make([]float64, a.Rows*a.Cols),
25 func (m General) dims() (r, c int) { return m.Rows, m.Cols }
26 func (m General) at(i, j int) float64 { return m.Data[i*m.Stride+j] }
28 func newGeneralColsFrom(a General) GeneralCols {
33 Data: make([]float64, a.Rows*a.Cols),
39 func (m GeneralCols) dims() (r, c int) { return m.Rows, m.Cols }
40 func (m GeneralCols) at(i, j int) float64 { return m.Data[i+j*m.Stride] }
42 type general interface {
47 func sameGeneral(a, b general) bool {
50 if ar != br || ac != bc {
53 for i := 0; i < ar; i++ {
54 for j := 0; j < ac; j++ {
55 if a.at(i, j) != b.at(i, j) || math.IsNaN(a.at(i, j)) != math.IsNaN(b.at(i, j)) {
63 var generalTests = []General{
64 {Rows: 2, Cols: 3, Stride: 3, Data: []float64{
68 {Rows: 3, Cols: 2, Stride: 2, Data: []float64{
73 {Rows: 3, Cols: 3, Stride: 3, Data: []float64{
78 {Rows: 2, Cols: 3, Stride: 5, Data: []float64{
82 {Rows: 3, Cols: 2, Stride: 5, Data: []float64{
87 {Rows: 3, Cols: 3, Stride: 5, Data: []float64{
94 func TestConvertGeneral(t *testing.T) {
95 for _, test := range generalTests {
96 colmajor := newGeneralColsFrom(test)
97 if !sameGeneral(colmajor, test) {
98 t.Errorf("unexpected result for row major to col major conversion:\n\tgot: %#v\n\tfrom:%#v",
101 rowmajor := newGeneralFrom(colmajor)
102 if !sameGeneral(rowmajor, test) {
103 t.Errorf("unexpected result for col major to row major conversion:\n\tgot: %#v\n\twant:%#v",
109 func newTriangularFrom(a TriangularCols) Triangular {
113 Data: make([]float64, a.N*a.N),
121 func (m Triangular) n() int { return m.N }
122 func (m Triangular) at(i, j int) float64 {
123 if m.Diag == blas.Unit && i == j {
126 if m.Uplo == blas.Lower && i < j && j < m.N {
129 if m.Uplo == blas.Upper && i > j {
132 return m.Data[i*m.Stride+j]
134 func (m Triangular) uplo() blas.Uplo { return m.Uplo }
135 func (m Triangular) diag() blas.Diag { return m.Diag }
137 func newTriangularColsFrom(a Triangular) TriangularCols {
141 Data: make([]float64, a.N*a.N),
149 func (m TriangularCols) n() int { return m.N }
150 func (m TriangularCols) at(i, j int) float64 {
151 if m.Diag == blas.Unit && i == j {
154 if m.Uplo == blas.Lower && i < j {
157 if m.Uplo == blas.Upper && i > j && i < m.N {
160 return m.Data[i+j*m.Stride]
162 func (m TriangularCols) uplo() blas.Uplo { return m.Uplo }
163 func (m TriangularCols) diag() blas.Diag { return m.Diag }
165 type triangular interface {
172 func sameTriangular(a, b triangular) bool {
178 for i := 0; i < an; i++ {
179 for j := 0; j < an; j++ {
180 if a.at(i, j) != b.at(i, j) || math.IsNaN(a.at(i, j)) != math.IsNaN(b.at(i, j)) {
188 var triangularTests = []Triangular{
189 {N: 3, Stride: 3, Data: []float64{
194 {N: 3, Stride: 5, Data: []float64{
201 func TestConvertTriangular(t *testing.T) {
202 for _, test := range triangularTests {
203 for _, uplo := range []blas.Uplo{blas.Upper, blas.Lower, blas.All} {
204 for _, diag := range []blas.Diag{blas.Unit, blas.NonUnit} {
207 colmajor := newTriangularColsFrom(test)
208 if !sameTriangular(colmajor, test) {
209 t.Errorf("unexpected result for row major to col major conversion:\n\tgot: %#v\n\tfrom:%#v",
212 rowmajor := newTriangularFrom(colmajor)
213 if !sameTriangular(rowmajor, test) {
214 t.Errorf("unexpected result for col major to row major conversion:\n\tgot: %#v\n\twant:%#v",
222 func newBandFrom(a BandCols) Band {
228 Stride: a.KL + a.KU + 1,
229 Data: make([]float64, a.Rows*(a.KL+a.KU+1)),
231 for i := range t.Data {
232 t.Data[i] = math.NaN()
238 func (m Band) dims() (r, c int) { return m.Rows, m.Cols }
239 func (m Band) at(i, j int) float64 {
241 if pj < 0 || m.KL+m.KU+1 <= pj {
244 return m.Data[i*m.Stride+pj]
246 func (m Band) bandwidth() (kl, ku int) { return m.KL, m.KU }
248 func newBandColsFrom(a Band) BandCols {
254 Stride: a.KL + a.KU + 1,
255 Data: make([]float64, a.Cols*(a.KL+a.KU+1)),
257 for i := range t.Data {
258 t.Data[i] = math.NaN()
264 func (m BandCols) dims() (r, c int) { return m.Rows, m.Cols }
265 func (m BandCols) at(i, j int) float64 {
267 if pj < 0 || m.KL+m.KU+1 <= pj {
270 return m.Data[j*m.Stride+pj]
272 func (m BandCols) bandwidth() (kl, ku int) { return m.KL, m.KU }
274 type band interface {
277 bandwidth() (kl, ku int)
280 func sameBand(a, b band) bool {
283 if ar != br || ac != bc {
286 akl, aku := a.bandwidth()
287 bkl, bku := b.bandwidth()
288 if akl != bkl || aku != bku {
291 for i := 0; i < ar; i++ {
292 for j := 0; j < ac; j++ {
293 if a.at(i, j) != b.at(i, j) || math.IsNaN(a.at(i, j)) != math.IsNaN(b.at(i, j)) {
301 var bandTests = []Band{
302 {Rows: 3, Cols: 4, KL: 0, KU: 0, Stride: 1, Data: []float64{
307 {Rows: 3, Cols: 3, KL: 0, KU: 0, Stride: 1, Data: []float64{
312 {Rows: 4, Cols: 3, KL: 0, KU: 0, Stride: 1, Data: []float64{
317 {Rows: 4, Cols: 3, KL: 0, KU: 1, Stride: 2, Data: []float64{
322 {Rows: 3, Cols: 4, KL: 0, KU: 1, Stride: 2, Data: []float64{
327 {Rows: 3, Cols: 4, KL: 1, KU: 1, Stride: 3, Data: []float64{
332 {Rows: 4, Cols: 3, KL: 1, KU: 1, Stride: 3, Data: []float64{
338 {Rows: 3, Cols: 4, KL: 2, KU: 1, Stride: 4, Data: []float64{
343 {Rows: 4, Cols: 3, KL: 2, KU: 1, Stride: 4, Data: []float64{
350 {Rows: 3, Cols: 4, KL: 0, KU: 0, Stride: 5, Data: []float64{
355 {Rows: 3, Cols: 3, KL: 0, KU: 0, Stride: 5, Data: []float64{
360 {Rows: 4, Cols: 3, KL: 0, KU: 0, Stride: 5, Data: []float64{
365 {Rows: 4, Cols: 3, KL: 0, KU: 1, Stride: 5, Data: []float64{
370 {Rows: 3, Cols: 4, KL: 0, KU: 1, Stride: 5, Data: []float64{
375 {Rows: 3, Cols: 4, KL: 1, KU: 1, Stride: 5, Data: []float64{
380 {Rows: 4, Cols: 3, KL: 1, KU: 1, Stride: 5, Data: []float64{
386 {Rows: 3, Cols: 4, KL: 2, KU: 1, Stride: 5, Data: []float64{
391 {Rows: 4, Cols: 3, KL: 2, KU: 1, Stride: 5, Data: []float64{
399 func TestConvertBand(t *testing.T) {
400 for _, test := range bandTests {
401 colmajor := newBandColsFrom(test)
402 if !sameBand(colmajor, test) {
403 t.Errorf("unexpected result for row major to col major conversion:\n\tgot: %#v\n\tfrom:%#v",
406 rowmajor := newBandFrom(colmajor)
407 if !sameBand(rowmajor, test) {
408 t.Errorf("unexpected result for col major to row major conversion:\n\tgot: %#v\n\twant:%#v",
414 func newTriangularBandFrom(a TriangularBandCols) TriangularBand {
419 Data: make([]float64, a.N*(a.K+1)),
423 for i := range t.Data {
424 t.Data[i] = math.NaN()
430 func (m TriangularBand) n() (n int) { return m.N }
431 func (m TriangularBand) at(i, j int) float64 {
432 if m.Diag == blas.Unit && i == j {
436 Rows: m.N, Cols: m.N,
442 panic("blas64: bad BLAS uplo")
456 func (m TriangularBand) bandwidth() (k int) { return m.K }
457 func (m TriangularBand) uplo() blas.Uplo { return m.Uplo }
458 func (m TriangularBand) diag() blas.Diag { return m.Diag }
460 func newTriangularBandColsFrom(a TriangularBand) TriangularBandCols {
461 t := TriangularBandCols{
465 Data: make([]float64, a.N*(a.K+1)),
469 for i := range t.Data {
470 t.Data[i] = math.NaN()
476 func (m TriangularBandCols) n() (n int) { return m.N }
477 func (m TriangularBandCols) at(i, j int) float64 {
478 if m.Diag == blas.Unit && i == j {
482 Rows: m.N, Cols: m.N,
488 panic("blas64: bad BLAS uplo")
502 func (m TriangularBandCols) bandwidth() (k int) { return m.K }
503 func (m TriangularBandCols) uplo() blas.Uplo { return m.Uplo }
504 func (m TriangularBandCols) diag() blas.Diag { return m.Diag }
506 type triangularBand interface {
514 func sameTriangularBand(a, b triangularBand) bool {
520 if a.uplo() != b.uplo() {
523 if a.diag() != b.diag() {
531 for i := 0; i < an; i++ {
532 for j := 0; j < an; j++ {
533 if a.at(i, j) != b.at(i, j) || math.IsNaN(a.at(i, j)) != math.IsNaN(b.at(i, j)) {
541 var triangularBandTests = []TriangularBand{
542 {N: 3, K: 0, Stride: 1, Uplo: blas.Upper, Data: []float64{
547 {N: 3, K: 0, Stride: 1, Uplo: blas.Lower, Data: []float64{
552 {N: 3, K: 1, Stride: 2, Uplo: blas.Upper, Data: []float64{
557 {N: 3, K: 1, Stride: 2, Uplo: blas.Lower, Data: []float64{
562 {N: 3, K: 2, Stride: 3, Uplo: blas.Upper, Data: []float64{
567 {N: 3, K: 2, Stride: 3, Uplo: blas.Lower, Data: []float64{
573 {N: 3, K: 0, Stride: 5, Uplo: blas.Upper, Data: []float64{
578 {N: 3, K: 0, Stride: 5, Uplo: blas.Lower, Data: []float64{
583 {N: 3, K: 1, Stride: 5, Uplo: blas.Upper, Data: []float64{
588 {N: 3, K: 1, Stride: 5, Uplo: blas.Lower, Data: []float64{
593 {N: 3, K: 2, Stride: 5, Uplo: blas.Upper, Data: []float64{
598 {N: 3, K: 2, Stride: 5, Uplo: blas.Lower, Data: []float64{
605 func TestConvertTriBand(t *testing.T) {
606 for _, test := range triangularBandTests {
607 colmajor := newTriangularBandColsFrom(test)
608 if !sameTriangularBand(colmajor, test) {
609 t.Errorf("unexpected result for row major to col major conversion:\n\tgot: %#v\n\tfrom:%#v",
612 rowmajor := newTriangularBandFrom(colmajor)
613 if !sameTriangularBand(rowmajor, test) {
614 t.Errorf("unexpected result for col major to row major conversion:\n\tgot: %#v\n\twant:%#v",