[LTX-2.5] move the diffusion decode tile schedule back onto the model
The review comment was about where the denoising logic lives. The loop had to
move because a scheduler drives it, and the tile loop had to follow because it
wraps the loop — but the arithmetic that loop consumes did not. Cell-to-pixel
scales, the smallest tile the remaining attention kernels tolerate, the ghost
frames the NATTEN border shift leaves on the end, the causal frame mapping: all
of that is a fact about the decoder's grid, not about sampling, and it reads
better next to the stages whose geometry decides it.
So `LTX2VideoDiffusionDecoderModel.get_tile_schedule` returns a
`LTX2VideoDiffusionDecoderTileSchedule` — the cuts on each axis plus the
accessors for the awkward parts (`pixel_origin`, `pixel_frames`, `feature_end`)
— and `_tiled_decode` becomes a plain walk over it. The pipeline keeps what it
has to: a tile loop wrapped around a scheduler-driven denoising loop.
Two things this buys beyond placement. The modular block copies 216 lines rather
than 265, since the geometry is now imported rather than duplicated. And the
schedule is testable on its own, which it needed to be: relocating it, I
inverted the causal offset so every non-origin tile sampled the noise canvas one
frame late. That produced a correctly shaped video and was caught only by a
decode-level test. It now has five of its own, mutation-checked against the
inverted offset, ghost frames left in the cut, the kernel floor dropped, and tile
sizes not converted from pixels to cells.
Bit-exact against the pre-move decode on all six cases.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>