示例#1
0
    def test_can_create_valid_schedule(self):
        """Test valid schedule creation without error.
        """
        device = self.two_qubit_device

        @functional_pulse
        def gaussian(duration, amp, t0, sig):
            x = np.linspace(0, duration - 1, duration)
            return amp * np.exp(-(x - t0)**2 / sig**2)

        gp0 = gaussian(duration=20, name='pulse0', amp=0.7, t0=9.5, sig=3)
        gp1 = gaussian(duration=20, name='pulse1', amp=0.5, t0=9.5, sig=3)

        fc_pi_2 = FrameChange(phase=1.57)
        acquire = Acquire(10)
        sched = Schedule()
        sched = sched.append(gp0(device.q[0].drive))
        sched = sched.insert(
            0,
            PersistentValue(value=0.2 + 0.4j)(device.q[0].control))
        sched = sched.insert(30, gp1(device.q[1].drive))
        sched = sched.insert(60, FrameChange(phase=-1.57)(device.q[0].drive))
        sched = sched.insert(60, gp0(device.q[0].control))
        sched = sched.insert(80, Snapshot("label", "snap_type"))
        sched = sched.insert(90, fc_pi_2(device.q[0].drive))
        sched = sched.insert(90,
                             acquire(device.q[1], device.mem[1], device.c[1]))
        # print(sched)
        new_sched = Schedule()
        new_sched = new_sched.append(sched)
        new_sched = new_sched.append(sched)
        _ = new_sched.flat_instruction_sequence()
    def sample_schedule(self):
        """Generate a sample schedule that includes the most common elements of
           pulse schedules."""
        gp0 = pulse_lib.gaussian(duration=20, amp=1.0, sigma=1.0)
        gp1 = pulse_lib.gaussian(duration=20, amp=-1.0, sigma=2.0)
        gs0 = pulse_lib.gaussian_square(duration=20,
                                        amp=-1.0,
                                        sigma=2.0,
                                        risefall=3)

        fc_pi_2 = FrameChange(phase=1.57)
        acquire = Acquire(10)
        delay = Delay(100)
        sched = Schedule()
        sched = sched.append(gp0(DriveChannel(0)))
        sched = sched.insert(
            0,
            pulse_lib.ConstantPulse(duration=60,
                                    amp=0.2 + 0.4j)(ControlChannel(0)))
        sched = sched.insert(60, FrameChange(phase=-1.57)(DriveChannel(0)))
        sched = sched.insert(60, SetFrequency(8.0, DriveChannel(0)))
        sched = sched.insert(30, gp1(DriveChannel(1)))
        sched = sched.insert(60, gp0(ControlChannel(0)))
        sched = sched.insert(60, gs0(MeasureChannel(0)))
        sched = sched.insert(90, fc_pi_2(DriveChannel(0)))
        sched = sched.insert(
            90, acquire(AcquireChannel(1), MemorySlot(1), RegisterSlot(1)))
        sched = sched.append(delay(DriveChannel(0)))
        sched = sched + sched
        sched |= Snapshot("snapshot_1", "snap_type") << 60
        sched |= Snapshot("snapshot_2", "snap_type") << 120
        return sched
