Repository navigation
Conversation
A new Roadmap section of the docs with one page: where the pieces of a CUDA MART stand, what the benchmarks taught, the design, eight milestones with their gates, the memory the ESIS production grid needs, whether to cache or rebuild its weights, and the open questions. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GqceVSp8s2msxj1Dr9MrGU
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #37 +/- ##
=========================================
Coverage 100.00% 100.00%
=========================================
Files 24 24
Lines 918 918
=========================================
Hits 918 918
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GqceVSp8s2msxj1Dr9MrGU
Charge diffusion in the optika sensor, checked against this roadmapContext. optika 3.0 (sun-data/optika#244 and a follow-up PR) will make the noise-free sensor model include charge diffusion. Today After the change:
The plan fits this roadmap, with the adjustments below. What already lines up
Adjustments1. Don't fold diffusion into the CSR matrix at ESIS scale. Applying the kernel as a small convolution beside the matrix costs two launches per iteration and no stored weights:
The same holds for an optical PSF of ESIS, if one is ever added. 2. Keep spectral lines on their own axis.
So the forward matrix should sum within each line and keep the lines on their own axis. One kernel per channel and line is then applied before the lines are summed. With the Regridder's shape rules that only needs the line to be its own axis of the scene grid. It costs about 0.5 GB of row pointers and 0.25 GB of intermediate images at production. The per-wavelength gain folds into the forward values, and its inverse into the conservative values. The GPU path then matches optika's per-wavelength host model to about 1e-5. 3. The M7 and M8 gates.
4. Exact and scaled transposes of the sensor. 5. Determinism. 6. The noise model as published data, instead of a probe.
On the GPU that is a second matrix product, with the per-wavelength amplitude in the values, followed by one convolution, which is the variance-ratio pattern of this page. M7 can read these directly instead of measuring them with a noise probe. Suggested edits to this page
The planned optika sensor API, for referenceNot final until the follow-up PR: AbstractImagingSensor.kernel(wavelength, direction, num=None) # electrons per absorbed photon, per offset
AbstractImagingSensor.kernel_variance(wavelength, direction, num=None) # variance contributed per photon
AbstractImagingSensor.expose(..., noise=False) # the kernel applied to the photons
AbstractImagingSensor.expose_transposed(image, ...) # exact transpose, for gradient inverters
AbstractImagingSensor.backproject(image, ...) # scaled transpose, for MART
🤖 Generated with Claude Code |
The Regridder's kernel now sizes its thread groups to the rows, which halves a 256 by 256 MART iteration, so the figure and its numbers take the new run. torch's sparse product turned out not to repeat exactly on long rows, even in deterministic mode, which corrects the status table and adds a lesson. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GqceVSp8s2msxj1Dr9MrGU
regridding 3.5.1 shipped #69, so M1 is done and the Regridder no longer waits on it. The design now says why the Regridder keeps its own kernel rather than cuSPARSE, the M3 gate includes matching cuSPARSE's speed, and a risk notes the host time each GPU call spends. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GqceVSp8s2msxj1Dr9MrGU
At ESIS scale the sensor's blur goes beside the CSR matrix rather than into it, spectral lines keep their own axis, M7 reads the noise model from the kernels optika 4.0 publishes, and M7 and M8 reproduce tempest with diffusion off. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GqceVSp8s2msxj1Dr9MrGU
- Describe the backprojection as the conservative transpose of a second, per-channel operator, which is what the prototype builds, and say MART stores only the conservative values. - Remeasure charge diffusion with the slab model of optika #255: 9 by 9 for 1e-6 of the charge, an 11 by 11 default, 490 to 710 GB if folded in. - Note that optika 3.1.0 already builds its weights on a device (#229). - Give the M4, M5, M6, M7 and M8 gates tolerances the GPU can meet. - Rerun all three benchmark problems back to back, best of several runs, so the figure and the text share one set of numbers. - Redraw the design figure with the sensor blur and two matrices. - Smaller fixes: the thread rule, float64 products, the CI milestone, the variance-ratio risk, and unresolvable module references. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GqceVSp8s2msxj1Dr9MrGU
Adds a Roadmap section to the docs with one page,
docs/roadmap/cuda-mart.rst: the plan for runningMartInverteron a GPU, and from there the ESIS Level-4 product.The page covers:
Notes:
regridding.Regridderprototype the page refers to is AddRegridder, a CSR operator for resampling on the host or a GPU regridding#70, a draft. The #69 it builds on is released in regridding 3.5.1.🤖 Generated with Claude Code
https://claude.ai/code/session_01GqceVSp8s2msxj1Dr9MrGU