Esempio n. 1
0
def test_basis(get_test_dimensions) -> None:
    """Testing orthonormality of basis vectors."""
    for dim in get_test_dimensions:
        pairs = [(i, j) for i in range(dim) for j in range(dim)]
        for (i, j) in pairs:
            vi = basis(dim, i)
            vj = basis(dim, j)
            almost_equal(vi.T @ vj, 1 if i == j else 0)
Esempio n. 2
0
def lindbladian_population(U_dict: dict, lvl: int, gate: str):
    U = U_dict[gate]
    lvls = int(np.sqrt(U.shape[0]))
    psi_0 = tf.constant(basis(lvls, 0), dtype=tf.complex128)
    dv_0 = tf_dm_to_vec(tf_state_to_dm(psi_0))
    dv_actual = tf.matmul(U, dv_0)
    return populations(dv_actual, lindbladian=True)[lvl]
Esempio n. 3
0
    def initialise(self, drift_H, lindbladian=False, init_temp=None):
        """
        Prepare the initial state of the system. At the moment finite temperature requires open system dynamics.

        Parameters
        ----------
        drift_H : tf.Tensor
            Drift Hamiltonian.
        lindbladian : boolean
            Whether to include open system dynamics. Required for Temperature > 0.
        init_temp : Quantity
            Temperature of the device.

        Returns
        -------
        tf.Tensor
            State or density vector
        """
        if init_temp is None:
            init_temp = tf.cast(self.params["init_temp"].get_value(),
                                dtype=tf.complex128)
        diag = tf.linalg.diag_part(drift_H)
        dim = len(diag)
        if abs(init_temp) > np.finfo(
                float).eps:  # this checks that it's not zero
            # TODO Deal with dressed basis for thermal state
            freq_diff = diag - diag[0]
            beta = 1 / (init_temp * constants.kb)
            det_bal = tf.exp(-constants.hbar * freq_diff * beta)
            norm_bal = det_bal / tf.reduce_sum(det_bal)
            dm = tf.linalg.diag(norm_bal)
            if lindbladian:
                return tf_utils.tf_dm_to_vec(dm)
            else:
                raise Warning(
                    "C3:WARNING: We still need to do Von Neumann right.")
        else:
            state = tf.constant(qt_utils.basis(dim, 0),
                                shape=[dim, 1],
                                dtype=tf.complex128)
            if lindbladian:
                return tf_utils.tf_dm_to_vec(tf_utils.tf_state_to_dm(state))
            else:
                return state
Esempio n. 4
0
def orbit_infid(
    U_dict,
    RB_number: int = 30,
    RB_length: int = 20,
    lindbladian=False,
    shots: int = None,
    seqs=None,
    noise=None
):
    if not seqs:
        seqs = single_length_RB(RB_number=RB_number, RB_length=RB_length)
    Us = evaluate_sequences(U_dict, seqs)
    infids = []
    for U in Us:
        dim = int(U.shape[0])
        psi_init = tf.constant(basis(dim, 0), dtype=tf.complex128)
        psi_actual = tf.matmul(U, psi_init)
        pop0 = tf_abs(psi_actual[0])**2
        p1 = 1 - pop0
        if shots:
            vals = tf.keras.backend.random_binomial(
                [shots],
                p=p1,
                dtype=tf.float64,
            )
            # if noise:
            #     vals = vals + (np.random.randn(shots) * noise)
            infid = tf.reduce_mean(vals)
        else:
            infid = p1
            # if noise:
            #     infid = infid + (np.random.randn() * noise)
        if noise:
            infid = infid + (np.random.randn() * noise)

        infids.append(infid)
    return tf_ave(infids)
