def METHOD_NAME(dist, regret, payoff_matrices, num_players):
  """Computes regret delta to be added to regret in update.
  Args:
    dist: list of 1-d np.arrays, current estimate of nash distribution
    regret: list of 1-d np.arrays (same as dist), current estimate of regrets
    payoff_matrices: dictionary with keys as tuples of agents (i, j) and
        values of (2 x A x A) np.arrays, payoffs for each joint action. keys
        are sorted and arrays should be indexed in the same order
    num_players: int, number of players, in case payoff_matrices is abbreviated
  Returns:
    deltas w.r.t. (dist, regret) as tuple
    unregularized exploitability (stochastic estimate)
    solver exploitability (stochastic estimate) - NaN
  """
  del regret
  # first compute best responses and payoff gradients
  grad_dist = []
  grad_regret = []
  unreg_exp = []
  for i in range(num_players):
    nabla_i = np.zeros_like(dist[i])
    # TODO(imgemp): decide if averaging over nablas provides best comparison
    for j in range(num_players):
      if j == i:
        continue
      if i < j:
        hess_i_ij = payoff_matrices[(i, j)][0]
      else:
        hess_i_ij = payoff_matrices[(j, i)][1].T
      nabla_ij = hess_i_ij.dot(dist[j])
      nabla_i += nabla_ij / float(num_players - 1)
    grad_dist_i = np.NaN * np.ones_like(nabla_i)
    grad_dist.append(grad_dist_i)
    utility_i = nabla_i.dot(dist[i])
    grad_regret_i = nabla_i - utility_i
    grad_regret.append(grad_regret_i)
    unreg_exp.append(np.max(nabla_i) - nabla_i.dot(dist[i]))
  return (grad_dist, grad_regret), np.mean(unreg_exp), np.NaN