g05 Chapter Contents
g05 Chapter Introduction
NAG Library Manual

# NAG Library Function Documentnag_rand_bb_inc_init (g05xcc)

## 1  Purpose

nag_rand_bb_inc_init (g05xcc) initializes the Brownian bridge increments generator nag_rand_bb_inc (g05xdc). It must be called before any calls to nag_rand_bb_inc (g05xdc).

## 2  Specification

 #include #include
 void nag_rand_bb_inc_init (double t0, double tend, const double times[], Integer ntimes, double rcomm[], NagError *fail)

## 3  Description

### 3.1  Brownian Bridge Algorithm

Details on the Brownian bridge algorithm and the Brownian bridge process (sometimes also called a non-free Wiener process) can be found in Section 2.6 in the g05 Chapter Introduction. We briefly recall some notation and definitions.
Fix two times ${t}_{0} and let ${\left({t}_{i}\right)}_{1\le i\le N}$ be any set of time points satisfying ${t}_{0}<{t}_{1}<{t}_{2}<\cdots <{t}_{N}. Let ${\left({X}_{{t}_{i}}\right)}_{1\le i\le N}$ denote a $d$-dimensional Wiener sample path at these time points, and let $C$ be any $d$ by $d$ matrix such that $C{C}^{\mathrm{T}}$ is the desired covariance structure for the Wiener process. Each point ${X}_{{t}_{i}}$ of the sample path is constructed according to the Brownian bridge interpolation algorithm (see Glasserman (2004) or Section 2.6 in the g05 Chapter Introduction). We always start at some fixed point ${X}_{{t}_{0}}=x\in {ℝ}^{d}$. If we set ${X}_{T}=x+C\sqrt{T-{t}_{0}}Z$ where $Z$ is any $d$-dimensional standard Normal random variable, then $X$ will behave like a normal (free) Wiener process. However if we fix the terminal value ${X}_{T}=w\in {ℝ}^{d}$, then $X$ will behave like a non-free Wiener process.
The Brownian bridge increments generator uses the Brownian bridge algorithm to construct sample paths for the (free or non-free) Wiener process $X$, and then uses this to compute the scaled Wiener increments
 $Xt1 - Xt0 t1 - t0 , Xt2 - Xt1 t2 - t1 ,…, XtN - XtN-1 tN - tN-1 , XT - XtN T - tN .$
Such increments can be useful in computing numerical solutions to stochastic differential equations driven by (free or non-free) Wiener processes.

### 3.2  Implementation

Conceptually, the output of the Wiener increments generator is the same as if nag_rand_bb_init (g05xac) and nag_rand_bb (g05xbc) were called first, and the scaled increments then constructed from their output. The implementation adopts a much more efficient approach whereby the scaled increments are computed directly without first constructing the Wiener sample path.
Given the start and end points of the process, the order in which successive interpolation times ${t}_{j}$ are chosen is called the bridge construction order. The construction order is given by the array times. Further information on construction orders is given in Section 2.6.2 in the g05 Chapter Introduction. For clarity we consider here the common scenario where the Brownian bridge algorithm is used with quasi-random points. If pseudorandom numbers are used instead, these details can be ignored.
Suppose we require the increments of $P$ Wiener sample paths each of dimension $d$. The main input to the Brownian bridge increments generator is then an array of quasi-random points ${Z}^{1},{Z}^{2},\dots ,{Z}^{P}$ where each point ${Z}^{p}=\left({Z}_{1}^{p},{Z}_{2}^{p},\dots ,{Z}_{D}^{p}\right)$ has dimension $D=d\left(N+1\right)$ or $D=dN$ depending on whether a free or non-free Wiener process is required. When nag_rand_bb_inc (g05xdc) is called, the $p$th sample path for $1\le p\le P$ is constructed as follows: if a non-free Wiener process is required set ${X}_{T}$ equal to the terminal value $w$, otherwise construct ${X}_{T}$ as
 $XT = Xt0 + C T-t0 Z1p ⋮ Zdp$
where $C$ is the matrix described in Section 3.1. The array times holds the remaining time points ${t}_{1},{t}_{2},\dots {t}_{N}$ in the order in which the bridge is to be constructed. For each $j=1,\dots ,N$ set $r={\mathbf{times}}\left[j-1\right]$, find
 $q = max t0, times[i-1] : 1≤i
and
 $s = min T, times[i-1] : 1≤i r$
and construct the point ${X}_{r}$ as
 $Xr = Xq s-r + Xs r-q s-q + C s-r r-q s-q Zjd-ad+1p ⋮ Zjd-ad+dp$
where $a=0$ or $a=1$ depending on whether a free or non-free Wiener process is required. The function nag_rand_bb_make_bridge_order (g05xec) can be used to initialize the times array for several predefined bridge construction orders. Lastly, the scaled Wiener increments
 $Xt1 - Xt0 t1 - t0 , Xt2 - Xt1 t2 - t1 ,…, XtN - XtN-1 tN - tN-1 , XT - XtN T - tN$
are computed.

## 4  References

Glasserman P (2004) Monte Carlo Methods in Financial Engineering Springer

