xref: /csrg-svn/old/refer/hunt/hunt2.c (revision 12284)
1*12284Stut #ifndef lint
2*12284Stut static char *sccsid = "@(#)hunt2.c	4.1 (Berkeley) 05/06/83";
3*12284Stut #endif
4*12284Stut 
5*12284Stut #include "refer..c"
6*12284Stut 
7*12284Stut static int *coord = 0;
8*12284Stut int hh[50];
9*12284Stut extern int *hfreq, hfrflg, hcomp(), hexch();
10*12284Stut extern int prfreqs;
11*12284Stut 
12*12284Stut doquery(hpt, nhash, fb, nitem, qitem, master)
13*12284Stut long *hpt;
14*12284Stut FILE *fb;
15*12284Stut char *qitem[];
16*12284Stut union ptr {
17*12284Stut 	unsigned *a;
18*12284Stut 	long *b;
19*12284Stut } master;
20*12284Stut {
21*12284Stut 	long k;
22*12284Stut 	union ptr prevdrop;
23*12284Stut 	int nf = 0, best = 0, nterm = 0, i, g, j;
24*12284Stut 	int *prevcoord;
25*12284Stut 	long lp;
26*12284Stut 	extern int lmaster, colevel, reached;
27*12284Stut 	long getl();
28*12284Stut 	unsigned getw();
29*12284Stut 	extern int iflong;
30*12284Stut 
31*12284Stut # if D1
32*12284Stut 	fprintf(stderr, "entering doquery nitem %d\n",nitem);
33*12284Stut 	fprintf(stderr, "first few hashes are %ld %ld %ld %ld %ld\n", hpt[0],hpt[1],hpt[2],hpt[3],hpt[4]);
34*12284Stut 	fprintf(stderr, "and frequencies are  %d %d %d %d %d\n",hfreq[0],hfreq[1],hfreq[2],hfreq[3],hfreq[4]);
35*12284Stut # endif
36*12284Stut 	_assert (lmaster>0);
37*12284Stut 	if (coord==0)
38*12284Stut 		coord = zalloc(lmaster, sizeof(lmaster));
39*12284Stut 	if (colevel>0)
40*12284Stut 	{
41*12284Stut 		prevdrop.a=zalloc(lmaster,iflong?sizeof(long): sizeof(int));
42*12284Stut 		prevcoord = zalloc(lmaster, sizeof(lmaster));
43*12284Stut 	}
44*12284Stut 	else
45*12284Stut 	{
46*12284Stut 		prevdrop.a=master.a;
47*12284Stut 		prevcoord=coord;
48*12284Stut 	}
49*12284Stut # if D1
50*12284Stut 	fprintf(stderr, "nitem %d\n",nitem);
51*12284Stut # endif
52*12284Stut 	for(i=0; i<nitem; i++)
53*12284Stut 	{
54*12284Stut 		hh[i] = hash(qitem[i])%nhash;
55*12284Stut # if D1
56*12284Stut 		fprintf(stderr,"query wd X%sX has hash %d\n", qitem[i], hh[i]);
57*12284Stut # endif
58*12284Stut 	}
59*12284Stut # if D1
60*12284Stut 	fprintf(stderr, "past that loop nhash %d hpt is %lo\n", nhash, hpt);
61*12284Stut # endif
62*12284Stut 	if (prfreqs)
63*12284Stut 		for(i=0; i<nitem; i++)
64*12284Stut 			fprintf(stderr,"item %s hash %d hfreq %d\n",qitem[i], hh[i], hfreq[hh[i]]);
65*12284Stut 	/* if possible, sort query into decreasing frequency of hashes */
66*12284Stut 	if (hfrflg)
67*12284Stut 		shell (nitem, hcomp, hexch);
68*12284Stut # if D1
69*12284Stut 	for(i=0; i<nitem; i++)
70*12284Stut 		fprintf(stderr, "item hash %d frq %d\n", hh[i], hfreq[hh[i]]);
71*12284Stut # endif
72*12284Stut 	lp = hpt [hh[0]];
73*12284Stut # if D1
74*12284Stut 	fprintf(stderr,"first item hash %d lp %ld 0%lo\n", hh[0],lp,lp);
75*12284Stut # endif
76*12284Stut 	_assert (fb!=NULL);
77*12284Stut 	_assert (fseek(fb,lp,0)==NULL);
78*12284Stut 	for(i=0; i<lmaster; i++)
79*12284Stut 	{
80*12284Stut 		if (iflong)
81*12284Stut 			master.b[i] = getl(fb);
82*12284Stut 		else
83*12284Stut 			master.a[i] = getw(fb);
84*12284Stut 		coord[i]=1;
85*12284Stut # if D2
86*12284Stut 		if (iflong)
87*12284Stut 			fprintf(stderr,"master has %ld\n",(master.b[i]));
88*12284Stut 		else
89*12284Stut 			fprintf(stderr,"master has %d\n",(master.a[i]));
90*12284Stut # endif
91*12284Stut 		_assert (i<lmaster);
92*12284Stut 		if (iflong)
93*12284Stut 		{
94*12284Stut 			if (master.b[i] == -1L) break;
95*12284Stut 		}
96*12284Stut 		else
97*12284Stut 		{
98*12284Stut 			if (master.a[i] == -1) break;
99*12284Stut 		}
100*12284Stut 	}
101*12284Stut 	nf= i;
102*12284Stut 	for(nterm=1; nterm<nitem; nterm++)
103*12284Stut 	{
104*12284Stut # ifdef D1
105*12284Stut 		fprintf(stderr, "item %d, hash %d\n", nterm, hh[nterm]);
106*12284Stut # endif
107*12284Stut 		if (colevel>0)
108*12284Stut 		{
109*12284Stut 			for(j=0; j<nf; j++)
110*12284Stut 			{
111*12284Stut 				if (iflong)
112*12284Stut 					prevdrop.b[j] = master.b[j];
113*12284Stut 				else
114*12284Stut 					prevdrop.a[j] = master.a[j];
115*12284Stut 				prevcoord[j] = coord[j];
116*12284Stut 			}
117*12284Stut 		}
118*12284Stut 		lp = hpt[hh[nterm]];
119*12284Stut 		_assert (fseek(fb, lp, 0)==0);
120*12284Stut # if D1
121*12284Stut 		fprintf(stderr,"item %d hash %d seek to %ld\n",nterm,hh[nterm],lp);
122*12284Stut # endif
123*12284Stut 		g=j=0;
124*12284Stut 		while (1)
125*12284Stut 		{
126*12284Stut 			if (iflong)
127*12284Stut 				k = getl(fb);
128*12284Stut 			else
129*12284Stut 				k = getw(fb);
130*12284Stut 			if (k== -1) break;
131*12284Stut # if D2
132*12284Stut 			fprintf(stderr,"next term finds %ld\n",k);
133*12284Stut # endif
134*12284Stut # if D3
135*12284Stut 			if (iflong)
136*12284Stut 				fprintf(stderr, "bfwh j %d nf %d master %ld k %ld\n",j,nf,prevdrop.b[j],(long)(k));
137*12284Stut 			else
138*12284Stut 				fprintf(stderr, "bfwh j %d nf %d master %ld k %ld\n",j,nf,prevdrop.a[j],(long)(k));
139*12284Stut # endif
140*12284Stut 			while (j<nf && (iflong?prevdrop.b[j]:prevdrop.a[j])<k)
141*12284Stut 			{
142*12284Stut # if D3
143*12284Stut 				if (iflong)
144*12284Stut 					fprintf(stderr, "j %d nf %d prevdrop %ld prevcoord %d colevel %d nterm %d k %ld\n",
145*12284Stut 					j,nf,prevdrop.b[j], prevcoord[j], colevel, nterm, (long)(k));
146*12284Stut 				else
147*12284Stut 					fprintf(stderr, "j %d nf %d prevdrop %ld prevcoord %d colevel %d nterm %d k %ld\n",
148*12284Stut 					j,nf,prevdrop.a[j], prevcoord[j], colevel, nterm, (long)(k));
149*12284Stut # endif
150*12284Stut 				if (prevcoord[j] + colevel <= nterm)
151*12284Stut 					j++;
152*12284Stut 				else
153*12284Stut 				{
154*12284Stut 					_assert (g<lmaster);
155*12284Stut 					if (iflong)
156*12284Stut 						master.b[g] = prevdrop.b[j];
157*12284Stut 					else
158*12284Stut 						master.a[g] = prevdrop.a[j];
159*12284Stut 					coord[g++] = prevcoord[j++];
160*12284Stut # if D1
161*12284Stut 					if (iflong)
162*12284Stut 						fprintf(stderr, " not skip g %d doc %d coord %d note %d\n",g,master.b[g-1], coord[g-1],master.b[j-1]);
163*12284Stut 					else
164*12284Stut 						fprintf(stderr, " not skip g %d doc %ld coord %d nterm %d\n",g,master.a[g-1], coord[g-1],nterm);
165*12284Stut # endif
166*12284Stut 					continue;
167*12284Stut 				}
168*12284Stut 			}
169*12284Stut 			if (colevel==0 && j>=nf) break;
170*12284Stut 			if (j<nf && (iflong? prevdrop.b[j]: prevdrop.a[j]) == k)
171*12284Stut 			{
172*12284Stut 				if (iflong)
173*12284Stut 					master.b[g]=k;
174*12284Stut 				else
175*12284Stut 					master.a[g]=k;
176*12284Stut 				coord[g++] = prevcoord[j++]+1;
177*12284Stut # if D1
178*12284Stut 				if (iflong)
179*12284Stut 					fprintf(stderr, " at g %d item %ld coord %d note %ld\n",g,master.b[g-1],coord[g-1],master.b[j-1]);
180*12284Stut 				else
181*12284Stut 					fprintf(stderr, " at g %d item %d coord %d note %d\n",g,master.a[g-1],coord[g-1],master.a[j-1]);
182*12284Stut # endif
183*12284Stut 			}
184*12284Stut 			else
185*12284Stut 				if (colevel >= nterm)
186*12284Stut 				{
187*12284Stut 					if (iflong)
188*12284Stut 						master.b[g]=k;
189*12284Stut 					else
190*12284Stut 						master.a[g]=k;
191*12284Stut 					coord[g++] = 1;
192*12284Stut 				}
193*12284Stut 		}
194*12284Stut # if D1
195*12284Stut 		fprintf(stderr,"now have %d items\n",g);
196*12284Stut # endif
197*12284Stut 		if (colevel>0)
198*12284Stut 			for ( ; j<nf; j++)
199*12284Stut 				if ((iflong?prevcoord.b[j]:prevcoord.a[j])+colevel > nterm)
200*12284Stut 				{
201*12284Stut 					_assert(g<lmaster);
202*12284Stut 					if (iflong)
203*12284Stut 						master.b[g] = prevdrop.b[j];
204*12284Stut 					else
205*12284Stut 						master.a[g] = prevdrop.a[j];
206*12284Stut 					coord[g++] = prevcoord[j];
207*12284Stut # if D3
208*12284Stut 					if(iflong)
209*12284Stut 						fprintf(stderr, "copied over %ld coord %d\n",master.b[g-1], coord[g-1]);
210*12284Stut 					else
211*12284Stut 						fprintf(stderr, "copied over %d coord %d\n",master.a[g-1], coord[g-1]);
212*12284Stut # endif
213*12284Stut 				}
214*12284Stut 		nf = g;
215*12284Stut 	}
216*12284Stut 	if (colevel>0)
217*12284Stut 	{
218*12284Stut 		best=0;
219*12284Stut 		for(j=0; j<nf; j++)
220*12284Stut 			if (coord[j]>best) best = coord[j];
221*12284Stut # if D1
222*12284Stut 		fprintf(stderr, "colevel %d best %d\n", colevel, best);
223*12284Stut # endif
224*12284Stut 		reached = best;
225*12284Stut 		for(g=j=0; j<nf; j++)
226*12284Stut 			if (coord[j]==best)
227*12284Stut 			{
228*12284Stut 				if (iflong)
229*12284Stut 					master.b[g++] = master.b[j];
230*12284Stut 				else
231*12284Stut 					master.a[g++] = master.a[j];
232*12284Stut 			}
233*12284Stut 		nf=g;
234*12284Stut # if D1
235*12284Stut 		fprintf(stderr, "yet got %d\n",nf);
236*12284Stut # endif
237*12284Stut 	}
238*12284Stut # ifdef D1
239*12284Stut 	fprintf(stderr, " returning with %d\n",nf);
240*12284Stut # endif
241*12284Stut 	if (colevel)
242*12284Stut 	{
243*12284Stut 		free(prevdrop, lmaster, iflong?sizeof(long): sizeof(int));
244*12284Stut 		free(prevcoord, lmaster, sizeof (lmaster));
245*12284Stut 	}
246*12284Stut # if D3
247*12284Stut 	for(g=0;g<nf;g++)
248*12284Stut 		if(iflong)
249*12284Stut 			fprintf(stderr,":%ld\n",master.b[g]);
250*12284Stut 		else
251*12284Stut 			fprintf(stderr,":%d\n",master.a[g]);
252*12284Stut # endif
253*12284Stut 	return(nf);
254*12284Stut }
255*12284Stut 
256*12284Stut long
257*12284Stut getl(fb)
258*12284Stut FILE *fb;
259*12284Stut {
260*12284Stut 	return(getw(fb));
261*12284Stut }
262*12284Stut 
263*12284Stut putl(ll, f)
264*12284Stut long ll;
265*12284Stut FILE *f;
266*12284Stut {
267*12284Stut 	putw(ll, f);
268*12284Stut }
269*12284Stut 
270*12284Stut hcomp( n1, n2)
271*12284Stut {
272*12284Stut 	return (hfreq[hh[n1]]<=hfreq[hh[n2]]);
273*12284Stut }
274*12284Stut 
275*12284Stut hexch( n1, n2 )
276*12284Stut {
277*12284Stut 	int t;
278*12284Stut 	t = hh[n1];
279*12284Stut 	hh[n1] = hh[n2];
280*12284Stut 	hh[n2] = t;
281*12284Stut }
282