Skip to content

v0.5.0 - eight silent-value fixes, a kink-aware Gauss-Legendre rule, demos 4 and 5

Choose a tag to compare

@zzhang0123 zzhang0123 released this 11 Sep 22:40
· 68 commits to main since this release

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.expand raises ValueError for diag_R=True when R has off-diagonal entries (a dense ExplicitR(iso_R=False)) and for diag_C=True when C has them (a GeneralKappa2 mixing matrix, a matrix ConstantImpulse / CustomImpulse, or a dense R). System.propagators refuses diag_C=True with an off-diagonal C, and a t_max above t_max_cache. Pass diag_R=False / diag_C=False; in this release an off-diagonal C still needs c_closed_form_only=True and a closed form.
  • The L0 evaluators raise ValueError when 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.