| from __future__ import annotations |
|
|
| import json |
| from pathlib import Path |
|
|
|
|
| KNOWN_METHODS = { |
| "teki": { |
| "abbreviation": "TEKI", |
| "Method": "Tikhonov Regularized Ensemble Kalman Inversion", |
| "family": "Kalman", |
| "aliases": ["teki"], |
| }, |
| "etki": { |
| "abbreviation": "ETKI", |
| "Method": "Ensemble Transform Kalman Inversion", |
| "family": "Kalman", |
| "aliases": ["etki"], |
| }, |
| "iekf": { |
| "abbreviation": "IEKF", |
| "Method": "Iterative Ensemble Kalman Filter", |
| "family": "Kalman", |
| "aliases": ["iekf", "gnsl"], |
| }, |
| "uki": { |
| "abbreviation": "UKI", |
| "Method": "Unscented Kalman Inversion", |
| "family": "Kalman", |
| "aliases": ["uki"], |
| }, |
| "abc": { |
| "abbreviation": "ABC", |
| "Method": "Approximate Bayesian Calibration", |
| "family": "Bayesian", |
| "aliases": ["abc"], |
| }, |
| "hm": { |
| "abbreviation": "HM", |
| "Method": "History Matching", |
| "family": "Bayesian", |
| "aliases": ["hm"], |
| }, |
| } |
|
|
|
|
| def build_alias_lookup() -> dict[str, str]: |
| lookup: dict[str, str] = {} |
| for canonical_name, meta in KNOWN_METHODS.items(): |
| lookup[canonical_name] = canonical_name |
| lookup[canonical_name.upper()] = canonical_name |
| for alias in meta.get("aliases", []): |
| lookup[alias.lower()] = canonical_name |
| lookup[alias.upper()] = canonical_name |
| return lookup |
|
|
|
|
| ALIAS_TO_CANONICAL = build_alias_lookup() |
|
|
|
|
| def normalize_method_name(name: object) -> str: |
| text = str(name).strip() |
|
|
| if text.startswith("b'") and text.endswith("'"): |
| text = text[2:-1] |
| elif text.startswith('b"') and text.endswith('"'): |
| text = text[2:-1] |
|
|
| text = text.strip("\"'").strip() |
| return text.lower() |
|
|
|
|
| def canonicalize_method_name(name: object) -> str: |
| normalized = normalize_method_name(name) |
| return ALIAS_TO_CANONICAL.get(normalized, normalized) |
|
|
|
|
| def get_method_meta(canonical_name: str) -> dict[str, str]: |
| return KNOWN_METHODS.get(canonical_name, {}) |
|
|
|
|
| def dump_method_registry_snapshot(project_root: Path, observed_methods: set[str]) -> None: |
| snapshot = { |
| "known_methods": KNOWN_METHODS, |
| "observed_methods": sorted(observed_methods), |
| "unmapped_observed_methods": sorted([method for method in observed_methods if method not in KNOWN_METHODS]), |
| } |
| cache_dir = project_root / ".cache" |
| cache_dir.mkdir(parents=True, exist_ok=True) |
| target_file = cache_dir / "known_methods_snapshot.json" |
| target_file.write_text(json.dumps(snapshot, indent=2), encoding="utf-8") |
|
|