Static K-body iterators

For graph-driven or geometry-driven operators, the most important iterator is the fully general for_each(labels, over=...).

for_each(labels, over=...)

This binds an arbitrary sequence of labels to an explicit static list of index rows.

edges = [(0, 1), (1, 2), (2, 3)]

op = (
    SymbolicDiscreteJaxOperator(hi, "edge_term")
    .for_each(("src", "dst"), over=edges)
    .emit(identity(), matrix_element=site("src").value * site("dst").value)
    .build()
)

This is usually the best choice whenever the operator follows a graph, plaquette list, triangle list, or other precomputed structure.

Convenience wrappers

The builder also provides wrappers for common fixed arities.

for_each_triplet(label_a, label_b, label_c, over=...)

static list of three-tuples

for_each_plaquette(label_a, label_b, label_c, label_d, over=...)

static list of four-tuples

These wrappers delegate to the same underlying machinery and mainly improve readability.