G01 Chapter Contents
G01 Chapter Introduction
NAG Library Manual

# NAG Library Routine DocumentG01APF

Note:  before using this routine, please read the Users' Note for your implementation to check the interpretation of bold italicised terms and other implementation-dependent details.

## 1  Purpose

G01APF finds approximate quantiles from a large arbitrary-sized data stream using an out-of-core algorithm.

## 2  Specification

 SUBROUTINE G01APF ( IND, RV, NB, EPS, NP, Q, QV, NQ, RCOMM, LRCOMM, ICOMM, LICOMM, IFAIL)
 INTEGER IND, NB, NP, NQ, LRCOMM, ICOMM(LICOMM), LICOMM, IFAIL REAL (KIND=nag_wp) RV(*), EPS, Q(*), QV(*), RCOMM(LRCOMM)

## 3  Description

A quantile is a value which divides a frequency distribution such that there is a given proportion of data values below the quantile. For example, the median of a dataset is the $0.5$ quantile because half the values are less than or equal to it.
G01APF uses a slightly modified version of an algorithm described in a paper by Zhang and Wang (2007) to determine $\epsilon$-approximate quantiles of a large arbitrary-sized data stream of real values, where $\epsilon$ is a user-defined approximation factor. Let $m$ denote the number of data elements processed so far then, given any quantile $q\in \left[0.0,1.0\right]$, an $\epsilon$-approximate quantile is defined as an element in the data stream whose rank falls within $\left[\left(q-\epsilon \right)m,\left(q+\epsilon \right)m\right]$. In case of more than one $\epsilon$-approximate quantile being available, the one closest to $qm$ is used.

## 4  References

Zhang Q and Wang W (2007) A fast algorithm for approximate quantiles in high speed data streams Proceedings of the 19th International Conference on Scientific and Statistical Database Management IEEE Computer Society 29

## 5  Parameters

