Esempio n. 1
0
    def test_call_schedule(self):
        """Test calling schedule instruction."""
        schedule = pulse.Schedule()
        d0 = pulse.DriveChannel(0)
        d1 = pulse.DriveChannel(1)

        reference = pulse.Schedule()
        reference = reference.insert(10, instructions.Delay(10, d0))
        reference += instructions.Delay(20, d1)

        with pulse.build() as schedule:
            with pulse.align_right():
                builder.call_schedule(reference)

        self.assertEqual(schedule, reference)

        with pulse.build() as schedule:
            with pulse.align_right():
                pulse.call(reference)

        self.assertEqual(schedule, reference)
Esempio n. 2
0
    def test_play_parametric_pulse(self):
        """Test play instruction with parametric pulse."""
        d0 = pulse.DriveChannel(0)
        test_pulse = library.Constant(10, 1.0)

        with pulse.build() as schedule:
            pulse.play(test_pulse, d0)

        reference = pulse.Schedule()
        reference += instructions.Play(test_pulse, d0)

        self.assertScheduleEqual(schedule, reference)
Esempio n. 3
0
 def test_error_post_acquire_pulse(self):
     """Test that an error is raised if a pulse occurs on a channel after an acquire."""
     acquire = pulse.Acquire(5)
     sched = pulse.Schedule(name='fake_experiment')
     sched = sched.insert(0, self.short_pulse(self.device.drives[0]))
     sched = sched.insert(4, acquire(self.device.acquires[0], self.device.memoryslots[0]))
     # No error with separate channel
     sched = sched.insert(10, self.short_pulse(self.device.drives[1]))
     align_measures([sched], self.cmd_def)
     sched = sched.insert(10, self.short_pulse(self.device.drives[0]))
     with self.assertRaises(PulseError):
         align_measures([sched], self.cmd_def)
Esempio n. 4
0
    def test_acquire_register_slot(self):
        """Test acquire instruction into register slot."""
        acquire0 = pulse.AcquireChannel(0)
        reg0 = pulse.RegisterSlot(0)

        with pulse.build() as schedule:
            pulse.acquire(10, acquire0, reg0)

        reference = pulse.Schedule()
        reference += pulse.Acquire(10, acquire0, reg_slot=reg0)

        self.assertEqual(schedule, reference)
Esempio n. 5
0
 def setUp(self):
     super().setUp()
     self.backend = FakeOpenPulse2Q()
     self.config = self.backend.configuration()
     self.short_pulse = pulse.Waveform(
         samples=np.array([0.02739068], dtype=np.complex128), name="p0"
     )
     sched = pulse.Schedule(name="fake_experiment")
     sched = sched.insert(0, Play(self.short_pulse, self.config.drive(0)))
     sched = sched.insert(5, Acquire(5, self.config.acquire(0), MemorySlot(0)))
     sched = sched.insert(5, Acquire(5, self.config.acquire(1), MemorySlot(1)))
     self.sched = sched
Esempio n. 6
0
    def test_acquire_memory_slot(self):
        """Test acquire instruction into memory slot."""
        acquire0 = pulse.AcquireChannel(0)
        mem0 = pulse.MemorySlot(0)

        with pulse.build() as schedule:
            pulse.acquire(10, acquire0, mem0)

        reference = pulse.Schedule()
        reference += pulse.Acquire(10, acquire0, mem_slot=mem0)

        self.assertScheduleEqual(schedule, reference)
    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)))

        ch_events = events.ChannelEvents.load_program(sched, pulse.DriveChannel(0))
        frames = list(ch_events.get_frame_changes())
        inst_data0 = frames[0]
        self.assertAlmostEqual(inst_data0.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)))

        ch_events = events.ChannelEvents.load_program(sched, pulse.DriveChannel(0))
        frames = list(ch_events.get_frame_changes())
        inst_data0 = frames[0]
        self.assertAlmostEqual(inst_data0.frame.phase, 1.57)
    def test_assign_parameter_to_subroutine(self):
        """Test that assign parameter objects to subroutines."""
        param1 = Parameter("amp")
        waveform = pulse.library.Constant(duration=100, amp=param1)

        program_layer0 = pulse.Schedule()
        program_layer0 += pulse.Play(waveform, pulse.DriveChannel(0))
        reference = program_layer0.assign_parameters({param1: 0.1},
                                                     inplace=False)

        # to call instruction
        program_layer1 = pulse.Schedule()
        program_layer1 += pulse.instructions.Call(program_layer0)
        target = program_layer1.assign_parameters({param1: 0.1}, inplace=False)
        self.assertEqual(inline_subroutines(target), reference)

        # to nested call instruction
        program_layer2 = pulse.Schedule()
        program_layer2 += pulse.instructions.Call(program_layer1)
        target = program_layer2.assign_parameters({param1: 0.1}, inplace=False)
        self.assertEqual(inline_subroutines(target), reference)
