docs: def J(self):
          '''
          Compute Jacobian. Analyze dr graph first to disable unnecessary caching
          '''
          result = self.dr_wrt(self.x, profiler=self.profiler).copy()
          if self.profiler:
              self.profiler.harvest()
          return np.atleast_2d(result) if not sp.issparse(result) else result