示例#3
0
    def test_can_create_valid_schedule(self):
        """Test valid schedule creation without error."""
        gp0 = pulse_lib.gaussian(duration=20, amp=0.7, sigma=3)
        gp1 = pulse_lib.gaussian(duration=20, amp=0.7, sigma=3)

        fc_pi_2 = FrameChange(phase=1.57)
        acquire = Acquire(10)

        sched = Schedule()
        sched = sched.append(gp0(self.config.drive(0)))
        sched = sched.insert(
            0,
            PersistentValue(value=0.2 + 0.4j)(self.config.control(0)))
        sched = sched.insert(60,
                             FrameChange(phase=-1.57)(self.config.drive(0)))
        sched = sched.insert(30, gp1(self.config.drive(0)))
        sched = sched.insert(60, gp0(self.config.control(0)))
        sched = sched.insert(80, Snapshot("label", "snap_type"))
        sched = sched.insert(90, fc_pi_2(self.config.drive(0)))
        sched = sched.insert(
            90, acquire(self.config.acquire(0), MemorySlot(0),
                        RegisterSlot(0)))
        self.assertEqual(0, sched.start_time)
        self.assertEqual(100, sched.stop_time)
        self.assertEqual(100, sched.duration)
        new_sched = Schedule()
        new_sched = new_sched.append(sched)
        new_sched = new_sched.append(sched)
        self.assertEqual(0, new_sched.start_time)
        self.assertEqual(200, new_sched.stop_time)
        self.assertEqual(200, new_sched.duration)
    def test_can_create_valid_schedule(self):
        """Test valid schedule creation without error."""
        device = self.two_qubit_device

        gp0 = pulse_lib.gaussian(duration=20, amp=0.7, sigma=3)
        gp1 = pulse_lib.gaussian(duration=20, amp=0.7, sigma=3)

        fc_pi_2 = FrameChange(phase=1.57)
        acquire = Acquire(10)

        sched = Schedule()
        sched = sched.append(gp0(device.q[0].drive))
        sched = sched.insert(
            0,
            PersistentValue(value=0.2 + 0.4j)(device.q[0].controls[0]))
        sched = sched.insert(60, FrameChange(phase=-1.57)(device.q[0].drive))
        sched = sched.insert(30, gp1(device.q[1].drive))
        sched = sched.insert(60, gp0(device.q[0].controls[0]))
        sched = sched.insert(80, Snapshot("label", "snap_type"))
        sched = sched.insert(90, fc_pi_2(device.q[0].drive))
        sched = sched.insert(90,
                             acquire(device.q[1], device.mem[1], device.c[1]))
        self.assertEqual(0, sched.start_time)
        self.assertEqual(100, sched.stop_time)
        self.assertEqual(100, sched.duration)
        new_sched = Schedule()
        new_sched = new_sched.append(sched)
        new_sched = new_sched.append(sched)
        self.assertEqual(0, new_sched.start_time)
        self.assertEqual(200, new_sched.stop_time)
        self.assertEqual(200, new_sched.duration)
示例#5
0
    def test_can_create_valid_schedule_with_syntax_sugar(self):
        """Test valid schedule creation using syntax sugar without error."""
        device = self.two_qubit_device

        # pylint: disable=invalid-name
        @functional_pulse
        def gaussian(duration, amp, t0, sig):
            x = np.linspace(0, duration - 1, duration)
            return amp * np.exp(-(x - t0)**2 / sig**2)

        gp0 = gaussian(duration=20, amp=0.7, t0=9.5, sig=3)
        gp1 = gaussian(duration=20, amp=0.5, t0=9.5, sig=3)

        fc_pi_2 = FrameChange(phase=1.57)
        acquire = Acquire(10)
        sched = Schedule()
        sched += gp0(device.q[0].drive)
        sched |= PersistentValue(value=0.2 + 0.4j)(
            device.q[0].control).shifted(0)
        sched |= FrameChange(phase=-1.57)(device.q[0].drive).shifted(60)
        sched |= gp1(device.q[1].drive).shifted(30)
        sched |= gp0(device.q[0].control).shifted(60)
        sched |= Snapshot("label", "snap_type").shifted(80)
        sched |= fc_pi_2(device.q[0].drive).shifted(90)
        sched |= acquire(device.q[1], device.mem[1], device.c[1]).shifted(90)
        _ = Schedule() + sched + sched
    def sample_schedule(self):
        """Generate a sample schedule that includes the most common elements of
           pulse schedules."""
        gp0 = pulse_lib.gaussian(duration=20, amp=1.0, sigma=1.0)
        gp1 = pulse_lib.gaussian(duration=20, amp=-1.0, sigma=2.0)
        gs0 = pulse_lib.gaussian_square(duration=20,
                                        amp=-1.0,
                                        sigma=2.0,
                                        risefall=3)

        fc_pi_2 = FrameChange(phase=1.57)
        acquire = Acquire(10)
        sched = Schedule()
        sched = sched.append(gp0(self.device.q[0].drive))
        sched = sched.insert(
            0,
            PersistentValue(value=0.2 + 0.4j)(self.device.q[0].controls[0]))
        sched = sched.insert(60,
                             FrameChange(phase=-1.57)(self.device.q[0].drive))
        sched = sched.insert(30, gp1(self.device.q[1].drive))
        sched = sched.insert(60, gp0(self.device.q[0].controls[0]))
        sched = sched.insert(60, gs0(self.device.q[0].measure))
        sched = sched.insert(90, fc_pi_2(self.device.q[0].drive))
        sched = sched.insert(
            90, acquire(self.device.q[1], self.device.mem[1],
                        self.device.c[1]))
        sched = sched + sched
        sched |= Snapshot("snapshot_1", "snap_type") << 60
        sched |= Snapshot("snapshot_2", "snap_type") << 120
        return sched
