(self, output, grad, weights=(), state=(), new_state=(),
                       rng=None)
return reconstructed_x, (x_grad, weights_grad)
Backward pass: computes the inverse of a layer and propagates gradients.

    While you may choose to only implement reverse, some layers implement this
    function directly as computation may be shared between reversing and
    computing gradients.

    Args:
      output: Output activations; can be a (possibly nested) tuple.
      grad: gradient signal (cotangent) computed based on subsequent layers.
        The structure and shape must match the output.
      weights: layer weights
      state: start state
      new_state: updated state computed by the forward pass
      rng: Single-use random number generator (JAX PRNG key).

    Returns:
      A tuple (x, (x_grad, weights_grad)), where x is the reconstructed input,
      x_grad is the gradient signal for the input, and weights_grad is the
      gradient signal for the weights.
Backward pass: computes the inverse of a layer and propagates gradients.
Backward pass : computes the inverse of a layer and propagates gradients .
def reverse_and_grad(self, output, grad, weights=(), state=(), new_state=(),
                       rng=None):
    """Backward pass: computes the inverse of a layer and propagates gradients.

    While you may choose to only implement reverse, some layers implement this
    function directly as computation may be shared between reversing and
    computing gradients.

    Args:
      output: Output activations; can be a (possibly nested) tuple.
      grad: gradient signal (cotangent) computed based on subsequent layers.
        The structure and shape must match the output.
      weights: layer weights
      state: start state
      new_state: updated state computed by the forward pass
      rng: Single-use random number generator (JAX PRNG key).

    Returns:
      A tuple (x, (x_grad, weights_grad)), where x is the reconstructed input,
      x_grad is the gradient signal for the input, and weights_grad is the
      gradient signal for the weights.
    """
    reconstructed_x = self.reverse(output, weights, state, new_state, rng)
    _, vjpfun = fastmath.vjp(
        self._pure_forward, reconstructed_x, weights, state, rng)
    x_grad, weights_grad, _, _ = vjpfun(grad)
    return reconstructed_x, (x_grad, weights_grad)
def reverse_and_grad ( self , output , grad , weights = ( ) , state = ( ) , new_state = ( ) , rng = None ) : reconstructed_x = self . reverse ( output , weights , state , new_state , rng ) _ , vjpfun = fastmath . vjp ( self . _pure_forward , reconstructed_x , weights , state , rng ) x_grad , weights_grad , _ , _ = vjpfun ( grad ) return reconstructed_x , ( x_grad , weights_grad )