def test_StateTomo_detailed(): NumberOfIons = 2 PhononOverhead = 1 hspace = sim.hspace(NumberOfIons, 2, NumberOfIons + PhononOverhead, 0) params = sim.parameters(hspace) dec = sim.decoherence(params) params.y0[qc.stateToIndex('SS,0', hspace)] = 1 pulseseq = sim.PulseSequence( [ \ sim.Rcar(params, 2*pi, 0, 0), \ ] ) ScanObj = IPS.ScanParameter_in_Sequence(pulseseq, params, dec, np.arange(3**NumberOfIons), type='StateTomo') ScanObj.runScan() data_dmr = ScanObj.output_dict['qstates_camera'] rho = dmr.IterML.iterfun(data_dmr, 100) #if np.real(rho[3,3]) > 0.99: # print 'statetomo passed' return np.real(rho[3, 3]) > 0.99
def test_ProcTomo_detailed(): NumberOfIons = 1 PhononOverhead = 7 hspace = sim.hspace(NumberOfIons, 2, NumberOfIons + PhononOverhead, 0) params = sim.parameters(hspace) dec = sim.decoherence(params) params.y0[qc.stateToIndex('S,0', hspace)] = 1 pulseseq = sim.PulseSequence( [ \ sim.Rcar(params, pi/2,0), ] ) ScanObj = IPS.ScanParameter_in_Sequence(pulseseq, params, dec, np.arange(12**NumberOfIons), type='ProcTomo') ScanObj.runScan() data_proctom = ScanObj.output_dict['qstates_camera'] chi = proctom.proctomo(data_proctom, 100) #if np.real(chi[0,0]) > 0.99: # print 'proctomo passed' chiId = qproc.Unitary2Chi(pulseseq[0].Uidtr.conjugate()) return np.max(abs(chi - chiId)) < 0.001
def test_Rabi_carrier_detailed(figNum): #print(TestUserFUnction.figNum, TestUserFunction.figNum_start, "<<<<") NumberOfIons = 1 PhononOverhead = 2 hspace = sim.hspace(NumberOfIons,2,NumberOfIons+PhononOverhead,0) params = sim.parameters(hspace) params.stepsize = 1 dec = sim.decoherence(params) params.y0[qc.stateToIndex('S,0', hspace)] = 1 params.printpulse = False # don't print pulse details pulseseq = sim.PulseSequence( [ sim.Rcar(params, 10*pi, 0, -1) ] ) data = qc.simulateevolution(pulseseq, params, dec) data.tracedpopulation(figNum) # start with fit here x = data.T y = data.YtrN.transpose()[0] # this is the s-state population # p[0] ... amplitude, should be 1 # p[1] ... freq, should be params.omc # p[2] ... phase, should be 0 # p[3] ... offset, should be 0 startparams = np.array([1, params.omc, 0, 0]) # 1-data ... to get the D-state population fitfun = lambda p, x: 1-p[0]*np.sin(p[1]*x/2+p[2])**2 + p[3] errfun = lambda p, x, y: y-fitfun(p,x) par, covmat, infodict, mesg, ier = leastsq(errfun, startparams, args=(x,y), full_output = True) #print(startparams) #print(par) #print(startparams-par) epsilon = 10**-5 if par[0] - startparams[0] > epsilon: print("amplitude of Rabi oscillations wrong") if par[1] - startparams[1] > epsilon: print("frequency of Rabi oscillations wrong") if par[2] - startparams[2] > epsilon: print("phase of Rabi oscillations wrong") if par[3] - startparams[3] > epsilon: print("offset of Rabi oscillations wrong") return np.all(par-startparams < epsilon)
def test_Rabi_carrier_detailed(figNum): #print TestUserFUnction.figNum, TestUserFunction.figNum_start, "<<<<" NumberOfIons = 1 PhononOverhead = 2 hspace = sim.hspace(NumberOfIons,2,NumberOfIons+PhononOverhead,0) params = sim.parameters(hspace) params.stepsize = 1 dec = sim.decoherence(params) params.y0[qc.stateToIndex('S,0', hspace)] = 1 params.printpulse = False # don't print pulse details pulseseq = sim.PulseSequence( [ sim.Rcar(params, 10*pi, 0, -1) ] ) data = qc.simulateevolution(pulseseq, params, dec) data.tracedpopulation(figNum) # start with fit here x = data.T y = data.YtrN.transpose()[0] # this is the s-state population # p[0] ... amplitude, should be 1 # p[1] ... freq, should be params.omc # p[2] ... phase, should be 0 # p[3] ... offset, should be 0 startparams = np.array([1, params.omc, 0, 0]) # 1-data ... to get the D-state population fitfun = lambda p, x: 1-p[0]*np.sin(p[1]*x/2+p[2])**2 + p[3] errfun = lambda p, x, y: y-fitfun(p,x) par, covmat, infodict, mesg, ier = leastsq(errfun, startparams, args=(x,y), full_output = True) #print startparams #print par #print startparams-par epsilon = 10**-5 if par[0] - startparams[0] > epsilon: print "amplitude of Rabi oscillations wrong" if par[1] - startparams[1] > epsilon: print "frequency of Rabi oscillations wrong" if par[2] - startparams[2] > epsilon: print "phase of Rabi oscillations wrong" if par[3] - startparams[3] > epsilon: print "offset of Rabi oscillations wrong" return np.all(par-startparams < epsilon)
def test_spontdecay_detailed(figNum): NumberOfIons = 1 NumberofPhonons = 1 hspace = sim.hspace(NumberOfIons, 2, NumberofPhonons, 0) params = sim.parameters(hspace) dec = sim.decoherence(params) dec.doRandNtimes = 100 dec.dict['spontdecay'] = True dec.doPP = True dec.doPPprintstats = False dec.progbar = False # for the test we set it to 300 mus, instead of 1.168 s params.lifetime = 300 params.y0[qc.stateToIndex(NumberOfIons * 'D' + ',0', hspace)] = 1 params.y0[qc.stateToIndex(NumberOfIons * 'S' + ',0', hspace)] = 0 pulseseq = sim.PulseSequence( [ \ sim.Delay(params, 1000), \ ] ) data = qc.simulateevolution(pulseseq, params, dec) data.tracedpopulation(figNum) # fitting part p0 = [1, params.lifetime] fitfun = lambda p, x: p[0] * np.exp(-x / float(p[1])) errfun = lambda p, x, y: y - fitfun(p, x) x = data.T y = data.YtrN[:, 0] par, covmat, infodict, mesg, ier = leastsq(errfun, p0, args=(x, y), full_output=True) epsilon = 50 # with 100 iterations allow 50us offset in decay time # print(np.abs(par[-1] - params.lifetime)) return np.abs(par[-1] - params.lifetime) < epsilon
def test_spontdecay_detailed(figNum): NumberOfIons = 1 NumberofPhonons = 1 hspace = sim.hspace(NumberOfIons,2,NumberofPhonons,0) params = sim.parameters(hspace) dec = sim.decoherence(params) dec.doRandNtimes = 100 dec.dict['spontdecay'] = True dec.doPP = True dec.doPPprintstats = False dec.progbar = False # for the test we set it to 300 mus, instead of 1.168 s params.lifetime = 300 params.y0[qc.stateToIndex(NumberOfIons*'D'+',0', hspace)] = 1 params.y0[qc.stateToIndex(NumberOfIons*'S'+',0', hspace)] = 0 pulseseq = sim.PulseSequence( [ \ sim.Delay(params, 1000), \ ] ) data = qc.simulateevolution(pulseseq, params, dec) data.tracedpopulation(figNum) # fitting part p0 = [1, params.lifetime] fitfun = lambda p, x: p[0] * np.exp(-x / float(p[1])) errfun = lambda p, x, y: y-fitfun(p,x) x = data.T y = data.YtrN[:,0] par, covmat, infodict, mesg, ier = leastsq(errfun, p0, args=(x,y), full_output = True) epsilon = 50 # with 100 iterations allow 50us offset in decay time # print np.abs(par[-1] - params.lifetime) return np.abs(par[-1] - params.lifetime) < epsilon
def test_state_initialisation_detailed(figNum): NumberOfIons = 1 NumberOfPhonons = 1 hspace = sim.hspace(NumberOfIons, 2, NumberOfPhonons, 0) params = sim.parameters(hspace) params.stateiniterr = 0.2 dec = sim.decoherence(params) dec.doPP = False dec.progbar = False dec.doRandNtimes = 10 dec.dict['initerr'] = True params.y0[qc.stateToIndex(NumberOfIons * 'S' + ',0', hspace)] = 1 pulseseq = sim.PulseSequence( [ \ sim.Rcar(params, 5*pi, 0), ] ) data = qc.simulateevolution(pulseseq, params, dec) data.tracedpopulation(figNum) # start with fit here x = data.T y = data.YtrN.transpose()[-1] # this is the d-state population # p[0] ... amplitude, should be 0.8 # p[1] ... freq, should be params.omc # p[2] ... phase, should be 0 # p[3] ... offset, should be 0 startparams = np.array([0.8, params.omc, 0, 0]) # 1-data ... to get the D-state population fitfun = lambda p, x: p[0] * np.sin(p[1] * x / 2 + p[2])**2 + p[3] errfun = lambda p, x, y: y - fitfun(p, x) par, covmat, infodict, mesg, ier = leastsq(errfun, startparams, args=(x, y), full_output=True) # print(par) # even for the 1000 realisations, allow for a 3% error epsilon = 0.03 return abs(abs(par[0]) - startparams[0]) < epsilon
def test_state_initialisation_detailed(figNum): NumberOfIons = 1 NumberOfPhonons = 1 hspace = sim.hspace(NumberOfIons,2,NumberOfPhonons,0) params = sim.parameters(hspace) params.stateiniterr = 0.2 dec = sim.decoherence(params) dec.doRandNtimes = 1000 dec.dict['initerr'] = True params.y0[qc.stateToIndex(NumberOfIons*'S'+',0', hspace)] = 1 pulseseq = sim.PulseSequence( [ \ sim.Rcar(params, 5*pi, 0), ] ) data = qc.simulateevolution(pulseseq, params, dec) data.tracedpopulation(figNum) # start with fit here x = data.T y = data.YtrN.transpose()[-1] # this is the d-state population # p[0] ... amplitude, should be 0.8 # p[1] ... freq, should be params.omc # p[2] ... phase, should be 0 # p[3] ... offset, should be 0 startparams = np.array([0.8, params.omc, 0, 0]) # 1-data ... to get the D-state population fitfun = lambda p, x: p[0]*np.sin(p[1]*x/2+p[2])**2 + p[3] errfun = lambda p, x, y: y-fitfun(p,x) par, covmat, infodict, mesg, ier = leastsq(errfun, startparams, args=(x,y), full_output = True) # print par # even for the 1000 realisations, allow for a 3% error epsilon = 0.03 return abs(abs(par[0])-startparams[0]) < epsilon
def test_StateTomo_detailed(): NumberOfIons = 2 PhononOverhead = 1 hspace = sim.hspace(NumberOfIons,2,NumberOfIons+PhononOverhead,0) params = sim.parameters(hspace) dec = sim.decoherence(params) params.y0[qc.stateToIndex('SS,0', hspace)] = 1 pulseseq = sim.PulseSequence( [ \ sim.Rcar(params, 2*pi, 0, 0), \ ] ) ScanObj = IPS.ScanParameter_in_Sequence(pulseseq, params, dec, np.arange(3**NumberOfIons), type = 'StateTomo') ScanObj.runScan() data_dmr = ScanObj.output_dict['qstates_camera'] rho = dmr.IterML.iterfun(data_dmr, 100) #if np.real(rho[3,3]) > 0.99: # print 'statetomo passed' return np.real(rho[3,3]) > 0.99
def test_ProcTomo_detailed(): NumberOfIons = 1 PhononOverhead = 7 hspace = sim.hspace(NumberOfIons,2,NumberOfIons+PhononOverhead,0) params = sim.parameters(hspace) dec = sim.decoherence(params) params.y0[qc.stateToIndex('S,0', hspace)] = 1 pulseseq = sim.PulseSequence( [ \ sim.Rcar(params, pi/2,0), ] ) ScanObj = IPS.ScanParameter_in_Sequence(pulseseq, params, dec, np.arange(12**NumberOfIons), type = 'ProcTomo') ScanObj.runScan() data_proctom = ScanObj.output_dict['qstates_camera'] chi = proctom.proctomo(data_proctom, 100) #if np.real(chi[0,0]) > 0.99: # print 'proctomo passed' chiId = qproc.Unitary2Chi(pulseseq[0].Uidtr.conjugate()) return np.max(abs(chi - chiId)) < 0.001
''' Cirac-Zoller CNOT ''' import numpy as np import PyTIQC.core.simtools as sim import PyTIQC.core.qctools as qc pi = np.pi hspace = sim.hspace(2,2,2,0) params = sim.parameters(hspace) dec = sim.decoherence(params) params.y0[qc.stateToIndex('SS,0', hspace)] = 1 params.stepsize = 10 params.ignorelightshift = 1 #params.addressing = np.array([[1,0.1],[0.1,1]]) ang = np.arccos(-np.real(np.exp(pi/2*1j*np.sqrt(2)))); pulseseq = sim.PulseSequence( [ \ sim.Rblue(params, pi, 0, 0), \ sim.Rcar(params, pi/2, 0, 1), \ sim.Rblue(params, pi/2, 0, 1), \ sim.Rblue(params, np.sqrt(2)*pi, pi/2, 1), \ sim.Rblue(params, pi/2, pi, 1), \ sim.Rcar(params, pi/2, pi + ang, 1), \ sim.Rblue(params, pi, 0, 0) \ ] ) data = qc.simulateevolution(pulseseq, params, dec) data.displaypopulation(1)
''' Cirac-Zoller CNOT ''' import PyTIQC import numpy as np import PyTIQC.core.simtools as sim import PyTIQC.core.qctools as qc pi = np.pi hspace = sim.hspace(2, 2, 2, 0) params = sim.parameters(hspace) dec = sim.decoherence(params) params.y0[qc.stateToIndex('SS,0', hspace)] = 1 params.stepsize = 10 params.ignorelightshift = 1 #params.addressing = np.array([[1,0.1],[0.1,1]]) ang = np.arccos(-np.real(np.exp(pi / 2 * 1j * np.sqrt(2)))) pulseseq = sim.PulseSequence( [ \ sim.Rblue(params, pi, 0, 0), \ sim.Rcar(params, pi/2, 0, 1), \ sim.Rblue(params, pi/2, 0, 1), \ sim.Rblue(params, np.sqrt(2)*pi, pi/2, 1), \ sim.Rblue(params, pi/2, pi, 1), \ sim.Rcar(params, pi/2, pi + ang, 1), \ sim.Rblue(params, pi, 0, 0) \ ] ) data = qc.simulateevolution(pulseseq, params, dec)
def test_Ramsey_carrier_detailed(figNum): NumberOfIons = 1 PhononOverhead = 2 hspace = sim.hspace(NumberOfIons,2,NumberOfIons+PhononOverhead,0) params = sim.parameters(hspace) dec = sim.decoherence(params) params.y0[qc.stateToIndex('S,0', hspace)] = 1 params.stepsize = 1 params.printpulse = False # don't print pulse details numberofpoints = 20 phi = np.linspace(0, 2*pi, numberofpoints) ex = np.zeros(numberofpoints) for i in range(numberofpoints): pulseseq = sim.PulseSequence( [ sim.Rcar(params, pi/2, 0, -1), # sim.Delay(params, tdelay[i]), sim.Rcar(params, pi/2, phi[i], -1) ]) data = qc.simulateevolution(pulseseq, params, dec) data.tracedpopulation(figNum) ex[i] = data.YtrN[-1,0] # fig1 = pl.figure(1) # ax1 = fig1.add_subplot(111) # ax1.plot(phi, ex) # fig1.show() # p[0] ... amplitude, should be 1 # p[1] ... because phase is in units of pi -> 1 # p[2] ... phase, should be 0 # p[3] ... offset, should be 0.5 startparams = np.array([1, 1, 0, 0.5]) # 1-data ... to get the D-state population fitfun = lambda p, x: p[0]/2*np.cos(p[1]*x+p[2]) + p[3] errfun = lambda p, x, y: y-fitfun(p,x) par, covmat, infodict, mesg, ier = leastsq(errfun, startparams, args=(phi,ex), full_output = True) #print(startparams) #print(par) #print(startparams-par) epsilon = 10**-5 if par[0] - startparams[0] > epsilon: print("amplitude of Ramsey experiment wrong") if par[1] - startparams[1] > epsilon: print("frequency of Ramsey experiment wrong") if par[2] - startparams[2] > epsilon: print("phase of Ramsey experiment wrong") if par[3] - startparams[3] > epsilon: print("offset of Ramsey experiment wrong") return np.all(par-startparams < epsilon)
def test_Ramsey_carrier_detailed(figNum): NumberOfIons = 1 PhononOverhead = 2 hspace = sim.hspace(NumberOfIons,2,NumberOfIons+PhononOverhead,0) params = sim.parameters(hspace) dec = sim.decoherence(params) params.y0[qc.stateToIndex('S,0', hspace)] = 1 params.stepsize = 1 params.printpulse = False # don't print pulse details numberofpoints = 20 phi = np.linspace(0, 2*pi, numberofpoints) ex = np.zeros(numberofpoints) for i in range(numberofpoints): pulseseq = sim.PulseSequence( [ sim.Rcar(params, pi/2, 0, -1), # sim.Delay(params, tdelay[i]), sim.Rcar(params, pi/2, phi[i], -1) ]) data = qc.simulateevolution(pulseseq, params, dec) data.tracedpopulation(figNum) ex[i] = data.YtrN[-1,0] # fig1 = pl.figure(1) # ax1 = fig1.add_subplot(111) # ax1.plot(phi, ex) # fig1.show() # p[0] ... amplitude, should be 1 # p[1] ... because phase is in units of pi -> 1 # p[2] ... phase, should be 0 # p[3] ... offset, should be 0.5 startparams = np.array([1, 1, 0, 0.5]) # 1-data ... to get the D-state population fitfun = lambda p, x: p[0]/2*np.cos(p[1]*x+p[2]) + p[3] errfun = lambda p, x, y: y-fitfun(p,x) par, covmat, infodict, mesg, ier = leastsq(errfun, startparams, args=(phi,ex), full_output = True) #print startparams #print par #print startparams-par epsilon = 10**-5 if par[0] - startparams[0] > epsilon: print "amplitude of Ramsey experiment wrong" if par[1] - startparams[1] > epsilon: print "frequency of Ramsey experiment wrong" if par[2] - startparams[2] > epsilon: print "phase of Ramsey experiment wrong" if par[3] - startparams[3] > epsilon: print "offset of Ramsey experiment wrong" return np.all(par-startparams < epsilon)