示例#7
0
    def test_different_name_equal(self):
        """Test that names are ignored when checking equality."""

        self.assertEqual(
            Schedule((0, FrameChange(0, name='fc1')(DriveChannel(1))),
                     name='s1'),
            Schedule((0, FrameChange(0, name='fc2')(DriveChannel(1))),
                     name='s2'))
 def test_schedule_drawer_show_framechange(self):
     filename = self._get_resource_path('current_show_framechange_ref.png')
     gp0 = pulse_lib.gaussian(duration=20, amp=1.0, sigma=1.0)
     sched = Schedule()
     sched = sched.append(gp0(DriveChannel(0)))
     sched = sched.insert(60, FrameChange(phase=-1.57)(DriveChannel(0)))
     sched = sched.insert(30, FrameChange(phase=-1.50)(DriveChannel(1)))
     sched = sched.insert(70, FrameChange(phase=1.50)(DriveChannel(1)))
     pulse_drawer(sched, filename=filename, show_framechange_channels=False)
     self.assertImagesAreEqual(filename, self.schedule_show_framechange_ref)
     os.remove(filename)
示例#9
0
    def test_single_channel_out_of_order(self):
        """Test that schedule with single channel equal when out of order."""
        instructions = [(0, FrameChange(0)(DriveChannel(0))),
                        (15, SamplePulse(np.ones(10))(DriveChannel(0))),
                        (5, SamplePulse(np.ones(10))(DriveChannel(0)))]

        self.assertEqual(Schedule(*instructions), Schedule(*reversed(instructions)))
示例#10
0
    def _1Q_frame_change_schedule(self, phi, fc_phi, total_samples, dur_drive1, dur_drive2):
        """Creates schedule for frame change test. Does a pulse w/ phase phi of duration dur_drive1,
        then frame change of phase fc_phi, then another pulse of phase phi of duration dur_drive2.
        The different durations for the pulses allow manipulation of rotation angles on Bloch sphere

        Args:
            phi (float): drive phase (phi in Hamiltonian)
            fc_phi (float): phase for frame change
            total_samples (int): length of pulses
            dur_drive1 (int): duration of first pulse
            dur_drive2 (int): duration of second pulse

        Returns:
            schedule (pulse schedule): schedule for frame change test
        """
        phase = np.exp(1j * phi)
        drive_pulse_1 = SamplePulse(phase * np.ones(dur_drive1),
                                    name='drive_pulse_1')
        drive_pulse_2 = SamplePulse(phase * np.ones(dur_drive2),
                                    name='drive_pulse_2')

        # frame change
        fc_pulse = FrameChange(phase=fc_phi, name='fc')

        # set up acquire command
        acq_cmd = pulse.Acquire(duration=total_samples)

        # add commands to schedule
        schedule = pulse.Schedule(name='fc_schedule')
        schedule |= drive_pulse_1(DriveChannel(0))
        schedule += fc_pulse(DriveChannel(0))
        schedule += drive_pulse_2(DriveChannel(0))
        schedule |= acq_cmd(AcquireChannel(0), MemorySlot(0)) << schedule.duration

        return schedule
示例#11
0
    def test_name_inherited(self):
        """Test that schedule keeps name if an instruction is added."""
        device = self.two_qubit_device

        acquire = Acquire(10)
        gp0 = pulse_lib.gaussian(duration=100,
                                 amp=0.7,
                                 sigma=3,
                                 name='pulse_name')
        pv0 = PersistentValue(0.1)
        fc0 = FrameChange(0.1)
        snapshot = Snapshot('snapshot_label', 'state')

        sched1 = Schedule(name='test_name')
        sched2 = Schedule(name=None)
        sched3 = sched1 | sched2
        self.assertEqual(sched3.name, 'test_name')

        sched_acq = acquire(device.q[1], device.mem[1],
                            name='acq_name') | sched1
        self.assertEqual(sched_acq.name, 'acq_name')

        sched_pulse = gp0(device.q[0].drive) | sched1
        self.assertEqual(sched_pulse.name, 'pulse_name')

        sched_pv = pv0(device.q[0].drive, name='pv_name') | sched1
        self.assertEqual(sched_pv.name, 'pv_name')

        sched_fc = fc0(device.q[0].drive, name='fc_name') | sched1
        self.assertEqual(sched_fc.name, 'fc_name')

        sched_snapshot = snapshot | sched1
        self.assertEqual(sched_snapshot.name, 'snapshot_label')
