xref: /csrg-svn/old/refer/hunt/hunt2.c (revision 48296)
1*48296Sbostic /*-
2*48296Sbostic  * %sccs.include.proprietary.c%
3*48296Sbostic  */
4*48296Sbostic 
512284Stut #ifndef lint
6*48296Sbostic static char sccsid[] = "@(#)hunt2.c	4.6 (Berkeley) 04/18/91";
7*48296Sbostic #endif /* not lint */
812284Stut 
912284Stut #include "refer..c"
1012284Stut 
1112284Stut static int *coord = 0;
1212284Stut int hh[50];
1312284Stut extern int *hfreq, hfrflg, hcomp(), hexch();
1412284Stut extern int prfreqs;
1512284Stut 
doquery(hpt,nhash,fb,nitem,qitem,master)1612284Stut doquery(hpt, nhash, fb, nitem, qitem, master)
1712284Stut long *hpt;
1812284Stut FILE *fb;
1912284Stut char *qitem[];
2032269Sbostic unsigned *master;
2112284Stut {
2232269Sbostic 	union ptr {
2332269Sbostic 		unsigned *a;
2432269Sbostic 		long *b;
2532269Sbostic 	} umaster;
2612284Stut 	long k;
2712284Stut 	union ptr prevdrop;
2812284Stut 	int nf = 0, best = 0, nterm = 0, i, g, j;
2912284Stut 	int *prevcoord;
3012284Stut 	long lp;
3112284Stut 	extern int lmaster, colevel, reached;
3212284Stut 	long getl();
3312284Stut 	extern int iflong;
3412284Stut 
3512284Stut # if D1
3612284Stut 	fprintf(stderr, "entering doquery nitem %d\n",nitem);
3712284Stut 	fprintf(stderr, "first few hashes are %ld %ld %ld %ld %ld\n", hpt[0],hpt[1],hpt[2],hpt[3],hpt[4]);
3812284Stut 	fprintf(stderr, "and frequencies are  %d %d %d %d %d\n",hfreq[0],hfreq[1],hfreq[2],hfreq[3],hfreq[4]);
3912284Stut # endif
4032269Sbostic 	if (iflong)
4132269Sbostic 		umaster.b = (long *) master;
4232269Sbostic 	else
4332269Sbostic 		umaster.a = master;
4412284Stut 	_assert (lmaster>0);
4512284Stut 	if (coord==0)
4617679Sralph 		coord = (int *) zalloc(lmaster, sizeof(lmaster));
4712284Stut 	if (colevel>0)
4812284Stut 	{
4917679Sralph 		if (iflong)
5017679Sralph 			prevdrop.b = (long *) zalloc(lmaster, sizeof(long));
5117679Sralph 		else
5217679Sralph 			prevdrop.a = (unsigned *) zalloc(lmaster, sizeof(int));
5317679Sralph 		prevcoord = (int *) zalloc(lmaster, sizeof(lmaster));
5412284Stut 	}
5512284Stut 	else
5612284Stut 	{
5732269Sbostic 		prevdrop.a=umaster.a;
5812284Stut 		prevcoord=coord;
5912284Stut 	}
6012284Stut # if D1
6112284Stut 	fprintf(stderr, "nitem %d\n",nitem);
6212284Stut # endif
6312284Stut 	for(i=0; i<nitem; i++)
6412284Stut 	{
6512284Stut 		hh[i] = hash(qitem[i])%nhash;
6612284Stut # if D1
6712284Stut 		fprintf(stderr,"query wd X%sX has hash %d\n", qitem[i], hh[i]);
6812284Stut # endif
6912284Stut 	}
7012284Stut # if D1
7112284Stut 	fprintf(stderr, "past that loop nhash %d hpt is %lo\n", nhash, hpt);
7212284Stut # endif
7312284Stut 	if (prfreqs)
7412284Stut 		for(i=0; i<nitem; i++)
7512284Stut 			fprintf(stderr,"item %s hash %d hfreq %d\n",qitem[i], hh[i], hfreq[hh[i]]);
7612284Stut 	/* if possible, sort query into decreasing frequency of hashes */
7712284Stut 	if (hfrflg)
7812284Stut 		shell (nitem, hcomp, hexch);
7912284Stut # if D1
8012284Stut 	for(i=0; i<nitem; i++)
8112284Stut 		fprintf(stderr, "item hash %d frq %d\n", hh[i], hfreq[hh[i]]);
8212284Stut # endif
8312284Stut 	lp = hpt [hh[0]];
8412284Stut # if D1
8512284Stut 	fprintf(stderr,"first item hash %d lp %ld 0%lo\n", hh[0],lp,lp);
8612284Stut # endif
8712284Stut 	_assert (fb!=NULL);
8824070Sbloom 	_assert (fseek(fb, lp, 0) != -1);
8912284Stut 	for(i=0; i<lmaster; i++)
9012284Stut 	{
9112284Stut 		if (iflong)
9232269Sbostic 			umaster.b[i] = getl(fb);
9312284Stut 		else
9432269Sbostic 			umaster.a[i] = getw(fb);
9512284Stut 		coord[i]=1;
9612284Stut # if D2
9712284Stut 		if (iflong)
9832269Sbostic 			fprintf(stderr,"umaster has %ld\n",(umaster.b[i]));
9912284Stut 		else
10032269Sbostic 			fprintf(stderr,"umaster has %d\n",(umaster.a[i]));
10112284Stut # endif
10212284Stut 		_assert (i<lmaster);
10312284Stut 		if (iflong)
10412284Stut 		{
10532269Sbostic 			if (umaster.b[i] == -1L) break;
10612284Stut 		}
10712284Stut 		else
10812284Stut 		{
10932269Sbostic 			if (umaster.a[i] == -1) break;
11012284Stut 		}
11112284Stut 	}
11212284Stut 	nf= i;
11312284Stut 	for(nterm=1; nterm<nitem; nterm++)
11412284Stut 	{
11512284Stut # ifdef D1
11612284Stut 		fprintf(stderr, "item %d, hash %d\n", nterm, hh[nterm]);
11712284Stut # endif
11812284Stut 		if (colevel>0)
11912284Stut 		{
12012284Stut 			for(j=0; j<nf; j++)
12112284Stut 			{
12212284Stut 				if (iflong)
12332269Sbostic 					prevdrop.b[j] = umaster.b[j];
12412284Stut 				else
12532269Sbostic 					prevdrop.a[j] = umaster.a[j];
12612284Stut 				prevcoord[j] = coord[j];
12712284Stut 			}
12812284Stut 		}
12912284Stut 		lp = hpt[hh[nterm]];
13024070Sbloom 		_assert (fseek(fb, lp, 0) != -1);
13112284Stut # if D1
13212284Stut 		fprintf(stderr,"item %d hash %d seek to %ld\n",nterm,hh[nterm],lp);
13312284Stut # endif
13412284Stut 		g=j=0;
13512284Stut 		while (1)
13612284Stut 		{
13712284Stut 			if (iflong)
13812284Stut 				k = getl(fb);
13912284Stut 			else
14012284Stut 				k = getw(fb);
14112284Stut 			if (k== -1) break;
14212284Stut # if D2
14312284Stut 			fprintf(stderr,"next term finds %ld\n",k);
14412284Stut # endif
14512284Stut # if D3
14612284Stut 			if (iflong)
14712284Stut 				fprintf(stderr, "bfwh j %d nf %d master %ld k %ld\n",j,nf,prevdrop.b[j],(long)(k));
14812284Stut 			else
14912284Stut 				fprintf(stderr, "bfwh j %d nf %d master %ld k %ld\n",j,nf,prevdrop.a[j],(long)(k));
15012284Stut # endif
15112284Stut 			while (j<nf && (iflong?prevdrop.b[j]:prevdrop.a[j])<k)
15212284Stut 			{
15312284Stut # if D3
15412284Stut 				if (iflong)
15512284Stut 					fprintf(stderr, "j %d nf %d prevdrop %ld prevcoord %d colevel %d nterm %d k %ld\n",
15612284Stut 					j,nf,prevdrop.b[j], prevcoord[j], colevel, nterm, (long)(k));
15712284Stut 				else
15812284Stut 					fprintf(stderr, "j %d nf %d prevdrop %ld prevcoord %d colevel %d nterm %d k %ld\n",
15912284Stut 					j,nf,prevdrop.a[j], prevcoord[j], colevel, nterm, (long)(k));
16012284Stut # endif
16112284Stut 				if (prevcoord[j] + colevel <= nterm)
16212284Stut 					j++;
16312284Stut 				else
16412284Stut 				{
16512284Stut 					_assert (g<lmaster);
16612284Stut 					if (iflong)
16732269Sbostic 						umaster.b[g] = prevdrop.b[j];
16812284Stut 					else
16932269Sbostic 						umaster.a[g] = prevdrop.a[j];
17012284Stut 					coord[g++] = prevcoord[j++];
17112284Stut # if D1
17212284Stut 					if (iflong)
17332269Sbostic 						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]);
17412284Stut 					else
17532269Sbostic 						fprintf(stderr, " not skip g %d doc %ld coord %d nterm %d\n",g,umaster.a[g-1], coord[g-1],nterm);
17612284Stut # endif
17712284Stut 					continue;
17812284Stut 				}
17912284Stut 			}
18012284Stut 			if (colevel==0 && j>=nf) break;
18112284Stut 			if (j<nf && (iflong? prevdrop.b[j]: prevdrop.a[j]) == k)
18212284Stut 			{
18312284Stut 				if (iflong)
18432269Sbostic 					umaster.b[g]=k;
18512284Stut 				else
18632269Sbostic 					umaster.a[g]=k;
18712284Stut 				coord[g++] = prevcoord[j++]+1;
18812284Stut # if D1
18912284Stut 				if (iflong)
19032269Sbostic 					fprintf(stderr, " at g %d item %ld coord %d note %ld\n",g,umaster.b[g-1],coord[g-1],umaster.b[j-1]);
19112284Stut 				else
19232269Sbostic 					fprintf(stderr, " at g %d item %d coord %d note %d\n",g,umaster.a[g-1],coord[g-1],umaster.a[j-1]);
19312284Stut # endif
19412284Stut 			}
19512284Stut 			else
19612284Stut 				if (colevel >= nterm)
19712284Stut 				{
19812284Stut 					if (iflong)
19932269Sbostic 						umaster.b[g]=k;
20012284Stut 					else
20132269Sbostic 						umaster.a[g]=k;
20212284Stut 					coord[g++] = 1;
20312284Stut 				}
20412284Stut 		}
20512284Stut # if D1
20612284Stut 		fprintf(stderr,"now have %d items\n",g);
20712284Stut # endif
20812284Stut 		if (colevel>0)
20912284Stut 			for ( ; j<nf; j++)
21017679Sralph 				if (prevcoord[j]+colevel > nterm)
21112284Stut 				{
21212284Stut 					_assert(g<lmaster);
21312284Stut 					if (iflong)
21432269Sbostic 						umaster.b[g] = prevdrop.b[j];
21512284Stut 					else
21632269Sbostic 						umaster.a[g] = prevdrop.a[j];
21712284Stut 					coord[g++] = prevcoord[j];
21812284Stut # if D3
21912284Stut 					if(iflong)
22032269Sbostic 						fprintf(stderr, "copied over %ld coord %d\n",umaster.b[g-1], coord[g-1]);
22112284Stut 					else
22232269Sbostic 						fprintf(stderr, "copied over %d coord %d\n",umaster.a[g-1], coord[g-1]);
22312284Stut # endif
22412284Stut 				}
22512284Stut 		nf = g;
22612284Stut 	}
22712284Stut 	if (colevel>0)
22812284Stut 	{
22912284Stut 		best=0;
23012284Stut 		for(j=0; j<nf; j++)
23112284Stut 			if (coord[j]>best) best = coord[j];
23212284Stut # if D1
23312284Stut 		fprintf(stderr, "colevel %d best %d\n", colevel, best);
23412284Stut # endif
23512284Stut 		reached = best;
23612284Stut 		for(g=j=0; j<nf; j++)
23712284Stut 			if (coord[j]==best)
23812284Stut 			{
23912284Stut 				if (iflong)
24032269Sbostic 					umaster.b[g++] = umaster.b[j];
24112284Stut 				else
24232269Sbostic 					umaster.a[g++] = umaster.a[j];
24312284Stut 			}
24412284Stut 		nf=g;
24512284Stut # if D1
24612284Stut 		fprintf(stderr, "yet got %d\n",nf);
24712284Stut # endif
24812284Stut 	}
24912284Stut # ifdef D1
25012284Stut 	fprintf(stderr, " returning with %d\n",nf);
25112284Stut # endif
25212284Stut 	if (colevel)
25312284Stut 	{
25412284Stut 		free(prevdrop, lmaster, iflong?sizeof(long): sizeof(int));
25512284Stut 		free(prevcoord, lmaster, sizeof (lmaster));
25612284Stut 	}
25712284Stut # if D3
25812284Stut 	for(g=0;g<nf;g++)
25912284Stut 		if(iflong)
26032269Sbostic 			fprintf(stderr,":%ld\n",umaster.b[g]);
26112284Stut 		else
26232269Sbostic 			fprintf(stderr,":%d\n",umaster.a[g]);
26312284Stut # endif
26412284Stut 	return(nf);
26512284Stut }
26612284Stut 
26712284Stut long
getl(fb)26812284Stut getl(fb)
26912284Stut FILE *fb;
27012284Stut {
27112284Stut 	return(getw(fb));
27212284Stut }
27312284Stut 
putl(ll,f)27412284Stut putl(ll, f)
27512284Stut long ll;
27612284Stut FILE *f;
27712284Stut {
27812284Stut 	putw(ll, f);
27912284Stut }
28012284Stut 
hcomp(n1,n2)28112284Stut hcomp( n1, n2)
28212284Stut {
28312284Stut 	return (hfreq[hh[n1]]<=hfreq[hh[n2]]);
28412284Stut }
28512284Stut 
hexch(n1,n2)28612284Stut hexch( n1, n2 )
28712284Stut {
28812284Stut 	int t;
28912284Stut 	t = hh[n1];
29012284Stut 	hh[n1] = hh[n2];
29112284Stut 	hh[n2] = t;
29212284Stut }
293