Source code for scpn_fusion.core.fusion_kernel_numerics
# SPDX-License-Identifier: AGPL-3.0-or-later
# Commercial license available
# © Concepts 1996–2026 Miroslav Šotek. All rights reserved.
# © Code 2020–2026 Miroslav Šotek. All rights reserved.
# ORCID: 0009-0009-3560-0851
# Contact: www.anulum.li | protoscience@anulum.li
"""Shared numeric helpers for FusionKernel solver paths."""
from __future__ import annotations
import numpy as np
from numpy.typing import NDArray
FloatArray = NDArray[np.float64]
NUMERIC_SANITIZE_CAP = 1.0e250
[docs]
def sanitize_numeric_array(arr: FloatArray, *, cap: float = NUMERIC_SANITIZE_CAP) -> FloatArray:
"""Return finite array with values clipped to ``[-cap, cap]``."""
out = np.nan_to_num(np.asarray(arr, dtype=np.float64), nan=0.0, posinf=cap, neginf=-cap)
if np.max(np.abs(out), initial=0.0) > cap:
out = np.clip(out, -cap, cap)
return out
[docs]
def stable_rms(arr: FloatArray) -> float:
"""Compute RMS without overflow from squaring very large magnitudes."""
vals = sanitize_numeric_array(arr)
if vals.size == 0:
return 0.0
max_abs = float(np.max(np.abs(vals), initial=0.0))
if max_abs <= 0.0:
return 0.0
scaled = vals / max_abs
return float(max_abs * np.sqrt(np.mean(scaled * scaled)))