--- a +++ b/MLFre/DPC/SLEP/altra.c @@ -0,0 +1,86 @@ +#include "mex.h" +#include <stdio.h> +#include <math.h> +#include <string.h> +#include "altra.h" + + +/* + * ------------------------------------------------------------------- + * Function and parameter + * ------------------------------------------------------------------- + * + * altra solves the following problem + * + * 1/2 \|x-v\|^2 + \sum \lambda_i \|x_{G_i}\|, + * + * where x and v are of dimension n, + * \lambda_i >=0, and G_i's follow the tree structure + * + * The file is implemented in the following in Matlab: + * + * x=altra(v, n, ind, nodes); + * + * ind is a 3 x nodes matrix. + * Each column corresponds to a node. + * + * The first element of each column is the starting index, + * the second element of each column is the ending index + * the third element of each column corrreponds to \lambbda_i. + * + * ------------------------------------------------------------------- + * Notices: + * ------------------------------------------------------------------- + * + * 1. The nodes in the parameter "ind" should be given in the + * either + * the postordering of depth-first traversal + * or + * the reverse breadth-first traversal. + * + * 2. When each elements of x are penalized via the same L1 + * (equivalent to the L2 norm) parameter, one can simplify the input + * by specifying + * the "first" column of ind as (-1, -1, lambda) + * + * In this case, we treat it as a single "super" node. Thus in the value + * nodes, we only count it once. + * + * 3. The values in "ind" are in [1,n]. + * + * 4. The third element of each column should be positive. The program does + * not check the validity of the parameter. + * + * It is still valid to use the zero regularization parameter. + * In this case, the program does not change the values of + * correponding indices. + * + * + * ------------------------------------------------------------------- + * History: + * ------------------------------------------------------------------- + * + * Composed by Jun Liu on April 20, 2010 + * + * For any question or suggestion, please email j.liu@asu.edu. + * + */ + + + +void mexFunction (int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]){ + double* v = mxGetPr(prhs[0]); + int n = (int) mxGetScalar(prhs[1]); + double* ind = mxGetPr(prhs[2]); + int nodes = (int) mxGetScalar(prhs[3]); + + int i; + double *x; + + /* set up output arguments */ + plhs[0] = mxCreateDoubleMatrix(n,1,mxREAL); + + x = mxGetPr(plhs[0]); + altra(x, v, n, ind, nodes); +} +