chronaxis.legacy.sum_numpy
源码基线:8904c2f744951857659abd40aaa3535d57faf53c
1"""以真实NumPy前缀累计实现有限贡献块的独立原序左折叠。23输入是已校验的有限float carry和按原求值顺序排列的有限float tuple;输出为4未舍入候选float。把carry作为第0项,再用add.accumulate逐步相加,保留跨批5左结合顺序,不先求块和,不用np.sum、补偿求和、向量化Python回调或参考内核。6任一中间累计非有限均拒绝整批,后续抵消不能把此前溢出恢复成正常结果。78本纯数值核不保存状态、来源或费用;调用方须在调用前预留当前有限(N+1,)输入、9累计与有限性临时列。本模块仅在明确选择NumPy且本批有贡献时由累计器加载,10不读取日志、DBC或文件,不把库加载和整个进程RSS声称为本层受控内存。11"""1213# 数值运算独立于标准库参考路径;仅接受调用方已验证的当前有限块。14import numpy as np151617def sum_numpy(carry: float, values: tuple[float, ...]) -> float:18 """从已有carry按原顺序一次生成整列前缀累计并核查所有中间值。1920 参数: carry为有限原生float;values为按原序选出的有限原生float tuple,21 本函数由预算owner在完成贡献结构与顺序校验后调用。22 返回: float;无贡献时原carry不变,有贡献时取最后前缀,保持原浮点尾数。23 异常: OverflowError为任何中间累计非有限;NumPy分配、导入或取消原样传播。24 本核不提交累计器状态,费用及异常恢复由调用方管理。25 """26 chain = prefixes = None27 try:28 if not values:29 return carry30 # carry放在第0项而非最终再加块和,使每一项都承接真实前缀与跨批尾数。31 chain = np.empty(len(values) + 1, dtype=np.float64)32 chain[0] = carry33 chain[1:] = values34 with np.errstate(over="ignore", invalid="ignore", under="ignore"):35 prefixes = np.add.accumulate(chain, dtype=np.float64)36 # 全列检查能发现中途溢出,不能只看最终值或允许后续项抵消故障。37 if not np.all(np.isfinite(prefixes)):38 raise OverflowError("legacy_sum中间累计非有限,整批拒绝")39 return float(prefixes[-1])40 finally:41 # 异常被外部保留时也不能经本层frame保活未计费数组或选值tuple;42 # 不改写原输入、不清除异常traceback,只断开本函数的临时引用。43 chain = prefixes = values = None44