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