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  }