# Continue implementation of embedded Field-View
- Shaped by: @egparedes, @havogt
- Appetite (FTEs, weeks): 2 devs, full cycle
- Required skills: knowledge of the GT4Py Field-view model and the embedded field-view implementation
- Developers:
## Problem
This is a continuation of the [Embedded Field View](https://hackmd.io/D2gZEUINQ3SVaylITZqEQA) project from last cycle. The foundations of the embedded field-view have been developed and merged into the `main` branch during last cycle. However, only a subset of the `gt4py.next` functionality is currently supported, being `remap` the most significant omission.
Furthermore, there is an important workshop planned at DWD for the end of November where embedded field-view execution is required for letting the users successfully engage with gt4py.
## Appetite
The appetite for this project is large because embedded the field-view implementation has to be complete and robust at the end of the cycle, since it will be used in the DWD workshop in November.
## Solution
This project will continue with the implementation of the [design sketched in the previous project](https://hackmd.io/D2gZEUINQ3SVaylITZqEQA#Solution) and partially implemented in Enrique's Embedded Field-View prototype ([EEFV](https://github.com/egparedes/gt4py_embedded/tree/gtnextv2-dispatch)).
### On-going tasks
Features fully or partially implemented with open PRs:
- Update embedded Iterator implementation to use the new embedded Field implementation (started by @havogt): https://github.com/GridTools/gt4py/pull/1308
- High-level field allocation API (started by @havogt): https://github.com/GridTools/gt4py/pull/1319
- Add `where` to embedded field view (started by @havogt): https://github.com/GridTools/gt4py/pull/1316
### Implementation of missing features
- `remap()`: implementation of unstructured and cartesian shifts in embedded field-view.
- Part of the work has been already tackled in the [WIP tasks](https://hackmd.io/q2QnqPdSRlqgapGfIyY0tw#WIP-Tasks).
- The algorithm for the unstructured case with NdArray based fields already exists in the [EEFV](https://github.com/egparedes/gt4py_embedded/blob/1f157e3131913dd372198d9901d38d2cef7a945b/src/gtnext/fields.py#L152) prototype.
- The WIP implementation of cartesian shifts is in [PR#1309](https://github.com/GridTools/gt4py/pull/1309)
- `concat()`: implementation of the new field-view function dealing with boundary conditions by using field concatenation. The implementation of this feature in this project will follow the same restrictions shaped previous cycle. (Check here: [1](https://hackmd.io/D2gZEUINQ3SVaylITZqEQA#concat) and [2](https://hackmd.io/D2gZEUINQ3SVaylITZqEQA#Implement-non-overlapping-concat))
- `scan()`: Implementation of the current functionality in embedded field-view, which requires using native python `for`-loops.
- Complete the field slicing implementation with a proper high-level API.
- For domain slices, use with the syntax sketched in the [GT4Py team workshop](https://hackmd.io/tE9eaKoOTL-apBRLtEUlJg): `f_v[I(-1):I(5)]`. The more compact alternative `f_v[I[-1:5]]` was discarded (for now) because it can also be interpreted as remapping a field.
- Change the current behavior which returns a scalar value when indexing a single point of the domain, to a [Array API](https://data-apis.org/array-api/latest/)-like scheme returning 0d-arrays. If needed, we could define an extra API point to extract the scalar value of a 0d array (e.g. [`.item()`](https://devdocs.io/numpy~1.23/reference/generated/numpy.ndarray.item)).
### Fixes and refactorings
- Change `Field[[A,B,C], DType]` typing annotations to a syntactically valid form (`Field[Dims[A,B,C], DType]`) to avoid many mypy complaints in our code, and also as preparation for using variadic generics from [PEP 646](https://peps.python.org/pep-0646/).
- Current annotation style should be still supported to avoid breaking user codes (it should be marked as deprecated at some point).
- For now, `Dims` could be just an alias for `Tuple`.
- FOAST and PAST parsers need to be updated to support the new annotations.
- Probably `Dimension` implementation should be changed to be actual classes to avoid mypy errors and even get some meaningful typing errors for free.
- Add missing `gamma` builtin function (which should be trivial using `FieldBuiltinFuncRegistry`).
- Fix DTypes hierarchy to return dtypes of the proper subclass when using the generic constructor in the superclass. Basically `assert isintance(DType(int32), Int32DType)`)
- Fix typing issues in the Typeguards and the synthetic types used for typeguards
## Rabbit holes
### `concat`
Same rabbit hole as in previous project: implementation of `concat` lowering might be complicated (see [here](https://hackmd.io/D2gZEUINQ3SVaylITZqEQA#concat))
## No-gos
- Full implementation of `concat`
## Progress
- [ ] Merge WIP PRs
- [x] embedded Iterator implementation using new field (PR: https://github.com/GridTools/gt4py/pull/1308)
- [ ] Add `where` to embedded field view (PR: https://github.com/GridTools/gt4py/pull/1316)
- [ ] Redesign field allocation API for next (PR: https://github.com/GridTools/gt4py/pull/1319)
- [ ] Create new `DataField` (Domain + DLPack buffer) which gets returned when allocating fields with `.empty` or `asfield`
```python
class GTDomainField(Protocol):
@property
def __gt_domain__(self) -> Domain:
...
# dlpack methods
```
Also extend `cartesian` to support the new interface as a fallback case
- [ ] `np_as_located_field` should return the new `DataField` temporarily
- [ ] Make `DataField` compatible with the current next bindings
- [ ] Wrap `DataField` inside `EmbeddedNDArrayField` for `iterator.embedded` execution in the entry point
- [ ] Delete `np_as_located_field`
- [ ] Fix issues in dtype hierarchy
- [ ] return concrete subclasses using the generic constructor
- [ ] fix typing issues
- [ ] field slicing
- [ ] remap
- [ ] concat
- [ ] scan