Source code for qiskit.providers.aer.aerprovider
# This code is part of Qiskit.
#
# (C) Copyright IBM 2018, 2019.
#
# This code is licensed under the Apache License, Version 2.0. You may
# obtain a copy of this license in the LICENSE.txt file in the root directory
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
#
# Any modifications or derivative works of this code must retain this
# copyright notice, and modified files need to carry a notice indicating
# that they have been altered from the originals.
# pylint: disable=invalid-name
"""Provider for Qiskit Aer backends."""
from qiskit.providers import ProviderV1 as Provider
from qiskit.providers.providerutils import filter_backends
from .backends.aer_simulator import AerSimulator
from .backends.qasm_simulator import QasmSimulator
from .backends.statevector_simulator import StatevectorSimulator
from .backends.unitary_simulator import UnitarySimulator
from .backends.pulse_simulator import PulseSimulator
[docs]class AerProvider(Provider):
"""Provider for Qiskit Aer backends."""
_BACKENDS = None
def __init__(self):
if AerProvider._BACKENDS is None:
# Populate the list of Aer simulator backends.
methods = AerSimulator().available_methods()
devices = AerSimulator().available_devices()
backends = []
for method in methods:
name = 'aer_simulator'
if method not in [None, 'automatic']:
name += f'_{method}'
device_name = 'CPU'
backends.append((name, AerSimulator, method, device_name))
# Add GPU device backends
if method in ['statevector', 'density_matrix', 'unitary']:
for device in devices:
if device != 'CPU':
new_name = f'{name}_{device}'.lower()
device_name = device
backends.append((new_name, AerSimulator, method, device_name))
# Add legacy backend names
backends += [
('qasm_simulator', QasmSimulator, None, None),
('statevector_simulator', StatevectorSimulator, None, None),
('unitary_simulator', UnitarySimulator, None, None),
('pulse_simulator', PulseSimulator, None, None)
]
AerProvider._BACKENDS = backends
[docs] def backends(self, name=None, filters=None, **kwargs):
# pylint: disable=arguments-differ
# Instantiate a new backend instance so if config options
# are set they will only last as long as that backend object exists
backends = []
for backend_name, backend_cls, method, device in self._BACKENDS:
opts = {'provider': self}
if method is not None:
opts['method'] = method
if device is not None:
opts['device'] = device
if name is None or backend_name == name:
backends.append(backend_cls(**opts))
return filter_backends(backends, filters=filters)
def __str__(self):
return 'AerProvider'