Esempio n. 5
0
def leakage_RB(
   U_dict,
   min_length: int = 5,
   max_length: int = 500,
   num_lengths: int = 20,
   num_seqs: int = 30,
   logspace=False,
   lindbladian=False
):
    # print('Performing leakage RB fit experiment.')
    gate = list(U_dict.keys())[0]
    U = U_dict[gate]
    dim = int(U.shape[0])
    psi_init = tf.constant(basis(dim, 0), dtype=tf.complex128)
    if logspace:
        lengths = np.rint(
                    np.logspace(
                        np.log10(min_length),
                        np.log10(max_length),
                        num=num_lengths
                        )
                    ).astype(int)
    else:
        lengths = np.rint(
                    np.linspace(
                        min_length,
                        max_length,
                        num=num_lengths
                        )
                    ).astype(int)
    comp_surv = []
    surv_prob = []
    for L in lengths:
        seqs = single_length_RB(num_seqs, L)
        Us = evaluate_sequences(U_dict, seqs)
        pop0s = []
        pop_comps = []
        for U in Us:
            pops = populations(tf.matmul(U, psi_init), lindbladian)
            pop0s.append(float(pops[0]))
            pop_comps.append(float(pops[0])+float(pops[1]))
        surv_prob.append(pop0s)
        comp_surv.append(pop_comps)

    def RB_leakage(len, r_leak, A_leak, B_leak):
        return A_leak + B_leak * r_leak**(len)
    bounds = (0, 1)
    init_guess = [0.9, 0.5, 0.5]
    fitted = False
    while not fitted:
        try:
            comp_means = np.mean(comp_surv, axis=1)
            comp_stds = np.std(comp_surv, axis=1) / np.sqrt(len(comp_surv[0]))
            solution, cov = curve_fit(RB_leakage,
                                      lengths,
                                      comp_means,
                                      sigma=comp_stds,
                                      bounds=bounds,
                                      p0=init_guess)
            r_leak, A_leak, B_leak = solution
            fitted = True
        except Exception as message:
            print(message)
            if logspace:
                new_lengths = np.rint(
                            np.logspace(
                                np.log10(max_length + min_length),
                                np.log10(max_length * 2),
                                num=num_lengths
                                )
                            ).astype(int)
            else:
                new_lengths = np.rint(
                            np.linspace(
                                max_length + min_length,
                                max_length*2,
                                num=num_lengths
                                )
                            ).astype(int)
            max_length = max_length * 2
            for L in new_lengths:
                seqs = single_length_RB(num_seqs, L)
                Us = evaluate_sequences(U_dict, seqs)
                pop0s = []
                pop_comps = []
                for U in Us:
                    pops = populations(tf.matmul(U, psi_init), lindbladian)
                    pop0s.append(float(pops[0]))
                    pop_comps.append(float(pops[0]))
                surv_prob.append(pop0s)
                comp_surv.append(pop_comps)
            lengths = np.append(lengths, new_lengths)

    def RB_surv(len, r, A, C):
        return A + B_leak * r_leak**(len) + C * r**(len)
    bounds = (0, 1)
    init_guess = [0.9, 0.5, 0.5]

    fitted = False
    while not fitted:
        try:
            surv_means = np.mean(surv_prob, axis=1)
            surv_stds = np.std(surv_prob, axis=1) / np.sqrt(len(surv_prob[0]))
            solution, cov = curve_fit(RB_surv,
                                      lengths,
                                      surv_means,
                                      sigma=surv_stds,
                                      bounds=bounds,
                                      p0=init_guess)
            r, A, C = solution
            fitted = True
        except Exception as message:
            print(message)
            if logspace:
                new_lengths = np.rint(
                            np.logspace(
                                np.log10(max_length + min_length),
                                np.log10(max_length * 2),
                                num=num_lengths
                                )
                            ).astype(int)
            else:
                new_lengths = np.rint(
                            np.linspace(
                                max_length + min_length,
                                max_length*2,
                                num=num_lengths
                                )
                            ).astype(int)
            max_length = max_length * 2
            for L in new_lengths:
                seqs = single_length_RB(num_seqs, L)
                Us = evaluate_sequences(U_dict, seqs)
                pop0s = []
                pop_comps = []
                for U in Us:
                    pops = populations(tf.matmul(U, psi_init), lindbladian)
                    pop0s.append(float(pops[0]))
                    pop_comps.append(float(pops[0]))
                surv_prob.append(pop0s)
                comp_surv.append(pop_comps)
            lengths = np.append(lengths, new_lengths)

    leakage = (1-A_leak)*(1-r_leak)
    seepage = A_leak*(1-r_leak)
    fid = 0.5*(r+1-leakage)
    epc = 1 - fid
    return epc, leakage, seepage, r_leak, A_leak, B_leak, r, A, C
