V0.8 Scope Freeze#
Summary#
v0.8 is the first weak-form numerics release for pdelie.
Its purpose is:
add a narrow stable weak residual path for the existing scalar 1D Heat/Burgers regime, with deterministic clean/noisy/coarse robustness comparisons against the current spectral/analytic path, while preserving canonical data and generator-family contracts.
v0.8 is intentionally narrow.
It is not a broad numerics, PDE-zoo, or adapter release.
Stable Scope#
Stable v0.8 scope is limited to:
pdelie.residuals.evaluate_weak_heat_residual(...)pdelie.residuals.evaluate_weak_burgers_residual(...)window-indexed weak residual reports rather than field-shaped residual arrays
canonical scalar 1D uniform periodic
FieldBatchinputs onlyHeat and Burgers only
deterministic clean/noisy/coarse robustness comparisons against the current
spectral_fd/ analytic path
Stable v0.8 release definition:
canonical FieldBatch -> stable weak residual report APIs for Heat/Burgers -> deterministic clean/noisy/coarse robustness comparisons against the current spectral/analytic path
Exact Public API Contracts#
Planned stable public APIs:
evaluate_weak_heat_residual(field, *, diffusivity: float | None = None) -> dict[str, Any]evaluate_weak_burgers_residual(field, *, diffusivity: float | None = None) -> dict[str, Any]
These are stable runtime report-style APIs under pdelie.residuals.
Weak Residual Output Family#
Frozen output-family rules:
the primary output is a window-indexed report
the stable output shape is
(batch, time_window, x_window, var)the stable scalar slice keeps
var = 1the report is not a field-shaped residual array
the exact top-level report keys are:
equationequation_formmethod_familywindow_residualstime_window_centersx_window_centersnormalizationdiagnostics
equation = "heat_1d"or"burgers_1d"equation_form = "nonconservative"for Heatequation_form = "conservative"for Burgerswindow_residualshas shape(batch, n_time_windows, n_x_windows, 1)time_window_centersandx_window_centersstore the physical coordinates of the window-center indicesdiagnosticsincludes exactly:strong_formweak_formdiffusivitytime_window_sizex_window_sizetime_window_stridex_window_stridequadraturetest_functionperiodic_x_wrappingwindow_countsmax_abs_residuall2_residual
Weak Method Family#
Frozen method-family rules:
local compact spacetime windows
separable polynomial test functions
integration by parts shifts derivatives off
uwhere the frozen PDE identity allowsthe frozen base bump is:
beta(s) = (1 - s^2)^2for|s| <= 1beta(s) = 0for|s| > 1
the frozen bump derivatives are:
beta'(s) = -4s(1 - s^2)for|s| <= 1, else0beta''(s) = -4 + 12s^2for|s| <= 1, else0
the frozen separable test function is:
phi(t, x) = beta(s_t) * beta(s_x)
the frozen local coordinates are:
s_t = (t - t_c) / h_ts_x = (x_local - x_c_local) / h_x
the frozen window sizes are:
time window size =
5grid pointsx window size =
9grid points
the frozen half-widths are:
time half-width =
2time steps, soh_t = 2 * dtx half-width =
4x steps, soh_x = 4 * dx
local support maps exactly to
[-1, 1]in both coordinatesthe frozen test-function derivatives are:
d_t(phi) = (1 / h_t) * beta'(s_t) * beta(s_x)d_x(phi) = (1 / h_x) * beta(s_t) * beta'(s_x)d_xx(phi) = (1 / h_x^2) * beta(s_t) * beta''(s_x)
the frozen window geometry is:
time stride =
1x stride =
1time windows use full support only and are centered on interior time indices
x windows are centered on every x index
no time padding, interpolation, or extrapolation is allowed
periodic x windows are defined by integer index offsets, not raw coordinate subtraction:
x offsets are
[-4, -3, ..., 4] * dxsample indices are taken modulo
num_pointsx_window_centersstores the physical coordinate of the center indexlocal x support and derivatives are evaluated from these wrapped index offsets
the frozen quadrature is the composite tensor-product trapezoidal rule on the native window grid
the frozen normalization is
normalization = "none"window_residualsstore signed weak residual values, not absolute valuesthe frozen method identifier is
method_family = "local_separable_quartic_bump_trapezoid_v1"
v0.8 does not commit to a broad user-configurable weak-form framework.
PDE Identities#
Frozen PDE-identity starting points:
Heat starts from
u_t - nu u_xx = 0Burgers starts from conservative form
u_t + 1/2 (u^2)_x - nu u_xx = 0the frozen Heat weak integrand is
-u * d_t(phi) - nu * u * d_xx(phi)the frozen Burgers weak integrand is
-u * d_t(phi) - 1/2 * u^2 * d_x(phi) - nu * u * d_xx(phi)the frozen report strings are:
Heat:
strong_form = "u_t - nu u_xx = 0"weak_form = "-u phi_t - nu u phi_xx"
Burgers:
strong_form = "u_t + 1/2 (u^2)_x - nu u_xx = 0"weak_form = "-u phi_t - 1/2 u^2 phi_x - nu u phi_xx"
boundary terms vanish because:
the compact bump vanishes at local time-window endpoints
the compact bump vanishes at local x-window endpoints
x sampling is periodic and wrapped by index
M2 must preserve these signs exactly and must not flip residual orientation
Scope Limits#
Stable v0.8 scope is further limited to:
canonical
FieldBatchonlydims exactly
("batch", "time", "x", "var")uniform time only
uniform periodic rectilinear
xonlyfinite unmasked values only
scalar
varonlyat least
5time pointsat least
9x pointsdiffusivity=Nonemeans usefield.metadata["parameter_tags"]["nu"]Heat/Burgers only
Explicit Non-goals#
Out of stable v0.8 scope:
no stable weak derivative API
no stable
ResidualBatch/ResidualEvaluatorintegrationno per-term public contribution arrays
no stable KdV API
no multidimensional expansion
no multivariable expansion
no nonuniform-grid support
no operator-method expansion
no adapter expansion
no imported-field parity requirement in M1
no new canonical object
Benchmark Fixtures#
Frozen v0.8 M1 benchmark fixtures use only the existing native generators and robustness utilities.
Shared base sizes:
batch_size = 2num_times = 33num_points = 64
Frozen fixtures:
Heat clean:
generate_heat_1d_field_batch(seed=8001, batch_size=2, num_times=33, num_points=64)
Heat noisy:
clean Heat fixture +
add_gaussian_noise(std_fraction=1e-3, seed=8002)
Heat coarse:
clean Heat fixture +
subsample_time(stride=2)thensubsample_x(stride=2)
Burgers clean:
generate_burgers_1d_field_batch(seed=8101, batch_size=2, num_times=33, num_points=64)
Burgers noisy:
clean Burgers fixture +
add_gaussian_noise(std_fraction=1e-3, seed=8102)
Burgers coarse:
clean Burgers fixture +
subsample_time(stride=2)thensubsample_x(stride=2)
Imported FieldBatch parity is explicitly deferred from M1 to M4.
Frozen v0.8 M4 downstream robustness fixtures are separate from the M1 report-surface fixtures.
They benchmark downstream translation fitting and held-out verification, not raw residual magnitudes.
Shared M4 downstream settings:
train_batch_size = 4heldout_batch_size = 3num_times = 33num_points = 64noise_std_fraction = 1e-3coarse degradation is exactly:
subsample_time(stride=2)then
subsample_x(stride=2)
the wrong-generator control is fixed to the affine non-translation coefficient row:
[0.0, 0.0, 1.0, 0.0]
Frozen M4 Heat fixtures:
clean training:
generate_heat_1d_field_batch(seed=8401, batch_size=4, num_times=33, num_points=64)
clean heldout:
generate_heat_1d_field_batch(seed=8402, batch_size=3, num_times=33, num_points=64)
noisy training:
clean Heat training +
add_gaussian_noise(std_fraction=1e-3, seed=8403)
noisy heldout:
clean Heat heldout +
add_gaussian_noise(std_fraction=1e-3, seed=8404)
coarse training:
clean Heat training +
subsample_time(stride=2)thensubsample_x(stride=2)
coarse heldout:
clean Heat heldout +
subsample_time(stride=2)thensubsample_x(stride=2)
Frozen M4 Burgers fixtures:
clean training:
generate_burgers_1d_field_batch(seed=8501, batch_size=4, num_times=33, num_points=64)
clean heldout:
generate_burgers_1d_field_batch(seed=8502, batch_size=3, num_times=33, num_points=64)
noisy training:
clean Burgers training +
add_gaussian_noise(std_fraction=1e-3, seed=8503)
noisy heldout:
clean Burgers heldout +
add_gaussian_noise(std_fraction=1e-3, seed=8504)
coarse training:
clean Burgers training +
subsample_time(stride=2)thensubsample_x(stride=2)
coarse heldout:
clean Burgers heldout +
subsample_time(stride=2)thensubsample_x(stride=2)
Frozen M4 degraded-data success rule:
M4 compares downstream translation recovery and held-out verification, not direct weak-report-vs-strong-residual magnitudes.
Clean-data baseline requirements:
both the strong path and the weak path must be deterministic on repeated runs for Heat and Burgers
both paths must return either:
translation coefficients within
DEFAULT_TRANSLATION_SPAN_TOLERANCEof the canonical translation reference, oran explicit canonical translation reference fallback
both paths must achieve a first-epsilon wrong-vs-fitted median separation ratio of at least
5.0xon clean Heat and clean Burgers
Degraded-data robustness requirements:
for each PDE separately, at least one degraded condition in
{noisy, coarse}must produce a weak-path robustness signala weak-path robustness signal exists only if the weak path is deterministic on repeated runs and one of the following is true:
contract-stability signal:
the weak path returns in-tolerance translation coefficients or an explicit canonical translation reference fallback, and
the strong path does not
separation signal:
the weak-path first-epsilon wrong-vs-fitted median separation ratio is at least
1.5xthe strong-path ratio, andthe weak-path ratio is at least
3.0x
M4 does not require the weak path to beat the strong path on every degraded fixture.
Imported
FieldBatchparity for M4 should reuse these same frozen fixtures after canonical ingestion, not introduce a second benchmark matrix.
Milestones#
Planned v0.8 sequence:
Milestone 0 — roadmap reset
Milestone 1 — weak semantics freeze
Milestone 2 — weak residual report implementation
Milestone 3 — optional contract-integration exploration
Milestone 4 — robustness comparison layer
Milestone 5 — optional KdV stress
Milestone 6 — release gate