3.5 Logical Functions

Like C++, BUGS, and R, Stan uses 0 to encode false, and 1 to encode true. Stan supports the usual boolean comparison operations and boolean operators. These all have the same syntax and precedence as in C++; for the full list of operators and precedences, see the reference manual.

3.5.1 Comparison Operators

All comparison operators return boolean values, either 0 or 1. Each operator has two signatures, one for integer comparisons and one for floating-point comparisons. Comparing an integer and real value is carried out by first promoting the integer value.

int operator<(int x, int y)

int operator<(real x, real y)
Return 1 if x is less than y and 0 otherwise. \[ \text{operator<}(x,y) = \begin{cases} 1 & \text{if $x < y$} \\ 0 & \text{otherwise} \end{cases} \]

int operator<=(int x, int y)

int operator<=(real x, real y)
Return 1 if x is less than or equal y and 0 otherwise. \[ \text{operator<=}(x,y) = \begin{cases} 1 & \text{if $x \leq y$} \\ 0 & \text{otherwise} \end{cases} \]

int operator>(int x, int y)

int operator>(real x, real y)
Return 1 if x is greater than y and 0 otherwise. \[ \text{operator>} = \begin{cases} 1 & \text{if $x > y$} \\ 0 & \text{otherwise} \end{cases} \]

int operator>=(int x, int y)

int operator>=(real x, real y)
Return 1 if x is greater than or equal to y and 0 otherwise. \[ \text{operator>=} = \begin{cases} 1 & \text{if $x \geq y$} \\ 0 & \text{otherwise} \end{cases} \]

int operator==(int x, int y)

int operator==(real x, real y)
Return 1 if x is equal to y and 0 otherwise. \[ \text{operator==}(x,y) = \begin{cases} 1 & \text{if $x = y$} \\ 0 & \text{otherwise} \end{cases} \]

int operator!=(int x, int y)

int operator!=(real x, real y)
Return 1 if x is not equal to y and 0 otherwise. \[ \text{operator!=}(x,y) = \begin{cases} 1 & \text{if $x \neq y$} \\ 0 & \text{otherwise} \end{cases} \]

3.5.2 Boolean Operators

Boolean operators return either 0 for false or 1 for true. Inputs may be any real or integer values, with non-zero values being treated as true and zero values treated as false. These operators have the usual precedences, with negation (not) binding the most tightly, conjunction the next and disjunction the weakest; all of the operators bind more tightly than the comparisons. Thus an expression such as !a && b is interpreted as (!a) && b, and a < b || c >= d && e != f as (a < b) || (((c >= d) && (e != f))).

int operator!(int x)

int operator!(real x)
Return 1 if x is zero and 0 otherwise. \[ \text{operator!}(x) = \begin{cases} 0 & \text{if $x \neq 0$} \\ 1 & \text{if $x = 0$} \end{cases} \]

int operator&&(int x, int y)

int operator&&(real x, real y)
Return 1 if x is unequal to 0 and y is unequal to 0. \[ \mathrm{operator\&\&}(x,y) = \begin{cases} 1 & \text{if $x \neq 0$} \text{ and } y \neq 0\\ 0 & \text{otherwise} \end{cases} \]

int operator||(int x, int y)

int operator||(real x, real y)
Return 1 if x is unequal to 0 or y is unequal to 0. \[ \text{operator||}(x,y) = \begin{cases} 1 & \text{if $x \neq 0$} \textrm{ or } y \neq 0\\ 0 & \text{otherwise} \end{cases} \]

3.5.2.1 Boolean Operator Short Circuiting

Like in C++, the boolean operators && and || and are implemented to short circuit directly to a return value after evaluating the first argument if it is sufficient to resolve the result. In evaluating a || b, if a evaluates to a value other than zero, the expression returns the value 1 without evaluating the expression b. Similarly, evaluating a && b first evaluates a, and if the result is zero, returns 0 without evaluating b.

3.5.3 Logical Functions

The logical functions introduce conditional behavior functionally and are primarily provided for compatibility with BUGS and JAGS.

real step(real x)
Return 1 if x is positive and 0 otherwise. \[ \text{step}(x) = \begin{cases} 0 & \text{if } x < 0 \\ 1 & \text{otherwise} \end{cases} \] Warning: int_step(0) and int_step(NaN) return 0 whereas step(0) and step(NaN) return 1.

The step function is often used in BUGS to perform conditional operations. For instance, step(a-b) evaluates to 1 if a is greater than b and evaluates to 0 otherwise. step is a step-like functions; see the warning in section 3.7 applied to expressions dependent on parameters.

int is_inf(real x)
Return 1 if x is infinite (positive or negative) and 0 otherwise.

int is_nan(real x)
Return 1 if x is NaN and 0 otherwise.

Care must be taken because both of these indicator functions are step-like and thus can cause discontinuities in gradients when applied to parameters; see section 3.7 for details.