gonum.org/v1/gonum@v0.14.0/blas/testblas/dznrm2.go (about)

     1  // Copyright ©2017 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.
     4  
     5  package testblas
     6  
     7  import (
     8  	"fmt"
     9  	"math"
    10  	"testing"
    11  
    12  	"golang.org/x/exp/rand"
    13  
    14  	"gonum.org/v1/gonum/floats/scalar"
    15  )
    16  
    17  type Dznrm2er interface {
    18  	Dznrm2(n int, x []complex128, incX int) float64
    19  	Dnrm2er
    20  }
    21  
    22  func Dznrm2Test(t *testing.T, impl Dznrm2er) {
    23  	tol := 1e-12
    24  	for tc, test := range []struct {
    25  		x    []complex128
    26  		want float64
    27  	}{
    28  		{
    29  			x:    nil,
    30  			want: 0,
    31  		},
    32  		{
    33  			x:    []complex128{1 + 2i},
    34  			want: 2.2360679774998,
    35  		},
    36  		{
    37  			x:    []complex128{1 + 2i, 3 + 4i},
    38  			want: 5.4772255750517,
    39  		},
    40  		{
    41  			x:    []complex128{1 + 2i, 3 + 4i, 5 + 6i},
    42  			want: 9.5393920141695,
    43  		},
    44  		{
    45  			x:    []complex128{1 + 2i, 3 + 4i, 5 + 6i, 7 + 8i},
    46  			want: 1.4282856857086e+01,
    47  		},
    48  		{
    49  			x:    []complex128{1 + 2i, 3 + 4i, 5 + 6i, 7 + 8i, 9 + 10i},
    50  			want: 1.9621416870349e+01,
    51  		},
    52  		{
    53  			x:    []complex128{1 + 2i, 3 + 4i, 5 + 6i, 7 + 8i, 9 + 10i, 11 + 12i},
    54  			want: 2.5495097567964e+01,
    55  		},
    56  		{
    57  			x:    []complex128{1 + 2i, 3 + 4i, 5 + 6i, 7 + 8i, 9 + 10i, 11 + 12i, 13 + 14i},
    58  			want: 3.1859064644148e+01,
    59  		},
    60  		{
    61  			x:    []complex128{1 + 2i, 3 + 4i, 5 + 6i, 7 + 8i, 9 + 10i, 11 + 12i, 13 + 14i, 15 + 16i},
    62  			want: 3.8678159211627e+01,
    63  		},
    64  		{
    65  			x:    []complex128{1 + 2i, 3 + 4i, 5 + 6i, 7 + 8i, 9 + 10i, 11 + 12i, 13 + 14i, 15 + 16i, 17 + 18i},
    66  			want: 4.5923850012820e+01,
    67  		},
    68  		{
    69  			x:    []complex128{1 + 2i, 3 + 4i, 5 + 6i, 7 + 8i, 9 + 10i, 11 + 12i, 13 + 14i, 15 + 16i, 17 + 18i, 19 + 20i},
    70  			want: 5.3572380943915e+01,
    71  		},
    72  		{
    73  			x:    []complex128{1 + 2i, 3 + 4i, 5 + 6i, 7 + 8i, 9 + 10i, 11 + 12i, 13 + 14i, 15 + 16i, 17 + 18i, 19 + 20i, 21 + 22i},
    74  			want: 6.1603571325046e+01,
    75  		},
    76  		{
    77  			x:    []complex128{1 + 2i, 3 + 4i, 5 + 6i, 7 + 8i, 9 + 10i, 11 + 12i, 13 + 14i, 15 + 16i, 17 + 18i, 19 + 20i, 21 + 22i, 23 + 24i},
    78  			want: 70,
    79  		},
    80  	} {
    81  		n := len(test.x)
    82  		for _, incX := range []int{-10, -1, 1, 2, 9, 17} {
    83  			x := makeZVector(test.x, incX)
    84  			xCopy := make([]complex128, len(x))
    85  			copy(xCopy, x)
    86  
    87  			got := impl.Dznrm2(n, x, incX)
    88  
    89  			prefix := fmt.Sprintf("Case %v (n=%v,incX=%v):", tc, n, incX)
    90  
    91  			if !zsame(x, xCopy) {
    92  				t.Errorf("%v: unexpected modification of x", prefix)
    93  			}
    94  
    95  			if incX < 0 {
    96  				if got != 0 {
    97  					t.Errorf("%v: non-zero result when incX < 0. got %v", prefix, got)
    98  				}
    99  				continue
   100  			}
   101  
   102  			if !scalar.EqualWithinAbsOrRel(test.want, got, tol, tol) {
   103  				t.Errorf("%v: unexpected result. want %v, got %v", prefix, test.want, got)
   104  			}
   105  		}
   106  	}
   107  
   108  	tol = 1e-14
   109  	rnd := rand.New(rand.NewSource(1))
   110  	for _, n := range []int{10, 50, 100} {
   111  		for _, incX := range []int{1, 2, 10} {
   112  			re := make([]float64, n)
   113  			for i := range re {
   114  				re[i] = rnd.NormFloat64()
   115  			}
   116  			im := make([]float64, n)
   117  			for i := range im {
   118  				im[i] = rnd.NormFloat64()
   119  			}
   120  			want := math.Hypot(impl.Dnrm2(n, re, 1), impl.Dnrm2(n, im, 1))
   121  
   122  			x := make([]complex128, (n-1)*incX+1)
   123  			for i := range x {
   124  				x[i] = znan
   125  			}
   126  			for i := range re {
   127  				x[i*incX] = complex(re[i], im[i])
   128  			}
   129  
   130  			got := impl.Dznrm2(n, x, incX)
   131  
   132  			if !scalar.EqualWithinAbsOrRel(want, got, tol, tol) {
   133  				t.Errorf("Case n=%v,incX=%v: unexpected result using Dnrm2. want %v, got %v", n, incX, want, got)
   134  			}
   135  		}
   136  	}
   137  }