%%
%% This is file `lexample.tex',
%% Sample file for siam macros for use with LaTeX 2e
%%
%% By Paul Duggan for the Society for Industrial and Applied
%% Mathematics.
%%
%% October 1, 1995
%%
%% Version 1.0
%%
%% You are not allowed to change this file.
%%
%% You are allowed to distribute this file under the condition that
%% it is distributed together with all of the files in the siam macro
%% distribution. These are:
%%
%%  siamltex.cls (main LaTeX macro file for SIAM)
%%  siamltex.sty (includes siamltex.cls for compatibility mode)
%%  siam10.clo   (size option for 10pt papers)
%%  subeqn.clo   (allows equation numbers with lettered subelements)
%%  siam.bst     (bibliographic style file for BibTeX)
%%  docultex.tex (documentation file)
%%  lexample.tex (this file)
%%
%% If you receive only some of these files from someone, complain!
%%
%% \CharacterTable
%%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%%   Digits        \0\1\2\3\4\5\6\7\8\9
%%   Exclamation   \!     Double quote  \"     Hash (number) \#
%%   Dollar        \$     Percent       \%     Ampersand     \&
%%   Acute accent  \'     Left paren    \(     Right paren   \)
%%   Asterisk      \*     Plus          \+     Comma         \,
%%   Minus         \-     Point         \.     Solidus       \/
%%   Colon         \:     Semicolon     \;     Less than     \<
%%   Equals        \=     Greater than  \>     Question mark \?
%%   Commercial at \@     Left bracket  \[     Backslash     \\
%%   Right bracket \]     Circumflex    \^     Underscore    \_
%%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%%   Right brace   \}     Tilde         \~}


\documentclass[final]{siamart220329}

\usepackage{graphicx}
\usepackage{xcolor}
\usepackage{longtable}
\usepackage{amsmath}
%\usepackage[usenames]{color}


% for bold math symbols, \bm command:
\usepackage{bm}
% for real number set symbol, \mathbb{R}:
\usepackage{amsfonts}

\newcommand{\rn}{{\bf R}}
\newcommand{\tr}{^{\sf T}}
\newcommand{\m}[1]{{\bf{#1}}}
\newcommand{\g}[1]{\mbox{\boldmath $#1$}}
\newcommand{\C}[1]{{\cal {#1}}}
\input epsf
\newcommand{\postscript}[2]
 {\setlength{\epsfxsize}{#2\hsize}
  \centerline{\epsfbox{#1}}}
\colorlet{DarkGreen}{green!50!black}
\title{SuiteOPT 2.0.0, February 15, 2022}
\author{William W. Hager\\
University of Florida}
\begin{document}
\maketitle
%-------------------------------------------------------------------------------
\section{\textcolor{blue}{Introduction}}
%-------------------------------------------------------------------------------
{\tt SuiteOPT} is a software package that currently solves
problems of the form
\begin{equation}\tag{P}
\min \; f (\m{x}) \quad \mbox{subject to} \quad
\m{bl} \le \m{Ax} \le \m{bu}, \quad \m{lo} \le \m{x} \le \m{hi}.
\end{equation}
Here $\m{A} \in \mathbb{R}^{m \times n}$,
$\m{bl}$ and $\m{bu} \in \mathbb{R}^m$,
and $\m{lo}$ and $\m{hi} \in \mathbb{R}^n$.
There are four different packages contained in SuiteOPT.
\smallskip
\begin{enumerate}
\item
\textcolor{DarkGreen}{\tt PPROJ:}
Given $\m{y} \in \mathbb{R}^n$, PPROJ
uses the algorithm of \cite{hz16} along
with the Dual Active Set Algorithm
\cite{DavisHager08b, DavisHager08, Hager92, H93, Hager99,
Hager02c, Hager03, HagerHearn93},
and techniques for updating and downdating a sparse Cholesky factorization
\cite{ChenDavisHagerRajamanickam09, DavisHager99, DavisHager01, DavisHager05,
DavisHager09},
to solve the projection problem
\[
\min \; \|\m{y} - \m{x}\|^2 \quad \mbox{subject to} \quad
\m{bl} \le \m{Ax} \le \m{bu}, \quad \m{lo} \le \m{x} \le \m{hi}.
\]
\item
\textcolor{DarkGreen}{\tt NAPHEAP:}
Given $\m{a} \in \mathbb{R}^n$ and
a diagonal matrix $\m{D}$ with nonnegative diagonal,
{\tt NAPHEAP} uses the Newton/heap-based algorithm of
\cite{DavisHagerHungerford16} to solve the problem
\[
\min \; \left( \frac{1}{2}\right)
\m{x}\tr \m{Dx} - \m{c}\tr \m{x} \quad \mbox{subject to} \quad
\mbox {bl} \le \m{a}\tr\m{x} \le \mbox {bu}, \quad \m{lo} \le \m{x} \le \m{hi}.
\]
\item
\textcolor{DarkGreen}{\tt CG\_DESCENT:} The algorithms of
\cite{hz03, hzACM04, HagerZhang13c} are used to
solve an unconstrained optimization problem by the conjugate gradient method.
\smallskip
\item
\textcolor{DarkGreen}{\tt PASA:}
The polyhedral active set algorithm uses
the framework of \cite{HagerZhang16} to combine the previous
algorithms and solve a general problem of the form (P).
\end{enumerate}
\smallskip
Since the update and downdate techniques used by PPROJ are contained in
the CHOLMOD package of Timothy A.~Davis' SuiteSparse,
the relevant parts of SuiteSparse were extracted to form the directory
SuiteSparseX, which is included in the SuiteOPT software.
Although there are four different solvers, they can all be accessed
through PASA;
that is, the PASA software will analyze the problem structure and
determine which of the solvers, or combination of solvers,
should be used to solve the given problem.

There are %four
three different interfaces to the software:
\smallskip
\begin{itemize}
\item[(a)]
Since the codes are written in C, they can be invoked inside a C code.
\item[(b)]
Problems can be formulated and solved using MATLAB.
\item[(c)]
There is an interface through the CUTEst
(Constrained and Unconstrained Testing Environment with Safe Threads)
platform of Gould, Orban, and Toint \cite{GouldOrbanToint15}.
%
%\item[(d)]
%There is an interface to the software through Python.
\end{itemize}
\smallskip
%Since CUTEst contains a large set of test problems, it is a useful
%environment for testing and comparing algorithms.

We now explain how to install and use the software.
Regardless of the software interface, an important parameter
when setting up a problem is the number infinity.
Floating point infinity is defined in
{\tt SuiteOPTconfig/SuiteOPTconfig.h}
based on ANSI C99 and C90 standards.
This definition is consistent with MATLAB's infinity, ``{\tt inf}''.
If the variable $x_i$ has no upper bound, then in C, the user would set
``{\tt hi [i] = SuiteOPTinf}'', while in MATLAB
``{\tt hi(i) = inf}''.
If all the components of $\m{x}$ have no upper bound,
then leave $\m{hi}$ undefined.
Lower bounds are treated in a similar fashion, but with {\tt hi} replaced
by {\tt lo} and with infinity replaced by minus infinity.
As explained below, the user can override the default definition of
infinity in the {\tt Userconfig.mk} file,
%Similarly, if $x_i$ has no lower bound, then the corresponding statements are
%``{\tt lo [i] = -SuiteOPTinf}'' and ``{\tt lo(i) = -inf}''.
%If all the components of $\m{x}$ have either no upper or no lower bound,
%then the ``{\tt hi}'' or ``{\tt lo}'' parameters in the input data structure
%can be omitted.

%-------------------------------------------------------------------------------
\section{\textcolor{blue}{Installation and Use in MATLAB}}
\label{MATLAB}
%-------------------------------------------------------------------------------

Startup MATLAB in the directory {\tt SuiteOPT/MATLAB}. In the command
window, type ``{\tt make}'' and follow the instructions.
To use a solver in MATLAB, a structure must be constructed that
contains the problem data and any changes to the default parameter values.
If {\tt Data} denotes an input data structure associated with a solver,
then the command to solve a problem is simply
\smallskip
\begin{center}
{\tt x = solver\_name (Data) ;}
\end{center}
\smallskip
where {\tt solver\_name} is either
{\tt pasa}, {\tt pproj}, {\tt cg\_descent}, or {\tt napheap}.

The important elements of the input data structure that the user may
wish to modify are described in a {\tt readme.m} file in the solver's
MATLAB subdirectory.
In MATLAB, type ``{\tt help readme}'' to view the file.
By default, when an element of the problem data structure is not present,
the code assumes that the associated constraint does not exist.
In other words, if the constraint {\tt x $\le$ hi} does not exist
and {\tt data} denotes the input data structure for a solver,
then do not specify a value for the data element {\tt data.hi}.
Often, there is no need to specify dimensional information such
as {\tt data.nrow} and {\tt data.ncol}, the number of rows and columns
for the matrix {\tt A} in (P),
since MATLAB usually learns the dimensions when the matrix is created.

For the definitions of the default parameters associated with a solver,
see the {\tt default.c} file in the {\tt Source} directory for the solver.
For any of the solvers except {\tt pasa}, the value of a parameter
is changed using a statement of the form
\begin{center}
{\tt data.parameter = (new value)} ;
\end{center}
where {\tt data} is the input data structure for the solver and
{\tt parameter} is the name of the parameter whose value is to
be changed.
On the other hand, since {\tt pasa} uses all the solvers,
the corresponding statement is
\begin{center}
{\tt pasadata.solver.parameter = (new value)} ;
\end{center}
where {\tt solver} is either {\tt pasa}, {\tt pproj}, {\tt napheap},
or {\tt cg}.
See the demo files in the subdirectories
\begin{itemize}
\item[]
{SuiteOPT/PASA/MATLAB},
\item[]
{SuiteOPT/PPROJ/MATLAB},
\item[]
{SuiteOPT/CGDESCENT/MATLAB}, and
\item[]
{SuiteOPT/NAPHEAP/MATLAB}
\end{itemize}
for examples showing how to set up a problem.
%If MATLAB is started in any of these subdirectories directories where the
%associated solver has been installed, type
%``(solver\_name) readme'' for additional information on how to set up a problem.

%-------------------------------------------------------------------------------
\section{\textcolor{blue}{The User Configuration File, and Compilation and
Use in C}}
\label{C}
%-------------------------------------------------------------------------------

If {\tt SuiteOPT} is used in C or CUTEst, %or Python,
then a file
\begin{center}
\textcolor{red}{{\tt SuiteOPTconfig/Userconfig.mk}}
\end{center}
must be provided with the
following information:
\smallskip
\begin{itemize}
\item[(1)]
The C compiler denoted \textcolor{red}{CC}.
\item[(2)]
The optimization flags denoted \textcolor{red}{OPTFLAGS}.
\item[(3)]
A specification of the \textcolor{red}{BLAS} and \textcolor{red}{LAPACK}
routines, and possibly the path to the BLAS.
\item[(4)]
Possibly a new definition for floating point infinity.
\end{itemize}
\smallskip
The file {\tt Userconfig.mk} contains examples showing how to set up the
User's configuration file.
Since the BLAS are crucial for the efficiency of the algorithms,
a word of caution if OpenBLAS are used.
SuiteSparse Version 5.4 employs OpenMP threading, and the OpenBLAS
routine DGEMM, which is used in supernodal Cholesky factorizations,
can be very slow with OpenMP threading.
Hence, if the OpenBLAS are used, it is recommended to not use
the supernodal routines;
this is achieved by adding to OPTFLAGS the option ``-DNSUPER''.
Alternatively, the user can employ a different version of the BLAS
that may work better with OpenMP threading, such as
Intel's MKL (Math Kernel Library) BLAS.
The Userconfig.mk file contains examples showing how to set up
this file.
Note that ``{\tt cmake}'' is needed to compile SuiteSparse, and
the BLAS may also require gfortran and pthread.

Once the {\tt Userconfig.mk} file is set up, the {\tt SuiteOPT} C codes
can be compiled from the top level {\tt SuiteOPT} directory by typing
``{\tt make}''.
A specific {\tt solver} from {\tt SuiteOPT} can be compiled from the
top level directory by typing ``{\tt make solver}'',
where {\tt solver} is either
{\tt pasa}, {\tt cg}, {\tt napheap}, or {\tt pproj}.
Alternatively, navigate to the subdirectory for the solver, and
type ``{\tt make}''.
%This compiles the libraries in CGDESCENT, NAPHEAP, PPROJ, PASA, and
%SuiteSparseX, as well as the examples provided in the Demo subdirectories
%of each solver.

The codes in the Demo subdirectories all have the layout shown below.
Here, \{{\tt solver}\} should be replaced by either
{\tt pasa}, {\tt cg}, {\tt napheap}, or {\tt pproj}.
The ``{\tt solver\_name}'' is either
{\tt pasa}, {\tt pproj}, {\tt napheap}, or {\tt cg\_descent}.
\bigskip

{\tt
\noindent
/* Create the data structure for the solver */

\noindent
\hspace*{.3in}Data = solver\_setup () ; \\
/* where ``solver'' is pasa, pproj, napheap, or cg */\\

\noindent
/* Store problem information in Data structure */ \\
\hspace*{.3in}Data.lo = $\ldots$ ; \\

\noindent
/* Solve the problem */

\noindent
\hspace*{.3in}solver\_name (Data) ; \\
/* replace solver\_name by pasa, pproj, napheap, or cg\_descent */ \\

\noindent
/* Extract solution from Data structure */ \\
\hspace*{.3in}for (j = 0; j < ncol; j++) printf ("x [\%i] =
\%e\textbackslash n", j, Data.x [j]) ;\\

\noindent
/* Terminate the problem */

\noindent
\hspace*{.3in}\{solver\}\_terminate (\&Data) ; \\
}
%-------------------------------------------------------------------------------
\section{\textcolor{blue}{Installation and Use in CUTEst}}
\label{CUTE}
%-------------------------------------------------------------------------------
To install either {\tt pasa} or {\tt cg\_descent} in CUTEst,
the user must first download and install the CUTEst package.
If an existing version of CUTEst is already installed, be sure to update to a
version after August, 2019, since CUTEst was modified at that date to
enable use with SuiteOPT.
Currently, CUTEst can be downloaded from
\smallskip
\begin{center}
https://github.com/ralna/CUTEst/wiki
\end{center}
\smallskip
Install the packages archdefs, cutest, and sifdecode, as well as the CUTE
library of test problems.
After installing CUTEst, be sure to set the environment variables that are
highlighted during the installation process.
The two variables needed by {\tt SuiteOPT} are CUTEST,
which is the full path to the location of your cutest directory,
and MYARCH, which is a string providing information about your
operating system and computer architecture.
After setting up CUTEst, add two new lines to the file
\$CUTEST/bin/sys/\$MYARCH to provide your BLAS and \mbox{LAPACK} information.
This same information appears in the Userconfig.mk file except that
quotation marks should be inserted around the libraries:

\bigskip
\noindent
{\tt BLAS="$\ldots$ -lgfortran -lpthread"}
\newline
\noindent
{\tt LAPACK="$\ldots$"}
\bigskip

Another environment variable that needs to be set is LD\_LIBRARY\_PATH.
This variable should include the full path to the {\tt ldlibs}
directory at the top level of {\tt SuiteOPT}.
The command for setting up the environment variable
is something like the following (the full path name should be in quotes):
\bigskip
\begin{center}
{\tt setenv LD\_LIBRARY\_PATH 'path'}
\end{center}
\bigskip
If there are multiple paths in the load library, then each path is
separated by a colon.

Once this setup is complete, the installation of
{\tt pasa} and {\tt cg\_descent} in CUTEst is completed
by typing ``{\tt make cute}'' in the top level directory of {\tt SuiteOPT}.
As the codes are compiled and installed into CUTEst, the following two
files are created:
\smallskip
\begin{itemize}
\item[]
{\tt SuiteOPT/CGDESCENT/CUTEst/runcutest}
\item[]
{\tt SuiteOPT/PASA/CUTEst/runcutest}.
\end{itemize}
\smallskip
These files contain aliases for running either {\tt pasa} or {\tt cg\_descent}
in CUTEst.
If these aliases are placed in a file such as ``.cshrc'' or ``.bashrc''
that is executed at startup, then the aliases can be used in any window
that is opened subsequently.
The command for solving a polyhedral constrained optimization
problem PROB.SIF using the PASA alias is ``{\tt pasarun PROB}''.
If the problem is unconstrained, then it could also be solved using
the command ``{\tt cgrun PROB}'';
in either case, when the problem is unconstrained, it is solved using
{\tt cg\_descent}.

New values for the pasa parameters can be inserted in
\bigskip
\begin{center}
{\tt SuiteOPT/PASA/CUTEst/pasa\_main.c}
\end{center}
\bigskip
right before execution of the call to {\tt pasa}.
New values for the CG\_DESCENT parameters can be inserted right
before the call to
``{\tt cg\_descent}'' in
\bigskip
\begin{center}
{\tt SuiteOPT/CGDESCENT/CUTEst/cg\_descent\_main.c}.
\end{center}
\bigskip
When new parameter values are set, the {\tt pasa\_main.c}
or the {\tt cg\_descent\_main.c} codes should be recompiled by typing
``{\tt make}'' in their respective CUTEst subdirectories.


%\section{\textcolor{blue}{Installation in Python}}
%There are two ways to install {\tt SuiteOPT} for use with Python.
%\begin{enumerate}
%\item Install using included files:
%Navigate to the directory {\tt SuiteOPT/Python} and follow the directions
%provided in the README to complete the installation of
%{\tt SuiteOPT} with Python.
%\item Install Using PIP: {\tt SuiteOPT} for Python is available on the
%Python Package Index (PYPI) and can be installed using the Python
%package manager PIP.
%To install using PIP, follow the instructions at the site
%\smallskip
%\begin{center}
%{\tt https://pypi.org/project/SuiteOPT}.
%\end{center}
%\end{enumerate}

\section{\textcolor{blue}{Parameters}}
The names of the parameters, their definitions, and their default values
can be found in the source directory file
whose name ends in {\tt default.c}.
When the {\tt setup} code for any solver is executed, it not only creates the
input data structure for the solver, but it also initializes the
parameters to their default values.
Thus after running the {\tt setup} code and before executing the associated
solver, any of the default parameter values can be changed.
Examples showing how to set parameters in C appear in the {\tt Demo}
directory for any solver.
As an illustration, suppose we wish to change the convergence tolerance
for {\tt cg\_descent} from its default value {\tt 1.e-06} to {\tt 1.e-08}.
If {\tt cgdata} denotes the output of ${\tt cg\_setup}$, then the statement
\smallskip
\begin{center}
{\tt cgdata->Parm->grad\_tol = 1.e-08 ;}
\end{center}
\smallskip
resets the convergence tolerance to {\tt 1.e-08}.

The solver {\tt pasa} could potentially utilize any of the solvers
{\tt pproj}, {\tt cg\_descent}, or {\tt napheap}.
Some parameters, such as {\tt grad\_tol}, are propagated from {\tt pasa}
to the other solvers.
Other parameters, however, are uniquely associated with a solver.
For example, if {\tt cg\_descent} is used in the subspace optimization by
{\tt pasa}, then the user may wish to change the value of
LBFGS memory from its default value 11, to say 15.
If {\tt pasadata} denotes the output of the {\tt pasa\_setup} code,
then the statement
\smallskip
\begin{center}
{\tt pasadata->Parms->cg->LBFGSmemory = 15 ;}
\end{center}
\smallskip
resets the LBFGS memory to 15.
The four elements of the {\tt Parms} structure
are {\tt pasa}, {\tt cg}, {\tt pproj}, and {\tt napheap}.

Resetting parameters in MATLAB is different and easier when compared to C.
In MATLAB, one builds a structure with the non-default elements of the
solver's data structure, and parameters are treated like any other element of
the data structure.
If {\tt pasadata} denotes a structure being built in MATLAB to solve a problem
using {\tt pasa}, then the following statement resets the LBFGS memory to 15:
\smallskip
\begin{center}
{\tt pasadata.cg.LBFGSmemory = 15 ;}
\end{center}
\smallskip
Essentially, the {\tt Parms} structure in the C example above
is omitted in MATLAB.
If {\tt cg\_descent} is used to solve an unconstrained optimization problem
in MATLAB and cgdata denotes the data structure being built, then the statement
\smallskip
\begin{center}
{\tt cgdata.LBFGSmemory = 15 ;}
\end{center}
\smallskip
resets the LBFGS memory to 15.
%\newpage

\section{\textcolor{blue}{Appendix: Elements of Input Data Structures}}
This appendix provides a list of the elements in the solver input data
structure that the user may wish to specify.
All of the solvers in {\tt SuiteOPT}
use floating point variables of size \mbox{\tt SuiteOPTfloat},
which is ``{\tt double}'' by default.
The integer variables are of size {\tt SuiteOPTint},
which is ``{\tt int}'' by default.
For really big problem, ``{\tt int}'' would need to be changed to ``{\tt long}''.
The size of {\tt SuiteOPTfloat} and {\tt SuiteOPTint}
can be changed in the file
\smallskip
\begin{center}
{\tt SuiteOPT/SuiteOPTconfig/SuiteOPTconfig.h}
\end{center}
\smallskip
Throughout this appendix, {\tt SuiteOPTfloat} and {\tt SuiteOPTint} are
denoted {\tt SF} and {\tt SI} respectively.
\bigskip

\newpage
\noindent
\textcolor{DarkGreen}{\bf Structure: PASAdata}
\bigskip

\noindent
\textcolor{red}{The PASAdata structure is input to {\tt pasa} when
solving an optimization problem of the form:}
\[
\min_{\m{x}} \; f (\m{x}) \quad \mbox{subject to} \quad
\m{bl} \le \m{Ax} \le \m{bu}, \quad \m{lo} \le \m{x} \le \m{hi}.
\]

\noindent
\textcolor{red}{Special Cases Treated:}
\smallskip
\begin{enumerate}
\item
\textcolor{blue}{Unconstrained optimization}, the constraints are not present.
\smallskip
\item
\textcolor{blue}{Bound constrained optimization}, the constraint
is $\m{lo} \le \m{x} \le \m{hi}$.
\smallskip
\item
\textcolor{blue}{Linear programming},
the objective is linear $\m{c}\tr \m{x}$.
\smallskip
\item
A \textcolor{blue}{quadratic program},
the objective is $0.5\m{x}\tr \m{Qx} + \m{c}\tr \m{x}$.
\smallskip
\item
A \textcolor{blue}{projection}, the objective is $\|\m{y} - \m{x}\|^2$,
and $\m{y}$ is a given vector to project on the polyhedron.
\smallskip
\item
A \textcolor{blue}{separable quadratic}, where the
objective is $\min ~ 0.5\m{x}\tr\m{Dx} + \m{c}\tr\m{x}$ subject to
$\m{lo} \le \m{x} \le \m{hi}$ and $\mbox{bl} \le \m{a}\tr\m{x} \le \mbox{bu}$,
where $\m{D}$ is a diagonal matrix with nonnegative diagonal $\m{d}$ and
$\m{a}$ is a column vector.
\end{enumerate}
\smallskip

\noindent
\textcolor{red}{NOTE:} When the setup code for any solver is run,
all the fields of the data structure are set to either NULL or EMPTY.
Elements of the data structure that are not needed to describe a problem
do not need to be touched; the NULL or EMPTY default values indicate
that the data element is not present in the problem.
\smallskip


{\tt
\begin{longtable}{l|l|p{3.5in}}
Name & Type & Description \\
\hline
\hline
nrow &  SI        & Number of rows in \m{A} if it exists. \\
\hline
ncol &  SI        & Number of components in x (= number of cols in
                         \m{A} if it exists). \\
\hline
lambda & SF * & Size nrow. If parameter use\_lambda is TRUE,
                      then lambda points to a starting guess for the multiplier.
                      If lambda is NULL, then PASA allocates memory
                      for lambda, and returns in lambda the multiplier
                      associated with the constraint
                      $\m{bl} \le \m{Ax} \le \m{bu}$.
                      Any allocated memory is freed by pasa\_terminate. \\
\hline
x & SF *      & Size ncol. Points to a starting guess for
                      routines that require one (NAPHEAP,
                      PPROJ, and the LP solver do not require a
                      starting guess for x).  If NULL, then
                      PASA allocates memory for x, and if
                      a starting guess is needed, then it is set to zero.
                      The problem solution is returned in x.
                      Any allocated memory is freed by pasa\_terminate. \\
\hline
lo & SF *        & Size ncol. Lower bound in the constraint
                         $\m{lo} \le \m{x}$. NULL implies use $-\infty$ for
                         lower bound. \\
\hline
hi & SF *        & Size ncol. Upper bound in the constraint
                         $\m{x} \le \m{hi}$. NULL implies use $+\infty$ for
                         upper bound. \\
\hline
bl & SF *       & Size nrow. Lower bound in the constraint
                         $\m{bl} \le \m{Ax}$. NULL implies use $-\infty$ for
                         lower bound. \\
\hline
bu & SF *       & Size nrow. Upper bound in the constraint
                         $\m{Ax} \le \m{bu}$. NULL implies use $+\infty$ for
                         upper bound. \\
\hline
y & SF *        & Size ncol. A vector to be projected onto polyhedron
                         $\m{bl} \le \m{Ax} \le \m{bu}$,
                         $\m{lo} \le  \m{x} \le \m{hi}$. \\
\hline
\hline
A\_by\_rows & SF *& Size nrow*ncol. Numerical entries in $\m{A}$
                   (when constraint matrix input as a dense matrix).\\
\hline
A\_by\_cols & SF *& Size nrow*ncol. Numerical entries in $\m{A}$
                   (when constraint matrix input as a dense matrix).\\
\hline
\hline
Ti & SI * & Size Tnz. Row indices of nonzero elements of $\m{A}$
                   (when constraint matrix input in triples format).\\
\hline
Tj & SI * & Size Tnz. Column indices of nonzeros in $\m{A}$. \\
\hline
Tx & SF * & Size Tnz. Numerical values of nonzeros in $\m{A}$. \\
\hline
Tnz & SI & Number of entries in Ti, Tj, and Tx. \\
\hline
sym & int & Only used in triples format.
            TRUE implies matrix is symmetric and only element on main
            diagonal and on one side are given \\
\hline

Ap & SI *         & Size ncol + 1. Column pointers for $\m{A}$ (when
                    constraint matrix input using sparse matrix format). \\
\hline
Ai & SI *         & Size Ap [ncol]. Row indices in increasing order
                    in each column for the nonzeros in $\m{A}$. \\
\hline
Ax & SF *       & Size Ap [ncol]. Numerical entries in $\m{A}$
                         coresponding to the row indices in Ai. \\
\hline
\hline
a & SF *        &  Size ncol. The coefficient matrix in the case where
                          nrow = 1 (dense vector). \\
\hline
d & SF *        & Size ncol. Hessian diagonal when the objective Hessian
                         is a diagonal matrix. \\
\hline
value & function    & value (SF *f, SF *x, SI ncol) should
                      put the value of the objective at x in *f
                      (not needed for a QP)\\
\hline
grad &  function   & grad (SF *g, SF *x, SI ncol) should
                     put the gradient of the objective at x in g
                      (not needed when for a QP)\\
\hline
valgrad & function & valgrad (SF *f, SF *g, SF *x, SI ncol)
                  put the value of the objective at x in *f and
                  the gradient in g (this routine is optional, but it can
                  speed up the computations when the objective and its
                  gradient are computed faster together than
                  than they are computed separately. \\
\hline
c & SF *        &  Size ncol. Linear term when objective is quadratic
                              or linear. \\
\hline
\hline
Hdense & SF *& Size ncol*ncol. Numerical entries in Hessian of a QP
                   when Hessian input as a dense matrix.\\
\hline
\hline
HTi & SI * & Size Hnz. Row indices of nonzero elements in Hessian of a QP
                   when Hessian input in triples format.  There is one row
                   index entry for each nonzero in the matrix.\\
\hline
HTj & SI * & Size Hnz. Column indices of nonzeros in Hessian.
             There is one column index entry for each nonzero in the matrix.\\
\hline
HTx & SF * & Size Hnz. Numerical values of nonzeros in Hessian. \\
\hline
Hnz & SI & Number of entries in HTi, HTj, and HTx. \\
\hline
Hsym & int & Only used in triples format. TRUE implies only element on main
            diagonal and on one side are given. FALSE implies that all
            nonzeros in the Hessian are given.\\
\hline
\hline
Hp & SI *         & Size ncol + 1. Column pointers for Hessian (when
                    Hessian input using sparse matrix format). \\
\hline
Hi & SI *         & Size Hp [ncol]. Row indices in increasing order
                    in each column for the nonzeros in Hessian. \\
\hline
Hx & SF *       & Size Hp [ncol]. Numerical entries in Hessian
                         coresponding to the indices in Hi. \\
\hline
\hline
hprod & function & hprod (SF *p, SF *d, SI *F, SI ncol, SI n)
                   computes p = H(:, F)*d where H is the ncol by ncol Hessian
                   of a QP, d has n elements, and F denotes a collection of n
                   indices contained in 1:ncol (not needed if the nonzero
                   matrix elements of the Hessian are provided). \\
\hline
cg\_prod & function & cg\_hprod (SF *p, SF *x, SI ncol) computes
                    p = H*x where H is the ncol by ncol Hessian of a QP
                    (not needed if the nonzero matrix elements of the
                     Hessian are provided).\\
\hline
\hline
Parms & PASAparms * & Contains pointers to four parameter structures
                    corresponding to solver {\tt S} =
                    {\tt pasa}, {\tt cg}, {\tt pproj}, or {\tt napheap}.
                    {\tt Parms->S} is the parameter structure
                    associated with solver {\tt S}.\\
\hline
Stats & PASAstats * & Contains pointers to four statistics structures
                    corresponding to solver {\tt S} =
                    {\tt pasa}, {\tt cg}, {\tt pproj}, or {\tt napheap}.
                    {\tt Stats->use\_S} is TRUE if solver {\tt S} was
                    used during the run and the statistics for solver
                    {\tt S} are found in {\tt Stats->S}. \\
\hline
\hline
xWork & SF * & NULL (default set in {\tt pasa\_setup}) implies
                       that the code should allocate
                       the floating point work area, otherwise the user provides
                       a pointer xWork to the floating point work area. \\
\hline
iWork & SI * & NULL (default set in {\tt pasa\_setup}) implies
                       that the code should allocate
                       the integer work area, otherwise the user provides
                       a pointer iWork to the integer work area. \\
\hline
\end{longtable}
}

The are three ways to input either the constraint matrix $\m{A}$
or the Hessian of a QP:
\begin{enumerate}
\item
Using a dense packed array containing the matrix entries.
When inputting the constraint matrix in dense format, both the
{\tt nrow} and {\tt ncol} elements of the PASAdata structure should
be given.
\item
Using a set of three arrays Ti, Tj, and Tx (triples), where Ti stores
the row indices of the nonzero elements, Tj stores the corresponding
column indices, and Tx stores the corresponding nonzero matrix entries.
\item
Using a set of three arrays Ap, Ai, and Ax,
where Ax is an array containing the nonzero numerical entries ordered by column
of the matrix,
Ai is an array containing the row indices of each nonzero in Ax with
the row indices in increasing order for each column of the matrix,
and Ap stores the column pointers (Ap[j] is the location of the
first nonzero in Ax associated with column j).
\end{enumerate}
\bigskip

The following elements of the PASAdata structure are used internally,
and should not be touched by the user.
\bigskip

{\tt
\begin{tabular}{l|l|p{3in}}
Name & Type & Description \\
\hline
\hline
cgdata & CGdata *      & Input data for CG\_DESCENT \\
\hline
ppdata & PPdata *      & Input data for PPROJ. \\
\hline
napdata & NAPdata *    & Input data for NAPHEAP. \\
\hline
x\_created & SF * & Size ncol. Pointer to memory created for x. \\
\hline
lambda\_created & SF * & Size nrow.  Pointer to memory created for lambda. \\
\hline
A\_created & int * & TRUE if the constraint matrix $\m{A}$ is input
                     either using triples or dense matrix formats and
                     Ap, Ai, and Ax were malloc'd by {\tt pasa}.\\
\hline
H\_created & int * & TRUE if the Hessian of a QP is input
                     either using triples or dense matrix formats and
                     Hp, Hi, and Hx were malloc'd by {\tt pasa}.\\
\hline
LP & int * & TRUE if the problem is an LP. \\
\hline
\end{tabular}
}
\newpage

\noindent
\textcolor{DarkGreen}{\bf Structure: PPdata}
\bigskip
%\bigskip

\noindent
\textcolor{red}{\bf The PPdata structure is input to {\tt pproj}
when solving an optimization problem of the form:}
\[
\min_{\m{x}} \; \|\m{y} - \m{x}\|^2
%+ \m{y_1}\tr\m{x_2}
\quad \mbox{subject to} \quad
\m{bl} \le \m{Ax} \le \m{bu}, \quad \m{lo} \le \m{x} \le \m{hi},
\]
%where $\m{A} = [\m{A_0} -\m{A_1}]$, $\m{x}\tr = [\m{x_0}\tr \m{x_1}]$
where $\|\cdot\|$ is the Euclidean norm.
%The data $\m{y_1}$ and $\m{A_1}$ could be vacuous.
%When they are present, it is required that
%$\m{A_1}$ is a matrix for which each column
%is zero except for a single 1, $\m{bl} = \m{bu}$, and the
%elements of $\m{y_1}$ corresponding to the nonzeros in any row
%of $\m{A_1}$ are all distinct and in increasing order.
%The $(\m{y_1}, \m{A_1})$ elements in this optimization problem
%were introduced so that PASA can quickly solve linear programs.


{\tt
\begin{longtable}{l|l|p{3.5in}}
Name & Type & Description \\
\hline
\hline
nrow &  SI        & Number of rows in \m{A} if it exists. \\
\hline
ncol &  SI        & Number of components in x (= number of cols in
                         \m{A} if it exists). \\
\hline
lambda & SF * & Size nrow.  If parameter start\_guess = 3, then lambda
                            stores the starting guess for the constraint
                            multiplier.  If NULL, then pproj allocates memory
                            for lambda and returns in lambda
                            the multiplier for the constraint
                            $\m{bl} \le \m{Ax} \le \m{bu}$.
                            Any allocated memory is freed by
                            pproj\_terminate. \\
\hline
x & SF *      & Size ncol. Projection of y on the polyhedral constraint is
                stored in x.
                If NULL, then PPROJ allocates memory for x.
                Any allocated memory is freed by pproj\_terminate. \\
\hline
lo & SF *        & Size ncol. Lower bound in the constraint
                         $\m{lo} \le \m{x}$. NULL implies use $-\infty$ for
                         lower bound. \\
\hline
hi & SF *        & Size ncol. Upper bound in the constraint
                         $\m{x} \le \m{hi}$. NULL implies use $+\infty$ for
                         upper bound. \\
\hline
bl & SF *       & Size nrow. Lower bound in the constraint
                         $\m{bl} \le \m{Ax}$. NULL implies use $-\infty$ for
                         lower bound. \\
\hline
bu & SF *       & Size nrow. Upper bound in the constraint
                         $\m{Ax} \le \m{bu}$. NULL implies use $+\infty$ for
                         upper bound. \\
\hline
y & SF *        & Size ncol. A vector to be projected onto polyhedron
                         $\m{bl} \le \m{Ax} \le \m{bu}$,
                         $\m{lo} \le  \m{x} \le \m{hi}$. \\
\hline
\hline
A\_by\_rows & SF *& Size nrow*ncol. Numerical entries in $\m{A}$
                   (when constraint matrix input as a dense matrix).\\
\hline
A\_by\_cols & SF *& Size nrow*ncol. Numerical entries in $\m{A}$
                   (when constraint matrix input as a dense matrix).\\
\hline
\hline
Ti & SI * & Size Tnz. Row indices of nonzero elements of $\m{A}$
                   (when constraint matrix input in triples format).\\
\hline
Tj & SI * & Size Tnz. Column indices of nonzeros in $\m{A}$. \\
\hline
Tx & SF * & Size Tnz. Numerical values of nonzeros in $\m{A}$. \\
\hline
Tnz & SI & Number of entries in Ti, Tj, and Tx. \\
\hline
sym & int & Only used in triples format.
            TRUE implies matrix is symmetric and only element on main
            diagonal and on one side are given \\
\hline
\hline
Ap & SI *         & Size ncol + 1. Column pointers for $\m{A}$ (when
                    constraint matrix input using sparse matrix format). \\
\hline
Ai & SI *         & Size Ap [ncol]. Row indices in increasing order
                    in each column for the nonzeros in $\m{A}$. \\
\hline
Ax & SF *       & Size Ap [ncol]. Numerical entries in $\m{A}$
                         coresponding to the row indices in Ai. \\
\hline
\hline
Parm & PPparm * & Parameter structure for {\tt pproj}. \\
\hline
Stat & PPstat * & Statistics structure for {\tt pproj}. \\
\hline
\hline
ni    & SI   & Number of strict inequalities where
               bl[i] < bu[i] (set to EMPTY in pproj\_setup and
               pproj evaluates ni during execution). \\
\hline
nsing & SI   & Number of column singletons in A \\
\hline
row\_sing & SI *  & Size nrow + 1. Pointers connected with column singletons. \\
\hline
singlo    & SF *  & Size nsing. Lower bounds associated with column
                    singletons.\\
\hline
singhi    & SF *  & Size nsing. Upper bounds associated with column
                    singletons.\\
\hline
singc     & SF *  & Size nsing. Cost vector associated with column singletons.\\
\hline
\end{longtable}
}
\bigskip

\textcolor{red}{NOTE:} The three methods for inputting the constraint
matrix $\m{A}$ for {\tt pproj} are identical to the three methods
used by {\tt pasa} for input of the constraint matrix.
\bigskip

The following elements of the PPdata structure are used internally, and
should not be touched by the user.
\bigskip

{\tt
\begin{tabular}{l|l|p{3in}}
Name & Type & Description \\
\hline
\hline
priordata & PPcom & Data from a prior run of PPROJ. Used when computing a series
                    of projections where y changes, but not the polyhedron.
                    The prior projection can be used to get a starting guess
                    for the active constraints in the new projection.  \\
\hline
x\_created & SF * & Size ncol. Pointer to memory created for x. \\
\hline
lambda\_created & SF * & Size ncol.  Pointer to memory created for lambda. \\
\hline
A\_created & int * & TRUE if Ap, Ai, and Ax created by pasa\_read\_problem. \\
\hline
pproj\_init\_done & int *
& FALSE initially, TRUE after running pproj\_init. \\
\end{tabular}
}
\newpage

\noindent
\textcolor{DarkGreen}{\bf Structure: CGdata}
\bigskip

\noindent
\textcolor{red}{The CGdata structure is input to {\tt cg\_descent} when
solving an unconstrained optimization problem:}
\[
\min_{\m{x}} \; f (\m{x})
\]

{\tt
\begin{longtable}{l|l|p{3.5in}}
Name & Type & Description \\
\hline
\hline
n &  SI        & Problem dimension. \\
\hline
x & SF *      & Size n. Points to a starting guess.
                      If NULL, then CG\_DESCENT allocates memory for x
                      and uses zero for the starting guess.
                      The problem solution is returned in x.
                      Any allocated memory is freed by cg\_terminate. \\
\hline
value & function     & value (SF *f, SF *x, SI n) should
                      put the value of the objective at x in *f
                      (not required for a QP).\\
\hline
grad &  function     & grad (SF *g, SF *x, SI n) should
                     put the gradient of the objective at x in g
                     (not needed required for a QP). \\
\hline
valgrad & function   & valgrad (SF *f, SF *g, SF *x, SI n) should
                     put the value of the objective at x in *f and
                     the gradient in g (this routine is optional, but it can
                     speed up the computations when the objective and its
                     gradient are computed faster together than
                     than they are computed separately. \\
\hline
c & SF *        &  Size n. Linear term when objective is quadratic. \\
\hline
\hline
Hdense & SF *& Size ncol*ncol. Numerical entries in Hessian of a QP
                   when Hessian input as a dense matrix.\\
\hline
\hline
HTi & SI * & Size Hnz. Row indices of nonzero elements in Hessian of a QP
                   when Hessian input in triples format.  There is one row
                   index entry for each nonzero in the matrix.\\
\hline
HTj & SI * & Size Hnz. Column indices of nonzeros in Hessian.
             There is one column index entry for each nonzero in the matrix.\\
\hline
HTx & SF * & Size Hnz. Numerical values of nonzeros in Hessian. \\
\hline
Hnz & SI & Number of entries in HTi, HTj, and HTx. \\
\hline
Hsym & int & Only used for triples; TRUE implies only element on main
            diagonal and on one side are given. FALSE implies that all
            nonzeros in the Hessian are given.\\
\hline
\hline
Hp & SI *         & Size ncol + 1. Column pointers for Hessian (when
                    Hessian input using sparse matrix format). \\
\hline
Hi & SI *         & Size Hp [ncol]. Row indices in increasing order
                    for each column of the Hessian corresponding to the
                    nonzero matrix elements. \\
\hline
Hx & SF *       & Size Hp [ncol]. Numerical entries in Hessian
                         coresponding to each element of Hi. \\
\hline
\hline
hprod &          & hprod (SF *p, SF *x, SI n) computes
                      p = H*x where H is the n by n Hessian of the objective
                      (not needed if the nonmatrix elements are provided).\\
\hline
Parm & CGparm * & Parameter structure. \\
\hline
Stat & CGstat * & Statistics structure. \\
\hline
Work & SF * & NULL (default set in {\tt cg\_setup}) implies
                       that the code should allocate
                       the floating point work area, otherwise the user provides
                       a pointer Work to the floating point work area. \\
\hline
\end{longtable}
}
\bigskip

The following elements of the CGdata structure are used internally, and
should not be touched by the user.
\bigskip

{\tt
\begin{tabular}{l|l|p{3in}}
Name & Type & Description \\
\hline
\hline
x\_created & SF * & Size n. Pointer to memory created for x. \\
\hline
H\_created & int * & TRUE if the Hessian of a QP is input
                     either using triples or dense matrix formats and
                     Hp, Hi, and Hx were malloc'd by {\tt cg\_descent}.\\
\hline
\end{tabular}
}
\newpage

\noindent
\textcolor{DarkGreen}{\bf Structure: NAPdata}
\bigskip

\noindent
\textcolor{red}{The NAPdata structure is input to {\tt napheap} when
solving an optimization problem of the form:}
\[
\min_{\m{x}} \; \left( \frac{1}{2} \right) \m{d}\tr \m{x}^2 - \m{c}\tr \m{x}
\quad \mbox{subject to} \quad
\mbox{bl} \le \m{a}\tr\m{x} \le \mbox{bu},
\quad \m{lo} \le \m{x} \le \m{hi}, \quad
\]
where $\m{d} \ge \m{0}$ and $\m{x}^2$ is the vector whose entries are the
squares of the entries in $\m{x}$.
\medskip

\noindent
\textcolor{red}{Special Cases Treated by NAPHEAP:}
\smallskip
\begin{enumerate}
\item
$\m{d} = \m{0}$ (the objective is linear).
\item
$\m{d} > \m{0}$ (diagonal of Hessian strictly positive).
\item
$\m{d} \ge \m{0}$ (semidefinite Hessian).
\item
$\m{d} = \m{1}$ (all the diagonal element are 1).
\end{enumerate}
\smallskip

\noindent
\textcolor{red}{NOTE:} As always, unused elements of the data structure
do not need to be defined.
\smallskip


{\tt
\begin{longtable}{l|l|p{3.5in}}
Name & Type & Description \\
\hline
\hline
n &  SI       & Problem dimension (number of components in x). \\
\hline
x & SF *      & Size n.  If NULL, then NAPHEAP
                      allocates memory for x, and returns the problem
                      solution in x.
                      Any allocated memory is freed by napheap\_terminate. \\
lambda & SF & Size 1. If lambda is finite, then it is treated as a starting
                      guess for the multiplier. By default, lambda = $\infty$
                      and the starting guess is generated internally by the
                      code. At completion, the computed multiplier is stored
                      in lambda. \\
\hline
c & SF *        & Size n. Vector for the linear term in the objective (NULL
                          by default, which implies that $\m{c} = \m{0}$).\\
\hline
d & SF *        & Size n. Vector for the quadratic term in the objective
                          (NULL by default, which implies $\m{d} = \m{0}$). \\
\hline
a & SF *       & Size n. Numerical entries in $\m{a}$, the linear constraint
                         vector. \\
\hline
blo & SF       & Size 1. Lower bound in the linear constraint. \\
\hline
bhi & SF       & Size 1. Upper bound in the linear constraint. \\
\hline
lo & SF *        & Size n. Lower bound in the constraint
                         $\m{lo} \le \m{x}$. NULL implies use $-\infty$ for
                         lower bound. \\
\hline
hi & SF *        & Size n. Upper bound in the constraint
                         $\m{x} \le \m{hi}$. NULL implies use $+\infty$ for
                         upper bound. \\
\hline
xWork & SF * & NULL (default set in {\tt napheap\_setup})
                       implies that the code should allocate
                       the floating point work area, otherwise the user provides
                       a pointer xWork to the floating point work area
                       (max size 5n).  \\
\hline
iWork & SI * & NULL (default) implies that the code should allocate the
                      integer work area, otherwise the user provides a pointer
                      iWork to the integer work area
                      (max size 4n + 1). \\
\hline
\hline
Parm & NAPparm * & Parameter structure for {\tt napheap}. \\
\hline
Stat & NAPstat * & Statistics structure for {\tt napheap}. \\
\hline
\end{longtable}
}
\bigskip

The following elements of the NAPdata structure are used internally,
and should not be touched by the user.
\bigskip

{\tt
\begin{tabular}{l|l|p{3in}}
Name & Type & Description \\
\hline
\hline
x\_created & SF * & Pointer to memory created for x. \\
\hline
c\_created & SF * & Pointer to memory created for c. \\
\hline
xWork\_created & SF * & Pointer to the floating point work area
created during a prior run.\\
\hline
iWork\_created & SI * & Pointer to the integer work area
created during a prior run.\\
\hline
akakdk & SF & sum ak*ak/dk, k = 1:n, from a previous run. \\
\end{tabular}
}
\newpage
\begin{thebibliography}{10}

\bibitem{ChenDavisHagerRajamanickam09}
{\sc Y.~Chen, T.~A. Davis, W.~W. Hager, and S.~Rajamanickam}, {\em Algorithm
  887: {CHOLMOD}, supernodal sparse {Cholesky} factorization and
  update/downdate}, {ACM} Trans. Math. Software, 35 (2009), pp.~22:1--14.

\bibitem{DavisHager99}
{\sc T.~A. Davis and W.~W. Hager}, {\em Modifying a sparse {Cholesky}
  factorization}, {SIAM} J. Matrix Anal. Appl., 20 (1999), pp.~606--627.

\bibitem{DavisHager01}
\leavevmode\vrule height 2pt depth -1.6pt width 23pt, {\em Multiple-rank
  modifications of a sparse {Cholesky} factorization}, {SIAM} J. Matrix Anal.
  Appl., 22 (2001), pp.~997--1013.

\bibitem{DavisHager05}
\leavevmode\vrule height 2pt depth -1.6pt width 23pt, {\em Row modifications of
  a sparse {Cholesky} factorization}, {SIAM} J. Matrix Anal. Appl., 26 (2005),
  pp.~621--639.

\bibitem{DavisHager08b}
\leavevmode\vrule height 2pt depth -1.6pt width 23pt, {\em Dual multilevel
  optimization}, Math. Program., 112 (2008), pp.~403--425.

\bibitem{DavisHager08}
\leavevmode\vrule height 2pt depth -1.6pt width 23pt, {\em A sparse proximal
  implementation of the {LP} {D}ual {A}ctive {S}et {A}lgorithm}, Math.
  Program., 112 (2008), pp.~275--301.

\bibitem{DavisHager09}
\leavevmode\vrule height 2pt depth -1.6pt width 23pt, {\em Dynamic supernodes
  in sparse {Cholesky} update/downdate and triangular solves}, {ACM} Trans.
  Math. Software, 35 (2009), pp.~27:1--23.

\bibitem{DavisHagerHungerford16}
{\sc T.~A. Davis, W.~W. Hager, and J.~T. Hungerford}, {\em An efficient hybrid
  algorithm for the separable convex quadratic knapsack problem}, {ACM} Trans.
  Math. Software, 42 (2016), pp.~22:1--22:25.

\bibitem{GouldOrbanToint15}
{\sc N.~I.~M. Gould, D.~Orban, and P.~L. Toint}, {\em {CUTEst}: a constrained
  and unconstrained testing environment with safe threads for mathematical
  optimization}, Comput. Optim. Appl., 60 (2015), pp.~545--557.

\bibitem{Hager92}
{\sc W.~W. Hager}, {\em The dual active set algorithm}, in Advances in
  Optimization and Parallel Computing, P.~M. Pardalos, ed., North Holland,
  Amsterdam, 1992, pp.~137--142.

\bibitem{H93}
\leavevmode\vrule height 2pt depth -1.6pt width 23pt, {\em Analysis and
  implementation of a dual algorithm for constrained optimization}, J. Optim.
  Theory Appl., 79 (1993), pp.~427--462.

\bibitem{Hager99}
\leavevmode\vrule height 2pt depth -1.6pt width 23pt, {\em The {LP} dual active
  set algorithm}, in High Performance Algorithms and Software in Nonlinear
  Optimization, R.~D. Leone, A.~Murli, P.~M. Pardalos, and G.~Toraldo, eds.,
  Dordrecht, 1998, Kluwer, pp.~243--254.

\bibitem{Hager02c}
\leavevmode\vrule height 2pt depth -1.6pt width 23pt, {\em The dual active set
  algorithm and its application to linear programming}, Comput. Optim. Appl.,
  21 (2002), pp.~263--275.

\bibitem{Hager03}
\leavevmode\vrule height 2pt depth -1.6pt width 23pt, {\em The dual active set
  algorithm and the iterative solution of linear programs}, in Novel Approaches
  to Hard Discrete Optimization, P.~M. Pardalos and H.~Wolkowicz, eds.,
  vol.~37, Fields Institute Communications, 2003, pp.~95--107.

\bibitem{HagerHearn93}
{\sc W.~W. Hager and D.~W. Hearn}, {\em Application of the dual active set
  algorithm to quadratic network optimization}, Comput. Optim. Appl., 1 (1993),
  pp.~349--373.

\bibitem{hz03}
{\sc W.~W. Hager and H.~Zhang}, {\em A new conjugate gradient method with
  guaranteed descent and an efficient line search}, {SIAM} J. Optim., 16
  (2005), pp.~170--192.

\bibitem{hzACM04}
\leavevmode\vrule height 2pt depth -1.6pt width 23pt, {\em Algorithm 851:
  {CG\_DESCENT}, a conjugate gradient method with guaranteed descent}, {ACM}
  Trans. Math. Software, 32 (2006), pp.~113--137.

\bibitem{HagerZhang13c}
\leavevmode\vrule height 2pt depth -1.6pt width 23pt, {\em The limited memory
  conjugate gradient method}, {SIAM} J. Optim., 23 (2013), pp.~2150--2168.

\bibitem{HagerZhang16}
\leavevmode\vrule height 2pt depth -1.6pt width 23pt, {\em An active set
  algorithm for nonlinear optimization with polyhedral constraints}, Sci. China
  Math., 59 (2016), pp.~1525--1542.

\bibitem{hz16}
\leavevmode\vrule height 2pt depth -1.6pt width 23pt, {\em Projection onto a
  polyhedron that exploits sparsity}, {SIAM} J. Optim., 29 (2016),
  pp.~1773--1798.

\end{thebibliography}
\end{document}
