Skip to content

Commit

Permalink
Fixed multi parameter bug (Qiskit#2743)
Browse files Browse the repository at this point in the history
* Remove repeated parameters

* Updated changelog

* Update CHANGELOG.md

* Adding test

* Adding test of CmdDef arguments issue being fixed

* Formatting

* Formatting

* Formatting

* Formatting

* Formatting
  • Loading branch information
George Barron authored and taalexander committed Jul 8, 2019
1 parent 315dc72 commit cca4323
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 3 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion qiskit/pulse/schedule.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]:
Expand Down
43 changes: 41 additions & 2 deletions test/python/pulse/test_schedule.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand Down Expand Up @@ -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."""
Expand Down

0 comments on commit cca4323

Please sign in to comment.