# NAG CL Interfaceh05aac (best_​subset_​given_​size_​revcomm)

Settings help

CL Name Style:

## 1Purpose

Given a set of $m$ features and a scoring mechanism for any subset of those features, h05aac selects the best $n$ subsets of size $p$ using a reverse communication branch and bound algorithm.

## 2Specification

 #include
 void h05aac (Integer *irevcm, Integer mincr, Integer m, Integer ip, Integer nbest, Integer *drop, Integer *lz, Integer z[], Integer *la, Integer a[], double bscore[], Integer bz[], Integer mincnt, double gamma, const double acc[], Integer icomm[], Integer licomm, double rcomm[], Integer lrcomm, NagError *fail)
The function may be called by the names: h05aac, nag_mip_best_subset_given_size_revcomm or nag_best_subset_given_size_revcomm.

## 3Description

Given $\Omega =\left\{{x}_{i}:i\in ℤ,1\le i\le m\right\}$, a set of $m$ unique features and a scoring mechanism $f\left(S\right)$ defined for all $S\subseteq \Omega$ then h05aac is designed to find ${S}_{o1}\subseteq \Omega ,|{S}_{o1}|=p$, an optimal subset of size $p$. Here $|{S}_{o1}|$ denotes the cardinality of ${S}_{o1}$, the number of elements in the set.
The definition of the optimal subset depends on the properties of the scoring mechanism, if
 $f(Si) ≤ f(Sj) , for all ​ Sj ⊆ Ω ​ and ​ Si ⊆ Sj$ (1)
then the optimal subset is defined as one of the solutions to
 $maximize S⊆Ω f(S) subject to |S| = p$
else if
 $f(Si) ≥ f(Sj) , for all ​ Sj ⊆ Ω ​ and ​ Si ⊆ Sj$ (2)
then the optimal subset is defined as one of the solutions to
 $minimize S ⊆ Ω f(S) subject to |S| = p .$
If neither of these properties hold then h05aac cannot be used.
As well as returning the optimal subset, ${S}_{o1}$, h05aac can return the best $n$ solutions of size $p$. If ${S}_{o\mathit{i}}$ denotes the $\mathit{i}$th best subset, for $\mathit{i}=1,2,\dots ,n-1$, then the $\left(i+1\right)$th best subset is defined as the solution to either
 $maximize S ⊆ Ω - {Soj:j∈ℤ,1≤j≤i} f(S) subject to |S| = p$
or
 $minimize S ⊆ Ω - {Soj:j∈ℤ,1≤j≤i} f(S) subject to |S| = p$
depending on the properties of $f$.
The solutions are found using a branch and bound method, where each node of the tree is a subset of $\Omega$. Assuming that (1) holds then a particular node, defined by subset ${S}_{i}$, can be trimmed from the tree if $f\left({S}_{i}\right)<\stackrel{^}{f}\left({S}_{on}\right)$ where $\stackrel{^}{f}\left({S}_{on}\right)$ is the $n$th highest score we have observed so far for a subset of size $p$, i.e., our current best guess of the score for the $n$th best subset. In addition, because of (1) we can also drop all nodes defined by any subset ${S}_{j}$ where ${S}_{j}\subseteq {S}_{i}$, thus avoiding the need to enumerate the whole tree. Similar short cuts can be taken if (2) holds. A full description of this branch and bound algorithm can be found in Ridout (1988).
Rather than calculate the score at a given node of the tree h05aac utilizes the fast branch and bound algorithm of Somol et al. (2004), and attempts to estimate the score where possible. For each feature, ${x}_{i}$, two values are stored, a count ${c}_{i}$ and ${\stackrel{^}{\mu }}_{i}$, an estimate of the contribution of that feature. An initial value of zero is used for both ${c}_{i}$ and ${\stackrel{^}{\mu }}_{i}$. At any stage of the algorithm where both $f\left(S\right)$ and $f\left(S-\left\{{x}_{i}\right\}\right)$ have been calculated (as opposed to estimated), the estimated contribution of the feature ${x}_{i}$ is updated to
 $ciμ^i + [f(S)-f(S-{xj})] ci+1$
