def test_trainingcomplex(self): print("Complex Wavefunction") print("--------------------") train_samples_path = os.path.join( __tests_location__, "..", "examples", "Tutorial2_TrainComplexWavefunction", "qubits_train.txt", ) train_bases_path = os.path.join( __tests_location__, "..", "examples", "Tutorial2_TrainComplexWavefunction", "qubits_train_bases.txt", ) bases_path = os.path.join( __tests_location__, "..", "examples", "Tutorial2_TrainComplexWavefunction", "qubits_bases.txt", ) psi_path = os.path.join( __tests_location__, "..", "examples", "Tutorial2_TrainComplexWavefunction", "qubits_psi.txt", ) train_samples, target_psi, train_bases, bases = data.load_data( train_samples_path, psi_path, train_bases_path, bases_path) unitary_dict = unitaries.create_dict() nv = nh = train_samples.shape[-1] fidelities = [] KLs = [] epochs = 5 batch_size = 50 num_chains = 10 CD = 10 lr = 0.1 log_every = 5 print( "Training 10 times and checking fidelity and KL at 5 epochs...\n") for i in range(10): print("Iteration: ", i + 1) nn_state = ComplexWavefunction(unitary_dict=unitary_dict, num_visible=nv, num_hidden=nh, gpu=False) space = nn_state.generate_hilbert_space(nv) callbacks = [ MetricEvaluator( log_every, { "Fidelity": ts.fidelity, "KL": ts.KL }, target_psi=target_psi, bases=bases, space=space, verbose=True, ) ] self.initialize_complex_params(nn_state) nn_state.fit( data=train_samples, epochs=epochs, pos_batch_size=batch_size, neg_batch_size=num_chains, k=CD, lr=lr, time=True, input_bases=train_bases, progbar=False, callbacks=callbacks, ) fidelities.append(ts.fidelity(nn_state, target_psi, space).item()) KLs.append(ts.KL(nn_state, target_psi, space, bases=bases).item()) print("\nStatistics") print("----------") print( "Fidelity: ", np.average(fidelities), "+/-", np.std(fidelities) / np.sqrt(len(fidelities)), "\n", ) print("KL: ", np.average(KLs), "+/-", np.std(KLs) / np.sqrt(len(KLs)), "\n") self.assertTrue(abs(np.average(fidelities) - 0.38) < 0.05) self.assertTrue(abs(np.average(KLs) - 0.33) < 0.05) self.assertTrue((np.std(fidelities) / np.sqrt(len(fidelities))) < 0.01) self.assertTrue((np.std(KLs) / np.sqrt(len(KLs))) < 0.01)
import numpy as np import matplotlib.pyplot as plt from qucumber.nn_states import PositiveWaveFunction from qucumber.callbacks import MetricEvaluator import qucumber.utils.training_statistics as ts import qucumber.utils.data as data import qucumber psi_path = "phi_fourier.txt" train_path = "data_fourier.txt" train_data, true_psi = data.load_data(train_path, psi_path) nv = train_data.shape[-1] nh = nv * 10 nn_state = PositiveWaveFunction(num_visible=nv, num_hidden=nh, gpu=False) def psi_coefficient(nn_state, space, A, **kwargs): norm = nn_state.compute_normalization(space).sqrt_() return A * nn_state.psi(space)[0][0] / norm pbs = 100 nbs = pbs epochs = 500 lr = 0.005 k = 10 period = 50 space = nn_state.generate_hilbert_space()
def test_trainingpositive(self): print("Positive Wavefunction") print("---------------------") train_samples_path = os.path.join( __tests_location__, "..", "examples", "Tutorial1_TrainPosRealWavefunction", "tfim1d_data.txt", ) psi_path = os.path.join( __tests_location__, "..", "examples", "Tutorial1_TrainPosRealWavefunction", "tfim1d_psi.txt", ) train_samples, target_psi = data.load_data(train_samples_path, psi_path) nv = nh = train_samples.shape[-1] fidelities = [] KLs = [] epochs = 5 batch_size = 100 num_chains = 200 CD = 10 lr = 0.1 log_every = 5 print( "Training 10 times and checking fidelity and KL at 5 epochs...\n") for i in range(10): print("Iteration: ", i + 1) nn_state = PositiveWavefunction(num_visible=nv, num_hidden=nh, gpu=False) space = nn_state.generate_hilbert_space(nv) callbacks = [ MetricEvaluator( log_every, { "Fidelity": ts.fidelity, "KL": ts.KL }, target_psi=target_psi, space=space, verbose=True, ) ] self.initialize_posreal_params(nn_state) nn_state.fit( data=train_samples, epochs=epochs, pos_batch_size=batch_size, neg_batch_size=num_chains, k=CD, lr=lr, time=True, progbar=False, callbacks=callbacks, ) fidelities.append(ts.fidelity(nn_state, target_psi, space).item()) KLs.append(ts.KL(nn_state, target_psi, space).item()) print("\nStatistics") print("----------") print( "Fidelity: ", np.average(fidelities), "+/-", np.std(fidelities) / np.sqrt(len(fidelities)), "\n", ) print("KL: ", np.average(KLs), "+/-", np.std(KLs) / np.sqrt(len(KLs)), "\n") self.assertTrue(abs(np.average(fidelities) - 0.85) < 0.02) self.assertTrue(abs(np.average(KLs) - 0.29) < 0.05) self.assertTrue((np.std(fidelities) / np.sqrt(len(fidelities))) < 0.01) self.assertTrue((np.std(KLs) / np.sqrt(len(KLs))) < 0.01)
def quantum_state_training_data(request): nn_state_type = request.param if nn_state_type == PositiveWaveFunction: root = os.path.join( request.fspath.dirname, "..", "examples", "Tutorial1_TrainPosRealWaveFunction", ) train_samples, target = data.load_data( tr_samples_path=os.path.join(root, "tfim1d_data.txt"), tr_psi_path=os.path.join(root, "tfim1d_psi.txt"), ) train_bases, bases = None, None nn_state = PositiveWaveFunction(num_visible=train_samples.shape[-1], gpu=False) batch_size, num_chains = 100, 200 fid_target, kl_target = 0.85, 0.29 reinit_params_fn = initialize_posreal_params elif nn_state_type == ComplexWaveFunction: root = os.path.join( request.fspath.dirname, "..", "examples", "Tutorial2_TrainComplexWaveFunction", ) train_samples, target, train_bases, bases = data.load_data( tr_samples_path=os.path.join(root, "qubits_train.txt"), tr_psi_path=os.path.join(root, "qubits_psi.txt"), tr_bases_path=os.path.join(root, "qubits_train_bases.txt"), bases_path=os.path.join(root, "qubits_bases.txt"), ) nn_state = ComplexWaveFunction(num_visible=train_samples.shape[-1], gpu=False) batch_size, num_chains = 50, 10 fid_target, kl_target = 0.38, 0.33 reinit_params_fn = initialize_complex_params elif nn_state_type == DensityMatrix: root = os.path.join(request.fspath.dirname, "..", "examples", "Tutorial3_TrainDensityMatrix") train_samples, target, train_bases, bases = data.load_data_DM( tr_samples_path=os.path.join(root, "N2_W_state_100_samples_data.txt"), tr_mtx_real_path=os.path.join(root, "N2_W_state_target_real.txt"), tr_mtx_imag_path=os.path.join(root, "N2_W_state_target_imag.txt"), tr_bases_path=os.path.join(root, "N2_W_state_100_samples_bases.txt"), bases_path=os.path.join(root, "N2_IC_bases.txt"), ) nn_state = DensityMatrix(num_visible=train_samples.shape[-1], gpu=False) batch_size, num_chains = 100, 10 fid_target, kl_target = 0.45, 0.42 def reinit_params_fn(request, nn_state): nn_state.reinitialize_parameters() else: raise ValueError( f"invalid test config: {nn_state_type} is not a valid quantum state type" ) return { "nn_state": nn_state, "data": train_samples, "input_bases": train_bases, "target": target, "bases": bases, "epochs": 5, "pos_batch_size": batch_size, "neg_batch_size": num_chains, "k": 10, "lr": 0.1, "space": nn_state.generate_hilbert_space(), "fid_target": fid_target, "kl_target": kl_target, "reinit_params_fn": reinit_params_fn, }