Skip to main content

Enterprise-grade pre-training identifiability diagnostics for regime-switching models

Project description

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.


Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

identifiability_diagnostic-1.0.1.tar.gz (28.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

identifiability_diagnostic-1.0.1-py3-none-any.whl (16.6 kB view details)

Uploaded Python 3

File details

Details for the file identifiability_diagnostic-1.0.1.tar.gz.

File metadata

File hashes

Hashes for identifiability_diagnostic-1.0.1.tar.gz
Algorithm Hash digest
SHA256 845506bf5c7223b3d8dce0ff3d19de39fe5911e7354cf7bc6cc0708ed7a6fcb5
MD5 79bd1be28cff9491512c65dbc861e251
BLAKE2b-256 e3f10d4af739308b6b2f07c9145e257fff321ae80e27a50fc37ffcd52a47d085

See more details on using hashes here.

File details

Details for the file identifiability_diagnostic-1.0.1-py3-none-any.whl.

File metadata

File hashes

Hashes for identifiability_diagnostic-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 bccb7ec711232448479474ce87511adedf513ba38c6f8499a00105d87baea7b4
MD5 54b3872b19f3dc8f676ad477c9706416
BLAKE2b-256 1a1abff6c52a74d7b36c61a5752802752ee40dfda1c8ea48476d9c0575e14b44

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page