Appendix to Connectivities as types. The alternatives rejected on grounds other than the axis levels, which are in the staggering appendix. Each entry states the alternative, then why it loses.
Alternatives
Keep every concept; fix only which string wins. Emit FieldOffset.value
instead of foast.Name.id in foast_to_gtir, validate value == target[-1].value
eagerly, extend the #1789 regression test. Two PRs, low risk — and the
foast_to_gtir part is a real bug, fixed regardless, in GridTools/gt4py#2898.
But it enforces the tangle rather than removing it; no concept goes away.
A declaration object with a derived local dimension, keeping Dimension
instances. Same shape as this proposal minus static typing and minus type
identity: local_dim.value == name by construction, provider keyed by the
declaration object. Superseded by building on dimensions as types instead:
once dimensions are classes, the nested-class form is both simpler and
statically meaningful.
(name, kind) value equality with an interning registry (the design of
dimensions as types and GridTools/gt4py#2844).
Keeps independently declared same-named dimensions interchangeable and
avoids the importability rule. Rejected because it decouples the Python
type’s identity from the IR’s, needs a registry plus copyreg plus a custom
fingerprint deconstructor to paper over that gap, and cannot give a nested
V2E.Local a unique name without further convention. See Identity.
Integer type parameters for max_neighbors (LocalDimensionIndex[F: int, M: int]).
Would need Literal[6] type arguments and Final[F] over a TypeVar;
checkers gain nothing. Class keywords instead.
Data on the class (data: ConnectivityField | Unbound). Process-global
mutable state; tests bind several meshes per process, and the compile cache
assumes the table travels separately from the type. Binding per call, keyed by
the class, keeps the invariant structural.
axis=V2E as sugar. Rejected for now; keep the local axis explicit.
Static-only max_neighbors / min_neighbors. Simplest, and correct for
fixed-arity meshes. Rejected as the only mode because it binds DSL source
to one mesh family (fvm_nabla_setup.py sizes V2E from the atlas mesh) and
because skip-value presence is configuration-dependent in ICON, so a static
min_neighbors forces either duplicate classes or always-on skip handling.
Declared counts stay available as a constraint; see Binding model.
Owner-less local axes as non-LOCAL dimensions. Rejected: they would
become domain dimensions with a range in every program domain and lose the
sparse storage treatment, changing ICON4Py’s layout for LsqUnkDim fields.