Esempio n. 9
0
 def test_error_post_acquire_pulse(self):
     """Test that an error is raised if a pulse occurs on a channel after an acquire."""
     sched = pulse.Schedule(name='fake_experiment')
     sched = sched.insert(0, Play(self.short_pulse, self.config.drive(0)))
     sched = sched.insert(4,
                          Acquire(5, self.config.acquire(0), MemorySlot(0)))
     # No error with separate channel
     sched = sched.insert(10, Play(self.short_pulse, self.config.drive(1)))
     transforms.align_measures([sched], self.inst_map)
     sched = sched.insert(10, Play(self.short_pulse, self.config.drive(0)))
     with self.assertRaises(PulseError):
         transforms.align_measures([sched], self.inst_map)
 def test_merging_upon_assignment(self):
     """Test that schedule can match instructions on a channel."""
     schedule = pulse.Schedule()
     schedule |= pulse.Play(pulse.SamplePulse([1, 1, 1, 1]),
                            DriveChannel(1))
     schedule = schedule.insert(
         4,
         pulse.Play(pulse.SamplePulse([1, 1, 1, 1]),
                    DriveChannel(self.qubit)))
     schedule.assign_parameters({self.qubit: 1})
     self.assertEqual(schedule.ch_duration(DriveChannel(1)), 8)
     self.assertEqual(schedule.channels, (DriveChannel(1), ))
Esempio n. 11
0
    def test_get_parameter(self):
        """Test that get parameter by name."""
        param1 = Parameter('amp')
        param2 = Parameter('amp')

        schedule = pulse.Schedule()
        waveform1 = pulse.library.Constant(duration=1280, amp=param1)
        waveform2 = pulse.library.Constant(duration=1280, amp=param2)
        schedule += pulse.Play(waveform1, DriveChannel(0))
        schedule += pulse.Play(waveform2, DriveChannel(1))

        self.assertEqual(len(schedule.get_parameters('amp')), 2)
Esempio n. 12
0
    def test_play_sample_pulse(self):
        """Test play instruction with sample pulse."""
        d0 = pulse.DriveChannel(0)
        test_pulse = library.Waveform([0.0, 0.0])

        with pulse.build() as schedule:
            pulse.play(test_pulse, d0)

        reference = pulse.Schedule()
        reference += instructions.Play(test_pulse, d0)

        self.assertScheduleEqual(schedule, reference)
Esempio n. 13
0
 def setUp(self):
     self.backend = FakeOpenPulse2Q()
     self.device = pulse.DeviceSpecification.create_from(self.backend)
     self.config = self.backend.configuration()
     self.defaults = self.backend.defaults()
     self.cmd_def = CmdDef.from_defaults(self.defaults.cmd_def,
                                         self.defaults.pulse_library)
     self.short_pulse = pulse.SamplePulse(samples=np.array([0.02739068], dtype=np.complex128),
                                          name='p0')
     acquire = pulse.Acquire(5)
     sched = pulse.Schedule(name='fake_experiment')
     sched = sched.insert(0, self.short_pulse(self.device.q[0].drive))
     self.sched = sched.insert(5, acquire(self.device.q, self.device.mem))