示例#12
0
    def test_buffering(self):
        """Test channel buffering."""
        buffer_chan = DriveChannel(0, buffer=5)
        measure_chan = MeasureChannel(0, buffer=10)
        acquire_chan = AcquireChannel(0, buffer=10)
        memory_slot = MemorySlot(0)
        gp0 = pulse_lib.gaussian(duration=10, amp=0.7, sigma=3)
        fc_pi_2 = FrameChange(phase=1.57)

        # no initial buffer
        sched = Schedule()
        sched += gp0(buffer_chan)

        self.assertEqual(sched.duration, 10)

        # this pulse should be buffered
        sched += gp0(buffer_chan)

        self.assertEqual(sched.duration, 25)

        # should not be buffered as framechange
        sched += fc_pi_2(buffer_chan)

        self.assertEqual(sched.duration, 25)

        # use buffer with insert
        sched = sched.insert(sched.duration, gp0(buffer_chan), buffer=True)

        self.assertEqual(sched.duration, 40)

        sched = Schedule()

        sched = gp0(measure_chan) + Acquire(duration=10)(acquire_chan, memory_slot)

        self.assertEqual(sched.duration, 10)
示例#13
0
    def test_filter_channels(self):
        """Test filtering over channels."""
        lp0 = self.linear(duration=3, slope=0.2, intercept=0.1)
        acquire = Acquire(5)
        sched = Schedule(name='fake_experiment')
        sched = sched.insert(0, lp0(self.config.drive(0)))
        sched = sched.insert(10, lp0(self.config.drive(1)))
        sched = sched.insert(30,
                             FrameChange(phase=-1.57)(self.config.drive(0)))
        sched = sched.insert(
            60,
            acquire([AcquireChannel(0), AcquireChannel(1)],
                    [MemorySlot(0), MemorySlot(1)]))
        sched = sched.insert(90, lp0(self.config.drive(0)))

        # split instructions for those on AcquireChannel(1) and those not
        filtered, excluded = self._filter_and_test_consistency(
            sched, channels=[AcquireChannel(1)])
        self.assertEqual(len(filtered.instructions), 1)
        self.assertEqual(len(excluded.instructions), 4)

        # Split schedule into the part with channels on 1 and into a part without
        channels = [AcquireChannel(1), DriveChannel(1)]
        filtered, excluded = self._filter_and_test_consistency(
            sched, channels=channels)
        for _, inst in filtered.instructions:
            self.assertTrue(any([chan in channels for chan in inst.channels]))

        for _, inst in excluded.instructions:
            self.assertFalse(any([chan in channels for chan in inst.channels]))
示例#14
0
    def test_default(self):
        """Test default frame change.
        """
        fc_comm = FrameChange(phase=1.57-0.785j)

        self.assertEqual(fc_comm.phase, 1.57-0.785j)
        self.assertEqual(fc_comm.duration, 0)
示例#15
0
    def test_filter_multiple(self):
        """Test filter composition."""
        device = self.two_qubit_device
        lp0 = self.linear(duration=3, slope=0.2, intercept=0.1)
        acquire = Acquire(5)
        sched = Schedule(name='fake_experiment')
        sched = sched.insert(0, lp0(device.drives[0]))
        sched = sched.insert(10, lp0(device.drives[1]))
        sched = sched.insert(30, FrameChange(phase=-1.57)(device.drives[0]))
        sched = sched.insert(60, acquire(device.acquires, device.memoryslots))
        sched = sched.insert(90, lp0(device.drives[0]))

        filtered = sched.filter(channels={0},
                                instruction_types=[PulseInstruction],
                                time_ranges=[(25, 100)])
        for time, inst in filtered.instructions:
            self.assertIsInstance(inst, PulseInstruction)
            self.assertTrue(any([chan.index == 0 for chan in inst.channels]))
            self.assertTrue(25 <= time <= 100)

        filtered_b = sched.filter(
            instruction_types=[PulseInstruction, FrameChangeInstruction],
            time_ranges=[(25, 100), (0, 30)])
        for time, inst in filtered_b.instructions:
            self.assertIsInstance(inst,
                                  (FrameChangeInstruction, PulseInstruction))
        self.assertTrue(len(filtered_b.instructions), 4)
示例#16
0
    def test_multiple_channels_out_of_order(self):
        """Test that schedule with multiple channels equal when out of order."""
        instructions = [(0, FrameChange(0)(DriveChannel(1))),
                        (1, Acquire(10)(AcquireChannel(0), MemorySlot(1)))]

        self.assertEqual(Schedule(*instructions),
                         Schedule(*reversed(instructions)))
