Skip to main content

Identifiability Diagnostic Framework

CI/CD Pipeline Python Version License: MIT Code style: black Linting: flake8 PyPI

Overview

An enterprise-grade, production-ready unsupervised pre-training geometric diagnostic system for identifying practical identifiability boundaries in 2-regime Switching State-Space Models (S-SSMs).

This framework implements a novel algorithm that constructs an Observable Moment Matrix from interventional data and applies Singular Value Decomposition (SVD) to determine whether regime parameters are identifiable from observations alone.

Key Features

  • 🎯 SVD-based Identifiability Analysis: Automatically detects parameter identifiability via spectral metrics
  • 🔄 Regime-Switching Support: Full support for multi-regime autoregressive processes with exogenous interventions
  • 📊 Comprehensive Metrics: Effective rank, condition numbers, singular values, deployment decisions
  • 🛡️ Production-Grade: Full type hints, error handling, logging, and extensive test coverage
  • 🚀 CI/CD Ready: GitHub Actions workflows, automated testing, code quality checks
  • 📦 Easy Installation: PyPI-ready package with full dependency management
  • 💻 Cross-Platform: Runs on Linux, macOS, and Windows

Installation

From PyPI

pip install identifiability-diagnostic

From Source

git clone https://github.com/yourorg/identifiability-diagnostic.git
cd identifiability-diagnostic
pip install -e .

Development Installation

pip install -e ".[dev]"

Quick Start

Basic Usage

from identifiability_diagnostic import (
    RegimeSwitchingGenerator,
    PretrainingDiagnosticPipeline
)
from identifiability_diagnostic.utils.config import load_config

# Load configuration
config = load_config('config/parameters.yaml')

# Generate synthetic data
generator = RegimeSwitchingGenerator(config)
y, u = generator.generate(epsilon=1e-3, symmetric=False)

# Run diagnostic pipeline
pipeline = PretrainingDiagnosticPipeline(config)
metrics = pipeline.run(y, u)

# Interpret results
print(f"σ_2 = {metrics['sigma_2']:.4e}")
print(f"Decision: {metrics['deploy_decision']}")
print(f"Identifiable: {metrics['identifiable']}")

Command-Line Interface

# Run parametric sweep
python main.py --config config/parameters.yaml --log-level INFO

# Run with custom epsilon values
python main.py --epsilon 1e-5 1e-4 1e-3 1e-2 1e-1

# Test mode (smaller dataset)
python main.py --test --verbose

# Symmetric control only
python main.py --symmetric-only

Algorithm Overview

The framework implements a 7-step diagnostic pipeline:

  1. Compute First-Order Innovations: dy_t = y_t - y_{t-1}
  2. Lift to Feature Space: v_t = [dy_t, dy_{t-1}]^T
  3. Align Interventional Context: Match intervention levels to innovation timeline
  4. Construct Moment Matrix: M ∈ ℝ^{|U| × 4} with conditional covariances
  5. Execute SVD: Singular Value Decomposition of M
  6. Compute Metrics: Effective rank, singular values, condition numbers
  7. Deploy Gate: σ_2 > τ determines identifiability

Mathematical Foundation

For regime-switching model:

y_t = a_{s_t} y_{t-1} + b_{s_t} u_t + c_{s_t} u_t y_{t-1} + η_t

The Observable Moment Matrix captures covariance structure stratified by intervention level. SVD spectrum determines whether regimes can be distinguished from data.

Key Decision Rule:

  • If σ_2 > threshold (τ = 5.12e-17): Identifiable ✓ Deploy estimator
  • If σ_2 ≤ threshold: Non-identifiable ✗ Abort training

Project Structure

identifiability-diagnostic/
├── .github/workflows/           # CI/CD configurations
├── src/
│   └── identifiability_diagnostic/
│       ├── __init__.py
│       ├── core/                # Core algorithms
│       │   ├── data_generator.py
│       │   ├── pipeline.py
│       │   └── metrics.py
│       ├── utils/               # Utilities
│       │   ├── config.py
│       │   └── logging.py
│       └── exceptions.py
├── tests/
│   ├── unit/                    # Unit tests (20+ tests)
│   └── integration/             # Integration tests (10+ tests)
├── examples/                    # Usage examples
├── config/
│   └── parameters.yaml          # Default configuration
├── main.py                      # CLI entry point
├── setup.py                     # Package setup
├── pyproject.toml              # Modern packaging config
├── requirements.txt            # Dependencies
└── README.md                   # This file

Testing

Run All Tests

pytest tests/ -v --cov=src/identifiability_diagnostic

Unit Tests Only

pytest tests/unit -v

Integration Tests Only

pytest tests/integration -v

With Coverage Report

pytest tests/ --cov=src/identifiability_diagnostic --cov-report=html

