---
# System prepended metadata

title: '[GT4Py] GTIR Domain inference'
tags: [cycle 23 - 07/24]

---

# [GT4Py] GTIR Domain inference

- Shaped by:
- Appetite (FTEs, weeks):
- Developers: Sara

## Problem
<!-- The raw idea, a use case, or something we’ve seen that motivates us to work on this -->

## Appetite
<!-- Explain how much time we want to spend and how that constrains the solution -->

## Solution

- Write test cases in ITIR for a meaningful set of stencils
```python
# no-composition
expr = as_fieldop(stencil)(inp_field, ...)
# with composition (required for dace backend)
expr = as_fieldop(stencil)(as_fieldop(stencil)(inp_field))

domain = cartesian_domain(...)

# new_expr has transformed all as_fieldop(stencil) into as_fieldop(stencil, domain)
infer_as_fieldop(expr, domain) -> new_expr, dict(referenced_field => accessed domain)
```

```python
# multiple SetAt (no composition)
tmp <- as_fieldop(stencil)(inp_field, ...) @ auto_domain()
out <- as_fieldop(stencil)(tmp, ...) @ ...

# domain is inferred bottom up from last SetAt, only domains
#  of SetAt on temporaries are changed
infer_program(program_expr)
```
- Write a pass that using `TraceShift`s infers the minimal domain of `as_fieldop` and `SetAt` on temporaries such that after the pass all `as_fieldop` should have their domain arg inferred, e.g. `as_fieldop(stencil)(inp_field, ...)` is transformed into `as_fieldop(stencil, cartesian_domain(...))(inp_field, ...)`. Focus on Cartesian first. The minimal domain is always inferred in a backwards fashion starting from the last `SetAt`, outer `as_fieldop` to inner most `as_fieldop`.

### Scratchpad
```
# helper function in IR makers
cartesian_domain({"I": (1, "some_var"), "J": (1, 20)})
```
<!-- The core elements we came up with, presented in a form that’s easy for people to immediately understand -->

## Rabbit holes
<!-- Details about the solution worth calling out to avoid problems -->

## No-gos
<!-- Anything specifically excluded from the concept: functionality or use cases we intentionally aren’t covering to fit the ## appetite or make the problem tractable -->
