# 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 `FieldBatch` inputs only - Heat 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 = 1` - the report is not a field-shaped residual array - the exact top-level report keys are: - `equation` - `equation_form` - `method_family` - `window_residuals` - `time_window_centers` - `x_window_centers` - `normalization` - `diagnostics` - `equation = "heat_1d"` or `"burgers_1d"` - `equation_form = "nonconservative"` for Heat - `equation_form = "conservative"` for Burgers - `window_residuals` has shape `(batch, n_time_windows, n_x_windows, 1)` - `time_window_centers` and `x_window_centers` store the physical coordinates of the window-center indices - `diagnostics` includes exactly: - `strong_form` - `weak_form` - `diffusivity` - `time_window_size` - `x_window_size` - `time_window_stride` - `x_window_stride` - `quadrature` - `test_function` - `periodic_x_wrapping` - `window_counts` - `max_abs_residual` - `l2_residual` --- ## Weak Method Family Frozen method-family rules: - local compact spacetime windows - separable polynomial test functions - integration by parts shifts derivatives off `u` where the frozen PDE identity allows - the frozen base bump is: - `beta(s) = (1 - s^2)^2` for `|s| <= 1` - `beta(s) = 0` for `|s| > 1` - the frozen bump derivatives are: - `beta'(s) = -4s(1 - s^2)` for `|s| <= 1`, else `0` - `beta''(s) = -4 + 12s^2` for `|s| <= 1`, else `0` - 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_t` - `s_x = (x_local - x_c_local) / h_x` - the frozen window sizes are: - time window size = `5` grid points - x window size = `9` grid points - the frozen half-widths are: - time half-width = `2` time steps, so `h_t = 2 * dt` - x half-width = `4` x steps, so `h_x = 4 * dx` - local support maps exactly to `[-1, 1]` in both coordinates - the 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 = `1` - x stride = `1` - time 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] * dx` - sample indices are taken modulo `num_points` - `x_window_centers` stores the physical coordinate of the center index - local 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_residuals` store signed weak residual values, not absolute values - the 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 = 0` - Burgers starts from conservative form `u_t + 1/2 (u^2)_x - nu u_xx = 0` - the 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 `FieldBatch` only - dims exactly `("batch", "time", "x", "var")` - uniform time only - uniform periodic rectilinear `x` only - finite unmasked values only - scalar `var` only - at least `5` time points - at least `9` x points - `diffusivity=None` means use `field.metadata["parameter_tags"]["nu"]` - Heat/Burgers only --- ## Explicit Non-goals Out of stable `v0.8` scope: - no stable weak derivative API - no stable `ResidualBatch` / `ResidualEvaluator` integration - no 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 = 2` - `num_times = 33` - `num_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)` then `subsample_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)` then `subsample_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 = 4` - `heldout_batch_size = 3` - `num_times = 33` - `num_points = 64` - `noise_std_fraction = 1e-3` - coarse 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)` then `subsample_x(stride=2)` - coarse heldout: - clean Heat heldout + `subsample_time(stride=2)` then `subsample_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)` then `subsample_x(stride=2)` - coarse heldout: - clean Burgers heldout + `subsample_time(stride=2)` then `subsample_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_TOLERANCE` of the canonical translation reference, or - an explicit canonical translation reference fallback - both paths must achieve a first-epsilon wrong-vs-fitted median separation ratio of at least `5.0x` on 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 signal - a 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.5x` the strong-path ratio, and - the 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 `FieldBatch` parity 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