67 int verbose=0;
if(status!=NULL) verbose=status->
verbose;
68 if(verbose>0) printf(
"%s()\n", __func__);
70 printf(
"%s(x, ", __func__);
71 if(x2==NULL) printf(
"null, y, ");
else printf(
"x2, y, ");
72 if(w==NULL) printf(
"null");
else printf(
"w");
73 printf(
" , %d, %.1e, %.1e, %d, %g, %g, %g, *k, *a, *dtEst, *yfit\n",
74 sNr, kMin, kMax, fNr, dtMin, dtMax, dtStep);
76 if(x==NULL || y==NULL) {
81 if(verbose>1) fprintf(stderr,
"invalid number of samples\n");
86 if(verbose>1) fprintf(stderr,
"invalid number of functions\n");
90 if(!(kMin>0.0) || !(kMax>kMin)) {
91 if(verbose>1) fprintf(stderr,
"invalid k range\n");
95 double dtRange=dtMax-dtMin;
96 if(!(dtRange>=0.0) || (dtRange>0.0 && !(dtStep<0.2*dtRange))) {
97 if(verbose>1) fprintf(stderr,
"invalid delay time settings\n");
103 double *lk, *la, *localp;
104 localp=(
double*)malloc(
sizeof(
double)*fNr*2);
109 lk=localp; la=localp+fNr;
111 if(verbose>2) printf(
"computing k values\n");
115 r1=log(kMin); r2=log(kMax); s=(r2-r1)/(
double)(fNr-1);
116 if(verbose>3) printf(
" r1 := %g\n r2 := %g\n s := %g\n", r1, r2, s);
117 for(
int bi=0; bi<fNr; bi++) lk[bi]=exp((
double)bi*s+r1);
122 r1=log10(kMin); r2=log10(kMax); s=(r2-r1)/(
double)(fNr-1);
123 if(verbose>3) printf(
" r1 := %g\n r2 := %g\n s := %g\n", r1, r2, s);
124 for(
int bi=0; bi<fNr; bi++) lk[bi]=pow(10.0, (
double)bi*s+r1);
128 if(verbose>2) printf(
"computing the range of delay times to test\n");
132 if(verbose>2) printf(
"allocating memory for LLSQ\n");
138 statusSet(status, __func__, __FILE__, __LINE__, ret);
143 double initDeltaT=dtMin;
144 if(dtMax>dtMin) initDeltaT=0.5*(dtMin+dtMax);
145 if(verbose>3) printf(
"initDeltaT := %g\n", initDeltaT);
148 if(verbose>2) printf(
"LLSQ fitting\n");
149 double bestDeltaT=initDeltaT;
150 double bestR2=nan(
"");
151 double deltaT=initDeltaT;
152 if(verbose>2) printf(
" deltaT=%g\n", deltaT);
153 if(verbose>6) printf(
"filling data matrix\n");
155 for(
int m=0; m<lsq.
m; m++) lsq.
b[m]=y[m];
157 double p[3]={deltaT, 1.0, 0.0};
158 for(
int n=0, ret=0; n<lsq.
n && !ret; n++) {
163 ret=
mfEvalY(
"dmsurge", 3, p, lsq.
m, x, lsq.
a[n], 0);
173 if(verbose>6) printf(
"applying NNLS\n");
175 ret=
nnlsq(&lsq, verbose-1);
181 if(verbose>2) printf(
" -> r2=%g iterNr=%d\n", lsq.
rnorm, lsq.
iternr);
184 for(
int n=0; n<lsq.
n; n++) la[n]=lsq.
x[n];
187 deltaT=initDeltaT-dtStep;
188 while(dtStep>0.0 && deltaT>=dtMin) {
189 if(verbose>2) printf(
" deltaT=%g\n", deltaT);
190 for(
int m=0; m<lsq.
m; m++) lsq.
b[m]=y[m];
192 for(
int n=0, ret=0; n<lsq.
n && !ret; n++) {
197 ret=
mfEvalY(
"dmsurge", 3, p, lsq.
m, x, lsq.
a[n], 0);
206 int ret=
nnlsq(&lsq, verbose-1);
208 if(verbose>2) printf(
" -> r2=%g iterNr=%d\n", lsq.
rnorm, lsq.
iternr);
209 if(lsq.
rnorm<bestR2) {
212 for(
int n=0; n<lsq.
n; n++) la[n]=lsq.
x[n];
217 deltaT=initDeltaT+dtStep;
218 while(dtStep>0.0 && deltaT<=dtMax) {
219 if(verbose>2) printf(
" deltaT=%g\n", deltaT);
220 for(
int m=0; m<lsq.
m; m++) lsq.
b[m]=y[m];
224 for(
int n=0, ret=0; n<lsq.
n && !ret; n++) {
229 ret=
mfEvalY(
"dmsurge", 3, p, lsq.
m, x, lsq.
a[n], 0);
239 int ret=
nnlsq(&lsq, verbose-1);
242 if(verbose>2) printf(
" -> r2=%g iterNr=%d\n", lsq.
rnorm, lsq.
iternr);
243 if(lsq.
rnorm<bestR2) {
246 for(
int n=0; n<lsq.
n; n++) la[n]=lsq.
x[n];
254 if(verbose>1) printf(
"computing yfit[]\n");
255 for(
int m=0; m<lsq.
m; m++) {
257 for(
int n=0; n<lsq.
n; n++)
259 yfit[m]+=la[n]*(x[m]+bestDeltaT)*exp(-lk[n]*(x[m]+bestDeltaT));
266 if(a!=NULL)
for(
int bi=0; bi<fNr; bi++) a[bi]=la[bi];
267 if(k!=NULL)
for(
int bi=0; bi<fNr; bi++) k[bi]=lk[bi];
270 if(dtEst!=NULL) *dtEst=bestDeltaT;
int spectralDMSurge(const double *x, const double *x2, const double *y, double *w, const int sNr, const double kMin, const double kMax, const int fNr, const double dtMin, const double dtMax, const double dtStep, double *k, double *a, double *dtEst, double *yfit, TPCSTATUS *status)
int mfEvalFrameY(const char *fid, const int parNr, const double *p, const int sampleNr, const double *x1, const double *x2, double *y, const int verbose)