code: def logmgf_exact(q, priv_eps, l):
      """Computes the logmgf value given q and privacy eps.
  
      The bound used is the min of three terms. The first term is from
      https://arxiv.org/pdf/1605.02065.pdf.
      The second term is based on the fact that when event has probability (1-q) for
      q close to zero, q can only change by exp(eps), which corresponds to a
      much smaller multiplicative change in (1-q)
      The third term comes directly from the privacy guarantee.
      Args:
        q: pr of non-optimal outcome
        priv_eps: eps parameter for DP
        l: moment to compute.
      Returns:
        Upper bound on logmgf
      """
      if q < 0.5:
          t_one = (1 - q) * math.pow(
              (1 - q) / (1 - math.exp(priv_eps) * q), l
          )
          t_two = q * math.exp(priv_eps * l)
          t = t_one + t_two
          try:
              log_t = math.log(t)
          except ValueError:
              print(
                  "Got ValueError in math.log for values :"
                  + str((q, priv_eps, l, t))
              )
              log_t = priv_eps * l
      else:
          log_t = priv_eps * l
  
      return min(
          0.5 * priv_eps * priv_eps * l * (l + 1), log_t, priv_eps * l
      )
  
file_path: privacy/research/pate_2017/analysis.py
imports: import os
  import math
  import numpy
  from six.moves import xrange
  import tensorflow.compat.v1
  import maybe_download
label_desc: Use image node_id 3 for calling a global function with example usage: logmgf_exact(q, priv_eps, l) and returns: min