and ${c}_{i}$ is incremented by $1$, therefore, at each stage ${\stackrel{^}{\mu }}_{i}$ is the mean contribution of ${x}_{i}$ observed so far and ${c}_{i}$ is the number of observations used to calculate that mean.
As long as ${c}_{i}\ge k$, for the user-supplied constant $k$, then rather than calculating $f\left(S-\left\{{x}_{i}\right\}\right)$ this function estimates it using $\stackrel{^}{f}\left(S-\left\{{x}_{i}\right\}\right)=f\left(S\right)-\gamma {\stackrel{^}{\mu }}_{i}$ or $\stackrel{^}{f}\left(S\right)-\gamma {\stackrel{^}{\mu }}_{i}$ if $f\left(S\right)$ has been estimated, where $\gamma$ is a user-supplied scaling factor. An estimated score is never used to trim a node or returned as the optimal score.
Setting $k=0$ in this function will cause the algorithm to always calculate the scores, returning to the branch and bound algorithm of Ridout (1988). In most cases it is preferable to use the fast branch and bound algorithm, by setting $k>0$, unless the score function is iterative in nature, i.e., $f\left(S\right)$ must have been calculated before $f\left(S-\left\{{x}_{i}\right\}\right)$ can be calculated.

## 4References

Narendra P M and Fukunaga K (1977) A branch and bound algorithm for feature subset selection IEEE Transactions on Computers 9 917–922
Ridout M S (1988) Algorithm AS 233: An improved branch and bound algorithm for feature subset selection Journal of the Royal Statistics Society, Series C (Applied Statistics) (Volume 37) 1 139–147
Somol P, Pudil P and Kittler J (2004) Fast branch and bound algorithms for optimal feature selection IEEE Transactions on Pattern Analysis and Machine Intelligence (Volume 26) 7 900–912

## 5Arguments

