Source code for buffalo_panel.kernels.registry

"""Public registry for kernel lookup by backend and family descriptors."""

from __future__ import annotations

from dataclasses import dataclass, field
from typing import Any

from buffalo_panel.kernels.interfaces import ElementKernel

RegistryKey = tuple[str, str, str]
BackendRegistryKey = tuple[str, str, str, str]


[docs] @dataclass(slots=True) class KernelRegistry: """ Store potential flow influence kernels. A registry key identifies the mathematical kernel by support geometry, singularity type, and basis family. The backend label identifies the implementation used for that mathematical kernel, such as a Python reference implementation or a later accelerated implementation. """ kernels: dict[BackendRegistryKey, ElementKernel[Any]] = field( default_factory=dict ) """Element kernels keyed by backend, support, singularity, and basis."""
[docs] def register( self, *, backend: str, key: RegistryKey, kernel: ElementKernel[Any], ) -> None: """ Register an element kernel for one backend and family key. Parameters ---------- backend : str Implementation backend label for the kernel. key : RegistryKey Mathematical family key as ``(support, singularity, basis)``. kernel : ElementKernel Element-kernel object implementing the standard block-building surface. Unsupported block types should raise ``NotImplementedError`` from the kernel method. """ support_name, singularity_name, basis_name = key self.kernels[backend, support_name, singularity_name, basis_name] = ( kernel )
[docs] def get(self, backend: str, key: RegistryKey) -> ElementKernel[Any]: """ Return the registered element kernel for one backend and family key. Parameters ---------- backend : str Implementation backend label to select. key : RegistryKey Mathematical family key as ``(support, singularity, basis)``. Returns ------- ElementKernel Registered element kernel for the backend and key. Raises ------ KeyError No element kernel is registered for the backend and key. """ support_name, singularity_name, basis_name = key return self.kernels[backend, support_name, singularity_name, basis_name]