Note
This is the documentation for the current state of the development branch of Qiskit Experiments. The documentation or APIs here can change prior to being released.
LayerFidelity¶
- class LayerFidelity(physical_qubits, two_qubit_layers, lengths, backend=None, num_samples=6, seed=None, two_qubit_gate=None, one_qubit_basis_gates=None)[source]¶
A holistic benchmarking experiment to characterize the full quality of the devices at scale.
Overview
Layer Fidelity (LF) is a method to estimate the fidelity of a connecting set of two-qubit gates over \(N\) qubits by measuring gate errors using simultaneous direct randomized benchmarking (RB) in disjoint layers. LF can easily be expressed as a layer size independent quantity, error per layered gate (EPLG): \(EPLG = 1 - LF^{1/N_{2Q}}\) where \(N_{2Q}\) is number of 2-qubit gates in the layers.
Each of the 2-qubit (or 1-qubit) direct RBs yields the decaying probabilities to get back to the ground state for an increasing sequence length (i.e. number of layers), fits the exponential curve to estimate the decay rate, and calculates the process fidelity of the subsystem from the rate. LF is calculated as the product of the 2-qubit (or 1-qubit) process fidelities. See Ref. [1] for details.
References
[1] David C. McKay, Ian Hincks, Emily J. Pritchett, Malcolm Carroll, Luke C. G. Govia, Seth T. Merkel, Benchmarking Quantum Processor Performance at Scale (open)
Analysis class reference
Experiment options
These options can be set by the
set_experiment_options()
method.- Options
Defined in the class
LayerFidelity
:two_qubit_layers (List[List[Tuple[int, int]]])
Default value:None
List of two-qubit gate layers to run on. Each two-qubit gate layer must be given as a list of directed qubit pairs.lengths (List[int])
Default value:None
A list of layer lengths.num_samples (int)
Default value:None
Number of samples to generate for each layer length.seed (None or int or SeedSequence or BitGenerator or Generator)
Default value:None
A seed used to initializenumpy.random.default_rng
when generating circuits. Thedefault_rng
will be initialized with this seed value every timecircuits()
is called.two_qubit_gate (str)
Default value:None
Two-qubit gate name (e.g. “cx”, “cz”, “ecr”) of which the two qubit layers consist.one_qubit_basis_gates (Tuple[str])
Default value:None
One-qubit gates to use for implementing 1q Cliffords.clifford_synthesis_method (str)
Default value:"rb_default"
The name of the Clifford synthesis plugin to use for building circuits of RB sequences.
Defined in the class
BaseExperiment
:max_circuits (Optional[int])
Default value:None
The maximum number of circuits per job when running an experiment on a backend.
Example
import numpy as np from qiskit_experiments.library import StandardRB from qiskit_experiments.library.randomized_benchmarking import LayerFidelity lengths = np.arange(1, 800, 200) two_qubit_layers=[[(0, 1), (3, 5)], [(1, 3), (5, 6)]] num_samples = 6 seed = 106 exp = LayerFidelity( physical_qubits=[0, 1, 3, 5, 6], two_qubit_layers=two_qubit_layers, lengths=lengths, backend=backend, num_samples=num_samples, seed=seed, two_qubit_gate=None, one_qubit_basis_gates=None, ) exp_data = exp.run().block_for_results() results = exp_data.analysis_results() display(exp_data.figure(0)) # one of 6 figures display(exp_data.analysis_results("EPLG", dataframe=True)) names={result.name for result in results} print(f"Available results: {names}")
name experiment components value quality backend run_time qubits reason a alpha b chisq 8d0f0d8a EPLG LayerFidelity [Q0, Q1, Q3, Q5, Q6] 0.0117+/-0.0005 bad aer_simulator_from(fake_perth) None None None None None None None Available results: {'@Parameters__ProcessFidelityAnalysis', 'SingleLF', 'ProcessFidelity', 'LF', 'alpha', 'EPLG'}
Initialization
Initialize a layer fidelity experiment.
- Parameters:
physical_qubits (Sequence[int]) – List of physical qubits for the experiment.
two_qubit_layers (Sequence[Sequence[Tuple[int, int]]]) – List of two-qubit gate layers to run on. Each two-qubit gate layer must be given as a list of directed qubit pairs.
lengths (Iterable[int]) – A list of layer lengths (the number of depth points).
backend (Backend | None) – The backend to run the experiment on. Note that either
backend
ortwo_qubit_gate
andone_qubit_basis_gates
must be set at instantiation.num_samples (int) – Number of samples (i.e. circuits) to generate for each layer length.
seed (int | SeedSequence | BitGenerator | Generator | None) – Optional, seed used to initialize
numpy.random.default_rng
. when generating circuits. Thedefault_rng
will be initialized with this seed value every time :meth:~.LayerFidelity.circuits` is called.two_qubit_gate (str | None) – Optional, 2q-gate name (e.g. “cx”, “cz”, “ecr”) of which the two qubit layers consist. If not specified (but
backend
is supplied), one of 2q-gates supported in the backend is automatically set.one_qubit_basis_gates (Sequence[str] | None) – Optional, 1q-gates to use for implementing 1q-Clifford operations. If not specified (but
backend
is supplied), all 1q-gates supported in the backend are automatically set.
- Raises:
QiskitError – If any invalid argument is supplied.
Attributes
- analysis: BaseAnalysis¶
Return the analysis instance for the experiment
- backend¶
Return the backend for the experiment
- experiment_options¶
Return the options for the experiment.
- experiment_type¶
Return experiment type.
- num_qubits¶
Return the number of qubits for the experiment.
- physical_qubits¶
Return the device qubits for the experiment.
Methods
- circuits()[source]¶
Return a list of physical circuits to measure layer fidelity.
- Returns:
A list of
QuantumCircuit
s.- Return type:
List[QuantumCircuit]
- circuits_generator()[source]¶
Return a generator of physical circuits to measure layer fidelity.
- Returns:
A generator of
QuantumCircuit
s.- Return type:
Iterable[QuantumCircuit]
- config()¶
Return the config dataclass for this experiment
- Return type:
- copy()¶
Return a copy of the experiment
- Return type:
- enable_restless(rep_delay=None, override_processor_by_restless=True, suppress_t1_error=False)¶
Enables a restless experiment by setting the restless run options and the restless data processor.
Deprecated since version 0.8: The method
qiskit_experiments.framework.restless_mixin.RestlessMixin.enable_restless()
is deprecated as of qiskit-experiments 0.8. It will be removed no earlier than 3 months after the release date. Support for restless experiments has been deprecated.- Parameters:
rep_delay (float | None) – The repetition delay. This is the delay between a measurement and the subsequent quantum circuit. Since the backends have dynamic repetition rates, the repetition delay can be set to a small value which is required for restless experiments. Typical values are 1 us or less.
override_processor_by_restless (bool) – If False, a data processor that is specified in the analysis options of the experiment is not overridden by the restless data processor. The default is True.
suppress_t1_error (bool) – If True, the default is False, then no error will be raised when
rep_delay
is larger than the T1 times of the qubits. Instead, a warning will be logged as restless measurements may have a large amount of noise.
- Raises:
DataProcessorError – If the attribute rep_delay_range is not defined for the backend.
DataProcessorError – If a data processor has already been set but override_processor_by_restless is True.
DataProcessorError – If the experiment analysis does not have the data_processor option.
DataProcessorError – If the rep_delay is equal to or greater than the T1 time of one of the physical qubits in the experiment and the flag
ignore_t1_check
is False.
- classmethod from_config(config)[source]¶
Initialize an experiment from experiment config
- Return type:
- job_info(backend=None)¶
Get information about job distribution for the experiment on a specific backend.
- Parameters:
backend (Backend) – Optional, the backend for which to get job distribution information. If not specified, the experiment must already have a set backend.
- Returns:
A dictionary containing information about job distribution.
”Total number of circuits in the experiment”: Total number of circuits in the experiment.
”Maximum number of circuits per job”: Maximum number of circuits in one job based on backend and experiment settings.
”Total number of jobs”: Number of jobs needed to run this experiment on the currently set backend.
- Return type:
dict
- Raises:
QiskitError – if backend is not specified.
- run(backend=None, sampler=None, analysis='default', timeout=None, backend_run=None, **run_options)¶
Run an experiment and perform analysis.
- Parameters:
backend (Backend | None) – Optional, the backend to run on. Will override existing backend settings.
sampler (BaseSamplerV2 | None) – Optional, the sampler to run the experiment on. If None then a sampler will be invoked from previously set backend
analysis (BaseAnalysis | None) – Optional, a custom analysis instance to use for performing analysis. If None analysis will not be run. If
"default"
the experimentsanalysis()
instance will be used if it contains one.timeout (float | None) – Time to wait for experiment jobs to finish running before cancelling.
backend_run (bool | None) – Use backend run (temp option for testing)
run_options – backend runtime options used for circuit execution.
- Returns:
The experiment data object.
- Raises:
QiskitError – If experiment is run with an incompatible existing ExperimentData container.
- Return type:
- set_experiment_options(**fields)[source]¶
Set the experiment options.
- Parameters:
fields – The fields to update the options
- Raises:
AttributeError – If the field passed in is not a supported options
- set_run_options(**fields)¶
Set options values for the experiment
run()
method.- Parameters:
fields – The fields to update the options
See also
The Setting options for your experiment guide for code example.