Source code for divi.backends._systems

# SPDX-FileCopyrightText: 2025-2026 Qoro Quantum Ltd <divi@qoroquantum.de>
#
# SPDX-License-Identifier: Apache-2.0

"""Data models for Quantum Processing Units (QPUs), QPUSystems, and SimulatorClusters."""

from __future__ import annotations

from dataclasses import dataclass, field, replace
from threading import RLock

_AVAILABLE_QPU_SYSTEMS: dict[str, QPUSystem] = {}
_AVAILABLE_SIMULATOR_CLUSTERS: dict[str, SimulatorCluster] = {}
_CACHE_LOCK = RLock()


[docs] @dataclass(frozen=True, repr=True) class QPU: """Represents a single Quantum Processing Unit (QPU). Attributes: nickname: The unique name or identifier for the QPU. q_bits: The number of qubits in the QPU. status: The current operational status of the QPU. system_kind: The type of technology the QPU uses. """ nickname: str q_bits: int status: str system_kind: str
[docs] @dataclass(frozen=True, repr=True) class QPUSystem: """Represents a collection of QPUs that form a quantum computing system. Attributes: name: The name of the QPU system. qpus: A list of QPU objects that are part of this system. access_level: The access level granted to the user for this system (e.g., 'PUBLIC'). supports_expval: Whether the system supports expectation value jobs. """ name: str qpus: list[QPU] = field(default_factory=list) access_level: str = "PUBLIC" supports_expval: bool = False
[docs] @dataclass(frozen=True, repr=True) class SimulatorCluster: """Represents a simulator cluster for cloud-based quantum simulation. Attributes: name: The name of the simulator cluster. access_level: The access level for this cluster (e.g., 'PUBLIC', 'ADMIN'). minimum_tier: The minimum token tier required to access this cluster. supports_expval: Whether the cluster supports expectation value jobs. """ name: str access_level: str = "PUBLIC" minimum_tier: str = "FREE" supports_expval: bool = True
def parse_qpu_systems(json_data: list) -> list[QPUSystem]: """Parses a list of QPU system data from JSON into QPUSystem objects.""" return [ QPUSystem( name=system_data["name"], qpus=[QPU(**qpu) for qpu in system_data.get("qpus", [])], access_level=system_data["access_level"], ) for system_data in json_data ] def update_qpu_systems_cache(systems: list[QPUSystem]): """Updates the cache of available QPU systems.""" with _CACHE_LOCK: _AVAILABLE_QPU_SYSTEMS.clear() for system in systems: if system.name == "qoro_maestro": system = replace(system, supports_expval=True) _AVAILABLE_QPU_SYSTEMS[system.name] = system def get_qpu_system(name: str) -> QPUSystem: """ Get a QPUSystem object by its name from the cache. Args: name: The name of the QPU system to retrieve. Returns: The QPUSystem object with the matching name. Raises: ValueError: If the cache is empty or the system is not found. """ with _CACHE_LOCK: if not _AVAILABLE_QPU_SYSTEMS: raise ValueError( "QPU systems cache is empty. Call `QoroService.fetch_qpu_systems()` to populate it." ) try: return _AVAILABLE_QPU_SYSTEMS[name] except KeyError: raise ValueError( f"QPUSystem with name '{name}' not found in cache." ) from None def get_available_qpu_systems() -> list[QPUSystem]: """Returns a list of all available QPU systems from the cache.""" with _CACHE_LOCK: return list(_AVAILABLE_QPU_SYSTEMS.values()) def parse_simulator_clusters(json_data: list) -> list[SimulatorCluster]: """Parses a list of simulator cluster data from JSON into SimulatorCluster objects.""" return [ SimulatorCluster( name=cluster_data["name"], access_level=cluster_data.get("access_level", "PUBLIC"), minimum_tier=cluster_data.get("minimum_tier", "FREE"), ) for cluster_data in json_data ] def update_simulator_clusters_cache(clusters: list[SimulatorCluster]): """Updates the cache of available simulator clusters.""" with _CACHE_LOCK: _AVAILABLE_SIMULATOR_CLUSTERS.clear() for cluster in clusters: _AVAILABLE_SIMULATOR_CLUSTERS[cluster.name] = cluster def get_simulator_cluster(name: str) -> SimulatorCluster: """Get a SimulatorCluster object by its name from the cache. Args: name: The name of the simulator cluster to retrieve. Returns: The SimulatorCluster object with the matching name. Raises: ValueError: If the cache is empty or the cluster is not found. """ with _CACHE_LOCK: if not _AVAILABLE_SIMULATOR_CLUSTERS: raise ValueError( "Simulator clusters cache is empty. " "Call `QoroService.fetch_simulator_clusters()` to populate it." ) try: return _AVAILABLE_SIMULATOR_CLUSTERS[name] except KeyError: raise ValueError( f"SimulatorCluster with name '{name}' not found in cache." ) from None def get_available_simulator_clusters() -> list[SimulatorCluster]: """Returns a list of all available simulator clusters from the cache.""" with _CACHE_LOCK: return list(_AVAILABLE_SIMULATOR_CLUSTERS.values())