示例#17
0
    def test_custom_filters(self):
        """Test custom filters."""
        lp0 = self.linear(duration=3, slope=0.2, intercept=0.1)
        sched = Schedule(name='fake_experiment')
        sched = sched.insert(0, lp0(self.config.drive(0)))
        sched = sched.insert(10, lp0(self.config.drive(1)))
        sched = sched.insert(30,
                             FrameChange(phase=-1.57)(self.config.drive(0)))

        filtered, excluded = self._filter_and_test_consistency(
            sched, lambda x: True)
        for i in filtered.instructions:
            self.assertTrue(i in sched.instructions)
        for i in excluded.instructions:
            self.assertFalse(i in sched.instructions)

        filtered, excluded = self._filter_and_test_consistency(
            sched, lambda x: False)
        self.assertEqual(len(filtered.instructions), 0)
        self.assertEqual(len(excluded.instructions), 3)

        filtered, excluded = self._filter_and_test_consistency(
            sched, lambda x: x[0] < 30)
        self.assertEqual(len(filtered.instructions), 2)
        self.assertEqual(len(excluded.instructions), 1)

        # multiple custom filters
        filtered, excluded = self._filter_and_test_consistency(
            sched, lambda x: x[0] > 0, lambda x: x[0] < 30)
        self.assertEqual(len(filtered.instructions), 1)
        self.assertEqual(len(excluded.instructions), 2)
示例#18
0
    def test_filter_intervals(self):
        """Test filtering on intervals."""
        device = self.two_qubit_device
        lp0 = self.linear(duration=3, slope=0.2, intercept=0.1)
        acquire = Acquire(5)
        sched = Schedule(name='fake_experiment')
        sched = sched.insert(0, lp0(device.drives[0]))
        sched = sched.insert(10, lp0(device.drives[1]))
        sched = sched.insert(30, FrameChange(phase=-1.57)(device.drives[0]))
        sched = sched.insert(60, acquire(device.acquires, device.memoryslots))
        sched = sched.insert(90, lp0(device.drives[0]))

        intervals_a = sched.filter(time_ranges=((0, 13), ))
        for time, inst in intervals_a.instructions:
            self.assertTrue(0 <= time <= 13)
            self.assertTrue(inst.timeslots.timeslots[0].interval.stop <= 13)
        self.assertEqual(len(intervals_a.instructions), 2)

        intervals_b = sched.filter(time_ranges=[(59, 65)])
        self.assertEqual(len(intervals_b.instructions), 1)
        self.assertEqual(intervals_b.instructions[0][0], 60)
        self.assertIsInstance(intervals_b.instructions[0][1],
                              AcquireInstruction)

        non_full_intervals = sched.filter(time_ranges=[(0, 2), (8, 11), (61,
                                                                         70)])
        self.assertEqual(len(non_full_intervals.instructions), 0)

        multi_interval = sched.filter(time_ranges=[(10, 15), (63, 93)])
        self.assertEqual(len(multi_interval.instructions), 2)

        multi_interval = sched.filter(
            intervals=[Interval(10, 15), Interval(63, 93)])
        self.assertEqual(len(multi_interval.instructions), 2)
示例#19
0
    def test_filter_intervals(self):
        """Test filtering on intervals."""
        lp0 = self.linear(duration=3, slope=0.2, intercept=0.1)
        acquire = Acquire(5)
        sched = Schedule(name='fake_experiment')
        sched = sched.insert(0, lp0(self.config.drive(0)))
        sched = sched.insert(10, lp0(self.config.drive(1)))
        sched = sched.insert(30,
                             FrameChange(phase=-1.57)(self.config.drive(0)))
        sched = sched.insert(
            60,
            acquire([self.config.acquire(i) for i in range(2)],
                    [MemorySlot(i) for i in range(2)]))
        sched = sched.insert(90, lp0(self.config.drive(0)))

        # split schedule into instructions occuring in (0,13), and those outside
        filtered, excluded = self._filter_and_test_consistency(
            sched, time_ranges=((0, 13), ))
        for start_time, inst in filtered.instructions:
            self.assertTrue((start_time >= 0)
                            and (start_time + inst.stop_time <= 13))
        for start_time, inst in excluded.instructions:
            self.assertFalse((start_time >= 0)
                             and (start_time + inst.stop_time <= 13))
        self.assertEqual(len(filtered.instructions), 2)
        self.assertEqual(len(excluded.instructions), 3)

        # split into schedule occuring in and outside of interval (59,65)
        filtered, excluded = self._filter_and_test_consistency(sched,
                                                               time_ranges=[
                                                                   (59, 65)
                                                               ])
        self.assertEqual(len(filtered.instructions), 1)
        self.assertEqual(filtered.instructions[0][0], 60)
        self.assertIsInstance(filtered.instructions[0][1], AcquireInstruction)
        self.assertEqual(len(excluded.instructions), 4)
        self.assertEqual(excluded.instructions[3][0], 90)
        self.assertIsInstance(excluded.instructions[3][1], PulseInstruction)

        # split instructions based on the interval
        # (none should be, though they have some overlap with some of the instructions)
        filtered, excluded = \
            self._filter_and_test_consistency(sched, time_ranges=[(0, 2), (8, 11), (61, 70)])
        self.assertEqual(len(filtered.instructions), 0)
        self.assertEqual(len(excluded.instructions), 5)

        # split instructions from multiple non-overlapping intervals, specified
        # as time ranges
        filtered, excluded = \
            self._filter_and_test_consistency(sched, time_ranges=[(10, 15), (63, 93)])
        self.assertEqual(len(filtered.instructions), 2)
        self.assertEqual(len(excluded.instructions), 3)

        # split instructions from non-overlapping intervals, specified as Intervals
        filtered, excluded = \
            self._filter_and_test_consistency(sched, intervals=[Interval(10, 15), Interval(63, 93)])
        self.assertEqual(len(filtered.instructions), 2)
        self.assertEqual(len(excluded.instructions), 3)