## 5  Arguments

1:    $\mathbf{t0}$doubleInput
On entry: the starting value ${t}_{0}$ of the time interval.
2:    $\mathbf{tend}$doubleInput
On entry: the end value $T$ of the time interval.
Constraint: ${\mathbf{tend}}>{\mathbf{t0}}$.
3:    $\mathbf{times}\left[{\mathbf{ntimes}}\right]$const doubleInput
On entry: the points in the time interval $\left({t}_{0},T\right)$ at which the Wiener process is to be constructed. The order in which points are listed in times determines the bridge construction order. The function nag_rand_bb_make_bridge_order (g05xec) can be used to create predefined bridge construction orders from a set of input times.
Constraints:
• ${\mathbf{t0}}<{\mathbf{times}}\left[\mathit{i}-1\right]<{\mathbf{tend}}$, for $\mathit{i}=1,2,\dots ,{\mathbf{ntimes}}$;
• ${\mathbf{times}}\left[i-1\right]\ne {\mathbf{times}}\left[j-1\right]$, for $i,j=1,2,\dots {\mathbf{ntimes}}$ and $i\ne j$.
4:    $\mathbf{ntimes}$IntegerInput
On entry: the length of times, denoted by $N$ in Section 3.1.
Constraint: ${\mathbf{ntimes}}\ge 1$.
5:    $\mathbf{rcomm}\left[12×\left({\mathbf{ntimes}}+1\right)\right]$doubleCommunication Array
On exit: communication array, used to store information between calls to nag_rand_bb_inc (g05xdc). This array MUST NOT be directly modified.
6:    $\mathbf{fail}$NagError *Input/Output
The NAG error argument (see Section 3.6 in the Essential Introduction).

## 6  Error Indicators and Warnings

NE_ALLOC_FAIL
Dynamic memory allocation failed.
See Section 3.2.1.2 in the Essential Introduction for further information.
On entry, argument $〈\mathit{\text{value}}〉$ had an illegal value.
NE_INT
On entry, ${\mathbf{ntimes}}=〈\mathit{\text{value}}〉$.
Constraint: ${\mathbf{ntimes}}\ge 1$.
NE_INTERNAL_ERROR
An internal error has occurred in this function. Check the function call and any array sizes. If the call is correct then please contact NAG for assistance.
See Section 3.6.6 in the Essential Introduction for further information.
NE_NO_LICENCE
Your licence key may have expired or may not have been installed correctly.
See Section 3.6.5 in the Essential Introduction for further information.
NE_REAL
On entry, ${\mathbf{tend}}=〈\mathit{\text{value}}〉$ and ${\mathbf{t0}}=〈\mathit{\text{value}}〉$.
Constraint: ${\mathbf{tend}}>{\mathbf{t0}}$.
NE_REAL_ARRAY
On entry, ${\mathbf{times}}\left[i-1\right]={\mathbf{times}}\left[j-1\right]=〈\mathit{\text{value}}〉$, for $i=〈\mathit{\text{value}}〉$ and $j=〈\mathit{\text{value}}〉$.
Constraint: all elements of times must be unique.
On entry, ${\mathbf{times}}\left[〈\mathit{\text{value}}〉\right]=〈\mathit{\text{value}}〉$, ${\mathbf{t0}}=〈\mathit{\text{value}}〉$ and ${\mathbf{tend}}=〈\mathit{\text{value}}〉$.
Constraint: ${\mathbf{t0}}<{\mathbf{times}}\left[i-1\right]<{\mathbf{tend}}$ for all $i$.

Not applicable.

## 8  Parallelism and Performance

Not applicable.

The efficient implementation of a Brownian bridge algorithm requires the use of a workspace array called the working stack. Since previously computed points will be used to interpolate new points, they should be kept close to the hardware processing units so that the data can be accessed quickly. Ideally the whole stack should be held in hardware cache. Different bridge construction orders may require different amounts of working stack. Indeed, a naive bridge algorithm may require a stack of size $\frac{N}{4}$ or even $\frac{N}{2}$, which could be very inefficient when $N$ is large. nag_rand_bb_inc_init (g05xcc) performs a detailed analysis of the bridge construction order specified by times. Heuristics are used to find an execution strategy which requires a small working stack, while still constructing the bridge in the order required.

## 10  Example

The following example program calls nag_rand_bb_init (g05xac) and nag_rand_bb (g05xbc) to generate two sample paths from a two-dimensional free Wiener process. It then calls nag_rand_bb_inc_init (g05xcc) and nag_rand_bb_inc (g05xdc) with the same input arguments to obtain the scaled increments of the Wiener sample paths. Lastly, the program prints the Wiener sample paths from nag_rand_bb (g05xbc), the scaled increments from nag_rand_bb_inc (g05xdc), and the cumulative sum of the unscaled increments side by side. Note that the cumulative sum of the unscaled increments is identical to the output of nag_rand_bb (g05xbc).

### 10.1  Program Text

Program Text (g05xcce.c)

None.

### 10.3  Program Results

Program Results (g05xcce.r)