This is an old version, view current version.
20.5 Control flow depends on a parameter
Control flow statements, such as if
, for
and while
should not depend on parameters or functions of parameters to determine their branching conditions. This is likely to introduce a discontinuity into the density function. Pedantic mode generates a warning when any branching condition may depend on a parameter value.
For example, consider the following program.
parameters {
real a;
}
model {
// x depends on parameter a
real x = a * a;
int m;
// the if-then-else depends on x which depends on a
if(x > 0) {
//now m depends on x which depends on a
m = 1;
} else {
m = 2;
}
// for loop depends on m -> x -> a
for (i in 0:m) {
a ~ normal(i, 1);
}
}
The if
and for
statements are control flow that depend (indirectly) on the value of the parameter m
.
Pedantic mode produces the following warning.
Warning at 'param-dep-cf-warn.stan', line 11, column 2 to line 16, column 3:
A control flow statement depends on parameter(s): a.
Warning at 'param-dep-cf-warn.stan', line 19, column 2 to line 21, column 3:
A control flow statement depends on parameter(s): a.