Rust ports of the hot paths found by profiling: fused per-locus GenCall calling and scoring, BAF/LRR, libm maps with CPython math semantics, both nearest-neighbour searches of the normalization fit, and the BPM LocusEntry parser. Address coverage is memoised per IDAT layout. SIMURG_PURE_PYTHON=1 forces the pure paths. On the Pi: genotype_sample 3.4 s -> 1.1 s, 36-sample GSA run 131 s -> 46 s, BPM read 4x faster; 36 GSA + 6 Omni2.5 GTCs and QC tables byte-identical to the pure path; tests/unit/test_core_kernels.py checks every kernel on edge cases. bench/profile_genotype.py, bench/scaling.py, cloud task p9 (thread scaling). Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01814GKVzZVL3FuF3DeiZXhv
25 lines
818 B
Python
25 lines
818 B
Python
"""Optional compiled kernels (``rust/simurg-core``, plan §18 P9).
|
|
|
|
``core`` is the ``simurg_core`` extension module when it is installed, else ``None``; every caller keeps a pure
|
|
Python/NumPy path with bit-identical results. ``SIMURG_PURE_PYTHON=1`` forces the pure paths (tests, debugging).
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
from types import ModuleType
|
|
|
|
core: ModuleType | None
|
|
if os.environ.get("SIMURG_PURE_PYTHON", "") not in ("", "0"):
|
|
core = None
|
|
else:
|
|
try:
|
|
import simurg_core as core # type: ignore[no-redef]
|
|
except ImportError: # pragma: no cover - depends on the installation
|
|
core = None
|
|
|
|
|
|
def backend() -> str:
|
|
"""``"rust <version>"`` or ``"python"`` (recorded in run manifests)."""
|
|
return f"rust {core.__version__}" if core is not None else "python"
|