Repository navigation
Conversation
ADR-077 retires the benchmark-only Adams variants (PECE, explicit Adams-Bashforth, the matched pairs and the Hermite dense interpolant), host/general.py, milne_factor, defect_integral, the Corrector and Interpolant types, Multistep.corrector/corrector_nodes and IntegrationSpec.reference_only. The engine's start() loses its stored flag. Tests that used the PEC variants move to Multistep with the same order and formulation. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ADR-077: a subclass of PIController is refused when it is defined, so native's _CONTROLLER_DECISIONS check and its refusal tests go; one test pins the refusal at class definition. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ADR-077: CoherentWall loses method, growth_limit and fallback; translate.coupled loses cf4_flow, cf4_defect, cf4_growth_bound and the CF4 constants; the reference's CF4 action and growth check, the driver's wall-cf4-numpy-ref rule, the recipe rows, native's _FLOW_METHODS and the shared list's flow_methods parameter go. The frozen-residual split stays the varying wall's integrator. CF4-only tests are deleted; mixed ones keep their frozen-split halves. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CompiledResponses already refused any tuple but (envelope_plasma,), so the tuple, Flags.has_spectral_responses and the three refusals that read them could not be reached. envelope_plasma carries the leaf. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
solprop computes in binary64 only (ADR-077). The precision keyword, the reference's binary32 path, translate.precision and its refusals, the summary's precision row, the native build record's precision and the single-precision guide page and gallery example go. The hashed configuration still records precision "double" until its own commit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
RegionalResponseTables refuses a delayed term count other than DELAYED_TERMS, or delayed terms off three components, when the record is built; the reference's and native's duplicate refusals go, and DELAYED_TERMS moves beside the leaf. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A plasma_gated problem flag selects, on the field plasma column, w(t) times the current's running integral (trapezoid or band rule) added to the local polarisation, in place of the held current's streams, as numpy_ref's _column_sources does. Both refusals go; the Luna witnesses that use the hook run on the test backend with unchanged tolerances, and parity tests hold native to numpy_ref for one evaluation, one step and eight steps on every plasma route. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
numpydoc asks a dunder with **kwargs to document them; the refusal needs none. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There are exactly two backends, native and numpy_ref, with no plugin rows or tiers (ADR-077). BackendEntry, BACKENDS, REMOVED_BACKENDS and FAR_FIELD_BACKENDS go; a name that is neither backend, numba_cpu and mlx included, raises BackendError naming both, and recorded names in old output still load. The retired-backend runs, their stored files and the recipe grid's transforms tombstone go with them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…form Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every run is binary64, so the configuration no longer records it. The resume key changes once (ADR-077): a run started on an earlier release finishes on that release. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…emoval Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> # Conflicts: # docs/dev/backends.md # docs/guide/performance/backends.md # src/solprop/backends/registry.py # tests/driver/test_resume_history.py
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The adapter already imports solprop. _topology reads sysctl through the same reader, and the native-count tests move to the native test root. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
translate.admission.check_general_route runs in the problem's own validation, so each refusal has one raise site for both backends (a TranslationError naming solprop); refuse_general_leaves, written for a separately built backend, goes. node_kerr_tensor, node_kerr_form and node_delayed_maps move to translate.general, and the general node chunk to backends.node_chunk. Native imports neither from numpy_ref. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
backends.populations keeps what both backends read (axis_refusal, axis_node); the scan through the reference passes moves, so importing the native adapter no longer loads numpy_ref at all. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CallLedger, budget_error, the history entry (now Derivative) and source_absent are what native keeps too; the rest of the Adams module is the reference's host march and moves to numpy_ref/multistep.py. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A stage can no longer be named without its leaf, so native's omitted-stage refusal and the reference passes' missing-leaf refusals go. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
coupled_flow_factors freezes and decomposes each section on its active bins; the reference's _coupled_flow_maps and native's _decomposed_flow both read it, adding only their own masks and the eigenbasis. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The retired comparison variants took the stored flag with them; the fake engine still asked for it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The frozen tables of tests/backends/test_driver.py hold the seam; the monitor trace tests keep the watch policy's and state's names locally. check_build keeps the source digest and the build's own checks. 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>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Adams settings' own DriverError went with the plugin rows. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The settings test still expected the Adams march's refusal of a third backend, which the two-backend registry refuses first. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
check_regional_responses, in translate.general, is the one rule: the problem's validation and node_kerr_tensor, node_kerr_form and node_delayed_maps all call it, so no tensor is built from a record the route cannot read. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
As admission.py documents: each leaf's type and its rows against its own axes are checked first and refused by name, so a malformed hand-built leaf meets a TranslationError, not an indexing error. The CoupledFlowTables docstring names where its refusal now is. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
precision (ADR-077; precision = "double" is dropped so old recipes load), a grid's transforms (SEP 47) and CoherentWall's method, growth_limit and fallback (CF4) are refused with why they went and what to do, not as unknown keys. 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>
A window and a kernel of protocol 1 and 2 are refused by version at the handshake, not by a missing key. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The engine's invalid_argument stays as a safety net; the adapter names the refusal before anything is built. The Problem flag already says it is test-only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Nothing reassigns an entry's fields, so the record is frozen; the problem source_absent reads is a PropagationProblem. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
_CoupledFlow and _HostFlow extend the shared factors with their own fields only, instead of copying each one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Their pages went with ADR-077; the archived records keep the names. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…maries Conflicts: the retired precision module stays deleted; responses.py keeps the derived response order and the delayed-channel check on the diet's frozen copies; the size budget takes the diet's headroom rule with this branch's figures. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ledger, numpy_ref's multistep and populations, and translate's admission join the figure; host/general, numpy_ref/admission and backends/multistep leave it. Regenerated with poe figures. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ADR-077 refuses a name that is neither backend when the member's settings are built, by name, before any batch forms. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…opy" This reverts commit f8387ab.
Restores the AGENTS.md rule the reverted thread-budget change broke: the wheel's smoke test imports it with no solprop installed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- test_native_error_norm: the reference's _propagator hook was inlined with single precision; the test forms exp(exponent) itself, as the hook did. - test_batch_validation: match the reworded no-runner refusal, same phrases. - test_numpy_ref_raman: the no-leaf refusal in _raman_thg is unreachable now that response_order is derived from the leaves; the test asserts that derivation (stage present exactly when raman_terms is non-empty). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HAYtF5P9QqEd3HQx3WJkA3
Codecov Report❌ Patch coverage is
📢 Thoughts on this report? Let us know! |
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stacked on #766 (
chore/docstring-diet): review that first; this PR's diff is against it.Implements ADR-077 ("Two backends, binary64 only",
docs/dev/decisions.md): retires single and mixed precision, the backend tiers and plugin rows, and the reference-only methods native refused by name, and decouples the native adapter fromnumpy_ref.The decisions (ADR-077)
native(required, whatautoselects, CPUs and GPUs, every feature but the TDSE response) andnumpy_ref(the numerical reference). No tier system, no plugin rows, no other backend.numpy_ref's end state is a slim test and development reference, specified by a later SEP; until then ADR-068's rules stand (a feature lands on both backends;Finalneeds parity onnumpy_refand native CPU).ComparisonMultistepwith its Hermite and Milne variants, andPIControllersubclasses that override its decisions (PIControlleris final).Lane A: binary64 only, two backends, the precision key
numpy_ref/single.py,numpy_ref/transforms.py,translate/precision.py, theprecision=keyword everywhere it was accepted (Simulation,prop_*, recipes, service, GUI), the precision refusals andBuildInfo.precision, the single-precision guide page, gallery example and recipe example.backends/registry.pyto a fixed table of the two backends: noBackendEntry, plugin loading,FAR_FIELD_BACKENDSorREMOVED_BACKENDS(a recorded retired name still opens and resumes a file)."precision"key from the run record (precision-resume-key.breaking.md).tests/backends/test_single_precision.py,tests/translate/test_precision.py,tests/driver/test_retired_backend_runs.pyandtests/data/retired_backends/; and, by name (each kept, adapted or removed with its reason in the lane's record):test_summary::test_precision_is_the_state_s,test_monitor::test_a_single_precision_split_reads_the_physical_removal,test_grid::test_a_single_precision_interface_grid_is_the_double_onetest_interface_defaults:test_the_single_precision_tolerance_rule,test_single_precision_admits_the_adams_method,test_a_default_tolerance_is_resolved_again_in_the_other_precision,test_a_named_tolerance_is_kept_in_the_other_precision,test_a_copy_in_single_precision_resolves_auto_again(removed); four more adapted and renamedtest_plane_adoption::test_a_kept_single_precision_plane_never_changes,::test_the_widened_single_precision_state_is_owned_and_has_the_same_bits;test_session_records::test_an_owned_single_precision_field_is_converted_once_and_left_alone;test_transverse_backends::test_numpy_ref_s_binary32_path_carries_the_radial_collar"single"/complex64parametrisations oftest_transverse_monitor,test_plane_adoption,test_resume_history,test_reference_independence,test_metadata,test_destination_export,test_interface_defaultstest_group_seam::test_a_registered_backend_runs_its_own_group_through_the_seam,::test_the_lockstep_runner_is_the_registered_row_s,::test_a_row_without_a_device_is_refused_a_required_device_by_name;test_registry::test_construct_refuses_a_registry_entry_without_an_implementationLane B: retire the reference-only methods; native gated plasma form
ComparisonMultistepand the reference's general Adams path (Hermite, Milne, PECE, matched pairs) are removed;Multistepis the one Adams method.PIControlleris@final, so native's controller-override refusal goes.translate/coupled.py,_cf4_action,CoherentWall.method/fallback/growth_limit, their capability and recipe rows) are removed.spectral_responsesleaf andhas_spectral_responsesflag go; the delayed-response channels are checked once, at translation.tests/translate/test_cf4.py(whole module) andtests/test_display/CoherentWallCF4.txt; andtest_exponential_march::test_comparison_variants_keep_the_interaction_formulation,test_multistep_march::test_an_unfused_method_holds_no_history_rows,::test_dense_observation_matches_landing,::test_variable_order_pece_one_order_higher_takes_the_general_path,test_native_march_admission::test_every_comparison_variant_is_refused_before_allocation,test_native_resume_history::test_a_march_that_cannot_carry_its_history_warns_on_resume,test_resume_history::test_the_general_path_refuses_a_snapshot_it_cannot_install,test_sep12_sep14_integration::test_corrected_provider_failure_checkpoints_the_previous_accepted_state,tests/stepper/test_multistep.py(test_any_change_to_a_comparison_variant_restarts_its_history,test_defect_constants_and_milne_factor,test_multistep_name,test_multistep_refuses_out_of_range),test_run_request::test_only_the_comparison_family_is_reference_onlytest_native_rk_admission::test_a_controller_that_overrides_a_decision_is_refused_before_allocation,test_native_session::test_a_reference_only_run_reaches_no_sessiontest_coherent_capillary(test_a_cf4_*,test_cf4_*,test_the_growth_guard_*,test_the_executor_and_the_estimator_*,test_the_step_doubling_defect_*,test_the_vector_taper_converges_at_each_methods_own_order,test_a_mixed_flow_runs_each_section_by_its_own_method,test_prop_capillary_runs_a_cf4_wall_end_to_end_and_records_its_guards,test_the_reference_measures_the_cf4_factors_against_the_declared_bound,test_the_cf4_record_needs_its_declaration),test_moving_guide::test_the_reference_refuses_a_cf4_flow_beside_moving_maps,test_native_coupled_flow::test_cf4_is_refused_by_name_at_the_backend_and_the_entry_point,native/tests/test_coupled_flow.py::test_cf4_is_refused_by_name,test_exponential_march::test_the_formulation_refuses_a_cf4_section,test_admission::test_a_section_method_the_caller_has_not_built_is_refused_by_its_namenative/tests/test_backend.py::test_unsupported_contracts_are_refused_by_name,test_numpy_ref_backend::test_a_declared_term_this_backend_cannot_execute_is_refused_by_nameLane C: decouple native from numpy_ref; seam deletions
Native's adapter now imports nothing from
solprop.backends.numpy_ref(git grep -n numpy_ref -- native/srcfinds only prose), and importingsolprop_native.backend,.sessionand.grouploads nonumpy_refmodule at all.What moved where:
numpy_ref.admission(refuse_general_route,refuse_coupled_flow, run under each backend's name)translate/admission.py,check_general_route, run once byPropagationProblem.validate(and sovalidate_run); aTranslationErrornaming solprop. Checksvalidatealready makes (the regional component count,n_polbeside tables, a response without tables) are not repeatedrefuse_general_leaves(for a separately built backend)numpy_ref.general_modal.node_kerr_tensor,node_kerr_form,node_delayed_mapstranslate/general.py, with no refusals of their own (validation has them)general_planned_chunk,general_node_chunk,general_dispersive_buffers,*_PER_GENERAL_NODEbackends/node_chunk.pynumpy_ref.backend.QUADRATURE_ALARMand two copies of the warningtranslate/modal.py:QUADRATURE_ALARMandwarn_quadrature, on thesolprop.translate.modallogger_coupled_flow_maps, native_decomposed_flow)translate/coupled.py:CoupledFlowFactors,coupled_flow_factors; each backend adds only its masks and native its eigenbasisbackends/multistep.pyCallLedger,budget_error,_Derivative,source_absentbackends/ledger.py(Derivativenow public)backends/multistep.py(reference-only)backends/numpy_ref/multistep.pybackends/populations.pyaxis_populations(through the reference passes)backends/numpy_ref/populations.py;axis_refusalandaxis_nodestay neutralCompiledResponses.response_order(stored)_refuse_omitted_stagesand the reference passes' missing-leaf and out-of-sequence refusals go*_FIELDStuples and_check_seaminsolprop_native/__init__.pytests/backends/test_driver.pyhold the seam, and the watch policy's and state's names live with the trace tests.check_buildkeeps the source digest and the build checksAlso: the generated
docs/auto_examples/index.rstdrops the deleted performance gallery;tests/data/shard_weights.jsondrops modules that no longer exist;docs/dev/backends.md§2/§3.8/§4,kernel-contract.md,architecture.md,native/AGENTS.md("Scope", public names) andnative/README.mddescribe the new homes; the size ratchets are tightened to this branch's figures; the Adams trace harness's fake engine takes lane B's one-argumentstart, and two settings tests that still expected the Adams march's refusal of a third backend now expect the registry's (test_compiled_multistep,test_multistep_march).docs/auto_examples/index.rstdrops the deleted performance gallery. One fullpoe docsbuild (sphinx-gallery regenerates the index on every build) wrote it byte for byte as committed. The same build found two archived SEPs (33 and 36) still linking the retired single-precision pages, now unlinked, and one unqualified cross-reference, now qualified.Not done, and why
_statistics.metric_refusal) stays in native. Moving it to translation would makenumpy_refrefuse statistics it computes today (test_a_varying_metric_s_statistics_are_refused_by_native_before_allocationasserts it does), and a run'sprepare(problem, request)path does not runvalidate_run, so translation alone would not cover a request's new statistics. It needsprepareto validate the request, a session change of its own.axis_refusalhas the same shape (four raise sites).modifiednoise model beside a coupled flow (split block, moving guide, coherent wall, intranslate/problem.py) remain beside the admission's; consolidating them changes three user-facing messages._require_initial_arrayis kept: the load copies the start withnp.ascontiguousarray(..., dtype=complex128), so without it acomplex64start would be upcast silently rather than refused, and the start is user-reachable. No other adapter re-check of whatexact_arrayenforces was found.native/src/general.cpp,flow_functions.hppandlagrange_basis.hppstill namebackends/multistep.py; editing them changes the source digest and needs a rebuild, so they are left for the next C++ change.backends/low_storage.pyimportsbackends/host/driver.py, so importing native still loads the reference's host driver module (notnumpy_ref); that goes withbackends/host/in SEP 49.Review fixes (after fdd6989)
node_kerr_tensor,node_kerr_form,node_delayed_maps) call the same rule as the admission,translate.general.check_regional_responses, so no tensor is built from a record the route cannot read.PropagationProblem.validatechecks the general leaves' consistency first, asadmission.pydocuments, then the route's policy. A leaf of the wrong type (translate.admission.check_leaf_types) or a mis-shaped certificate row (ModalMetricTables.check_rows) is refused by name. Tests that spoiled leaves past the old order now freeze their arrays or name the structural refusal.recipe.registry.RETIRED_KEYWORDS):precision(binary64 only;precision = "double"is dropped so old recipes load), a grid'stransforms(SEP 47), andCoherentWall'smethod,growth_limitandfallback(CF4). The changelog notes agree. The GUI needs no migration: a saved double-precision document loads, a single-precision one is refused with the reason, and an unavailable backend is already shown as named until another is picked.run_optionsreply's new shape is refused by version at the handshake.BackendErrorbefore building; the engine's check stays as a safety net, and theProblemflag is already commented as test-only (no C++ changed).Derivativeis documented and frozen (nothing reassigns its fields);source_absenttakes aPropagationProblem.response_orderis afunctools.cached_property._CoupledFlowand_HostFlowextendCoupledFlowFactorswith their own fields only.Kept:
native/src/solprop_native/_budget.py. Replacing the copy with imports fromsolprop._processwas reverted (80dd994): the native wheel must import without solprop, and its isolated smoke test (native-wheel, thepython-3-15wheel lanes) failed withModuleNotFoundError: No module named 'solprop'.native/AGENTS.mdsays so again.Breaking changes
precision=is gone fromSimulation,prop_*, recipes and the service;BuildInfo.precisionis gone.CoherentWall(method=..., fallback=..., growth_limit=...)and the"cf4"section method are gone.ComparisonMultistepis gone;PIControlleris final (subclassing it raisesStepperError)."precision"key and CF4's settings leave the configuration): a run started on an earlier release finishes on it.TranslationErrors from the problem's validation (previously each backend'sBackendError);solprop.backends.numpy_ref.admissionis removed; moved names are listed inchangelog.d/native-numpy-ref-decoupled.breaking.md.CompiledResponses(response_order=...)is no longer accepted: the order is derived from the leaves.solprop_nativeno longer exports the*_FIELDStuples.Verification
On the shared Mac, targeted only: ruff check and format, basedpyright (0 errors), native strict pyright (0 errors),
poe docstrings,poe size-check, codespell on the changed files,git diff --check,poe changelog-check. Tests with-n 4on every changed module, among themnative/tests/test_api_contract.py,test_backend.py,test_general_modal.py,test_coupled_flow.py, andtests/backends/test_admission.py,test_general_modal.py,test_driver.py,test_node_chunk.py,test_native_march_traces.py,tests/driver/test_coherent_capillary.py,test_native_flow_refusals.py,test_native_flow_session.py,test_native_coupled_flow.py,test_native_flow_marches.py,test_moving_guide.py,test_split_block.py,tests/sessions/test_native_quadrature_alarm.py,test_native_load.py,test_native_session.py,test_native_session_statistics.py,tests/translate/test_problem.py,test_general_leaves.py,test_general_route.py,test_compiled_responses.py, the exponential and Adams march modules,tests/test_process.py. No C++ changed, so native was not rebuilt. No tolerance changed. The full, slow and coverage lanes are left to CI.Size
git diff --shortstat chore/docstring-diet: 254 files changed, 3496 insertions(+), 16623 deletions(-) (lane C alone, from the merge of the diet: 108 files changed, 2278 insertions(+), 3265 deletions(-))poe sizeon this branch:🤖 Generated with Claude Code