code: def _update_doc_distribution(
      X,
      exp_topic_word_distr,
      doc_topic_prior,
      max_iters,
      mean_change_tol,
      cal_sstats,
      random_state,
  ):
      """E-step: update document-topic distribution.
  
      Parameters
      ----------
      X : array-like or sparse matrix, shape=(n_samples, n_features)
          Document word matrix.
  
      exp_topic_word_distr : dense matrix, shape=(n_topics, n_features)
          Exponential value of expection of log topic word distribution.
          In the literature, this is `exp(E[log(beta)])`.
  
      doc_topic_prior : float
          Prior of document topic distribution `theta`.
  
      max_iters : int
          Max number of iterations for updating document topic distribution in
          the E-step.
  
      mean_change_tol : float
          Stopping tolerance for updating document topic distribution in E-setp.
  
      cal_sstats : boolean
          Parameter that indicate to calculate sufficient statistics or not.
          Set `cal_sstats` to `True` when we need to run M-step.
  
      random_state : RandomState instance or None
          Parameter that indicate how to initialize document topic distribution.
          Set `random_state` to None will initialize document topic distribution
          to a constant number.
  
      Returns
      -------
      (doc_topic_distr, suff_stats) :
          `doc_topic_distr` is unnormalized topic distribution for each document.
          In the literature, this is `gamma`. we can calculate `E[log(theta)]`
          from it.
          `suff_stats` is expected sufficient statistics for the M-step.
              When `cal_sstats == False`, this will be None.
  
      """
      is_sparse_x = sp.issparse(X)
      n_samples, n_features = X.shape
      n_topics = exp_topic_word_distr.shape[0]
  
      if random_state:
          doc_topic_distr = random_state.gamma(
              100.0, 0.01, (n_samples, n_topics)
          )
      else:
          doc_topic_distr = np.ones((n_samples, n_topics))
  
      # In the literature, this is `exp(E[log(theta)])`
      exp_doc_topic = np.exp(_dirichlet_expectation_2d(doc_topic_distr))
  
      # diff on `component_` (only calculate it when `cal_diff` is True)
      suff_stats = (
          np.zeros(exp_topic_word_distr.shape) if cal_sstats else None
      )
  
      if is_sparse_x:
          X_data = X.data
          X_indices = X.indices
          X_indptr = X.indptr
  
      for idx_d in xrange(n_samples):
          if is_sparse_x:
              ids = X_indices[X_indptr[idx_d] : X_indptr[idx_d + 1]]
              cnts = X_data[X_indptr[idx_d] : X_indptr[idx_d + 1]]
          else:
              ids = np.nonzero(X[idx_d, :])[0]
              cnts = X[idx_d, ids]
  
          doc_topic_d = doc_topic_distr[idx_d, :]
          # The next one is a copy, since the inner loop overwrites it.
          exp_doc_topic_d = exp_doc_topic[idx_d, :].copy()
          exp_topic_word_d = exp_topic_word_distr[:, ids]
  
          # Iterate between `doc_topic_d` and `norm_phi` until convergence
          for _ in xrange(0, max_iters):
              last_d = doc_topic_d
  
              # The optimal phi_{dwk} is proportional to
              # exp(E[log(theta_{dk})]) * exp(E[log(beta_{dw})]).
              norm_phi = np.dot(exp_doc_topic_d, exp_topic_word_d) + EPS
  
              doc_topic_d = exp_doc_topic_d * np.dot(
                  cnts / norm_phi, exp_topic_word_d.T
              )
              # Note: adds doc_topic_prior to doc_topic_d, in-place.
              _dirichlet_expectation_1d(
                  doc_topic_d, doc_topic_prior, exp_doc_topic_d
              )
  
              if mean_change(last_d, doc_topic_d) < mean_change_tol:
                  break
          doc_topic_distr[idx_d, :] = doc_topic_d
  
          # Contribution of document d to the expected sufficient
          # statistics for the M step.
          if cal_sstats:
              norm_phi = np.dot(exp_doc_topic_d, exp_topic_word_d) + EPS
              suff_stats[:, ids] += np.outer(
                  exp_doc_topic_d, cnts / norm_phi
              )
  
      return (doc_topic_distr, suff_stats)
  
imports: import numpy
  import scipy.sparse
  from scipy.special import gammaln
  import warnings
  from ..base import BaseEstimator, TransformerMixin
  from ..utils import check_random_state, check_array, gen_batches, gen_even_slices, _get_n_jobs
  from ..utils.validation import check_non_negative
  from ..utils.extmath import logsumexp
  from ..externals.joblib import Parallel, delayed
  from ..externals.six.moves import xrange
  from ..exceptions import NotFittedError
  from ._online_lda import mean_change, _dirichlet_expectation_1d, _dirichlet_expectation_2d
label_desc: Use image node_id 1 for calling a global function with example usage: _update_doc_distribution(X, exp_topic_word_distr, doc_topic_prior, max_iters, mean_change_tol, cal_sstats, random_state) and returns: doc_topic_distr,  suff_stats