Esempio n. 14
0
 def setUp(self):
     self.backend = FakeOpenPulse2Q()
     self.config = self.backend.configuration()
     self.defaults = self.backend.defaults()
     self.cmd_def = CmdDef.from_defaults(self.defaults.cmd_def,
                                         self.defaults.pulse_library)
     self.short_pulse = pulse.SamplePulse(samples=np.array([0.02739068], dtype=np.complex128),
                                          name='p0')
     acquire = pulse.Acquire(5)
     sched = pulse.Schedule(name='fake_experiment')
     sched = sched.insert(0, self.short_pulse(self.config.drive(0)))
     self.sched = sched.insert(5, acquire([self.config.acquire(0), self.config.acquire(1)],
                                          [MemorySlot(0), MemorySlot(1)]))
Esempio n. 15
0
 def setUp(self):
     self.backend = FakeOpenPulse2Q()
     self.config = self.backend.configuration()
     self.cmd_def = self.backend.defaults().instruction_schedule_map
     self.short_pulse = pulse.SamplePulse(samples=np.array(
         [0.02739068], dtype=np.complex128),
                                          name='p0')
     acquire = pulse.Acquire(5)
     sched = pulse.Schedule(name='fake_experiment')
     sched = sched.insert(0, self.short_pulse(self.config.drive(0)))
     sched = sched.insert(5, acquire(self.config.acquire(0), MemorySlot(0)))
     sched = sched.insert(5, acquire(self.config.acquire(1), MemorySlot(1)))
     self.sched = sched
Esempio n. 16
0
    def test_sequential_alignment(self):
        """Test sequential alignment context."""
        block = pulse.ScheduleBlock(alignment_context=self.sequential_context)
        block = block.append(pulse.Play(self.test_waveform0, self.d0))
        block = block.append(pulse.Play(self.test_waveform1, self.d1))

        ref_sched = pulse.Schedule()
        ref_sched = ref_sched.insert(0, pulse.Play(self.test_waveform0,
                                                   self.d0))
        ref_sched = ref_sched.insert(100,
                                     pulse.Play(self.test_waveform1, self.d1))

        self.assertScheduleEqual(block, ref_sched)
Esempio n. 17
0
    def test_play_with_parametricpulse(self):
        """Test Parametric Pulses with parameters determined by ParameterExpressions
        in the Play instruction."""
        waveform = pulse.library.Gaussian(duration=128, sigma=self.sigma, amp=self.amp)

        schedule = pulse.Schedule()
        schedule += pulse.Play(waveform, DriveChannel(10))
        schedule.assign_parameters({self.amp: 0.2, self.sigma: 4})

        self.backend.configuration().parametric_pulses = ['gaussian', 'drag']
        insts = schedule.instructions
        self.assertEqual(insts[0][1].pulse.amp, 0.2)
        self.assertEqual(insts[0][1].pulse.sigma, 4.)
Esempio n. 18
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)
Esempio n. 19
0
    def test_play_array_pulse(self):
        """Test play instruction on an array directly."""
        d0 = pulse.DriveChannel(0)
        test_array = np.array([0., 0.], dtype=np.complex_)

        with pulse.build() as schedule:
            pulse.play(test_array, d0)

        reference = pulse.Schedule()
        test_pulse = pulse.Waveform(test_array)
        reference += instructions.Play(test_pulse, d0)

        self.assertEqual(schedule, reference)
Esempio n. 20
0
 def test_align_post_u3(self):
     """Test that acquires are scheduled no sooner than the duration of the longest X gate."""
     sched = pulse.Schedule(name="fake_experiment")
     sched = sched.insert(0, Play(self.short_pulse, self.config.drive(0)))
     sched = sched.insert(1, Acquire(5, self.config.acquire(0), MemorySlot(0)))
     sched = transforms.align_measures([sched], self.inst_map)[0]
     for time, inst in sched.instructions:
         if isinstance(inst, Acquire):
             self.assertEqual(time, 4)
     sched = transforms.align_measures([sched], self.inst_map, max_calibration_duration=10)[0]
     for time, inst in sched.instructions:
         if isinstance(inst, Acquire):
             self.assertEqual(time, 10)