Esempio n. 6
0
def RB(
       U_dict,
       min_length: int = 5,
       max_length: int = 500,
       num_lengths: int = 20,
       num_seqs: int = 30,
       logspace=False,
       lindbladian=False,
       padding=""
       ):
    # print('Performing RB fit experiment.')
    gate = list(U_dict.keys())[0]
    U = U_dict[gate]
    dim = int(U.shape[0])
    psi_init = tf.constant(basis(dim, 0), dtype=tf.complex128)
    if logspace:
        lengths = np.rint(
                    np.logspace(
                        np.log10(min_length),
                        np.log10(max_length),
                        num=num_lengths
                        )
                    ).astype(int)
    else:
        lengths = np.rint(
                    np.linspace(
                        min_length,
                        max_length,
                        num=num_lengths
                        )
                    ).astype(int)
    surv_prob = []
    for L in lengths:
        seqs = single_length_RB(num_seqs, L, padding)
        Us = evaluate_sequences(U_dict, seqs)
        pop0s = []
        for U in Us:
            pops = populations(tf.matmul(U, psi_init), lindbladian)
            pop0s.append(float(pops[0]+pops[1]))
        surv_prob.append(pop0s)

    def RB_fit(len, r, A, B):
        return A * r**(len) + B
    bounds = (0, 1)
    init_guess = [0.9, 0.5, 0.5]
    fitted = False
    while not fitted:
        try:
            means = np.mean(surv_prob, axis=1)
            stds = np.std(surv_prob, axis=1) / np.sqrt(len(surv_prob[0]))
            solution, cov = curve_fit(RB_fit,
                                      lengths,
                                      means,
                                      sigma=stds,
                                      bounds=bounds,
                                      p0=init_guess)
            r, A, B = solution
            fitted = True
        except Exception as message:
            print(message)
            if logspace:
                new_lengths = np.rint(
                            np.logspace(
                                np.log10(max_length + min_length),
                                np.log10(max_length * 2),
                                num=num_lengths
                                )
                            ).astype(int)
            else:
                new_lengths = np.rint(
                            np.linspace(
                                max_length + min_length,
                                max_length*2,
                                num=num_lengths
                                )
                            ).astype(int)
            max_length = max_length * 2
            for L in new_lengths:
                seqs = single_length_RB(num_seqs, L, padding)
                Us = evaluate_sequences(U_dict, seqs)
                pop0s = []
                for U in Us:
                    pops = populations(tf.matmul(U, psi_init), lindbladian)
                    pop0s.append(float(pops[0]+pops[1]))
                surv_prob.append(pop0s)
            lengths = np.append(lengths, new_lengths)
    epc = 0.5 * (1 - r)
    print("epc:", epc)
    epg = 1 - ((1-epc)**(1/4))
    print("epg:", epg)
    # print('example seq: ', seqs[0])

    fig, ax = plt.subplots()
    ax.plot(lengths,
            surv_prob,
            marker='o',
            color='red',
            linestyle='None')
    ax.errorbar(lengths,
                means,
                yerr=stds,
                color='blue',
                marker='x',
                linestyle='None')
    plt.title('RB results')
    plt.ylabel('Population in 0')
    plt.xlabel('\# Cliffords')
    plt.ylim(0, 1)
    plt.xlim(0, lengths[-1])
    fitted = RB_fit(lengths, r, A, B)
    ax.plot(lengths, fitted)
    plt.text(0.1, 0.1,
             'r={:.4f}, A={:.3f}, B={:.3f}'.format(r, A, B),
             size=16,
             transform=ax.transAxes)
    plt.show()
    # return epc, r, A, B, fig, ax
    return epg
Esempio n. 7
0
def population(U_dict: dict, lvl: int, gate: str):
    U = U_dict[gate]
    lvls = U.shape[0]
    psi_0 = tf.constant(basis(lvls, 0), dtype=tf.complex128)
    psi_actual = tf.matmul(U, psi_0)
    return populations(psi_actual, lindbladian=False)[lvl]
Esempio n. 8
0
def RB(
    U_dict,
    min_length: int = 5,
    max_length: int = 500,
    num_lengths: int = 20,
    num_seqs: int = 30,
    logspace=False,
    lindbladian=False,
    padding="",
):
    gate = list(U_dict.keys())[0]
    U = U_dict[gate]
    dim = int(U.shape[0])
    psi_init = tf.constant(basis(dim, 0), dtype=tf.complex128)
    if logspace:
        lengths = np.rint(
            np.logspace(np.log10(min_length),
                        np.log10(max_length),
                        num=num_lengths)).astype(int)
    else:
        lengths = np.rint(np.linspace(min_length, max_length,
                                      num=num_lengths)).astype(int)
    surv_prob = []
    for L in lengths:
        seqs = single_length_RB(num_seqs, L, padding)
        Us = evaluate_sequences(U_dict, seqs)
        pop0s = []
        for U in Us:
            pops = populations(tf.matmul(U, psi_init), lindbladian)
            pop0s.append(float(pops[0]))
        surv_prob.append(pop0s)

    def RB_fit(len, r, A, B):
        return A * r**(len) + B

    bounds = (0, 1)
    init_guess = [0.9, 0.5, 0.5]
    fitted = False
    while not fitted:
        try:
            means = np.mean(surv_prob, axis=1)
            stds = np.std(surv_prob, axis=1) / np.sqrt(len(surv_prob[0]))
            solution, cov = curve_fit(RB_fit,
                                      lengths,
                                      means,
                                      sigma=stds,
                                      bounds=bounds,
                                      p0=init_guess)
            r, A, B = solution
            fitted = True
        except Exception as message:
            print(message)
            if logspace:
                new_lengths = np.rint(
                    np.logspace(
                        np.log10(max_length + min_length),
                        np.log10(max_length * 2),
                        num=num_lengths,
                    )).astype(int)
            else:
                new_lengths = np.rint(
                    np.linspace(max_length + min_length,
                                max_length * 2,
                                num=num_lengths)).astype(int)
            max_length = max_length * 2
            for L in new_lengths:
                seqs = single_length_RB(num_seqs, L, padding)
                Us = evaluate_sequences(U_dict, seqs)
                pop0s = []
                for U in Us:
                    pops = populations(tf.matmul(U, psi_init), lindbladian)
                    pop0s.append(float(pops[0]))
                surv_prob.append(pop0s)
            lengths = np.append(lengths, new_lengths)
    epc = 0.5 * (1 - r)
    epg = 1 - ((1 - epc)**(1 / 4))  # TODO: adjust to be mean length of
    return epg