/* ************************************************************ PROCEDURE bwprodform - Solves (PROD_j L(pj,betaj))' * yNEW = yOLD. INPUT p - nonzeros of sparse m x n matrix P. Has xsuper(j+1) nonzeros in column j. xsuper - xsuper(j+1) is number of nonzeros in p(:,j). perm - lists pivot order for columns where ordered(j)==1. ordered - ordered[j]==1 iff p(:,j) and beta(L:,j) have been reordered; the original row numbers are in perm(:,j). n - number of columns in p, beta. UPDATED y - length m vector. On input, the rhs. On output the solution to (PROD_j L(pj,betaj))' * yNEW = yOLD. ************************************************************ */ void bwprodform(double *y, const mwIndex *xsuper, const mwIndex *perm, const double *p, const double *beta, const mwIndex *betajc, const char *ordered, const mwIndex n, mwIndex pnnz, mwIndex permnnz) { mwIndex k,nk, mk; /* ------------------------------------------------------------ Backward solve L(pk,betak) * yNEXT = yPREV for k=n-1:-1:0. ------------------------------------------------------------ */ for(k = n; k > 0; k--){ mk = xsuper[k]; nk = betajc[k] - betajc[k-1]; pnnz -= mk; if(ordered[k-1]){ permnnz -= mk; bwipr1o(y, perm+permnnz, p+pnnz, beta+betajc[k-1], mk, nk); } else bwipr1(y, p+pnnz, beta+betajc[k-1], mk, nk); } mxAssert(pnnz == 0,""); mxAssert(permnnz == 0 || permnnz == 1,""); }
/* ************************************************************ PROCEDURE bwprodform - Solves (PROD_j L(pj,betaj))' * yNEW = yOLD. INPUT p - nonzeros of sparse m x n matrix P. Has xsuper(j+1) nonzeros in column j. xsuper - xsuper(j+1) is number of nonzeros in p(:,j). perm - lists pivot order for columns where ordered(j)==1. ordered - ordered[j]==1 iff p(:,j) and beta(L:,j) have been reordered; the original row numbers are in perm(:,j). n - number of columns in p, beta. UPDATED y - length m vector. On input, the rhs. On output the solution to (PROD_j L(pj,betaj))' * yNEW = yOLD. ************************************************************ */ void bwprodform(double *y, const int *xsuper, const int *perm, const double *p, const double *beta, const int *betajc, const char *ordered, const int n, int pnnz, int permnnz) { int k,nk, mk; /* ------------------------------------------------------------ Backward solve L(pk,betak) * yNEXT = yPREV for k=n-1:-1:0. ------------------------------------------------------------ */ for(k = n-1; k >= 0; k--){ mk = xsuper[k+1]; nk = betajc[k+1] - betajc[k]; pnnz -= mk; if(ordered[k]){ permnnz -= mk; bwipr1o(y, perm+permnnz, p+pnnz, beta+betajc[k], mk, nk); } else bwipr1(y, p+pnnz, beta+betajc[k], mk, nk); } mxAssert(pnnz == 0,""); mxAssert(permnnz == 0 || permnnz == 1,""); }