Esempio n. 21
0
    def test_subroutine_not_transformed(self):
        """Test called schedule is not transformed."""
        d0 = pulse.DriveChannel(0)
        d1 = pulse.DriveChannel(1)

        subprogram = pulse.Schedule()
        subprogram.insert(0, pulse.Delay(30, d0), inplace=True)
        subprogram.insert(10, pulse.Delay(10, d1), inplace=True)

        with pulse.build() as schedule:
            with pulse.align_right():
                pulse.delay(10, d1)
                pulse.call(subprogram)

        reference = pulse.Schedule()
        reference.insert(0, pulse.Delay(10, d1), inplace=True)
        reference.insert(10, pulse.Delay(30, d0), inplace=True)
        reference.insert(20, pulse.Delay(10, d1), inplace=True)

        target = inline_subroutines(schedule)

        self.assertEqual(target, reference)
Esempio n. 22
0
    def pure_cnot(self, pure_amp_times, pure_angle, pure_duration):
        pure_cnot = pulse.Schedule()
        new_cx = self.new_cnot(rx_angle=pure_angle)
        for instruction in new_cx.instructions:
            mini_pulse = instruction[1].pulse
            if type(mini_pulse) == pulse_lib.GaussianSquare:
                mini_pulse._width = mini_pulse._width * round(
                    pure_duration / self.dt / 16) * 16 / mini_pulse.duration
                mini_pulse.duration = round(pure_duration / self.dt / 16) * 16
                mini_pulse._amp = mini_pulse._amp * pure_amp_times
            pure_cnot += instruction[1] << pure_cnot.duration

        return pure_cnot
Esempio n. 23
0
 def setUp(self):
     self.backend = FakeOpenPulse2Q()
     self.device = pulse.PulseChannelSpec.from_backend(self.backend)
     self.config = self.backend.configuration()
     self.defaults = self.backend.defaults()
     self.cmd_def = CmdDef.from_defaults(self.defaults.cmd_def,
                                         self.defaults.pulse_library)
     self.short_pulse = pulse.SamplePulse(samples=np.array([0.02739068], dtype=np.complex128),
                                          name='p0')
     acquire = pulse.Acquire(5)
     sched = pulse.Schedule(name='fake_experiment')
     sched = sched.insert(0, self.short_pulse(self.device.drives[0]))
     self.sched = sched.insert(5, acquire(self.device.acquires, self.device.memoryslots))
