code: def entropy_from_samples(samples, vec):
      
      samples_cat = tf.argmax(samples[:, :NUM_CLASS], axis=1, output_type=tf.int32)
      samples_uniform = samples[:, NUM_CLASS:]
      cat, uniform = get_distributions(vec[:, :NUM_CLASS], vec[:, NUM_CLASS:])
  
      def neg_logprob(dist, sample, name):
          nll = -dist.log_prob(sample)
          # average over batch
          return tf.reduce_sum(tf.reduce_mean(nll, axis=0), name=name)
  
      entropies = [neg_logprob(cat, samples_cat, 'nll_cat'),
                   neg_logprob(uniform, samples_uniform, 'nll_uniform')]
      return entropies
docs: Estimate H(x|s) ~= -E_{x \sim P(x|s)}[\log Q(x|s)], where x are samples, and Q is parameterized by vec.