// 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 testlapack import ( "fmt" "testing" "golang.org/x/exp/rand" "gonum.org/v1/gonum/blas" ) type Dlacpyer interface { Dlacpy(uplo blas.Uplo, m, n int, a []float64, lda int, b []float64, ldb int) } func DlacpyTest(t *testing.T, impl Dlacpyer) { rnd := rand.New(rand.NewSource(1)) for _, uplo := range []blas.Uplo{blas.Upper, blas.Lower, blas.All} { for _, test := range []struct { m, n, lda, ldb int }{ {3, 5, 0, 0}, {5, 5, 0, 0}, {7, 5, 0, 0}, {3, 5, 10, 12}, {5, 5, 10, 12}, {7, 5, 10, 12}, } { m := test.m n := test.n lda := test.lda if lda == 0 { lda = n } ldb := test.ldb if ldb == 0 { ldb = n } a := make([]float64, m*lda) for i := range a { a[i] = rnd.Float64() } b := make([]float64, m*ldb) for i := range b { b[i] = rnd.Float64() } impl.Dlacpy(uplo, m, n, a, lda, b, ldb) equal := true switch uplo { case blas.Upper: for i := 0; i < m; i++ { for j := i; j < n; j++ { if b[i*ldb+j] != a[i*lda+j] { equal = false goto DoneCheck } } } case blas.Lower: for i := 0; i < m; i++ { for j := 0; j < min(i, n); j++ { if b[i*ldb+j] != a[i*lda+j] { equal = false goto DoneCheck } } } case blas.All: for i := 0; i < m; i++ { for j := 0; j < n; j++ { if b[i*ldb+j] != a[i*lda+j] { equal = false goto DoneCheck } } } } DoneCheck: if !equal { fmt.Println(blas.Lower) t.Errorf("Matrices not equal after copy. Uplo = %d, m = %d, n = %d", uplo, m, n) } } } }