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 newSymmetricFrom(a SymmetricCols) Symmetric {
18 Data: make([]float64, a.N*a.N),
25 func (m Symmetric) n() int { return m.N }
26 func (m Symmetric) at(i, j int) float64 {
27 if m.Uplo == blas.Lower && i < j && j < m.N {
30 if m.Uplo == blas.Upper && i > j {
33 return m.Data[i*m.Stride+j]
35 func (m Symmetric) uplo() blas.Uplo { return m.Uplo }
37 func newSymmetricColsFrom(a Symmetric) SymmetricCols {
41 Data: make([]float64, a.N*a.N),
48 func (m SymmetricCols) n() int { return m.N }
49 func (m SymmetricCols) at(i, j int) float64 {
50 if m.Uplo == blas.Lower && i < j {
53 if m.Uplo == blas.Upper && i > j && i < m.N {
56 return m.Data[i+j*m.Stride]
58 func (m SymmetricCols) uplo() blas.Uplo { return m.Uplo }
60 type symmetric interface {
66 func sameSymmetric(a, b symmetric) bool {
72 if a.uplo() != b.uplo() {
75 for i := 0; i < an; i++ {
76 for j := 0; j < an; j++ {
77 if a.at(i, j) != b.at(i, j) || math.IsNaN(a.at(i, j)) != math.IsNaN(b.at(i, j)) {
85 var symmetricTests = []Symmetric{
86 {N: 3, Stride: 3, Data: []float64{
91 {N: 3, Stride: 5, Data: []float64{
98 func TestConvertSymmetric(t *testing.T) {
99 for _, test := range symmetricTests {
100 for _, uplo := range []blas.Uplo{blas.Upper, blas.Lower} {
102 colmajor := newSymmetricColsFrom(test)
103 if !sameSymmetric(colmajor, test) {
104 t.Errorf("unexpected result for row major to col major conversion:\n\tgot: %#v\n\tfrom:%#v",
107 rowmajor := newSymmetricFrom(colmajor)
108 if !sameSymmetric(rowmajor, test) {
109 t.Errorf("unexpected result for col major to row major conversion:\n\tgot: %#v\n\twant:%#v",
115 func newSymmetricBandFrom(a SymmetricBandCols) SymmetricBand {
120 Data: make([]float64, a.N*(a.K+1)),
123 for i := range t.Data {
124 t.Data[i] = math.NaN()
130 func (m SymmetricBand) n() (n int) { return m.N }
131 func (m SymmetricBand) at(i, j int) float64 {
133 Rows: m.N, Cols: m.N,
139 panic("blas64: bad BLAS uplo")
153 func (m SymmetricBand) bandwidth() (k int) { return m.K }
154 func (m SymmetricBand) uplo() blas.Uplo { return m.Uplo }
156 func newSymmetricBandColsFrom(a SymmetricBand) SymmetricBandCols {
157 t := SymmetricBandCols{
161 Data: make([]float64, a.N*(a.K+1)),
164 for i := range t.Data {
165 t.Data[i] = math.NaN()
171 func (m SymmetricBandCols) n() (n int) { return m.N }
172 func (m SymmetricBandCols) at(i, j int) float64 {
174 Rows: m.N, Cols: m.N,
180 panic("blas64: bad BLAS uplo")
194 func (m SymmetricBandCols) bandwidth() (k int) { return m.K }
195 func (m SymmetricBandCols) uplo() blas.Uplo { return m.Uplo }
197 type symmetricBand interface {
204 func sameSymmetricBand(a, b symmetricBand) bool {
210 if a.uplo() != b.uplo() {
218 for i := 0; i < an; i++ {
219 for j := 0; j < an; j++ {
220 if a.at(i, j) != b.at(i, j) || math.IsNaN(a.at(i, j)) != math.IsNaN(b.at(i, j)) {
228 var symmetricBandTests = []SymmetricBand{
229 {N: 3, K: 0, Stride: 1, Uplo: blas.Upper, Data: []float64{
234 {N: 3, K: 0, Stride: 1, Uplo: blas.Lower, Data: []float64{
239 {N: 3, K: 1, Stride: 2, Uplo: blas.Upper, Data: []float64{
244 {N: 3, K: 1, Stride: 2, Uplo: blas.Lower, Data: []float64{
249 {N: 3, K: 2, Stride: 3, Uplo: blas.Upper, Data: []float64{
254 {N: 3, K: 2, Stride: 3, Uplo: blas.Lower, Data: []float64{
260 {N: 3, K: 0, Stride: 5, Uplo: blas.Upper, Data: []float64{
265 {N: 3, K: 0, Stride: 5, Uplo: blas.Lower, Data: []float64{
270 {N: 3, K: 1, Stride: 5, Uplo: blas.Upper, Data: []float64{
275 {N: 3, K: 1, Stride: 5, Uplo: blas.Lower, Data: []float64{
280 {N: 3, K: 2, Stride: 5, Uplo: blas.Upper, Data: []float64{
285 {N: 3, K: 2, Stride: 5, Uplo: blas.Lower, Data: []float64{
292 func TestConvertSymBand(t *testing.T) {
293 for _, test := range symmetricBandTests {
294 colmajor := newSymmetricBandColsFrom(test)
295 if !sameSymmetricBand(colmajor, test) {
296 t.Errorf("unexpected result for row major to col major conversion:\n\tgot: %#v\n\tfrom:%#v",
299 rowmajor := newSymmetricBandFrom(colmajor)
300 if !sameSymmetricBand(rowmajor, test) {
301 t.Errorf("unexpected result for col major to row major conversion:\n\tgot: %#v\n\twant:%#v",