PEA
class PEA
Bases: MitigationTask
Calculates expectation values of observables using Probabilistic Error Amplification (PEA) mitigation method.
The class enables preparing a QuantumProgram with circuit mitigated using PEA method, that can be executed on hardware using the Executor, and post process the results to calculate mitigated expectation values of given observables. The task parameters should be given as input to the prepare function, and the relevant variables needed for post-processing are saved internally:
pea_task = PEA()
program = pea_task.prepare(circuit=circuit,
observables=observables,
parameters=parameter_values,
noise_factors=noise_factors_array,
extrapolator=extrapolators_list)
job = executor.run(program)
results = job.result()
mitigated_result = pea_task.postprocess(results)To calculate expectation values of a loaded job result, a PEA task can be created from the job results with all the internal variables needed for post-processing. Alternatively, the variables required for post-processing can be given as input directly to the compute_expectation_value static method. Example for running post-processing for a loaded result:
pea_task = PEA()
program = pea_task.prepare(circuit=circuit,
observables=observables,
parameters=parameter_values,
noise_factors=noise_factors_array,
extrapolator=extrapolators_list)
job_id = executor.run(program).job_id
job = service.job(job_id)
results = job.result()
pea_task = load_tasks_from_result(results)[0]
mitigated_result = pea_task.postprocess(results)Instantiate a PEA task.
Attributes
VERSION
Default value: '0.2'
Methods
compute_expectation_value
static compute_expectation_value(item_result, observables, param_shape=None, param_basis_pairs=None, meas_bases=None, broadcast_obs_and_params=False, measure_noise_data=None, meas_qubits=None, circuit_num_qubits=None)
Process expectation values for a single item result.
This function can be used to calculate expectation values for a single unmitigated item result without instantiating a new class instance.
Parameters
- item_result (QuantumProgramItemResult) – The item result.
- observables (ObservablesArray |Sequence[SparsePauliOp]) – The observables to calculate expectation values for.
- param_shape (tuple[int, ...] | None) – The shape of the parameter values.
- param_basis_pairs (list[tuple[tuple[int, ...], str]] | None) – The map between params ndindexes to measure basis.
- meas_bases (Sequence[Pauli] | Sequence[str] | PauliList | None) – A list of the measured Pauli bases. The
ith item is a measurement basis assumed to correspond to theith slice of the data initem_result. - broadcast_obs_and_params (bool) – Whether to broadcast observables and parameter values.
- measure_noise_data (PauliLindbladMap |ndarray | None) – Measurement noise calibration data for TREX mitigation.
- meas_qubits (list[int] | None) – Sorted list of the circuit qubit indices that were measured, if the task was prepared with
trim_measurements=True(available astask.meas_qubits). Must be given together withcircuit_num_qubits. IfNone, all the qubits are assumed to be measured, which gives wrong results for trimmed data. - circuit_num_qubits (int | None) – The total number of qubits in the circuit. Used together with
meas_qubitsto expand the data back to the full width. Must be given together withmeas_qubits.
Returns
A PubResult which contains evs and std as fields in its data, where evs are expectation values, and std are the standard deviation of the expectation values. If broadcast_obs_and_params is set to True, the data will contain also a twirl_stds field which is the standard deviation between different randomizations.
Raises
- ValueError – If
item_resulthas no'_meas'key. - ValueError – If
item_result['_meas']has invalid number of axes. - ValueError – If
param_shapeandobservables.shapecannot be broadcasted against each other. - ValueError – If only one of
meas_qubitsandcircuit_num_qubitsis given.
Return type
compute_expectation_value_pea
static compute_expectation_value_pea(item_result, observables, param_shape, param_basis_pairs, noise_factors, extrapolator, extrapolated_noise_factors=None, meas_bases=None, broadcast_obs_and_params=False, measure_noise_data=None, custom_fit=None, meas_qubits=None, circuit_num_qubits=None)
Process expectation values for a single item result.
This function can be used to calculate expectation values for a single pea mitigated item result without instantiating a new class instance.
Parameters
-
item_result (QuantumProgramItemResult) – The pea mitigated item result.
-
observables (ObservablesArray |Sequence[SparsePauliOp]) – The observables to calculate expectation values for.
-
param_shape (tuple[int, ...] | None) – The shape of the parameter values.
-
param_basis_pairs (list[tuple[tuple[int, ...], str]] | None) – The map between params ndindexes to measure basis.
-
noise_factors (list[float]) – The noise factors that were used to amplify the noise.
-
extrapolated_noise_factors (float |int |list[float] | None) – Noise factors to evaluate the fits at.
-
extrapolator (list[Literal['linear', 'exponential', 'double_exponential', 'polynomial_degree_1', 'polynomial_degree_2', 'polynomial_degree_3', 'polynomial_degree_4', 'polynomial_degree_5', 'polynomial_degree_6', 'polynomial_degree_7', 'fallback', 'custom']]) –
The extrapolator model or models to use. Models will be tried in priority order. Supported models (each fits the named function of the noise factor
x):"linear":a + b*x"polynomial_degree_k"(1 <= k <= 7): a degree-k polynomial"exponential":a*exp(b*x)"double_exponential":a*exp(b*x) + c*exp(d*x)(rates constrained to decay)"fallback": no fit; the measured value at the lowest noise factorcustom: The custom extrapolation function given incustom_fitparameter
-
meas_bases (Sequence[Pauli] | Sequence[str] | PauliList | None) – A list of the measured Pauli bases. The
ith item is a measurement basis assumed to correspond to theith slice of the data initem_result. -
broadcast_obs_and_params (bool) – Whether to broadcast observables and parameter values.
-
measure_noise_data (PauliLindbladMap |ndarray | None) – Measurement noise calibration data for TREX mitigation. Can be either a PauliLindbladMap of a noise model learned upfront, or a result of a calibration circuit.
-
custom_fit (tuple[Callable[[...], ndarray], list[float], tuple[float, ...] | tuple[list[float], ...]] | None) – A custom fitting function that will be used for extrapolation. Should include a tuple in the form of:
(function, p_0, bounds). The function should take the independent variable as the first argument and the parameters to fit as separate remaining arguments. p_0 is an array of the initial guess for the parameters, and bounds are the bounds on the parameters. These parameters will be sent as arguments forscipy.optimize.curve_fitfunction. -
meas_qubits (list[int] | None) – Sorted list of the circuit qubit indices that were measured, if the task was prepared with
trim_measurements=True(available astask.meas_qubits). Must be given together withcircuit_num_qubits. IfNone, all the qubits are assumed to be measured, which gives wrong results for trimmed data. -
circuit_num_qubits (int | None) – The total number of qubits in the circuit. Used together with
meas_qubitsto expand the data back to the full width. Must be given together withmeas_qubits.
Returns
-
evs: expectation values evaluated at the zero noise point. -
std: the standard deviations of the extrapolated expectation values evaluated at the zero noise point. -
evs_noise_factors: expectation values calculated at the noise_factors points. -
stds_noise_factors: standard deviations calculated at the noise_factors points. -
stds_twirl_noise_factors: standard deviations between different randomizations calculated at thenoise_factors points.
-
evs_extrapolated: expectation values evaluated at the extrapolated_noise_factors points.Set to None if
extrapolated_noise_factorsis None. -
stds_extrapolated: standard deviations calculated at the extrapolated_noise_factors points.Set to None if
extrapolated_noise_factorsis None.
The PubResult will also contain a selected_extrapolators field in the metadata, which is the valid extrapolators used to extrapolate the data for each observable term for the zero noise extrapolation point.
Return type
A PubResult which contains the following fields
Raises
- ValueError – If
item_resulthas no'_meas'key. - ValueError – If
item_result['_meas']has invalid number of axes. - ValueError – If
param_shapeandobservables.shapecannot be broadcasted against each other. - ValueError – If
noise_factorsis under-specified for any extrapolator. - ValueError – If only one of
meas_qubitsandcircuit_num_qubitsis given.
create_instance_from_passthrough_data
static create_instance_from_passthrough_data(passthrough, trex=None)
Create a PEA instance from a passthrough dictionary loaded from a quantum program execution result.
Parameters
- passthrough (dict[str, Any]) – Passthrough_data dictionary loaded from a quantum program execution result.
- trex (TREX | None) – A TREX instance containing a calibration circuit results executed in the same quantum program. Should remain
Nonein case TREX mitigation was not used or a TREX calibration was not executed as part of thq same quantum program.
Returns
A PEA instance.
Return type
find_unique_layers
find_unique_layers(circuit, custom_boxing_options=None, box_types='all', observables=None, trex=None)
Return the unique boxed layers of the given circuit using the given boxing options.
If the instance already holds a boxed circuit of the given circuit (for example, after calling prepare), and custom_boxing_options is None or equal to the saved boxing options, the saved boxed circuit is used instead of boxing the circuit again.
Parameters
-
circuit (QuantumCircuit) – The circuit to found its unique layers.
-
custom_boxing_options (dict | None) – The custom boxing options that will be used by
generate_boxing_pass_manager()function. -
box_types (Literal['gates', 'measurement', 'all']) – Can be either
"gates","measurement"or"all", corresponding to filter boxes with only gate layers, only measurement layers or all layers, respectively. -
observables (ObservablesArray |Sequence[SparsePauliOp] | None) –
If given, the layers are found for a circuit whose measurements are trimmed to the active and observed qubits, exactly as when
prepareis called withtrim_measurements=Trueand the same observables. IfNone(default), all the qubits are measured.WarningPass
observablesif and only iftrim_measurements=Trueis passed toprepare, together with the same observables. The measured qubits change the boxing, so layers learned with a different choice are not found byprepare. -
trex (bool | None) – Whether to add the boxing options that
prepareenforces when aTREXis used (measurement boxes annotated for all qubits). IfTrue, these options are always added. IfFalse, they are never added. IfNone(default), they are added if and only if this task has a TREX mitigation.
Returns
Unique boxed layers of the given circuit.
Raises
ValueError – If observables is given and no qubit is active or observed.
Return type
postprocess
postprocess(results, measure_noise_data=None, *, noise_factors=None, extrapolator=None, extrapolated_noise_factors=None, custom_fit=None)
Process expectation values for a single item result.
Parameters
-
results (QuantumProgramItemResult |QuantumProgramResult) – The execution results. Can be either the entire results object or the pea mitigated item result of this task. If TREX calibration task is added to the quantum program, its results will be used to compute the measure noise data if the entire results object is provided.
-
noise_factors (Sequence[float] | None) – The noise factors that were used to amplify the noise.
-
extrapolated_noise_factors (list[float] | None) – Noise factors to evaluate the fits at.
-
extrapolator (Sequence[Literal['linear', 'exponential', 'double_exponential', 'polynomial_degree_1', 'polynomial_degree_2', 'polynomial_degree_3', 'polynomial_degree_4', 'polynomial_degree_5', 'polynomial_degree_6', 'polynomial_degree_7', 'fallback', 'custom']] | None) –
The extrapolator model or models to use. Models will be tried in priority order. Supported models (each fits the named function of the noise factor
x):"linear":a + b*x"polynomial_degree_k"(1 <= k <= 7): a degree-k polynomial"exponential":a*exp(b*x)"double_exponential":a*exp(b*x) + c*exp(d*x)(rates constrained to decay)"fallback": no fit; the measured value at the lowest noise factorcustom: The custom extrapolation function given incustom_fitparameter
-
measure_noise_data (PauliLindbladMap |ndarray | None) – Measurement noise calibration data for TREX mitigation. Can be either a PauliLindbladMap of a noise model learned upfront, or a result of a calibration circuit.
-
custom_fit (tuple[Callable[[...], ndarray], list[float], tuple[float, ...] | tuple[list[float], ...]] | None) – A custom fitting function that will be used for extrapolation. Should include a tuple in the form of:
(function, p_0, bounds). The function should take the independent variable as the first argument and the parameters to fit as separate remaining arguments. p_0 is an array of the initial guess for the parameters, and bounds are the bounds on the parameters. These parameters will be sent as arguments forscipy.optimize.curve_fitfunction.
Returns
-
evs: expectation values evaluated at the zero noise point. -
std: the standard deviations of the extrapolated expectation values evaluated at the zero noise point. -
evs_noise_factors: expectation values calculated at the noise_factors points. -
stds_noise_factors: standard deviations calculated at the noise_factors points. -
stds_twirl_noise_factors: standard deviations between different randomizations calculated at thenoise_factors points.
-
evs_extrapolated: expectation values evaluated at the extrapolated_noise_factors points.Set to None if
extrapolated_noise_factorsis None. -
stds_extrapolated: standard deviations calculated at the extrapolated_noise_factors points.Set to None if
extrapolated_noise_factorsis None.
The PubResult will also contain a selected_extrapolators field in the metadata, which is the valid extrapolators used to extrapolate the data for each observable term for the zero noise extrapolation point.
Return type
A PubResult which contains the following fields
Raises
- ValueError – If the task’s item result has no
'_meas'key. - ValueError – If the item result’s
'_meas'data has an invalid number of axes. - ValueError – If
param_shapeandobservables.shapecannot be broadcasted against each other.
prepare
prepare(circuit, observables, parameters, custom_boxing_options=None, shots_per_randomization=64, num_randomizations=128, broadcast_obs_and_params=False, trex=None, quantum_program=None, trim_measurements=False, *, noise_maps=None, noise_factors=(1, 3, 5), extrapolator=None, extrapolated_noise_factors=None)
Creates a QuantumProgram with PEA mitigated item for executing via Executor.
Creates an item for a QuantumProgram, that can be executed via Executor and is PEA mitigated (amplifies the noise by scaling the injected Pauli noise and extrapolates to the zero noise point). If a quantum_program is provided, the new item will be added to the existing program, otherwise, a new program will be created, containing only the created item. In the created program item the final measurement layer of the given circuit is removed and a new measurement layer with a dedicated classical register named _meas is added. If broadcast_obs_and_params is True, the observables and parameters will be broadcasted using the samplomatic broadcasting rules, to allow attaching some of the parameters to some of the observables. Otherwise, every parameter will be executed for each observable (outer product of the parameters and observables). Note that the post-processing of an outer product is usually faster.
Parameters
-
circuit (QuantumCircuit) – The quantum circuit.
-
observables (ObservablesArray |Sequence[SparsePauliOp]) – The observables to calculate their expectation values.
-
parameters (ndarray | None) – The parameters of a parametric circuit.
-
custom_boxing_options (dict | None) – The custom boxing options that will be used by
generate_boxing_pass_manager()function. -
shots_per_randomization (int) – The number of shots per randomization.
-
num_randomizations (int) – The number of randomizations.
-
broadcast_obs_and_params (bool) – Whether to broadcast observables and parameters.
-
trex (TREX | None) – A TREX mitigation instance that will be used to mitigate readout errors.
-
quantum_program (QuantumProgram | None) – The quantum program to add an item for. If None, a new program will be created.
-
trim_measurements (bool) –
Whether to measure only the qubits that have instructions on them or are in the support of the observables, instead of all the qubits of the circuit. The measured qubits are available in
meas_qubitsafter the call.WarningTrimming changes the boxing of the circuit, so
noise_mapsmust be learned on the layers of a trimmed circuit: passobservablesto the layer finder (find_combined_unique_layers()orfind_unique_layers()) if and only iftrim_measurements=Trueis passed toprepare, and pass the same observables. -
noise_maps (dict[str, PauliLindbladMap] | None) – A mapping between layer ref to a noise model to use for noise amplification. The dict might contain layers not present in the given circuit, but must contain all the mitigated layers. Assumes that the unique layers used for noise learning were extracted using the
find_unique_layersmethod with the same custom boxing options, and withobservablespassed if and only iftrim_measurements=True. -
noise_factors (Sequence[float |int]) – The noise factors to use for amplifying the noise.
-
extrapolator (Sequence[Literal['linear', 'exponential', 'double_exponential', 'polynomial_degree_1', 'polynomial_degree_2', 'polynomial_degree_3', 'polynomial_degree_4', 'polynomial_degree_5', 'polynomial_degree_6', 'polynomial_degree_7', 'fallback', 'custom']] | None) –
The extrapolator model or models planned to be used in post-processing. Used in preparation to validate that enough noise factors are present for a valid fit using these extrapolators. If
None, not validation will be done. Supported models (each fits the named function of the noise factorx):"linear":a + b*x"polynomial_degree_k"(1 <= k <= 7): a degree-k polynomial"exponential":a*exp(b*x)"double_exponential":a*exp(b*x) + c*exp(d*x)(rates constrained to decay)"fallback": no fit; the measured value at the lowest noise factor
-
extrapolated_noise_factors (list[float] | None) – The noise factors to evaluate the fits at planned to be used in post-processing. Used for saving the data for easy post-processing. Can be overwritten in the post-processing.
Returns
A QuantumProgram with PEA mitigated item that can be executed via Executor.
Raises
ValueError – If trim_measurements is True and no qubit is active or observed.
Return type