e.g. `dual_objective(model, y, p)` and `dual_objective_and_gradient(model, y, p)` that takes care of the `y` shapes Need to consider batching and CUDA compat here.