SSB architecture#
Public contract#
quantem.gpu.SSB is the scientist-facing SSB compute entry point. CUDA and
MPS are its execution backends, not separate APIs. The browser engine in
direct_ptycho/webgpu is a separate runtime that applications bundle; it is not an
DirectPtycho(backend=...) option.
from quantem.gpu import DirectPtycho
with DirectPtycho.open(
"scan_master.h5",
backend="mps",
voltage_kV=300,
semiangle_mrad=30,
scan_sampling_A=(0.5, 0.5),
scan_detector_rotation_deg=351.8,
) as ptycho:
result = ptycho.fit_aberrations(save_dir="results/ssb")
The public units are fixed: kV, mrad, angstrom, nanometres for C10_nm and
C12_nm, degrees for phi12_deg and the scan-detector rotation, and
(row, col) for all coordinates. Missing required data raises a deterministic error; adapters do
not probe loosely named attributes.
SSBResult owns optimizer metadata and the final complex object wave, and
derives object phase and amplitude from that wave. There is no separate fit or
phase-evaluation result class.
Backend geometry and browser transport use private typed records such as
BrightfieldDisk and SSBExportState. They are integration details and are
not exported from quantem.gpu or quantem.gpu.direct_ptycho.
The scientific defaults are 200 trials, the least-squares agreement of the SSB
model with the full-BF evidence fitted with the sample tilt and depth spread
(fit_aberrations()), refinement on exact derivatives (refinement="auto"),
float32 real values, and complex64 object values. One vocabulary names the fit
methods, on every backend that fits:
Call |
Objective |
Search and refinement |
Code |
|---|---|---|---|
|
agreement, tilt and depth spread fitted, through fifth order |
resident TPE, exact-Hessian Newton, then exact-gradient BFGS through fifth order |
|
|
agreement, tilt and depth spread held at 0 |
resident TPE, exact-Hessian Newton |
|
The phase-variance search (objective="phase_variance") and the
finite-difference and Nelder–Mead refinements are retired. objective is a
saved setting and SSBResult.objective records it. The phase variance remains
the optional diagnostic result.loss. A backend may reject a job it cannot
execute, but may not switch to CPU, crop or subsample the BF evidence, quantize
values, or change the objective silently.
fit_aberrations() and reconstruct() own saved-result reuse through the same save_dir
and force controls. Reuse requires an exact scientific signature and restores
one SSBResult; there is no cache manager, persistence session, or second
workflow API. The NPZ owns the complex object wave, and its JSON companion owns
readable provenance and result metadata. Serialization occurs only at this
artifact boundary and never changes GPU computation.
Backend differences#
The same call does not return the same phase image on CUDA and MPS:
both reconstruct the phase of the mean wave (
phase_of_mean), but the wave sums run different kernels in different orders;the bright-field disk is selected by the same rule with different rounding (CUDA device float32, MPS host float32), so edge pixels can differ; and
the agreement and loss reduction orders differ.
Each result records its backend, phase_of_mean and output factor
(result.phase_estimator, result.upsampling).
Ownership boundaries#
Layer |
Owns |
Must not own |
|---|---|---|
|
validation, public units, backend selection, fit/reconstruct/preview lifecycle, shared results |
device kernels, viewer rendering |
CUDA/MPS backend modules |
preparation, device buffers, exact objective, reconstruction kernels |
public parameter names, result schemas |
|
WebGPU execution of an exported bright-field plan with the same units and parameter names |
aberration search, silent preview substitution |
Applications and viewers |
rendering, export folders, provenance presentation, acquisition integration |
copied SSB optics, optimizers, or result classes |
Python CUDA and MPS run in process. The browser engine runs asynchronously and reconstructs from exported bright-field columns and calibration; it does not fit aberrations. Fitting stays on CUDA, MPS and native Metal.
Required parity gates#
Every backend release runs the same fixtures at 128 and 256 scan sizes, plus
512 where hardware permits. Tests compare BF (row, col) indices,
float32/complex64 dtypes, aberrations, full-BF loss, object phase, and saved
provenance. WebGPU tests run in a real browser on a hardware adapter; CUDA and
MPS tests run on their native devices. Performance signoff is recorded only
after parity passes.
Kernel selection by scan size#
Each backend selects its kernels by square scan size (128, 256, 512 and 1024)
in one place: direct_ptycho/cuda/kernels, direct_ptycho/mps/kernels and
direct_ptycho/webgpu/backend.ts. Shape dispatch is not scattered through optimizer or
viewer code. SSB-specific WebGPU code lives under direct_ptycho/webgpu; generic browser
device utilities live under device, and HDF5 decoder utilities live under
io/hdf5/webgpu.