'Create a SparseDispatcher.
Args:
num_experts: an integer.
gates: a `Tensor` of shape `[batch_size, num_experts]`.
Returns:
a SparseDispatcher'

def __init__(self, num_experts, gates):

    self._gates = gates
    self._num_experts = num_experts
    where = tf.to_int32(tf.where((tf.transpose(gates) > 0)))
    (self._expert_index, self._batch_index) = tf.unstack(where, num=2, axis=1)
    self._part_sizes_tensor = tf.reduce_sum(tf.to_int32((gates > 0)), [0])
    self._nonzero_gates = tf.gather(tf.reshape(self._gates, [(-1)]), ((self._batch_index * num_experts) + self._expert_index))
