def define_methods(x, f, grad, hess, tol=1e-8):
return {
"naive_newton": lambda: newtons_method(x, f, grad, hess, tol=tol),
"naive_cg": lambda: conjugate_gradient(x, f, grad, hess, tol=tol),
"CG": lambda: optimize.minimize(f, x, jac=grad, method="CG", tol=tol),
"newton-cg": lambda: optimize.minimize(f, x, jac=grad, hess=None, method="Newton-CG", tol=tol),
"newton-cg w/ H": lambda: optimize.minimize(f, x, jac=grad, hess=hess, method="Newton-CG", tol=tol),
"trust-ncg": lambda: optimize.minimize(f, x, jac=grad, hess=hess, method="trust-ncg", tol=tol),
"bfgs": lambda: optimize.minimize(f, x, jac=grad, method="BFGS", tol=tol),
"bfgs w/o G": lambda: optimize.minimize(f, x, method="BFGS", tol=tol),
"l-bfgs-b": lambda: optimize.minimize(f, x, method="L-BFGS-B", tol=tol),
"nelder-mead": lambda: optimize.minimize(f, x, method="Nelder-Mead", tol=tol)
}