Beispiel #1
0
def NuclearInitializationWithRemoteInitialization(name,
                                                  carbon_nr=5,
                                                  carbon_init_state='up',
                                                  el_RO='positive',
                                                  detuning=0.5e3,
                                                  el_state=0,
                                                  beating_wait_time=1e-6,
                                                  free_evolution_time=400e-6 +
                                                  np.linspace(0., 6.0e-3, 44),
                                                  debug=False):

    m = DD.NuclearInitializationWithRemoteInitialization(name)
    funcs.prepare(m)
    '''Set parameters'''
    m.params['C13_MBI_RO_state'] = 0
    m.params['C13_MBI_threshold_list'] = [1, 1]

    m.params['beating_wait_time'] = beating_wait_time - (
        (m.params['C13_MBI_RO_duration'] + m.params['SP_duration_after_C13']) *
        1e-6 + 20e-6)
    m.params[
        'add_wait_gate'] = True  #could be removed, does the beating wait gate and ramsey times

    m.params['reps_per_ROsequence'] = 250

    ### Sweep parameters

    m.params['Tomography Bases'] = TD.get_tomo_bases(nr_of_qubits=1)
    m.params['pts'] = len(m.params['Tomography Bases'])
    m.params['sweep_name'] = 'Tomography Bases'
    m.params['sweep_pts'] = []
    # m.params['free_evolution_time'] = free_evolution_time
    # m.params['sweep_name'] = 'free_evolution_time'
    # m.params['sweep_pts']  = m.params['free_evolution_time']

    # m.params['C'+str(carbon_nr)+'_freq_0']  += detuning
    # m.params['C'+str(carbon_nr)+'_freq_1'+m.params['electron_transition']]  += detuning

    m.params['C_RO_phase'] = np.ones(m.params['pts']) * 0
    '''Derived and fixed parameters'''
    m.params['electron_readout_orientation'] = el_RO
    m.params['carbon_nr'] = carbon_nr
    m.params['init_state'] = carbon_init_state
    m.params['electron_after_init'] = str(el_state)
    m.params['Nr_C13_init'] = 2
    m.params['Nr_MBE'] = 0
    m.params['Nr_parity_msmts'] = 0

    funcs.finish(m, upload=True, debug=debug)
