valska_hera_beam.evidence
Evidence evaluation module for the ValSKA project.
This module provides functions to calculate and interpret Bayes factors between models in the BayesEoR analysis of HERA beam perturbations.
Typical usage examples
>>> from pathlib import Path
>>> from valska_hera_beam.evidence import (
... calculate_bayes_factor,
... find_chain_pairs,
... analyze_chain_pair,
... run_complete_bayeseor_analysis,
... )
...
>>> base = Path("/path/to/BayesEoR/chains")
>>> v7_base = base / "v7d0"
>>> pairs = find_chain_pairs(v7_base)
>>> cp = pairs["1.0e00pp"]
>>> bf_result = calculate_bayes_factor(
... cp.fgeor_root / "data-",
... cp.fgonly_root / "data-",
... )
>>> bf_result["log_bayes_factor"]
-3.2
>>> summary = run_complete_bayeseor_analysis(
... chain_pairs=pairs,
... create_plots=False,
... verbose=False,
... )
>>> summary["summary"]["pass"]
5
Functions
|
Analyze a single FgEoR/FgOnly chain pair using BaNTER-style validation. |
|
Calculate Bayes factor between two models given their nested-sampling chains. |
|
Discover matched FgEoR / FgOnly chain pairs under a base directory. |
|
Interpret the strength of evidence given a log Bayes factor. |
|
Run a complete BayesEoR perturbation analysis over multiple chain pairs. |
Classes
|
Container for a matched FgEoR / FgOnly chain pair. |
- class valska_hera_beam.evidence.ChainPair(perturbation: str, fgeor_root: Path, fgonly_root: Path)
Container for a matched FgEoR / FgOnly chain pair.
- fgeor_root: Path
- fgonly_root: Path
- perturbation: str
- valska_hera_beam.evidence._find_single_mn_subdir(root: Path) Path
Find the MN-* (or similar) subdirectory under a given root.
Assumes there is exactly one subdirectory; raises if 0 or >1. This keeps the logic explicit and surfaces layout issues early.
- valska_hera_beam.evidence._normalize_perturbation_key(raw_suffix: str) str
Normalize a perturbation suffix into a stable key.
For now this is just a passthrough, but by putting it in one place you can later convert between formats (e.g. ‘+1e0pp’ vs ‘1.0e00pp’) if needed.
- valska_hera_beam.evidence.analyze_chain_pair(pair: ChainPair, dir_prefix: Path | None = None, expected_ps: float = 214777.66068216303, create_plots: bool = True, verbose: bool = True) dict[str, Any]
Analyze a single FgEoR/FgOnly chain pair using BaNTER-style validation.
Parameters
- pair :
ChainPairdescribing the perturbation and root directories.- dir_prefix :
Optional prefix to strip off when handing paths to
DataContainer. IfNone, the common ancestor of both roots is used.- expected_ps :
Expected power spectrum value passed through to
DataContainer.- create_plots :
If
True, generate and show posterior / power spectrum plots.- verbose :
If
True, print detailed log output to stdout.
Returns
- dict
Result dictionary with keys:
'perturbation''plot_success''bayes_factor_result''validation'('PASS','FAIL'or'ERROR')
- valska_hera_beam.evidence.calculate_bayes_factor(chain_path_1: str | Path, chain_path_2: str | Path, model_name_1: str = 'Model 1', model_name_2: str = 'Model 2', verbose: bool = True) dict[str, Any]
Calculate Bayes factor between two models given their nested-sampling chains.
The function assumes that the directories at
chain_path_1andchain_path_2are readable byanesthetic.read_chains()and that the returned objects implement alogZ()method (as in anesthetic).Parameters
- chain_path_1 :
Path to the first model’s chain directory (numerator in Bayes factor).
- chain_path_2 :
Path to the second model’s chain directory (denominator in Bayes factor).
- model_name_1 :
Name of the first model for display and reporting.
- model_name_2 :
Name of the second model for display and reporting.
- verbose :
If
True, print intermediate information (loaded evidences and resulting Bayes factor) to stdout.
Returns
- dict
Dictionary containing results with keys:
'model_1': str, the name of model 1.'model_2': str, the name of model 2.'log_evidence_1': float orNone, log-evidence of model 1'log_evidence_2': float orNone, log-evidence of model 2'log_bayes_factor': float orNone, ln(Z1/Z2).'interpretation': str, readable interpretation.'success': bool, True if computation succeeded.'error': str orNone, error message if failed.
- valska_hera_beam.evidence.find_chain_pairs(base_dir: Path, fgeor_prefix: str = 'GL_FgEoR_', fgonly_prefix: str = 'GL_FgOnly_', debug: bool = False) dict[str, ChainPair]
Discover matched FgEoR / FgOnly chain pairs under a base directory.
This is meant to work with layouts like:
``base_dir / "GL_FgEoR_1.0e00pp"/MN-23-23-38-2-ffm-.../data-`` ``base_dir / "GL_FgOnly_1.0e00pp"/MN-23-23-38-2-ffm-.../data-``
or v5-style directories such as:
``base_dir / "GSM_FgEoR_-5e0pp"/MN-23-23-38-2-.../data-`` ``base_dir / "GSM_FgOnly_-5e0pp"/MN-23-23-38-2-.../data-``
by adjusting
fgeor_prefixandfgonly_prefix.Parameters
- base_dir :
Directory containing GL_FgEoR_* and GL_FgOnly_* subdirectories (e.g.
paths.chains_dir / 'v7d0'), or GSM_*_* for v5-style.- fgeor_prefix :
Prefix for Fg+EoR directories.
- fgonly_prefix :
Prefix for FgOnly directories.
- debug :
If
True, print information about discovered entries and matches.
Returns
- dict
Mapping from a normalized perturbation key to a
ChainPair. Thefgeor_rootandfgonly_rootpaths are the MN-* level directories that directly contain thedata-files.
- valska_hera_beam.evidence.interpret_bayes_factor(log_bf: float) str
Interpret the strength of evidence given a log Bayes factor.
Parameters
- log_bf :
Natural logarithm of the Bayes factor, ln(Z1 / Z2).
Returns
- str
Readable description of evidence strength, based on commonly used (Jeffreys-like) thresholds.
- valska_hera_beam.evidence.run_complete_bayeseor_analysis(chain_pairs: dict[str, ChainPair], perturbation_levels: Iterable[str] | None = None, dir_prefix: Path | None = None, expected_ps: float = 214777.66068216303, create_plots: bool = False, show_detailed_results: bool = False, verbose: bool = True, show_progress: bool = True) dict[str, Any]
Run a complete BayesEoR perturbation analysis over multiple chain pairs.
Parameters
- chain_pairs :
Mapping of perturbation keys to
ChainPairobjects, typically created byfind_chain_pairs().- perturbation_levels :
Optional iterable of perturbation keys to analyze. If
None, all keys inchain_pairsare used.- dir_prefix :
Optional directory prefix for
analyze_chain_pair(). IfNone, the common ancestor of each pair is used individually.- expected_ps :
Expected power spectrum value passed on to
analyze_chain_pair().- create_plots :
If
True, generate plots for each perturbation level.- show_detailed_results :
If
True, print detailed numerical results per successful perturbation.- verbose :
If
True, print readable progress and summary messages.- show_progress :
If
Trueand multiple perturbation levels are analyzed, display atqdmprogress bar (if available).
Returns
- dict
Contains
'results','summary', and'successful_results'.