def _listwise_loss(self, logits_in, labels_in, masks):
"""
Copied from Hanshu.
:param logits_in:
:param labels_in:
:param masks: B,B
:return:
"""
_EPSILON = 1e-10
logits_bb = tf.subtract(tf.expand_dims(logits_in, 1), tf.zeros_like(tf.expand_dims(logits_in, 0)))
logits_bb = tf.squeeze(logits_bb, [2])
logits_final = tf.where(masks, logits_bb, tf.log(_EPSILON) * tf.ones_like(logits_bb))
labels_bb = tf.subtract(tf.expand_dims(labels_in, 1), tf.zeros_like(tf.expand_dims(labels_in, 0)))
labels_bb = tf.squeeze(labels_bb, [2])
labels_final = tf.where(masks, labels_bb, tf.zeros_like(labels_bb))
label_sum = tf.reduce_sum(input_tensor=labels_final, axis=0, keep_dims=True)
nonzero_mask = tf.greater(tf.reshape(label_sum, [-1]), 0.0)
padded_labels = tf.where(nonzero_mask, labels_final, _EPSILON * tf.ones_like(labels_final)) *