Esempio n. 24
0
    def test_set_parameter_to_complex_schedule(self):
        """Test get parameters from complicated schedule."""
        test_block = deepcopy(self.test_sched)

        value_dict = {
            self.amp1_1: 0.1,
            self.amp1_2: 0.2,
            self.amp2: 0.3,
            self.amp3: 0.4,
            self.dur1: 100,
            self.dur2: 125,
            self.dur3: 150,
            self.ch1: 0,
            self.ch2: 2,
            self.ch3: 4,
            self.phi1: 1.0,
            self.phi2: 2.0,
            self.phi3: 3.0,
            self.meas_dur: 300,
            self.mem1: 3,
            self.reg1: 0,
            self.context_dur: 1000,
        }

        visitor = ParameterSetter(param_map=value_dict)
        assigned = visitor.visit(test_block)

        # create ref schedule
        subroutine = pulse.ScheduleBlock(alignment_context=AlignLeft())
        subroutine += pulse.ShiftPhase(1.0, pulse.DriveChannel(0))
        subroutine += pulse.Play(pulse.Gaussian(100, 0.3, 25),
                                 pulse.DriveChannel(0))

        sched = pulse.Schedule()
        sched += pulse.ShiftPhase(3.0, pulse.DriveChannel(4))

        ref_obj = pulse.ScheduleBlock(alignment_context=AlignEquispaced(1000),
                                      name="long_schedule")

        ref_obj += subroutine
        ref_obj += pulse.ShiftPhase(2.0, pulse.DriveChannel(2))
        ref_obj += pulse.Play(pulse.Gaussian(125, 0.3, 25),
                              pulse.DriveChannel(2))
        ref_obj += pulse.Call(sched)
        ref_obj += pulse.Play(pulse.Gaussian(150, 0.4, 25),
                              pulse.DriveChannel(4))

        ref_obj += pulse.Acquire(300, pulse.AcquireChannel(0),
                                 pulse.MemorySlot(3), pulse.RegisterSlot(0))

        self.assertEqual(assigned, ref_obj)
    def get(
            self,
            # TODO figure out type hints for gate below
            instruction: Union[str, Gate],
            qubits: Union[int, Iterable[int]],
            *params: Union[int, float, complex],
            **kwparams: Union[int, float, complex]) -> Schedule:
        """Return the defined :py:class:`~qiskit.pulse.Schedule` for the given instruction on
        the given qubits.

        Args:
            instruction: Name of the instruction.
            qubits: The qubits for the instruction.
            *params: Command parameters for generating the output schedule.
            **kwparams: Keyworded command parameters for generating the schedule.

        Returns:
            The Schedule defined for the input.
        """
        # TODO: fix below

        # schedule.draw()
        if isinstance(instruction, Gate):

            if self._map[instruction.name]:
                # self.assert_has(instruction.name, qubits)
                # TODO: copied to_tuple because protected but feels redundent?
                schedule_generator = self._map[instruction.name].get(
                    _to_tuple(qubits))
            else:

                print('gate hit')
                pulse_seq = (
                    self.qoc_optimizer.get_pulse_schedule(instruction))
                out_schedule = pulse.Schedule()
                drive_chan = pulse.DriveChannel(1)
                # Figure out universal version for more drive channels

                out_schedule += Play(pulse.SamplePulse(pulse_seq),
                                     drive_chan) << out_schedule.duration
                schedule_generator = out_schedule
        else:
            self.assert_has(instruction, qubits)
            # TODO: copied to_tuple because protected but feels redundent?
            schedule_generator = self._map[instruction].get(_to_tuple(qubits))
        # don't forget in here to use _gate.to_matrix

        if callable(schedule_generator):
            return schedule_generator(*params, **kwparams)
        # otherwise this is just a Schedule
        return schedule_generator
Esempio n. 26
0
    def test_frequency_offset(self):
        """Test the frequency offset context."""
        d0 = pulse.DriveChannel(0)

        with pulse.build() as schedule:
            with pulse.frequency_offset(1e9, d0):
                pulse.delay(10, d0)

        reference = pulse.Schedule()
        reference += instructions.ShiftFrequency(1e9, d0)  # pylint: disable=no-member
        reference += instructions.Delay(10, d0)
        reference += instructions.ShiftFrequency(-1e9, d0)  # pylint: disable=no-member

        self.assertEqual(schedule, reference)
Esempio n. 27
0
    def test_phase_offset(self):
        """Test the phase offset context."""
        d0 = pulse.DriveChannel(0)

        with pulse.build() as schedule:
            with pulse.phase_offset(3.14, d0):
                pulse.delay(10, d0)

        reference = pulse.Schedule()
        reference += instructions.ShiftPhase(3.14, d0)
        reference += instructions.Delay(10, d0)
        reference += instructions.ShiftPhase(-3.14, d0)

        self.assertEqual(schedule, reference)