1:     $\mathrm{IND}$ – INTEGERInput/Output
On initial entry: must be set to $0$.
On entry: indicates the action required in the current call to G01APF.
${\mathbf{IND}}=0$
Initialize the communication arrays and attempt to process the first NB values from the data stream. EPS, RV and NB must be set and LICOMM must be at least $10$.
${\mathbf{IND}}=1$
Attempt to process the next block of NB values from the data stream. The calling program must update RV and (if required) NB, and re-enter G01APF with all other parameters unchanged.
${\mathbf{IND}}=2$
Continue calculation following the reallocation of either or both of the communication arrays RCOMM and ICOMM.
${\mathbf{IND}}=3$
Calculate the NQ $\epsilon$-approximate quantiles specified in Q. The calling program must set Q and NQ and re-enter G01APF with all other parameters unchanged. This option can be chosen only when ${\mathbf{NP}}\ge ⌈\mathrm{exp}\left(1.0\right)/{\mathbf{EPS}}⌉$.
On exit: indicates output from the call.
${\mathbf{IND}}=1$
G01APF has processed NP data points and expects to be called again with additional data.
${\mathbf{IND}}=2$
Either one or more of the communication arrays RCOMM and ICOMM is too small. The new minimum lengths of RCOMM and ICOMM have been returned in ${\mathbf{ICOMM}}\left(1\right)$ and ${\mathbf{ICOMM}}\left(2\right)$ respectively. If the new minimum length is greater than the current length then the corresponding communication array needs to be reallocated, its contents preserved and G01APF called again with all other parameters unchanged.
If there is more data to be processed, it is recommended that LRCOMM and LICOMM are made significantly bigger than the minimum to limit the number of reallocations.
${\mathbf{IND}}=3$
G01APF has returned the requested $\epsilon$-approximate quantiles in QV. These quantiles are based on NP data points.
Constraint: ${\mathbf{IND}}=0$, $1$, $2$ or $3$.
2:     $\mathrm{RV}\left(*\right)$ – REAL (KIND=nag_wp) arrayInput
Note: the dimension of the array RV must be at least ${\mathbf{NB}}$ if ${\mathbf{IND}}=0$, $1$ or $2$.
On entry: if ${\mathbf{IND}}=0$, $1$ or $2$, the vector containing the current block of data, otherwise RV is not referenced.
3:     $\mathrm{NB}$ – INTEGERInput
On entry: if ${\mathbf{IND}}=0$, $1$ or $2$, the size of the current block of data. The size of blocks of data in array RV can vary; therefore NB can change between calls to G01APF.
Constraint: if ${\mathbf{IND}}=0$, $1$ or $2$, ${\mathbf{NB}}>0$.
4:     $\mathrm{EPS}$ – REAL (KIND=nag_wp)Input
On entry: approximation factor $\epsilon$.
Constraint: ${\mathbf{EPS}}>0.0\text{​ and ​}{\mathbf{EPS}}\le 1.0$.
5:     $\mathrm{NP}$ – INTEGEROutput
On exit: $m$, the number of elements processed so far.
6:     $\mathrm{Q}\left(*\right)$ – REAL (KIND=nag_wp) arrayInput
Note: the dimension of the array Q must be at least ${\mathbf{NQ}}$ if ${\mathbf{IND}}=3$.
On entry: if ${\mathbf{IND}}=3$, the quantiles to be calculated, otherwise Q is not referenced. Note that ${\mathbf{Q}}\left(i\right)=0.0$, corresponds to the minimum value and ${\mathbf{Q}}\left(i\right)=1.0$ to the maximum value.
Constraint: if ${\mathbf{IND}}=3$, $0.0\le {\mathbf{Q}}\left(\mathit{i}\right)\le 1.0$, for $\mathit{i}=1,2,\dots ,{\mathbf{NQ}}$.
7:     $\mathrm{QV}\left(*\right)$ – REAL (KIND=nag_wp) arrayOutput
Note: the dimension of the array QV must be at least ${\mathbf{NQ}}$ if ${\mathbf{IND}}=3$.
On exit: if ${\mathbf{IND}}=3$, ${\mathbf{QV}}\left(i\right)$ contains the $\epsilon$-approximate quantiles specified by the value provided in ${\mathbf{Q}}\left(i\right)$.
8:     $\mathrm{NQ}$ – INTEGERInput
On entry: if ${\mathbf{IND}}=3$, the number of quantiles requested, otherwise NQ is not referenced.
Constraint: if ${\mathbf{IND}}=3$, ${\mathbf{NQ}}>0$.
9:     $\mathrm{RCOMM}\left({\mathbf{LRCOMM}}\right)$ – REAL (KIND=nag_wp) arrayCommunication Array
On entry: if ${\mathbf{IND}}=1$ or $2$ then the first $l$ elements of RCOMM as supplied to G01APF must be identical to the first $l$ elements of RCOMM returned from the last call to G01APF, where $l$ is the value of LRCOMM used in the last call. In other words, the contents of RCOMM must not be altered between calls to this routine. If RCOMM needs to be reallocated then its contents must be preserved. If ${\mathbf{IND}}=0$ then RCOMM need not be set.
On exit: RCOMM holds information required by subsequent calls to G01APF
10:   $\mathrm{LRCOMM}$ – INTEGERInput
On entry: the dimension of the array RCOMM as declared in the (sub)program from which G01APF is called.
Constraints:
• if ${\mathbf{IND}}=0$, ${\mathbf{LRCOMM}}\ge 1$;
• otherwise ${\mathbf{LRCOMM}}\ge {\mathbf{ICOMM}}\left(1\right)$.
11:   $\mathrm{ICOMM}\left({\mathbf{LICOMM}}\right)$ – INTEGER arrayCommunication Array
On entry: if ${\mathbf{IND}}=1$ or $2$ then the first $l$ elements of ICOMM as supplied to G01APF must be identical to the first $l$ elements of ICOMM returned from the last call to G01APF, where $l$ is the value of LICOMM used in the last call. In other words, the contents of ICOMM must not be altered between calls to this routine. If ICOMM needs to be reallocated then its contents must be preserved. If ${\mathbf{IND}}=0$ then ICOMM need not be set.
On exit: ${\mathbf{ICOMM}}\left(1\right)$ holds the minimum required length for RCOMM and ${\mathbf{ICOMM}}\left(2\right)$ holds the minimum required length for ICOMM. The remaining elements of ICOMM are used for communication between subsequent calls to G01APF.
12:   $\mathrm{LICOMM}$ – INTEGERInput
On entry: the dimension of the array ICOMM as declared in the (sub)program from which G01APF is called.
Constraints:
• if ${\mathbf{IND}}=0$, ${\mathbf{LICOMM}}\ge 10$;
• otherwise ${\mathbf{LICOMM}}\ge {\mathbf{ICOMM}}\left(2\right)$.
13:   $\mathrm{IFAIL}$ – INTEGERInput/Output
On entry: IFAIL must be set to $0$, $-1\text{​ or ​}1$. If you are unfamiliar with this parameter you should refer to Section 3.3 in the Essential Introduction for details.
On exit: ${\mathbf{IFAIL}}={\mathbf{0}}$ unless the routine detects an error (see Section 6).
As an out-of-core routine G01APF will only perform certain parameter checks when a data checkpoint (including completion of data input) is signaled. As such it will usually be inappropriate to halt program execution when an error is detected since any errors may be subsequently resolved without losing any processing already carried out. Therefore setting IFAIL to a value of $-1\text{​ or ​}1$ is recommended. If the output of error messages is undesirable, then the value $1$ is recommended. When the value $-\mathbf{1}\text{​ or ​}\mathbf{1}$ is used it is essential to test the value of IFAIL on exit.

