From cca4323aa474bc06ae396c275cc7bba46f460510 Mon Sep 17 00:00:00 2001 From: George Barron Date: Mon, 8 Jul 2019 10:10:28 -0400 Subject: [PATCH] Fixed multi parameter bug (#2743) * Remove repeated parameters * Updated changelog * Update CHANGELOG.md * Adding test * Adding test of CmdDef arguments issue being fixed * Formatting * Formatting * Formatting * Formatting * Formatting --- CHANGELOG.md | 2 ++ qiskit/pulse/schedule.py | 2 +- test/python/pulse/test_schedule.py | 43 ++++++++++++++++++++++++++++-- 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 402089f724f6..af074d48dea6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -96,6 +96,8 @@ The format is based on [Keep a Changelog]. ### Fixed +- Fixed bug in `Pulse` for multiple parameters being added (\#2742) +- Fixed bug in `Pulse` for CmdDef arguments (\#2741) - Fixed bug in `Operator` and `SuperOp` for initializing from circuit containing gates without an explicit matrix definition (\#2723) - Possible to decompose SU(4) gate into non-CNOT basis with diff --git a/qiskit/pulse/schedule.py b/qiskit/pulse/schedule.py index 54294db635a5..96e67f15e8ee 100644 --- a/qiskit/pulse/schedule.py +++ b/qiskit/pulse/schedule.py @@ -376,7 +376,7 @@ def __init__(self, *schedules, parameters: Optional[Dict[str, Union[float, compl self._parameterized = tuple(parameterized) self._schedules = tuple(full_schedules) - self._parameters = tuple(sorted(parameters)) + self._parameters = tuple(sorted(set(parameters))) @property def parameters(self) -> Tuple[str]: diff --git a/test/python/pulse/test_schedule.py b/test/python/pulse/test_schedule.py index 2a18b36973ec..0d459e9b33b8 100644 --- a/test/python/pulse/test_schedule.py +++ b/test/python/pulse/test_schedule.py @@ -23,10 +23,10 @@ from qiskit.pulse.commands import (FrameChange, Acquire, PersistentValue, Snapshot, functional_pulse, Instruction, AcquireInstruction, PulseInstruction, FrameChangeInstruction) -from qiskit.pulse import pulse_lib +from qiskit.pulse import pulse_lib, SamplePulse, CmdDef from qiskit.pulse.timeslots import TimeslotCollection, Interval from qiskit.pulse.exceptions import PulseError -from qiskit.pulse.schedule import Schedule +from qiskit.pulse.schedule import Schedule, ParameterizedSchedule from qiskit.test import QiskitTestCase @@ -455,6 +455,45 @@ def test_buffering(self): self.assertEqual(sched.duration, 10) + def test_multiple_parameters_not_returned(self): + """Constructing ParameterizedSchedule object from multiple ParameterizedSchedules sharing + arguments should not produce repeated parameters in resulting ParameterizedSchedule + object.""" + device = self.two_qubit_device + + 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')) + class TestScheduleWithDeviceSpecification(QiskitTestCase): """Schedule tests."""