CMLMT 2.0 is a set of procedures for the solution of the constrained maximum likelihood problem.
The same procedure computing the log-likelihood or objective function will be used to compute analytical derivatives as well if they are being provided. Its return argument is a results structure with three members, a scalar, or Nx1 vector containing the log-likelihood (or objective), a 1xK vector, or NxK matrix of first derivatives, and a KxK matrix or NxKxK array of second derivatives (it needs to be an array if the log-likelihood is weighted).
Of course the derivatives are optional, or even partially optional; i.e., you can compute a subset of the derivatives if you like and the remaining will be computed numerically.
This procedure will have an additional argument which tells the function which to compute, the log-likelihood or objective, the first derivatives, or the second derivatives, or all three. This means that calculations in common won't have to be redone.
New Features
Internally multi-threaded functions
Structures, in particular DS structures for handling data, and PV structures for handling parameters
New method for testing hypotheses concerning models with constraints on parameters (Silvapule & Sen, _Constrained_Statistical_Inference_)
New numerical derivatives, user-provided analytical derivatives can compute a subset of the derivatives, the rest will be computed numerically
New trust region method
User-provided procedure includes calculation of function and optionally derivatives--reduces calculations in common between function and derivatives
General improvement in algorithms
Threading in CMLMT
If you have a multi-core processor you may take advantage of CMLMT's internally threaded functions. An important advantage of threading occurs in computing numerical derivatives. If the derivatives are computed numerically, threading will significantly decrease the time of computation. Example
We ran a time trial of a covariance-structure model on a quad-core machine. As is the case for most real world problems, not all sections of the code are able to be run in parallel. Therefore, the theoretical limit for speed increase is much less than (single-threaded execution time)/(number of cores).
Even so, the execution time of our program was cut dramatically:
Single-threaded execution time: 18.52 minutes
Multi-threaded execution time: 6.83 minutes
That is a nearly 300% speed increase!
The new CMLMT uses the DS and PV structures that are available in the GAUSS Run-Time Library and used by Sqpsolvemt. The DS Structure
The DS structure is completely flexible, allowing you to pass anything you can think of into your procedure. There is a member of the structure for every GAUSS data type.
struct DS {
scalar type;
matrix dataMatrix;
array dataArray;
string dname;
string array vnames;
};
The PV Structure
The PV structure revolutionizes how you pass the parameters into the procedure. No longer do you have to struggle to get the parameter vector into matrices for calculating the function and its derivatives, trying to remember, or figure out, which parameter is where in the vector.
If your log-likelihood uses matrices or arrays,you can store them directly into the PV structure and remove them as matrices or arrays with the parameters already plugged into them. The PV structure can handle matrices and arrays in which some of their elements are fixed and some free. It remembers the fixed parameters and knows where to plug in the current values of the free parameters. It can also handle symmetric matrices in which parameters below the diagonal are repeated above the diagonal.
b0 - Mean paramters.
garch - GARCH parameters.
arch - ARCH parameters.
omega - Constant in variance equation.
There is no longer any need to use global variables. Anything the procedure needs can be passed into it through the DS structure. And these new applications uses control structures rather than global variables. This means, in addition to thread safety, that it is straightforward to nest calls to CMLMT inside of a call to CMLMT, QNewtonmt, QProgmt, or EQsolvemt.