Note: this function uses reverse communication. Its use involves an initial entry, intermediate exits and re-entries, and a final exit, as indicated by the argument irevcm. Between intermediate exits and re-entries, all arguments other than bscore must remain unchanged.
1: $\mathbf{irevcm}$Integer * Input/Output
On initial entry: must be set to $0$.
On intermediate exit: ${\mathbf{irevcm}}=1$ and before re-entry the scores associated with la subsets must be calculated and returned in bscore.
The la subsets are constructed as follows:
${\mathbf{drop}}=1$
The $j$th subset is constructed by dropping the features specified in the first lz elements of z and the single feature given in ${\mathbf{a}}\left[j-1\right]$ from the full set of features, $\Omega$. The subset will, therefore, contain ${\mathbf{m}}-{\mathbf{lz}}-1$ features.
${\mathbf{drop}}=0$
The $j$th subset is constructed by adding the features specified in the first lz elements of z and the single feature specified in ${\mathbf{a}}\left[j-1\right]$ to the empty set, $\varnothing$. The subset will, therefore, contain ${\mathbf{lz}}+1$ features.
In both cases the individual features are referenced by the integers $1$ to m with $1$ indicating the first feature, $2$ the second, etc., for some arbitrary ordering of the features. The same ordering must be used in all calls to h05aac.
If ${\mathbf{la}}=0$, the score for a single subset should be returned. This subset is constructed by adding or removing only those features specified in the first lz elements of z.
If ${\mathbf{lz}}=0$, this subset will either be $\Omega$ or $\varnothing$.
The score associated with the $j$th subset must be returned in ${\mathbf{bscore}}\left[j-1\right]$.
On intermediate re-entry: irevcm must remain unchanged.
On final exit: ${\mathbf{irevcm}}=0$, and the algorithm has terminated.
Constraint: ${\mathbf{irevcm}}=0$ or $1$.
Note: any values you return to h05aac as part of the reverse communication procedure should not include floating-point NaN (Not a Number) or infinity values, since these are not handled by h05aac. If your code inadvertently does return any NaNs or infinities, h05aac is likely to produce unexpected results.
2: $\mathbf{mincr}$Integer Input
On entry: flag indicating whether the scoring function $f$ is increasing or decreasing.
${\mathbf{mincr}}=1$
$f\left({S}_{i}\right)\le f\left({S}_{j}\right)$, i.e., the subsets with the largest score will be selected.
${\mathbf{mincr}}=0$
$f\left({S}_{i}\right)\ge f\left({S}_{j}\right)$, i.e., the subsets with the smallest score will be selected.
For all ${S}_{j}\subseteq \Omega$ and ${S}_{i}\subseteq {S}_{j}$.
Constraint: ${\mathbf{mincr}}=0$ or $1$.
3: $\mathbf{m}$Integer Input
On entry: $m$, the number of features in the full feature set.
Constraint: ${\mathbf{m}}\ge 2$.
4: $\mathbf{ip}$Integer Input
On entry: $p$, the number of features in the subset of interest.
Constraint: $1\le {\mathbf{ip}}\le {\mathbf{m}}$.
5: $\mathbf{nbest}$Integer Input
On entry: $n$, the maximum number of best subsets required. The actual number of subsets returned is given by la on final exit. If on final exit ${\mathbf{la}}\ne {\mathbf{nbest}}$ then ${\mathbf{fail}}\mathbf{.}\mathbf{code}=$ NE_TOO_MANY is returned.
Constraint: ${\mathbf{nbest}}\ge 1$.
6: $\mathbf{drop}$Integer * Input/Output
On initial entry: drop need not be set.
On intermediate exit: flag indicating whether the intermediate subsets should be constructed by dropping features from the full set (${\mathbf{drop}}=1$) or adding features to the empty set (${\mathbf{drop}}=0$). See irevcm for details.
On intermediate re-entry: drop must remain unchanged.
On final exit: drop is undefined.
7: $\mathbf{lz}$Integer * Input/Output
On initial entry: lz need not be set.
On intermediate exit: the number of features stored in z.
On intermediate re-entry: lz must remain unchanged.
On final exit: lz is undefined.
8: $\mathbf{z}\left[{\mathbf{m}}-{\mathbf{ip}}\right]$Integer Input/Output
On initial entry: z need not be set.
On intermediate exit: ${\mathbf{z}}\left[\mathit{i}-1\right]$, for $\mathit{i}=1,2,\dots ,{\mathbf{lz}}$, contains the list of features which, along with those specified in a, define the subsets whose score is required. See irevcm for additional details.
On intermediate re-entry: z must remain unchanged.
On final exit: z is undefined.
9: $\mathbf{la}$Integer * Input/Output
On initial entry: la need not be set.
On intermediate exit: if ${\mathbf{la}}>0$, the number of subsets for which a score must be returned.
If ${\mathbf{la}}=0$, the score for a single subset should be returned. See irevcm for additional details.
On intermediate re-entry: la must remain unchanged.
On final exit: the number of best subsets returned.
10: $\mathbf{a}\left[\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left({\mathbf{nbest}},{\mathbf{m}}\right)\right]$Integer Input/Output
On initial entry: a need not be set.
On intermediate exit: ${\mathbf{a}}\left[\mathit{j}-1\right]$, for $\mathit{j}=1,2,\dots ,{\mathbf{la}}$, contains the list of features which, along with those specified in z, define the subsets whose score is required. See irevcm for additional details.
On intermediate re-entry: a must remain unchanged.
On final exit: a is undefined.
11: $\mathbf{bscore}\left[\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left({\mathbf{nbest}},{\mathbf{m}}\right)\right]$double Input/Output
On initial entry: bscore need not be set.
On intermediate exit: bscore is undefined.
On intermediate re-entry: ${\mathbf{bscore}}\left[j-1\right]$ must hold the score for the $j$th subset as described in irevcm.
On final exit: holds the score for the la best subsets returned in bz.
12: $\mathbf{bz}\left[\left({\mathbf{m}}-{\mathbf{ip}}\right)×{\mathbf{nbest}}\right]$Integer Input/Output
Note: where ${\mathbf{BZ}}\left(i,j\right)$ appears in this document, it refers to the array element ${\mathbf{bz}}\left[\left(j-1\right)×\left({\mathbf{m}}-{\mathbf{ip}}\right)+i-1\right]$.
On initial entry: bz need not be set.
On intermediate exit: bz is used for storage between calls to h05aac.
On intermediate re-entry: bz must remain unchanged.
On final exit: the $j$th best subset is constructed by dropping the features specified in ${\mathbf{BZ}}\left(\mathit{i},\mathit{j}\right)$, for $\mathit{i}=1,2,\dots ,{\mathbf{m}}-{\mathbf{ip}}$ and $\mathit{j}=1,2,\dots ,{\mathbf{la}}$, from the set of all features, $\Omega$. The score for the $j$th best subset is given in ${\mathbf{bscore}}\left[j-1\right]$.
13: $\mathbf{mincnt}$Integer Input
On entry: $k$, the minimum number of times the effect of each feature, ${x}_{i}$, must have been observed before $f\left(S-\left\{{x}_{i}\right\}\right)$ is estimated from $f\left(S\right)$ as opposed to being calculated directly.
If $k=0$ then $f\left(S-\left\{{x}_{i}\right\}\right)$ is never estimated. If ${\mathbf{mincnt}}<0$ then $k$ is set to $1$.
14: $\mathbf{gamma}$double Input
On entry: $\gamma$, the scaling factor used when estimating scores. If ${\mathbf{gamma}}<0$ then $\gamma =1$ is used.
15: $\mathbf{acc}\left[2\right]$const double Input
On entry: a measure of the accuracy of the scoring function, $f$.
Letting ${a}_{i}={\epsilon }_{1}|f\left({S}_{i}\right)|+{\epsilon }_{2}$, then when confirming whether the scoring function is strictly increasing or decreasing (as described in mincr), or when assessing whether a node defined by subset ${S}_{i}$ can be trimmed, then any values in the range $f\left({S}_{i}\right)±{a}_{i}$ are treated as being numerically equivalent.
If $0\le {\mathbf{acc}}\left[0\right]\le 1$ then ${\epsilon }_{1}={\mathbf{acc}}\left[0\right]$, otherwise ${\epsilon }_{1}=0$.
If ${\mathbf{acc}}\left[1\right]\ge 0$ then ${\epsilon }_{2}={\mathbf{acc}}\left[1\right]$, otherwise ${\epsilon }_{2}=0$.
In most situations setting both ${\epsilon }_{1}$ and ${\epsilon }_{2}$ to zero should be sufficient. Using a nonzero value, when one is not required, can significantly increase the number of subsets that need to be evaluated.
16: $\mathbf{icomm}\left[{\mathbf{licomm}}\right]$Integer Communication Array
On initial entry: icomm need not be set.
On intermediate exit: icomm is used for storage between calls to h05aac.
On intermediate re-entry: icomm must remain unchanged.
On final exit: icomm is not defined. The first two elements, ${\mathbf{icomm}}\left[0\right]$ and ${\mathbf{icomm}}\left[1\right]$ contain the minimum required value for licomm and lrcomm respectively.
17: $\mathbf{licomm}$Integer Input
On entry: the length of the array icomm. If licomm is too small and ${\mathbf{licomm}}\ge 2$ then ${\mathbf{fail}}\mathbf{.}\mathbf{code}=$ NE_ARRAY_SIZE is returned and the minimum value for licomm and lrcomm are given by ${\mathbf{icomm}}\left[0\right]$ and ${\mathbf{icomm}}\left[1\right]$ respectively.
Constraints:
• if ${\mathbf{mincnt}}=0\phantom{\rule{0ex}{0ex}}$, ${\mathbf{licomm}}\ge 2×\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left({\mathbf{nbest}},{\mathbf{m}}\right)+{\mathbf{m}}\left({\mathbf{m}}+2\right)+\left({\mathbf{m}}+1\right)×\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left({\mathbf{m}}-{\mathbf{ip}},1\right)+27$;
• otherwise ${\mathbf{licomm}}\ge 2×\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left({\mathbf{nbest}},{\mathbf{m}}\right)+{\mathbf{m}}\left({\mathbf{m}}+3\right)+\left(2{\mathbf{m}}+1\right)×\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left({\mathbf{m}}-{\mathbf{ip}},1\right)+25$.
18: $\mathbf{rcomm}\left[{\mathbf{lrcomm}}\right]$double Communication Array
On initial entry: rcomm need not be set.
On intermediate exit: rcomm is used for storage between calls to h05aac.
On intermediate re-entry: rcomm must remain unchanged.
On final exit: rcomm is not defined.
19: $\mathbf{lrcomm}$Integer Input
On entry: the length of the array rcomm. If lrcomm is too small and ${\mathbf{licomm}}\ge 2$ then ${\mathbf{fail}}\mathbf{.}\mathbf{code}=$ NE_ARRAY_SIZE is returned and the minimum value for licomm and lrcomm are given by ${\mathbf{icomm}}\left[0\right]$ and ${\mathbf{icomm}}\left[1\right]$ respectively.
Constraints:
• if ${\mathbf{mincnt}}=0$, ${\mathbf{lrcomm}}\ge 9+{\mathbf{nbest}}+{\mathbf{m}}×\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left({\mathbf{m}}-{\mathbf{ip}},1\right)$;
• otherwise ${\mathbf{lrcomm}}\ge 8+{\mathbf{m}}+{\mathbf{nbest}}+{\mathbf{m}}×\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left({\mathbf{m}}-{\mathbf{ip}},1\right)$.
20: $\mathbf{fail}$NagError * Input/Output
The NAG error argument (see Section 7 in the Introduction to the NAG Library CL Interface).

