Source code for nlsq.facades.diagnostics_facade
"""Diagnostics facade for breaking circular dependencies.
This facade provides lazy access to diagnostics components,
breaking the circular import cycle between diagnostics.types and health_report.
Reference: specs/017-curve-fit-decomposition/spec.md FR-013
"""
from __future__ import annotations
from typing import TYPE_CHECKING, Any
if TYPE_CHECKING:
from nlsq.diagnostics.types import DiagnosticLevel, DiagnosticsConfig
from nlsq.utils.diagnostics import ConvergenceMonitor
[docs]
class DiagnosticsFacade:
"""Facade for diagnostics components with lazy loading.
This facade breaks the circular dependency between diagnostics.types
and health_report by deferring all imports to method call time.
Examples
--------
>>> facade = DiagnosticsFacade()
>>> DiagnosticLevel = facade.get_diagnostic_level()
>>> level = DiagnosticLevel.DETAILED
"""
[docs]
def get_diagnostic_level(self) -> type[DiagnosticLevel]:
"""Get the DiagnosticLevel enum.
Returns
-------
type[DiagnosticLevel]
The DiagnosticLevel enum for specifying diagnostic verbosity.
"""
from nlsq.diagnostics.types import DiagnosticLevel
return DiagnosticLevel
[docs]
def get_diagnostics_config(self) -> type[DiagnosticsConfig]:
"""Get the DiagnosticsConfig class.
Returns
-------
type[DiagnosticsConfig]
The DiagnosticsConfig class for configuring diagnostics.
"""
from nlsq.diagnostics.types import DiagnosticsConfig
return DiagnosticsConfig
[docs]
def get_convergence_monitor(self) -> type[ConvergenceMonitor]:
"""Get the ConvergenceMonitor class.
Returns
-------
type[ConvergenceMonitor]
The ConvergenceMonitor class for monitoring convergence patterns.
"""
from nlsq.utils.diagnostics import ConvergenceMonitor
return ConvergenceMonitor
[docs]
def create_diagnostics_config(self, **kwargs: Any) -> DiagnosticsConfig:
"""Create a DiagnosticsConfig instance.
Parameters
----------
**kwargs
Keyword arguments passed to DiagnosticsConfig constructor.
Returns
-------
DiagnosticsConfig
A configured DiagnosticsConfig instance.
"""
DiagnosticsConfig = self.get_diagnostics_config()
return DiagnosticsConfig(**kwargs)
[docs]
def create_convergence_monitor(
self, window_size: int = 10, sensitivity: float = 1.0
) -> ConvergenceMonitor:
"""Create a ConvergenceMonitor instance.
Parameters
----------
window_size : int
Size of sliding window for pattern detection.
sensitivity : float
Sensitivity factor for pattern detection thresholds.
Returns
-------
ConvergenceMonitor
A configured ConvergenceMonitor instance.
"""
ConvergenceMonitor = self.get_convergence_monitor()
return ConvergenceMonitor(window_size=window_size, sensitivity=sensitivity)