xref: /csrg-svn/old/refer/hunt/hunt2.c (revision 17679)
112284Stut #ifndef lint
2*17679Sralph static char *sccsid = "@(#)hunt2.c	4.2 (Berkeley) 01/09/85";
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[];
1612284Stut union ptr {
1712284Stut 	unsigned *a;
1812284Stut 	long *b;
1912284Stut } master;
2012284Stut {
2112284Stut 	long k;
2212284Stut 	union ptr prevdrop;
2312284Stut 	int nf = 0, best = 0, nterm = 0, i, g, j;
2412284Stut 	int *prevcoord;
2512284Stut 	long lp;
2612284Stut 	extern int lmaster, colevel, reached;
2712284Stut 	long getl();
2812284Stut 	unsigned getw();
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
3612284Stut 	_assert (lmaster>0);
3712284Stut 	if (coord==0)
38*17679Sralph 		coord = (int *) zalloc(lmaster, sizeof(lmaster));
3912284Stut 	if (colevel>0)
4012284Stut 	{
41*17679Sralph 		if (iflong)
42*17679Sralph 			prevdrop.b = (long *) zalloc(lmaster, sizeof(long));
43*17679Sralph 		else
44*17679Sralph 			prevdrop.a = (unsigned *) zalloc(lmaster, sizeof(int));
45*17679Sralph 		prevcoord = (int *) zalloc(lmaster, sizeof(lmaster));
4612284Stut 	}
4712284Stut 	else
4812284Stut 	{
4912284Stut 		prevdrop.a=master.a;
5012284Stut 		prevcoord=coord;
5112284Stut 	}
5212284Stut # if D1
5312284Stut 	fprintf(stderr, "nitem %d\n",nitem);
5412284Stut # endif
5512284Stut 	for(i=0; i<nitem; i++)
5612284Stut 	{
5712284Stut 		hh[i] = hash(qitem[i])%nhash;
5812284Stut # if D1
5912284Stut 		fprintf(stderr,"query wd X%sX has hash %d\n", qitem[i], hh[i]);
6012284Stut # endif
6112284Stut 	}
6212284Stut # if D1
6312284Stut 	fprintf(stderr, "past that loop nhash %d hpt is %lo\n", nhash, hpt);
6412284Stut # endif
6512284Stut 	if (prfreqs)
6612284Stut 		for(i=0; i<nitem; i++)
6712284Stut 			fprintf(stderr,"item %s hash %d hfreq %d\n",qitem[i], hh[i], hfreq[hh[i]]);
6812284Stut 	/* if possible, sort query into decreasing frequency of hashes */
6912284Stut 	if (hfrflg)
7012284Stut 		shell (nitem, hcomp, hexch);
7112284Stut # if D1
7212284Stut 	for(i=0; i<nitem; i++)
7312284Stut 		fprintf(stderr, "item hash %d frq %d\n", hh[i], hfreq[hh[i]]);
7412284Stut # endif
7512284Stut 	lp = hpt [hh[0]];
7612284Stut # if D1
7712284Stut 	fprintf(stderr,"first item hash %d lp %ld 0%lo\n", hh[0],lp,lp);
7812284Stut # endif
7912284Stut 	_assert (fb!=NULL);
8012284Stut 	_assert (fseek(fb,lp,0)==NULL);
8112284Stut 	for(i=0; i<lmaster; i++)
8212284Stut 	{
8312284Stut 		if (iflong)
8412284Stut 			master.b[i] = getl(fb);
8512284Stut 		else
8612284Stut 			master.a[i] = getw(fb);
8712284Stut 		coord[i]=1;
8812284Stut # if D2
8912284Stut 		if (iflong)
9012284Stut 			fprintf(stderr,"master has %ld\n",(master.b[i]));
9112284Stut 		else
9212284Stut 			fprintf(stderr,"master has %d\n",(master.a[i]));
9312284Stut # endif
9412284Stut 		_assert (i<lmaster);
9512284Stut 		if (iflong)
9612284Stut 		{
9712284Stut 			if (master.b[i] == -1L) break;
9812284Stut 		}
9912284Stut 		else
10012284Stut 		{
10112284Stut 			if (master.a[i] == -1) break;
10212284Stut 		}
10312284Stut 	}
10412284Stut 	nf= i;
10512284Stut 	for(nterm=1; nterm<nitem; nterm++)
10612284Stut 	{
10712284Stut # ifdef D1
10812284Stut 		fprintf(stderr, "item %d, hash %d\n", nterm, hh[nterm]);
10912284Stut # endif
11012284Stut 		if (colevel>0)
11112284Stut 		{
11212284Stut 			for(j=0; j<nf; j++)
11312284Stut 			{
11412284Stut 				if (iflong)
11512284Stut 					prevdrop.b[j] = master.b[j];
11612284Stut 				else
11712284Stut 					prevdrop.a[j] = master.a[j];
11812284Stut 				prevcoord[j] = coord[j];
11912284Stut 			}
12012284Stut 		}
12112284Stut 		lp = hpt[hh[nterm]];
12212284Stut 		_assert (fseek(fb, lp, 0)==0);
12312284Stut # if D1
12412284Stut 		fprintf(stderr,"item %d hash %d seek to %ld\n",nterm,hh[nterm],lp);
12512284Stut # endif
12612284Stut 		g=j=0;
12712284Stut 		while (1)
12812284Stut 		{
12912284Stut 			if (iflong)
13012284Stut 				k = getl(fb);
13112284Stut 			else
13212284Stut 				k = getw(fb);
13312284Stut 			if (k== -1) break;
13412284Stut # if D2
13512284Stut 			fprintf(stderr,"next term finds %ld\n",k);
13612284Stut # endif
13712284Stut # if D3
13812284Stut 			if (iflong)
13912284Stut 				fprintf(stderr, "bfwh j %d nf %d master %ld k %ld\n",j,nf,prevdrop.b[j],(long)(k));
14012284Stut 			else
14112284Stut 				fprintf(stderr, "bfwh j %d nf %d master %ld k %ld\n",j,nf,prevdrop.a[j],(long)(k));
14212284Stut # endif
14312284Stut 			while (j<nf && (iflong?prevdrop.b[j]:prevdrop.a[j])<k)
14412284Stut 			{
14512284Stut # if D3
14612284Stut 				if (iflong)
14712284Stut 					fprintf(stderr, "j %d nf %d prevdrop %ld prevcoord %d colevel %d nterm %d k %ld\n",
14812284Stut 					j,nf,prevdrop.b[j], prevcoord[j], colevel, nterm, (long)(k));
14912284Stut 				else
15012284Stut 					fprintf(stderr, "j %d nf %d prevdrop %ld prevcoord %d colevel %d nterm %d k %ld\n",
15112284Stut 					j,nf,prevdrop.a[j], prevcoord[j], colevel, nterm, (long)(k));
15212284Stut # endif
15312284Stut 				if (prevcoord[j] + colevel <= nterm)
15412284Stut 					j++;
15512284Stut 				else
15612284Stut 				{
15712284Stut 					_assert (g<lmaster);
15812284Stut 					if (iflong)
15912284Stut 						master.b[g] = prevdrop.b[j];
16012284Stut 					else
16112284Stut 						master.a[g] = prevdrop.a[j];
16212284Stut 					coord[g++] = prevcoord[j++];
16312284Stut # if D1
16412284Stut 					if (iflong)
16512284Stut 						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]);
16612284Stut 					else
16712284Stut 						fprintf(stderr, " not skip g %d doc %ld coord %d nterm %d\n",g,master.a[g-1], coord[g-1],nterm);
16812284Stut # endif
16912284Stut 					continue;
17012284Stut 				}
17112284Stut 			}
17212284Stut 			if (colevel==0 && j>=nf) break;
17312284Stut 			if (j<nf && (iflong? prevdrop.b[j]: prevdrop.a[j]) == k)
17412284Stut 			{
17512284Stut 				if (iflong)
17612284Stut 					master.b[g]=k;
17712284Stut 				else
17812284Stut 					master.a[g]=k;
17912284Stut 				coord[g++] = prevcoord[j++]+1;
18012284Stut # if D1
18112284Stut 				if (iflong)
18212284Stut 					fprintf(stderr, " at g %d item %ld coord %d note %ld\n",g,master.b[g-1],coord[g-1],master.b[j-1]);
18312284Stut 				else
18412284Stut 					fprintf(stderr, " at g %d item %d coord %d note %d\n",g,master.a[g-1],coord[g-1],master.a[j-1]);
18512284Stut # endif
18612284Stut 			}
18712284Stut 			else
18812284Stut 				if (colevel >= nterm)
18912284Stut 				{
19012284Stut 					if (iflong)
19112284Stut 						master.b[g]=k;
19212284Stut 					else
19312284Stut 						master.a[g]=k;
19412284Stut 					coord[g++] = 1;
19512284Stut 				}
19612284Stut 		}
19712284Stut # if D1
19812284Stut 		fprintf(stderr,"now have %d items\n",g);
19912284Stut # endif
20012284Stut 		if (colevel>0)
20112284Stut 			for ( ; j<nf; j++)
202*17679Sralph 				if (prevcoord[j]+colevel > nterm)
20312284Stut 				{
20412284Stut 					_assert(g<lmaster);
20512284Stut 					if (iflong)
20612284Stut 						master.b[g] = prevdrop.b[j];
20712284Stut 					else
20812284Stut 						master.a[g] = prevdrop.a[j];
20912284Stut 					coord[g++] = prevcoord[j];
21012284Stut # if D3
21112284Stut 					if(iflong)
21212284Stut 						fprintf(stderr, "copied over %ld coord %d\n",master.b[g-1], coord[g-1]);
21312284Stut 					else
21412284Stut 						fprintf(stderr, "copied over %d coord %d\n",master.a[g-1], coord[g-1]);
21512284Stut # endif
21612284Stut 				}
21712284Stut 		nf = g;
21812284Stut 	}
21912284Stut 	if (colevel>0)
22012284Stut 	{
22112284Stut 		best=0;
22212284Stut 		for(j=0; j<nf; j++)
22312284Stut 			if (coord[j]>best) best = coord[j];
22412284Stut # if D1
22512284Stut 		fprintf(stderr, "colevel %d best %d\n", colevel, best);
22612284Stut # endif
22712284Stut 		reached = best;
22812284Stut 		for(g=j=0; j<nf; j++)
22912284Stut 			if (coord[j]==best)
23012284Stut 			{
23112284Stut 				if (iflong)
23212284Stut 					master.b[g++] = master.b[j];
23312284Stut 				else
23412284Stut 					master.a[g++] = master.a[j];
23512284Stut 			}
23612284Stut 		nf=g;
23712284Stut # if D1
23812284Stut 		fprintf(stderr, "yet got %d\n",nf);
23912284Stut # endif
24012284Stut 	}
24112284Stut # ifdef D1
24212284Stut 	fprintf(stderr, " returning with %d\n",nf);
24312284Stut # endif
24412284Stut 	if (colevel)
24512284Stut 	{
24612284Stut 		free(prevdrop, lmaster, iflong?sizeof(long): sizeof(int));
24712284Stut 		free(prevcoord, lmaster, sizeof (lmaster));
24812284Stut 	}
24912284Stut # if D3
25012284Stut 	for(g=0;g<nf;g++)
25112284Stut 		if(iflong)
25212284Stut 			fprintf(stderr,":%ld\n",master.b[g]);
25312284Stut 		else
25412284Stut 			fprintf(stderr,":%d\n",master.a[g]);
25512284Stut # endif
25612284Stut 	return(nf);
25712284Stut }
25812284Stut 
25912284Stut long
26012284Stut getl(fb)
26112284Stut FILE *fb;
26212284Stut {
26312284Stut 	return(getw(fb));
26412284Stut }
26512284Stut 
26612284Stut putl(ll, f)
26712284Stut long ll;
26812284Stut FILE *f;
26912284Stut {
27012284Stut 	putw(ll, f);
27112284Stut }
27212284Stut 
27312284Stut hcomp( n1, n2)
27412284Stut {
27512284Stut 	return (hfreq[hh[n1]]<=hfreq[hh[n2]]);
27612284Stut }
27712284Stut 
27812284Stut hexch( n1, n2 )
27912284Stut {
28012284Stut 	int t;
28112284Stut 	t = hh[n1];
28212284Stut 	hh[n1] = hh[n2];
28312284Stut 	hh[n2] = t;
28412284Stut }
285