def test_parse_program(self): """Test typical pulse program.""" test_pulse = pulse.Gaussian(10, 0.1, 3) sched = pulse.Schedule() sched = sched.insert(0, pulse.SetPhase(3.14, pulse.DriveChannel(0))) sched = sched.insert(0, pulse.Play(test_pulse, pulse.DriveChannel(0))) sched = sched.insert(10, pulse.ShiftPhase(-1.57, pulse.DriveChannel(0))) sched = sched.insert(10, pulse.Play(test_pulse, pulse.DriveChannel(0))) ch_events = events.ChannelEvents.load_program(sched, pulse.DriveChannel(0)) # check waveform data waveforms = list(ch_events.get_waveforms()) inst_data0 = waveforms[0] self.assertEqual(inst_data0.t0, 0) self.assertEqual(inst_data0.frame.phase, 3.14) self.assertEqual(inst_data0.frame.freq, 0) self.assertEqual(inst_data0.inst, pulse.Play(test_pulse, pulse.DriveChannel(0))) inst_data1 = waveforms[1] self.assertEqual(inst_data1.t0, 10) self.assertEqual(inst_data1.frame.phase, 1.57) self.assertEqual(inst_data1.frame.freq, 0) self.assertEqual(inst_data1.inst, pulse.Play(test_pulse, pulse.DriveChannel(0))) # check frame data frames = list(ch_events.get_frame_changes()) inst_data0 = frames[0] self.assertEqual(inst_data0.t0, 0) self.assertEqual(inst_data0.frame.phase, 3.14) self.assertEqual(inst_data0.frame.freq, 0) self.assertListEqual(inst_data0.inst, [pulse.SetPhase(3.14, pulse.DriveChannel(0))]) inst_data1 = frames[1] self.assertEqual(inst_data1.t0, 10) self.assertEqual(inst_data1.frame.phase, -1.57) self.assertEqual(inst_data1.frame.freq, 0) self.assertListEqual(inst_data1.inst, [pulse.ShiftPhase(-1.57, pulse.DriveChannel(0))])
def test_multiple_frames_at_the_same_time(self): """Test multiple frame instruction at the same time.""" # shift phase followed by set phase sched = pulse.Schedule() sched = sched.insert(0, pulse.ShiftPhase(-1.57, pulse.DriveChannel(0))) sched = sched.insert(0, pulse.SetPhase(3.14, pulse.DriveChannel(0))) events = ChannelEvents.load_program(sched, pulse.DriveChannel(0)) frames = list(events.get_frame_changes()) _, frame, _ = frames[0] self.assertAlmostEqual(frame.phase, 3.14) # set phase followed by shift phase sched = pulse.Schedule() sched = sched.insert(0, pulse.SetPhase(3.14, pulse.DriveChannel(0))) sched = sched.insert(0, pulse.ShiftPhase(-1.57, pulse.DriveChannel(0))) events = ChannelEvents.load_program(sched, pulse.DriveChannel(0)) frames = list(events.get_frame_changes()) _, frame, _ = frames[0] self.assertAlmostEqual(frame.phase, 1.57)
def test_parameter_attribute_schedule(self): """Test the ``parameter`` attributes.""" schedule = pulse.Schedule() self.assertFalse(schedule.is_parameterized()) schedule += pulse.SetFrequency(self.alpha, DriveChannel(0)) self.assertEqual(schedule.parameters, {self.alpha}) schedule += pulse.ShiftFrequency(self.gamma, DriveChannel(0)) self.assertEqual(schedule.parameters, {self.alpha, self.gamma}) schedule += pulse.SetPhase(self.phi, DriveChannel(1)) self.assertTrue(schedule.is_parameterized()) self.assertEqual(schedule.parameters, {self.alpha, self.gamma, self.phi}) schedule.assign_parameters({self.phi: self.alpha, self.gamma: self.shift}) self.assertEqual(schedule.parameters, {self.alpha}) schedule.assign_parameters({self.alpha: self.beta}) self.assertEqual(schedule.parameters, {self.beta}) schedule.assign_parameters({self.beta: 10}) self.assertFalse(schedule.is_parameterized())
def test_straight_schedule_bind(self): """Nothing fancy, 1:1 mapping.""" schedule = pulse.Schedule() schedule += pulse.SetFrequency(self.alpha, DriveChannel(0)) schedule += pulse.ShiftFrequency(self.gamma, DriveChannel(0)) schedule += pulse.SetPhase(self.phi, DriveChannel(1)) schedule += pulse.ShiftPhase(self.theta, DriveChannel(1)) schedule.assign_parameters({self.alpha: self.freq, self.gamma: self.shift, self.phi: self.phase, self.theta: -self.phase}) insts = assemble(schedule, self.backend).experiments[0].instructions GHz = 1e9 # pylint: disable=invalid-name self.assertEqual(float(insts[0].frequency*GHz), self.freq) self.assertEqual(float(insts[1].frequency*GHz), self.shift) self.assertEqual(float(insts[2].phase), self.phase) self.assertEqual(float(insts[3].phase), -self.phase)
def test_multiple_parameters(self): """Expressions of parameters with partial assignment.""" schedule = pulse.Schedule() schedule += pulse.SetFrequency(self.alpha + self.beta, DriveChannel(0)) schedule += pulse.ShiftFrequency(self.gamma + self.beta, DriveChannel(0)) schedule += pulse.SetPhase(self.phi, DriveChannel(1)) # Partial bind delta = 1e9 schedule.assign_parameters({self.alpha: self.freq - delta}) schedule.assign_parameters({self.beta: delta}) schedule.assign_parameters({self.gamma: self.shift - delta}) schedule.assign_parameters({self.phi: self.phase}) insts = schedule.instructions self.assertEqual(float(insts[0][1].frequency), self.freq) self.assertEqual(float(insts[1][1].frequency), self.shift) self.assertEqual(float(insts[2][1].phase), self.phase)