'Returns subsampled minibatch.
Args:
indicator: boolean tensor of shape [N] whose True entries can be sampled.
batch_size: desired batch size.
labels: boolean tensor of shape [N] denoting positive(=True) and negative
(=False) examples.
Returns:
is_sampled: boolean tensor of shape [N], True for entries which are
sampled.
Raises:
ValueError: if labels and indicator are not 1D boolean tensors.'

def subsample(self, indicator, batch_size, labels):

    if (len(indicator.get_shape().as_list()) != 1):
        raise ValueError(('indicator    must    be    1    dimensional,    got    a    tensor    of    shape    %s' % indicator.get_shape()))
    if (len(labels.get_shape().as_list()) != 1):
        raise ValueError(('labels    must    be    1    dimensional,    got    a    tensor    of    shape    %s' % labels.get_shape()))
    if (labels.dtype != tf.bool):
        raise ValueError(('labels    should    be    of    type    bool.    Received:    %s' % labels.dtype))
    if (indicator.dtype != tf.bool):
        raise ValueError(('indicator    should    be    of    type    bool.    Received:    %s' % indicator.dtype))
    negative_idx = tf.logical_not(labels)
    positive_idx = tf.logical_and(labels, indicator)
    negative_idx = tf.logical_and(negative_idx, indicator)
    max_num_pos = int((self._positive_fraction * batch_size))
    sampled_pos_idx = self.subsample_indicator(positive_idx, max_num_pos)
    max_num_neg = (batch_size - tf.reduce_sum(tf.cast(sampled_pos_idx, tf.int32)))
    sampled_neg_idx = self.subsample_indicator(negative_idx, max_num_neg)
    sampled_idx = tf.logical_or(sampled_pos_idx, sampled_neg_idx)
    return sampled_idx
