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
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])