nlsq.diagnostics.IdentifiabilityReport

class nlsq.diagnostics.IdentifiabilityReport(available=True, error_message=None, computation_time_ms=0.0, condition_number=inf, numerical_rank=0, n_params=0, correlation_matrix=None, highly_correlated_pairs=<factory>, issues=<factory>, health_status=HealthStatus.HEALTHY)[source]

Bases: AnalysisResult

Report from identifiability analysis.

Contains results from analyzing the Fisher Information Matrix (FIM) including condition number, numerical rank, correlation structure, and any detected identifiability issues.

This dataclass extends AnalysisResult to include identifiability-specific information such as condition number, rank, and correlation analysis.

condition_number

Condition number of the FIM. High values (> 1e8) indicate practical unidentifiability.

Type:

float

numerical_rank

Numerical rank of the FIM. If less than n_params, indicates structural unidentifiability.

Type:

int

n_params

Total number of parameters in the model.

Type:

int

correlation_matrix

Parameter correlation matrix derived from FIM. None if computation failed.

Type:

np.ndarray | None

highly_correlated_pairs

List of highly correlated parameter pairs as (i, j, correlation). Only includes pairs with absolute correlation greater than correlation_threshold.

Type:

list[tuple[int, int, float]]

issues

List of detected identifiability issues (IDENT-001, IDENT-002, CORR-001).

Type:

list[ModelHealthIssue]

health_status

Overall health status based on detected issues.

Type:

HealthStatus

Examples

>>> report = IdentifiabilityReport(
...     condition_number=1e5,
...     numerical_rank=3,
...     n_params=3,
...     correlation_matrix=np.eye(3),
...     highly_correlated_pairs=[],
...     issues=[],
...     health_status=HealthStatus.HEALTHY,
... )
>>> report.available
True
>>> report.condition_number
100000.0
>>> # Report with issues
>>> from nlsq.diagnostics.types import ModelHealthIssue, IssueCategory, IssueSeverity
>>> issue = ModelHealthIssue(
...     category=IssueCategory.IDENTIFIABILITY,
...     severity=IssueSeverity.CRITICAL,
...     code="IDENT-001",
...     message="Structural unidentifiability detected",
...     affected_parameters=(0, 1),
...     details={"numerical_rank": 2, "n_params": 3},
...     recommendation="Reparameterize model",
... )
>>> report = IdentifiabilityReport(
...     condition_number=float('inf'),
...     numerical_rank=2,
...     n_params=3,
...     correlation_matrix=None,
...     highly_correlated_pairs=[],
...     issues=[issue],
...     health_status=HealthStatus.CRITICAL,
... )
>>> len(report.issues)
1
condition_number: float
numerical_rank: int
n_params: int
correlation_matrix: ndarray | None
highly_correlated_pairs: list[tuple[int, int, float]]
issues: list[ModelHealthIssue]
health_status: HealthStatus
__str__()[source]

Return a human-readable summary of the identifiability report.

summary()[source]

Return a summary string of the report.

Returns:

Human-readable summary of the identifiability analysis.

Return type:

str

__init__(available=True, error_message=None, computation_time_ms=0.0, condition_number=inf, numerical_rank=0, n_params=0, correlation_matrix=None, highly_correlated_pairs=<factory>, issues=<factory>, health_status=HealthStatus.HEALTHY)