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 }