示例#20
0
    def test_frame_change(self):
        """Test converted qobj from FrameChangeInstruction."""
        converter = PulseQobjConverter(PulseQobjInstruction, meas_level=2)
        command = FrameChange(phase=0.1)
        instruction = command(self.device.q[0].drive)

        valid_qobj = PulseQobjInstruction(name='fc', ch='d0', t0=0, phase=0.1)

        self.assertEqual(converter(0, instruction), valid_qobj)
示例#21
0
    def test_can_create_valid_schedule_with_syntax_sugar(self):
        """Test that in place operations on schedule are still immutable
           and return equivalent schedules."""
        gp0 = pulse_lib.gaussian(duration=20, amp=0.7, sigma=3)
        gp1 = pulse_lib.gaussian(duration=20, amp=0.5, sigma=3)
        fc_pi_2 = FrameChange(phase=1.57)
        acquire = Acquire(10)

        sched = Schedule()
        sched += gp0(self.config.drive(0))
        sched |= PersistentValue(value=0.2 + 0.4j)(self.config.control(0))
        sched |= FrameChange(phase=-1.57)(self.config.drive(0)) << 60
        sched |= gp1(self.config.drive(0)) << 30
        sched |= gp0(self.config.control(0)) << 60
        sched |= Snapshot("label", "snap_type") << 60
        sched |= fc_pi_2(self.config.drive(0)) << 90
        sched |= acquire(self.config.acquire(0), MemorySlot(0),
                         RegisterSlot(0)) << 90
        sched += sched
示例#22
0
    def test_frame_change(self):
        """Test converted qobj from FrameChangeInstruction."""
        cmd = FrameChange(phase=0.1)
        instruction = cmd(MeasureChannel(0))

        qobj = PulseQobjInstruction(name='fc', ch='m0', t0=0, phase=0.1)
        converted_instruction = self.converter(qobj)

        self.assertEqual(converted_instruction.timeslots, instruction.timeslots)
        self.assertEqual(converted_instruction.instructions[0][-1].command, cmd)
示例#23
0
    def test_can_create_valid_schedule_with_syntax_sugar(self):
        """Test that in place operations on schedule are still immutable
           and return equivalent schedules."""
        device = self.two_qubit_device

        gp0 = pulse_lib.gaussian(duration=20, amp=0.7, sigma=3)
        gp1 = pulse_lib.gaussian(duration=20, amp=0.5, sigma=3)
        fc_pi_2 = FrameChange(phase=1.57)
        acquire = Acquire(10)

        sched = Schedule()
        sched += gp0(device.q[0].drive)
        sched |= PersistentValue(value=0.2 + 0.4j)(device.q[0].controls[0])
        sched |= FrameChange(phase=-1.57)(device.q[0].drive) << 60
        sched |= gp1(device.q[1].drive) << 30
        sched |= gp0(device.q[0].controls[0]) << 60
        sched |= Snapshot("label", "snap_type") << 60
        sched |= fc_pi_2(device.q[0].drive) << 90
        sched |= acquire(device.q[1], device.mem[1], device.c[1]) << 90
        sched += sched
