Skip to content

SEP 37: shot noise on by default, and an integrator and tolerances for each interface - #30

Merged
jtravs merged 47 commits into
mainfrom
docs/sep-0037-noise-and-stepper-defaults
Oct 27, 2026
Merged

jtravs merged 47 commits into
mainfrom
docs/sep-0037-noise-and-stepper-defaults

Conversation

@jtravs

@jtravs jtravs commented Oct 26, 2026 •

Copy link
Copy Markdown
Contributor

SEP 37 (accepted), with its implementation (phases 0–3) on one branch, as SEP 0 asks. The integrator and tolerance defaults are provisional, pending the maintainer's approval of the phase 0 tables (§5.2's approval gate); see Part II.

Noise (phase 2).

  • noise="input" is the default on every prop_* interface and Simulation.from_* constructor.
  • The resolution (requested model, resolved model, reason) is recorded in RunMetadata.noise_resolution at output schema 26, outside the hash, and printed by the start-of-run summary.
  • Single precision and the planar grid fall back to none, and say so; seed= beside such a fallback is refused.
  • An interior launch takes its spectrum as given. An explicit noise="input" there adds the draw at the launch: backends now add the input draw at the run's launch position, which leaves resumes unchanged.

Refusals and the floor (phase 3).

  • Input noise is admitted beside the coherent wall, the taper coupling, the split block, the moving guide and the TDSE response. The modified model keeps those refusals.
  • get_spectral_density(..., noise_floor="subtract") removes the seed's one photon per bin. For one draw, where the linear operator is unitary, it equals the modified model's corrected readout.

Defaults (phases 0–1). The table was measured on DMOG (AMD EPYC 7763, native backend) on the maintainer's tracking cases:

Interface Integrator rtol
prop_gnlse RungeKutta() 1e-7
prop_waveguide RungeKutta() 1e-5
prop_capillary Multistep(), held for the maintainer's decision 1e-6
prop_radial, prop_planar Multistep() 1e-5 (atol 0)
prop_free unchanged; controller still required —
  • SimulationSettings.controller is now optional.
  • The interaction-formulation Adams method won the waveguide case but refuses coupled flows, so RK is the waveguide default.
  • The capillary's aggregate favours RK at 1e-5, but rdw and noiseless ctc favour Multistep, which is the TDSE's only march.

Docs.

  • The noise guide is rewritten.
  • The stepper guide gains a defaults table.
  • ADR-055 is new.
  • The tutorials and examples take seeds, or noise=None where the lesson is noiseless, and the worked examples are re-run.

Verification.

  • Default lane plus doctests on DMOG: 15733 passed. The one failure is a numba licence cache-key test that fails only in that environment.
  • Slow lane: 134 passed.
  • The new tests cover the default, its fallbacks and record, coupled-flow and TDSE input noise, and the floor.

🤖 Generated with Claude Code

jtravs and others added 2 commits October 26, 2026 22:11
… interface

Proposes noise="modified" as the default wherever the model can be
carried, a measured default integrator and default tolerances for each
prop_* interface, and lifting every noise refusal that is not grounded
in physics. Opens with an exploration phase over the design record and
the standard suite. Carries the preliminary step-count and accuracy
measurements made while drafting: noise costs nothing at capillary
energies and 8-65x on the 20 pJ GNLSE soliton, set by the seed's share
of the field norm against rtol, with RungeKutta() well ahead of
Multistep() there.

Adds the SEP to the index, its toctree and the roadmap's drafts, and
links the informal roadmap items it partly covers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…gets

The theory now rests on where one photon per mode comes from (Smith's
amplifier-equivalent input), the modified model's origin (Chen and Wise)
and its exact equivalence to the input model in shifted coordinates when
no reservoir acts; loss, Raman, gain and plasma absorption are where the
two differ and the modified model is the physical one. The verification
gains the exact input/modified identity and the Bogoliubov result for
spontaneous MI from vacuum. The factor of two in parametric seeding and
the fixed-modulus draw are recorded as open (Q7, Q8).

Tolerance defaults are to be set by convergence tests: the GNLSE on the
Dudley-Genty-Coen supercontinuum (expected looser than 1e-8; recurrence
studies tighten explicitly), the capillary kept at 1e-6 only if its test
supports it, and no default set by a response such as the TDSE.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@read-the-docs-community

read-the-docs-community Bot commented Oct 26, 2026 •

Copy link
Copy Markdown

jtravs and others added 5 commits October 26, 2026 23:06
The review showed the reservoir argument for the modified model was wrong:
with a unitary linear operator the two models are one equation whatever
the nonlinear response, and they differ only through a forcing correlated
with the draw where the linear operator is not unitary, where the modified
model can be the worse. Following the maintainer's decisions (D1-D5), the
default becomes noise="input", the least bad model already implemented,
and the modified model stays an option with its limits documented.

