Source code for firecrown.fctools.measurement_compatibility

#!/usr/bin/env python
"""Tool for analyzing measurement compatibility in Firecrown.

This tool provides insights into which measurement pairs are compatible
for real-space and harmonic-space two-point correlation functions.
Useful for understanding test fixture parameterization and debugging
measurement combination issues.

Physical Examples:
  Compatible: Galaxy counts × CMB convergence (galaxy-CMB lensing)
  Compatible: Galaxy shear × Galaxy counts (galaxy-galaxy lensing)
  Incompatible: ξ₊ × ξ₋ (different correlation function components)
  Incompatible: E-mode shear in real space (harmonic-space only)
"""

from collections.abc import Callable
from enum import Enum
from itertools import product

import typer
from rich.console import Console

from firecrown.metadata_types import (
    ALL_MEASUREMENTS,
    Measurement,
    measurement_is_compatible_harmonic,
    measurement_is_compatible_real,
    measurement_supports_harmonic,
    measurement_supports_real,
)


[docs] class Space(str, Enum): """Enum for space types.""" REAL = "real" HARMONIC = "harmonic" BOTH = "both"
[docs] def discover_measurements_by_space() -> tuple[list[Measurement], list[Measurement]]: """Discover all measurements that support real/harmonic space. Returns: Tuple of (real_measurements, harmonic_measurements) """ all_measurements = ALL_MEASUREMENTS # Categorize by space support real_measurements = [m for m in all_measurements if measurement_supports_real(m)] harmonic_measurements = [ m for m in all_measurements if measurement_supports_harmonic(m) ] return real_measurements, harmonic_measurements
[docs] def generate_compatible_pairs( measurements: list[Measurement], compatibility_func: Callable[[Measurement, Measurement], bool], ) -> list[tuple[Measurement, Measurement]]: """Generate all valid measurement pairs for a given compatibility function. Args: measurements: List of measurements to test combinations of compatibility_func: Function to test compatibility Returns: List of valid (measurement1, measurement2) tuples """ return [ (m1, m2) for m1, m2 in product(measurements, repeat=2) if compatibility_func(m1, m2) ]
app = typer.Typer()
[docs] @app.command() def main( verbose: bool = typer.Option( False, "--verbose", "-v", help="Show detailed list of measurements and pairs" ), space: Space = typer.Option( Space.BOTH, "--space", case_sensitive=False, help="Which space to analyze", ), stats_only: bool = typer.Option( False, "--stats-only", help="Show only summary statistics" ), ) -> None: """Analyze measurement compatibility for Firecrown two-point functions. This tool discovers all measurement types and analyzes which combinations are compatible for real-space and harmonic-space two-point correlation functions. It shows efficiency improvements from using pre-filtered measurement pairs instead of runtime compatibility checks. Compatible correlations include: ✅ Galaxy counts × Galaxy counts (galaxy clustering) ✅ Galaxy shear × Galaxy shear (cosmic shear) ✅ Galaxy counts × Galaxy shear (galaxy-galaxy lensing) ✅ CMB convergence × Galaxy counts (galaxy-CMB lensing) ✅ Cluster counts × Galaxy counts (cluster-galaxy correlation) Incompatible combinations: ❌ ξ₊ × ξ₋ (different shear correlation components) ❌ SHEAR_T × SHEAR_T (T-mode auto-correlation not measured) ❌ E-mode shear in real space (harmonic-space only) Examples: python -m firecrown.fctools.measurement_compatibility --verbose python -m firecrown.fctools.measurement_compatibility --space real python -m firecrown.fctools.measurement_compatibility --stats-only """ console = Console() console.print("🔍 Firecrown Measurement Compatibility Analysis") console.print("=" * 60) # Discover measurements real_measurements, harmonic_measurements = discover_measurements_by_space() # Generate compatible pairs real_pairs = generate_compatible_pairs( real_measurements, measurement_is_compatible_real ) harmonic_pairs = generate_compatible_pairs( harmonic_measurements, measurement_is_compatible_harmonic ) if stats_only: print_summary_stats( console, real_measurements, harmonic_measurements, real_pairs, harmonic_pairs, ) return # Print measurements by space if space in [Space.REAL, Space.BOTH]: print_measurements_by_space( console, real_measurements, harmonic_measurements, verbose ) # Print compatible pairs if space in [Space.REAL, Space.BOTH]: print_compatible_pairs(console, "real-space", real_pairs, verbose) if space in [Space.HARMONIC, Space.BOTH]: print_compatible_pairs(console, "harmonic-space", harmonic_pairs, verbose) # Print efficiency gains if space == Space.BOTH: print_efficiency_gains(console, real_measurements, real_pairs, harmonic_pairs) print_summary_stats( console, real_measurements, harmonic_measurements, real_pairs, harmonic_pairs, ) elif space == Space.REAL: real_skip_reduction = len(real_measurements) ** 2 - len(real_pairs) console.print( f"\n🚀 Real-space efficiency: {real_skip_reduction} skipped tests " "eliminated" ) return elif space == Space.HARMONIC: # pragma: no branch # Coverage.py artifact: branch-to-exit tracked but not separately testable harmonic_skip_reduction = len(harmonic_measurements) ** 2 - len(harmonic_pairs) console.print( f"\n🚀 Harmonic-space efficiency: {harmonic_skip_reduction} skipped " "tests eliminated" ) return
if __name__ == "__main__": # pragma: no cover app()