/** This contains functions to find the "argmin" of a function, that is, given a single-argument function and a list of input values, returns an array of the input value(s) where the function has the minimum value. */ argmin[f, data] := { min = undef results = new array for arg = data { val = f[arg] if min == undef { min = val results.push[arg] } else { if val < min // New minimum, replace results list { results = [arg] min = val } else if val == min // Identical min, push arg to arg list results.push[arg] } } return results } /** This contains functions to find the "argmax" of a function, that is, given a single-argument function and a list of input values, returns an array of the input value(s) where the function has the maxmium value. */ argmax[f, data] := { max = undef results = new array for arg = data { val = f[arg] if max == undef { max = val results.push[arg] } else { if val > max // New maximum, replace results list { results = [arg] max = val } else if val == max // Identical max, push arg to arg list results.push[arg] } } return results } /* // Example usages squareFunc = {|x| x^2} data = [-1, 1, -2] println["argmin: " + argmin[squareFunc, data]] println["argmax: " + argmax[squareFunc, data]] println[] data = [[2,-3],[3,5],[2,5],[-2,3],[-2,-3]] product = getFunction["product", 1] println["argmin: " + argmin[product, data]] println["argmax: " + argmax[product, data]] */