## 6  Error Indicators and Warnings

If on entry ${\mathbf{IFAIL}}={\mathbf{0}}$ or $-{\mathbf{1}}$, explanatory error messages are output on the current error message unit (as defined by X04AAF).
Errors or warnings detected by the routine:
${\mathbf{IFAIL}}=1$
On entry, ${\mathbf{IND}}=〈\mathit{\text{value}}〉$.
Constraint: ${\mathbf{IND}}=0$, $1$, $2$ or $3$.
${\mathbf{IFAIL}}=2$
On entry, ${\mathbf{EPS}}=〈\mathit{\text{value}}〉$.
Constraint: $0.0<{\mathbf{EPS}}\le 1.0$.
${\mathbf{IFAIL}}=3$
On entry, ${\mathbf{IND}}=0$, $1$ or $2$ and ${\mathbf{NB}}=〈\mathit{\text{value}}〉$.
Constraint: if ${\mathbf{IND}}=0$, $1$ or $2$ then ${\mathbf{NB}}>0$.
${\mathbf{IFAIL}}=4$
On entry, ${\mathbf{LICOMM}}=〈\mathit{\text{value}}〉$.
Constraint: ${\mathbf{LICOMM}}\ge 10$.
${\mathbf{IFAIL}}=5$
On entry, ${\mathbf{LRCOMM}}=〈\mathit{\text{value}}〉$.
Constraint: ${\mathbf{LRCOMM}}\ge 1$.
${\mathbf{IFAIL}}=6$
The contents of ICOMM have been altered between calls to this routine.
${\mathbf{IFAIL}}=7$
The contents of RCOMM have been altered between calls to this routine.
${\mathbf{IFAIL}}=8$
Number of data elements streamed, $〈\mathit{\text{value}}〉$ is not sufficient for a quantile query when ${\mathbf{EPS}}=〈\mathit{\text{value}}〉$.
Supply more data or reprocess the data with a higher EPS value.
${\mathbf{IFAIL}}=9$
On entry, ${\mathbf{IND}}=3$ and ${\mathbf{NQ}}=〈\mathit{\text{value}}〉$.
Constraint: if ${\mathbf{IND}}=3$ then ${\mathbf{NQ}}>0$.
${\mathbf{IFAIL}}=10$
On entry, ${\mathbf{IND}}=3$ and ${\mathbf{Q}}\left(〈\mathit{\text{value}}〉\right)=〈\mathit{\text{value}}〉$.
Constraint: if ${\mathbf{IND}}=3$ then $0.0\le {\mathbf{Q}}\left(i\right)\le 1.0$ for all $i$.
${\mathbf{IFAIL}}=-99$
See Section 3.8 in the Essential Introduction for further information.
${\mathbf{IFAIL}}=-399$
Your licence key may have expired or may not have been installed correctly.
See Section 3.7 in the Essential Introduction for further information.
${\mathbf{IFAIL}}=-999$
Dynamic memory allocation failed.
See Section 3.6 in the Essential Introduction for further information.

Not applicable.

## 8  Parallelism and Performance

G01APF is threaded by NAG for parallel execution in multithreaded implementations of the NAG Library.
Please consult the X06 Chapter Introduction for information on how to control and interrogate the OpenMP environment used within this routine. Please also consult the Users' Note for your implementation for any additional implementation-specific information.

The average time taken by G01APF scales as ${\mathbf{NP}}\mathrm{log}\left(1/\epsilon \mathrm{log}\left(\epsilon {\mathbf{NP}}\right)\right)$.
It is not possible to determine in advance the final size of the communication arrays RCOMM and ICOMM without knowing the size of the dataset. However, if a rough size ($n$) is known, the speed of the computation can be increased if the sizes of the communication arrays are not smaller than
 $LRCOMM = log2 n×EPS+1.0 - 2 × 1.0/EPS +1+x+ 2× minx, x/2.0 +1 × y +1 LICOMM = log2 n×EPS+1.0 - 2 × 2 × 1.0/EPS +1 + 1 + 2 × x+2× minx, x/2.0 +1 × y + y + 11$
where
 $x= max1, log⁡ EPS×n / EPS y = log2n/x+1.0 +1 .$

## 10  Example

This example computes a list of $\epsilon$-approximate quantiles. The data is processed in blocks of $20$ observations at a time to simulate a situation in which the data is made available in a piecemeal fashion.

### 10.1  Program Text

Program Text (g01apfe.f90)

### 10.2  Program Data

Program Data (g01apfe.d)

### 10.3  Program Results

Program Results (g01apfe.r)