41int nnls(
double **a, 
int m, 
int n, 
double *b, 
double *x, 
double *rnorm,
 
   42         double *wp, 
double *zzp, 
int *indexp) {
 
   44  int pfeas, ret = 0, iz, jz, iz1, iz2, npp1, *index;
 
   45  double d1, d2, sm, up = 0.0, ss, *w, *zz;
 
   46  int iter, k, j = 0, l, itmax, izmax = 0, nsetp, ii, jj = 0, ip;
 
   47  double temp, wmax, t, alpha, asave, dummy, unorm, ztest, cc;
 
   50  if (m <= 0 || n <= 0 || a == NULL || b == NULL || x == NULL)
 
   56    w = (
double *)calloc(n, 
sizeof(
double));
 
   60    zz = (
double *)calloc(m, 
sizeof(
double));
 
   64    index = (
int *)calloc(n, 
sizeof(
int));
 
   65  if (w == NULL || zz == NULL || index == NULL)
 
   69  for (k = 0; k < n; k++) {
 
   85  while (iz1 <= iz2 && nsetp < m) {
 
   87    for (iz = iz1; iz <= iz2; iz++) {
 
   90      for (l = npp1; l < m; l++)
 
   98      for (wmax = 0., iz = iz1; iz <= iz2; iz++) {
 
  117      h12(1, npp1, npp1 + 1, m, &a[j][0], 1, &up, &dummy, 1, 1, 0);
 
  120        for (l = 0; l < nsetp; l++) {
 
  125      d2 = unorm + (d1 = a[j][npp1], fabs(d1)) * 0.01;
 
  126      if ((d2 - unorm) > 0.) {
 
  129        for (l = 0; l < m; l++)
 
  131        h12(2, npp1, npp1 + 1, m, &a[j][0], 1, &up, zz, 1, 1, 1);
 
  132        ztest = zz[npp1] / a[j][npp1];
 
  149    for (l = 0; l < m; ++l)
 
  151    index[iz] = index[iz1];
 
  157      for (jz = iz1; jz <= iz2; jz++) {
 
  159        h12(2, nsetp - 1, npp1, m, &a[j][0], 1, &up, &a[jj][0], 1, m, 1);
 
  162      for (l = npp1; l < m; l++)
 
  167    for (l = 0; l < nsetp; l++) {
 
  168      ip = nsetp - (l + 1);
 
  170        for (ii = 0; ii <= ip; ii++)
 
  171          zz[ii] -= a[jj][ii] * zz[ip + 1];
 
  177    while (++iter < itmax) {
 
  180      for (alpha = 2.0, ip = 0; ip < nsetp; ip++) {
 
  183          t = -x[l] / (zz[ip] - x[l]);
 
  197      for (ip = 0; ip < nsetp; ip++) {
 
  199        x[l] += alpha * (zz[ip] - x[l]);
 
  208        if (jj != (nsetp - 1)) {
 
  210          for (j = jj + 1; j < nsetp; j++) {
 
  213            g1(a[ii][j - 1], a[ii][j], &cc, &ss, &a[ii][j - 1]);
 
  214            for (a[ii][j] = 0., l = 0; l < n; l++)
 
  218                a[l][j - 1] = cc * temp + ss * a[l][j];
 
  219                a[l][j] = -ss * temp + cc * a[l][j];
 
  223            b[j - 1] = cc * temp + ss * b[j];
 
  224            b[j] = -ss * temp + cc * b[j];
 
  236        for (jj = 0, pfeas = 1; jj < nsetp; jj++) {
 
  243      } 
while (pfeas == 0);
 
  246      for (k = 0; k < m; k++)
 
  248      for (l = 0; l < nsetp; l++) {
 
  249        ip = nsetp - (l + 1);
 
  251          for (ii = 0; ii <= ip; ii++)
 
  252            zz[ii] -= a[jj][ii] * zz[ip + 1];
 
  262    for (ip = 0; ip < nsetp; ip++) {
 
  272      for (k = npp1; k < m; k++)
 
  275      for (j = 0; j < n; j++)
 
  290int h12(
int mode, 
int lpivot, 
int l1, 
int m, 
double *u, 
int u_dim1, 
double *up,
 
  291        double *cm, 
int ice, 
int icv, 
int ncv) {
 
  292  double d1, b, clinv, cl, sm;
 
  296  if (mode != 1 && mode != 2)
 
  298  if (m < 1 || u == NULL || u_dim1 < 1 || cm == NULL)
 
  301  if (lpivot < 0 || lpivot >= l1 || l1 > m)
 
  305  cl = NNLS_ABS(u[lpivot * u_dim1]);
 
  313    for (j = l1; j < m; j++) { 
 
  314      cl = NNLS_MAX(NNLS_ABS(u[j * u_dim1]), cl);
 
  324    d1 = u[lpivot * u_dim1] * clinv;
 
  327    for (j = l1; j < m; j++) {
 
  328      d1 = u[j * u_dim1] * clinv;
 
  333    if (u[lpivot * u_dim1] > 0.)
 
  335    up[0] = u[lpivot * u_dim1] - cl;
 
  336    u[lpivot * u_dim1] = cl;
 
  341  b = up[0] * u[lpivot * u_dim1];
 
  348  for (j = 0; j < ncv; j++) {
 
  350    sm = cm[lpivot * ice + j * icv] * (up[0]);
 
  351    for (k = l1; k < m; k++) {
 
  352      sm += cm[k * ice + j * icv] * u[k * u_dim1];
 
  358      cm[lpivot * ice + j * icv] += sm * (up[0]);
 
  359      for (k = l1; k < m; k++) {
 
  360        cm[k * ice + j * icv] += u[k * u_dim1] * sm;
 
  368void g1(
double a, 
double b, 
double *cterm, 
double *sterm, 
double *sig) {
 
  371  if (fabs(a) > fabs(b)) {
 
  374    yr = sqrt(d1 * d1 + 1.);
 
  376    *cterm = (a >= 0.0 ? fabs(d1) : -fabs(d1));
 
  377    *sterm = (*cterm) * xr;
 
  379  } 
else if (b != 0.) {
 
  382    yr = sqrt(d1 * d1 + 1.);
 
  384    *sterm = (b >= 0.0 ? fabs(d1) : -fabs(d1));
 
  385    *cterm = (*sterm) * xr;