def expectation_importance_sampler_logspace(<EOL>log_f,<EOL>log_p,<EOL>sampling_dist_q,<EOL>z=None,<EOL>n=None,<EOL>seed=None,<EOL>name='<STR_LIT>'):
q = sampling_dist_q<EOL>with tf.name_scope(name):<EOL><INDENT>z = _get_samples(q, z, n, seed)<EOL>log_values = log_f(z) + log_p(z) - q.log_prob(z)<EOL>return _logspace_mean(log_values)<EOL><DEDENT>
r"""Importance sampling with a positive function, in log-space.

    With \\(p(z) := exp^{log_p(z)}\\), and \\(f(z) = exp{log_f(z)}\\),
    this `Op` returns

    \\(Log[ n^{-1} sum_{i=1}^n [ f(z_i) p(z_i) / q(z_i) ] ],  z_i ~ q,\\)
    \\(\approx Log[ E_q[ f(Z) p(Z) / q(Z) ] ]\\)
    \\(=       Log[E_p[f(Z)]]\\)

    This integral is done in log-space with max-subtraction to better handle the
    often extreme values that `f(z) p(z) / q(z)` can take on.

    In contrast to `expectation_importance_sampler`, this `Op` returns values in
    log-space.


    User supplies either `Tensor` of samples `z`, or number of samples to draw `n`

    Args:
      log_f: Callable mapping samples from `sampling_dist_q` to `Tensors` with
        shape broadcastable to `q.batch_shape`.
        For example, `log_f` works "just like" `sampling_dist_q.log_prob`.
      log_p:  Callable mapping samples from `sampling_dist_q` to `Tensors` with
        shape broadcastable to `q.batch_shape`.
        For example, `log_p` works "just like" `q.log_prob`.
      sampling_dist_q:  The sampling distribution.
        `tfp.distributions.Distribution`.
        `float64` `dtype` recommended.
        `log_p` and `q` should be supported on the same set.
      z:  `Tensor` of samples from `q`, produced by `q.sample` for some `n`.
      n:  Integer `Tensor`.  Number of samples to generate if `z` is not provided.
      seed:  Python integer to seed the random number generator.
      name:  A name to give this `Op`.

    Returns:
      Logarithm of the importance sampling estimate.  `Tensor` with `shape` equal
        to batch shape of `q`, and `dtype` = `q.dtype`.