Stan allows us to index each element of a vector multiple times, and allows us to assign that indexed element some values. Using this toy syntax below, I intend to increment an element five times, but it occurs only once. I would expect element LHS[1] == 5 or get a syntax error.

What is the intended behavior of this syntax?

test.stan:

```
generated quantities {
vector[5] LHS = rep_vector(0, 5);
{
array[5] int idx = {1, 1, 1, 1, 1};
LHS[idx] += rep_vector(1, 5);
}
}
```

In R,

```
library(cmdstanr)
m <- cmdstan_model('test.stan')
f <- m$sample(fixed_param = TRUE)
```

Stan pretty strictly interprets `a += b`

as equivalent to `a = a + b`

. When combined with value semantics, the code you posted is treated like:

`LHS[idx] = copy(LHS[idx]) + rep_vector(1, 5);`

Which means that only the â€ślastâ€ť assignment stays around.

If you wrote something where the element changed based on the ordering, this becomes a bit more obvious:

```
generated quantities {
vector[5] LHS = rep_vector(0, 5);
{
array[5] int idx = {1, 1, 1, 1, 1};
LHS[idx] += linspaced_vector(5,1,5);
}
print(LHS);
}
```

`LHS[1]`

will contain 5, not 15 (=1+2+3+4+5)

This seems to match how numpy in Python handles similar operations, but it might not necessarily be the most intuitive

1 Like