reuse gradient function when possible