xref: /csrg-svn/old/refer/hunt/hunt2.c (revision 32269)
112284Stut #ifndef lint
2*32269Sbostic static char *sccsid = "@(#)hunt2.c	4.5 (Berkeley) 09/28/87";
312284Stut #endif
412284Stut 
512284Stut #include "refer..c"
612284Stut 
712284Stut static int *coord = 0;
812284Stut int hh[50];
912284Stut extern int *hfreq, hfrflg, hcomp(), hexch();
1012284Stut extern int prfreqs;
1112284Stut 
1212284Stut doquery(hpt, nhash, fb, nitem, qitem, master)
1312284Stut long *hpt;
1412284Stut FILE *fb;
1512284Stut char *qitem[];
16*32269Sbostic unsigned *master;
1712284Stut {
18*32269Sbostic 	union ptr {
19*32269Sbostic 		unsigned *a;
20*32269Sbostic 		long *b;
21*32269Sbostic 	} umaster;
2212284Stut 	long k;
2312284Stut 	union ptr prevdrop;
2412284Stut 	int nf = 0, best = 0, nterm = 0, i, g, j;
2512284Stut 	int *prevcoord;
2612284Stut 	long lp;
2712284Stut 	extern int lmaster, colevel, reached;
2812284Stut 	long getl();
2912284Stut 	extern int iflong;
3012284Stut 
3112284Stut # if D1
3212284Stut 	fprintf(stderr, "entering doquery nitem %d\n",nitem);
3312284Stut 	fprintf(stderr, "first few hashes are %ld %ld %ld %ld %ld\n", hpt[0],hpt[1],hpt[2],hpt[3],hpt[4]);
3412284Stut 	fprintf(stderr, "and frequencies are  %d %d %d %d %d\n",hfreq[0],hfreq[1],hfreq[2],hfreq[3],hfreq[4]);
3512284Stut # endif
36*32269Sbostic 	if (iflong)
37*32269Sbostic 		umaster.b = (long *) master;
38*32269Sbostic 	else
39*32269Sbostic 		umaster.a = master;
4012284Stut 	_assert (lmaster>0);
4112284Stut 	if (coord==0)
4217679Sralph 		coord = (int *) zalloc(lmaster, sizeof(lmaster));
4312284Stut 	if (colevel>0)
4412284Stut 	{
4517679Sralph 		if (iflong)
4617679Sralph 			prevdrop.b = (long *) zalloc(lmaster, sizeof(long));
4717679Sralph 		else
4817679Sralph 			prevdrop.a = (unsigned *) zalloc(lmaster, sizeof(int));
4917679Sralph 		prevcoord = (int *) zalloc(lmaster, sizeof(lmaster));
5012284Stut 	}
5112284Stut 	else
5212284Stut 	{
53*32269Sbostic 		prevdrop.a=umaster.a;
5412284Stut 		prevcoord=coord;
5512284Stut 	}
5612284Stut # if D1
5712284Stut 	fprintf(stderr, "nitem %d\n",nitem);
5812284Stut # endif
5912284Stut 	for(i=0; i<nitem; i++)
6012284Stut 	{
6112284Stut 		hh[i] = hash(qitem[i])%nhash;
6212284Stut # if D1
6312284Stut 		fprintf(stderr,"query wd X%sX has hash %d\n", qitem[i], hh[i]);
6412284Stut # endif
6512284Stut 	}
6612284Stut # if D1
6712284Stut 	fprintf(stderr, "past that loop nhash %d hpt is %lo\n", nhash, hpt);
6812284Stut # endif
6912284Stut 	if (prfreqs)
7012284Stut 		for(i=0; i<nitem; i++)
7112284Stut 			fprintf(stderr,"item %s hash %d hfreq %d\n",qitem[i], hh[i], hfreq[hh[i]]);
7212284Stut 	/* if possible, sort query into decreasing frequency of hashes */
7312284Stut 	if (hfrflg)
7412284Stut 		shell (nitem, hcomp, hexch);
7512284Stut # if D1
7612284Stut 	for(i=0; i<nitem; i++)
7712284Stut 		fprintf(stderr, "item hash %d frq %d\n", hh[i], hfreq[hh[i]]);
7812284Stut # endif
7912284Stut 	lp = hpt [hh[0]];
8012284Stut # if D1
8112284Stut 	fprintf(stderr,"first item hash %d lp %ld 0%lo\n", hh[0],lp,lp);
8212284Stut # endif
8312284Stut 	_assert (fb!=NULL);
8424070Sbloom 	_assert (fseek(fb, lp, 0) != -1);
8512284Stut 	for(i=0; i<lmaster; i++)
8612284Stut 	{
8712284Stut 		if (iflong)
88*32269Sbostic 			umaster.b[i] = getl(fb);
8912284Stut 		else
90*32269Sbostic 			umaster.a[i] = getw(fb);
9112284Stut 		coord[i]=1;
9212284Stut # if D2
9312284Stut 		if (iflong)
94*32269Sbostic 			fprintf(stderr,"umaster has %ld\n",(umaster.b[i]));
9512284Stut 		else
96*32269Sbostic 			fprintf(stderr,"umaster has %d\n",(umaster.a[i]));
9712284Stut # endif
9812284Stut 		_assert (i<lmaster);
9912284Stut 		if (iflong)
10012284Stut 		{
101*32269Sbostic 			if (umaster.b[i] == -1L) break;
10212284Stut 		}
10312284Stut 		else
10412284Stut 		{
105*32269Sbostic 			if (umaster.a[i] == -1) break;
10612284Stut 		}
10712284Stut 	}
10812284Stut 	nf= i;
10912284Stut 	for(nterm=1; nterm<nitem; nterm++)
11012284Stut 	{
11112284Stut # ifdef D1
11212284Stut 		fprintf(stderr, "item %d, hash %d\n", nterm, hh[nterm]);
11312284Stut # endif
11412284Stut 		if (colevel>0)
11512284Stut 		{
11612284Stut 			for(j=0; j<nf; j++)
11712284Stut 			{
11812284Stut 				if (iflong)
119*32269Sbostic 					prevdrop.b[j] = umaster.b[j];
12012284Stut 				else
121*32269Sbostic 					prevdrop.a[j] = umaster.a[j];
12212284Stut 				prevcoord[j] = coord[j];
12312284Stut 			}
12412284Stut 		}
12512284Stut 		lp = hpt[hh[nterm]];
12624070Sbloom 		_assert (fseek(fb, lp, 0) != -1);
12712284Stut # if D1
12812284Stut 		fprintf(stderr,"item %d hash %d seek to %ld\n",nterm,hh[nterm],lp);
12912284Stut # endif
13012284Stut 		g=j=0;
13112284Stut 		while (1)
13212284Stut 		{
13312284Stut 			if (iflong)
13412284Stut 				k = getl(fb);
13512284Stut 			else
13612284Stut 				k = getw(fb);
13712284Stut 			if (k== -1) break;
13812284Stut # if D2
13912284Stut 			fprintf(stderr,"next term finds %ld\n",k);
14012284Stut # endif
14112284Stut # if D3
14212284Stut 			if (iflong)
14312284Stut 				fprintf(stderr, "bfwh j %d nf %d master %ld k %ld\n",j,nf,prevdrop.b[j],(long)(k));
14412284Stut 			else
14512284Stut 				fprintf(stderr, "bfwh j %d nf %d master %ld k %ld\n",j,nf,prevdrop.a[j],(long)(k));
14612284Stut # endif
14712284Stut 			while (j<nf && (iflong?prevdrop.b[j]:prevdrop.a[j])<k)
14812284Stut 			{
14912284Stut # if D3
15012284Stut 				if (iflong)
15112284Stut 					fprintf(stderr, "j %d nf %d prevdrop %ld prevcoord %d colevel %d nterm %d k %ld\n",
15212284Stut 					j,nf,prevdrop.b[j], prevcoord[j], colevel, nterm, (long)(k));
15312284Stut 				else
15412284Stut 					fprintf(stderr, "j %d nf %d prevdrop %ld prevcoord %d colevel %d nterm %d k %ld\n",
15512284Stut 					j,nf,prevdrop.a[j], prevcoord[j], colevel, nterm, (long)(k));
15612284Stut # endif
15712284Stut 				if (prevcoord[j] + colevel <= nterm)
15812284Stut 					j++;
15912284Stut 				else
16012284Stut 				{
16112284Stut 					_assert (g<lmaster);
16212284Stut 					if (iflong)
163*32269Sbostic 						umaster.b[g] = prevdrop.b[j];
16412284Stut 					else
165*32269Sbostic 						umaster.a[g] = prevdrop.a[j];
16612284Stut 					coord[g++] = prevcoord[j++];
16712284Stut # if D1
16812284Stut 					if (iflong)
169*32269Sbostic 						fprintf(stderr, " not skip g %d doc %d coord %d note %d\n",g,umaster.b[g-1], coord[g-1],umaster.b[j-1]);
17012284Stut 					else
171*32269Sbostic 						fprintf(stderr, " not skip g %d doc %ld coord %d nterm %d\n",g,umaster.a[g-1], coord[g-1],nterm);
17212284Stut # endif
17312284Stut 					continue;
17412284Stut 				}
17512284Stut 			}
17612284Stut 			if (colevel==0 && j>=nf) break;
17712284Stut 			if (j<nf && (iflong? prevdrop.b[j]: prevdrop.a[j]) == k)
17812284Stut 			{
17912284Stut 				if (iflong)
180*32269Sbostic 					umaster.b[g]=k;
18112284Stut 				else
182*32269Sbostic 					umaster.a[g]=k;
18312284Stut 				coord[g++] = prevcoord[j++]+1;
18412284Stut # if D1
18512284Stut 				if (iflong)
186*32269Sbostic 					fprintf(stderr, " at g %d item %ld coord %d note %ld\n",g,umaster.b[g-1],coord[g-1],umaster.b[j-1]);
18712284Stut 				else
188*32269Sbostic 					fprintf(stderr, " at g %d item %d coord %d note %d\n",g,umaster.a[g-1],coord[g-1],umaster.a[j-1]);
18912284Stut # endif
19012284Stut 			}
19112284Stut 			else
19212284Stut 				if (colevel >= nterm)
19312284Stut 				{
19412284Stut 					if (iflong)
195*32269Sbostic 						umaster.b[g]=k;
19612284Stut 					else
197*32269Sbostic 						umaster.a[g]=k;
19812284Stut 					coord[g++] = 1;
19912284Stut 				}
20012284Stut 		}
20112284Stut # if D1
20212284Stut 		fprintf(stderr,"now have %d items\n",g);
20312284Stut # endif
20412284Stut 		if (colevel>0)
20512284Stut 			for ( ; j<nf; j++)
20617679Sralph 				if (prevcoord[j]+colevel > nterm)
20712284Stut 				{
20812284Stut 					_assert(g<lmaster);
20912284Stut 					if (iflong)
210*32269Sbostic 						umaster.b[g] = prevdrop.b[j];
21112284Stut 					else
212*32269Sbostic 						umaster.a[g] = prevdrop.a[j];
21312284Stut 					coord[g++] = prevcoord[j];
21412284Stut # if D3
21512284Stut 					if(iflong)
216*32269Sbostic 						fprintf(stderr, "copied over %ld coord %d\n",umaster.b[g-1], coord[g-1]);
21712284Stut 					else
218*32269Sbostic 						fprintf(stderr, "copied over %d coord %d\n",umaster.a[g-1], coord[g-1]);
21912284Stut # endif
22012284Stut 				}
22112284Stut 		nf = g;
22212284Stut 	}
22312284Stut 	if (colevel>0)
22412284Stut 	{
22512284Stut 		best=0;
22612284Stut 		for(j=0; j<nf; j++)
22712284Stut 			if (coord[j]>best) best = coord[j];
22812284Stut # if D1
22912284Stut 		fprintf(stderr, "colevel %d best %d\n", colevel, best);
23012284Stut # endif
23112284Stut 		reached = best;
23212284Stut 		for(g=j=0; j<nf; j++)
23312284Stut 			if (coord[j]==best)
23412284Stut 			{
23512284Stut 				if (iflong)
236*32269Sbostic 					umaster.b[g++] = umaster.b[j];
23712284Stut 				else
238*32269Sbostic 					umaster.a[g++] = umaster.a[j];
23912284Stut 			}
24012284Stut 		nf=g;
24112284Stut # if D1
24212284Stut 		fprintf(stderr, "yet got %d\n",nf);
24312284Stut # endif
24412284Stut 	}
24512284Stut # ifdef D1
24612284Stut 	fprintf(stderr, " returning with %d\n",nf);
24712284Stut # endif
24812284Stut 	if (colevel)
24912284Stut 	{
25012284Stut 		free(prevdrop, lmaster, iflong?sizeof(long): sizeof(int));
25112284Stut 		free(prevcoord, lmaster, sizeof (lmaster));
25212284Stut 	}
25312284Stut # if D3
25412284Stut 	for(g=0;g<nf;g++)
25512284Stut 		if(iflong)
256*32269Sbostic 			fprintf(stderr,":%ld\n",umaster.b[g]);
25712284Stut 		else
258*32269Sbostic 			fprintf(stderr,":%d\n",umaster.a[g]);
25912284Stut # endif
26012284Stut 	return(nf);
26112284Stut }
26212284Stut 
26312284Stut long
26412284Stut getl(fb)
26512284Stut FILE *fb;
26612284Stut {
26712284Stut 	return(getw(fb));
26812284Stut }
26912284Stut 
27012284Stut putl(ll, f)
27112284Stut long ll;
27212284Stut FILE *f;
27312284Stut {
27412284Stut 	putw(ll, f);
27512284Stut }
27612284Stut 
27712284Stut hcomp( n1, n2)
27812284Stut {
27912284Stut 	return (hfreq[hh[n1]]<=hfreq[hh[n2]]);
28012284Stut }
28112284Stut 
28212284Stut hexch( n1, n2 )
28312284Stut {
28412284Stut 	int t;
28512284Stut 	t = hh[n1];
28612284Stut 	hh[n1] = hh[n2];
28712284Stut 	hh[n2] = t;
28812284Stut }
289