Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add noise model #180

Closed
wants to merge 10 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion qiskit_braket_provider/providers/braket_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,9 @@ def __init__(self, name: str = "default", **fields):
"""
super().__init__(name=name, **fields)
self.backend_name = name
self._local_device = LocalSimulator(backend=self.backend_name)
self._local_device = LocalSimulator(
backend=self.backend_name, noise_model=fields.get("noise_model")
)
self._target = local_simulator_to_target(self._local_device)
self.status = self._local_device.status

Expand Down
30 changes: 28 additions & 2 deletions qiskit_braket_provider/providers/braket_provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import warnings

from braket.aws import AwsDevice
from braket.circuits.noise_model import NoiseModel
from braket.device_schema.dwave import DwaveDeviceCapabilities
from braket.device_schema.quera import QueraDeviceCapabilities
from braket.device_schema.xanadu import XanaduDeviceCapabilities
Expand All @@ -29,11 +30,36 @@ class BraketProvider(ProviderV1):
BraketBackend[dm1]]
"""

def __init__(self):
super().__init__()
self._noise_model = None

def set_noise_model(self, noise_model: NoiseModel) -> None:
"""Set the noise model of the device.

Args:
noise_model (NoiseModel): The Braket noise model to apply to the circuit before
execution. Noise model can only be added to the devices that support noise
simulation.
"""
self._validate_noise_model_support(noise_model)
self._noise_model = noise_model

def _validate_noise_model_support(self, noise_model: NoiseModel) -> None:
if not isinstance(noise_model, NoiseModel):
raise ValueError(
"Invalid noise model specified. Should be instance of Braket noise model"
)

def backends(self, name=None, **kwargs):
noise_model = kwargs.pop("noise_model") if "noise_model" in kwargs else None
if noise_model:
self.set_noise_model(noise_model)

if kwargs.get("local"):
return [
BraketLocalBackend(name="braket_sv"),
BraketLocalBackend(name="braket_dm"),
BraketLocalBackend(name="braket_sv", noise_model=noise_model),
BraketLocalBackend(name="braket_dm", noise_model=noise_model),
]
names = [name] if name else None
devices = AwsDevice.get_devices(names=names, **kwargs)
Expand Down
21 changes: 21 additions & 0 deletions tests/providers/test_braket_provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from braket.aws import AwsDevice, AwsDeviceType, AwsQuantumTaskBatch, AwsSession
from braket.aws.queue_information import QuantumTaskQueueInfo, QueueType
from braket.circuits import Circuit
from braket.circuits.noise_model import NoiseModel
from qiskit import QuantumCircuit
from qiskit import circuit as qiskit_circuit
from qiskit.compiler import transpile
Expand Down Expand Up @@ -97,6 +98,26 @@ def test_real_devices(self):
with self.subTest(f"{backend.name}"):
self.assertIsInstance(backend, BraketAwsBackend)

def test_add_valid_noise_model(self):
"""Tests adding a valid noise model to the provider."""
provider = BraketProvider()

assert provider.backends(
aws_session=self.mock_session,
types=[AwsDeviceType.SIMULATOR],
noise_model=NoiseModel(),
)

def test_add_invalid_noise_model(self):
"""Tests adding an invalid noise model to the provider."""
provider = BraketProvider()
with self.assertRaises(ValueError):
provider.backends(
aws_session=self.mock_session,
types=[AwsDeviceType.SIMULATOR],
noise_model=Mock(),
)

@patch("qiskit_braket_provider.providers.braket_backend.BraketAwsBackend")
@patch("qiskit_braket_provider.providers.braket_backend.AwsDevice.get_devices")
def test_qiskit_circuit_transpilation_run(
Expand Down
Loading