code: def compute_epsilon(
      self, delta: float, delta_error: float, eps_error: float
  ) -> Tuple[float, float, float]:
      if delta <= 0:
          return (float("inf"),) * 3
  
      if (
          np.finfo(np.longdouble).eps * self.domain.size
          > delta - delta_error
      ):
          raise ValueError(
              "Floating point errors will dominate for such small values of delta. "
              "Increase delta or reduce domain size."
          )
  
      t = self.domain.ts
      p = self.pmf
      d1 = np.flip(np.flip(p).cumsum())
      d2 = np.flip(np.flip(p * np.exp(-t)).cumsum())
      ndelta = np.exp(t) * d2 - d1
  
      def find_epsilon(delta_target):
          i = np.searchsorted(ndelta, -delta_target, side="left")
          if i <= 0:
              raise RuntimeError("Cannot compute epsilon")
          return np.log((d1[i] - delta_target) / d2[i])
  
      eps_upper = find_epsilon(delta - delta_error) + eps_error
      eps_lower = find_epsilon(delta + delta_error) - eps_error
      eps_estimate = find_epsilon(delta)
      return eps_lower, eps_estimate, eps_upper
  
imports: from dataclasses import dataclass
  from typing import Tuple
  import numpy
  from scipy import integrate
  from scipy.special import erfc
  from ..rdp import _compute_rdp
  from .domain import Domain
label_desc: Use image node_id 2 for calling the DiscretePRV obj's underlying member method code with example usage: obj.compute_epsilon(delta, delta_error, eps_error) and returns: eps_lower,  eps_estimate,  eps_upper, unknown, np