I have a model for which parameters outside a region `D ⊂ ℝⁿ`

are invalid. `D`

is not characterized in closed form, and no amount of change of variable acrobatics can transform it to `ℝⁿ`

(actually, I can find some `A ⊃ D`

where `A`

is not much larger than `D`

, but that merely mitigates the problem). But I can detect if the parameters are outside `D`

, the question is what to assign to the likelihood there.

Fortunately, there is no mass at the edges of `D`

, and the likelihood goes to `-∞`

at the edges quickly. I looked at the Stan sources and found something like

```
if (boost::math::isnan(h))
h = std::numeric_limits<double>::infinity();
```

in multiple places, eg here for NUTS. So is (stylized code)

```
if (parameter is invalid)
target += NaN
```

the right thing to do? Or should I use `-Inf`

? The advantage of `NaN`

is that for some invalid calculations, that’s what I get out of the box.

Some experimentation with toy models suggests that it works as long as I pick the starting point inside `D`

. I guess it would help if I control the initial stepsize (before adaptation) but I am not sure how to do that (using `rstan`

).