Removed Features

This chapter lists functionalities that were once present in the language but have since been removed, along with how to replace them.

lp__ variable

Removed: The variable lp__ is no longer available for direct access or manipulation.

Replacement: General manipulation of the value of the lp__ variable is not allowed, but

lp__ <- lp__ + e;

can be replaced with

target += e;

The value of lp__ is available through the no-argument function target().

Assignment with <-

Removed: The operator <- for assignment, e.g.,

a <- b;

is no longer available.

Replacement: The new syntax uses the operator = for assignment, e.g.,

a = b;

Removed In: Stan 2.33

increment_log_prob statement

Removed: The increment_log_prob(u) statement for incrementing the log density accumulator by u is no longer available.

Replacement: Replace the above statement with

target += u;

Removed In: Stan 2.33

get_lp() function

Removed: The built-in no-argument function get_lp() is no longer available.

Replacement: Use the no-argument function target() instead.

Removed In: Stan 2.33

_log density and mass functions

Removed: Formerly, the probability function for the distribution foo would be applied to an outcome variable y and sequence of zero or more parameters ... to produce the expression foo_log(y, ...). This suffix is no longer a special value.

Replacement: If y can be a real value (including vectors or matrices), replace

foo_log(y, ...)

with the log probability density function notation

foo_lpdf(y | ...).

If y must be an integer (including arrays), instead replace

foo_log(y, ...

with the log probability mass function

foo_lpmf(y | ...).

Removed In: Stan 2.33

cdf_log and ccdf_log cumulative distribution functions

Removed: The log cumulative distribution and complementary cumulative distribution functions for a distribution foo were formerly written as foo_cdf_log and foo_ccdf_log.


Replace foo_cdf_log(y, ...) with foo_lcdf(y | ...).

Replace foo_ccdf_log(y, ...) with foo_lccdf(y | ...).

User-defined function with _log suffix

Removed: A user-defined function ending in _log can be no longer be used in sampling statements.

Replacement: Replace the _log suffix with _lpdf for density functions or _lpmf for mass functions in the user-defined function.

Removed In: Stan 2.33

Note: Following Stan 2.33, users can stil define a function ending in _log, it simply no longer has a special meaning or is supported in the ~ syntax.

if_else function

Removed: The function if_else is no longer available.

Replacement: Use the conditional operator which allows more flexibility in the types of b and c and is much more efficient in that it only evaluates whichever of b or c is returned.

x = if_else(a, b, c);


x = a ? b : c;

Removed In: Stan 2.33

Character # as comment prefix

Removed: The use of # for line-based comments is no longer permitted. # may only be used for #include statements.

Replacement: Use a pair of forward slashes, //, for line comments.

Removed In: Stan 2.33

Postfix brackets array syntax

Before Stan 2.26, arrays were declared by writing syntax after the variable.

Removed: The use of array declarations like

int n[5];
real a[3, 4];
real<lower=0> z[5, 4, 2];
vector[7] mu[3];
matrix[7, 2] mu[15, 12];
cholesky_factor_cov[5, 6] mu[2, 3, 4];

Replacement: The use of the array keyword, which replaces the above examples with

array[5] int n;
array[3, 4] real a;
array[5, 4, 2] real<lower=0> z;
array[3] vector[7] mu;
array[15, 12] matrix[7, 2] mu;
array[2, 3, 4] cholesky_factor_cov[5, 6] mu;

Removed In: Stan 2.33

Nested multiple indexing in assignments

Stan interprets nested indexing in assingments as flat indexing so that a statement like

a[:][1] = b;

is the same as

a[:,1] = b;

However, this is inconsistent with multiple indexing rules.

To avoid confusion nested multiple indexing in assignment became an error in Stan 2.33. Nesting single indexing is still allowed as it cannot lead to ambiguity.

Removed In: Stan 2.33

Real values in conditionals

Removed: Using a real value in a conditional is no longer permitted.

real x = 1.0;
if (x) {

The value was interpreted as true if it is nonzero.

Replacement: For the exact equivalent, use a comparison operator to make the intent clear.

real x = 1.0;
if (x != 0) {

However, one should keep in mind that floating point calculations are subject to rounding errors and precise equality is fragile. It is worth considering whether the more robust alternative abs(x) < machine_precision() is appropriate for the use case.

Removed In: Stan 2.34

Back to top