Beispiel #2
0
def MBE(name,
        carbon_list=[1, 5, 2],
        carbon_init_list=[2, 5, 1],
        carbon_init_states=3 * ['up'],
        carbon_init_methods=3 * ['swap'],
        carbon_init_thresholds=3 * [0],
        number_of_MBE_steps=1,
        logic_state='X',
        mbe_bases=['Y', 'Y', 'Y'],
        MBE_threshold=1,
        RO_C=1,
        number_of_parity_msmnts=2,
        error_on_qubit='all',
        el_RO='positive',
        debug=False,
        error_sign=1,
        error_probability_list=np.linspace(0, 1, 3),
        parity_orientations=['positive', 'negative']):

    m = DD.Three_QB_det_QEC(name)
    funcs.prepare(m)

    phase_error = error_sign * 2 * np.arcsin(
        np.sqrt(error_probability_list)) * 180. / np.pi
    if error_on_qubit == 1:
        Qe = [1, 0, 0]
    elif error_on_qubit == 2:
        Qe = [0, 1, 0]
    elif error_on_qubit == 3:
        Qe = [0, 0, 1]
    elif error_on_qubit == 'all':
        Qe = [1, 1, 1]

    m.params['phase_error_array'] = np.transpose(
        [phase_error * Qe[0], phase_error * Qe[1], phase_error * Qe[2]])

    m.params['C13_MBI_threshold_list'] = carbon_init_thresholds

    m.params['Parity_a_RO_orientation'] = parity_orientations[0]
    m.params['Parity_b_RO_orientation'] = parity_orientations[1]
    ''' set experimental parameters '''

    m.params['reps_per_ROsequence'] = 500

    ### Carbons to be used
    m.params['carbon_list'] = carbon_list

    ### Carbon Initialization settings
    m.params['carbon_init_list'] = carbon_init_list
    m.params['init_method_list'] = carbon_init_methods
    m.params['init_state_list'] = carbon_init_states
    m.params['Nr_C13_init'] = len(carbon_init_list)

    ##################################
    ### RO bases (sweep parameter) ###
    ##################################
    '''Select right tomography basis '''

    if parity_orientations == ['positive', 'positive']:
        m.params['Tomo_Bases_00'] = TD.get_tomo_bases(Flip_qubit='',
                                                      Flip_axis='',
                                                      RO_list=logic_state +
                                                      '_list')[RO_C]
        m.params['Tomo_Bases_01'] = TD.get_tomo_bases(Flip_qubit='2',
                                                      Flip_axis='Y',
                                                      RO_list=logic_state +
                                                      '_list')[RO_C]
        m.params['Tomo_Bases_10'] = TD.get_tomo_bases(Flip_qubit='3',
                                                      Flip_axis='Y',
                                                      RO_list=logic_state +
                                                      '_list')[RO_C]
        m.params['Tomo_Bases_11'] = TD.get_tomo_bases(Flip_qubit='1',
                                                      Flip_axis='Z',
                                                      RO_list=logic_state +
                                                      '_list')[RO_C]

    elif parity_orientations == ['negative', 'negative']:
        m.params['Tomo_Bases_11'] = TD.get_tomo_bases(Flip_qubit='',
                                                      Flip_axis='',
                                                      RO_list=logic_state +
                                                      '_list')[RO_C]
        m.params['Tomo_Bases_10'] = TD.get_tomo_bases(Flip_qubit='2',
                                                      Flip_axis='Y',
                                                      RO_list=logic_state +
                                                      '_list')[RO_C]
        m.params['Tomo_Bases_01'] = TD.get_tomo_bases(Flip_qubit='3',
                                                      Flip_axis='Y',
                                                      RO_list=logic_state +
                                                      '_list')[RO_C]
        m.params['Tomo_Bases_00'] = TD.get_tomo_bases(Flip_qubit='1',
                                                      Flip_axis='Z',
                                                      RO_list=logic_state +
                                                      '_list')[RO_C]

    elif parity_orientations == ['positive', 'negative']:
        m.params['Tomo_Bases_01'] = TD.get_tomo_bases(Flip_qubit='',
                                                      Flip_axis='',
                                                      RO_list=logic_state +
                                                      '_list')[RO_C]
        m.params['Tomo_Bases_00'] = TD.get_tomo_bases(Flip_qubit='2',
                                                      Flip_axis='Y',
                                                      RO_list=logic_state +
                                                      '_list')[RO_C]
        m.params['Tomo_Bases_11'] = TD.get_tomo_bases(Flip_qubit='3',
                                                      Flip_axis='Y',
                                                      RO_list=logic_state +
                                                      '_list')[RO_C]
        m.params['Tomo_Bases_10'] = TD.get_tomo_bases(Flip_qubit='1',
                                                      Flip_axis='Z',
                                                      RO_list=logic_state +
                                                      '_list')[RO_C]

    elif parity_orientations == ['negative', 'positive']:
        m.params['Tomo_Bases_10'] = TD.get_tomo_bases(Flip_qubit='',
                                                      Flip_axis='',
                                                      RO_list=logic_state +
                                                      '_list')[RO_C]
        m.params['Tomo_Bases_11'] = TD.get_tomo_bases(Flip_qubit='2',
                                                      Flip_axis='Y',
                                                      RO_list=logic_state +
                                                      '_list')[RO_C]
        m.params['Tomo_Bases_00'] = TD.get_tomo_bases(Flip_qubit='3',
                                                      Flip_axis='Y',
                                                      RO_list=logic_state +
                                                      '_list')[RO_C]
        m.params['Tomo_Bases_01'] = TD.get_tomo_bases(Flip_qubit='1',
                                                      Flip_axis='Z',
                                                      RO_list=logic_state +
                                                      '_list')[RO_C]

    ###################
    ### MBE settings ###
    ####################

    m.params['Nr_MBE'] = number_of_MBE_steps
    m.params['MBE_bases'] = mbe_bases
    m.params['MBE_threshold'] = MBE_threshold
    m.params['3qb_logical_state'] = logic_state

    ###################################
    ### Parity measurement settings ###
    ###################################

    m.params['Nr_parity_msmts'] = number_of_parity_msmnts
    m.params['Parity_threshold'] = 1

    m.params['Parity_a_carbon_list'] = [2, 1]
    m.params['Parity_b_carbon_list'] = [5, 1]

    m.params['Parity_a_RO_list'] = ['X', 'X']
    m.params['Parity_b_RO_list'] = ['X', 'X']

    ### Derive other parameters
    m.params['pts'] = len(error_probability_list)
    m.params['sweep_name'] = 'Error Probability'
    m.params['sweep_pts'] = error_probability_list

    ### RO params
    m.params['electron_readout_orientation'] = el_RO

    funcs.finish(m, upload=True, debug=debug)
Beispiel #3
0
def MBE(name, carbon            =   1,               
        
        carbon_init_list        =   [1],
        carbon_init_states      =   ['up'], 
        carbon_init_methods     =   ['swap'], 
        carbon_init_thresholds  =   [0],  
        el_RO               = 'positive',
        debug               = False):

    m = DD.Two_QB_Probabilistic_MBE(name)
    funcs.prepare(m)


    m.params['el_after_init']                = '0'


    m.params['C13_MBI_threshold_list'] = carbon_init_thresholds

    ''' set experimental parameters '''

    m.params['reps_per_ROsequence'] = 1000

    ### Carbons to be used
    m.params['carbon_list']         = [carbon]

    ### Carbon Initialization settings 
    m.params['carbon_init_list']    = carbon_init_list
    m.params['init_method_list']    = carbon_init_methods    
    m.params['init_state_list']     = carbon_init_states    
    m.params['Nr_C13_init']         = len(carbon_init_list)

    ##################################
    ### RO bases (sweep parameter) ###
    ##################################

    m.params['Tomography Bases'] = TD.get_tomo_bases(nr_of_qubits = 1)
    # m.params['Tomography Bases'] = [['X'],['Y'],['Z']]
    # m.params['Tomography Bases'] = [['X'],['Y']]
    # m.params['Tomography Bases'] = [['X']]
        
    ####################
    ### MBE settings ###
    ####################

    m.params['Nr_MBE']              = 0 
    m.params['MBE_bases']           = []
    m.params['MBE_threshold']       = 1
    
    ###################################
    ### Parity measurement settings ###
    ###################################

    m.params['Nr_parity_msmts']     = 0
    m.params['Parity_threshold']    = 1
    
    ### Derive other parameters
    m.params['pts']                 = len(m.params['Tomography Bases'])
    m.params['sweep_name']          = 'Tomography Bases' 
    m.params['sweep_pts']           = []
    
    ### RO params
    m.params['electron_readout_orientation'] = el_RO
    for BP in m.params['Tomography Bases']:
        m.params['sweep_pts'].append(BP[0])
    
    funcs.finish(m, upload =True, debug=debug)
