Solvers, Optimizers, and Automatic Differentiation