Extended IEEE/Array Bridge Documentation (SCM)¶
Overview¶
ZeroProofML's bridge collapses IEEE NaN/Inf into the single SCM bottom element ⊥ and keeps mask semantics aligned across NumPy, PyTorch, and JAX arrays. The helpers live in zeroproof.utils.ieee_bridge for scalars and in zeroproof.scm.ops for vectorised math.
Scalar Conversion¶
from zeroproof.utils.ieee_bridge import from_ieee, to_ieee
scm_val = from_ieee(float("nan")) # ⊥
print(scm_val.is_bottom) # True
print(to_ieee(scm_val)) # nan
Use batch_from_ieee/batch_to_ieee when handling iterables.
NumPy and Torch Masks¶
Vectorised helpers take parallel arrays of payloads and boolean ⊥ masks. Operations propagate masks instead of materialising infinities:
import numpy as np
from zeroproof.scm.ops import scm_add_numpy, scm_div_numpy
payload = np.array([1.0, 0.0, -1.0])
mask = np.array([False, True, False]) # mark ⊥ locations
values, value_mask = scm_add_numpy(payload, payload, mask, mask)
quot, quot_mask = scm_div_numpy(payload, np.ones_like(payload), mask, np.zeros_like(mask))
Torch mirrors the same calling convention:
import torch
from zeroproof.scm.ops import scm_mul_torch
x = torch.tensor([2.0, 0.0])
mask = torch.tensor([False, True])
prod, prod_mask = scm_mul_torch(x, mask, torch.tensor([3.0, 4.0]), mask)
All outputs return a (payload, mask) tuple. Masks stay boolean so they can be logged directly as coverage metrics.
Projective Tuples¶
SCMRationalLayer exposes a bottom mask alongside its output so that singularities can be handled once at decode time:
from zeroproof.layers import SCMRationalLayer
from zeroproof.autodiff.policies import GradientPolicy
layer = SCMRationalLayer(1, 1, gradient_policy=GradientPolicy.PROJECT)
y, bottom_mask = layer(x)
This keeps the forward graph free of control flow and lets you decide whether to drop, clamp, or project ⊥ values in the trainer.
Design Notes¶
- Single bottom element: NaN and ±∞ collapse to
⊥; there are no Transreal tags in v0.4. - Weak sign: Orientation can be recovered with
zeroproof.scm.sign.weak_signafter mapping values into SCM. - Deterministic masks: Vectorised ops never branch on data values beyond explicit zero checks, making them compiler-friendly.