class_docstr: Basic LRP decomposition rule (for layers with weight kernels),
  which considers the bias a constant input neuron.
class_docstr_tok: ["Basic","LRP","decomposition","rule","(","for","layers","with","weight","kernels",")",",","which","considers","the","bias","a","constant","input","neuron","."]
code: def apply(
      self,
      Xs: list[Tensor],
      _Ys: list[Tensor],
      Rs: list[Tensor],
      _reverse_state,
  ) -> list[Tensor]:
      # Get activations.
      Zs = ibackend.apply(self._layer_wo_act, Xs)
      # Divide incoming relevance by the activations.
      tmp = [ibackend.safe_divide(a, b) for a, b in zip(Rs, Zs)]
      # Propagate the relevance to input neurons
      # using the gradient.
      grads = ibackend.gradients(Xs, Zs, tmp)
      # Re-weight relevance with the input values.
      return [klayers.Multiply()([a, b]) for a, b in zip(Xs, grads)]
  
imports: from __future__ import annotations
  import numpy
  import tensorflow.keras.backend
  import tensorflow.keras.layers
  import innvestigate.analyzer.relevance_based.utils
  import innvestigate.backend
  import innvestigate.backend.graph
  import innvestigate.layers
  from innvestigate.backend.types import Layer, OptionalList, Tensor
label_desc: Use image node_id 2 for calling the ZRule obj's underlying member method code with example usage: obj.apply(Xs, _Ys, Rs, _reverse_state) and returns: unknown