def _maybe_compose()

in tensorflow_privacy/privacy/analysis/rdp_privacy_accountant.py [0:0]


  def _maybe_compose(self, event: dp_event.DpEvent, count: int,
                     do_compose: bool) -> bool:
    """Traverses `event` and performs composition if `do_compose` is True.

    If `do_compose` is False, can be used to check whether composition is
    supported.

    Args:
      event: A `DpEvent` to process.
      count: The number of times to compose the event.
      do_compose: Whether to actually perform the composition.

    Returns:
      True if event is supported, otherwise False.
    """

    if isinstance(event, dp_event.NoOpDpEvent):
      return True
    elif isinstance(event, dp_event.NonPrivateDpEvent):
      if do_compose:
        self._rdp += np.inf
      return True
    elif isinstance(event, dp_event.SelfComposedDpEvent):
      return self._maybe_compose(event.event, event.count * count, do_compose)
    elif isinstance(event, dp_event.ComposedDpEvent):
      return all(
          self._maybe_compose(e, count, do_compose) for e in event.events)
    elif isinstance(event, dp_event.GaussianDpEvent):
      if do_compose:
        self._rdp += count * _compute_rdp_poisson_subsampled_gaussian(
            q=1.0, noise_multiplier=event.noise_multiplier, orders=self._orders)
      return True
    elif isinstance(event, dp_event.PoissonSampledDpEvent):
      if self._neighboring_relation is not NeighborRel.ADD_OR_REMOVE_ONE:
        return False
      gaussian_noise_multiplier = _effective_gaussian_noise_multiplier(
          event.event)
      if gaussian_noise_multiplier is None:
        return False
      if do_compose:
        self._rdp += count * _compute_rdp_poisson_subsampled_gaussian(
            q=event.sampling_probability,
            noise_multiplier=gaussian_noise_multiplier,
            orders=self._orders)
      return True
    elif isinstance(event, dp_event.SampledWithoutReplacementDpEvent):
      if self._neighboring_relation is not NeighborRel.REPLACE_ONE:
        return False
      gaussian_noise_multiplier = _effective_gaussian_noise_multiplier(
          event.event)
      if gaussian_noise_multiplier is None:
        return False
      if do_compose:
        self._rdp += count * _compute_rdp_sample_wor_gaussian(
            q=event.sample_size / event.source_dataset_size,
            noise_multiplier=gaussian_noise_multiplier,
            orders=self._orders)
      return True
    else:
      # Unsupported event (including `UnsupportedDpEvent`).
      return False