class_docstr: Compute VJPs, JVPs and Jacobians via a gradient transform :class:`~.TransformDispatcher`.
  
  Args:
      inner_execute (Callable[[Tuple[QuantumTape]], ResultBatch]): a function that
          executes the batch of circuits and returns their results.
      gradient_transform (.TransformDispatcher): the gradient transform to use.
      gradient_kwargs (dict): Any keyword arguments for the gradient transform.
  
  Keyword Args:
      cache_full_jacobian=False (bool): Whether or not to compute the full jacobian and cache it,
          instead of treating each call as independent. This keyword argument is used to patch problematic
          autograd behavior when caching is turned off. In this case, caching will be based on the identity
          of the batch, rather than the potentially expensive :attr:`~.QuantumScript.hash` that is used
          by :func:`~.cache_execute`.
  
  >>> inner_execute = qml.device('default.qubit').execute
  >>> gradient_transform = qml.gradients.param_shift
  >>> kwargs = {"broadcast": True}
  >>> jpc = TransformJacobianProducts(inner_execute, gradient_transform, kwargs)
class_docstr_tok: ["Compute","VJPs",",","JVPs","and","Jacobians","via","a","gradient","transform",":","class",":","`","~.TransformDispatcher","`",".","Args",":","inner_execute","(","Callable","[","[","Tuple","[","QuantumTape","]","]",",","ResultBatch","]",")",":","a","function","that","executes","the","batch","of","circuits","and","returns","their","results",".","gradient_transform","(",".TransformDispatcher",")",":","the","gradient","transform","to","use",".","gradient_kwargs","(","dict",")",":","Any","keyword","arguments","for","the","gradient","transform",".","Keyword","Args",":","cache_full_jacobian=False","(","bool",")",":","Whether","or","not","to","compute","the","full","jacobian","and","cache","it",",","instead","of","treating","each","call","as","independent",".","This","keyword","argument","is","used","to","patch","problematic","autograd","behavior","when","caching","is","turned","off",".","In","this","case",",","caching","will","be","based","on","the","identity","of","the","batch",",","rather","than","the","potentially","expensive",":","attr",":","`","~.QuantumScript.hash","`","that","is","used","by",":","func",":","`","~.cache_execute","`",".",">",">",">","inner_execute","=","qml.device","(","'default.qubit","'",")",".execute",">",">",">","gradient_transform","=","qml.gradients.param_shift",">",">",">","kwargs","=","{","``","broadcast","''",":","True","}",">",">",">","jpc","=","TransformJacobianProducts","(","inner_execute",",","gradient_transform",",","kwargs",")"]
code: def execute_and_compute_jacobian(self, tapes: Batch):
      if logger.isEnabledFor(logging.DEBUG):  # pragma: no cover
          logger.debug(
              "execute_and_compute_jacobian called with %s", tapes
          )
  
      num_result_tapes = len(tapes)
  
      partial_gradient_fn = partial(
          self._gradient_transform, **self._gradient_kwargs
      )
      (
          jac_tapes,
          jac_postprocessing,
      ) = qml.transforms.map_batch_transform(partial_gradient_fn, tapes)
  
      full_batch = tapes + tuple(jac_tapes)
      full_results = self._inner_execute(full_batch)
      results = full_results[:num_result_tapes]
      jac_results = full_results[num_result_tapes:]
      jacs = jac_postprocessing(jac_results)
      return tuple(results), tuple(jacs)
  
imports: import abc
  from functools import partial
  import inspect
  import logging
  from typing import Tuple, Callable, Optional, Union
  from cachetools import LRUCache
  import numpy
  import pennylane
  from pennylane.tape import QuantumScript
  from pennylane.typing import ResultBatch, TensorLike
label_desc: Use image node_id 5 for calling the TransformJacobianProducts obj's underlying member method code with example usage: obj.execute_and_compute_jacobian(tapes) and returns: tuple,  tuple