| // 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 newSymmetricFrom(a SymmetricCols) Symmetric { |
| t := Symmetric{ |
| N: a.N, |
| Stride: a.N, |
| Data: make([]float32, a.N*a.N), |
| Uplo: a.Uplo, |
| } |
| t.From(a) |
| return t |
| } |
| |
| func (m Symmetric) n() int { return m.N } |
| func (m Symmetric) at(i, j int) float32 { |
| if m.Uplo == blas.Lower && i < j && j < m.N { |
| i, j = j, i |
| } |
| if m.Uplo == blas.Upper && i > j { |
| i, j = j, i |
| } |
| return m.Data[i*m.Stride+j] |
| } |
| func (m Symmetric) uplo() blas.Uplo { return m.Uplo } |
| |
| func newSymmetricColsFrom(a Symmetric) SymmetricCols { |
| t := SymmetricCols{ |
| N: a.N, |
| Stride: a.N, |
| Data: make([]float32, a.N*a.N), |
| Uplo: a.Uplo, |
| } |
| t.From(a) |
| return t |
| } |
| |
| func (m SymmetricCols) n() int { return m.N } |
| func (m SymmetricCols) at(i, j int) float32 { |
| if m.Uplo == blas.Lower && i < j { |
| i, j = j, i |
| } |
| if m.Uplo == blas.Upper && i > j && i < m.N { |
| i, j = j, i |
| } |
| return m.Data[i+j*m.Stride] |
| } |
| func (m SymmetricCols) uplo() blas.Uplo { return m.Uplo } |
| |
| type symmetric interface { |
| n() int |
| at(i, j int) float32 |
| uplo() blas.Uplo |
| } |
| |
| func sameSymmetric(a, b symmetric) bool { |
| an := a.n() |
| bn := b.n() |
| if an != bn { |
| return false |
| } |
| if a.uplo() != b.uplo() { |
| 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 symmetricTests = []Symmetric{ |
| {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 TestConvertSymmetric(t *testing.T) { |
| for _, test := range symmetricTests { |
| for _, uplo := range []blas.Uplo{blas.Upper, blas.Lower} { |
| test.Uplo = uplo |
| colmajor := newSymmetricColsFrom(test) |
| if !sameSymmetric(colmajor, test) { |
| t.Errorf("unexpected result for row major to col major conversion:\n\tgot: %#v\n\tfrom:%#v", |
| colmajor, test) |
| } |
| rowmajor := newSymmetricFrom(colmajor) |
| if !sameSymmetric(rowmajor, test) { |
| t.Errorf("unexpected result for col major to row major conversion:\n\tgot: %#v\n\twant:%#v", |
| rowmajor, test) |
| } |
| } |
| } |
| } |
| func newSymmetricBandFrom(a SymmetricBandCols) SymmetricBand { |
| t := SymmetricBand{ |
| N: a.N, |
| K: a.K, |
| Stride: a.K + 1, |
| Data: make([]float32, a.N*(a.K+1)), |
| Uplo: a.Uplo, |
| } |
| for i := range t.Data { |
| t.Data[i] = math.NaN() |
| } |
| t.From(a) |
| return t |
| } |
| |
| func (m SymmetricBand) n() (n int) { return m.N } |
| func (m SymmetricBand) at(i, j int) float32 { |
| 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: |
| b.KU = m.K |
| if i > j { |
| i, j = j, i |
| } |
| case blas.Lower: |
| b.KL = m.K |
| if i < j { |
| i, j = j, i |
| } |
| } |
| return b.at(i, j) |
| } |
| func (m SymmetricBand) bandwidth() (k int) { return m.K } |
| func (m SymmetricBand) uplo() blas.Uplo { return m.Uplo } |
| |
| func newSymmetricBandColsFrom(a SymmetricBand) SymmetricBandCols { |
| t := SymmetricBandCols{ |
| N: a.N, |
| K: a.K, |
| Stride: a.K + 1, |
| Data: make([]float32, a.N*(a.K+1)), |
| Uplo: a.Uplo, |
| } |
| for i := range t.Data { |
| t.Data[i] = math.NaN() |
| } |
| t.From(a) |
| return t |
| } |
| |
| func (m SymmetricBandCols) n() (n int) { return m.N } |
| func (m SymmetricBandCols) at(i, j int) float32 { |
| 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: |
| b.KU = m.K |
| if i > j { |
| i, j = j, i |
| } |
| case blas.Lower: |
| b.KL = m.K |
| if i < j { |
| i, j = j, i |
| } |
| } |
| return b.at(i, j) |
| } |
| func (m SymmetricBandCols) bandwidth() (k int) { return m.K } |
| func (m SymmetricBandCols) uplo() blas.Uplo { return m.Uplo } |
| |
| type symmetricBand interface { |
| n() (n int) |
| at(i, j int) float32 |
| bandwidth() (k int) |
| uplo() blas.Uplo |
| } |
| |
| func sameSymmetricBand(a, b symmetricBand) bool { |
| an := a.n() |
| bn := b.n() |
| if an != bn { |
| return false |
| } |
| if a.uplo() != b.uplo() { |
| 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 symmetricBandTests = []SymmetricBand{ |
| {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 TestConvertSymBand(t *testing.T) { |
| for _, test := range symmetricBandTests { |
| colmajor := newSymmetricBandColsFrom(test) |
| if !sameSymmetricBand(colmajor, test) { |
| t.Errorf("unexpected result for row major to col major conversion:\n\tgot: %#v\n\tfrom:%#v", |
| colmajor, test) |
| } |
| rowmajor := newSymmetricBandFrom(colmajor) |
| if !sameSymmetricBand(rowmajor, test) { |
| t.Errorf("unexpected result for col major to row major conversion:\n\tgot: %#v\n\twant:%#v", |
| rowmajor, test) |
| } |
| } |
| } |