1 /*
2 * Copyright (c) 1996-2000 Lucent Technologies.
3 * See README file for details.
4 */
5
6 #include <unistd.h>
7 #ifdef DOS
8 #include <dos.h>
9 #endif
10
11 #include "local.h"
12
13 #ifdef CVERSION
14
15 #define MAXK 20
16
17 FILE *ofile;
18
19 device devps, devwin;
20 design des;
21 lfit lf;
22 vari *aru;
23
24 extern plots pl[];
25 pplot pp;
26 struct lfcol mycol[MAXCOLOR];
27 char *lfhome;
28 extern char filename[100];
29
30 INT lf_error, lfcm[10];
31
32 vari *curstr;
33 void cmdint();
34 void del_lines();
35
36 /*
37 INDEX data input and output functions
38 savefit: f/end for user savefit.
39 readdata: f/end for readdata
40 savedata: f/end for savedata
41 recondat: reconnect data to fit
42 */
43
savefit(v,mode)44 void savefit(v,mode)
45 vari *v;
46 char *mode;
47 { INT j, fp;
48 char *filename;
49 filename = getargval(v,"file",1);
50 if (filename==NULL)
51 { ERROR(("savefit: no filename"));
52 return;
53 }
54 j = getarg(v,"fp",1);
55 fp = (j>0) ? getlogic(v,j) : 0;
56 dosavefit(&lf,filename,mode,fp);
57 if (mode[0]=='r') endfit();
58 }
59
readdata(v)60 void readdata(v)
61 vari *v;
62 { INT i, fp;
63 i = getarg(v,"data",1);
64 if (i==0) i = getarg(v,"file",1);
65 if (i==0) { ERROR(("readdata: no file name")); return; }
66 fp = getarg(v,"fp",1);
67 fp = (fp>0) ? getlogic(v,fp) : 0;
68 doreaddata(argval(v,i),fp);
69 }
70
savedata(v)71 void savedata(v)
72 vari *v;
73 { INT fp;
74 if (argarg(v,0)==NULL) { ERROR(("savedata: no file name")); return; }
75 fp = getarg(v,"fp",0);
76 fp = (fp>0) ? getlogic(v,fp) : 0;
77 dosavedata(v,fp);
78 }
79
recondat(xonly,n)80 void recondat(xonly,n)
81 INT xonly, *n;
82 { INT i;
83 *n = -1;
84 for (i=0; i<lf.mi[MDIM]; i++) dvari(&lf,i) = vdptr(findvar(lf.xname[i],1,n));
85 if (lf_error | xonly) return;
86 lf.y = vdptr(findvar(lf.yname,1,n));
87 lf.c = vdptr(findvar(lf.cname,1,n));
88 lf.w = vdptr(findvar(lf.wname,1,n));
89 lf.base=vdptr(findvar(lf.bname,1,n));
90 }
91
92 /*
93 INDEX Call fitting functions e.t.c.
94 ckap(): compute SCB constants.
95 crband(): regression bandwidths
96 ckdeb(): kde bandwidths
97 */
98
ckap(v)99 void ckap(v)
100 vari *v;
101 { INT i, nd;
102 nd = 0;
103 if (v->n==1) /* compute for existing fit */
104 { if (nofit()) { ERROR(("ckap: no fit, no arguments")); }
105 else recondat(0,&lf.mi[MN]);
106 }
107 else /* new fit specification */
108 fitoptions(&lf,v,0);
109 if (lf_error) return;
110 lf.nk = constants(&des,&lf,lf.kap);
111 if (lf_error) { lf.nk=0; return; }
112 printf("kappa0:");
113 for (i=0; i<lf.nk; i++) printf(" %8.5f",lf.kap[i]);
114 printf("\n");
115 }
116
crband(v)117 void crband(v)
118 vari *v;
119 { double h[4];
120 INT i, kk, meth[4], nm;
121 meth[0] = 1; meth[1] = 2; meth[2] = 3; meth[3] = 4;
122 nm = 4;
123 fitoptions(&lf,v,0);
124 lf.mi[MDEG0] = lf.mi[MDEG]; lf.mi[MDEG] = 4;
125 rband(&des,&lf,h,meth,&nm,&kk);
126 for (i=0; i<nm; i++)
127 printf("%8.5f ",h[i]);
128 printf("\n");
129 return;
130 }
131
ckdeb(v)132 void ckdeb(v)
133 vari *v;
134 { INT i, mm[6], nm, n;
135 double *x, band[6], h0, h1;
136 char meth[6][5];
137 strcpy(meth[0],"AIC"); strcpy(meth[1],"LCV");
138 strcpy(meth[2],"LSCV"); strcpy(meth[3],"BCV");
139 strcpy(meth[4],"SJPI"); strcpy(meth[5],"GKK");
140 n = -1;
141 i = getarg(v,"x",1);
142 x = vdptr(findvar(argval(v,i),1,&n));
143 if (lf_error) return;
144 h0 = 0.02; h1 = 1.0;
145 i = getarg(v,"h0",1); if (i>0) h0 = darith(argval(v,i));
146 i = getarg(v,"h1",1); if (i>0) h1 = darith(argval(v,i));
147
148 deschk(des,n,1);
149 mm[0]=1; mm[1]=2; mm[2]=3; mm[3]=4; mm[4]=5; mm[5]=6; nm=6;
150 kdeselect(band,x,des.ind,h0,h1,mm,nm,WGAUS,n);
151 for (i=0; i<nm; i++)
152 printf("%s: %8.6f ",meth[mm[i]-1],band[i]);
153 printf("\n");
154 }
155
156 /*
157 INDEX post-fitting functions
158 docrit(): compute c for scb's.
159 crit(): f/end to docrit();
160 backtr(): back transform theta in likelihood models.
161 predict(): interpolate the fit.
162 printdata(): print the current dataset.
163 printfit(): print the current fit.
164 summdata(): summarize current dataset.
165 summfit(): summarize current fit.
166 */
167
docrit(v)168 double docrit(v)
169 vari *v;
170 { double df, al;
171 INT i;
172 df = 0; al = 0.05;
173 i = getarg(v,"df",1); if (i>0) sscanf(argval(v,i),"%lf",&df);
174 i = getarg(v,"al",1); if (i>0) sscanf(argval(v,i),"%lf",&al);
175 return(critval(lf.kap,lf.nk,lf.mi[MDIM],al,10,2,df));
176 }
177
crit(v)178 void crit(v)
179 vari *v;
180 { vari *vr;
181 vr = createvar("crit",STHIDDEN,1,VDOUBLE);
182 if (lf_error) return;
183 vassn(vr,0,docrit(v));
184 saveresult(vr,argarg(v,0),STREGULAR);
185 }
186
backtr(th,mi,nd)187 double backtr(th,mi,nd)
188 double th;
189 INT *mi, nd;
190 { if (nd>0) return(th);
191 return(invlink(th,mi[MLINK]));
192 }
193
predict(vc)194 void predict(vc)
195 vari *vc;
196 {
197 double *data[MXDIM];
198 varname vn;
199 INT i, k, j, gr, n, z, mg[MXDIM];
200 memset(mg, 0, sizeof(mg));
201 dosavefit(&lf,getargval(vc,"fit",0),"rb",(INT)0);
202 if (nofit()) ERROR(("predict: no fit to interpolate\n"));
203 if (lf_error) return;
204
205 gr=0;
206 i = getarg(vc,"grid",0);
207 if (i>0) gr = getlogic(vc,i);
208
209 i = getarg(vc,"where",0);
210 if (i>0) n = setpppoints(&pp,argval(vc,i),NULL,lf.fl);
211 else
212 {
213 for (j=0; j<lf.mi[MDIM]; j++)
214 { i = getarg(vc,lf.xname[j],1);
215 if (i==0)
216 {
217 ERROR(("predict: missing variables"));
218 return;
219 }
220 if (gr) n = 0;
221 sprintf(vn,"_pred%d",j);
222 pp.data[j] = varith(argval(vc,i),vn,STPLOTVAR);
223 if (lf_error) return;
224 if (gr) mg[j] = pp.data[j]->n;
225 }
226 n = pp.data[0]->n;
227 pp.gr = 1+gr;
228 }
229
230 for (j=0; j<lf.mi[MDIM]; j++) data[j] = vdptr(pp.data[j]);
231 pp.d = lf.mi[MDIM];
232
233 switch(pp.gr)
234 { case 1:
235 n = pp.data[0]->n;
236 break;
237 case 2:
238 n = 1;
239 for (i=0; i<lf.mi[MDIM]; i++)
240 {
241 mg[i] = pp.data[i]->n;
242 n *= mg[i];
243 }
244 break;
245 case 3:
246 n = lf.mi[MN];
247 break;
248 case 4:
249 n = lf.nv;
250 break;
251 default:
252 ERROR(("cpreplot where problem"));
253 }
254
255 if (argarg(vc,0)==NULL)
256 pp.fit = createvar("predict",STHIDDEN,n,VDOUBLE);
257 else
258 pp.fit = createvar(argarg(vc,0),STREGULAR,n,VDOUBLE);
259 if (lf_error) return;
260 pp.se = NULL;
261 cpreplot(&pp,vc,'n');
262 if (lf_error) return;
263 for (j=0; j<n; j++)
264 if (vitem(pp.fit,j)!=NOSLN)
265 vassn(pp.fit,j,backtr(vitem(pp.fit,j),lf.mi,lf.nd));
266 if (argarg(vc,0)!=NULL) return;
267 for (j=0; j<n; j++)
268 { for (i=0; i<lf.mi[MDIM]; i++)
269 { z = j;
270 if (pp.gr==2)
271 { for (k=0; k<i; k++) z /= mg[k];
272 z = z%mg[i];
273 }
274 //printf("%10.6f ",data[i][z]);
275 }
276 if (vitem(pp.fit,j)==NOSLN) printf(" Not computed\n");
277 else printf(" %10.6f\n",vitem(pp.fit,j));
278 }
279 deletevar(pp.fit);
280 }
281
printfit(v)282 void printfit(v)
283 vari *v;
284 { INT d, i = 0, j, k, cs, ck, nk, wh[MAXK];
285 double rs, alp, c = 0, fh;
286 cs = ck = nk = 0; rs = 1.0;
287
288 dosavefit(&lf,getargval(v,"fit",i),"rb",(INT)0);
289 for (i=1; i<v->n; i++) if (!argused(v,i))
290 { if (argvalis(v,i,"x")) { setused(v,i); wh[nk++]=1; }
291 if (argvalis(v,i,"fhat")) { setused(v,i); wh[nk++]=2; }
292 if (argvalis(v,i,"coef")) { setused(v,i); wh[nk++]=2; }
293 if (argvalis(v,i,"nlx")) { setused(v,i); wh[nk++]=3; }
294 if (argvalis(v,i,"infl")) { setused(v,i); wh[nk++]=4; }
295 if (argvalis(v,i,"se")) { setused(v,i); wh[nk++]=5; cs=1; }
296 if (argvalis(v,i,"cband")) { setused(v,i); wh[nk++]=7; cs=ck=1; }
297 if (argvalis(v,i,"h")) { setused(v,i); wh[nk++]=8; }
298 if (argvalis(v,i,"deg")) { setused(v,i); wh[nk++]=9; }
299 }
300 if (nk==0) /* default: x and fhat */
301 { wh[nk++] = 1; wh[nk++] = 2;
302 }
303 d = lf.mi[MDIM];
304 alp = 0.95;
305
306 if (cs) rs = sqrt(lf.dp[DRV]);
307 if (ck)
308 { c = critval(lf.kap,lf.nk,lf.mi[MDIM],1-alp,10,2,0.0);
309 printf("using c = %8.5f\n",c);
310 }
311
312 for (i=0; i<lf.nv; i++) if (!lf.s[i])
313 { fh = lf.coef[i]+addparcomp(&lf,evpt(&lf,i),PCOEF);
314 for (j=0; j<nk; j++) switch(wh[j])
315 { case 1:
316 for (k=0; k<d; k++)
317 printf("%8.5f ",evptx(&lf,i,k));
318 break;
319 case 2: printf(" %12.6f ",backtr(fh,lf.mi,0)); break;
320 case 3: printf(" %12.6f ",lf.nlx[i]); break;
321 case 4: printf(" %12.6f ",lf.t0[i]); break;
322 case 5: printf(" %12.6f ",rs*lf.nlx[i]); break;
323 case 7: printf(" (%12.6f,%12.6f) ",fh-c*rs*lf.nlx[i],fh+c*rs*lf.nlx[i]);
324 break;
325 case 8: printf(" %12.6f ",lf.h[i]); break;
326 case 9: printf(" %6.4f ",lf.deg[i]); break;
327 default: ERROR(("prfit: what??"));
328 }
329 printf("\n");
330 }
331 }
332
knotsvar(name,n)333 vari *knotsvar(name,n)
334 varname *name;
335 INT n;
336 { vari *v;
337 v = createvar("=knotv",STHIDDEN,n,VDOUBLE);
338 if (lf_error) return(NULL);
339 if (name!=NULL) v = saveresult(v,name,STREGULAR);
340 return(v);
341 }
342
knots(v)343 void knots(v)
344 vari *v;
345 { INT i, j, k, n;
346 vari *vr;
347 if (nofit()) { ERROR(("knots: no fit")); return; }
348 n = lf.nv; /* should delete pseudo vertices */
349 for (k=0; k<v->n; k++)
350 { vr = NULL;
351 for (j=0; j<lf.mi[MDIM]; j++)
352 if (argvalis(v,k,lf.xname[j]))
353 { vr = knotsvar(argarg(v,k),n);
354 for (i=0; i<n; i++) vassn(vr,i,evptx(&lf,i,j));
355 setused(v,k);
356 }
357 if (argvalis(v,k,"fit")|argvalis(v,k,"coef"))
358 { vr = knotsvar(argarg(v,k),n);
359 for (i=0; i<n; i++) vassn(vr,i,backtr(lf.coef[i],lf.mi,0));
360 setused(v,k);
361 }
362 if (argvalis(v,k,"h")|argvalis(v,k,"band"))
363 { vr = knotsvar(argarg(v,k),n);
364 for (i=0; i<lf.nv; i++) vassn(vr,i,lf.h[i]);
365 setused(v,k);
366 }
367 if (argvalis(v,k,"deg"))
368 { vr = knotsvar(argarg(v,k),n);
369 for (i=0; i<lf.nv; i++) vassn(vr,i,lf.deg[i]);
370 setused(v,k);
371 }
372 ((carg *)viptr(v,k))->result = vr;
373 }
374 }
375
summfit(v)376 void summfit(v)
377 vari *v;
378 { int i;
379 dosavefit(&lf,getargval(v,"fit",1),"rb",0);
380 printf("Response variable: %s\n",lf.yname);
381 printf("Predictor variables: ");
382 for (i=0; i<lf.mi[MDIM]; i++) printf("%s ",lf.xname[i]);
383 printf("\nDegree of fit: %d\n",lf.mi[MDEG]);
384 printf("Smoothing parameters: NN %f fix %f pen %f\n",
385 lf.dp[DALP],lf.dp[DFXH],lf.dp[DADP]);
386 printf("Fitting Family: ");
387 switch(lf.mi[MTG]&63)
388 { case TDEN: printf("Density Estimation\n"); break;
389 case TRAT: printf("Poisson Process Rate Estimation\n"); break;
390 case THAZ: printf("Hazard Rate Estimation\n"); break;
391 case TGAUS:printf("Local Regression\n"); break;
392 case TLOGT:printf("Binomial\n"); break;
393 case TPOIS:printf("Poisson\n"); break;
394 case TGAMM:printf("Exponential/Gamma\n"); break;
395 case TGEOM:printf("Geometric/Negative Binomial\n"); break;
396 case TCIRC:printf("Circular - Von Mises\n"); break;
397 }
398 printf("Fitted Degrees of Freedom: %8.5f\n",lf.dp[DT0]);
399 printf("Number of fit points: %d\n",lf.nv);
400 printf("Evaluation structure: ");
401 switch(lf.mi[MEV])
402 { case ENULL: printf("None\n"); break;
403 case ETREE: printf("Rectangular tree\n"); break;
404 case EPHULL:printf("Triangulation\n"); break;
405 case EDATA: printf("Data\n"); break;
406 case EGRID: printf("Grid\n"); break;
407 case EKDTR: printf("K-d Tree\n"); break;
408 case EKDCE: printf("K-d Tree (centers)\n"); break;
409 case ECROS: printf("Data, Cross-Validation\n"); break;
410 case EPRES: printf("User-provided\n"); break;
411 default: printf("Unknown\n");
412 }
413 }
414
AC(name,r,g,b,p)415 void AC(name,r,g,b,p)
416 char *name;
417 INT r, g, b, p;
418 { devwin.AddColor(name,r,g,b,p);
419 devps.AddColor(name,r,g,b,p);
420 }
421
getcolidx(cname,def)422 INT getcolidx(cname, def)
423 char *cname;
424 int def;
425 { int i;
426 if (cname==NULL) return(def);
427 for (i=0; i<8; i++)
428 if (strcmp(cname,mycol[i].name)==0) return(i);
429 WARN(("color %s not found",cname));
430 return(def);
431 }
432
greyscale(v)433 void greyscale(v)
434 vari *v;
435 { INT i, j0, j1;
436 j0 = getcolidx(getargval(v,"lo",1),0);
437 j1 = getcolidx(getargval(v,"hi",1),1);
438 for (i=0; i<=10; i++)
439 AC("",((10-i)*mycol[j0].r+i*mycol[j1].r)/11,
440 ((10-i)*mycol[j0].g+i*mycol[j1].g)/11,
441 ((10-i)*mycol[j0].b+i*mycol[j1].b)/11,8+i);
442 }
443
setcolor(v)444 void setcolor(v)
445 vari *v;
446 {
447 return;
448 // int i;
449 // lfcm[CBAK] = getcolidx(getargval(v,"back",0),lfcm[CBAK]);
450 //
451 // i = getarg(v,"fore",1);
452 // if (i>0)
453 // { lfcm[CAXI] = getcolidx(argval(v,i));
454 // for (i=CTEX; i<CPA2; i++) lfcm[i] = lfcm[CAXI];
455 // }
456 //
457 // lfcm[CAXI] = getcolidx(getargval(v,"axis",0),lfcm[CAXI]);
458 // lfcm[CTEX] = getcolidx(getargval(v,"text",0),lfcm[CTEX]);
459 // lfcm[CLIN] = getcolidx(getargval(v,"lines",0),lfcm[CLIN]);
460 // lfcm[CPOI] = getcolidx(getargval(v,"points",0),lfcm[CPOI]);
461 // lfcm[CCON] = getcolidx(getargval(v,"cont",0),lfcm[CCON]);
462 // lfcm[CCLA] = getcolidx(getargval(v,"clab",0),lfcm[CCLA]);
463 // lfcm[CSEG] = getcolidx(getargval(v,"cseg",0),lfcm[CSEG]);
464 // lfcm[CPA1] = getcolidx(getargval(v,"patch1",0),lfcm[CPA1]);
465 // lfcm[CPA2] = getcolidx(getargval(v,"patch2",0),lfcm[CPA2]);
466 // if (lfcm[CAXI]==lfcm[0]) WARN(("axis color = background color"));
467 // if (lfcm[CTEX]==lfcm[0]) WARN(("text color = background color"));
468 // if (lfcm[CLIN]==lfcm[0]) WARN(("lines color = background color"));
469 // if (lfcm[CPOI]==lfcm[0]) WARN(("points color = background color"));
470 // if (lfcm[CCON]==lfcm[0]) WARN(("cont color = background color"));
471 // if (lfcm[CCLA]==lfcm[0]) WARN(("clab color = background color"));
472 // if (lfcm[CSEG]==lfcm[0]) WARN(("cseg color = background color"));
473 // if (lfcm[CPA1]==lfcm[0]) WARN(("patch1 color = background color"));
474 // if (lfcm[CPA2]==lfcm[0]) WARN(("patch2 color = background color"));
475 // if (lfcm[CPA1]==lfcm[CPA2]) WARN(("patch1 color = patch2 color"));
476 }
477
table(v)478 void table(v)
479 vari *v;
480 { INT i = 0, j = 0, ix, iy, m, mx, my, n, nx[15], ny[15], count[100];
481 double xl[2], yl[2], xs[15], ys[15], *x, *y;
482 i = getarg(v,"x",1);
483 if (i==0)
484 { ERROR(("table: no x variable"));
485 return;
486 }
487 n = -1;
488 x = vdptr(findvar(argval(v,i),1,&n));
489 xl[0] = xl[1] = x[0];
490 for (i=1; i<n; i++)
491 { if (x[i]<xl[0]) xl[0] = x[i];
492 if (x[i]>xl[1]) xl[1] = x[i];
493 }
494 i = getarg(v,"m",0);
495 if (i>0) sscanf(argval(v,i),"%d",&m); else m = 5;
496 mx = pretty(xl,m,xs);
497 if (lf_error) return;
498
499 i = getarg(v,"y",1);
500 if (i>0)
501 { y = vdptr(findvar(argval(v,i),1,&n));
502 yl[0] = yl[1] = y[0];
503 for (i=1; i<n; i++)
504 { if (y[i]<yl[0]) yl[0] = y[i];
505 if (y[i]>yl[1]) yl[1] = y[i];
506 }
507 my = pretty(yl,m,ys);
508 }
509 else { y = NULL; my = 0; }
510 if (lf_error) return;
511
512 for (i=0; i<15; i++) nx[i] = ny[i] = 0;
513 for (i=0; i<=(mx+1)*(my+1); i++) count[i] = 0;
514 for (i=0; i<n; i++)
515 { if (x[i]<xs[0]) ix = 0;
516 if (x[i]>=xs[mx-1]) ix = mx;
517 if ((x[i]>=xs[0]) & (x[i]<xs[mx-1]))
518 for (j=1; j<mx; j++)
519 if ((x[i]>=xs[j-1]) & (x[i]<xs[j])) ix = j;
520 if (my>0)
521 { if (y[i]<ys[0]) iy = 0;
522 if (y[i]>=ys[my-1]) iy = my;
523 if ((y[i]>=ys[0]) & (y[i]<ys[my-1]))
524 for (j=1; j<my; j++)
525 if ((y[i]>=ys[j-1]) & (y[i]<ys[j])) iy = j;
526 } else iy = 0;
527 nx[ix] = ny[iy] = 1;
528 count[ix*(my+1)+iy]++;
529 }
530 if (my>0) printf(" ");
531 for (i=0; i<=mx; i++) if (nx[i]>0)
532 printf(" %4g-",(i==0) ? xl[0] : xs[i-1]);
533 printf("\n");
534 if (my>0) printf(" ");
535 for (i=0; i<=mx; i++) if (nx[i]>0)
536 printf(" %4g ",(i==mx) ? xl[1] : xs[i]);
537 printf("\n\n");
538 for (j=0; j<=my; j++) if (ny[j]>0)
539 { if (my>0)
540 printf("%4g-%4g ",(j==0) ? yl[0] : ys[j-1],
541 (j==my) ? yl[1] : ys[j]);
542 for (i=0; i<=mx; i++)
543 if (nx[i]>0) printf("%6d ",count[i*(my+1)+j]);
544 printf("\n");
545 }
546 }
547
548 /*
549 INDEX control functions:
550 setout(): set output file.
551 cmdint(): send off the command...
552 locfit_dispatch(): called by the main program.
553 */
554
setout(v)555 void setout(v)
556 vari *v;
557 { INT i, i0;
558 char md;
559 i0 = getarg(v,"file",1);
560 if (i0==0)
561 { if (ofile!=NULL) fclose(ofile);
562 ofile = NULL;
563 printf("Output set to stdout\n");
564 return;
565 }
566
567 md = 'w';
568 i = getarg(v,"mode",1);
569 if ((i>0) && (argval(v,i)[0]=='a')) md = 'a';
570
571 setfilename(argval(v,i0),"",&md,0);
572 if (ofile != NULL) fclose(ofile);
573 ofile = fopen(filename,&md);
574 if (ofile == NULL)
575 ERROR(("setout: can't open %s for writing",filename));
576 else
577 printf("Output set to file %s\n",filename);
578 }
579
dosleep(v)580 void dosleep(v)
581 vari *v;
582 { INT i;
583 i = getarg(v,"time",1);
584 if (i==0) return;
585 sscanf(argval(v,i),"%d",&i);
586 (void)sleep(i);
587 }
588
setdef(v)589 void setdef(v)
590 vari *v;
591 { INT i, n;
592 carg *ca;
593 vari *vd;
594
595 if (argarg(v,0)==NULL)
596 { ERROR(("Unnamed Defintion"));
597 return;
598 }
599 n = vlength(v)-1;
600 vd = createvar(argarg(v,0),STSYSTEM,n,VARGL);
601 if (lf_error) return;
602
603 for (i=0; i<n; i++)
604 { ca = (carg *)viptr(vd,i);
605 ca->arg = argarg(v,i+1);
606 ca->val = argval(v,i+1);
607 setused(v,i+1);
608 }
609 sprintf(curstr->name,"=%s",argarg(v,0));
610 }
611
612 extern void cscbsim();
613
dcmdint(v)614 void dcmdint(v)
615 vari *v;
616 { INT i;
617 if (v==NULL)
618 { ERROR(("dcmdint received NULL"));
619 return;
620 }
621 if (argvalis(v,0,"band")) { band(v); return; }
622 if (argvalis(v,0,"crit")) { crit(v); return; }
623 if (argvalis(v,0,"def")) { setdef(v); return; }
624 if (argvalis(v,0,"endfor")) { dec_forvar(); return; }
625 if (argvalis(v,0,"for")) { inc_forvar(); return; }
626 if (argvalis(v,0,"example")){example(v); return; }
627 if (argvalis(v,0,"help")) {example(v); return; }
628 if (argvalis(v,0,"?")) {example(v); return; }
629 if (argvalis(v,0,"exit")) exit(0);
630 if (argvalis(v,0,"quit")) exit(0);
631 if (argvalis(v,0,"q()")) exit(0);
632 if (argvalis(v,0,"fitted")){ cfitted(v,RMEAN); return; }
633 if (argvalis(v,0,"greyscale")) { greyscale(v); return; }
634 if (argvalis(v,0,"kappa")) { ckap(v); return; }
635 if (argvalis(v,0,"kdeb")) { ckdeb(v); return; }
636 if (argvalis(v,0,"knots")) { knots(v); return; }
637 if (argvalis(v,0,"locfit")) { clocfit(v,0); return; }
638 if (argvalis(v,0,"relocfit")) { clocfit(v,1); return; }
639 if (argvalis(v,0,"plot")) { printf("use plotfit or plotdata\n"); return; }
640 if (argvalis(v,0,"plotdata")) { plotdata(v); return; }
641 if (argvalis(v,0,"plotfit")) { plotfit(v); return; }
642 if (argvalis(v,0,"replot")) { plotopt(v,1); return; }
643 if (argvalis(v,0,"predict")) { predict(v); return; }
644 if (argvalis(v,0,"prfit")) { printfit(v); return; }
645 if (argvalis(v,0,"rband")) { crband(v); return; }
646 if (argvalis(v,0,"readdata")) { readdata(v); return; }
647 if (argvalis(v,0,"readfile")) { readfile(v); return; }
648 if (argvalis(v,0,"readfit")) { savefit(v,"rb"); return; }
649 if (argvalis(v,0,"residuals")){ cfitted(v,RDEV); return; }
650 if (argvalis(v,0,"run")) return;
651 if (argvalis(v,0,"savedata")) { savedata(v); return; }
652 if (argvalis(v,0,"savefit")) { savefit(v,"wb"); return; }
653 if (argvalis(v,0,"scbmax")) { cscbsim(v); return; }
654 if (argvalis(v,0,"scbsim")) { cscbsim(v); return; }
655 if (argvalis(v,0,"seed")) { rseed(argval(v,1)); setused(v,1); return; }
656 if (argvalis(v,0,"setcolor")) { setcolor(v); return; }
657 if (argvalis(v,0,"setout")) { setout(v); return; }
658 if (argvalis(v,0,"outf")) { setout(v); return; }
659 if (argvalis(v,0,"setplot")) { setplot(v); return; }
660 if (argvalis(v,0,"sleep")) { dosleep(v); return; }
661 if (argvalis(v,0,"summfit")) { summfit(v); return; }
662 if (argvalis(v,0,"table")) { table(v); return; }
663 if (argvalis(v,0,"track")) { plottrack(v); return; }
664 if (argvalis(v,0,"wdiag")) { cwdiag(v); return; }
665 for (i=0; i<vlength(v); i++)
666 { ((carg *)viptr(v,i))->result = varith(argval(v,i),argarg(v,i),STREGULAR);
667 setused(v,i);
668 if (lf_error) return;
669 }
670 }
671
cmdint(v)672 void cmdint(v)
673 vari *v;
674 { vari *vv, *vr;
675 INT i, j, mn, nr;
676 if (v==NULL) return;
677
678 for (i=0; i<vlength(v); i++)
679 { setunused(v,i);
680 /* ((carg *)viptr(v,i))->used = 0; */
681 ((carg *)viptr(v,i))->result = NULL;
682 }
683
684 setused(v,0);
685 if (vlength(v)==1)
686 { j = 0;
687 vv = findvar(argval(v,0),0,&j);
688 if ((vv!=NULL) && ((vv->mode==VARGL) & (!argvalis(v,0,"=cline"))))
689 {
690 cmdint(vv);
691 return;
692 }
693 }
694
695 /* dcmdint processes command */
696 dcmdint(v);
697
698 /* print the results of unassigned expression.
699 * First, determine mn = maximum number of rows in the
700 * output. Note that vr->stat==STHIDDEN determines whether
701 * the result was unassigned.
702 */
703 mn = 0; nr = 0;
704 for (i=0; i<vlength(v); i++)
705 { vr = ((carg *)viptr(v,i))->result;
706 if ((vr != NULL) && (vr->stat==STHIDDEN))
707 switch(vr->mode)
708 { case VCHAR: if (mn<1) mn = 1;
709 break;
710 case VINT:
711 case VDOUBLE: if (mn<vr->n) mn = vr->n;
712 break;
713 }
714 }
715
716 /* now, print the unassigned variables.
717
718 for (i=0; i<mn; i++)
719 { for (j=0; j<vlength(v); j++)
720 { vr = ((carg *)viptr(v,j))->result;
721 if ((vr != NULL) && (vr->stat==STHIDDEN))
722 switch(vr->mode)
723 { case VDOUBLE: printf("%8.5f ",vitem(vr,i)); break;
724 case VCHAR: printf("%s ",vdptr(vr)); break;
725 case VINT: printf("%4d ", vitem(vr,i)); break;
726 }
727 }
728 printf("\n");
729 }
730 */
731
732 for (i=0; i<vlength(v); i++)
733 deleteifhidden(((carg *)viptr(v,i))->result);
734 }
735
locfit_dispatch(char * z)736 INT locfit_dispatch(char *z)
737
738 { vari *v;
739
740 makecmd(z);
741 while (1)
742 { lf_error = 0;
743 v = getcmd();
744 if (v==NULL)
745 { del_lines();
746 return(0);
747 }
748 cmdint(v);
749 }
750 }
751
setuplf()752 void setuplf()
753 { INT i;
754 char command[100];
755 vari *v;
756
757 lfhome = getenv("LFHOME");
758 initdb();
759
760 ofile = NULL;
761 lf.tw = lf.xxev = lf.L = lf.iw = des.dw = lf.pc.wk = NULL;
762 des.index = NULL;
763 lf.mg = calloc(MXDIM,sizeof(INT));
764
765 v = createvar("mi",STSYSPEC,LENM,VINT); v->dpr = (double *)lf.mi;
766 v = createvar("dp",STSYSPEC,LEND,VDOUBLE); v->dpr = lf.dp;
767 v = createvar("alpha",STSYSPEC,1,VDOUBLE); v->dpr = &lf.dp[DALP];
768 v = createvar("h", STSYSPEC,1,VDOUBLE); v->dpr = &lf.dp[DFXH];
769 v = createvar("pen", STSYSPEC,1,VDOUBLE); v->dpr = &lf.dp[DADP];
770 v = createvar("infl", STSYSPEC,1,VDOUBLE); v->dpr = &lf.dp[DT0];
771 v = createvar("vari", STSYSPEC,1,VDOUBLE); v->dpr = &lf.dp[DT1];
772 v = createvar("like", STSYSPEC,1,VDOUBLE); v->dpr = &lf.dp[DLK];
773 v = createvar("resv", STSYSPEC,1,VDOUBLE); v->dpr = &lf.dp[DRV];
774
775 for (i=0; i<MAXWIN; i++)
776 { pl[i].xyzs = NULL;
777 pl[i].id = i;
778 pl[i].ty = PLNONE;
779 pl[i].track = NULL;
780 }
781 //SetWinDev(&devwin);
782 //SetPSDev(&devps);
783 // AC("white",255,255,255,0);
784 // AC("black", 0, 0, 0,1);
785 // AC( "red",255, 0, 0,2);
786 // AC("green", 0,255, 0,3);
787 // AC( "blue", 0, 0,255,4);
788 // AC("magenta",255,0,255,5);
789 // AC("yellow",255,255, 0,6);
790 // AC( "cyan", 0,255,255,7);
791 lfcm[0] = 0;
792 for (i=CAXI; i<=CPA1; i++) lfcm[i] = 1;
793 lfcm[CPA2] = 2;
794 rseed("LocalFit");
795 if (setfilename("LFInit","cmd","r",0))
796 { sprintf(command,"run %s",filename);
797 locfit_dispatch(command);
798 }
799 }
800
801 #endif
802