"""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]