Skip to content
Medium Framework

Scatter Add

Scatter-add sends source values to output positions and sums values that share a destination. Start from zeros, so output positions that receive no values stay zero.

Your task

Implement scatter_add(src, indices, n).

  • src is a floating-point vector of shape (k,).
  • indices has shape (k,) on the same device. Its values are integer-valued floats in [0, n); cast them to integers before indexing.
  • n is a nonnegative integer giving the output length. If n=0, k is also zero.
  • Return a vector of shape (n,) with src's dtype and device. Leave the inputs unchanged.

For each source position i, add src[i] to output position indices[i]:

output[j] = sum(src[i] for every i whose indices[i] == j)

For src=[2, -3, 5], indices=[1, 1, 3] and n=5, return [0, -1, 0, 5, 0]. The two contributions to position 1 add to -1. Repeated indices mean addition, not last-write-wins assignment.

The output length comes from n, not from the source length or largest index. An empty source returns n zeros; if n is also zero, return shape (0,).

Implementation

Create the zero vector with the source dtype and device. Then use target.scatter_add(0, indices.long(), src) in PyTorch or target.at[indices.astype(jnp.int32)].add(src) in JAX. A sequential loop that adds each contribution also expresses the required operation.

Do not use ordinary indexed assignment: duplicate destinations must retain all contributions. Floating-point sums may have small rounding differences when a backend adds contributions in a different order.