code: def __call__(self, prev_grads):
      result = []
      for input_tensor, jac_fn in zip(self._inputs, self._fns):
          jacobian = jac_fn(input_tensor)
          dims = list(range(jacobian.dim()))
          permuted_dims = (
              dims[input_tensor.dim() :] + dims[: input_tensor.dim()]
          )
          result.append(
              (
                  jacobian.permute(dims=permuted_dims).reshape(
                      shape=(*input_tensor.shape, -1)
                  )
                  * prev_grads.ravel()
              ).sum(-1)
          )
      return result
  
imports: import functools
  from typing import Callable
  import ivy
  import ivy.functional.frontends.torch
label_desc: Use image node_id 2 for calling the GradFn obj's underlying member method code with example usage: obj.__call__(prev_grads) and returns: result