code: def calculate_partial_expected_mutual_information(n, x_i, y_j):
      """Calculates the partial expected mutual information (EMI) of two variables.
  
        EMI reflects the MI expected by chance, and is used to compute adjusted
        mutual information. See www.wikipedia.org/wiki/Adjusted_mutual_information.
  
        The EMI for two variables x and y, is the sum of the expected mutual info
        for each value of x with each value of y. This function computes the EMI
        for a single value of each variable (x_i, y_j) and is thus considered a
        partial EMI calculation.
  
        Specifically:
        EMI(x, y) = sum_{n_ij = max(0, x_i + y_j - n) to min(x_i, y_j)} (
          n_ij / n * log2((n * n_ij / (x_i * y_j))
          * ((x_i! * y_j! * (n - x_i)! * (n - y_j)!) /
          (n! * n_ij! * (x_i - n_ij)! * (y_j - n_ij)! * (n - x_i - y_j + n_ij)!)))
        where n_ij is the joint count of x taking on value i and y taking on
        value j, x_i is the count for x taking on value i, y_j is the count for y
        taking on value j, and n represents total count.
  
      Args:
        n: The sum of weights for all values.
        x_i: The sum of weights for the first variable taking on value i
        y_j: The sum of weights for the second variable taking on value j
  
      Returns:
        Calculated expected mutual information for x_i, y_j.
      """
      if x_i == 0 or y_j == 0:
          return 0
      coefficient = -log2(x_i) - log2(y_j) + log2(n)
      sum_probability = 0.0
      partial_result = 0.0
      for n_j, p_j in _hypergeometric_pmf(n, x_i, y_j):
          if n_j != 0:
              partial_result += n_j * (coefficient + log2(n_j)) * p_j
          sum_probability += p_j
      # The values of p_j should sum to 1, but given approximate calculations for
      # log2(x) and exp2(x) with large x, the full pmf might not sum to exactly 1.
      # We correct for this by dividing by the sum of the probabilities.
      return partial_result / sum_probability
  
imports: import math
label_desc: Use image node_id 1 for calling a global function with example usage: calculate_partial_expected_mutual_information(n, x_i, y_j) and returns: unknown, int