68 if(m<=0 || n<=0 || a==NULL || b==NULL || x==NULL)
return(2);
70 int *index=NULL, *indexl=NULL;
71 double *w=NULL, *zz=NULL, *wl=NULL, *zzl=NULL;
72 if(wp!=NULL) w=wp;
else w=wl=(
double*)calloc(n,
sizeof(
double));
73 if(zzp!=NULL) zz=zzp;
else zz=zzl=(
double*)calloc(m,
sizeof(
double));
74 if(indexp!=NULL) index=indexp;
else index=indexl=(
int*)calloc(n,
sizeof(
int));
75 if(w==NULL || zz==NULL || index==NULL)
return(2);
78 for(
int ni=0; ni<n; ni++) {x[ni]=0.; index[ni]=ni;}
87 int itmax;
if(n<3) itmax=n*3;
else itmax=n*n;
90 while(iz1<=iz2 && nsetp<m) {
92 for(
int iz=iz1; iz<=iz2; iz++) {
95 for(
int mi=npp1; mi<m; mi++) sm+=a[ni][mi]*b[mi];
105 for(
int iz=iz1; iz<=iz2; iz++) {
107 if(w[i]>wmax) {wmax=w[i]; izmax=iz;}
118 double asave=a[j][npp1];
120 _lss_h12(1, npp1, npp1+1, m, &a[j][0], 1, &up, NULL, 1, 1, 0);
122 if(nsetp!=0)
for(
int mi=0; mi<nsetp; mi++) unorm+=a[j][mi]*a[j][mi];
124 double d=unorm+fabs(a[j][npp1])*0.01;
128 for(
int mi=0; mi<m; mi++) zz[mi]=b[mi];
129 _lss_h12(2, npp1, npp1+1, m, &a[j][0], 1, &up, zz, 1, 1, 1);
130 double ztest=zz[npp1]/a[j][npp1];
137 a[j][npp1]=asave; w[j]=0.;
144 for(
int mi=0; mi<m; mi++) b[mi]=zz[mi];
145 index[izmax]=index[iz1]; index[iz1]=j; iz1++; nsetp=npp1+1; npp1++;
147 for(
int jz=iz1; jz<=iz2; jz++) {
149 _lss_h12(2, nsetp-1, npp1, m, &a[j][0], 1, &up, &a[jj][0], 1, m, 1);
151 if(nsetp!=m)
for(
int mi=npp1; mi<m; mi++) a[j][mi]=0.;
155 for(
int mi=0; mi<nsetp; mi++) {
157 if(mi!=0)
for(
int ii=0; ii<=ip; ii++) zz[ii]-=a[jj][ii]*zz[ip+1];
158 jj=index[ip]; zz[ip]/=a[jj][ip];
162 while(++iter<itmax) {
165 for(
int ip=0; ip<nsetp; ip++) {
168 double t=-x[ni]/(zz[ip]-x[ni]);
169 if(alpha>t) {alpha=t; jj=ip-1;}
175 if(alpha==2.0)
break;
178 for(
int ip=0; ip<nsetp; ip++) {
179 int ni=index[ip]; x[ni]+=alpha*(zz[ip]-x[ni]);
189 for(
int ni=jj+1; ni<nsetp; ni++) {
190 int ii=index[ni]; index[ni-1]=ii;
192 _lss_g1(a[ii][ni-1], a[ii][ni], &cc, &ss, &a[ii][ni-1]);
194 for(
int nj=0; nj<n; nj++)
if(nj!=ii) {
196 double temp=a[nj][ni-1];
197 a[nj][ni-1]=cc*temp+ss*a[nj][ni];
198 a[nj][ni]=-ss*temp+cc*a[nj][ni];
201 double temp=b[ni-1]; b[ni-1]=cc*temp+ss*b[ni]; b[ni]=-ss*temp+cc*b[ni];
204 npp1=nsetp-1; nsetp--; iz1--; index[iz1]=k;
210 for(jj=0, pfeas=1; jj<nsetp; jj++) {
211 k=index[jj];
if(x[k]<=0.) {pfeas=0;
break;}
216 for(
int mi=0; mi<m; mi++) zz[mi]=b[mi];
217 for(
int mi=0; mi<nsetp; mi++) {
219 if(mi!=0)
for(
int ii=0; ii<=ip; ii++) zz[ii]-=a[jj][ii]*zz[ip+1];
220 jj=index[ip]; zz[ip]/=a[jj][ip];
224 if(iter>=itmax)
break;
225 for(
int ip=0; ip<nsetp; ip++) {k=index[ip]; x[k]=zz[ip];}
231 if(npp1<m)
for(
int mi=npp1; mi<m; mi++) sm+=(b[mi]*b[mi]);
232 else for(
int ni=0; ni<n; ni++) w[ni]=0.;
237 w=NULL; zz=NULL; index=NULL;
238 if(wl!=NULL) free(wl);
239 if(zzl!=NULL) free(zzl);
240 if(indexl!=NULL) free(indexl);
241 if(iter>=itmax)
return(1);
int nnls(double **a, int m, int n, double *b, double *x, double *rnorm, double *wp, double *zzp, int *indexp)