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_get_parameter_from_call(self): """Test get parameters from instruction.""" sched = pulse.Schedule() sched += pulse.ShiftPhase(self.phi1, self.d1) test_obj = pulse.Call(subroutine=sched) visitor = ParameterGetter() visitor.visit(test_obj) ref_params = {self.phi1, self.ch1} self.assertSetEqual(visitor.parameters, ref_params)
def test_gen_formatted_frame_values(self): """Test gen_formatted_frame_values.""" fcs = [pulse.ShiftPhase(np.pi/2, pulse.DriveChannel(0)), pulse.ShiftFrequency(1e6, pulse.DriveChannel(0))] inst_data = create_instruction(fcs, np.pi/2, 1e6, 5, 0.1) objs = frame.gen_formatted_frame_values(inst_data, formatter=self.formatter, device=self.device) # type check self.assertEqual(type(objs[0]), drawing_objects.TextData) self.assertEqual(type(objs[1]), drawing_objects.TextData)
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_with_function(self): """Test ParameterExpressions formed trivially in a function.""" def get_shift(variable): return variable - 1 test_obj = pulse.ShiftPhase(get_shift(self.phi1), self.d1) visitor = ParameterGetter() visitor.visit(test_obj) ref_params = {self.phi1, self.ch1} self.assertSetEqual(visitor.parameters, ref_params)
def test_empty(self): """Test is_empty check.""" test_pulse = pulse.Gaussian(10, 0.1, 3) sched = pulse.Schedule() sched = sched.insert(0, pulse.ShiftPhase(1.57, pulse.DriveChannel(0))) events = ChannelEvents.load_program(sched, pulse.DriveChannel(0)) self.assertTrue(events.is_empty()) sched = pulse.Schedule() sched = sched.insert(0, pulse.Play(test_pulse, pulse.DriveChannel(0))) events = ChannelEvents.load_program(sched, pulse.DriveChannel(0)) self.assertFalse(events.is_empty())
def test_gen_raw_operand_values_compact(self): """Test gen_raw_operand_values_compact.""" fcs = [pulse.ShiftPhase(np.pi/2, pulse.DriveChannel(0)), pulse.ShiftFrequency(1e6, pulse.DriveChannel(0))] inst_data = create_instruction(fcs, np.pi/2, 1e6, 5, 0.1) obj = frame.gen_raw_operand_values_compact(inst_data, formatter=self.formatter, device=self.device)[0] # type check self.assertEqual(type(obj), drawing_objects.TextData) # data check self.assertListEqual(obj.channels, [pulse.DriveChannel(0)]) self.assertEqual(obj.text, '1.57\n1.0e+06')
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 gen_frame_symbol_with_parameters(self): """Test gen_frame_symbol with parameterized frame.""" theta = -1.0 * circuit.Parameter("P0") fcs = [pulse.ShiftPhase(theta, pulse.DriveChannel(0))] inst_data = create_instruction(fcs, np.pi / 2, 1e6, 5, 0.1) obj = frame.gen_frame_symbol(inst_data, formatter=self.formatter, device=self.device)[0] # metadata check ref_meta = { "total phase change": np.pi / 2, "total frequency change": 1e6, "program": ["ShiftPhase(-1.0*P0)"], "t0 (cycle time)": 5, "t0 (sec)": 0.5, } self.assertDictEqual(obj.meta, ref_meta)
def gen_frame_symbol(self): """Test gen_frame_symbol.""" fcs = [ pulse.ShiftPhase(np.pi / 2, pulse.DriveChannel(0)), pulse.ShiftFrequency(1e6, pulse.DriveChannel(0)) ] inst_data = create_instruction(fcs, np.pi / 2, 1e6, 5, 0.1) obj = frame.gen_frame_symbol(inst_data, formatter=self.formatter, device=self.device)[0] # type check self.assertEqual(type(obj), drawings.TextData) # data check self.assertListEqual(obj.channels, [pulse.DriveChannel(0)]) self.assertEqual(obj.latex, self.formatter['latex_symbol.frame_change']) self.assertEqual(obj.text, self.formatter['unicode_symbol.frame_change']) # metadata check ref_meta = { 'total phase change': np.pi / 2, 'total frequency change': 1e6, 'program': ['ShiftPhase(1.57 rad.)', 'ShiftFrequency(1.00e+06 Hz)'], 't0 (cycle time)': 5, 't0 (sec)': 0.5 } self.assertDictEqual(obj.meta, ref_meta) # style check ref_style = { 'zorder': self.formatter['layer.frame_change'], 'color': self.formatter['color.frame_change'], 'size': self.formatter['text_size.frame_change'], 'va': 'center', 'ha': 'center' } self.assertDictEqual(obj.styles, ref_style)
def gen_frame_symbol(self): """Test gen_frame_symbol.""" fcs = [ pulse.ShiftPhase(np.pi / 2, pulse.DriveChannel(0)), pulse.ShiftFrequency(1e6, pulse.DriveChannel(0)), ] inst_data = create_instruction(fcs, np.pi / 2, 1e6, 5, 0.1) obj = frame.gen_frame_symbol(inst_data, formatter=self.formatter, device=self.device)[0] # type check self.assertEqual(type(obj), drawings.TextData) # data check self.assertListEqual(obj.channels, [pulse.DriveChannel(0)]) self.assertEqual(obj.latex, self.formatter["latex_symbol.frame_change"]) self.assertEqual(obj.text, self.formatter["unicode_symbol.frame_change"]) # metadata check ref_meta = { "total phase change": np.pi / 2, "total frequency change": 1e6, "program": ["ShiftPhase(1.57 rad.)", "ShiftFrequency(1.00e+06 Hz)"], "t0 (cycle time)": 5, "t0 (sec)": 0.5, } self.assertDictEqual(obj.meta, ref_meta) # style check ref_style = { "zorder": self.formatter["layer.frame_change"], "color": self.formatter["color.frame_change"], "size": self.formatter["text_size.frame_change"], "va": "center", "ha": "center", } self.assertDictEqual(obj.styles, ref_style)
def test_gen_raw_frame_operand_values(self): """Test gen_raw_frame_operand_values.""" fcs = [pulse.ShiftPhase(np.pi/2, pulse.DriveChannel(0)), pulse.ShiftFrequency(1e6, pulse.DriveChannel(0))] inst_data = self.create_instruction(fcs, np.pi/2, 1e6, 5, 0.1) obj = generators.gen_raw_frame_operand_values(inst_data)[0] # type check self.assertEqual(type(obj), drawing_objects.TextData) # data check self.assertEqual(obj.channel, pulse.DriveChannel(0)) self.assertEqual(obj.text, r'(1.57, 1.0e+06)') # style check ref_style = {'zorder': self.style['formatter.layer.frame_change'], 'color': self.style['formatter.color.frame_change'], 'size': self.style['formatter.text_size.annotate'], 'va': 'center', 'ha': 'center'} self.assertDictEqual(obj.styles, ref_style)
def test_gen_latex_frequency_mhz_value(self): """Test gen_latex_frequency_mhz_value.""" fcs = [pulse.ShiftPhase(np.pi/2, pulse.DriveChannel(0)), pulse.ShiftFrequency(1e6, pulse.DriveChannel(0))] inst_data = self.create_instruction(fcs, np.pi/2, 1e6, 5, 0.1) obj = generators.gen_latex_frequency_mhz_value(inst_data)[0] # type check self.assertEqual(type(obj), drawing_objects.TextData) # data check self.assertEqual(obj.channel, pulse.DriveChannel(0)) self.assertEqual(obj.latex, r'\Delta f = 1.00 ~{\rm MHz}') self.assertEqual(obj.text, '\u0394' + 'f=1.00 MHz') # style check ref_style = {'zorder': self.style['formatter.layer.frame_change'], 'color': self.style['formatter.color.frame_change'], 'size': self.style['formatter.text_size.annotate'], 'va': 'center', 'ha': 'center'} self.assertDictEqual(obj.styles, ref_style)
def test_gen_latex_vz_label(self): """Test gen_latex_vz_label.""" fcs = [pulse.ShiftPhase(np.pi/2, pulse.DriveChannel(0)), pulse.ShiftFrequency(1e6, pulse.DriveChannel(0))] inst_data = self.create_instruction(fcs, np.pi/2, 1e6, 5, 0.1) obj = generators.gen_latex_vz_label(inst_data)[0] # type check self.assertEqual(type(obj), drawing_objects.TextData) # data check self.assertEqual(obj.channel, pulse.DriveChannel(0)) self.assertEqual(obj.latex, r'{\rm VZ}(-\frac{\pi}{2})') self.assertEqual(obj.text, r'VZ(-1.57 rad.)') # style check ref_style = {'zorder': self.style['formatter.layer.frame_change'], 'color': self.style['formatter.color.frame_change'], 'size': self.style['formatter.text_size.annotate'], 'va': 'center', 'ha': 'center'} self.assertDictEqual(obj.styles, ref_style)
def setUp(self): """Just some useful, reusable Parameters, constants, schedules.""" super().setUp() self.amp1_1 = Parameter("amp1_1") self.amp1_2 = Parameter("amp1_2") self.amp2 = Parameter("amp2") self.amp3 = Parameter("amp3") self.dur1 = Parameter("dur1") self.dur2 = Parameter("dur2") self.dur3 = Parameter("dur3") self.parametric_waveform1 = pulse.Gaussian(duration=self.dur1, amp=self.amp1_1 + self.amp1_2, sigma=self.dur1 / 4) self.parametric_waveform2 = pulse.Gaussian(duration=self.dur2, amp=self.amp2, sigma=self.dur2 / 5) self.parametric_waveform3 = pulse.Gaussian(duration=self.dur3, amp=self.amp3, sigma=self.dur3 / 6) self.ch1 = Parameter("ch1") self.ch2 = Parameter("ch2") self.ch3 = Parameter("ch3") self.d1 = pulse.DriveChannel(self.ch1) self.d2 = pulse.DriveChannel(self.ch2) self.d3 = pulse.DriveChannel(self.ch3) self.phi1 = Parameter("phi1") self.phi2 = Parameter("phi2") self.phi3 = Parameter("phi3") self.meas_dur = Parameter("meas_dur") self.mem1 = Parameter("s1") self.reg1 = Parameter("m1") self.context_dur = Parameter("context_dur") # schedule under test subroutine = pulse.ScheduleBlock(alignment_context=AlignLeft()) subroutine += pulse.ShiftPhase(self.phi1, self.d1) subroutine += pulse.Play(self.parametric_waveform1, self.d1) sched = pulse.Schedule() sched += pulse.ShiftPhase(self.phi3, self.d3) long_schedule = pulse.ScheduleBlock(alignment_context=AlignEquispaced( self.context_dur), name="long_schedule") long_schedule += subroutine long_schedule += pulse.ShiftPhase(self.phi2, self.d2) long_schedule += pulse.Play(self.parametric_waveform2, self.d2) long_schedule += pulse.Call(sched) long_schedule += pulse.Play(self.parametric_waveform3, self.d3) long_schedule += pulse.Acquire( self.meas_dur, pulse.AcquireChannel(self.ch1), mem_slot=pulse.MemorySlot(self.mem1), reg_slot=pulse.RegisterSlot(self.reg1), ) self.test_sched = long_schedule