Added meas_level and meas_return for circuit jobs (#5452)

* added meas_level and meas_return

* fixed linting

* updated logic

* added reno note
This commit is contained in:
Helena Zhang 2020-12-01 18:00:04 -05:00 committed by GitHub
parent 77f28a6621
commit bf5cb1ab8c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 60 additions and 6 deletions

View File

@ -142,7 +142,8 @@ def assemble(experiments: Union[QuantumCircuit, List[QuantumCircuit], Schedule,
# assemble either circuits or schedules
if all(isinstance(exp, QuantumCircuit) for exp in experiments):
run_config = _parse_circuit_args(parameter_binds, backend, parametric_pulses,
run_config = _parse_circuit_args(parameter_binds, backend, meas_level,
meas_return, parametric_pulses,
**run_config_common_dict)
# If circuits are parameterized, bind parameters and remove from run_config
@ -327,7 +328,8 @@ def _parse_pulse_args(backend, qubit_lo_freq, meas_lo_freq, qubit_lo_range,
return run_config
def _parse_circuit_args(parameter_binds, backend, parametric_pulses, **run_config):
def _parse_circuit_args(parameter_binds, backend, meas_level, meas_return,
parametric_pulses, **run_config):
"""Build a circuit RunConfig replacing unset arguments with defaults derived from the `backend`.
See `assemble` for more information on the required arguments.
@ -343,7 +345,16 @@ def _parse_circuit_args(parameter_binds, backend, parametric_pulses, **run_confi
[])
if parametric_pulses:
run_config_dict['parametric_pulses'] = parametric_pulses
run_config = RunConfig(**{k: v for k, v in run_config_dict.items() if v is not None})
if meas_level:
run_config_dict['meas_level'] = meas_level
# only enable `meas_return` if `meas_level` isn't classified
if meas_level != MeasLevel.CLASSIFIED:
run_config_dict['meas_return'] = meas_return
run_config = RunConfig(
**{k: v
for k, v in run_config_dict.items() if v is not None})
return run_config

View File

@ -240,9 +240,20 @@ class QasmQobjExperiment:
class QasmQobjConfig(SimpleNamespace):
"""A configuration for a QASM Qobj."""
def __init__(self, shots=None, max_credits=None, seed_simulator=None,
memory=None, parameter_binds=None, memory_slots=None,
n_qubits=None, pulse_library=None, calibrations=None, rep_delay=None, **kwargs):
def __init__(self,
shots=None,
max_credits=None,
seed_simulator=None,
memory=None,
parameter_binds=None,
meas_level=None,
meas_return=None,
memory_slots=None,
n_qubits=None,
pulse_library=None,
calibrations=None,
rep_delay=None,
**kwargs):
"""Model for RunConfig.
Args:
@ -251,6 +262,8 @@ class QasmQobjConfig(SimpleNamespace):
seed_simulator (int): the seed to use in the simulator
memory (bool): whether to request memory from backend (per-shot readouts)
parameter_binds (list[dict]): List of parameter bindings
meas_level (int): Measurement level 0, 1, or 2
meas_return (str): For measurement level < 2, whether single or avg shots are returned
memory_slots (int): The number of memory slots on the device
n_qubits (int): The number of qubits on the device
pulse_library (list): List of :class:`PulseLibraryItem`.
@ -277,6 +290,12 @@ class QasmQobjConfig(SimpleNamespace):
if parameter_binds is not None:
self.parameter_binds = parameter_binds
if meas_level is not None:
self.meas_level = meas_level
if meas_return is not None:
self.meas_return = meas_return
if memory_slots is not None:
self.memory_slots = memory_slots

View File

@ -0,0 +1,5 @@
---
features:
- |
Added `meas_level=1` (kerneled data) support to qasm circuit jobs.
`meas_return` is also enabled when level 1 is specified.

View File

@ -140,6 +140,25 @@ class TestCircuitAssembler(QiskitTestCase):
np.testing.assert_almost_equal(qobj.experiments[0].instructions[0].params,
[0.7071067811865, 0, 0, 0.707106781186])
def test_assemble_meas_level_meas_return(self):
"""Test assembling a circuit schedule with `meas_level`."""
qobj = assemble(self.circ,
meas_level=1,
meas_return='single')
validate_qobj_against_schema(qobj)
self.assertIsInstance(qobj, QasmQobj)
self.assertEqual(qobj.config.meas_level, 1)
self.assertEqual(qobj.config.meas_return, 'single')
# no meas_level set
qobj = assemble(self.circ)
validate_qobj_against_schema(qobj)
self.assertIsInstance(qobj, QasmQobj)
self.assertEqual(qobj.config.meas_level, 2)
self.assertEqual(hasattr(qobj.config, 'meas_return'), False)
def test_assemble_backend_rep_delays(self):
"""Check that rep_delay is properly set from backend values."""
backend = FakeYorktown()