import json import numpy as np from dual_rail_experiment import norm_pair, tensor, val def run_chain(factors, mode, dtype=np.float32): if mode == 'scalar': z = np.array(1.0, dtype=dtype) for f in factors: z = z * np.array(f, dtype=dtype) return float(z), bool(np.isfinite(z)) p = np.array([1.0, 1.0], dtype=dtype) for f in factors: p = tensor(p, np.array([1.0, f], dtype=dtype)).astype(dtype) if mode == 'normalized': s = np.max(np.abs(p)) if np.isfinite(s) and s > 0: p = p / s decoded = p[1] / p[0] if p[0] != 0 else np.inf return float(decoded), bool(np.all(np.isfinite(p)) and np.isfinite(decoded)) def main(): np.seterr(all='ignore') rng = np.random.default_rng(123) rows = [] for depth, center in [(20, 1.05), (100, 1.1), (200, 1.25), (500, 1.1), (1000, 1.1), (1000, 1.25)]: factors = rng.uniform(center * .99, center * 1.01, depth).astype(np.float64) truth = float(np.prod(factors, dtype=np.float64)) row = {'depth': depth, 'truth': truth} for mode in ('scalar', 'normalized', 'unnormalized'): got, finite = run_chain(factors, mode) row[mode + '_finite'] = finite row[mode + '_relerr'] = abs(got - truth) / max(abs(truth), 1e-30) if np.isfinite(got) else None rows.append(row) print(json.dumps(rows, indent=2, allow_nan=False)) if __name__ == '__main__': main()