pub trait NonlinearSystem {
type Real: Float;
type Layout: RowMap;
// Required methods
fn layout(&self) -> &Self::Layout;
fn jacobian(&self) -> &dyn JacobianCache<Self::Real>;
fn jacobian_mut(&mut self) -> &mut dyn JacobianCache<Self::Real>;
fn residual(&self, x: &[Self::Real], out: &mut [Self::Real]);
fn refresh_jacobian(&mut self, x: &[Self::Real]);
// Provided method
fn jacobian_dense(&mut self, x: &[Self::Real], jac: &mut Mat<Self::Real>) { ... }
}