示例#1
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)
示例#2
0
    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)
示例#3
0
    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)
示例#6
0
    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())
示例#7
0
    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')
示例#8
0
    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)
示例#9
0
    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)
示例#10
0
    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)
示例#11
0
    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)
示例#12
0
    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)
示例#13
0
    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)
示例#14
0
    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)
示例#15
0
    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