Part I now carries a closed, recorded and printed fallback where noise
cannot be carried, input noise beside the TDSE response, coupled flows
and explicit interior launches, a frozen integrator selection rule with
an approval gate, and a lean convergence protocol for the tolerances.
Part III records the decisions and answers R1-R14. The roadmap entries
follow the narrower scope.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Adds noise_floor="subtract" to the spectrum accessors (D6): it removes
exactly one photon per active bin and channel, which for one realisation
equals the modified model's corrected readout wherever the linear operator
is unitary, so an input run can show the floorless spectrum. Records the
input model's thermal-seeding limit for rotational Raman at THz shifts,
which neither model carries.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…n SEP 7

Records the maintainer's decision (D7): the modified noise model is kept
as it is, with no new work, and whether it stays is decided when SEP 7
settles whether gain media need its separate noise-injection path. The
roadmap gains an item for that decision, and SEP 7's ASE section notes
that stochastic ASE needs the noise to see only the emission gain, as in
Chen and Wise's split, or a gain Langevin term.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Accepted by John Travers with the 10 % tie margin of the integrator rule,
after his human review, the GPT-6 AI review and the response to it, with
decisions D1-D7 recorded. Part I is frozen from this revision; the SEP
moves to the roadmap's accepted proposals and the index shows its status.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@jtravs jtravs changed the title SEP 37: shot noise on by default, and an integrator and tolerances for each interface (draft) SEP 37: shot noise on by default, and an integrator and tolerances for each interface Oct 26, 2026
@codecov

codecov Bot commented Oct 27, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

jtravs and others added 19 commits October 27, 2026 00:11
Every prop_* interface and Simulation.from_* constructor now takes
noise="default", which resolves to the input model wherever the run can
carry noise. Under single precision it resolves to none and records why,
and a seed beside that fallback is refused; the hybrid planar route
records that it carries none. An interior launch keeps a default draw off
the spectrum it is given, while an explicit input draw now enters at the
launch: a backend adds the input realisation at the run's launch position
rather than at z = 0, which leaves resumes as they were.

The resolution (requested model, resolved model, reason) travels on the
Simulation, through derived runs and into RunMetadata.noise_resolution at
output schema 26, beside the resume hash. The start-of-run summary marks a
default model and gives a fallback's reason.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The shot-noise guide now explains where one photon per mode comes from,
what the input model gets wrong and by how much, why the modified model
is not the default, what noise costs, the resolution rules and the
floor-subtracted spectrum. The interior-launch, coupling and Luna pages
follow the new default, and the changelog records it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… (SEP 37)

Tutorials execute in every docs build, so each driver call now says what
it wants under the input-noise default: a fixed seed for the microjoule
capillary and filament lessons, and noise=None for the linear and
low-energy demonstrations, the route comparisons and the soliton
recurrence, where a one-photon seed is a visible share of the field or
would multiply a low-energy GNLSE run's steps.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The microjoule capillary and wall examples take a fixed seed; the
nanojoule taper comparisons, the 1 pJ moving guide and the precision
comparison switch noise off, since their lessons are noiseless. Their
committed outputs are refreshed once the remaining defaults land.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The input draw is part of the entrance state, so a coherent wall, the
taper coupling, a split block and a moving guide propagate it like any
field. The modified model keeps every coupled-flow refusal, at the
translation layer and in the shared backend admission. Each route's
entrance basis is orthonormal in true power: the capillary HE_1m set by
its Bessel orthogonality and per-mode normalisation, a general guide by
check_noise_basis. Tests on numpy_ref check one photon per channel and
bin at the entrance and the exit-energy identity per realisation, and
numba_cpu parity to rounding.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The input draw is part of the launch, so the atom is driven by the pulse
plus the draw inside its gated window, on the active band the source is
certified over. The modified draw, kept apart from the drive, stays
refused at admission, at the seam's own check and in the driver. Tests
with the manufactured zero-current binding check that the entrance drive
is the pulse's plus the draw's, that the realisation is recorded, that
the draw occupies exactly the certified band and drives the atom far
below the weak-field consistency check's intensity.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
get_spectral_density(noise_floor='subtract') removes the stored input
realisation's energy, one photon per active bin and channel in the
route's own measure, before the polarisation sum, and returns the signed
remainder. It refuses a run without noise and a modified run by name.
get_spectrum takes the keyword but refuses 'subtract': the floor is a
power and no amplitude has the signed density as its modulus squared.
spec_1d masks non-positive values on a log axis and, with prop_2d,
passes the keyword through. Tests check the unpropagated identity, the
equality with the modified run's corrected readout to rounding on a
lossless Kerr and Raman GNLSE fibre, and the refusals.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… (SEP 37)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every driver call in the test suite that named neither noise nor seed was
written for a noiseless run; it now says noise=None, so the deterministic
references it checks stay what they were.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Calls that pass their keywords through a mapping now spread
{"noise": None, **kw}, so a run the mapping does not give a noise keeps
its noiseless reference; the schema-version asserts read 26.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Constructors handed to helpers, subprocess programs and the historical
schema lineages now say noise=None where they pin a noiseless record;
spoilers that relied on input noise being refused beside a coupled flow,
at an interior launch or beside the TDSE use the modified model, which
still is. The benchmark builders fix their seeds and keep the default
noise, except the smoke case, which stays noiseless.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Luna witness run passed noise twice; the schedule calibration and the
fibre splice on the manual pages are noiseless lessons, and the floor
snippet builds its own seeded run.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
From phase 0's matched-accuracy rule, provisional pending the maintainer's
approval: prop_gnlse and prop_waveguide default to RungeKutta(), with the
GNLSE rtol 1e-7 (was 1e-8) and the waveguide rtol 1e-5 (was 1e-6), each
from the convergence protocol. prop_capillary keeps Multistep() and 1e-6
(CAPILLARY_RTOL), since the rule's aggregate and the main workload split.
SimulationSettings' controller is now optional: prop_radial and
prop_planar fill an omitted one with SPATIAL_RTOL 1e-5 and atol 0, an
explicit controller always wins, a free-space run without one is refused
(not measured), and a Simulation built directly still needs one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d 1 reports

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
jtravs and others added 8 commits October 27, 2026 03:41
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…efaults

