def performOpen(self, options={}): """Perform the operation of opening the instrument connection""" # init variables self.qubitSim = QubitSimulator() self.vPolarization = np.zeros((3, )) self.lTrace = [np.array([], dtype=float) for n in range(3)] self.dTimeStepOut = 0.0
def performOpen(self, options={}): """Perform the operation of opening the instrument connection""" # init variables self.qubitSim = QubitSimulator() self.vPolarization = np.zeros((3,)) self.lTrace = [np.array([], dtype=float) for n in range(3)] self.dTimeStepOut = 0.0
class Driver(InstrumentDriver.InstrumentWorker): """ This class implements a Single-qubit simulator""" def performOpen(self, options={}): """Perform the operation of opening the instrument connection""" # init variables self.qubitSim = QubitSimulator() self.vPolarization = np.zeros((3, )) self.lTrace = [np.array([], dtype=float) for n in range(3)] self.dTimeStepOut = 0.0 def performSetValue(self, quant, value, sweepRate=0.0, options={}): """Perform the Set Value instrument operation. This function should return the actual value set by the instrument""" # do nothing, just return value return value def performGetValue(self, quant, options={}): """Perform the Get Value instrument operation""" dPol = { 'Polarization - X': 0, 'Polarization - Y': 1, 'Polarization - Z': 2 } dTrace = {'Trace - Px': 0, 'Trace - Py': 1, 'Trace - Pz': 2} # check type of quantity if quant.name in (list(dPol.keys()) + list(dTrace.keys())): # output data, check if simulation needs to be performed if self.isConfigUpdated(): self.performSimulation() # get new value if quant.name in dPol: value = self.vPolarization[dPol[quant.name]] elif quant.name in dTrace: # get correct data and return as trace dict vData = self.lTrace[dTrace[quant.name]] value = quant.getTraceDict(vData, dt=self.dTimeStepOut) else: # otherwise, just return current value value = quant.getValue() return value def performSimulation(self): """Perform simulation""" # get config values dConfig = dict( dDelta=self.getValue('Delta') / 1E9, dRabiAmp=self.getValue('Drive amplitude') / 1E9, dTimeStep=1E9 * self.getValue('Time step, simulation'), dDetuning=self.getValue('Epsilon') / 1E9, nRep=int(self.getValue('Number of randomizations')), dDriveFreq=self.getValue('Drive frequency') / 1E9, bRelFreq=bool(self.getValue('Drive relative to qubit frequency')), bRotFrame=bool(self.getValue('Use rotating frame')), bRWA=bool(self.getValue('Use rotating-wave approximation'))) # get noise config nNoise = int(self.getValueIndex('Noise sources')) lNoiseCfg = [] for n in range(nNoise): Noise = NoiseCfg() # noise type sType = self.getValue('Noise type %d' % (n + 1)) if sType == 'Static': Noise.model = NoiseCfg.NOISESTATIC elif sType == '1/f': Noise.model = NoiseCfg.NOISE1F elif sType == 'White': Noise.model = NoiseCfg.NOISEWHITE # other cfg values Noise.deltaAmp = self.getValue('Noise, Delta %d' % (n + 1)) Noise.epsAmp = self.getValue('Noise, Epsilon %d' % (n + 1)) Noise.driveAmp = self.getValue('Noise, Drive %d' % (n + 1)) Noise.hiCutOff = self.getValue('High-freq cut-off %d' % (n + 1)) Noise.bAddStatic = self.getValue( 'Include 1/f at low frequencies %d' % (n + 1)) Noise.repRate = self.getValue('Pulse sequence rep. rate %d' % (n + 1)) # add to list lNoiseCfg.append(Noise) dConfig['lNoiseCfg'] = lNoiseCfg # update config self.qubitSim.updateSimCfg(dConfig) # get I/Q from input data vI = self.getValue('Trace - I')['y'] vQ = self.getValue('Trace - Q')['y'] dTimeStepIn = 1E9 * self.getValue('Trace - I')['dt'] dTimeStepOut = 1E9 * self.getValue('Time step, output traces') # do simulation if len(vI) > 0 and len(vQ) > 0: (vPz, vPx, vPy, dTimeStepOut) = self.qubitSim.performSimulation( vI, vQ, dTimeStepIn, dTimeStepOut) self.vPolarization = np.array([vPx[-1], vPy[-1], vPz[-1]]) self.lTrace = [vPx, vPy, vPz] self.dTimeStepOut = 1E-9 * dTimeStepOut
class Driver(InstrumentDriver.InstrumentWorker): """ This class implements a Single-qubit simulator""" def performOpen(self, options={}): """Perform the operation of opening the instrument connection""" # init variables self.qubitSim = QubitSimulator() self.vPolarization = np.zeros((3,)) self.lTrace = [np.array([], dtype=float) for n in range(3)] self.dTimeStepOut = 0.0 def performSetValue(self, quant, value, sweepRate=0.0, options={}): """Perform the Set Value instrument operation. This function should return the actual value set by the instrument""" # do nothing, just return value return value def performGetValue(self, quant, options={}): """Perform the Get Value instrument operation""" dPol = {"Polarization - X": 0, "Polarization - Y": 1, "Polarization - Z": 2} dTrace = {"Trace - Px": 0, "Trace - Py": 1, "Trace - Pz": 2} # check type of quantity if quant.name in (dPol.keys() + dTrace.keys()): # output data, check if simulation needs to be performed if self.isConfigUpdated(): self.performSimulation() # get new value if quant.name in dPol: value = self.vPolarization[dPol[quant.name]] elif quant.name in dTrace: # get correct data and return as trace dict vData = self.lTrace[dTrace[quant.name]] value = quant.getTraceDict(vData, dt=self.dTimeStepOut) else: # otherwise, just return current value value = quant.getValue() return value def performSimulation(self): """Perform simulation""" # get config values dConfig = dict( dDelta=self.getValue("Delta") / 1e9, dRabiAmp=self.getValue("Drive amplitude") / 1e9, dTimeStep=1e9 * self.getValue("Time step, simulation"), dDetuning=self.getValue("Epsilon") / 1e9, nRep=int(self.getValue("Number of randomizations")), dDriveFreq=self.getValue("Drive frequency") / 1e9, bRelFreq=bool(self.getValue("Drive relative to qubit frequency")), bRWA=bool(self.getValue("Use rotating frame")), bRotFrame=bool(self.getValue("Use rotating-wave approximation")), ) # get noise config nNoise = int(self.getValueIndex("Noise sources")) lNoiseCfg = [] for n in range(nNoise): Noise = NoiseCfg() # noise type sType = self.getValue("Noise type %d" % (n + 1)) if sType == "Static": Noise.model = NoiseCfg.NOISESTATIC elif sType == "1/f": Noise.model = NoiseCfg.NOISE1F elif sType == "White": Noise.model = NoiseCfg.NOISEWHITE # other cfg values Noise.deltaAmp = self.getValue("Noise, Delta %d" % (n + 1)) Noise.epsAmp = self.getValue("Noise, Epsilon %d" % (n + 1)) Noise.driveAmp = self.getValue("Noise, Drive %d" % (n + 1)) Noise.hiCutOff = self.getValue("High-freq cut-off %d" % (n + 1)) Noise.bAddStatic = self.getValue("Include 1/f at low frequencies %d" % (n + 1)) Noise.repRate = self.getValue("Pulse sequence rep. rate %d" % (n + 1)) # add to list lNoiseCfg.append(Noise) dConfig["lNoiseCfg"] = lNoiseCfg # update config self.qubitSim.updateSimCfg(dConfig) # get I/Q from input data vI = self.getValue("Trace - I")["y"] vQ = self.getValue("Trace - Q")["y"] dTimeStepIn = 1e9 * self.getValue("Trace - I")["dt"] dTimeStepOut = 1e9 * self.getValue("Time step, output traces") # do simulation if len(vI) > 0 and len(vQ) > 0: (vPz, vPx, vPy, dTimeStepOut) = self.qubitSim.performSimulation(vI, vQ, dTimeStepIn, dTimeStepOut) self.vPolarization = np.array([vPx[-1], vPy[-1], vPz[-1]]) self.lTrace = [vPx, vPy, vPz] self.dTimeStepOut = 1e-9 * dTimeStepOut