/***************************************************************************** * mexschur.c : C mex file to compute * * mexschur(blk,Avec,nzlistA1,nzlistA2,permA,U,V,colend,type,schur); * * schur(I,J) = schur(I,J) + Trace(Ai U Aj V), * where I = permA[i], J = permA[j], 1<=i,j<=colend. * * input: blk = 1x2 a cell array describing the block structure of A. * Avec = * nzlistA = * permA = a permutation vector. * U,V = real symmetric matrices. * type = 0, compute Trace(Ai*(U Aj V + V Aj U)/2)) = Trace(Ai*(U Aj V)) * = 1, compute Trace(Ai*(U Aj U)). * * SDPT3: version 3.0 * Copyright (c) 1997 by * K.C. Toh, M.J. Todd, R.H. Tutuncu * Last Modified: 2 Feb 01 ****************************************************************************/ #include #include #if !defined(MAX) #define MAX(A, B) ((A) > (B) ? (A) : (B)) #endif #if !defined(r2) #define r2 1.41421356237309504880 /* sqrt(2) */ #endif #if !defined(ir2) #define ir2 0.70710678118654752440 /* 1/sqrt(2) */ #endif /********************************************************* * * ********************************************************/ void setvec(int n, double *x, double alpha) { int k; for (k=0; k<=n; ++k) { x[k] = alpha; } return; } /********************************************************** * compute Trace(B U*A*U) * * A,B are assumed to be real,sparse,symmetric. * U is assumed to be real,dense,symmetric. **********************************************************/ void schurij1(int n, double *Avec, mwIndex *idxstart, mwIndex *nzlistAi, mwIndex *nzlistAj, double *U, int col, double *schurcol) { int i, ra, ca, rb, cb, rbn, cbn, l, k, kstart, kend, lstart, lend; double tmp1, tmp2, tmp3, tmp4; lstart = idxstart[col]; lend = idxstart[col+1]; for (i=0; i<=col; i++) { if (schurcol[i] != 0) { kstart = idxstart[i]; kend = idxstart[i+1]; tmp1 = 0; tmp2 = 0; for (l=lstart; l cb) { mexErrMsgTxt("mexschur: nzlistA2 is incorrect"); } rbn = rb*n; cbn = cb*n; tmp3 = 0; tmp4 = 0; for (k=kstart; k cb) { mexErrMsgTxt("mexschur: nzlistA2 is incorrect"); } rbn = rb*n; cbn = cb*n; tmp3 = 0; tmp4 = 0; for (k=kstart; k cblk) { break; } } kstart = kstartnew; if (rb cblk) { break; } } kstart = kstartnew; if (rb1) { mexErrMsgTxt("mexschur: blk can have only 1 row"); } subs[0] = 0; subs[1] = 1; index = mxCalcSingleSubscript(prhs[0],nsubs,subs); blk_cell_pr = mxGetCell(prhs[0],index); numblk = mxGetN(blk_cell_pr); blksizetmp = mxGetPr(blk_cell_pr); blksize = (mwIndex*)mxCalloc(numblk,sizeof(mwIndex)); for (k=0; k