def bencher_hessian(cost_name, ndim, method_name, x0): cost_function, cost_function_prime, hessian = mk_costs(ndim)[0][cost_name] method = methods[method_name] f_prime = CountingFunction(cost_function_prime) hessian = CountingFunction(hessian, counter=f_prime.counter) f = LoggingFunction(cost_function, counter=f_prime.counter) method(f, x0, jac=f_prime, hess=hessian) this_costs = np.array(f.all_f_i) return this_costs, np.array(f.counts)
(mk_quad(.02), bfgs), (mk_gauss(.02), bfgs), ((rosenbrock, rosenbrock_prime, rosenbrock_hessian), bfgs), (mk_quad(.02), powell), (mk_gauss(.02), powell), ((rosenbrock, rosenbrock_prime, rosenbrock_hessian), powell), (mk_gauss(.02), nelder_mead), ((rosenbrock, rosenbrock_prime, rosenbrock_hessian), nelder_mead), )): # Compute a gradient-descent x_i, y_i = 1.6, 1.1 counting_f_prime = CountingFunction(f_prime) counting_hessian = CountingFunction(hessian) logging_f = LoggingFunction(f, counter=counting_f_prime.counter) all_x_i, all_y_i, all_f_i = optimizer(np.array([x_i, y_i]), logging_f, counting_f_prime, hessian=counting_hessian) # Plot the contour plot if not max(all_y_i) < y_max: x_min *= 1.2 x_max *= 1.2 y_min *= 1.2 y_max *= 1.2 x, y = np.mgrid[x_min:x_max:100j, y_min:y_max:100j] x = x.T y = y.T