1 // Code generated by "go generate gonum.org/v1/gonum/blas/gonum”; DO NOT EDIT.
3 // Copyright ©2014 The Gonum Authors. All rights reserved.
4 // Use of this source code is governed by a BSD-style
5 // license that can be found in the LICENSE file.
10 "gonum.org/v1/gonum/blas"
11 "gonum.org/v1/gonum/internal/asm/f32"
14 var _ blas.Float32Level2 = Implementation{}
17 // y = alpha * A * x + beta * y if tA = blas.NoTrans
18 // y = alpha * A^T * x + beta * y if tA = blas.Trans or blas.ConjTrans
19 // where A is an m×n dense matrix, x and y are vectors, and alpha and beta are scalars.
21 // Float32 implementations are autogenerated and not directly tested.
22 func (Implementation) Sgemv(tA blas.Transpose, m, n int, alpha float32, a []float32, lda int, x []float32, incX int, beta float32, y []float32, incY int) {
23 if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
45 if tA == blas.NoTrans {
49 if (incX > 0 && (lenX-1)*incX >= len(x)) || (incX < 0 && (1-lenX)*incX >= len(x)) {
52 if (incY > 0 && (lenY-1)*incY >= len(y)) || (incY < 0 && (1-lenY)*incY >= len(y)) {
55 if lda*(m-1)+n > len(a) || lda < max(1, n) {
59 // Quick return if possible
60 if m == 0 || n == 0 || (alpha == 0 && beta == 1) {
68 kx = -(lenX - 1) * incX
73 ky = -(lenY - 1) * incY
76 // First form y = beta * y
78 Implementation{}.Sscal(lenY, beta, y, incY)
80 Implementation{}.Sscal(lenY, beta, y, -incY)
87 // Form y = alpha * A * x + y
88 if tA == blas.NoTrans {
89 if incX == 1 && incY == 1 {
90 for i := 0; i < m; i++ {
91 y[i] += alpha * f32.DotUnitary(a[lda*i:lda*i+n], x)
96 for i := 0; i < m; i++ {
97 y[iy] += alpha * f32.DotInc(x, a[lda*i:lda*i+n], uintptr(n), uintptr(incX), 1, uintptr(kx), 0)
102 // Cases where a is transposed.
103 if incX == 1 && incY == 1 {
104 for i := 0; i < m; i++ {
107 f32.AxpyUnitaryTo(y, tmp, a[lda*i:lda*i+n], y)
113 for i := 0; i < m; i++ {
116 f32.AxpyInc(tmp, a[lda*i:lda*i+n], y, uintptr(n), 1, uintptr(incY), 0, uintptr(ky))
122 // Sger performs the rank-one operation
123 // A += alpha * x * y^T
124 // where A is an m×n dense matrix, x and y are vectors, and alpha is a scalar.
126 // Float32 implementations are autogenerated and not directly tested.
127 func (Implementation) Sger(m, n int, alpha float32, x []float32, incX int, y []float32, incY int, a []float32, lda int) {
141 if (incX > 0 && (m-1)*incX >= len(x)) || (incX < 0 && (1-m)*incX >= len(x)) {
144 if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) {
147 if lda*(m-1)+n > len(a) || lda < max(1, n) {
154 // Quick return if possible
155 if m == 0 || n == 0 || alpha == 0 {
172 if incX == 1 && incY == 1 {
175 for i, xv := range x {
176 f32.AxpyUnitary(alpha*xv, y, a[i*lda:i*lda+n])
182 for i := 0; i < m; i++ {
183 f32.AxpyInc(alpha*x[ix], y, a[i*lda:i*lda+n], uintptr(n), uintptr(incY), 1, uintptr(ky), 0)
189 // y = alpha * A * x + beta * y if tA == blas.NoTrans
190 // y = alpha * A^T * x + beta * y if tA == blas.Trans or blas.ConjTrans
191 // where a is an m×n band matrix kL subdiagonals and kU super-diagonals, and
192 // m and n refer to the size of the full dense matrix it represents.
193 // x and y are vectors, and alpha and beta are scalars.
195 // Float32 implementations are autogenerated and not directly tested.
196 func (Implementation) Sgbmv(tA blas.Transpose, m, n, kL, kU int, alpha float32, a []float32, lda int, x []float32, incX int, beta float32, y []float32, incY int) {
197 if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
224 if tA == blas.NoTrans {
228 if (incX > 0 && (lenX-1)*incX >= len(x)) || (incX < 0 && (1-lenX)*incX >= len(x)) {
231 if (incY > 0 && (lenY-1)*incY >= len(y)) || (incY < 0 && (1-lenY)*incY >= len(y)) {
234 if lda*(min(m, n+kL)-1)+kL+kU+1 > len(a) || lda < kL+kU+1 {
238 // Quick return if possible
239 if m == 0 || n == 0 || (alpha == 0 && beta == 1) {
247 kx = -(lenX - 1) * incX
252 ky = -(lenY - 1) * incY
255 // First form y = beta * y
257 Implementation{}.Sscal(lenY, beta, y, incY)
259 Implementation{}.Sscal(lenY, beta, y, -incY)
266 // i and j are indices of the compacted banded matrix.
267 // off is the offset into the dense matrix (off + j = densej)
270 if tA == blas.NoTrans {
273 for i := 0; i < min(m, n+kL); i++ {
275 u := min(nCol, ld+kL-i)
277 atmp := a[i*lda+l : i*lda+u]
278 xtmp := x[off : off+u-l]
280 for j, v := range atmp {
288 for i := 0; i < min(m, n+kL); i++ {
290 u := min(nCol, ld+kL-i)
292 atmp := a[i*lda+l : i*lda+u]
295 for _, v := range atmp {
296 sum += x[off*incX+jx] * v
305 for i := 0; i < min(m, n+kL); i++ {
307 u := min(nCol, ld+kL-i)
309 atmp := a[i*lda+l : i*lda+u]
312 for _, v := range atmp {
313 y[jy+off*incY] += tmp * v
320 for i := 0; i < min(m, n+kL); i++ {
322 u := min(nCol, ld+kL-i)
324 atmp := a[i*lda+l : i*lda+u]
327 for _, v := range atmp {
328 y[jy+off*incY] += tmp * v
336 // x = A * x if tA == blas.NoTrans
337 // x = A^T * x if tA == blas.Trans or blas.ConjTrans
338 // A is an n×n Triangular matrix and x is a vector.
340 // Float32 implementations are autogenerated and not directly tested.
341 func (Implementation) Strmv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n int, a []float32, lda int, x []float32, incX int) {
342 if ul != blas.Lower && ul != blas.Upper {
345 if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
348 if d != blas.NonUnit && d != blas.Unit {
360 if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
363 if lda*(n-1)+n > len(a) || lda < max(1, n) {
369 nonUnit := d != blas.Unit
380 if tA == blas.NoTrans {
381 if ul == blas.Upper {
383 for i := 0; i < n; i++ {
387 tmp = a[ilda+i] * x[i]
392 x[i] = tmp + f32.DotUnitary(a[ilda+i+1:ilda+n], xtmp)
397 for i := 0; i < n; i++ {
401 tmp = a[ilda+i] * x[ix]
405 x[ix] = tmp + f32.DotInc(x, a[ilda+i+1:ilda+n], uintptr(n-i-1), uintptr(incX), 1, uintptr(ix+incX), 0)
411 for i := n - 1; i >= 0; i-- {
415 tmp += a[ilda+i] * x[i]
419 x[i] = tmp + f32.DotUnitary(a[ilda:ilda+i], x)
423 ix := kx + (n-1)*incX
424 for i := n - 1; i >= 0; i-- {
428 tmp = a[ilda+i] * x[ix]
432 x[ix] = tmp + f32.DotInc(x, a[ilda:ilda+i], uintptr(i), uintptr(incX), 1, uintptr(kx), 0)
437 // Cases where a is transposed.
438 if ul == blas.Upper {
440 for i := n - 1; i >= 0; i-- {
443 f32.AxpyUnitary(xi, a[ilda+i+1:ilda+n], x[i+1:n])
450 ix := kx + (n-1)*incX
451 for i := n - 1; i >= 0; i-- {
454 f32.AxpyInc(xi, a[ilda+i+1:ilda+n], x, uintptr(n-i-1), 1, uintptr(incX), 0, uintptr(kx+(i+1)*incX))
463 for i := 0; i < n; i++ {
466 f32.AxpyUnitary(xi, a[ilda:ilda+i], x)
474 for i := 0; i < n; i++ {
477 f32.AxpyInc(xi, a[ilda:ilda+i], x, uintptr(i), 1, uintptr(incX), 0, uintptr(kx))
486 // A * x = b if tA == blas.NoTrans
487 // A^T * x = b if tA == blas.Trans or blas.ConjTrans
488 // A is an n×n triangular matrix and x is a vector.
489 // At entry to the function, x contains the values of b, and the result is
490 // stored in place into x.
492 // No test for singularity or near-singularity is included in this
493 // routine. Such tests must be performed before calling this routine.
495 // Float32 implementations are autogenerated and not directly tested.
496 func (Implementation) Strsv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n int, a []float32, lda int, x []float32, incX int) {
497 // Test the input parameters
499 if ul != blas.Lower && ul != blas.Upper {
502 if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
505 if d != blas.NonUnit && d != blas.Unit {
511 if lda*(n-1)+n > len(a) || lda < max(1, n) {
517 if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
520 // Quick return if possible
525 if d == blas.NonUnit {
535 nonUnit := d == blas.NonUnit
536 if tA == blas.NoTrans {
537 if ul == blas.Upper {
539 for i := n - 1; i >= 0; i-- {
541 atmp := a[i*lda+i+1 : i*lda+n]
542 for j, v := range atmp {
553 ix := kx + (n-1)*incX
554 for i := n - 1; i >= 0; i-- {
557 atmp := a[i*lda+i+1 : i*lda+n]
558 for _, v := range atmp {
571 for i := 0; i < n; i++ {
573 atmp := a[i*lda : i*lda+i]
574 for j, v := range atmp {
585 for i := 0; i < n; i++ {
588 atmp := a[i*lda : i*lda+i]
589 for _, v := range atmp {
601 // Cases where a is transposed.
602 if ul == blas.Upper {
604 for i := 0; i < n; i++ {
609 atmp := a[i*lda+i+1 : i*lda+n]
610 for j, v := range atmp {
618 for i := 0; i < n; i++ {
623 jx := kx + (i+1)*incX
624 atmp := a[i*lda+i+1 : i*lda+n]
625 for _, v := range atmp {
634 for i := n - 1; i >= 0; i-- {
639 atmp := a[i*lda : i*lda+i]
640 for j, v := range atmp {
646 ix := kx + (n-1)*incX
647 for i := n - 1; i >= 0; i-- {
653 atmp := a[i*lda : i*lda+i]
654 for _, v := range atmp {
663 // y = alpha * A * x + beta * y,
664 // where a is an n×n symmetric matrix, x and y are vectors, and alpha and
667 // Float32 implementations are autogenerated and not directly tested.
668 func (Implementation) Ssymv(ul blas.Uplo, n int, alpha float32, a []float32, lda int, x []float32, incX int, beta float32, y []float32, incY int) {
670 if ul != blas.Lower && ul != blas.Upper {
676 if lda > 1 && lda < n {
685 if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
688 if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) {
691 if lda*(n-1)+n > len(a) || lda < max(1, n) {
694 // Quick return if possible
695 if n == 0 || (alpha == 0 && beta == 1) {
699 // Set up start points
715 Implementation{}.Sscal(n, beta, y, incY)
717 Implementation{}.Sscal(n, beta, y, -incY)
726 y[0] += alpha * a[0] * x[0]
730 if ul == blas.Upper {
733 for i := 0; i < n; i++ {
735 sum := x[i] * a[i*lda+i]
736 jy := ky + (i+1)*incY
737 atmp := a[i*lda+i+1 : i*lda+n]
738 for j, v := range atmp {
751 for i := 0; i < n; i++ {
753 sum := x[ix] * a[i*lda+i]
754 jx := kx + (i+1)*incX
755 jy := ky + (i+1)*incY
756 atmp := a[i*lda+i+1 : i*lda+n]
757 for _, v := range atmp {
769 // Cases where a is lower triangular.
772 for i := 0; i < n; i++ {
775 atmp := a[i*lda : i*lda+i]
777 for j, v := range atmp {
782 sum += x[i] * a[i*lda+i]
791 for i := 0; i < n; i++ {
795 atmp := a[i*lda : i*lda+i]
797 for _, v := range atmp {
803 sum += x[ix] * a[i*lda+i]
812 // x = A * x if tA == blas.NoTrans
813 // x = A^T * x if tA == blas.Trans or blas.ConjTrans
814 // where A is an n×n triangular banded matrix with k diagonals, and x is a vector.
816 // Float32 implementations are autogenerated and not directly tested.
817 func (Implementation) Stbmv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n, k int, a []float32, lda int, x []float32, incX int) {
818 if ul != blas.Lower && ul != blas.Upper {
821 if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
824 if d != blas.NonUnit && d != blas.Unit {
833 if lda*(n-1)+k+1 > len(a) || lda < k+1 {
839 if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
848 } else if incX != 1 {
852 nonunit := d != blas.Unit
854 if tA == blas.NoTrans {
855 if ul == blas.Upper {
857 for i := 0; i < n; i++ {
862 for j := 1; j < u; j++ {
863 sum += xtmp[j] * atmp[j]
866 sum += xtmp[0] * atmp[0]
875 for i := 0; i < n; i++ {
880 for j := 1; j < u; j++ {
881 sum += x[ix+jx] * atmp[j]
885 sum += x[ix] * atmp[0]
895 for i := n - 1; i >= 0; i-- {
899 for j := l; j < k; j++ {
900 sum += x[i-k+j] * atmp[j]
903 sum += x[i] * atmp[k]
911 ix := kx + (n-1)*incX
912 for i := n - 1; i >= 0; i-- {
917 for j := l; j < k; j++ {
918 sum += x[ix-k*incX+jx] * atmp[j]
922 sum += x[ix] * atmp[k]
931 if ul == blas.Upper {
933 for i := n - 1; i >= 0; i-- {
939 for j := 1; j < u; j++ {
940 sum += x[i-j] * a[(i-j)*lda+j]
943 sum += x[i] * a[i*lda]
951 ix := kx + (n-1)*incX
952 for i := n - 1; i >= 0; i-- {
959 for j := 1; j < u; j++ {
960 sum += x[ix-jx] * a[(i-j)*lda+j]
964 sum += x[ix] * a[i*lda]
974 for i := 0; i < n; i++ {
980 for j := 0; j < u; j++ {
981 sum += x[i+j+1] * a[(i+j+1)*lda+k-j-1]
984 sum += x[i] * a[i*lda+k]
993 for i := 0; i < n; i++ {
1002 for j := 0; j < u; j++ {
1003 sum += x[ix+jx+incX] * a[(i+j+1)*lda+k-j-1]
1007 sum += x[ix] * a[i*lda+k]
1017 // x = A * x if tA == blas.NoTrans
1018 // x = A^T * x if tA == blas.Trans or blas.ConjTrans
1019 // where A is an n×n unit triangular matrix in packed format, and x is a vector.
1021 // Float32 implementations are autogenerated and not directly tested.
1022 func (Implementation) Stpmv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n int, ap []float32, x []float32, incX int) {
1024 if ul != blas.Lower && ul != blas.Upper {
1027 if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
1030 if d != blas.NonUnit && d != blas.Unit {
1036 if len(ap) < (n*(n+1))/2 {
1042 if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
1050 kx = -(n - 1) * incX
1053 nonUnit := d == blas.NonUnit
1054 var offset int // Offset is the index of (i,i)
1055 if tA == blas.NoTrans {
1056 if ul == blas.Upper {
1058 for i := 0; i < n; i++ {
1063 atmp := ap[offset+1 : offset+n-i]
1065 for j, v := range atmp {
1074 for i := 0; i < n; i++ {
1079 atmp := ap[offset+1 : offset+n-i]
1080 jx := kx + (i+1)*incX
1081 for _, v := range atmp {
1092 offset = n*(n+1)/2 - 1
1093 for i := n - 1; i >= 0; i-- {
1098 atmp := ap[offset-i : offset]
1099 for j, v := range atmp {
1107 ix := kx + (n-1)*incX
1108 offset = n*(n+1)/2 - 1
1109 for i := n - 1; i >= 0; i-- {
1114 atmp := ap[offset-i : offset]
1116 for _, v := range atmp {
1126 // Cases where ap is transposed.
1127 if ul == blas.Upper {
1129 offset = n*(n+1)/2 - 1
1130 for i := n - 1; i >= 0; i-- {
1132 atmp := ap[offset+1 : offset+n-i]
1134 for j, v := range atmp {
1144 ix := kx + (n-1)*incX
1145 offset = n*(n+1)/2 - 1
1146 for i := n - 1; i >= 0; i-- {
1148 jx := kx + (i+1)*incX
1149 atmp := ap[offset+1 : offset+n-i]
1150 for _, v := range atmp {
1163 for i := 0; i < n; i++ {
1165 atmp := ap[offset-i : offset]
1166 for j, v := range atmp {
1177 for i := 0; i < n; i++ {
1180 atmp := ap[offset-i : offset]
1181 for _, v := range atmp {
1195 // where A is an n×n triangular banded matrix with k diagonals in packed format,
1196 // and x is a vector.
1197 // At entry to the function, x contains the values of b, and the result is
1198 // stored in place into x.
1200 // No test for singularity or near-singularity is included in this
1201 // routine. Such tests must be performed before calling this routine.
1203 // Float32 implementations are autogenerated and not directly tested.
1204 func (Implementation) Stbsv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n, k int, a []float32, lda int, x []float32, incX int) {
1205 if ul != blas.Lower && ul != blas.Upper {
1208 if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
1211 if d != blas.NonUnit && d != blas.Unit {
1217 if lda*(n-1)+k+1 > len(a) || lda < k+1 {
1223 if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
1231 kx = -(n - 1) * incX
1235 nonUnit := d == blas.NonUnit
1237 // Several cases below use subslices for speed improvement.
1238 // The incX != 1 cases usually do not because incX may be negative.
1239 if tA == blas.NoTrans {
1240 if ul == blas.Upper {
1242 for i := n - 1; i >= 0; i-- {
1248 xtmp := x[i+1 : i+bands+1]
1250 for j, v := range xtmp {
1260 ix := kx + (n-1)*incX
1261 for i := n - 1; i >= 0; i-- {
1271 for j := 1; j < max; j++ {
1273 sum += x[ix+jx] * atmp[j]
1284 for i := 0; i < n; i++ {
1289 atmp := a[i*lda+k-bands:]
1290 xtmp := x[i-bands : i]
1292 for j, v := range xtmp {
1303 for i := 0; i < n; i++ {
1308 atmp := a[i*lda+k-bands:]
1313 for j := 0; j < bands; j++ {
1314 sum += x[ix-bands*incX+jx] * atmp[j]
1319 x[ix] /= atmp[bands]
1325 // Cases where a is transposed.
1326 if ul == blas.Upper {
1328 for i := 0; i < n; i++ {
1334 for j := 0; j < bands; j++ {
1335 sum += x[i-bands+j] * a[(i-bands+j)*lda+bands-j]
1345 for i := 0; i < n; i++ {
1354 for j := 0; j < bands; j++ {
1355 sum += x[ix-bands*incX+jx] * a[(i-bands+j)*lda+bands-j]
1367 for i := n - 1; i >= 0; i-- {
1373 xtmp := x[i+1 : i+1+bands]
1374 for j, v := range xtmp {
1375 sum += v * a[(i+j+1)*lda+k-j-1]
1384 ix := kx + (n-1)*incX
1385 for i := n - 1; i >= 0; i-- {
1394 for j := 0; j < bands; j++ {
1395 sum += x[ix+jx+incX] * a[(i+j+1)*lda+k-j-1]
1407 // y = alpha * A * x + beta * y
1408 // where A is an n×n symmetric banded matrix, x and y are vectors, and alpha
1409 // and beta are scalars.
1411 // Float32 implementations are autogenerated and not directly tested.
1412 func (Implementation) Ssbmv(ul blas.Uplo, n, k int, alpha float32, a []float32, lda int, x []float32, incX int, beta float32, y []float32, incY int) {
1413 if ul != blas.Lower && ul != blas.Upper {
1426 if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
1429 if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) {
1432 if lda*(n-1)+k+1 > len(a) || lda < k+1 {
1436 // Quick return if possible
1437 if n == 0 || (alpha == 0 && beta == 1) {
1448 kx = -(lenX - 1) * incX
1453 ky = -(lenY - 1) * incY
1456 // First form y = beta * y
1458 Implementation{}.Sscal(lenY, beta, y, incY)
1460 Implementation{}.Sscal(lenY, beta, y, -incY)
1467 if ul == blas.Upper {
1470 for i := 0; i < n; i++ {
1473 sum := tmp * atmp[0]
1476 for j := 1; j <= u; j++ {
1478 sum += alpha * x[i+j] * v
1489 for i := 0; i < n; i++ {
1491 tmp := alpha * x[ix]
1492 sum := tmp * atmp[0]
1496 for j := 1; j <= u; j++ {
1498 sum += alpha * x[ix+jx] * v
1510 // Casses where a has bands below the diagonal.
1513 for i := 0; i < n; i++ {
1518 for j := l; j < k; j++ {
1520 y[iy] += alpha * v * x[i-k+j]
1521 y[iy-k*incY+jy] += tmp * v
1524 y[iy] += tmp * atmp[k]
1531 for i := 0; i < n; i++ {
1533 tmp := alpha * x[ix]
1537 for j := l; j < k; j++ {
1539 y[iy] += alpha * v * x[ix-k*incX+jx]
1540 y[iy-k*incY+jy] += tmp * v
1544 y[iy] += tmp * atmp[k]
1550 // Ssyr performs the rank-one update
1551 // a += alpha * x * x^T
1552 // where a is an n×n symmetric matrix, and x is a vector.
1554 // Float32 implementations are autogenerated and not directly tested.
1555 func (Implementation) Ssyr(ul blas.Uplo, n int, alpha float32, x []float32, incX int, a []float32, lda int) {
1556 if ul != blas.Lower && ul != blas.Upper {
1565 if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
1568 if lda*(n-1)+n > len(a) || lda < max(1, n) {
1571 if alpha == 0 || n == 0 {
1580 kx = -(lenX - 1) * incX
1582 if ul == blas.Upper {
1584 for i := 0; i < n; i++ {
1587 atmp := a[i*lda+i : i*lda+n]
1589 for j, v := range xtmp {
1597 for i := 0; i < n; i++ {
1598 tmp := x[ix] * alpha
1602 for j := i; j < n; j++ {
1603 atmp[j] += x[jx] * tmp
1611 // Cases where a is lower triangular.
1613 for i := 0; i < n; i++ {
1618 for j, v := range xtmp {
1626 for i := 0; i < n; i++ {
1627 tmp := x[ix] * alpha
1631 for j := 0; j < i+1; j++ {
1632 atmp[j] += tmp * x[jx]
1640 // Ssyr2 performs the symmetric rank-two update
1641 // A += alpha * x * y^T + alpha * y * x^T
1642 // where A is a symmetric n×n matrix, x and y are vectors, and alpha is a scalar.
1644 // Float32 implementations are autogenerated and not directly tested.
1645 func (Implementation) Ssyr2(ul blas.Uplo, n int, alpha float32, x []float32, incX int, y []float32, incY int, a []float32, lda int) {
1646 if ul != blas.Lower && ul != blas.Upper {
1658 if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
1661 if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) {
1664 if lda*(n-1)+n > len(a) || lda < max(1, n) {
1675 ky = -(n - 1) * incY
1680 kx = -(n - 1) * incX
1682 if ul == blas.Upper {
1683 if incX == 1 && incY == 1 {
1684 for i := 0; i < n; i++ {
1688 for j := i; j < n; j++ {
1689 atmp[j] += alpha * (xi*y[j] + x[j]*yi)
1696 for i := 0; i < n; i++ {
1702 for j := i; j < n; j++ {
1703 atmp[j] += alpha * (xi*y[jy] + x[jx]*yi)
1712 if incX == 1 && incY == 1 {
1713 for i := 0; i < n; i++ {
1717 for j := 0; j <= i; j++ {
1718 atmp[j] += alpha * (xi*y[j] + x[j]*yi)
1725 for i := 0; i < n; i++ {
1731 for j := 0; j <= i; j++ {
1732 atmp[j] += alpha * (xi*y[jy] + x[jx]*yi)
1742 // A * x = b if tA == blas.NoTrans
1743 // A^T * x = b if tA == blas.Trans or blas.ConjTrans
1744 // where A is an n×n triangular matrix in packed format and x is a vector.
1745 // At entry to the function, x contains the values of b, and the result is
1746 // stored in place into x.
1748 // No test for singularity or near-singularity is included in this
1749 // routine. Such tests must be performed before calling this routine.
1751 // Float32 implementations are autogenerated and not directly tested.
1752 func (Implementation) Stpsv(ul blas.Uplo, tA blas.Transpose, d blas.Diag, n int, ap []float32, x []float32, incX int) {
1754 if ul != blas.Lower && ul != blas.Upper {
1757 if tA != blas.NoTrans && tA != blas.Trans && tA != blas.ConjTrans {
1760 if d != blas.NonUnit && d != blas.Unit {
1766 if len(ap) < (n*(n+1))/2 {
1772 if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
1780 kx = -(n - 1) * incX
1783 nonUnit := d == blas.NonUnit
1784 var offset int // Offset is the index of (i,i)
1785 if tA == blas.NoTrans {
1786 if ul == blas.Upper {
1787 offset = n*(n+1)/2 - 1
1789 for i := n - 1; i >= 0; i-- {
1790 atmp := ap[offset+1 : offset+n-i]
1793 for j, v := range atmp {
1804 ix := kx + (n-1)*incX
1805 for i := n - 1; i >= 0; i-- {
1806 atmp := ap[offset+1 : offset+n-i]
1807 jx := kx + (i+1)*incX
1809 for _, v := range atmp {
1823 for i := 0; i < n; i++ {
1824 atmp := ap[offset-i : offset]
1826 for j, v := range atmp {
1838 for i := 0; i < n; i++ {
1840 atmp := ap[offset-i : offset]
1842 for _, v := range atmp {
1855 // Cases where ap is transposed.
1856 if ul == blas.Upper {
1858 for i := 0; i < n; i++ {
1863 atmp := ap[offset+1 : offset+n-i]
1865 for j, v := range atmp {
1873 for i := 0; i < n; i++ {
1878 atmp := ap[offset+1 : offset+n-i]
1879 jx := kx + (i+1)*incX
1880 for _, v := range atmp {
1890 offset = n*(n+1)/2 - 1
1891 for i := n - 1; i >= 0; i-- {
1896 atmp := ap[offset-i : offset]
1897 for j, v := range atmp {
1904 ix := kx + (n-1)*incX
1905 offset = n*(n+1)/2 - 1
1906 for i := n - 1; i >= 0; i-- {
1911 atmp := ap[offset-i : offset]
1913 for _, v := range atmp {
1923 // y = alpha * A * x + beta * y,
1924 // where A is an n×n symmetric matrix in packed format, x and y are vectors
1925 // and alpha and beta are scalars.
1927 // Float32 implementations are autogenerated and not directly tested.
1928 func (Implementation) Sspmv(ul blas.Uplo, n int, alpha float32, a []float32, x []float32, incX int, beta float32, y []float32, incY int) {
1930 if ul != blas.Lower && ul != blas.Upper {
1936 if len(a) < (n*(n+1))/2 {
1945 if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
1948 if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) {
1951 // Quick return if possible
1952 if n == 0 || (alpha == 0 && beta == 1) {
1956 // Set up start points
1961 kx = -(n - 1) * incX
1966 ky = -(n - 1) * incY
1969 // Form y = beta * y
1972 Implementation{}.Sscal(n, beta, y, incY)
1974 Implementation{}.Sscal(n, beta, y, -incY)
1983 y[0] += alpha * a[0] * x[0]
1986 var offset int // Offset is the index of (i,i).
1987 if ul == blas.Upper {
1990 for i := 0; i < n; i++ {
1992 sum := a[offset] * x[i]
1993 atmp := a[offset+1 : offset+n-i]
1995 jy := ky + (i+1)*incY
1996 for j, v := range atmp {
2001 y[iy] += alpha * sum
2009 for i := 0; i < n; i++ {
2011 sum := a[offset] * x[ix]
2012 atmp := a[offset+1 : offset+n-i]
2013 jx := kx + (i+1)*incX
2014 jy := ky + (i+1)*incY
2015 for _, v := range atmp {
2021 y[iy] += alpha * sum
2030 for i := 0; i < n; i++ {
2032 atmp := a[offset-i : offset]
2035 for j, v := range atmp {
2040 sum += a[offset] * x[i]
2041 y[iy] += alpha * sum
2049 for i := 0; i < n; i++ {
2051 atmp := a[offset-i : offset]
2055 for _, v := range atmp {
2062 sum += a[offset] * x[ix]
2063 y[iy] += alpha * sum
2070 // Sspr computes the rank-one operation
2071 // a += alpha * x * x^T
2072 // where a is an n×n symmetric matrix in packed format, x is a vector, and
2073 // alpha is a scalar.
2075 // Float32 implementations are autogenerated and not directly tested.
2076 func (Implementation) Sspr(ul blas.Uplo, n int, alpha float32, x []float32, incX int, a []float32) {
2077 if ul != blas.Lower && ul != blas.Upper {
2086 if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
2089 if len(a) < (n*(n+1))/2 {
2092 if alpha == 0 || n == 0 {
2100 kx = -(lenX - 1) * incX
2102 var offset int // Offset is the index of (i,i).
2103 if ul == blas.Upper {
2105 for i := 0; i < n; i++ {
2109 for j, v := range xtmp {
2117 for i := 0; i < n; i++ {
2121 for j := 0; j < n-i; j++ {
2122 atmp[j] += xv * x[jx]
2131 for i := 0; i < n; i++ {
2132 atmp := a[offset-i:]
2135 for j, v := range xtmp {
2143 for i := 0; i < n; i++ {
2145 atmp := a[offset-i:]
2147 for j := 0; j <= i; j++ {
2148 atmp[j] += xv * x[jx]
2156 // Sspr2 performs the symmetric rank-2 update
2157 // A += alpha * x * y^T + alpha * y * x^T,
2158 // where A is an n×n symmetric matrix in packed format, x and y are vectors,
2159 // and alpha is a scalar.
2161 // Float32 implementations are autogenerated and not directly tested.
2162 func (Implementation) Sspr2(ul blas.Uplo, n int, alpha float32, x []float32, incX int, y []float32, incY int, ap []float32) {
2163 if ul != blas.Lower && ul != blas.Upper {
2175 if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) {
2178 if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) {
2181 if len(ap) < (n*(n+1))/2 {
2191 ky = -(n - 1) * incY
2196 kx = -(n - 1) * incX
2198 var offset int // Offset is the index of (i,i).
2199 if ul == blas.Upper {
2200 if incX == 1 && incY == 1 {
2201 for i := 0; i < n; i++ {
2207 for j, v := range xtmp {
2208 atmp[j] += alpha * (xi*ytmp[j] + v*yi)
2216 for i := 0; i < n; i++ {
2222 for j := 0; j < n-i; j++ {
2223 atmp[j] += alpha * (xi*y[jy] + x[jx]*yi)
2233 if incX == 1 && incY == 1 {
2234 for i := 0; i < n; i++ {
2235 atmp := ap[offset-i:]
2239 for j, v := range xtmp {
2240 atmp[j] += alpha * (xi*y[j] + v*yi)
2248 for i := 0; i < n; i++ {
2251 atmp := ap[offset-i:]
2252 for j := 0; j <= i; j++ {
2253 atmp[j] += alpha * (x[ix]*y[jy] + x[jx]*y[iy])