v0.5.0 - eight silent-value fixes, a kink-aware Gauss-Legendre rule, demos 4 and 5
Eight inputs returned a wrong number without an error; each now returns the right value or raises. They were found by merging the open branches, reviewing the result, and building two demos in configurations where the wrong and the right value differ.
Breaking
System.expandraisesValueErrorfordiag_R=Truewhen R has off-diagonal entries (a denseExplicitR(iso_R=False)) and fordiag_C=Truewhen C has them (aGeneralKappa2mixing matrix, a matrixConstantImpulse/CustomImpulse, or a dense R).System.propagatorsrefusesdiag_C=Truewith an off-diagonal C, and at_maxabovet_max_cache. Passdiag_R=False/diag_C=False; in this release an off-diagonal C still needsc_closed_form_only=Trueand a closed form.- The L0 evaluators raise
ValueErrorwhen a term's R indices contradict the propagator cache's R (two-index terms against a scalar R, index-free terms against a matrix R, an absorbed R with two indices).
Values that change
| defect | affected inputs | size before the fix |
|---|---|---|
| callable non-local coupling evaluated at one leg order | callable κ not symmetric in its leg points | 53 % to 130 % (the tests' generic kernel) |
| diag-C fast path ignored pinned observable labels | qmc_scalar, qmc, nquad under diag_C |
17 % to 78 % at order 2 |
| off-diagonal R and C dropped under the L1 defaults | dense ExplicitR, mixing GeneralKappa2, matrix white noise |
order-0 ⟨φ₀φ₁⟩ = 0 instead of 0.1178 |
DiagonalA with a callable rate |
components that differ away from t = 0 and 1; R below t = 0 | 23 % on R₁₁; 13 to 1400 times too large below 0 |
System.t_min not passed to the integrators |
t_min ≠ 0 through Expansion.evaluate, sweep, the CLI |
×1.27 on an order-1 three-point function |
iso_C=True multiplied every C by N |
iso_C=True, N ≥ 2 |
×2 at orders 0-1, ×4 at order 2 (N = 2) |
| a repeated R pair reused the first R's indices | L0, matrix R, a vertex with two ψ legs | totals off by 2.1 to 5.8 times, one sign flip |
| L0 R indices against the cache's R | L0 flags that contradict the cache | ×3.7 to ×27 |
One crash is fixed: a callable coupling with a matrix R on a zero-dimensional diagram failed on qmc_vectorized, gauss_legendre and nquad.
Demos 1-3 reproduce their stored numbers.
Gauss-Legendre on white noise
gauss_legendre splits the time domain where the integrand is kinked (the white-noise C diagonal; two parents of a vertex with several ψ legs), recursively. Demo 4 against its exact hierarchy:
| channel | before, 8 / 16 / 64 nodes | now, 8 / 16 nodes |
|---|---|---|
| white pulses, FF | 4.5e-3 / 1.2e-3 / 7.9e-5 | 2.0e-13 / 7.0e-16 |
| exponential pulses, FF | 1.2e-5 / 8.2e-7 / 3.5e-9 | 6.9e-11 / 1.1e-15 |
Demos 4 and 5
- Demo 4 (
examples/demo4): two-component compound-Poisson noise whose cumulants are symmetric only under joint permutations of (component, point) pairs, and an F with no index symmetry. Level A against Campbell's theorem, level B against an exact moment hierarchy. On the code before the leg-order fix it is 46.8 % off. - Demo 5 (
examples/demo5): white noise with a matrix amplitude,t_min = 0.5, orders 0-4 on every integrator (Gauss-Legendre to 1.4e-15), and multiplicative noise at L0 with scalar and matrix R (to 6.2e-16). On the pre-fix commits it fails by factors 2 to 8 (iso_C) and by 64 % (diag-C fast path). examples/reference/ito_moments.py: the exact moment hierarchy of a polynomial Itô SDE with jumps, used as the reference; it imports nothing from sft-wick.
Every fix, with its measurements and the tests that lock it, is in CHANGELOG.md.