--- /dev/null
+// Code generated by "go generate gonum.org/v1/gonum/blas”; DO NOT EDIT.
+
+// Copyright ©2015 The Gonum Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package blas32
+
+import (
+ math "gonum.org/v1/gonum/internal/math32"
+ "testing"
+
+ "gonum.org/v1/gonum/blas"
+)
+
+func newGeneralFrom(a GeneralCols) General {
+ t := General{
+ Rows: a.Rows,
+ Cols: a.Cols,
+ Stride: a.Cols,
+ Data: make([]float32, a.Rows*a.Cols),
+ }
+ t.From(a)
+ return t
+}
+
+func (m General) dims() (r, c int) { return m.Rows, m.Cols }
+func (m General) at(i, j int) float32 { return m.Data[i*m.Stride+j] }
+
+func newGeneralColsFrom(a General) GeneralCols {
+ t := GeneralCols{
+ Rows: a.Rows,
+ Cols: a.Cols,
+ Stride: a.Rows,
+ Data: make([]float32, a.Rows*a.Cols),
+ }
+ t.From(a)
+ return t
+}
+
+func (m GeneralCols) dims() (r, c int) { return m.Rows, m.Cols }
+func (m GeneralCols) at(i, j int) float32 { return m.Data[i+j*m.Stride] }
+
+type general interface {
+ dims() (r, c int)
+ at(i, j int) float32
+}
+
+func sameGeneral(a, b general) bool {
+ ar, ac := a.dims()
+ br, bc := b.dims()
+ if ar != br || ac != bc {
+ return false
+ }
+ for i := 0; i < ar; i++ {
+ for j := 0; j < ac; j++ {
+ if a.at(i, j) != b.at(i, j) || math.IsNaN(a.at(i, j)) != math.IsNaN(b.at(i, j)) {
+ return false
+ }
+ }
+ }
+ return true
+}
+
+var generalTests = []General{
+ {Rows: 2, Cols: 3, Stride: 3, Data: []float32{
+ 1, 2, 3,
+ 4, 5, 6,
+ }},
+ {Rows: 3, Cols: 2, Stride: 2, Data: []float32{
+ 1, 2,
+ 3, 4,
+ 5, 6,
+ }},
+ {Rows: 3, Cols: 3, Stride: 3, Data: []float32{
+ 1, 2, 3,
+ 4, 5, 6,
+ 7, 8, 9,
+ }},
+ {Rows: 2, Cols: 3, Stride: 5, Data: []float32{
+ 1, 2, 3, 0, 0,
+ 4, 5, 6, 0, 0,
+ }},
+ {Rows: 3, Cols: 2, Stride: 5, Data: []float32{
+ 1, 2, 0, 0, 0,
+ 3, 4, 0, 0, 0,
+ 5, 6, 0, 0, 0,
+ }},
+ {Rows: 3, Cols: 3, Stride: 5, Data: []float32{
+ 1, 2, 3, 0, 0,
+ 4, 5, 6, 0, 0,
+ 7, 8, 9, 0, 0,
+ }},
+}
+
+func TestConvertGeneral(t *testing.T) {
+ for _, test := range generalTests {
+ colmajor := newGeneralColsFrom(test)
+ if !sameGeneral(colmajor, test) {
+ t.Errorf("unexpected result for row major to col major conversion:\n\tgot: %#v\n\tfrom:%#v",
+ colmajor, test)
+ }
+ rowmajor := newGeneralFrom(colmajor)
+ if !sameGeneral(rowmajor, test) {
+ t.Errorf("unexpected result for col major to row major conversion:\n\tgot: %#v\n\twant:%#v",
+ rowmajor, test)
+ }
+ }
+}
+
+func newTriangularFrom(a TriangularCols) Triangular {
+ t := Triangular{
+ N: a.N,
+ Stride: a.N,
+ Data: make([]float32, a.N*a.N),
+ Diag: a.Diag,
+ Uplo: a.Uplo,
+ }
+ t.From(a)
+ return t
+}
+
+func (m Triangular) n() int { return m.N }
+func (m Triangular) at(i, j int) float32 {
+ if m.Diag == blas.Unit && i == j {
+ return 1
+ }
+ if m.Uplo == blas.Lower && i < j && j < m.N {
+ return 0
+ }
+ if m.Uplo == blas.Upper && i > j {
+ return 0
+ }
+ return m.Data[i*m.Stride+j]
+}
+func (m Triangular) uplo() blas.Uplo { return m.Uplo }
+func (m Triangular) diag() blas.Diag { return m.Diag }
+
+func newTriangularColsFrom(a Triangular) TriangularCols {
+ t := TriangularCols{
+ N: a.N,
+ Stride: a.N,
+ Data: make([]float32, a.N*a.N),
+ Diag: a.Diag,
+ Uplo: a.Uplo,
+ }
+ t.From(a)
+ return t
+}
+
+func (m TriangularCols) n() int { return m.N }
+func (m TriangularCols) at(i, j int) float32 {
+ if m.Diag == blas.Unit && i == j {
+ return 1
+ }
+ if m.Uplo == blas.Lower && i < j {
+ return 0
+ }
+ if m.Uplo == blas.Upper && i > j && i < m.N {
+ return 0
+ }
+ return m.Data[i+j*m.Stride]
+}
+func (m TriangularCols) uplo() blas.Uplo { return m.Uplo }
+func (m TriangularCols) diag() blas.Diag { return m.Diag }
+
+type triangular interface {
+ n() int
+ at(i, j int) float32
+ uplo() blas.Uplo
+ diag() blas.Diag
+}
+
+func sameTriangular(a, b triangular) bool {
+ an := a.n()
+ bn := b.n()
+ if an != bn {
+ return false
+ }
+ for i := 0; i < an; i++ {
+ for j := 0; j < an; j++ {
+ if a.at(i, j) != b.at(i, j) || math.IsNaN(a.at(i, j)) != math.IsNaN(b.at(i, j)) {
+ return false
+ }
+ }
+ }
+ return true
+}
+
+var triangularTests = []Triangular{
+ {N: 3, Stride: 3, Data: []float32{
+ 1, 2, 3,
+ 4, 5, 6,
+ 7, 8, 9,
+ }},
+ {N: 3, Stride: 5, Data: []float32{
+ 1, 2, 3, 0, 0,
+ 4, 5, 6, 0, 0,
+ 7, 8, 9, 0, 0,
+ }},
+}
+
+func TestConvertTriangular(t *testing.T) {
+ for _, test := range triangularTests {
+ for _, uplo := range []blas.Uplo{blas.Upper, blas.Lower, blas.All} {
+ for _, diag := range []blas.Diag{blas.Unit, blas.NonUnit} {
+ test.Uplo = uplo
+ test.Diag = diag
+ colmajor := newTriangularColsFrom(test)
+ if !sameTriangular(colmajor, test) {
+ t.Errorf("unexpected result for row major to col major conversion:\n\tgot: %#v\n\tfrom:%#v",
+ colmajor, test)
+ }
+ rowmajor := newTriangularFrom(colmajor)
+ if !sameTriangular(rowmajor, test) {
+ t.Errorf("unexpected result for col major to row major conversion:\n\tgot: %#v\n\twant:%#v",
+ rowmajor, test)
+ }
+ }
+ }
+ }
+}
+
+func newBandFrom(a BandCols) Band {
+ t := Band{
+ Rows: a.Rows,
+ Cols: a.Cols,
+ KL: a.KL,
+ KU: a.KU,
+ Stride: a.KL + a.KU + 1,
+ Data: make([]float32, a.Rows*(a.KL+a.KU+1)),
+ }
+ for i := range t.Data {
+ t.Data[i] = math.NaN()
+ }
+ t.From(a)
+ return t
+}
+
+func (m Band) dims() (r, c int) { return m.Rows, m.Cols }
+func (m Band) at(i, j int) float32 {
+ pj := j + m.KL - i
+ if pj < 0 || m.KL+m.KU+1 <= pj {
+ return 0
+ }
+ return m.Data[i*m.Stride+pj]
+}
+func (m Band) bandwidth() (kl, ku int) { return m.KL, m.KU }
+
+func newBandColsFrom(a Band) BandCols {
+ t := BandCols{
+ Rows: a.Rows,
+ Cols: a.Cols,
+ KL: a.KL,
+ KU: a.KU,
+ Stride: a.KL + a.KU + 1,
+ Data: make([]float32, a.Cols*(a.KL+a.KU+1)),
+ }
+ for i := range t.Data {
+ t.Data[i] = math.NaN()
+ }
+ t.From(a)
+ return t
+}
+
+func (m BandCols) dims() (r, c int) { return m.Rows, m.Cols }
+func (m BandCols) at(i, j int) float32 {
+ pj := i + m.KU - j
+ if pj < 0 || m.KL+m.KU+1 <= pj {
+ return 0
+ }
+ return m.Data[j*m.Stride+pj]
+}
+func (m BandCols) bandwidth() (kl, ku int) { return m.KL, m.KU }
+
+type band interface {
+ dims() (r, c int)
+ at(i, j int) float32
+ bandwidth() (kl, ku int)
+}
+
+func sameBand(a, b band) bool {
+ ar, ac := a.dims()
+ br, bc := b.dims()
+ if ar != br || ac != bc {
+ return false
+ }
+ akl, aku := a.bandwidth()
+ bkl, bku := b.bandwidth()
+ if akl != bkl || aku != bku {
+ return false
+ }
+ for i := 0; i < ar; i++ {
+ for j := 0; j < ac; j++ {
+ if a.at(i, j) != b.at(i, j) || math.IsNaN(a.at(i, j)) != math.IsNaN(b.at(i, j)) {
+ return false
+ }
+ }
+ }
+ return true
+}
+
+var bandTests = []Band{
+ {Rows: 3, Cols: 4, KL: 0, KU: 0, Stride: 1, Data: []float32{
+ 1,
+ 2,
+ 3,
+ }},
+ {Rows: 3, Cols: 3, KL: 0, KU: 0, Stride: 1, Data: []float32{
+ 1,
+ 2,
+ 3,
+ }},
+ {Rows: 4, Cols: 3, KL: 0, KU: 0, Stride: 1, Data: []float32{
+ 1,
+ 2,
+ 3,
+ }},
+ {Rows: 4, Cols: 3, KL: 0, KU: 1, Stride: 2, Data: []float32{
+ 1, 2,
+ 3, 4,
+ 5, 6,
+ }},
+ {Rows: 3, Cols: 4, KL: 0, KU: 1, Stride: 2, Data: []float32{
+ 1, 2,
+ 3, 4,
+ 5, 6,
+ }},
+ {Rows: 3, Cols: 4, KL: 1, KU: 1, Stride: 3, Data: []float32{
+ -1, 2, 3,
+ 4, 5, 6,
+ 7, 8, 9,
+ }},
+ {Rows: 4, Cols: 3, KL: 1, KU: 1, Stride: 3, Data: []float32{
+ -1, 2, 3,
+ 4, 5, 6,
+ 7, 8, -2,
+ 9, -3, -4,
+ }},
+ {Rows: 3, Cols: 4, KL: 2, KU: 1, Stride: 4, Data: []float32{
+ -2, -1, 3, 4,
+ -3, 5, 6, 7,
+ 8, 9, 10, 11,
+ }},
+ {Rows: 4, Cols: 3, KL: 2, KU: 1, Stride: 4, Data: []float32{
+ -2, -1, 2, 3,
+ -3, 4, 5, 6,
+ 7, 8, 9, -4,
+ 10, 11, -5, -6,
+ }},
+
+ {Rows: 3, Cols: 4, KL: 0, KU: 0, Stride: 5, Data: []float32{
+ 1, 0, 0, 0, 0,
+ 2, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0,
+ }},
+ {Rows: 3, Cols: 3, KL: 0, KU: 0, Stride: 5, Data: []float32{
+ 1, 0, 0, 0, 0,
+ 2, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0,
+ }},
+ {Rows: 4, Cols: 3, KL: 0, KU: 0, Stride: 5, Data: []float32{
+ 1, 0, 0, 0, 0,
+ 2, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0,
+ }},
+ {Rows: 4, Cols: 3, KL: 0, KU: 1, Stride: 5, Data: []float32{
+ 1, 2, 0, 0, 0,
+ 3, 4, 0, 0, 0,
+ 5, 6, 0, 0, 0,
+ }},
+ {Rows: 3, Cols: 4, KL: 0, KU: 1, Stride: 5, Data: []float32{
+ 1, 2, 0, 0, 0,
+ 3, 4, 0, 0, 0,
+ 5, 6, 0, 0, 0,
+ }},
+ {Rows: 3, Cols: 4, KL: 1, KU: 1, Stride: 5, Data: []float32{
+ -1, 2, 3, 0, 0,
+ 4, 5, 6, 0, 0,
+ 7, 8, 9, 0, 0,
+ }},
+ {Rows: 4, Cols: 3, KL: 1, KU: 1, Stride: 5, Data: []float32{
+ -1, 2, 3, 0, 0,
+ 4, 5, 6, 0, 0,
+ 7, 8, -2, 0, 0,
+ 9, -3, -4, 0, 0,
+ }},
+ {Rows: 3, Cols: 4, KL: 2, KU: 1, Stride: 5, Data: []float32{
+ -2, -1, 3, 4, 0,
+ -3, 5, 6, 7, 0,
+ 8, 9, 10, 11, 0,
+ }},
+ {Rows: 4, Cols: 3, KL: 2, KU: 1, Stride: 5, Data: []float32{
+ -2, -1, 2, 3, 0,
+ -3, 4, 5, 6, 0,
+ 7, 8, 9, -4, 0,
+ 10, 11, -5, -6, 0,
+ }},
+}
+
+func TestConvertBand(t *testing.T) {
+ for _, test := range bandTests {
+ colmajor := newBandColsFrom(test)
+ if !sameBand(colmajor, test) {
+ t.Errorf("unexpected result for row major to col major conversion:\n\tgot: %#v\n\tfrom:%#v",
+ colmajor, test)
+ }
+ rowmajor := newBandFrom(colmajor)
+ if !sameBand(rowmajor, test) {
+ t.Errorf("unexpected result for col major to row major conversion:\n\tgot: %#v\n\twant:%#v",
+ rowmajor, test)
+ }
+ }
+}
+
+func newTriangularBandFrom(a TriangularBandCols) TriangularBand {
+ t := TriangularBand{
+ N: a.N,
+ K: a.K,
+ Stride: a.K + 1,
+ Data: make([]float32, a.N*(a.K+1)),
+ Uplo: a.Uplo,
+ Diag: a.Diag,
+ }
+ for i := range t.Data {
+ t.Data[i] = math.NaN()
+ }
+ t.From(a)
+ return t
+}
+
+func (m TriangularBand) n() (n int) { return m.N }
+func (m TriangularBand) at(i, j int) float32 {
+ if m.Diag == blas.Unit && i == j {
+ return 1
+ }
+ b := Band{
+ Rows: m.N, Cols: m.N,
+ Stride: m.Stride,
+ Data: m.Data,
+ }
+ switch m.Uplo {
+ default:
+ panic("blas32: bad BLAS uplo")
+ case blas.Upper:
+ if i > j {
+ return 0
+ }
+ b.KU = m.K
+ case blas.Lower:
+ if i < j {
+ return 0
+ }
+ b.KL = m.K
+ }
+ return b.at(i, j)
+}
+func (m TriangularBand) bandwidth() (k int) { return m.K }
+func (m TriangularBand) uplo() blas.Uplo { return m.Uplo }
+func (m TriangularBand) diag() blas.Diag { return m.Diag }
+
+func newTriangularBandColsFrom(a TriangularBand) TriangularBandCols {
+ t := TriangularBandCols{
+ N: a.N,
+ K: a.K,
+ Stride: a.K + 1,
+ Data: make([]float32, a.N*(a.K+1)),
+ Uplo: a.Uplo,
+ Diag: a.Diag,
+ }
+ for i := range t.Data {
+ t.Data[i] = math.NaN()
+ }
+ t.From(a)
+ return t
+}
+
+func (m TriangularBandCols) n() (n int) { return m.N }
+func (m TriangularBandCols) at(i, j int) float32 {
+ if m.Diag == blas.Unit && i == j {
+ return 1
+ }
+ b := BandCols{
+ Rows: m.N, Cols: m.N,
+ Stride: m.Stride,
+ Data: m.Data,
+ }
+ switch m.Uplo {
+ default:
+ panic("blas32: bad BLAS uplo")
+ case blas.Upper:
+ if i > j {
+ return 0
+ }
+ b.KU = m.K
+ case blas.Lower:
+ if i < j {
+ return 0
+ }
+ b.KL = m.K
+ }
+ return b.at(i, j)
+}
+func (m TriangularBandCols) bandwidth() (k int) { return m.K }
+func (m TriangularBandCols) uplo() blas.Uplo { return m.Uplo }
+func (m TriangularBandCols) diag() blas.Diag { return m.Diag }
+
+type triangularBand interface {
+ n() (n int)
+ at(i, j int) float32
+ bandwidth() (k int)
+ uplo() blas.Uplo
+ diag() blas.Diag
+}
+
+func sameTriangularBand(a, b triangularBand) bool {
+ an := a.n()
+ bn := b.n()
+ if an != bn {
+ return false
+ }
+ if a.uplo() != b.uplo() {
+ return false
+ }
+ if a.diag() != b.diag() {
+ return false
+ }
+ ak := a.bandwidth()
+ bk := b.bandwidth()
+ if ak != bk {
+ return false
+ }
+ for i := 0; i < an; i++ {
+ for j := 0; j < an; j++ {
+ if a.at(i, j) != b.at(i, j) || math.IsNaN(a.at(i, j)) != math.IsNaN(b.at(i, j)) {
+ return false
+ }
+ }
+ }
+ return true
+}
+
+var triangularBandTests = []TriangularBand{
+ {N: 3, K: 0, Stride: 1, Uplo: blas.Upper, Data: []float32{
+ 1,
+ 2,
+ 3,
+ }},
+ {N: 3, K: 0, Stride: 1, Uplo: blas.Lower, Data: []float32{
+ 1,
+ 2,
+ 3,
+ }},
+ {N: 3, K: 1, Stride: 2, Uplo: blas.Upper, Data: []float32{
+ 1, 2,
+ 3, 4,
+ 5, -1,
+ }},
+ {N: 3, K: 1, Stride: 2, Uplo: blas.Lower, Data: []float32{
+ -1, 1,
+ 2, 3,
+ 4, 5,
+ }},
+ {N: 3, K: 2, Stride: 3, Uplo: blas.Upper, Data: []float32{
+ 1, 2, 3,
+ 4, 5, -1,
+ 6, -2, -3,
+ }},
+ {N: 3, K: 2, Stride: 3, Uplo: blas.Lower, Data: []float32{
+ -2, -1, 1,
+ -3, 2, 4,
+ 3, 5, 6,
+ }},
+
+ {N: 3, K: 0, Stride: 5, Uplo: blas.Upper, Data: []float32{
+ 1, 0, 0, 0, 0,
+ 2, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0,
+ }},
+ {N: 3, K: 0, Stride: 5, Uplo: blas.Lower, Data: []float32{
+ 1, 0, 0, 0, 0,
+ 2, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0,
+ }},
+ {N: 3, K: 1, Stride: 5, Uplo: blas.Upper, Data: []float32{
+ 1, 2, 0, 0, 0,
+ 3, 4, 0, 0, 0,
+ 5, -1, 0, 0, 0,
+ }},
+ {N: 3, K: 1, Stride: 5, Uplo: blas.Lower, Data: []float32{
+ -1, 1, 0, 0, 0,
+ 2, 3, 0, 0, 0,
+ 4, 5, 0, 0, 0,
+ }},
+ {N: 3, K: 2, Stride: 5, Uplo: blas.Upper, Data: []float32{
+ 1, 2, 3, 0, 0,
+ 4, 5, -1, 0, 0,
+ 6, -2, -3, 0, 0,
+ }},
+ {N: 3, K: 2, Stride: 5, Uplo: blas.Lower, Data: []float32{
+ -2, -1, 1, 0, 0,
+ -3, 2, 4, 0, 0,
+ 3, 5, 6, 0, 0,
+ }},
+}
+
+func TestConvertTriBand(t *testing.T) {
+ for _, test := range triangularBandTests {
+ colmajor := newTriangularBandColsFrom(test)
+ if !sameTriangularBand(colmajor, test) {
+ t.Errorf("unexpected result for row major to col major conversion:\n\tgot: %#v\n\tfrom:%#v",
+ colmajor, test)
+ }
+ rowmajor := newTriangularBandFrom(colmajor)
+ if !sameTriangularBand(rowmajor, test) {
+ t.Errorf("unexpected result for col major to row major conversion:\n\tgot: %#v\n\twant:%#v",
+ rowmajor, test)
+ }
+ }
+}