Source code for mqt.qudits.simulation.backends.backendv2
# Copyright (c) 2023 - 2026 Chair for Design Automation, TUM
# Copyright (c) 2025 - 2026 Munich Quantum Software Company GmbH
# All rights reserved.
#
# SPDX-License-Identifier: MIT
#
# Licensed under the MIT License
from __future__ import annotations
from abc import ABC, abstractmethod
from typing import TYPE_CHECKING, Any, TypedDict, cast
from typing_extensions import Unpack
if TYPE_CHECKING:
import numpy as np
from numpy.typing import NDArray
from ...core import LevelGraph
from ...quantum_circuit import QuantumCircuit
from .. import MQTQuditProvider
from ..jobs import Job
from ..noise_tools import NoiseModel
[docs]
class Backend(ABC):
[docs]
class DefaultOptions(TypedDict, total=False):
shots: int
memory: bool
noise_model: NoiseModel | None
file_path: str | None
file_name: str | None
full_state_memory: bool
def __init__(
self,
provider: MQTQuditProvider,
name: str | None = None,
description: str | None = None,
**fields: Unpack[DefaultOptions],
) -> None:
self._provider: MQTQuditProvider = provider
self.name = name
self.description: str | None = description
self._energy_level_graphs: list[LevelGraph] = []
self.noise_model: NoiseModel | None = None
self.shots: int = 50
self.memory: bool = False
self.full_state_memory: bool = False
self.file_path: str | None = None
self.file_name: str | None = None
self._options = self._default_options()
if fields:
self._options.update(fields)
@property
def energy_level_graphs(self) -> list[LevelGraph]:
raise NotImplementedError
@staticmethod
def _default_options() -> DefaultOptions:
return {"shots": 50, "memory": False, "noise_model": None}
[docs]
def set_options(self, **fields: Unpack[Backend.DefaultOptions]) -> None:
for field in fields:
if not hasattr(self._options, field):
msg = f"Options field '{field}' is not valid for this backend"
raise AttributeError(msg)
self._options.update(fields)
@property
def options(self) -> dict[str, Any]:
return cast("dict[str, Any]", self._options)
@property
def provider(self) -> MQTQuditProvider:
return self._provider
[docs]
@abstractmethod
def run(self, circuit: QuantumCircuit, **options: Unpack[DefaultOptions]) -> Job:
pass
[docs]
@abstractmethod
def execute(self, circuit: QuantumCircuit, noise_model: NoiseModel | None = None) -> NDArray[np.complex128] | None:
raise NotImplementedError