Beispiel #4
0
def MBE(name, carbon_list   = [1,5,2],

        carbon_init_list              = [2,5,1],
        carbon_init_states            = 3*['up'],
        carbon_init_methods           = 3*['swap'],
        carbon_init_thresholds        = 3*[0],

        number_of_MBE_steps           = 1,
        logic_state                   = 'X',
        mbe_bases                     = ['Y','Y','Y'],
        MBE_threshold                 = 1,
        RO_C                          = 1,

        number_of_parity_msmnts       = 4,
        error_on_qubit                = 'all',
        el_RO                         = 'positive',
        debug                         = False,
        error_sign1                    = 1,
        error_sign2                    = 1,
        error_sign3                    = 1,
        error_probability_list        = np.linspace(0,1,3),
        parity_orientations           = ['positive','negative'],
        error_prob_magnitude          = '< 0.5',
        no_reps                       = 500):

    m = DD.Three_QB_det_rep_QEC(name)
    funcs.prepare(m)

    ### Calculate the new error probability p_e' for splitting up the error in two rounds ###

    ### for errors < 0.5
    if error_prob_magnitude == '< 0.5':
        error_probability_list_per_round = (1 - (1 - 2*error_probability_list)**(1/3.))/2.
    ### for errors > 0.5
    # elif error_prob_magnitude == '> 0.5':
    #     error_probability_list_per_round = 1 - (1 - (1 - 2*error_probability_list)**0.5)/2.
    #     error_probability_list_per_round = error_probability_list_per_round[::-1]

    phase_error_round1                   = error_sign1 * 2*np.arcsin(np.sqrt(error_probability_list_per_round))*180./np.pi
    phase_error_round2                   = error_sign2 * 2*np.arcsin(np.sqrt(error_probability_list_per_round))*180./np.pi
    phase_error_round3                   = error_sign3 * 2*np.arcsin(np.sqrt(error_probability_list_per_round))*180./np.pi
    
    if error_on_qubit ==1:
        Qe                            = [1,0,0]
    elif error_on_qubit ==2:
        Qe                            = [0,1,0]
    elif error_on_qubit ==3:
        Qe                            = [0,0,1]
    elif error_on_qubit =='all':
        Qe                            = [1,1,1]

    m.params['phase_error_array_1'] = np.transpose([phase_error_round1*Qe[0],phase_error_round1*Qe[1],phase_error_round1*Qe[2]])
    m.params['phase_error_array_2'] = np.transpose([phase_error_round2*Qe[0],phase_error_round2*Qe[1],phase_error_round2*Qe[2]])
    m.params['phase_error_array_3'] = np.transpose([phase_error_round3*Qe[0],phase_error_round3*Qe[1],phase_error_round3*Qe[2]])

    m.params['C13_MBI_threshold_list'] = carbon_init_thresholds

    m.params['Parity_a_RO_orientation'] = parity_orientations[0]
    m.params['Parity_b_RO_orientation'] = parity_orientations[1]

    ''' set experimental parameters '''

    m.params['reps_per_ROsequence'] = no_reps


    m.params['free_evolution_time_1'] = np.ones(len(phase_error_round1))*0
    m.params['free_evolution_time_2'] = np.ones(len(phase_error_round1))*0

    ### Carbons to be used
    m.params['MBE_list']            = carbon_list
    m.params['carbon_list']         = carbon_list

    ### Carbon Initialization settings
    m.params['carbon_init_list']    = carbon_init_list
    m.params['init_method_list']    = carbon_init_methods
    m.params['init_state_list']     = carbon_init_states
    m.params['Nr_C13_init']         = len(carbon_init_list)

    ##################################
    ### RO bases (sweep parameter) ###
    ##################################

    '''Select right tomography basis '''

    if parity_orientations == ['positive','positive']:
        m.params['Tomo_Bases_0000'] = TD.get_tomo_bases(Flip_qubit = '' ,  Flip_axis = '', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_0001'] = TD.get_tomo_bases(Flip_qubit = '2',  Flip_axis = 'Y', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_0010'] = TD.get_tomo_bases(Flip_qubit = '3',  Flip_axis = 'Y', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_0011'] = TD.get_tomo_bases(Flip_qubit = '1',  Flip_axis = 'Z', RO_list = logic_state+'_list')[RO_C]
 
        m.params['Tomo_Bases_0100'] = TD.get_tomo_bases(Flip_qubit = '2' ,  Flip_axis = 'X', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_0101'] = TD.get_tomo_bases(Flip_qubit = '2',  Flip_axis = 'Z', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_0110'] = TD.get_tomo_bases(Flip_qubit = '3',  Flip_axis = 'Z', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_0111'] = TD.get_tomo_bases(Flip_qubit = '1',  Flip_axis = 'Y', RO_list = logic_state+'_list')[RO_C]
        
        m.params['Tomo_Bases_1000'] = TD.get_tomo_bases(Flip_qubit = '3' ,  Flip_axis = 'X', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_1001'] = TD.get_tomo_bases(Flip_qubit = '2',  Flip_axis = 'Z', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_1010'] = TD.get_tomo_bases(Flip_qubit = '3',  Flip_axis = 'Z', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_1011'] = TD.get_tomo_bases(Flip_qubit = '1',  Flip_axis = 'Y', RO_list = logic_state+'_list')[RO_C]
        
        m.params['Tomo_Bases_1100'] = TD.get_tomo_bases(Flip_qubit = '' ,  Flip_axis = '', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_1101'] = TD.get_tomo_bases(Flip_qubit = '2',  Flip_axis = 'Y', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_1110'] = TD.get_tomo_bases(Flip_qubit = '3',  Flip_axis = 'Y', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_1111'] = TD.get_tomo_bases(Flip_qubit = '1',  Flip_axis = 'Z', RO_list = logic_state+'_list')[RO_C]                

        # correction on C1 or C2 in second parity A msmt

        m.params['phase_correct_list_A00'] = [0  ,0  ]      # no error
        m.params['phase_correct_list_A01'] = [0  ,0  ]      # error on C5, fixed in parity msmt B
        m.params['phase_correct_list_A10'] = [180,0  ]      # fix error on C2 (first in parity measurment A)
        m.params['phase_correct_list_A11'] = [0  ,180]      # error on C1 (second in parity measurements A,B)

        # correction on C5 in second parity B msmt, 2X implemented because independent of outcome of second parity A

        m.params['phase_correct_list_B000'] = [0,  0]         # no error
        m.params['phase_correct_list_B010'] = [180,0]         # fix error on C5 (first in parity measurement B)
        m.params['phase_correct_list_B100'] = [0,  0]         # error on C2 (already fixed)
        m.params['phase_correct_list_B110'] = [0,  0]         # error on C1 (already fixed)
        
        m.params['phase_correct_list_B001'] = [0,  0]         # no error
        m.params['phase_correct_list_B011'] = [180,0]       # fix error on C5 (first in parity measurement B)
        m.params['phase_correct_list_B101'] = [0,  0]         # error on C2 (already fixed)
        m.params['phase_correct_list_B111'] = [0,  0]         # error on C1 (already fixed)        

    
    elif parity_orientations == ['negative','negative']:
        m.params['Tomo_Bases_1111'] = TD.get_tomo_bases(Flip_qubit = '' ,  Flip_axis = '', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_1110'] = TD.get_tomo_bases(Flip_qubit = '2',  Flip_axis = 'Y', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_1101'] = TD.get_tomo_bases(Flip_qubit = '3',  Flip_axis = 'Y', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_1100'] = TD.get_tomo_bases(Flip_qubit = '1',  Flip_axis = 'Z', RO_list = logic_state+'_list')[RO_C]
        
        m.params['Tomo_Bases_1011'] = TD.get_tomo_bases(Flip_qubit = '2' ,  Flip_axis = 'X', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_1010'] = TD.get_tomo_bases(Flip_qubit = '2',  Flip_axis = 'Z', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_1001'] = TD.get_tomo_bases(Flip_qubit = '3',  Flip_axis = 'Z', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_1000'] = TD.get_tomo_bases(Flip_qubit = '1',  Flip_axis = 'Y', RO_list = logic_state+'_list')[RO_C]
        
        m.params['Tomo_Bases_0111'] = TD.get_tomo_bases(Flip_qubit = '3' ,  Flip_axis = 'X', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_0110'] = TD.get_tomo_bases(Flip_qubit = '2',  Flip_axis = 'Z', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_0101'] = TD.get_tomo_bases(Flip_qubit = '3',  Flip_axis = 'Z', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_0100'] = TD.get_tomo_bases(Flip_qubit = '1',  Flip_axis = 'Y', RO_list = logic_state+'_list')[RO_C]
        
        m.params['Tomo_Bases_0011'] = TD.get_tomo_bases(Flip_qubit = '' ,  Flip_axis = '', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_0010'] = TD.get_tomo_bases(Flip_qubit = '2',  Flip_axis = 'Y', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_0001'] = TD.get_tomo_bases(Flip_qubit = '3',  Flip_axis = 'Y', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_0000'] = TD.get_tomo_bases(Flip_qubit = '1',  Flip_axis = 'Z', RO_list = logic_state+'_list')[RO_C]    

        # correction on C1 or C2 in second parity A msmt

        m.params['phase_correct_list_A11'] = [0  ,0  ]  # no error
        m.params['phase_correct_list_A10'] = [0  ,0  ]  # error on C5, fixed in parity msmt B
        m.params['phase_correct_list_A01'] = [180,0  ]  # error on C2
        m.params['phase_correct_list_A00'] = [0  ,180]  # error on C1

        # correction on C5 in second parity B msmt, 2X implemented because independent of outcome of second parity A

        m.params['phase_correct_list_B110'] = [0,0]      # no error
        m.params['phase_correct_list_B100'] = [180,0]    # error on C5
        m.params['phase_correct_list_B010'] = [0,0]      # error on C2
        m.params['phase_correct_list_B000'] = [0,0]      # error on C1
        
        m.params['phase_correct_list_B111'] = [0,0]      # no error
        m.params['phase_correct_list_B101'] = [180,0]    # error on C5
        m.params['phase_correct_list_B011'] = [0,0]      # error on C2
        m.params['phase_correct_list_B001'] = [0,0]      # error on C1     

    elif parity_orientations == ['positive','negative']:
        m.params['Tomo_Bases_0101'] = TD.get_tomo_bases(Flip_qubit = '' ,  Flip_axis = '', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_0100'] = TD.get_tomo_bases(Flip_qubit = '2',  Flip_axis = 'Y', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_0111'] = TD.get_tomo_bases(Flip_qubit = '3',  Flip_axis = 'Y', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_0110'] = TD.get_tomo_bases(Flip_qubit = '1',  Flip_axis = 'Z', RO_list = logic_state+'_list')[RO_C]
        
        m.params['Tomo_Bases_0001'] = TD.get_tomo_bases(Flip_qubit = '2' ,  Flip_axis = 'X', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_0000'] = TD.get_tomo_bases(Flip_qubit = '2',  Flip_axis = 'Z', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_0011'] = TD.get_tomo_bases(Flip_qubit = '3',  Flip_axis = 'Z', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_0010'] = TD.get_tomo_bases(Flip_qubit = '1',  Flip_axis = 'Y', RO_list = logic_state+'_list')[RO_C]
        
        m.params['Tomo_Bases_1101'] = TD.get_tomo_bases(Flip_qubit = '3' ,  Flip_axis = 'X', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_1100'] = TD.get_tomo_bases(Flip_qubit = '2',  Flip_axis = 'Z', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_1111'] = TD.get_tomo_bases(Flip_qubit = '3',  Flip_axis = 'Z', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_1110'] = TD.get_tomo_bases(Flip_qubit = '1',  Flip_axis = 'Y', RO_list = logic_state+'_list')[RO_C]
        
        m.params['Tomo_Bases_1001'] = TD.get_tomo_bases(Flip_qubit = '' ,  Flip_axis = '', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_1000'] = TD.get_tomo_bases(Flip_qubit = '2',  Flip_axis = 'Y', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_1011'] = TD.get_tomo_bases(Flip_qubit = '3',  Flip_axis = 'Y', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_1010'] = TD.get_tomo_bases(Flip_qubit = '1',  Flip_axis = 'Z', RO_list = logic_state+'_list')[RO_C]    

        # correction on C1 or C2 in second parity A msmt
        m.params['phase_correct_list_A01'] = [0  ,0  ] # no error
        m.params['phase_correct_list_A00'] = [0  ,0  ] # error on C5, fixed in parity msmt B
        m.params['phase_correct_list_A11'] = [180,0  ] # error on C2
        m.params['phase_correct_list_A10'] = [0  ,180] # error on C1

        # correction on C5 in second parity B msmt, 2X implemented because independent of outcome of second parity A

        m.params['phase_correct_list_B010'] = [0,0]     # no error
        m.params['phase_correct_list_B000'] = [180,0]   # error on C5
        m.params['phase_correct_list_B110'] = [0,0]     # error on C2
        m.params['phase_correct_list_B100'] = [0,0]     # error on C1
        
        m.params['phase_correct_list_B011'] = [0,0]     # no error
        m.params['phase_correct_list_B001'] = [180,0]   # error on C5
        m.params['phase_correct_list_B111'] = [0,0]     # error on C2
        m.params['phase_correct_list_B101'] = [0,0]     # error on C1     

    elif parity_orientations == ['negative','positive']:
        m.params['Tomo_Bases_1010'] = TD.get_tomo_bases(Flip_qubit = '' ,  Flip_axis = '', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_1011'] = TD.get_tomo_bases(Flip_qubit = '2',  Flip_axis = 'Y', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_1000'] = TD.get_tomo_bases(Flip_qubit = '3',  Flip_axis = 'Y', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_1001'] = TD.get_tomo_bases(Flip_qubit = '1',  Flip_axis = 'Z', RO_list = logic_state+'_list')[RO_C]
        
        m.params['Tomo_Bases_1110'] = TD.get_tomo_bases(Flip_qubit = '2',  Flip_axis = 'X', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_1111'] = TD.get_tomo_bases(Flip_qubit = '2',  Flip_axis = 'Z', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_1100'] = TD.get_tomo_bases(Flip_qubit = '3',  Flip_axis = 'Z', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_1101'] = TD.get_tomo_bases(Flip_qubit = '1',  Flip_axis = 'Y', RO_list = logic_state+'_list')[RO_C]
        
        m.params['Tomo_Bases_0010'] = TD.get_tomo_bases(Flip_qubit = '3',  Flip_axis = 'X', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_0011'] = TD.get_tomo_bases(Flip_qubit = '2',  Flip_axis = 'Z', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_0000'] = TD.get_tomo_bases(Flip_qubit = '3',  Flip_axis = 'Z', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_0001'] = TD.get_tomo_bases(Flip_qubit = '1',  Flip_axis = 'Y', RO_list = logic_state+'_list')[RO_C]
        
        m.params['Tomo_Bases_0110'] = TD.get_tomo_bases(Flip_qubit = '' ,  Flip_axis = '', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_0111'] = TD.get_tomo_bases(Flip_qubit = '2',  Flip_axis = 'Y', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_0100'] = TD.get_tomo_bases(Flip_qubit = '3',  Flip_axis = 'Y', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_0101'] = TD.get_tomo_bases(Flip_qubit = '1',  Flip_axis = 'Z', RO_list = logic_state+'_list')[RO_C]    

        # correction on C1 or C2 in second parity A msmt

        m.params['phase_correct_list_A10'] = [0  ,0  ] # no error
        m.params['phase_correct_list_A11'] = [0  ,0  ] # error on C5, fixed in parity msmt B
        m.params['phase_correct_list_A00'] = [180,0  ] # error on C2
        m.params['phase_correct_list_A01'] = [0  ,180] # error on C1

        # correction on C5 in second parity B msmt, 2X implemented because independent of outcome of second parity A

        m.params['phase_correct_list_B100'] = [0,0]     # no error
        m.params['phase_correct_list_B110'] = [180,0]   # error on C5
        m.params['phase_correct_list_B000'] = [0,0]     # error on C2
        m.params['phase_correct_list_B010'] = [0,0]     # error on C1
        
        m.params['phase_correct_list_B101'] = [0,0]     # no error
        m.params['phase_correct_list_B111'] = [180,0]   # error on C5
        m.params['phase_correct_list_B001'] = [0,0]     # error on C2
        m.params['phase_correct_list_B011'] = [0,0]     # error on C1     
    ###################
    ### MBE settings ###
    ####################

    m.params['Nr_MBE']              = number_of_MBE_steps
    m.params['MBE_bases']           = mbe_bases
    m.params['MBE_threshold']       = MBE_threshold
    m.params['3qb_logical_state']   = logic_state

    ###################################
    ### Parity measurement settings ###
    ###################################

    m.params['Nr_parity_msmts']     = number_of_parity_msmnts
    m.params['Parity_threshold']    = 1

    m.params['Parity_a_carbon_list'] = [2,1]
    m.params['Parity_b_carbon_list'] = [5,1]

    m.params['Parity_a_RO_list'] = ['X','X']
    m.params['Parity_b_RO_list'] = ['X','X']

    ### Derive other parameters
    m.params['pts']                 = len(error_probability_list)
    m.params['sweep_name']          = 'Error Probability'
    m.params['sweep_pts']           = error_probability_list

    ### RO params
    m.params['electron_readout_orientation'] = el_RO

    funcs.finish(m, upload =True, debug=False)
Beispiel #5
0
def MBE_test_msmt(name, carbon_list   = [1,5,2],

        carbon_init_list              = [2,5,1],
        carbon_init_states            = 3*['up'],
        carbon_init_methods           = 3*['swap'],
        carbon_init_thresholds        = 3*[0],

        number_of_MBE_steps           = 1,
        logic_state                   = 'X',
        mbe_bases                     = ['Y','Y','Y'],
        MBE_threshold                 = 1,
        RO_C                          = 1,

        number_of_parity_msmnts       = 2,
        error_on_qubit                = 'all',
        el_RO                         = 'positive',
        debug                         = False,
        error_sign1                    = 1,
        error_sign2                    = 1,
        error_probability_list        = np.linspace(0,1,3),
        parity_orientations           = ['positive','negative'],
        error_prob_magnitude          = '< 0.5'):

    m = DD.Three_QB_det_QEC(name)
    funcs.prepare(m)

    ### Calculate the new error probability p_e' for splitting up the error in two rounds ###

    ### for errors < 0.5
    if error_prob_magnitude == '< 0.5':
        error_probability_list_per_round = [0]#(1 - (1 - 2*error_probability_list)**0.5)/2.
    ### for errors > 0.5
    # elif error_prob_magnitude == '> 0.5':
    #     error_probability_list_per_round = 1 - (1 - (1 - 2*error_probability_list)**0.5)/2.
    #     error_probability_list_per_round = error_probability_list_per_round[::-1]


    phase_error_round1                   = error_sign1 * 2*np.arcsin(np.sqrt(error_probability_list_per_round))*180./np.pi
    phase_error_round2                   = error_sign2 * 2*np.arcsin(np.sqrt(error_probability_list_per_round))*180./np.pi
    
    if error_on_qubit ==1:
        Qe                            = [1,0,0]
    elif error_on_qubit ==2:
        Qe                            = [0,1,0]
    elif error_on_qubit ==3:
        Qe                            = [0,0,1]
    elif error_on_qubit =='all':
        Qe                            = [1,1,1]

    m.params['phase_error_array_1'] = np.transpose([phase_error_round1*Qe[0],phase_error_round1*Qe[1],phase_error_round1*Qe[2]])
    m.params['phase_error_array_2'] = np.transpose([phase_error_round2*Qe[0],phase_error_round2*Qe[1],phase_error_round2*Qe[2]])



    m.params['C13_MBI_threshold_list'] = carbon_init_thresholds

    m.params['Parity_a_RO_orientation'] = parity_orientations[0]
    m.params['Parity_b_RO_orientation'] = parity_orientations[1]

    ''' set experimental parameters '''

    m.params['reps_per_ROsequence'] = 500


    m.params['add_wait_gate'] = False
    m.params['wait_in_msm1']  = False

    m.params['free_evolution_time_1'] = np.ones(len(phase_error_round1))*0
    m.params['free_evolution_time_2'] = np.ones(len(phase_error_round1))*0

    ### Carbons to be used
    m.params['MBE_list']      = carbon_list
    m.params['carbon_list']         = carbon_list

    ### Carbon Initialization settings
    m.params['carbon_init_list']    = carbon_init_list
    m.params['init_method_list']    = carbon_init_methods
    m.params['init_state_list']     = carbon_init_states
    m.params['Nr_C13_init']         = len(carbon_init_list)

    ##################################
    ### RO bases (sweep parameter) ###
    ##################################

    '''Select right tomography basis '''

    if parity_orientations == ['positive','positive']:
        m.params['Tomo_Bases_00'] = TD.get_tomo_bases(Flip_qubit = '' ,  Flip_axis = '', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_01'] = TD.get_tomo_bases(Flip_qubit = '2',  Flip_axis = 'Y', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_10'] = TD.get_tomo_bases(Flip_qubit = '3',  Flip_axis = 'Y', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_11'] = TD.get_tomo_bases(Flip_qubit = '1',  Flip_axis = 'Z', RO_list = logic_state+'_list')[RO_C]

    elif parity_orientations == ['negative','negative']:
        m.params['Tomo_Bases_11'] = TD.get_tomo_bases(Flip_qubit = '' ,  Flip_axis = '', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_10'] = TD.get_tomo_bases(Flip_qubit = '2',  Flip_axis = 'Y', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_01'] = TD.get_tomo_bases(Flip_qubit = '3',  Flip_axis = 'Y', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_00'] = TD.get_tomo_bases(Flip_qubit = '1',  Flip_axis = 'Z', RO_list = logic_state+'_list')[RO_C]

    elif parity_orientations == ['positive','negative']:
        m.params['Tomo_Bases_01'] = TD.get_tomo_bases(Flip_qubit = '' ,  Flip_axis = '', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_00'] = TD.get_tomo_bases(Flip_qubit = '2',  Flip_axis = 'Y', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_11'] = TD.get_tomo_bases(Flip_qubit = '3',  Flip_axis = 'Y', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_10'] = TD.get_tomo_bases(Flip_qubit = '1',  Flip_axis = 'Z', RO_list = logic_state+'_list')[RO_C]

    elif parity_orientations == ['negative','positive']:
        m.params['Tomo_Bases_10'] = TD.get_tomo_bases(Flip_qubit = '' ,  Flip_axis = '', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_11'] = TD.get_tomo_bases(Flip_qubit = '2',  Flip_axis = 'Y', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_00'] = TD.get_tomo_bases(Flip_qubit = '3',  Flip_axis = 'Y', RO_list = logic_state+'_list')[RO_C]
        m.params['Tomo_Bases_01'] = TD.get_tomo_bases(Flip_qubit = '1',  Flip_axis = 'Z', RO_list = logic_state+'_list')[RO_C]

    ###################
    ### MBE settings ###
    ####################

    m.params['Nr_MBE']              = number_of_MBE_steps
    m.params['MBE_bases']           = mbe_bases
    m.params['MBE_threshold']       = MBE_threshold
    m.params['3qb_logical_state']   = logic_state

    ###################################
    ### Parity measurement settings ###
    ###################################

    m.params['Nr_parity_msmts']     = number_of_parity_msmnts
    m.params['Parity_threshold']    = 1

    m.params['Parity_a_carbon_list'] = [2,1]
    m.params['Parity_b_carbon_list'] = [5,1]

    m.params['Parity_a_RO_list'] = ['X','X']
    m.params['Parity_b_RO_list'] = ['X','X']

    ### Derive other parameters
    m.params['pts']                 = len(error_probability_list)
    m.params['sweep_name']          = 'Error Probability'
    m.params['sweep_pts']           = error_probability_list

    ### RO params
    m.params['electron_readout_orientation'] = el_RO

    funcs.finish(m, upload =True, debug=debug)
Beispiel #6
0
def MBE(name,
        carbon_list=[1, 5, 2],
        carbon_init_list=[2, 5, 1],
        carbon_init_states=3 * ['up'],
        carbon_init_methods=3 * ['swap'],
        carbon_init_thresholds=3 * [0],
        number_of_MBE_steps=1,
        logic_state='Y',
        mbe_bases=['Y', 'Y', 'Y'],
        MBE_threshold=1,
        number_of_parity_msmnts=0,
        parity_msmnts_threshold=1,
        RO_C=1,
        el_RO='positive',
        debug=False,
        error_sign=1,
        error_on_qubit='all',
        do_idle=False,
        error_probability_list=np.linspace(0, 1, 3),
        Tomo_bases=['Z', '-Y', 'Z']):

    m = DD.Three_QB_QEC(name)
    funcs.prepare(m)

    if do_idle == False:
        m.params['add_wait_gate'] = False
    else:
        m.params['add_wait_gate'] = True

        m.params['free_evolution_time'] = (
            (2 * m.params['C2_Ren_tau'][0] * m.params['C2_Ren_N'][0] + 2 *
             m.params['C1_Ren_tau'][0] * m.params['C1_Ren_N'][0])  # Parity A
            + (2 * m.params['C5_Ren_tau'][0] * m.params['C5_Ren_N'][0] + 2 *
               m.params['C1_Ren_tau'][0] * m.params['C1_Ren_N'][0])  # Parity B
            + 2 * 150e-6) * np.ones(
                len(error_probability_list))  # 2X RO trigger

    phase_error = error_sign * 2 * np.arcsin(
        np.sqrt(error_probability_list)) * 180. / np.pi
    if error_on_qubit == 1:
        Qe = [1, 0, 0]
    elif error_on_qubit == 2:
        Qe = [0, 1, 0]
    elif error_on_qubit == 3:
        Qe = [0, 0, 1]
    elif error_on_qubit == 'all':
        Qe = [1, 1, 1]

    m.params['phase_error_array'] = np.transpose(
        [phase_error * Qe[0], phase_error * Qe[1], phase_error * Qe[2]])

    m.params['C13_MBI_threshold_list'] = carbon_init_thresholds
    ''' set experimental parameters '''

    m.params['reps_per_ROsequence'] = 4000

    ### Carbons to be used
    m.params['carbon_list'] = carbon_list
    m.params['MBE_list'] = carbon_list

    ### Carbon Initialization settings
    m.params['carbon_init_list'] = carbon_init_list
    m.params['init_method_list'] = carbon_init_methods
    m.params['init_state_list'] = carbon_init_states
    m.params['Nr_C13_init'] = len(carbon_init_list)

    ##################################
    ### RO bases (sweep parameter) ###
    ##################################
    '''Select right tomography basis '''

    m.params['Tomography Bases'] = TD.get_tomo_bases(Flip_qubit='',
                                                     Flip_axis='',
                                                     RO_list=logic_state +
                                                     '_list')[RO_C]

    ####################
    ### MBE settings ###
    ####################

    m.params['Nr_MBE'] = number_of_MBE_steps
    m.params['MBE_bases'] = mbe_bases
    m.params['MBE_threshold'] = MBE_threshold
    m.params['3qb_logical_state'] = logic_state

    ###################################
    ### Parity measurement settings ###
    ###################################

    m.params['Nr_parity_msmts'] = number_of_parity_msmnts
    m.params['Parity_threshold'] = parity_msmnts_threshold

    ### Derive other parameters
    m.params['pts'] = len(error_probability_list)
    m.params['sweep_name'] = 'Error Probability'
    m.params['sweep_pts'] = error_probability_list

    ### RO params
    m.params['electron_readout_orientation'] = el_RO

    funcs.finish(m, upload=True, debug=debug)
def uncond_Pi_Sweep(name,
                    carbon=1,
                    carbon_init_list=[1],
                    desired_carbon_init_states=['X'],
                    el_RO='positive',
                    debug=False):

    m = Uncond_Pi_Sweep(name)
    funcs.prepare(m)

    carbon_init_methods = []
    carbon_init_thresholds = []
    carbon_init_states = []

    print desired_carbon_init_states

    for init_state in desired_carbon_init_states:

        if init_state == 'X':
            carbon_init_methods.append('MBI')
            carbon_init_thresholds.append(1)
            carbon_init_states.append('up')
        elif init_state == 'mX':
            carbon_init_methods.append('MBI')
            carbon_init_thresholds.append(1)
            carbon_init_states.append('down')
        elif init_state == 'Y':
            carbon_init_methods.append('MBI_y')
            carbon_init_thresholds.append(1)
            carbon_init_states.append('up')
        elif init_state == 'mY':
            carbon_init_methods.append('MBI_y')
            carbon_init_thresholds.append(1)
            carbon_init_states.append('down')
        elif init_state == 'Z':
            carbon_init_methods.append('MBI_w_gate')
            carbon_init_thresholds.append(1)
            carbon_init_states.append('up')
        elif init_state == 'mZ':
            carbon_init_methods.append('MBI_w_gate')
            carbon_init_thresholds.append(1)
            carbon_init_states.append('down')
        else:
            print "Invalid state"
            return

    m.params['el_after_init'] = '0'

    m.params['C13_MBI_threshold_list'] = carbon_init_thresholds
    ''' set experimental parameters '''

    m.params['reps_per_ROsequence'] = 1000

    ### Carbons to be used
    m.params['carbon_list'] = [carbon]

    ### Carbon Initialization settings
    m.params['carbon_init_list'] = carbon_init_list
    m.params['init_method_list'] = carbon_init_methods
    m.params['init_state_list'] = carbon_init_states
    m.params['Nr_C13_init'] = len(carbon_init_list)

    ##################################
    ### RO bases (sweep parameter) ###
    ##################################

    m.params['Tomography Bases'] = TD.get_tomo_bases(nr_of_qubits=1)
    # m.params['Tomography Bases'] = [['X'],['Y'],['Z']]
    # m.params['Tomography Bases'] = [['X'],['Y']]
    # m.params['Tomography Bases'] = [['Z']]

    ####################
    ### MBE settings ###
    ####################

    m.params['Nr_MBE'] = 0
    m.params['MBE_bases'] = []
    m.params['MBE_threshold'] = 1

    ###################################
    ### Parity measurement settings ###
    ###################################

    m.params['Nr_parity_msmts'] = 0
    m.params['Parity_threshold'] = 1

    ### Derive other parameters
    m.params['pts'] = len(m.params['Tomography Bases'])
    m.params['sweep_name'] = 'Tomography Bases'
    m.params['sweep_pts'] = []

    ### RO params
    m.params['electron_readout_orientation'] = el_RO
    for BP in m.params['Tomography Bases']:
        m.params['sweep_pts'].append(BP[0])

    funcs.finish(m, upload=True, debug=debug)