mirror of https://github.com/Qiskit/qiskit.git
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:
parent
77f28a6621
commit
bf5cb1ab8c
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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.
|
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue