Puts main back as it was at 8acfab54, which impact-reg-konfai 1.8.6 reads. The 1.8.7 files stay at 7fc77d1c, the revision 1.8.7 pins, and come back to main with its release.
Presets for impact-reg-konfai 1.8.7: one IMPACT loss, sized from their declared cost
No app declares a `vram_plan` any more. Every preset leaves its patch free (`patch_size: [0, 0, 0]`): the volume runs as one patch when it fits, and the engine is handed exactly what it was without a patch. Otherwise konfai tiles it on the measured VRAM, the fewest equal patches that fit, overlapping by 20 % and blended with a `Cosinus` window: without a declared overlap and window the last patch written won, which left a seam in the displacement field where a patch starts. A registration forwards one pair: its batch stays 1.
images_log, Dataset.filter, Dataset.use_cache, Dataset.Patch.mask,
OutputDataset.inverse_transform, Predictor.Concat, the Evaluator's
is_input/patch_transforms and StepLR's verbose: nothing binds them
since konfai 1.8.2, so every run printed an unknown-key warning.
Found by building each workflow file and reading strict_config's
report; each edit checked to parse to the old tree minus those keys.
The ImpactSynth MR sCT on a test case is bit-identical before and after.
Write the registration result as Transform.h5 through the itktransform backend
konfai binds a config by walking the callable's signature and does not check for
unknown keys, so 'mask' was silently dropped -- Patch takes patch_size, overlap,
pad_value and extend_slice, and nothing else. The key promised masked patching
and configured nothing.
It cannot be honoured as written either: the blend weights each patch by its
share of a total summed over the WHOLE grid, so a skipped patch leaves its
neighbours' shares summing to less than one and the overlap band decays smoothly
to zero -- measured, a constant displacement falling 1.0 to 0 across the band.
Skipping requires renormalising over the live set, which means the volume-sized
weight buffer and the final division this design exists to avoid.
A preset declares its displacement field, and only that
The moved image was the required output and the field the optional one, which is
backwards: the field IS the registration, and the moved image is that field
applied to the moving -- something the orchestrator derives. Declaring both made
every preset write a second output nobody needed, and a tiled preset blend it
across every patch seam before throwing it away.
outputs_dataset now carries DisplacementField alone, and app.json marks it
required. Needs the impact-reg-konfai that derives the moved image (>=1.8.0);
an older one looks for a Moved and fails to find it.
Add per-app icons and declare the registration task
model.pt was a dummy 1249-byte checkpoint that only existed to satisfy the predictor's
'at least one checkpoint' rule. These registration engines have no trained weights, and
konfai now runs a weightless model (0 parameters) with no checkpoint, so each preset
declares 'models': [] and ships no .pt. Requires konfai >= 1.6.1.
Move engine code to impact_reg_konfai.models; keep only config + weights
Each preset's Prediction.yml now points its classpath at
impact_reg_konfai.models.<engine>:RegistrationNet instead of a bundled Model.py,
and declares impact_reg_konfai>=1.6.1. The duplicated engine code (Model.py, plus
elastix_engine.py/install.py) is removed; the elastix parameter-map .txt stay, as
they are per-preset config. Requires impact_reg_konfai>=1.6.1 (ships the models
subpackage).
Split each elastix preset's Model.py into a parameter mapper plus an elastix_engine.py runtime, and type the constructor parameters (Literal / Annotated Range / Choices) so UIs derive their constraints. Reg presets set tta=0 and carry the real grid-spacing / spatial-samples in the config (source of truth). ConvexAdam presets carry typed Range parameters.
Each preset is now a self-contained app (app.json + Prediction.yml + Model.py +
install.py + model.pt + parameter maps + evaluation configs). The registration
model takes fixed/moving plus optional fixed/moving masks (whole-image mask when
omitted); evaluation is declared per modality (image / segmentation / landmarks).
Removes the legacy monolithic app and the flat parameter-map layout.