OSDN Git Service

Avoid infinity calculations in rank_cd
authorTeodor Sigaev <teodor@sigaev.ru>
Wed, 22 Nov 2006 15:55:05 +0000 (15:55 +0000)
committerTeodor Sigaev <teodor@sigaev.ru>
Wed, 22 Nov 2006 15:55:05 +0000 (15:55 +0000)
contrib/tsearch2/rank.c

index f8a7d5f..7bd5e1a 100644 (file)
@@ -667,6 +667,7 @@ calc_rank_cd(float4 *arrdata, tsvector * txt, QUERYTYPE * query, int method)
        {
                double          Cpos = 0.0;
                double          InvSum = 0.0;
+               int                     nNoise;
                DocRepresentation *ptr = ext.begin;
 
                while (ptr <= ext.end)
@@ -676,7 +677,16 @@ calc_rank_cd(float4 *arrdata, tsvector * txt, QUERYTYPE * query, int method)
                }
 
                Cpos = ((double) (ext.end - ext.begin + 1)) / InvSum;
-               Wdoc += Cpos / ((double) ((1 + (ext.q - ext.p) - (ext.end - ext.begin))));
+               /*
+                * if doc are big enough then ext.q may be equal to ext.p
+                * due to limit of posional information. In this case we 
+                * approximate number of noise word as half cover's
+                * length
+                */
+               nNoise = (ext.q - ext.p) - (ext.end - ext.begin);
+               if ( nNoise < 0 )
+                       nNoise = (ext.end - ext.begin) / 2;
+               Wdoc += Cpos / ((double) (1 + nNoise));
 
                CurExtPos = ((double) (ext.q + ext.p)) / 2.0;
                if (NExtent > 0 && CurExtPos > PrevExtPos               /* prevent devision by