Source code for mqt.bench.benchmarks._registry

# 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

"""Benchmark registry."""

from __future__ import annotations

from collections.abc import Callable
from dataclasses import dataclass
from typing import TYPE_CHECKING

from qiskit.circuit import QuantumCircuit

if TYPE_CHECKING:
    from collections.abc import Mapping

_BenchmarkFactory = Callable[..., QuantumCircuit]


@dataclass(frozen=True)
class BenchmarkInfo:
    """Benchmark information."""

    factory: _BenchmarkFactory
    description: str = ""


_REGISTRY: dict[str, BenchmarkInfo] = {}


[docs] def register_benchmark(benchmark_name: str, description: str = "") -> Callable[[_BenchmarkFactory], _BenchmarkFactory]: """Decorator to register a benchmark factory under a unique `benchmark_name`. Arguments: benchmark_name: unique identifier for the benchmark (e.g., ``"ae"``). description: One-line description. Returns: The original factory function, unmodified. Raises: ValueError: if the chosen name is already present in the registry. """ def _decorator(func: _BenchmarkFactory) -> _BenchmarkFactory: if benchmark_name in _REGISTRY: # pragma: no cover msg = f"Benchmark name '{benchmark_name}' already registered" raise ValueError(msg) _REGISTRY[benchmark_name] = BenchmarkInfo(func, description) return func return _decorator
def get_benchmark_by_name(benchmark_name: str) -> _BenchmarkFactory: """Return the create_circuit function for a `benchmark_name`. Arguments: benchmark_name: identifier used during registration. Returns: create_circuit() function for the benchmark. Raises: KeyError: if the benchmark name is unknown. """ return _REGISTRY[benchmark_name].factory def benchmark_description(benchmark_name: str) -> str: """Return the description for a benchmark. Arguments: benchmark_name: identifier used during registration. Returns: the benchmark description. """ return _REGISTRY[benchmark_name].description def benchmark_names() -> list[str]: """Return all registered benchmark names.""" return list(_REGISTRY) def benchmark_catalog() -> Mapping[str, str]: """Mapping *name → description* to feed into a CLI help table, GUI, etc.""" return {name: info.description for name, info in _REGISTRY.items()}