github.com/jingcheng-WU/gonum@v0.9.1-0.20210323123734-f1a2a11a8f7b/internal/asm/f64/stubs_amd64.go (about) 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. 4 5 // +build !noasm,!gccgo,!safe 6 7 package f64 8 9 // L1Norm is 10 // for _, v := range x { 11 // sum += math.Abs(v) 12 // } 13 // return sum 14 func L1Norm(x []float64) (sum float64) 15 16 // L1NormInc is 17 // for i := 0; i < n*incX; i += incX { 18 // sum += math.Abs(x[i]) 19 // } 20 // return sum 21 func L1NormInc(x []float64, n, incX int) (sum float64) 22 23 // AddConst is 24 // for i := range x { 25 // x[i] += alpha 26 // } 27 func AddConst(alpha float64, x []float64) 28 29 // Add is 30 // for i, v := range s { 31 // dst[i] += v 32 // } 33 func Add(dst, s []float64) 34 35 // AxpyUnitary is 36 // for i, v := range x { 37 // y[i] += alpha * v 38 // } 39 func AxpyUnitary(alpha float64, x, y []float64) 40 41 // AxpyUnitaryTo is 42 // for i, v := range x { 43 // dst[i] = alpha*v + y[i] 44 // } 45 func AxpyUnitaryTo(dst []float64, alpha float64, x, y []float64) 46 47 // AxpyInc is 48 // for i := 0; i < int(n); i++ { 49 // y[iy] += alpha * x[ix] 50 // ix += incX 51 // iy += incY 52 // } 53 func AxpyInc(alpha float64, x, y []float64, n, incX, incY, ix, iy uintptr) 54 55 // AxpyIncTo is 56 // for i := 0; i < int(n); i++ { 57 // dst[idst] = alpha*x[ix] + y[iy] 58 // ix += incX 59 // iy += incY 60 // idst += incDst 61 // } 62 func AxpyIncTo(dst []float64, incDst, idst uintptr, alpha float64, x, y []float64, n, incX, incY, ix, iy uintptr) 63 64 // CumSum is 65 // if len(s) == 0 { 66 // return dst 67 // } 68 // dst[0] = s[0] 69 // for i, v := range s[1:] { 70 // dst[i+1] = dst[i] + v 71 // } 72 // return dst 73 func CumSum(dst, s []float64) []float64 74 75 // CumProd is 76 // if len(s) == 0 { 77 // return dst 78 // } 79 // dst[0] = s[0] 80 // for i, v := range s[1:] { 81 // dst[i+1] = dst[i] * v 82 // } 83 // return dst 84 func CumProd(dst, s []float64) []float64 85 86 // Div is 87 // for i, v := range s { 88 // dst[i] /= v 89 // } 90 func Div(dst, s []float64) 91 92 // DivTo is 93 // for i, v := range s { 94 // dst[i] = v / t[i] 95 // } 96 // return dst 97 func DivTo(dst, x, y []float64) []float64 98 99 // DotUnitary is 100 // for i, v := range x { 101 // sum += y[i] * v 102 // } 103 // return sum 104 func DotUnitary(x, y []float64) (sum float64) 105 106 // DotInc is 107 // for i := 0; i < int(n); i++ { 108 // sum += y[iy] * x[ix] 109 // ix += incX 110 // iy += incY 111 // } 112 // return sum 113 func DotInc(x, y []float64, n, incX, incY, ix, iy uintptr) (sum float64) 114 115 // L1Dist is 116 // var norm float64 117 // for i, v := range s { 118 // norm += math.Abs(t[i] - v) 119 // } 120 // return norm 121 func L1Dist(s, t []float64) float64 122 123 // LinfDist is 124 // var norm float64 125 // if len(s) == 0 { 126 // return 0 127 // } 128 // norm = math.Abs(t[0] - s[0]) 129 // for i, v := range s[1:] { 130 // absDiff := math.Abs(t[i+1] - v) 131 // if absDiff > norm || math.IsNaN(norm) { 132 // norm = absDiff 133 // } 134 // } 135 // return norm 136 func LinfDist(s, t []float64) float64 137 138 // ScalUnitary is 139 // for i := range x { 140 // x[i] *= alpha 141 // } 142 func ScalUnitary(alpha float64, x []float64) 143 144 // ScalUnitaryTo is 145 // for i, v := range x { 146 // dst[i] = alpha * v 147 // } 148 func ScalUnitaryTo(dst []float64, alpha float64, x []float64) 149 150 // ScalInc is 151 // var ix uintptr 152 // for i := 0; i < int(n); i++ { 153 // x[ix] *= alpha 154 // ix += incX 155 // } 156 func ScalInc(alpha float64, x []float64, n, incX uintptr) 157 158 // ScalIncTo is 159 // var idst, ix uintptr 160 // for i := 0; i < int(n); i++ { 161 // dst[idst] = alpha * x[ix] 162 // ix += incX 163 // idst += incDst 164 // } 165 func ScalIncTo(dst []float64, incDst uintptr, alpha float64, x []float64, n, incX uintptr) 166 167 // Sum is 168 // var sum float64 169 // for i := range x { 170 // sum += x[i] 171 // } 172 func Sum(x []float64) float64 173 174 // L2NormUnitary returns the L2-norm of x. 175 // var scale float64 176 // sumSquares := 1.0 177 // for _, v := range x { 178 // if v == 0 { 179 // continue 180 // } 181 // absxi := math.Abs(v) 182 // if math.IsNaN(absxi) { 183 // return math.NaN() 184 // } 185 // if scale < absxi { 186 // s := scale / absxi 187 // sumSquares = 1 + sumSquares*s*s 188 // scale = absxi 189 // } else { 190 // s := absxi / scale 191 // sumSquares += s * s 192 // } 193 // if math.IsInf(scale, 1) { 194 // return math.Inf(1) 195 // } 196 // } 197 // return scale * math.Sqrt(sumSquares) 198 func L2NormUnitary(x []float64) (norm float64) 199 200 // L2NormInc returns the L2-norm of x. 201 // var scale float64 202 // sumSquares := 1.0 203 // for ix := uintptr(0); ix < n*incX; ix += incX { 204 // val := x[ix] 205 // if val == 0 { 206 // continue 207 // } 208 // absxi := math.Abs(val) 209 // if math.IsNaN(absxi) { 210 // return math.NaN() 211 // } 212 // if scale < absxi { 213 // s := scale / absxi 214 // sumSquares = 1 + sumSquares*s*s 215 // scale = absxi 216 // } else { 217 // s := absxi / scale 218 // sumSquares += s * s 219 // } 220 // } 221 // if math.IsInf(scale, 1) { 222 // return math.Inf(1) 223 // } 224 // return scale * math.Sqrt(sumSquares) 225 func L2NormInc(x []float64, n, incX uintptr) (norm float64) 226 227 // L2DistanceUnitary returns the L2-norm of x-y. 228 // var scale float64 229 // sumSquares := 1.0 230 // for i, v := range x { 231 // v -= y[i] 232 // if v == 0 { 233 // continue 234 // } 235 // absxi := math.Abs(v) 236 // if math.IsNaN(absxi) { 237 // return math.NaN() 238 // } 239 // if scale < absxi { 240 // s := scale / absxi 241 // sumSquares = 1 + sumSquares*s*s 242 // scale = absxi 243 // } else { 244 // s := absxi / scale 245 // sumSquares += s * s 246 // } 247 // } 248 // if math.IsInf(scale, 1) { 249 // return math.Inf(1) 250 // } 251 // return scale * math.Sqrt(sumSquares) 252 func L2DistanceUnitary(x, y []float64) (norm float64)