class_docstr: Similar to ZRule.
  The only difference is the addition of a numerical stabilizer term
  epsilon to the decomposition function's denominator.
  the sign of epsilon depends on the sign of the output activation
  0 is considered to be positive, ie sign(0) = 1
class_docstr_tok: ["Similar","to","ZRule",".","The","only","difference","is","the","addition","of","a","numerical","stabilizer","term","epsilon","to","the","decomposition","function","'s","denominator",".","the","sign","of","epsilon","depends","on","the","sign","of","the","output","activation","0","is","considered","to","be","positive",",","ie","sign","(","0",")","=","1"]
code: def apply(
      self,
      Xs: list[Tensor],
      _Ys: list[Tensor],
      Rs: list[Tensor],
      _reverse_state: dict,
  ):
      # The epsilon rule aligns epsilon with the (extended) sign:
      # 0 is considered to be positive
      prepare_div = klayers.Lambda(
          lambda x: x
          + (
              kbackend.cast(
                  kbackend.greater_equal(x, 0), kbackend.floatx()
              )
              * 2
              - 1
          )
          * self._epsilon
      )
  
      # Get activations.
      Zs = ibackend.apply(self._layer_wo_act, Xs)
  
      # Divide incoming relevance by the activations.
      tmp = [a / prepare_div(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 EpsilonRule obj's underlying member method code with example usage: obj.apply(Xs, _Ys, Rs, _reverse_state) and returns: unknown