go-ml.dev/pkg/base@v0.0.0-20200610162856-60c38abac71b/fu/minmax.go (about)

     1  package fu
     2  
     3  import "reflect"
     4  
     5  /*
     6  Min returns minimal value
     7  */
     8  func Min(a ...interface{}) interface{} {
     9  	return a[MinIndex(reflect.ValueOf(a))]
    10  }
    11  
    12  /*
    13  MaxValue returns maximal value
    14  */
    15  func MinValue(a reflect.Value) reflect.Value {
    16  	return a.Index(MinIndex(a))
    17  }
    18  
    19  /*
    20  MinIndex returns index of minimal value
    21  */
    22  func MinIndex(a reflect.Value) int {
    23  	if a.Kind() != reflect.Slice {
    24  		panic("only slice is allowed as an argument")
    25  	}
    26  	N := a.Len()
    27  	d := 0
    28  	r := a.Index(0)
    29  	for i := 1; i < N; i++ {
    30  		j := a.Index(i)
    31  		if Less(j, r) {
    32  			r = j
    33  			d = i
    34  		}
    35  	}
    36  	return d
    37  }
    38  
    39  /*
    40  Max returns maximal value
    41  */
    42  func Max(a ...interface{}) interface{} {
    43  	return a[MaxIndex(reflect.ValueOf(a))]
    44  }
    45  
    46  /*
    47  MaxValue returns maximal value
    48  */
    49  func MaxValue(a reflect.Value) reflect.Value {
    50  	return a.Index(MaxIndex(a))
    51  }
    52  
    53  /*
    54  MaxIndex returns index of maximal value
    55  */
    56  func MaxIndex(a reflect.Value) int {
    57  	if a.Kind() != reflect.Slice {
    58  		panic("only slice is allowed as an argument")
    59  	}
    60  	N := a.Len()
    61  	d := 0
    62  	r := a.Index(0)
    63  	for i := 1; i < N; i++ {
    64  		j := a.Index(i)
    65  		if Less(r, j) {
    66  			r = j
    67  			d = i
    68  		}
    69  	}
    70  	return d
    71  }
    72  
    73  /*
    74  IndexOfMin returns index of minimal value
    75  */
    76  func IndexOfMin(a interface{}) int {
    77  	v := reflect.ValueOf(a)
    78  	return MinIndex(v)
    79  }
    80  
    81  /*
    82  Mini returns minimal int value
    83  */
    84  func Mini(a int, b ...int) int {
    85  	q := a
    86  	for _, x := range b {
    87  		if x < q {
    88  			q = x
    89  		}
    90  	}
    91  	return q
    92  }
    93  
    94  /*
    95  Minr returns minimal float32 value
    96  */
    97  func Minr(a float32, b ...float32) float32 {
    98  	q := a
    99  	for _, x := range b {
   100  		if x < q {
   101  			q = x
   102  		}
   103  	}
   104  	return q
   105  }
   106  
   107  /*
   108  Mind returns minimal float32 value
   109  */
   110  func Mind(a float64, b ...float64) float64 {
   111  	q := a
   112  	for _, x := range b {
   113  		if x < q {
   114  			q = x
   115  		}
   116  	}
   117  	return q
   118  }
   119  
   120  /*
   121  IndexOfMax returns index of maximal value
   122  */
   123  func IndexOfMax(a interface{}) int {
   124  	v := reflect.ValueOf(a)
   125  	return MaxIndex(v)
   126  }
   127  
   128  func Indmaxd(a []float64) int {
   129  	j := 0
   130  	for i, x := range a {
   131  		if x > a[j] {
   132  			j = i
   133  		}
   134  	}
   135  	return j
   136  }
   137  
   138  func Rindmaxd(a []float64) int {
   139  	j := 0
   140  	for i, x := range a {
   141  		if x >= a[j] {
   142  			j = i
   143  		}
   144  	}
   145  	return j
   146  }
   147  
   148  func Indmind(a []float64) int {
   149  	j := 0
   150  	for i, x := range a {
   151  		if x < a[j] {
   152  			j = i
   153  		}
   154  	}
   155  	return j
   156  }
   157  
   158  func Rindmind(a []float64) int {
   159  	j := 0
   160  	for i, x := range a {
   161  		if x <= a[j] {
   162  			j = i
   163  		}
   164  	}
   165  	return j
   166  }
   167  
   168  /*
   169  Maxi returns maximal int value
   170  */
   171  func Maxi(a int, b ...int) int {
   172  	q := a
   173  	for _, x := range b {
   174  		if x > q {
   175  			q = x
   176  		}
   177  	}
   178  	return q
   179  }
   180  
   181  /*
   182  Maxr returns maximal float32 value
   183  */
   184  func Maxr(a float32, b ...float32) float32 {
   185  	q := a
   186  	for _, x := range b {
   187  		if x > q {
   188  			q = x
   189  		}
   190  	}
   191  	return q
   192  }
   193  
   194  /*
   195  Maxd returns maximal float64 value
   196  */
   197  func Maxd(a float64, b ...float64) float64 {
   198  	q := a
   199  	for _, x := range b {
   200  		if x > q {
   201  			q = x
   202  		}
   203  	}
   204  	return q
   205  }