示例#24
0
 def test_filter(self):
     """Test _filter method."""
     device = self.two_qubit_device
     lp0 = self.linear(duration=3, slope=0.2, intercept=0.1)
     sched = Schedule(name='fake_experiment')
     sched = sched.insert(0, lp0(device.drives[0]))
     sched = sched.insert(10, lp0(device.drives[1]))
     sched = sched.insert(30, FrameChange(phase=-1.57)(device.drives[0]))
     for i in sched._filter([lambda x: True]).instructions:
         self.assertTrue(i in sched.instructions)
     self.assertEqual(len(sched._filter([lambda x: False]).instructions), 0)
     self.assertEqual(len(sched._filter([lambda x: x[0] < 30]).instructions), 2)
示例#25
0
    def test_filter_multiple(self):
        """Test filter composition."""
        lp0 = self.linear(duration=3, slope=0.2, intercept=0.1)
        acquire = Acquire(5)
        sched = Schedule(name='fake_experiment')
        sched = sched.insert(0, lp0(self.config.drive(0)))
        sched = sched.insert(10, lp0(self.config.drive(1)))
        sched = sched.insert(30,
                             FrameChange(phase=-1.57)(self.config.drive(0)))
        for i in range(2):
            sched = sched.insert(
                60, acquire(self.config.acquire(i), MemorySlot(i)))

        sched = sched.insert(90, lp0(self.config.drive(0)))

        # split instructions with filters on channel 0, of type PulseInstruction,
        # occurring in the time interval (25, 100)
        filtered, excluded = self._filter_and_test_consistency(
            sched,
            channels={self.config.drive(0)},
            instruction_types=[PulseInstruction],
            time_ranges=[(25, 100)])
        for time, inst in filtered.instructions:
            self.assertIsInstance(inst, PulseInstruction)
            self.assertTrue(all([chan.index == 0 for chan in inst.channels]))
            self.assertTrue(25 <= time <= 100)
        self.assertEqual(len(excluded.instructions), 5)
        self.assertTrue(
            excluded.instructions[0][1].channels[0] == DriveChannel(0))
        self.assertTrue(excluded.instructions[2][0] == 30)

        # split based on PulseInstructions in the specified intervals
        filtered, excluded = self._filter_and_test_consistency(
            sched,
            instruction_types=[PulseInstruction],
            time_ranges=[(25, 100), (0, 11)])
        self.assertTrue(len(excluded.instructions), 3)
        for time, inst in filtered.instructions:
            self.assertIsInstance(inst,
                                  (FrameChangeInstruction, PulseInstruction))
        self.assertTrue(len(filtered.instructions), 4)
        # make sure the PulseInstruction not in the intervals is maintained
        self.assertIsInstance(excluded.instructions[0][1], PulseInstruction)

        # split based on AcquireInstruction in the specified intervals
        filtered, excluded = self._filter_and_test_consistency(
            sched,
            instruction_types=[AcquireInstruction],
            time_ranges=[(25, 100)])
        self.assertTrue(len(excluded.instructions), 4)
        for _, inst in filtered.instructions:
            self.assertIsInstance(inst, AcquireInstruction)
        self.assertTrue(len(filtered.instructions), 2)
示例#26
0
    def test_frame_change(self):
        """Test converted qobj from FrameChangeInstruction."""
        converter = InstructionToQobjConverter(PulseQobjInstruction,
                                               meas_level=2)
        command = FrameChange(phase=0.1)
        instruction = command(DriveChannel(0))

        valid_qobj = PulseQobjInstruction(name='fc', ch='d0', t0=0, phase=0.1)

        self.assertEqual(converter(0, instruction), valid_qobj)
        instruction = ShiftPhase(0.1, DriveChannel(0))
        self.assertEqual(converter(0, instruction), valid_qobj)
    def test_filter(self):
        """Test _filter method."""
        device = self.two_qubit_device
        lp0 = self.linear(duration=3, slope=0.2, intercept=0.1)
        sched = Schedule(name='fake_experiment')
        sched = sched.insert(0, lp0(device.drives[0]))
        sched = sched.insert(10, lp0(device.drives[1]))
        sched = sched.insert(30, FrameChange(phase=-1.57)(device.drives[0]))
        for i in sched._filter([lambda x: True]).instructions:
            self.assertTrue(i in sched.instructions)
        self.assertEqual(len(sched._filter([lambda x: False]).instructions), 0)
        self.assertEqual(
            len(sched._filter([lambda x: x[0] < 30]).instructions), 2)

        def my_test_par_sched_one(x, y, z):
            result = PulseInstruction(
                SamplePulse(np.array([x, y, z]), name='sample'),
                device.drives[0])
            return 0, result

        def my_test_par_sched_two(x, y, z):
            result = PulseInstruction(
                SamplePulse(np.array([x, y, z]), name='sample'),
                device.drives[0])
            return 5, result

        par_sched_in_0 = ParameterizedSchedule(my_test_par_sched_one,
                                               parameters={
                                                   'x': 0,
                                                   'y': 1,
                                                   'z': 2
                                               })
        par_sched_in_1 = ParameterizedSchedule(my_test_par_sched_two,
                                               parameters={
                                                   'x': 0,
                                                   'y': 1,
                                                   'z': 2
                                               })
        par_sched = ParameterizedSchedule(par_sched_in_0, par_sched_in_1)

        cmd_def = CmdDef()
        cmd_def.add('test', 0, par_sched)

        actual = cmd_def.get('test', 0, 0.01, 0.02, 0.03)
        expected = par_sched_in_0.bind_parameters(0.01, 0.02, 0.03) |\
            par_sched_in_1.bind_parameters(0.01, 0.02, 0.03)
        self.assertEqual(actual.start_time, expected.start_time)
        self.assertEqual(actual.stop_time, expected.stop_time)

        self.assertEqual(cmd_def.get_parameters('test', 0), ('x', 'y', 'z'))
