docs: def _choicerank(n_items, data, params):
      """Inner loop of ChoiceRank algorithm."""
      weights = exp_transform(params)
      adj, adj_t, traffic_in, traffic_out = data
      # First phase of message passing.
      zs = adj.dot(weights)
      # Second phase of message passing.
      with np.errstate(invalid="ignore"):
          denoms = adj_t.dot(traffic_out / zs)
      return traffic_in, denoms