$include_dir="/home/hyper-archives/ublas/include"; include("$include_dir/msg-header.inc") ?>
Subject: Re: [ublas] Patch/proposal for overloading operator * in ublas
From: K.M.A.Chai_at_[hidden]
Date: 2009-08-19 10:28:33
On Wed, 19 Aug 2009, Jesse Perla wrote:
> 
> This looks excellent.  Do you have any regression tests/examples/docs on what these patches do
> (besides the obvious ones that replace matlab functions of course)?
> 
> Also, were you able to deal with the conversion between multi_array slices to ublas?
>
Hi Jesse,
    Thanks for the interest. As I said in the previous post, I'm using it 
for learning GP models. I've a package (also in the state of flux) for 
this at http://homepages.inf.ed.ac.uk/s9810791/gpml-c++.tbz. 
Unfortunately, there's also no documentation associated with this.
    I'll like to clarify that the only patches are under the directory 
umatlab-patches. Much of the package should be seen as "add-on" instead of 
patches.
    Unfortunately, it doesn't do the conversion between multi_array slices 
to ublas. What it can do is load a cell variable from a mat file into a 
multi_arrray of ublas vectors/matrices.
    I can, however, provide the following code fragment for doing 
regularised linear regression, and returning the MSE on a test set.
-----
    typedef ublas::vector<double> dvector;
    typedef ublas::symmetric_matrix<double, lower, column_major> dsymmat;
    typedef umatlab::chol_representation<double, lower> dcholrep;
    try {
1    dsymmat XX(usebindings<lower>(trans(alias(X)) * X));
      noalias(XX) += regulariser * identity_matrix<double>(XX.size2());
2    dvector alpha(mldivide( dcholrep(XX), trans(X) * y));
      dvector ypredict( usebindings( Xtest * alpha ) );
      MSE = mean( pow(ypredict - ytest, 2) );
    }
    catch( bad_rcond& rcond ) {
      cout << "#W Bad rcondition: " << rcond.rcond << endl;
      MSE = NAN;
    }
-------
Annotation:
1. trans(alias(Xtr)) * Xtr says that we are doing trans(X)*X, where the 
two X's are the same. "alias" is a new container introduced into the 
package to annotate such instances for the compiler. Cf. the "noalias" of 
ublas.
1. usebindings will parse the expression given as its arguments and try to 
match a BLAS2/BLAS3 operation to it. I believe in this case "syrk" is 
invoked. If UMATLAB_NO_USEBINDINGS is defined, then usebindings will be a 
an identity operation, and the blas implementation will be used.
2. Notice that trans(Xtr)*Tautr is a valid operation, i.e., transpose 
matrix times vector
2. dcholrep re-represent the matrix as its Cholesky factors. TOMS-865 
algorithm (patched) for cholesky decomposition is currently used.
2. mldivide does a matrix left divide operation (see matlab mldivide). 
Currently, it simply depatches the operation depending on whether the 
matrix representation is QRP, cholesky, symmetrix matrix, triangular 
matrix, or simply a square matrix. A vector or a matrix is returned 
depending on its second argument.
Kian Ming (Adam)
-- The University of Edinburgh is a charitable body, registered in Scotland, with registration number SC005336.