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;