github.com/wzzhu/tensor@v0.9.24/generic_utils.go (about) 1 // Code generated by genlib2. DO NOT EDIT. 2 3 package tensor 4 5 import ( 6 "math/rand" 7 "reflect" 8 9 "github.com/pkg/errors" 10 "gorgonia.org/vecf32" 11 "gorgonia.org/vecf64" 12 ) 13 14 // Range creates a ranged array with a given type. It panics if the Dtype is not supported or does not represent a naturally orderable type (strings, pointers etc) 15 // Do note that the range algorithm is very simple, and simply does increments or decrements of 1. This means for floating point types 16 // you're not able to create a range with a 0.1 increment step, and for complex number types, the imaginary part will always be 0i 17 func Range(dt Dtype, start, end int) interface{} { 18 size := end - start 19 incr := true 20 if start > end { 21 incr = false 22 size = start - end 23 } 24 25 if size < 0 { 26 panic("Cannot create a range that is negative in size") 27 } 28 switch dt.Kind() { 29 case reflect.Int: 30 retVal := make([]int, size) 31 for i, v := 0, int(start); i < size; i++ { 32 retVal[i] = v 33 if incr { 34 v++ 35 } else { 36 v-- 37 } 38 } 39 return retVal 40 case reflect.Int8: 41 retVal := make([]int8, size) 42 for i, v := 0, int8(start); i < size; i++ { 43 retVal[i] = v 44 if incr { 45 v++ 46 } else { 47 v-- 48 } 49 } 50 return retVal 51 case reflect.Int16: 52 retVal := make([]int16, size) 53 for i, v := 0, int16(start); i < size; i++ { 54 retVal[i] = v 55 if incr { 56 v++ 57 } else { 58 v-- 59 } 60 } 61 return retVal 62 case reflect.Int32: 63 retVal := make([]int32, size) 64 for i, v := 0, int32(start); i < size; i++ { 65 retVal[i] = v 66 if incr { 67 v++ 68 } else { 69 v-- 70 } 71 } 72 return retVal 73 case reflect.Int64: 74 retVal := make([]int64, size) 75 for i, v := 0, int64(start); i < size; i++ { 76 retVal[i] = v 77 if incr { 78 v++ 79 } else { 80 v-- 81 } 82 } 83 return retVal 84 case reflect.Uint: 85 retVal := make([]uint, size) 86 for i, v := 0, uint(start); i < size; i++ { 87 retVal[i] = v 88 if incr { 89 v++ 90 } else { 91 v-- 92 } 93 } 94 return retVal 95 case reflect.Uint8: 96 retVal := make([]uint8, size) 97 for i, v := 0, uint8(start); i < size; i++ { 98 retVal[i] = v 99 if incr { 100 v++ 101 } else { 102 v-- 103 } 104 } 105 return retVal 106 case reflect.Uint16: 107 retVal := make([]uint16, size) 108 for i, v := 0, uint16(start); i < size; i++ { 109 retVal[i] = v 110 if incr { 111 v++ 112 } else { 113 v-- 114 } 115 } 116 return retVal 117 case reflect.Uint32: 118 retVal := make([]uint32, size) 119 for i, v := 0, uint32(start); i < size; i++ { 120 retVal[i] = v 121 if incr { 122 v++ 123 } else { 124 v-- 125 } 126 } 127 return retVal 128 case reflect.Uint64: 129 retVal := make([]uint64, size) 130 for i, v := 0, uint64(start); i < size; i++ { 131 retVal[i] = v 132 if incr { 133 v++ 134 } else { 135 v-- 136 } 137 } 138 return retVal 139 case reflect.Float32: 140 return vecf32.Range(start, end) 141 case reflect.Float64: 142 return vecf64.Range(start, end) 143 case reflect.Complex64: 144 retVal := make([]complex64, size) 145 for i, v := 0, complex(float32(start), float32(0.0)); i < size; i++ { 146 retVal[i] = v 147 if incr { 148 v++ 149 } else { 150 v-- 151 } 152 } 153 return retVal 154 case reflect.Complex128: 155 retVal := make([]complex128, size) 156 for i, v := 0, complex(float64(start), float64(0.0)); i < size; i++ { 157 retVal[i] = v 158 if incr { 159 v++ 160 } else { 161 v-- 162 } 163 } 164 return retVal 165 default: 166 err := errors.Errorf("Unrangeable Type %v", dt) 167 panic(err) 168 } 169 } 170 171 // Random creates an array of random numbers of the given type. 172 // For complex Dtypes, the imaginary component will be 0. 173 // 174 // This function is only useful in cases where the randomness is not vital. 175 func Random(dt Dtype, size int) interface{} { 176 r := rand.New(rand.NewSource(1337)) 177 switch dt.Kind() { 178 case reflect.Int: 179 retVal := make([]int, size) 180 for i := range retVal { 181 retVal[i] = int(r.Int()) 182 } 183 return retVal 184 case reflect.Int8: 185 retVal := make([]int8, size) 186 for i := range retVal { 187 retVal[i] = int8(r.Int()) 188 } 189 return retVal 190 case reflect.Int16: 191 retVal := make([]int16, size) 192 for i := range retVal { 193 retVal[i] = int16(r.Int()) 194 } 195 return retVal 196 case reflect.Int32: 197 retVal := make([]int32, size) 198 for i := range retVal { 199 retVal[i] = int32(r.Int()) 200 } 201 return retVal 202 case reflect.Int64: 203 retVal := make([]int64, size) 204 for i := range retVal { 205 retVal[i] = int64(r.Int()) 206 } 207 return retVal 208 case reflect.Uint: 209 retVal := make([]uint, size) 210 for i := range retVal { 211 retVal[i] = uint(r.Uint32()) 212 } 213 return retVal 214 case reflect.Uint8: 215 retVal := make([]uint8, size) 216 for i := range retVal { 217 retVal[i] = uint8(r.Uint32()) 218 } 219 return retVal 220 case reflect.Uint16: 221 retVal := make([]uint16, size) 222 for i := range retVal { 223 retVal[i] = uint16(r.Uint32()) 224 } 225 return retVal 226 case reflect.Uint32: 227 retVal := make([]uint32, size) 228 for i := range retVal { 229 retVal[i] = uint32(r.Uint32()) 230 } 231 return retVal 232 case reflect.Uint64: 233 retVal := make([]uint64, size) 234 for i := range retVal { 235 retVal[i] = uint64(r.Uint32()) 236 } 237 return retVal 238 case reflect.Float32: 239 retVal := make([]float32, size) 240 for i := range retVal { 241 retVal[i] = float32(r.NormFloat64()) 242 } 243 return retVal 244 case reflect.Float64: 245 retVal := make([]float64, size) 246 for i := range retVal { 247 retVal[i] = rand.NormFloat64() 248 } 249 return retVal 250 case reflect.Complex64: 251 retVal := make([]complex64, size) 252 for i := range retVal { 253 retVal[i] = complex(r.Float32(), float32(0)) 254 } 255 return retVal 256 case reflect.Complex128: 257 retVal := make([]complex128, size) 258 for i := range retVal { 259 retVal[i] = complex(r.Float64(), float64(0)) 260 } 261 return retVal 262 } 263 panic("unreachable") 264 }