Example #1
0
    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()
Example #3
0
    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)
Example #4
0
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,
    }