Aharrypotter opened a new pull request, #19881:
URL: https://github.com/apache/tvm/pull/19881

   ## Summary
   
   This PR adds Relax TFLite frontend support for runtime (dynamic) start 
indices
   in `STABLEHLO_DYNAMIC_UPDATE_SLICE`, addressing the `DYNAMIC_UPDATE_SLICE` 
item
   from #19412 section B.
   
   `_convert_stablehlo_dynamic_update_slice` (added in #19587) previously raised
   `OpNotImplemented` when the start-index scalars were runtime (non-constant)
   values, handling only compile-time-constant starts. Models that compute the
   update offset at runtime could therefore not be imported. This PR makes the
   dynamic-start path work, with StableHLO clamping semantics, without adding a 
new
   Relax op. The change is limited to this converter and its test.
   
   ## Design
   
   ### Dynamic start indices via scatter_nd
   
   The existing static path already lowers `STABLEHLO_DYNAMIC_UPDATE_SLICE` to
   `relax.op.scatter_nd`, building the scatter index grid at compile time with
   `numpy.indices`. `scatter_nd` accepts a general **runtime** `indices` tensor 
and
   returns the `data` (operand) shape unchanged, so the dynamic case needs no 
new
   op and introduces no symbolic dimensions — only the index grid is built
   in-graph instead of in NumPy.
   
   For runtime starts, the converter builds the index grid per axis `a` (rank is
   statically known from the operand/update shapes):
   
   - clamp the start to `[0, operand_dim - update_dim]` with `relax.op.maximum` 
/
     `relax.op.minimum` — StableHLO clamps out-of-range starts rather than 
erroring;
   - `idx = arange(update_dim) + clamped_start`;
   - reshape `idx` to broadcast on axis `a` and `broadcast_to` the update shape;
   - `expand_dims` a trailing index axis.
   
   `concat` over the axes produces an int64 index tensor of shape
   `(*update_shape, rank)`, which is fed to the same
   `relax.op.scatter_nd(operand, indices, update, "update")` call the static 
path
   uses.
   
   The static (constant-start) path is unchanged, including its compile-time
   out-of-bounds rejection.
   
   ## Operator Support
   
   | Operator | TFLite inputs | Relax lowering | Supported subset |
   |---|---|---|---|
   | `STABLEHLO_DYNAMIC_UPDATE_SLICE` | `operand`, `update`, N scalar `start` 
indices | `relax.op.scatter_nd` with a NumPy index grid (constant starts) or an 
in-graph `arange` + clamp index grid (runtime starts) | static operand/update 
shapes; constant or runtime start indices |
   
   ## Not Included
   
   - Dynamic (non-static) operand or update shapes — the index grid is built 
from
     the statically known update shape, so operand/update shapes must be static.
     Runtime *start indices* are supported; runtime *tensor shapes* are not.
   
   ## Tests
   
   The dynamic-start test compiles the imported module and runs it on the Relax 
VM,
   comparing the output against a NumPy reference; it includes an out-of-range 
start
   to exercise clamping. The static structural-equal and out-of-bounds tests are
   unchanged.
   
   | Test | Coverage |
   |---|---|
   | `test_stablehlo_dynamic_update_slice` | constant start indices, 
structural-equal (existing) |
   | `test_stablehlo_dynamic_update_slice_dynamic_starts` | runtime start 
indices, compile + run, including an out-of-range start that is clamped |
   | `test_stablehlo_dynamic_update_slice_out_of_bounds_unsupported` | 
constant-start path rejects out-of-bounds updates (existing) |
   
   Local validation:
   
   ```bash
   python -m ruff format --check \
     python/tvm/relax/frontend/tflite/tflite_frontend.py \
     tests/python/relax/test_frontend_tflite.py
   
   python -m ruff check \
     python/tvm/relax/frontend/tflite/tflite_frontend.py \
     tests/python/relax/test_frontend_tflite.py
   
   python -m pytest \
     tests/python/relax/test_frontend_tflite.py -k dynamic_update_slice -q
   
   python -m pytest \
     tests/python/relax/test_frontend_tflite.py -q
   ```
   
   Result:
   
   ```text
   ruff format --check: 2 files already formatted
   ruff check: All checks passed
   dynamic_update_slice tests: 3 passed, 555 deselected
   full TFLite pytest: 558 passed
   ```
   
   ## References
   
   - Issue #19412 section B: `DYNAMIC_UPDATE_SLICE`
   - PR #19587: introduced `STABLEHLO_DYNAMIC_UPDATE_SLICE` (constant starts) 
and
     multi-subgraph / StableHLO region support
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to