prop_gnlse and prop_waveguide now default to the Runge-Kutta march; the
tests of the Adams history, its snapshots and memory admission, the
interrupt checkpoints and the step planes pin Multistep(), and the
schema-21 record keeps the GNLSE tolerance it was taken at.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The edited examples (seeds or noise=None) and the graded-index example,
whose prop_waveguide default is now the Runge-Kutta march, were executed
on the native backend (an AMD EPYC 7763 node; the single-precision
example on an Apple M5 Max, which it needs). Their figures carry the
default noise where it is on.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…oc format

The native thread-invariance and parity tests, and the native z-table
helper, keep their noiseless runs explicit; the GNLSE area-path landing
test names the Adams march it was qualified on; ruff formats the floor
snippet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
jtravs and others added 12 commits October 27, 2026 08:42
…usals

By the maintainer's decision (SEP 37, D8), a capillary run with the TDSE
response resolves the default to no noise, recorded as TDSE_NOISE, and an
explicit noise model beside it is warned on. The tests narrow the now
optional controller and the optional noise for the type checker, and a
new module covers each interface's defaults and the two controller
refusals that coverage reported.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…fault

By the maintainer's decision (SEP 37, D9): a Cartesian or line run that
names no integrator takes RungeKutta(), since the Adams history's memory
rules the multistep method out there, an omitted controller takes
FREE_RTOL, and the default noise resolves to none (FREE_NOISE).
SimulationSettings records whether an integrator was named; the
choosing-a-stepper page tabulates every interface's integrator,
tolerances and noise. FREE_RTOL is provisional pending its measurement.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
By the maintainer's decision: a capillary run with two or more resolved
modes or the TDSE response takes Multistep() and CAPILLARY_RTOL (1e-6);
one resolved mode or a mode-averaged one takes RungeKutta() and
SINGLE_MODE_RTOL (1e-5). The exponential Adams method carries the
intermodal beat of resolved modes in its propagator, where the Runge-Kutta
march's steps shorten 3.7x going from one resolved mode to four.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…EP D10

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… (SEP 37)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… tests relied on the old capillary default

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ms march

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…P 37, D9)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… (SEP 37, D11)

Reverts the representation rule of D10. Re-measured on the worked
examples, Multistep() at CAPILLARY_RTOL was faster on the Kerr-only
single-mode runs (1.2-1.75x) and on the dispersive Kerr scan (3.6x), and
more accurate at its default tolerance; RungeKutta() won only on long
Raman and plasma runs, which the docstrings now name.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rsive Kerr costs more per step (SEP 37, D11)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@jtravs
jtravs marked this pull request as ready for review October 27, 2026 12:10
Copilot AI balanced review requested due to automatic review settings October 27, 2026 12:10
@jtravs
jtravs merged commit 2e48235 into main Oct 27, 2026
31 checks passed

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants