#### Functions and functionals

##### Introduction

Function arguments represented by `e` can be expressions, those by `s` must be scalar-valued nodes in the graph and those represented by `v` must be vector-valued nodes in a graph. Some function arguments must be stochastic nodes. Functionals are described using a similar notation to functions, the special notation `F(x)` is used to describe the function on which the functional acts. See example Functionals for details.

Systems of ordinary differential equations and their solution can be described in the BUGS language by using the special `D(x[1:n], t)` notation. See example ode for details.

##### Scalar functions

`abs(e)`   absolute value of e, |e|

`arccos(e)`   inverse cosine of e

`arccosh(e)`   inverse hyperbolic cosine of e

`arcsin(e)`   inverse sine of e

`arcsinh(e)`   inverse hyperbolic sine of e

`arctan(e)`   inverse tangent of e

`arctanh(e)`   inverse hyperbolic tangent of e

`cloglog(e)`   complementary log log of e, ln(-ln(1 - e))

`cos(e)`   cosine of e

`cosh(e)`   hyperbolic cosine of e

`cut(e)`   cuts edges in the graph - see Tip and tricks page for details.

`equals(e1, e2)`   1 if value of e1 equals value of e2; 0 otherwise

`exp(e)`   exp(e)

`gammap(s1, s2)`   partial (incomplete) gamma function, value of standard gamma density with parameter s1 integrated up to s2

`ilogit(e)`   exp(e) / (1 + exp(e))

`icloglog(e)`   1 - exp( - exp(e))

`integral(F(s), s1, s2, s3)`   definite integral of function F(s) between s = s1 and s = s2 to accuracy s3

`log(e)`   natural logarithm of e

`logfact(e)`   ln(e!)

`loggam(e)`   logarithm of gamma function of e

`logit(e)`   ln(e / (1 - e))

`max(e1, e2)`   e1 if e1 > e2; e2 otherwise

`min(e1, e2)`e1 if e1 < e2; e2 otherwise

`phi(e)`   standard normal cdf

`post.p.value(s)`   s must be a stochastic node, returns one if a sample from the prior is less than the value of s

`pow(e1, e2)`   e1e2

`prior.p.value(s)`   s must be a stochastic node, returns one if a sample from the prior after resampling its stochastic parents is less than value of s.

`probit(e)`   inverse of `phi(e)`

`replicate.post(s)`   replicate from distribution of s, s must be stochastic node

`replicate.prior.(s)`   replicate from distribution of s after replicating from it parents if they are stochastic, s must be stochastic node

`round(e)`nearest integer to e

`sin(e)`   sine of e

`sinh(e)`   hyperbolic sine of e

`solution(F(s), s1, s2, s3)`   a solution of equation F(s) = 0 lying between s = s1 and s = s2 to accuracy s3, s1 and s2 must bracket a solution
`sqrt(e)`e1/2
`step(e)`1 if e >= 0; 0 otherwise

`tan(e)`   tangent of e

`tanh(e)`   hyperbolic tangent of e
`trunc(e)`greatest integer less than or equal to e

##### Vector functions

`inprod(v1, v2)`   inner product Σi v1i v2i of v1 and v2
`interp.lin(e, v1, v2)`   Given function values in the vector v2 evaluated at the points in v1, this estimates the function value at a new point e by simple linear interpolation using the closest bounding pair of points. For example, given the population in 1991,2001 and 2011, we might want to estimate the population in 2004. Specifically, v2p + (v2p + 1 - v2p) * (e - v1p) / (v1p + 1 - v1p), where p is such that v1p < e < v1p + 1 and the elements of v1 are in ascending order
`inverse(v)`   inverse of symmetric positive-definite matrix v

`logdet(v)`   log of determinant of v for symmetric positive-definite v

`mean(v)`   Σi vi / n, where n = dim(v)

`eigen.vals(v)`   eigenvalues of matrix v

`ode(v1, ``v2, D(v3, s1), s2, s3)`   solution of system of ordinary differential equations at grid of points v2 given initial values v1 at time s2 solved to accuracy s3. v3 is a vector of components of the system of ode and s1 is the time variable. See the PDF files in the Diff/Docu directory of the BUGS installation for further details.

`prod(v)`   Πi vi

`p.valueM(v)`   v must be a multivariate stochastic node, returns a vector of ones and zeros depending on if a sample from the prior is less than value of the corresponding component of v

`rank(v, s)`number of components of vless than or equal to s
`ranked(v, s)`the sthsmallest component of v

`replicate.postM(v)`   replicate from multivariate distribution of v, v must be stochastic and multivariate

`sd(v)`   standard deviation of components of v (n - 1 in denominator)

`sort(v)`   vector v sorted in ascending order

`sum(v)`   Σi vi

##### Properties of distributions

The cumulative distribution function (CDF), probability density function (PDF) and deviance for the distributions available in BUGS can be calculated using the `cdf.dist`, `pdf.dist` and `dev.dist `family of functions, where `dist `corresponds to one of the distributions listed above. The first argument of each function is the value at which to evaluate the function. The other arguments are the parameters of the distribution itself. For example, for the normal distribution:
`cdf.norm(s, mu, tau)`   cumulative distribution function at the value of `s` for a normal distribution with parameters `mu` and `tau`
`pdf.norm(s, mu, tau)`   probability density of distribution at value of s for a normal distribution with parameters `mu` and `tau`
`dev.norm(s, mu tau)`   deviance of distribution at value of s for a normal distribution with parameters `mu` and `tau`

The following cumulative distribution functions are available: `cdf.bern`, `cdf.beta`, `cdf.bin`, `cdf.cat`, `cdf.chisqr`, `cdf.dexp`, `cdf.exp`, `cdf.f`, `cdf.gamma`, `cdf.ggamma`, `cdf.geom0`, `cdf.geom1`, `cdf.hyper`, `cdf.lnorm`, `cdf.logis`, `cdf.negbin`, `cdf.norm`, `cdf.par`, `cdf.pois`, `cdf.polygene`, `cdf.t`, `cdf.trap`, `cdf.triang`, `cdf.unif`, `cdf.weib`, `cdf.weib3`, `cdf.gev`, `cdf.gpar. `No cumulative distribution function is available for flat (`dflat`), generic (`dloglik`), stable (`dstable`) or Zipf (`dzipf`) distributions.

The following probability density functions are available for univariate distributions:` pdf.bern`, `pdf.beta`, `pdf.bin`, `pdf.cat`, `pdf.chisqr`, `pdf.dexp`, `pdf.exp`, `pdf.f`, `pdf.flat`, `pdf.gamma`, `pdf.ggamma`, `pdf.geom0`, `pdf.geom1`, `pdf.hyper`, `pdf.lnorm`, `pdf.logis`, `pdf.negbin`, `pdf.norm`, `pdf.par`, `pdf.pois`, `pdf.polygene`, `pdf.t`, `pdf.trap`, `pdf.triang`, `pdf.unif`, `pdf.weib`, `pdf.weib3`, `pdf.gev`, `pdf.gpar`, `pdf.zipf. `No probability distribution function is available for generic (`dloglik`) or stable (`dstable`) distributions.

For multivariate distributions the following probability density functions are available:` pdf.dirich`, `pdf.multi`, `pdf.mnorm`, `pdf.mt`, `pdf.wish`

The following functions calculate the deviance of the corresponding distribution: `dev.bern`, `dev.beta`, `dev.bin`, `dev.cat`, `dev.chisqr`, `dev.dexp`, `dev.exp`, `dev.f`, `dev.flat`, `dev.gamma`, `dev.ggamma`, `dev.geom0`, `dev.geom1`, `dev.hyper`, `dev.lnorm`, `dev.logis`, `dev.negbin`, `dev.norm`, `dev.par`, `dev.pois`, `dev.polygene`, `dev.t`, `dev.trap`, `dev.triang`, `dev.unif`, `dev.weib`, `dev.weib3`, `dev.gev`, `dev.gpar`, `dev.zipf. `No deviance function is available for generic (`dloglik`) or stable (`dstable`) distributions.

For multivariate distributions, the following functions calculate deviance: `dev.dirich`, `dev.multi`, `dev.mnorm`, `dev.mt`, `dev.wish`