Example #1
0
def calculate_metrics(sample_data, probabilities, epoch):
    """Calculates the metrics."""
    def convert_bitstring_array_to_probabilities(array):
        return probabilities[
            data_loader.convert_binary_digits_array_to_bitstrings(array)]

    sampled_probabilities = convert_bitstring_array_to_probabilities(
        sample_data)
    mean_p = np.mean(sampled_probabilities)
    logging.info('Min sampled probability %f', np.min(sampled_probabilities))
    logging.info('Max sampled probability %f', np.max(sampled_probabilities))
    logging.info('Mean sampled probability %f', mean_p)
    logging.info('Space size %d', probabilities.size)
    fidelity = probabilities.size * mean_p - 1
    logistic_fidelity = np.log(probabilities.size) + np.euler_gamma + np.mean(
        np.log(sampled_probabilities))
    logging.info('Linear Fidelity: %f', fidelity)
    logging.info('Logistic Fidelity: %f', logistic_fidelity)
    int_array = data_loader.convert_binary_digits_array_to_bitstrings(
        sample_data)
    values_in_test, counts_in_test = np.unique(int_array, return_counts=True)
    test_counts = np.zeros(2**FLAGS.num_qubits)
    test_counts[values_in_test] = counts_in_test
    chisquare_result = stats.chisquare(f_obs=test_counts,
                                       f_exp=probabilities * len(int_array))
    logging.info('chisquare p value: %f', chisquare_result.pvalue)
    if FLAGS.save_test_counts:
        if FLAGS.num_qubits > 25:
            raise ValueError(
                f'num_qubits ({FLAGS.num_qubits}) is too large to save test_counts'
            )
        with tf.io.gfile.GFile(
                os.path.join(FLAGS.checkpoint_dir, f'f_obs_{epoch}.npy'),
                'wb') as f:
            np.save(f, test_counts)
        with tf.io.gfile.GFile(
                os.path.join(FLAGS.checkpoint_dir, f'f_exp_{epoch}.npy'),
                'wb') as f:
            np.save(f, probabilities * len(int_array))

    train_array = np.zeros((2**FLAGS.num_qubits))
    for i in data_loader.convert_binary_digits_array_to_bitstrings(
            sample_data):
        train_array[i] += 1
    # Smooth and normalize
    adj_train_array = (train_array + FLAGS.kl_smoothing) / np.sum(train_array)
    adj_train_array = adj_train_array / np.sum(adj_train_array)
    kl_div = np.sum(scipy.special.kl_div(probabilities, adj_train_array))
    logging.info('KL Divergence: %f', kl_div)

    return fidelity, logistic_fidelity, kl_div, chisquare_result.pvalue
Example #2
0
 def convert_bitstring_array_to_probabilities(array):
   return probabilities[data_loader.convert_binary_digits_array_to_bitstrings(
       array)]
 def test_convert_binary_digits_array_to_bitstrings(self):
   self.assertListEqual(
       list(data_loader.convert_binary_digits_array_to_bitstrings(
           np.array([[0, 0, 1, 1], [0, 1, 0, 0], [0, 0, 0, 1]]))),
       [3, 4, 1])