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
This commit is contained in:
George Barron 2019-07-08 10:10:28 -04:00 committed by Thomas Alexander
parent fae93bc413
commit ae1921a41a
3 changed files with 44 additions and 3 deletions

View File

@ -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

View File

@ -376,7 +376,7 @@ class ParameterizedSchedule:
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]:

View File

@ -23,10 +23,10 @@ from qiskit.pulse.channels import (DeviceSpecification, PulseChannelSpec, Qubit,
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 @@ class TestSchedule(QiskitTestCase):
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."""