Esempio n. 28
0
    def test_call_in_nested_schedule(self):
        """Test that subroutines in nested schedule."""
        d0 = pulse.DriveChannel(0)

        subroutine = pulse.Schedule()
        subroutine.insert(10, pulse.Delay(10, d0), inplace=True)

        nested_sched = pulse.Schedule()
        nested_sched.insert(0, pulse.instructions.Call(subroutine), inplace=True)

        main_sched = pulse.Schedule()
        main_sched.insert(0, nested_sched, inplace=True)

        target = transforms.inline_subroutines(main_sched)

        # no call instruction
        reference_nested = pulse.Schedule()
        reference_nested.insert(0, subroutine, inplace=True)

        reference = pulse.Schedule()
        reference.insert(0, reference_nested, inplace=True)

        self.assertEqual(target, reference)
Esempio n. 29
0
    def test_circuits(self):
        """Test that transpiling works and that we can have a y gate with a calibration."""

        qubit = 1

        inst_map = InstructionScheduleMap()
        for inst in ["sx", "y"]:
            inst_map.add(inst, (qubit,), pulse.Schedule(name=inst))

        hac = HalfAngle(qubit)
        hac.set_transpile_options(inst_map=inst_map)

        # mimic what will happen in the experiment.
        transpile_opts = copy.copy(hac.transpile_options.__dict__)
        transpile_opts["initial_layout"] = list(hac._physical_qubits)
        circuits = transpile(hac.circuits(), FakeAthens(), **transpile_opts)

        for idx, circ in enumerate(circuits):
            self.assertEqual(circ.count_ops()["sx"], idx * 2 + 2)
            self.assertEqual(circ.calibrations["sx"][((qubit,), ())], pulse.Schedule(name="sx"))
            if idx > 0:
                self.assertEqual(circ.count_ops()["y"], idx)
                self.assertEqual(circ.calibrations["y"][((qubit,), ())], pulse.Schedule(name="y"))
Esempio n. 30
0
    def test_assemble_parametric(self):
        """Test that parametric pulses can be assembled properly into a PulseQobj."""
        sched = pulse.Schedule(name='test_parametric')
        sched += Play(pulse.Gaussian(duration=25, sigma=4, amp=0.5j),
                      DriveChannel(0))
        sched += Play(
            pulse.Drag(duration=25, amp=0.2 + 0.3j, sigma=7.8, beta=4),
            DriveChannel(1))
        sched += Play(pulse.ConstantPulse(duration=25, amp=1), DriveChannel(2))
        sched += Play(
            pulse.GaussianSquare(duration=150, amp=0.2, sigma=8, width=140),
            MeasureChannel(0)) << sched.duration
        backend = FakeOpenPulse3Q()
        backend.configuration().parametric_pulses = [
            'gaussian', 'drag', 'gaussian_square', 'constant'
        ]
        qobj = assemble(sched, backend)

        self.assertEqual(qobj.config.pulse_library, [])
        qobj_insts = qobj.experiments[0].instructions
        self.assertTrue(
            all(inst.name == 'parametric_pulse' for inst in qobj_insts))
        self.assertEqual(qobj_insts[0].pulse_shape, 'gaussian')
        self.assertEqual(qobj_insts[1].pulse_shape, 'drag')
        self.assertEqual(qobj_insts[2].pulse_shape, 'constant')
        self.assertEqual(qobj_insts[3].pulse_shape, 'gaussian_square')
        self.assertDictEqual(qobj_insts[0].parameters, {
            'duration': 25,
            'sigma': 4,
            'amp': 0.5j
        })
        self.assertDictEqual(qobj_insts[1].parameters, {
            'duration': 25,
            'sigma': 7.8,
            'amp': 0.2 + 0.3j,
            'beta': 4
        })
        self.assertDictEqual(qobj_insts[2].parameters, {
            'duration': 25,
            'amp': 1
        })
        self.assertDictEqual(qobj_insts[3].parameters, {
            'duration': 150,
            'sigma': 8,
            'amp': 0.2,
            'width': 140
        })
        self.assertEqual(
            qobj.to_dict()['experiments'][0]['instructions'][0]['parameters']
            ['amp'], 0.5j)