def testInversion(self): ''' Try a simple three level SC qubit system and see if can prepare the excited state. ''' #Setup a three level qubit and a 100MHz delta Q1 = SCQubit(3, 4.987456e9, -100e6, name='Q1') systemParams = SystemParams() systemParams.add_sub_system(Q1) systemParams.add_control_ham( inphase=Hamiltonian(0.5 * (Q1.loweringOp + Q1.raisingOp)), quadrature=Hamiltonian(0.5 * (-1j * Q1.loweringOp + 1j * Q1.raisingOp))) systemParams.create_full_Ham() systemParams.measurement = Q1.levelProjector(1) #Setup the pulse parameters for the optimization pulseParams = PulseParams() pulseParams.timeSteps = 1e-9 * np.ones(30) pulseParams.rhoStart = Q1.levelProjector(0) pulseParams.rhoGoal = Q1.levelProjector(1) pulseParams.add_control_line(freq=-Q1.omega) pulseParams.H_int = Hamiltonian(Q1.omega * np.diag(np.arange(Q1.dim))) pulseParams.optimType = 'state2state' #Call the optimization optimize_pulse(pulseParams, systemParams) #Now test the optimized pulse and make sure it puts all the population in the excited state result = simulate_sequence(pulseParams, systemParams, pulseParams.rhoStart, simType='unitary')[0] assert result > 0.99
def testInversion(self): ''' Try a simple three level SC qubit system and see if can prepare the excited state. ''' #Setup a three level qubit and a 100MHz delta Q1 = SCQubit(3, 4.987456e9, -100e6, name='Q1') systemParams = SystemParams() systemParams.add_sub_system(Q1) systemParams.add_control_ham(inphase = Hamiltonian(0.5*(Q1.loweringOp + Q1.raisingOp)), quadrature = Hamiltonian(0.5*(-1j*Q1.loweringOp + 1j*Q1.raisingOp))) systemParams.create_full_Ham() systemParams.measurement = Q1.levelProjector(1) #Setup the pulse parameters for the optimization pulseParams = PulseParams() pulseParams.timeSteps = 1e-9*np.ones(30) pulseParams.rhoStart = Q1.levelProjector(0) pulseParams.rhoGoal = Q1.levelProjector(1) pulseParams.add_control_line(freq=-Q1.omega) pulseParams.H_int = Hamiltonian(Q1.omega*np.diag(np.arange(Q1.dim))) pulseParams.optimType = 'state2state' #Call the optimization optimize_pulse(pulseParams, systemParams) #Now test the optimized pulse and make sure it puts all the population in the excited state result = simulate_sequence(pulseParams, systemParams, pulseParams.rhoStart, simType='unitary')[0] assert result > 0.99
def testDRAG(self): ''' Try a unitary inversion pulse on a three level SCQuibt and see if we get something close to DRAG ''' #Setup a three level qubit and a 100MHz delta Q1 = SCQubit(3, 4.987456e9, -150e6, name='Q1') systemParams = SystemParams() systemParams.add_sub_system(Q1) systemParams.add_control_ham(inphase = Hamiltonian(0.5*(Q1.loweringOp + Q1.raisingOp)), quadrature = Hamiltonian(0.5*(-1j*Q1.loweringOp + 1j*Q1.raisingOp))) systemParams.add_control_ham(inphase = Hamiltonian(0.5*(Q1.loweringOp + Q1.raisingOp)), quadrature = Hamiltonian(0.5*(-1j*Q1.loweringOp + 1j*Q1.raisingOp))) systemParams.create_full_Ham() systemParams.measurement = Q1.levelProjector(1) #Setup the pulse parameters for the optimization numPoints = 30 pulseTime = 15e-9 pulseParams = PulseParams() pulseParams.timeSteps = (pulseTime/numPoints)*np.ones(numPoints) pulseParams.rhoStart = Q1.levelProjector(0) pulseParams.rhoGoal = Q1.levelProjector(1) pulseParams.Ugoal = Q1.pauliX pulseParams.add_control_line(freq=-Q1.omega, bandwidth=300e6, maxAmp=200e6) pulseParams.add_control_line(freq=-Q1.omega, phase=-np.pi/2, bandwidth=300e6, maxAmp=200e6) pulseParams.H_int = Hamiltonian((Q1.omega)*np.diag(np.arange(Q1.dim))) pulseParams.optimType = 'unitary' pulseParams.derivType = 'finiteDiff' #Start with a Gaussian tmpGauss = np.exp(-np.linspace(-2,2,numPoints)**2) tmpScale = 0.5/(np.sum(pulseParams.timeSteps*tmpGauss)) pulseParams.startControlAmps = np.vstack((tmpScale*tmpGauss, np.zeros(numPoints))) #Call the optimization optimize_pulse(pulseParams, systemParams) if plotResults: plt.plot(np.cumsum(pulseParams.timeSteps)*1e9,pulseParams.controlAmps.T/1e6); plt.ylabel('Pulse Amplitude (MHz)') plt.xlabel('Time (ns)') plt.legend(('X Quadrature', 'Y Quadrature')) plt.title('DRAG Pulse from Optimal Control') plt.show() #Now test the optimized pulse and make sure it does give us the desired unitary result = simulate_sequence(pulseParams, systemParams, pulseParams.rhoStart, simType='unitary') assert np.abs(np.trace(np.dot(result[1].conj().T, pulseParams.Ugoal)))**2/np.abs(np.trace(np.dot(pulseParams.Ugoal.conj().T, pulseParams.Ugoal)))**2 > 0.99
import matplotlib.pyplot as plt from PySim.SystemParams import SystemParams from PySim.PulseSequence import PulseSequence from PySim.Simulation import simulate_sequence_stack from PySim.QuantumSystems import SCQubit, Hamiltonian from copy import deepcopy #Setup the system systemParams = SystemParams() qubit = SCQubit(2, 0e9, delta=200e6, name='Q1', T1=1e-6) systemParams.add_sub_system(qubit) systemParams.add_control_ham(inphase = Hamiltonian(0.5*(qubit.loweringOp + qubit.raisingOp)), quadrature = Hamiltonian(0.5*(-1j*qubit.loweringOp + 1j*qubit.raisingOp))) systemParams.add_control_ham(inphase = Hamiltonian(0.5*(qubit.loweringOp + qubit.raisingOp)), quadrature = Hamiltonian(0.5*(-1j*qubit.loweringOp + 1j*qubit.raisingOp))) systemParams.measurement = qubit.pauliZ systemParams.create_full_Ham() #Define the initial state as the ground state rhoIn = qubit.levelProjector(0) #First the basic sequence basePulseSeq = PulseSequence() basePulseSeq.add_control_line(freq=0e9, phase=0) basePulseSeq.add_control_line(freq=0e9, phase=pi/2) basePulseSeq.H_int = None #Some parameters for the pulse timeStep = 1.0/1.2e9 #How many discrete timesteps to break it up into
systemParams.add_control_ham(inphase = inPhaseHam, quadrature = quadratureHam) #Add the Q2 drive Hamiltonians inPhaseHam = Hamiltonian(np.dot(v.conj().T, np.dot(systemParams.expand_operator('Q2', X) + crossCoupling21*systemParams.expand_operator('Q1', X), v))) quadratureHam = Hamiltonian(np.dot(v.conj().T, np.dot(systemParams.expand_operator('Q2', Y) + crossCoupling21*systemParams.expand_operator('Q1', Y), v))) systemParams.add_control_ham(inphase = inPhaseHam, quadrature = quadratureHam) systemParams.add_control_ham(inphase = inPhaseHam, quadrature = quadratureHam) #Add the cross-drive Hamiltonians (same drive line as Q2) inPhaseHam = Hamiltonian(np.dot(v.conj().T, np.dot(systemParams.expand_operator('Q2', X) + crossCoupling21*systemParams.expand_operator('Q1', X), v))) quadratureHam = Hamiltonian(np.dot(v.conj().T, np.dot(systemParams.expand_operator('Q2', Y) + crossCoupling21*systemParams.expand_operator('Q1', Y), v))) systemParams.add_control_ham(inphase = inPhaseHam, quadrature = quadratureHam) systemParams.add_control_ham(inphase = inPhaseHam, quadrature = quadratureHam) #Setup the measurement operator systemParams.measurement = np.diag(np.array([0.862, 0.855, 0.850, 0.850, 0.845, 0.840, 0.845, 0.840, 0.835])) ##Add the T1 dissipators #systemParams.dissipators.append(Dissipator(systemParams.expand_operator('Q1', Q1.T1Dissipator))) #systemParams.dissipators.append(Dissipator(systemParams.expand_operator('Q2', Q2.T1Dissipator))) # #Setup the initial state as the ground state rhoIn = np.zeros((systemParams.dim, systemParams.dim)) rhoIn[0,0] = 1 #Setup the control pulses sampRate = 1.2e9 timeStep = 1.0/sampRate
from copy import deepcopy #Setup the system systemParams = SystemParams() qubit = SCQubit(2, 0e9, delta=200e6, name='Q1', T1=1e-6) systemParams.add_sub_system(qubit) systemParams.add_control_ham( inphase=Hamiltonian(0.5 * (qubit.loweringOp + qubit.raisingOp)), quadrature=Hamiltonian(0.5 * (-1j * qubit.loweringOp + 1j * qubit.raisingOp))) systemParams.add_control_ham( inphase=Hamiltonian(0.5 * (qubit.loweringOp + qubit.raisingOp)), quadrature=Hamiltonian(0.5 * (-1j * qubit.loweringOp + 1j * qubit.raisingOp))) systemParams.measurement = qubit.pauliZ systemParams.create_full_Ham() #Define the initial state as the ground state rhoIn = qubit.levelProjector(0) #First the basic sequence basePulseSeq = PulseSequence() basePulseSeq.add_control_line(freq=0e9, phase=0) basePulseSeq.add_control_line(freq=0e9, phase=pi / 2) basePulseSeq.H_int = None #Some parameters for the pulse timeStep = 1.0 / 1.2e9 #How many discrete timesteps to break it up into stepsArray = np.arange(12, 61)
def testDRAG(self): ''' Try a unitary inversion pulse on a three level SCQuibt and see if we get something close to DRAG ''' #Setup a three level qubit and a 100MHz delta Q1 = SCQubit(3, 4.987456e9, -150e6, name='Q1') systemParams = SystemParams() systemParams.add_sub_system(Q1) systemParams.add_control_ham( inphase=Hamiltonian(0.5 * (Q1.loweringOp + Q1.raisingOp)), quadrature=Hamiltonian(0.5 * (-1j * Q1.loweringOp + 1j * Q1.raisingOp))) systemParams.add_control_ham( inphase=Hamiltonian(0.5 * (Q1.loweringOp + Q1.raisingOp)), quadrature=Hamiltonian(0.5 * (-1j * Q1.loweringOp + 1j * Q1.raisingOp))) systemParams.create_full_Ham() systemParams.measurement = Q1.levelProjector(1) #Setup the pulse parameters for the optimization numPoints = 30 pulseTime = 15e-9 pulseParams = PulseParams() pulseParams.timeSteps = (pulseTime / numPoints) * np.ones(numPoints) pulseParams.rhoStart = Q1.levelProjector(0) pulseParams.rhoGoal = Q1.levelProjector(1) pulseParams.Ugoal = Q1.pauliX pulseParams.add_control_line(freq=-Q1.omega, bandwidth=300e6, maxAmp=200e6) pulseParams.add_control_line(freq=-Q1.omega, phase=-np.pi / 2, bandwidth=300e6, maxAmp=200e6) pulseParams.H_int = Hamiltonian( (Q1.omega) * np.diag(np.arange(Q1.dim))) pulseParams.optimType = 'unitary' pulseParams.derivType = 'finiteDiff' #Start with a Gaussian tmpGauss = np.exp(-np.linspace(-2, 2, numPoints)**2) tmpScale = 0.5 / (np.sum(pulseParams.timeSteps * tmpGauss)) pulseParams.startControlAmps = np.vstack( (tmpScale * tmpGauss, np.zeros(numPoints))) #Call the optimization optimize_pulse(pulseParams, systemParams) if plotResults: plt.plot( np.cumsum(pulseParams.timeSteps) * 1e9, pulseParams.controlAmps.T / 1e6) plt.ylabel('Pulse Amplitude (MHz)') plt.xlabel('Time (ns)') plt.legend(('X Quadrature', 'Y Quadrature')) plt.title('DRAG Pulse from Optimal Control') plt.show() #Now test the optimized pulse and make sure it does give us the desired unitary result = simulate_sequence(pulseParams, systemParams, pulseParams.rhoStart, simType='unitary') assert np.abs(np.trace(np.dot( result[1].conj().T, pulseParams.Ugoal)))**2 / np.abs( np.trace(np.dot(pulseParams.Ugoal.conj().T, pulseParams.Ugoal)))**2 > 0.99
def setup_system(): ''' Should probably take in some parameters, but for now hard-code things. ''' #Setup the system systemParams = SystemParams() #First the two qubits defined in the lab frame Q1 = SCQubit(numLevels=3, omega=4.279e9, delta=-239e6, name='Q1', T1=10e-6) systemParams.add_sub_system(Q1) Q2 = SCQubit(numLevels=3, omega=4.06e9, delta=-224e6, name='Q2', T1=10e-6) systemParams.add_sub_system(Q2) #Add an interaction between the qubits to get the the cross-resonance effect systemParams.add_interaction('Q1', 'Q2', 'FlipFlop', 2e6) #Create the full Hamiltonian systemParams.create_full_Ham() #Calculate the eigenframe for the natural Hamiltonian d, v = eigh(systemParams.Hnat.matrix) #Reorder the transformation matrix to maintain the computational basis ordering sortOrder = np.argsort(np.argmax(np.abs(v), axis=0)) v = v[:, sortOrder] systemParams.Hnat.matrix = np.complex128(np.diag(d[sortOrder])) #Some operators for the controls X = 0.5 * (Q1.loweringOp + Q1.raisingOp) Y = 0.5 * (-1j * Q1.loweringOp + 1j * Q1.raisingOp) #The cross-coupling between the drives crossCoupling12 = 5.0 / 20 crossCoupling21 = 2.0 / 30 #Add the Q1 drive Hamiltonians inPhaseHam = Hamiltonian( np.dot( v.conj().T, np.dot( systemParams.expand_operator('Q1', X) + crossCoupling12 * systemParams.expand_operator('Q2', X), v))) quadratureHam = Hamiltonian( np.dot( v.conj().T, np.dot( systemParams.expand_operator('Q1', Y) + crossCoupling12 * systemParams.expand_operator('Q2', Y), v))) systemParams.add_control_ham(inphase=inPhaseHam, quadrature=quadratureHam) systemParams.add_control_ham(inphase=inPhaseHam, quadrature=quadratureHam) #Add the cross-drive Hamiltonians (same drive line as Q1) inPhaseHam = Hamiltonian( np.dot( v.conj().T, np.dot( systemParams.expand_operator('Q1', X) + crossCoupling12 * systemParams.expand_operator('Q2', X), v))) quadratureHam = Hamiltonian( np.dot( v.conj().T, np.dot( systemParams.expand_operator('Q1', Y) + crossCoupling12 * systemParams.expand_operator('Q2', Y), v))) systemParams.add_control_ham(inphase=inPhaseHam, quadrature=quadratureHam) systemParams.add_control_ham(inphase=inPhaseHam, quadrature=quadratureHam) #Add the Q2 drive Hamiltonians inPhaseHam = Hamiltonian( np.dot( v.conj().T, np.dot( systemParams.expand_operator('Q2', X) + crossCoupling21 * systemParams.expand_operator('Q1', X), v))) quadratureHam = Hamiltonian( np.dot( v.conj().T, np.dot( systemParams.expand_operator('Q2', Y) + crossCoupling21 * systemParams.expand_operator('Q1', Y), v))) systemParams.add_control_ham(inphase=inPhaseHam, quadrature=quadratureHam) systemParams.add_control_ham(inphase=inPhaseHam, quadrature=quadratureHam) #Setup the measurement operator systemParams.measurement = np.diag( np.array([0.088, 0.082, 0.080, 0.080, 0.78, 0.75, 0.078, 0.074, 0.072])) ##Add the T1 dissipators #systemParams.dissipators.append(Dissipator(systemParams.expand_operator('Q1', Q1.T1Dissipator))) #systemParams.dissipators.append(Dissipator(systemParams.expand_operator('Q2', Q2.T1Dissipator))) # return systemParams, (Q1, Q2)
from scipy.constants import pi '''System Setup''' systemParams = SystemParams() qubit = SCQubit(3, 0e9, -100e6, name='Q1', T1=50e-9) systemParams.add_sub_system(qubit) systemParams.add_control_ham( inphase=Hamiltonian(0.5 * (qubit.loweringOp + qubit.raisingOp)), quadrature=Hamiltonian(-0.5 * (-1j * qubit.loweringOp + 1j * qubit.raisingOp))) systemParams.add_control_ham( inphase=Hamiltonian(0.5 * (qubit.loweringOp + qubit.raisingOp)), quadrature=Hamiltonian(-0.5 * (-1j * qubit.loweringOp + 1j * qubit.raisingOp))) systemParams.measurement = qubit.levelProjector(1) systemParams.create_full_Ham() #Add the T1 dissipator systemParams.dissipators = [Dissipator(qubit.T1Dissipator)] ''' Simple Rabi Driving We'll vary the Rabi power (but always keep the time to a calibrated pi pulse. We expect to see a maximum at some intermediate regime where we have a balance between selectivity and T1 decay ''' pulseSeqs = [] pulseTimes = 1e-9 * np.arange(4, 100, 2) rhoIn = qubit.levelProjector(0) for pulseTime in pulseTimes:
systemParams.expand_operator('Q1', X) + systemParams.expand_operator('Q2', X)), quadrature=Hamiltonian(crossCoupling21 * systemParams.expand_operator('Q1', Y) + systemParams.expand_operator('Q2', Y))) systemParams.add_control_ham( inphase=Hamiltonian(crossCoupling21 * systemParams.expand_operator('Q1', X) + systemParams.expand_operator('Q2', X)), quadrature=Hamiltonian(crossCoupling21 * systemParams.expand_operator('Q1', Y) + systemParams.expand_operator('Q2', Y))) #Setup the measurement operator # systemParams.measurement = -systemParams.expand_operator('Q1', Q1.pauliZ) systemParams.measurement = np.diag( np.array([0.55, 0.7, 0.75, 0.72, 0.76, 0.76, 0.76, 0.78, 0.80])) #Add the T1 dissipators systemParams.dissipators.append( Dissipator(systemParams.expand_operator('Q1', Q1.T1Dissipator))) systemParams.dissipators.append( Dissipator(systemParams.expand_operator('Q2', Q2.T1Dissipator))) #Setup the initial state as the ground state rhoIn = np.kron(Q1.levelProjector(0), Q2.levelProjector(0)) sampRate = 1.2e9 timeStep = 1.0 / sampRate drive1Freq = Q1.omega - 1e6 drive2Freq = Q2.omega - 1e6
from PySim.SystemParams import SystemParams from PySim.PulseSequence import PulseSequence from PySim.Simulation import simulate_sequence_stack from PySim.QuantumSystems import SCQubit, Hamiltonian #Setup the system systemParams = SystemParams() qubit = SCQubit(6, 4.76e9, delta=-200e6, name='Q1', T1=1e-6) systemParams.add_sub_system(qubit) systemParams.add_control_ham( inphase=Hamiltonian(0.5 * (qubit.loweringOp + qubit.raisingOp)), quadrature=Hamiltonian(0.5 * (-1j * qubit.loweringOp + 1j * qubit.raisingOp))) systemParams.create_full_Ham() systemParams.measurement = np.diag([0.72, 0.70, 0.69, 0.685, 0.6825, 0.68125]) #Define the initial state as the ground state rhoIn = qubit.levelProjector(0) #Some parameters for the pulse timeStep = 1 / 1.2e9 pulseAmps = 250e6 * np.linspace(-1, 1, 81) freqs = np.linspace(4.3e9, 4.9e9, 450) numSteps = 160 xPts = np.linspace(-2, 2, numSteps) gaussPulse = np.exp(-0.5 * (xPts**2)) - np.exp(-0.5 * 2**2) pulseSeqs = [] for tmpFreq in freqs:
import matplotlib.pyplot as plt import matplotlib.cm as cm from PySim.SystemParams import SystemParams from PySim.PulseSequence import PulseSequence from PySim.Simulation import simulate_sequence_stack from PySim.QuantumSystems import SCQubit, Hamiltonian #Setup the system systemParams = SystemParams() qubit = SCQubit(6, 4.76e9, delta=-200e6, name='Q1', T1=1e-6) systemParams.add_sub_system(qubit) systemParams.add_control_ham(inphase = Hamiltonian(0.5*(qubit.loweringOp + qubit.raisingOp)), quadrature = Hamiltonian(0.5*(-1j*qubit.loweringOp + 1j*qubit.raisingOp))) systemParams.create_full_Ham() systemParams.measurement = np.diag([0.72, 0.70, 0.69, 0.685, 0.6825, 0.68125]) #Define the initial state as the ground state rhoIn = qubit.levelProjector(0) #Some parameters for the pulse timeStep = 1/1.2e9 pulseAmps = 250e6*np.linspace(-1,1,81) freqs = np.linspace(4.3e9, 4.9e9,450) numSteps = 160 xPts = np.linspace(-2,2,numSteps) gaussPulse = np.exp(-0.5*(xPts**2)) - np.exp(-0.5*2**2)
#Add the Q1 drive Hamiltonians systemParams.add_control_ham(inphase = Hamiltonian(systemParams.expand_operator('Q1', X) + crossCoupling12*systemParams.expand_operator('Q2', X)), quadrature = Hamiltonian(systemParams.expand_operator('Q1', Y) + crossCoupling12*systemParams.expand_operator('Q2', Y))) systemParams.add_control_ham(inphase = Hamiltonian(systemParams.expand_operator('Q1', X) + crossCoupling12*systemParams.expand_operator('Q2', X)), quadrature = Hamiltonian(systemParams.expand_operator('Q1', Y) + crossCoupling12*systemParams.expand_operator('Q2', Y))) #Add the Q2 drive Hamiltonians systemParams.add_control_ham(inphase = Hamiltonian(crossCoupling21*systemParams.expand_operator('Q1', X) + systemParams.expand_operator('Q2', X)), quadrature = Hamiltonian(crossCoupling21*systemParams.expand_operator('Q1', Y) + systemParams.expand_operator('Q2', Y))) systemParams.add_control_ham(inphase = Hamiltonian(crossCoupling21*systemParams.expand_operator('Q1', X) + systemParams.expand_operator('Q2', X)), quadrature = Hamiltonian(crossCoupling21*systemParams.expand_operator('Q1', Y) + systemParams.expand_operator('Q2', Y))) #Setup the measurement operator # systemParams.measurement = -systemParams.expand_operator('Q1', Q1.pauliZ) systemParams.measurement = np.diag(np.array([0.55, 0.7, 0.75, 0.72, 0.76, 0.76, 0.76, 0.78, 0.80])) #Add the T1 dissipators systemParams.dissipators.append(Dissipator(systemParams.expand_operator('Q1', Q1.T1Dissipator))) systemParams.dissipators.append(Dissipator(systemParams.expand_operator('Q2', Q2.T1Dissipator))) #Setup the initial state as the ground state rhoIn = np.kron(Q1.levelProjector(0), Q2.levelProjector(0)) sampRate = 1.2e9 timeStep = 1.0/sampRate drive1Freq = Q1.omega-1e6 drive2Freq = Q2.omega-1e6 #Calibrate a 240ns Gaussian pulse on Q1
def setup_system(): ''' Should probably take in some parameters, but for now hard-code things. ''' #Setup the system systemParams = SystemParams() #First the two qubits defined in the lab frame Q1 = SCQubit(numLevels=3, omega=4.279e9, delta=-239e6, name='Q1', T1=10e-6) systemParams.add_sub_system(Q1) Q2 = SCQubit(numLevels=3, omega=4.06e9, delta=-224e6, name='Q2', T1=10e-6) systemParams.add_sub_system(Q2) #Add an interaction between the qubits to get the the cross-resonance effect systemParams.add_interaction('Q1', 'Q2', 'FlipFlop', 2e6) #Create the full Hamiltonian systemParams.create_full_Ham() #Calculate the eigenframe for the natural Hamiltonian d,v = eigh(systemParams.Hnat.matrix) #Reorder the transformation matrix to maintain the computational basis ordering sortOrder = np.argsort(np.argmax(np.abs(v),axis=0)) v = v[:, sortOrder] systemParams.Hnat.matrix = np.complex128(np.diag(d[sortOrder])) #Some operators for the controls X = 0.5*(Q1.loweringOp + Q1.raisingOp) Y = 0.5*(-1j*Q1.loweringOp + 1j*Q1.raisingOp) #The cross-coupling between the drives crossCoupling12 = 5.0/20 crossCoupling21 = 2.0/30 #Add the Q1 drive Hamiltonians inPhaseHam = Hamiltonian(np.dot(v.conj().T, np.dot(systemParams.expand_operator('Q1', X) + crossCoupling12*systemParams.expand_operator('Q2', X), v))) quadratureHam = Hamiltonian(np.dot(v.conj().T, np.dot(systemParams.expand_operator('Q1', Y) + crossCoupling12*systemParams.expand_operator('Q2', Y), v))) systemParams.add_control_ham(inphase = inPhaseHam, quadrature = quadratureHam) systemParams.add_control_ham(inphase = inPhaseHam, quadrature = quadratureHam) #Add the cross-drive Hamiltonians (same drive line as Q1) inPhaseHam = Hamiltonian(np.dot(v.conj().T, np.dot(systemParams.expand_operator('Q1', X) + crossCoupling12*systemParams.expand_operator('Q2', X), v))) quadratureHam = Hamiltonian(np.dot(v.conj().T, np.dot(systemParams.expand_operator('Q1', Y) + crossCoupling12*systemParams.expand_operator('Q2', Y), v))) systemParams.add_control_ham(inphase = inPhaseHam, quadrature = quadratureHam) systemParams.add_control_ham(inphase = inPhaseHam, quadrature = quadratureHam) #Add the Q2 drive Hamiltonians inPhaseHam = Hamiltonian(np.dot(v.conj().T, np.dot(systemParams.expand_operator('Q2', X) + crossCoupling21*systemParams.expand_operator('Q1', X), v))) quadratureHam = Hamiltonian(np.dot(v.conj().T, np.dot(systemParams.expand_operator('Q2', Y) + crossCoupling21*systemParams.expand_operator('Q1', Y), v))) systemParams.add_control_ham(inphase = inPhaseHam, quadrature = quadratureHam) systemParams.add_control_ham(inphase = inPhaseHam, quadrature = quadratureHam) #Setup the measurement operator systemParams.measurement = np.diag(np.array([0.088, 0.082, 0.080, 0.080, 0.78, 0.75, 0.078, 0.074, 0.072])) ##Add the T1 dissipators #systemParams.dissipators.append(Dissipator(systemParams.expand_operator('Q1', Q1.T1Dissipator))) #systemParams.dissipators.append(Dissipator(systemParams.expand_operator('Q2', Q2.T1Dissipator))) # return systemParams, (Q1,Q2)
systemParams.create_full_Ham() #Some Pauli operators for the controls X = 0.5*(Q1.loweringOp + Q1.raisingOp) Y = 0.5*(-1j*Q1.loweringOp + 1j*Q2.raisingOp) #The cross-coupling from Q1 drive to Q2 crossCoupling = 1 #Add the Q1 drive Hamiltonians systemParams.add_control_ham(inphase = Hamiltonian(systemParams.expand_operator('Q1', X) + crossCoupling*systemParams.expand_operator('Q2', X)), quadrature = Hamiltonian(systemParams.expand_operator('Q1', Y) + crossCoupling*systemParams.expand_operator('Q2', Y))) #Setup the measurement operator # systemParams.measurement = np.kron(Q1.levelProjector(1), Q2.levelProjector(1)) systemParams.measurement = 0.5*np.kron(Q1.levelProjector(0), Q2.levelProjector(0)) + 0.67*np.kron(Q1.levelProjector(1), Q2.levelProjector(0)) + \ 0.64*np.kron(Q1.levelProjector(0), Q2.levelProjector(1)) + 0.72*np.kron(Q1.levelProjector(0), Q2.levelProjector(2)) + \ 0.75*np.kron(Q1.levelProjector(1), Q2.levelProjector(1)) + 0.78*np.kron(Q1.levelProjector(1), Q2.levelProjector(2)) #Add the T1 dissipators systemParams.dissipators.append(Dissipator(systemParams.expand_operator('Q1', Q1.T1Dissipator))) systemParams.dissipators.append(Dissipator(systemParams.expand_operator('Q2', Q2.T1Dissipator))) #Setup the initial state as the ground state rhoIn = np.zeros((systemParams.dim, systemParams.dim)) rhoIn[0,0] = 1 #First run 1D spectroscopy around the Bell-Rabi drive frequency freqSweep = 1e9*np.linspace(5.02, 5.040, 20) # freqSweep = [5.023e9] ampSweep = np.linspace(-1,1,80) x = np.linspace(-2,2,100)
from PySim.Simulation import simulate_sequence_stack, simulate_sequence from PySim.OptimalControl import optimize_pulse, PulseParams import numpy as np import matplotlib.pyplot as plt from scipy.constants import pi '''System Setup''' systemParams = SystemParams() qubit = SCQubit(3, 0e9, -100e6, name='Q1', T1=50e-9) systemParams.add_sub_system(qubit) systemParams.add_control_ham(inphase = Hamiltonian(0.5*(qubit.loweringOp + qubit.raisingOp)), quadrature = Hamiltonian(-0.5*(-1j*qubit.loweringOp + 1j*qubit.raisingOp))) systemParams.add_control_ham(inphase = Hamiltonian(0.5*(qubit.loweringOp + qubit.raisingOp)), quadrature = Hamiltonian(-0.5*(-1j*qubit.loweringOp + 1j*qubit.raisingOp))) systemParams.measurement = qubit.levelProjector(1) systemParams.create_full_Ham() #Add the T1 dissipator systemParams.dissipators = [Dissipator(qubit.T1Dissipator)] ''' Simple Rabi Driving We'll vary the Rabi power (but always keep the time to a calibrated pi pulse. We expect to see a maximum at some intermediate regime where we have a balance between selectivity and T1 decay ''' pulseSeqs = [] pulseTimes = 1e-9*np.arange(4,100, 2)