blas.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. // Copyright ©2013 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. //go:generate ./conversions.bash
  5. package blas
  6. // Flag constants indicate Givens transformation H matrix state.
  7. type Flag int
  8. const (
  9. Identity Flag = -2 // H is the identity matrix; no rotation is needed.
  10. Rescaling Flag = -1 // H specifies rescaling.
  11. OffDiagonal Flag = 0 // Off-diagonal elements of H are non-unit.
  12. Diagonal Flag = 1 // Diagonal elements of H are non-unit.
  13. )
  14. // SrotmParams contains Givens transformation parameters returned
  15. // by the Float32 Srotm method.
  16. type SrotmParams struct {
  17. Flag
  18. H [4]float32 // Column-major 2 by 2 matrix.
  19. }
  20. // DrotmParams contains Givens transformation parameters returned
  21. // by the Float64 Drotm method.
  22. type DrotmParams struct {
  23. Flag
  24. H [4]float64 // Column-major 2 by 2 matrix.
  25. }
  26. // Transpose specifies the transposition operation of a matrix.
  27. type Transpose byte
  28. const (
  29. NoTrans Transpose = 'N'
  30. Trans Transpose = 'T'
  31. ConjTrans Transpose = 'C'
  32. )
  33. // Uplo specifies whether a matrix is upper or lower triangular.
  34. type Uplo byte
  35. const (
  36. Upper Uplo = 'U'
  37. Lower Uplo = 'L'
  38. All Uplo = 'A'
  39. )
  40. // Diag specifies whether a matrix is unit triangular.
  41. type Diag byte
  42. const (
  43. NonUnit Diag = 'N'
  44. Unit Diag = 'U'
  45. )
  46. // Side specifies from which side a multiplication operation is performed.
  47. type Side byte
  48. const (
  49. Left Side = 'L'
  50. Right Side = 'R'
  51. )
  52. // Float32 implements the single precision real BLAS routines.
  53. type Float32 interface {
  54. Float32Level1
  55. Float32Level2
  56. Float32Level3
  57. }
  58. // Float32Level1 implements the single precision real BLAS Level 1 routines.
  59. type Float32Level1 interface {
  60. Sdsdot(n int, alpha float32, x []float32, incX int, y []float32, incY int) float32
  61. Dsdot(n int, x []float32, incX int, y []float32, incY int) float64
  62. Sdot(n int, x []float32, incX int, y []float32, incY int) float32
  63. Snrm2(n int, x []float32, incX int) float32
  64. Sasum(n int, x []float32, incX int) float32
  65. Isamax(n int, x []float32, incX int) int
  66. Sswap(n int, x []float32, incX int, y []float32, incY int)
  67. Scopy(n int, x []float32, incX int, y []float32, incY int)
  68. Saxpy(n int, alpha float32, x []float32, incX int, y []float32, incY int)
  69. Srotg(a, b float32) (c, s, r, z float32)
  70. Srotmg(d1, d2, b1, b2 float32) (p SrotmParams, rd1, rd2, rb1 float32)
  71. Srot(n int, x []float32, incX int, y []float32, incY int, c, s float32)
  72. Srotm(n int, x []float32, incX int, y []float32, incY int, p SrotmParams)
  73. Sscal(n int, alpha float32, x []float32, incX int)
  74. }
  75. // Float32Level2 implements the single precision real BLAS Level 2 routines.
  76. type Float32Level2 interface {
  77. Sgemv(tA Transpose, m, n int, alpha float32, a []float32, lda int, x []float32, incX int, beta float32, y []float32, incY int)
  78. Sgbmv(tA Transpose, m, n, kL, kU int, alpha float32, a []float32, lda int, x []float32, incX int, beta float32, y []float32, incY int)
  79. Strmv(ul Uplo, tA Transpose, d Diag, n int, a []float32, lda int, x []float32, incX int)
  80. Stbmv(ul Uplo, tA Transpose, d Diag, n, k int, a []float32, lda int, x []float32, incX int)
  81. Stpmv(ul Uplo, tA Transpose, d Diag, n int, ap []float32, x []float32, incX int)
  82. Strsv(ul Uplo, tA Transpose, d Diag, n int, a []float32, lda int, x []float32, incX int)
  83. Stbsv(ul Uplo, tA Transpose, d Diag, n, k int, a []float32, lda int, x []float32, incX int)
  84. Stpsv(ul Uplo, tA Transpose, d Diag, n int, ap []float32, x []float32, incX int)
  85. Ssymv(ul Uplo, n int, alpha float32, a []float32, lda int, x []float32, incX int, beta float32, y []float32, incY int)
  86. Ssbmv(ul Uplo, n, k int, alpha float32, a []float32, lda int, x []float32, incX int, beta float32, y []float32, incY int)
  87. Sspmv(ul Uplo, n int, alpha float32, ap []float32, x []float32, incX int, beta float32, y []float32, incY int)
  88. Sger(m, n int, alpha float32, x []float32, incX int, y []float32, incY int, a []float32, lda int)
  89. Ssyr(ul Uplo, n int, alpha float32, x []float32, incX int, a []float32, lda int)
  90. Sspr(ul Uplo, n int, alpha float32, x []float32, incX int, ap []float32)
  91. Ssyr2(ul Uplo, n int, alpha float32, x []float32, incX int, y []float32, incY int, a []float32, lda int)
  92. Sspr2(ul Uplo, n int, alpha float32, x []float32, incX int, y []float32, incY int, a []float32)
  93. }
  94. // Float32Level3 implements the single precision real BLAS Level 3 routines.
  95. type Float32Level3 interface {
  96. Sgemm(tA, tB Transpose, m, n, k int, alpha float32, a []float32, lda int, b []float32, ldb int, beta float32, c []float32, ldc int)
  97. Ssymm(s Side, ul Uplo, m, n int, alpha float32, a []float32, lda int, b []float32, ldb int, beta float32, c []float32, ldc int)
  98. Ssyrk(ul Uplo, t Transpose, n, k int, alpha float32, a []float32, lda int, beta float32, c []float32, ldc int)
  99. Ssyr2k(ul Uplo, t Transpose, n, k int, alpha float32, a []float32, lda int, b []float32, ldb int, beta float32, c []float32, ldc int)
  100. Strmm(s Side, ul Uplo, tA Transpose, d Diag, m, n int, alpha float32, a []float32, lda int, b []float32, ldb int)
  101. Strsm(s Side, ul Uplo, tA Transpose, d Diag, m, n int, alpha float32, a []float32, lda int, b []float32, ldb int)
  102. }
  103. // Float64 implements the single precision real BLAS routines.
  104. type Float64 interface {
  105. Float64Level1
  106. Float64Level2
  107. Float64Level3
  108. }
  109. // Float64Level1 implements the double precision real BLAS Level 1 routines.
  110. type Float64Level1 interface {
  111. Ddot(n int, x []float64, incX int, y []float64, incY int) float64
  112. Dnrm2(n int, x []float64, incX int) float64
  113. Dasum(n int, x []float64, incX int) float64
  114. Idamax(n int, x []float64, incX int) int
  115. Dswap(n int, x []float64, incX int, y []float64, incY int)
  116. Dcopy(n int, x []float64, incX int, y []float64, incY int)
  117. Daxpy(n int, alpha float64, x []float64, incX int, y []float64, incY int)
  118. Drotg(a, b float64) (c, s, r, z float64)
  119. Drotmg(d1, d2, b1, b2 float64) (p DrotmParams, rd1, rd2, rb1 float64)
  120. Drot(n int, x []float64, incX int, y []float64, incY int, c float64, s float64)
  121. Drotm(n int, x []float64, incX int, y []float64, incY int, p DrotmParams)
  122. Dscal(n int, alpha float64, x []float64, incX int)
  123. }
  124. // Float64Level2 implements the double precision real BLAS Level 2 routines.
  125. type Float64Level2 interface {
  126. Dgemv(tA Transpose, m, n int, alpha float64, a []float64, lda int, x []float64, incX int, beta float64, y []float64, incY int)
  127. Dgbmv(tA Transpose, m, n, kL, kU int, alpha float64, a []float64, lda int, x []float64, incX int, beta float64, y []float64, incY int)
  128. Dtrmv(ul Uplo, tA Transpose, d Diag, n int, a []float64, lda int, x []float64, incX int)
  129. Dtbmv(ul Uplo, tA Transpose, d Diag, n, k int, a []float64, lda int, x []float64, incX int)
  130. Dtpmv(ul Uplo, tA Transpose, d Diag, n int, ap []float64, x []float64, incX int)
  131. Dtrsv(ul Uplo, tA Transpose, d Diag, n int, a []float64, lda int, x []float64, incX int)
  132. Dtbsv(ul Uplo, tA Transpose, d Diag, n, k int, a []float64, lda int, x []float64, incX int)
  133. Dtpsv(ul Uplo, tA Transpose, d Diag, n int, ap []float64, x []float64, incX int)
  134. Dsymv(ul Uplo, n int, alpha float64, a []float64, lda int, x []float64, incX int, beta float64, y []float64, incY int)
  135. Dsbmv(ul Uplo, n, k int, alpha float64, a []float64, lda int, x []float64, incX int, beta float64, y []float64, incY int)
  136. Dspmv(ul Uplo, n int, alpha float64, ap []float64, x []float64, incX int, beta float64, y []float64, incY int)
  137. Dger(m, n int, alpha float64, x []float64, incX int, y []float64, incY int, a []float64, lda int)
  138. Dsyr(ul Uplo, n int, alpha float64, x []float64, incX int, a []float64, lda int)
  139. Dspr(ul Uplo, n int, alpha float64, x []float64, incX int, ap []float64)
  140. Dsyr2(ul Uplo, n int, alpha float64, x []float64, incX int, y []float64, incY int, a []float64, lda int)
  141. Dspr2(ul Uplo, n int, alpha float64, x []float64, incX int, y []float64, incY int, a []float64)
  142. }
  143. // Float64Level3 implements the double precision real BLAS Level 3 routines.
  144. type Float64Level3 interface {
  145. Dgemm(tA, tB Transpose, m, n, k int, alpha float64, a []float64, lda int, b []float64, ldb int, beta float64, c []float64, ldc int)
  146. Dsymm(s Side, ul Uplo, m, n int, alpha float64, a []float64, lda int, b []float64, ldb int, beta float64, c []float64, ldc int)
  147. Dsyrk(ul Uplo, t Transpose, n, k int, alpha float64, a []float64, lda int, beta float64, c []float64, ldc int)
  148. Dsyr2k(ul Uplo, t Transpose, n, k int, alpha float64, a []float64, lda int, b []float64, ldb int, beta float64, c []float64, ldc int)
  149. Dtrmm(s Side, ul Uplo, tA Transpose, d Diag, m, n int, alpha float64, a []float64, lda int, b []float64, ldb int)
  150. Dtrsm(s Side, ul Uplo, tA Transpose, d Diag, m, n int, alpha float64, a []float64, lda int, b []float64, ldb int)
  151. }
  152. // Complex64 implements the single precision complex BLAS routines.
  153. type Complex64 interface {
  154. Complex64Level1
  155. Complex64Level2
  156. Complex64Level3
  157. }
  158. // Complex64Level1 implements the single precision complex BLAS Level 1 routines.
  159. type Complex64Level1 interface {
  160. Cdotu(n int, x []complex64, incX int, y []complex64, incY int) (dotu complex64)
  161. Cdotc(n int, x []complex64, incX int, y []complex64, incY int) (dotc complex64)
  162. Scnrm2(n int, x []complex64, incX int) float32
  163. Scasum(n int, x []complex64, incX int) float32
  164. Icamax(n int, x []complex64, incX int) int
  165. Cswap(n int, x []complex64, incX int, y []complex64, incY int)
  166. Ccopy(n int, x []complex64, incX int, y []complex64, incY int)
  167. Caxpy(n int, alpha complex64, x []complex64, incX int, y []complex64, incY int)
  168. Cscal(n int, alpha complex64, x []complex64, incX int)
  169. Csscal(n int, alpha float32, x []complex64, incX int)
  170. }
  171. // Complex64Level2 implements the single precision complex BLAS routines Level 2 routines.
  172. type Complex64Level2 interface {
  173. Cgemv(tA Transpose, m, n int, alpha complex64, a []complex64, lda int, x []complex64, incX int, beta complex64, y []complex64, incY int)
  174. Cgbmv(tA Transpose, m, n, kL, kU int, alpha complex64, a []complex64, lda int, x []complex64, incX int, beta complex64, y []complex64, incY int)
  175. Ctrmv(ul Uplo, tA Transpose, d Diag, n int, a []complex64, lda int, x []complex64, incX int)
  176. Ctbmv(ul Uplo, tA Transpose, d Diag, n, k int, a []complex64, lda int, x []complex64, incX int)
  177. Ctpmv(ul Uplo, tA Transpose, d Diag, n int, ap []complex64, x []complex64, incX int)
  178. Ctrsv(ul Uplo, tA Transpose, d Diag, n int, a []complex64, lda int, x []complex64, incX int)
  179. Ctbsv(ul Uplo, tA Transpose, d Diag, n, k int, a []complex64, lda int, x []complex64, incX int)
  180. Ctpsv(ul Uplo, tA Transpose, d Diag, n int, ap []complex64, x []complex64, incX int)
  181. Chemv(ul Uplo, n int, alpha complex64, a []complex64, lda int, x []complex64, incX int, beta complex64, y []complex64, incY int)
  182. Chbmv(ul Uplo, n, k int, alpha complex64, a []complex64, lda int, x []complex64, incX int, beta complex64, y []complex64, incY int)
  183. Chpmv(ul Uplo, n int, alpha complex64, ap []complex64, x []complex64, incX int, beta complex64, y []complex64, incY int)
  184. Cgeru(m, n int, alpha complex64, x []complex64, incX int, y []complex64, incY int, a []complex64, lda int)
  185. Cgerc(m, n int, alpha complex64, x []complex64, incX int, y []complex64, incY int, a []complex64, lda int)
  186. Cher(ul Uplo, n int, alpha float32, x []complex64, incX int, a []complex64, lda int)
  187. Chpr(ul Uplo, n int, alpha float32, x []complex64, incX int, a []complex64)
  188. Cher2(ul Uplo, n int, alpha complex64, x []complex64, incX int, y []complex64, incY int, a []complex64, lda int)
  189. Chpr2(ul Uplo, n int, alpha complex64, x []complex64, incX int, y []complex64, incY int, ap []complex64)
  190. }
  191. // Complex64Level3 implements the single precision complex BLAS Level 3 routines.
  192. type Complex64Level3 interface {
  193. Cgemm(tA, tB Transpose, m, n, k int, alpha complex64, a []complex64, lda int, b []complex64, ldb int, beta complex64, c []complex64, ldc int)
  194. Csymm(s Side, ul Uplo, m, n int, alpha complex64, a []complex64, lda int, b []complex64, ldb int, beta complex64, c []complex64, ldc int)
  195. Csyrk(ul Uplo, t Transpose, n, k int, alpha complex64, a []complex64, lda int, beta complex64, c []complex64, ldc int)
  196. Csyr2k(ul Uplo, t Transpose, n, k int, alpha complex64, a []complex64, lda int, b []complex64, ldb int, beta complex64, c []complex64, ldc int)
  197. Ctrmm(s Side, ul Uplo, tA Transpose, d Diag, m, n int, alpha complex64, a []complex64, lda int, b []complex64, ldb int)
  198. Ctrsm(s Side, ul Uplo, tA Transpose, d Diag, m, n int, alpha complex64, a []complex64, lda int, b []complex64, ldb int)
  199. Chemm(s Side, ul Uplo, m, n int, alpha complex64, a []complex64, lda int, b []complex64, ldb int, beta complex64, c []complex64, ldc int)
  200. Cherk(ul Uplo, t Transpose, n, k int, alpha float32, a []complex64, lda int, beta float32, c []complex64, ldc int)
  201. Cher2k(ul Uplo, t Transpose, n, k int, alpha complex64, a []complex64, lda int, b []complex64, ldb int, beta float32, c []complex64, ldc int)
  202. }
  203. // Complex128 implements the double precision complex BLAS routines.
  204. type Complex128 interface {
  205. Complex128Level1
  206. Complex128Level2
  207. Complex128Level3
  208. }
  209. // Complex128Level1 implements the double precision complex BLAS Level 1 routines.
  210. type Complex128Level1 interface {
  211. Zdotu(n int, x []complex128, incX int, y []complex128, incY int) (dotu complex128)
  212. Zdotc(n int, x []complex128, incX int, y []complex128, incY int) (dotc complex128)
  213. Dznrm2(n int, x []complex128, incX int) float64
  214. Dzasum(n int, x []complex128, incX int) float64
  215. Izamax(n int, x []complex128, incX int) int
  216. Zswap(n int, x []complex128, incX int, y []complex128, incY int)
  217. Zcopy(n int, x []complex128, incX int, y []complex128, incY int)
  218. Zaxpy(n int, alpha complex128, x []complex128, incX int, y []complex128, incY int)
  219. Zscal(n int, alpha complex128, x []complex128, incX int)
  220. Zdscal(n int, alpha float64, x []complex128, incX int)
  221. }
  222. // Complex128Level2 implements the double precision complex BLAS Level 2 routines.
  223. type Complex128Level2 interface {
  224. Zgemv(tA Transpose, m, n int, alpha complex128, a []complex128, lda int, x []complex128, incX int, beta complex128, y []complex128, incY int)
  225. Zgbmv(tA Transpose, m, n int, kL int, kU int, alpha complex128, a []complex128, lda int, x []complex128, incX int, beta complex128, y []complex128, incY int)
  226. Ztrmv(ul Uplo, tA Transpose, d Diag, n int, a []complex128, lda int, x []complex128, incX int)
  227. Ztbmv(ul Uplo, tA Transpose, d Diag, n, k int, a []complex128, lda int, x []complex128, incX int)
  228. Ztpmv(ul Uplo, tA Transpose, d Diag, n int, ap []complex128, x []complex128, incX int)
  229. Ztrsv(ul Uplo, tA Transpose, d Diag, n int, a []complex128, lda int, x []complex128, incX int)
  230. Ztbsv(ul Uplo, tA Transpose, d Diag, n, k int, a []complex128, lda int, x []complex128, incX int)
  231. Ztpsv(ul Uplo, tA Transpose, d Diag, n int, ap []complex128, x []complex128, incX int)
  232. Zhemv(ul Uplo, n int, alpha complex128, a []complex128, lda int, x []complex128, incX int, beta complex128, y []complex128, incY int)
  233. Zhbmv(ul Uplo, n, k int, alpha complex128, a []complex128, lda int, x []complex128, incX int, beta complex128, y []complex128, incY int)
  234. Zhpmv(ul Uplo, n int, alpha complex128, ap []complex128, x []complex128, incX int, beta complex128, y []complex128, incY int)
  235. Zgeru(m, n int, alpha complex128, x []complex128, incX int, y []complex128, incY int, a []complex128, lda int)
  236. Zgerc(m, n int, alpha complex128, x []complex128, incX int, y []complex128, incY int, a []complex128, lda int)
  237. Zher(ul Uplo, n int, alpha float64, x []complex128, incX int, a []complex128, lda int)
  238. Zhpr(ul Uplo, n int, alpha float64, x []complex128, incX int, a []complex128)
  239. Zher2(ul Uplo, n int, alpha complex128, x []complex128, incX int, y []complex128, incY int, a []complex128, lda int)
  240. Zhpr2(ul Uplo, n int, alpha complex128, x []complex128, incX int, y []complex128, incY int, ap []complex128)
  241. }
  242. // Complex128Level3 implements the double precision complex BLAS Level 3 routines.
  243. type Complex128Level3 interface {
  244. Zgemm(tA, tB Transpose, m, n, k int, alpha complex128, a []complex128, lda int, b []complex128, ldb int, beta complex128, c []complex128, ldc int)
  245. Zsymm(s Side, ul Uplo, m, n int, alpha complex128, a []complex128, lda int, b []complex128, ldb int, beta complex128, c []complex128, ldc int)
  246. Zsyrk(ul Uplo, t Transpose, n, k int, alpha complex128, a []complex128, lda int, beta complex128, c []complex128, ldc int)
  247. Zsyr2k(ul Uplo, t Transpose, n, k int, alpha complex128, a []complex128, lda int, b []complex128, ldb int, beta complex128, c []complex128, ldc int)
  248. Ztrmm(s Side, ul Uplo, tA Transpose, d Diag, m, n int, alpha complex128, a []complex128, lda int, b []complex128, ldb int)
  249. Ztrsm(s Side, ul Uplo, tA Transpose, d Diag, m, n int, alpha complex128, a []complex128, lda int, b []complex128, ldb int)
  250. Zhemm(s Side, ul Uplo, m, n int, alpha complex128, a []complex128, lda int, b []complex128, ldb int, beta complex128, c []complex128, ldc int)
  251. Zherk(ul Uplo, t Transpose, n, k int, alpha float64, a []complex128, lda int, beta float64, c []complex128, ldc int)
  252. Zher2k(ul Uplo, t Transpose, n, k int, alpha complex128, a []complex128, lda int, b []complex128, ldb int, beta float64, c []complex128, ldc int)
  253. }