示例#28
0
    def test_parameterized_frame_change(self):
        """Test converted qobj from FrameChangeInstruction."""
        cmd = FrameChange(phase=4.)
        instruction = cmd(MeasureChannel(0)) << 10

        qobj = PulseQobjInstruction(name='fc', ch='m0', t0=10, phase='P1**2')
        converted_instruction = self.converter(qobj)

        self.assertIsInstance(converted_instruction, ParameterizedSchedule)

        evaluated_instruction = converted_instruction.bind_parameters(2.)

        self.assertEqual(evaluated_instruction.timeslots, instruction.timeslots)
        self.assertEqual(evaluated_instruction.instructions[0][-1].command, cmd)
示例#29
0
    def test_filter_channels(self):
        """Test filtering over channels."""
        device = self.two_qubit_device
        lp0 = self.linear(duration=3, slope=0.2, intercept=0.1)
        acquire = Acquire(5)
        sched = Schedule(name='fake_experiment')
        sched = sched.insert(0, lp0(device.q[0].drive))
        sched = sched.insert(10, lp0(device.q[1].drive))
        sched = sched.insert(30, FrameChange(phase=-1.57)(device.q[0].drive))
        sched = sched.insert(60, acquire(device.q, device.mem))
        sched = sched.insert(90, lp0(device.q[0].drive))

        self.assertEqual(len(sched.filter(channels=[AcquireChannel(1)]).instructions), 1)
        channels = [AcquireChannel(1), DriveChannel(1)]
        has_chan_1 = sched.filter(channels=channels)
        for _, inst in has_chan_1.instructions:
            self.assertTrue(any([chan in channels for chan in inst.channels]))
示例#30
0
    def test_empty_filters(self):
        """Test behavior on empty filters."""
        lp0 = self.linear(duration=3, slope=0.2, intercept=0.1)
        acquire = Acquire(5)
        sched = Schedule(name='fake_experiment')
        sched = sched.insert(0, lp0(self.config.drive(0)))
        sched = sched.insert(10, lp0(self.config.drive(1)))
        sched = sched.insert(30,
                             FrameChange(phase=-1.57)(self.config.drive(0)))
        sched = sched.insert(
            60,
            acquire([self.config.acquire(i) for i in range(2)],
                    [MemorySlot(i) for i in range(2)]))
        sched = sched.insert(90, lp0(self.config.drive(0)))

        # empty channels
        filtered, excluded = self._filter_and_test_consistency(sched,
                                                               channels=[])
        self.assertTrue(len(filtered.instructions) == 0)
        self.assertTrue(len(excluded.instructions) == 5)

        # empty instruction_types
        filtered, excluded = self._filter_and_test_consistency(
            sched, instruction_types=[])
        self.assertTrue(len(filtered.instructions) == 0)
        self.assertTrue(len(excluded.instructions) == 5)

        # empty time_ranges
        filtered, excluded = self._filter_and_test_consistency(sched,
                                                               time_ranges=[])
        self.assertTrue(len(filtered.instructions) == 0)
        self.assertTrue(len(excluded.instructions) == 5)

        # empty intervals
        filtered, excluded = self._filter_and_test_consistency(sched,
                                                               intervals=[])
        self.assertTrue(len(filtered.instructions) == 0)
        self.assertTrue(len(excluded.instructions) == 5)

        # empty channels with other non-empty filters
        filtered, excluded = self._filter_and_test_consistency(
            sched, channels=[], instruction_types=[PulseInstruction])
        self.assertTrue(len(filtered.instructions) == 0)
        self.assertTrue(len(excluded.instructions) == 5)