## 6Error Indicators and Warnings

NE_ALLOC_FAIL
Dynamic memory allocation failed.
See Section 3.1.2 in the Introduction to the NAG Library CL Interface for further information.
NE_ARRAY_SIZE
On entry, ${\mathbf{licomm}}=⟨\mathit{\text{value}}⟩$, ${\mathbf{lrcomm}}=⟨\mathit{\text{value}}⟩$.
Constraint: ${\mathbf{licomm}}\ge ⟨\mathit{\text{value}}⟩$, ${\mathbf{lrcomm}}\ge ⟨\mathit{\text{value}}⟩$.
The minimum required values for licomm and lrcomm are returned in ${\mathbf{icomm}}\left[0\right]$ and ${\mathbf{icomm}}\left[1\right]$ respectively.
On entry, argument $⟨\mathit{\text{value}}⟩$ had an illegal value.
NE_ILLEGAL_COMM
icomm has been corrupted between calls.
rcomm has been corrupted between calls.
NE_INT
On entry, ${\mathbf{irevcm}}=⟨\mathit{\text{value}}⟩$.
Constraint: ${\mathbf{irevcm}}=0$ or $1$.
On entry, ${\mathbf{m}}=⟨\mathit{\text{value}}⟩$.
Constraint: ${\mathbf{m}}\ge 2$.
On entry, ${\mathbf{mincr}}=⟨\mathit{\text{value}}⟩$.
Constraint: ${\mathbf{mincr}}=0$ or $1$.
On entry, ${\mathbf{nbest}}=⟨\mathit{\text{value}}⟩$.
Constraint: ${\mathbf{nbest}}\ge 1$.
NE_INT_2
On entry, ${\mathbf{ip}}=⟨\mathit{\text{value}}⟩$ and ${\mathbf{m}}=⟨\mathit{\text{value}}⟩$.
Constraint: $1\le {\mathbf{ip}}\le {\mathbf{m}}$.
NE_INT_CHANGED
drop has changed between calls.
On intermediate entry, ${\mathbf{drop}}=⟨\mathit{\text{value}}⟩$.
On initial entry, ${\mathbf{drop}}=⟨\mathit{\text{value}}⟩$.
ip has changed between calls.
On intermediate entry, ${\mathbf{ip}}=⟨\mathit{\text{value}}⟩$.
On initial entry, ${\mathbf{ip}}=⟨\mathit{\text{value}}⟩$.
la has changed between calls.
On entry, ${\mathbf{la}}=⟨\mathit{\text{value}}⟩$.
On previous exit, ${\mathbf{la}}=⟨\mathit{\text{value}}⟩$.
lz has changed between calls.
On entry, ${\mathbf{lz}}=⟨\mathit{\text{value}}⟩$.
On previous exit, ${\mathbf{lz}}=⟨\mathit{\text{value}}⟩$.
m has changed between calls.
On intermediate entry, ${\mathbf{m}}=⟨\mathit{\text{value}}⟩$.
On initial entry, ${\mathbf{m}}=⟨\mathit{\text{value}}⟩$.
mincnt has changed between calls.
On intermediate entry, ${\mathbf{mincnt}}=⟨\mathit{\text{value}}⟩$.
On initial entry, ${\mathbf{mincnt}}=⟨\mathit{\text{value}}⟩$.
mincr has changed between calls.
On intermediate entry, ${\mathbf{mincr}}=⟨\mathit{\text{value}}⟩$.
On initial entry, ${\mathbf{mincr}}=⟨\mathit{\text{value}}⟩$.
nbest has changed between calls.
On intermediate entry, ${\mathbf{nbest}}=⟨\mathit{\text{value}}⟩$.
On initial entry, ${\mathbf{nbest}}=⟨\mathit{\text{value}}⟩$.
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 7.5 in the Introduction to the NAG Library CL Interface for further information.
NE_NO_LICENCE
Your licence key may have expired or may not have been installed correctly.
See Section 8 in the Introduction to the NAG Library CL Interface for further information.
NE_REAL
${\mathbf{bscore}}\left[⟨\mathit{\text{value}}⟩\right]=⟨\mathit{\text{value}}⟩$, which is inconsistent with the score for the parent node. Score for the parent node is $⟨\mathit{\text{value}}⟩$.
NE_REAL_CHANGED
${\mathbf{acc}}\left[0\right]$ has changed between calls.
On intermediate entry, ${\mathbf{acc}}\left[0\right]=⟨\mathit{\text{value}}⟩$.
On initial entry, ${\mathbf{acc}}\left[0\right]=⟨\mathit{\text{value}}⟩$.
${\mathbf{acc}}\left[1\right]$ has changed between calls.
On intermediate entry, ${\mathbf{acc}}\left[1\right]=⟨\mathit{\text{value}}⟩$.
On initial entry, ${\mathbf{acc}}\left[1\right]=⟨\mathit{\text{value}}⟩$.
gamma has changed between calls.
On intermediate entry, ${\mathbf{gamma}}=⟨\mathit{\text{value}}⟩$.
On initial entry, ${\mathbf{gamma}}=⟨\mathit{\text{value}}⟩$.
NE_TOO_MANY
On entry, ${\mathbf{nbest}}=⟨\mathit{\text{value}}⟩$.
But only $⟨\mathit{\text{value}}⟩$ best subsets could be calculated.
NE_TOO_SMALL
On entry, ${\mathbf{licomm}}=⟨\mathit{\text{value}}⟩$, ${\mathbf{lrcomm}}=⟨\mathit{\text{value}}⟩$.
Constraint: ${\mathbf{licomm}}\ge ⟨\mathit{\text{value}}⟩$, ${\mathbf{lrcomm}}\ge ⟨\mathit{\text{value}}⟩$.
icomm is too small to return the required array sizes.

## 7Accuracy

The subsets returned by h05aac are guaranteed to be optimal up to the accuracy of your calculated scores.

## 8Parallelism and Performance

h05aac 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 function. Please also consult the Users' Note for your implementation for any additional implementation-specific information.

The maximum number of unique subsets of size $p$ from a set of $m$ features is $N=\frac{m!}{\left(m-p\right)!p!}$. The efficiency of the branch and bound algorithm implemented in h05aac comes from evaluating subsets at internal nodes of the tree, that is subsets with more than $p$ features, and where possible trimming branches of the tree based on the scores at these internal nodes as described in Narendra and Fukunaga (1977). Because of this it is possible, in some circumstances, for more than $N$ subsets to be evaluated. This will tend to happen when most of the features have a similar effect on the subset score.
If multiple optimal subsets exist with the same score, and nbest is too small to return them all, then the choice of which of these optimal subsets is returned is arbitrary.

## 10Example

This example finds the three linear regression models, with five variables, that have the smallest residual sums of squares when fitted to a supplied dataset. The data used in this example was simulated.

### 10.1Program Text

Program Text (h05aace.c)

### 10.2Program Data

Program Data (h05aace.d)

### 10.3Program Results

Program Results (h05aace.r)