Test suite includes:

  • ✓ Data generation tests
  • ✓ Pipeline execution tests
  • ✓ Metrics computation tests
  • ✓ Configuration validation tests
  • ✓ End-to-end workflow tests
  • ✓ Edge case handling
  • ✓ Numerical stability tests

Configuration

Default configuration in config/parameters.yaml:

simulation:
  T: 100000              # Time series length
  seed: 42               # Random seed
  sigma_n: 0.5           # Process noise std dev
  regime_0:
    a: 0.90              # AR coefficient regime 0
    b: 1.0               # Intervention coupling
    c: 0.0               # Bilinear term
  regime_1:
    a: 0.90              # AR coefficient regime 1
    b: 1.0
    c: 0.2               # Asymmetric bilinear!

diagnostic:
  u_levels: [-2, -1, 0, 1, 2]     # Intervention grid
  threshold_tau: 5.12e-17         # Gating threshold

Examples

See examples/basic_usage.py for detailed examples:

python examples/basic_usage.py

Examples include:

  1. Basic workflow (single epsilon)
  2. Parametric sweep (multiple epsilon values)
  3. Symmetric control test
  4. Custom configuration

API Reference

RegimeSwitchingGenerator

gen = RegimeSwitchingGenerator(config)
y, u = gen.generate(epsilon=1e-3, symmetric=False, verbose=True)
results = gen.batch_generate([1e-5, 1e-4, 1e-3])

PretrainingDiagnosticPipeline

pipeline = PretrainingDiagnosticPipeline(config)
metrics = pipeline.run(y, u, verbose=True)
batch_results = pipeline.batch_run(data_dict)

MetricsCalculator

calc = MetricsCalculator(threshold_tau=5.12e-17)
metrics = calc.compute_metrics(moment_matrix)
eff_rank = calc.compute_effective_rank(singular_values)

Performance

Benchmark results on Intel i7 @ 3.6GHz:

Task Data Size Time
Data Generation (T=100k) 100,000 obs ~50 ms
Pipeline Execution 100,000 obs ~80 ms
Full Diagnostic Cycle 100,000 obs ~130 ms
Parametric Sweep (5 ε values) 500,000 obs ~650 ms

Code Quality

  • Coverage: >85% test coverage
  • Type Hints: Full type annotations throughout
  • Linting: flake8, black, isort, pylint
  • Static Analysis: mypy type checking
  • Documentation: Comprehensive docstrings and comments

CI/CD Pipeline

Automated workflows for:

  • ✓ Unit & integration tests (Python 3.8-3.11)
  • ✓ Multi-platform testing (Ubuntu, macOS, Windows)
  • ✓ Code quality checks (flake8, black, mypy, pylint)
  • ✓ Security scanning (bandit, safety)
  • ✓ Coverage reporting (Codecov)
  • ✓ Package building and verification

Contributing

See CONTRIBUTING.md for guidelines.

License

MIT License - see LICENSE file for details.

Citation

If you use this framework in research, please cite:

@software{identifiability_diagnostic_2024,
  title={Identifiability Diagnostic Framework for Regime-Switching Models},
  author={Prakul S. Hiremath, Aliens on Earth},
  year={2026},
  url={https://github.com/prakulhiremath/identifiability-diagnostic}
}

Support

Team

Aliens on Earth

Acknowledgments

This framework implements novel identifiability diagnostics for regime-switching state-space models using Observable Moment Matrix analysis and SVD-based metrics.


Release files for identifiability-diagnostic 1.0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for identifiability-diagnostic 1.0.1
File Size Uploaded
identifiability_diagnostic-1.0.1.tar.gz 28.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for identifiability-diagnostic 1.0.1
File Interpreter ABI Platform
identifiability_diagnostic-1.0.1-py3-none-any.whl Python 3 none any Details

Total release size: 45.0 kB

Release files / identifiability_diagnostic-1.0.1.tar.gz

Download URL identifiability_diagnostic-1.0.1.tar.gz
Size 28.4 kB
Tags Source
SHA-256 checksum
How to use checksums
845506bf5c7223b3d8dce0ff3d19de39fe5911e7354cf7bc6cc0708ed7a6fcb5
BLAKE2b-256 checksum
How to use checksums
e3f10d4af739308b6b2f07c9145e257fff321ae80e27a50fc37ffcd52a47d085
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.9.6

Release files / identifiability_diagnostic-1.0.1-py3-none-any.whl

Download URL identifiability_diagnostic-1.0.1-py3-none-any.whl
Size 16.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
bccb7ec711232448479474ce87511adedf513ba38c6f8499a00105d87baea7b4
BLAKE2b-256 checksum
How to use checksums
1a1abff6c52a74d7b36c61a5752802752ee40dfda1c8ea48476d9c0575e14b44
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.9.6

Release history Release notifications | RSS feed

This release

1.0.1 This release

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page