1 |
adcroft |
1.1 |
|
2 |
|
|
#include "swish.h" |
3 |
|
|
#include "db.h" |
4 |
|
|
#include "rank.h" |
5 |
|
|
|
6 |
|
|
/* 1000 precomputed 10000 * log(i) */ |
7 |
|
|
static int swish_log[] = {\ |
8 |
|
|
0, 0, 6931, 10986, 13863, 16094, 17918, 19459, 20794, 21972,\ |
9 |
|
|
23026, 23979, 24849, 25649, 26391, 27081, 27726, 28332, 28904, 29444,\ |
10 |
|
|
29957, 30445, 30910, 31355, 31781, 32189, 32581, 32958, 33322, 33673,\ |
11 |
|
|
34012, 34340, 34657, 34965, 35264, 35553, 35835, 36109, 36376, 36636,\ |
12 |
|
|
36889, 37136, 37377, 37612, 37842, 38067, 38286, 38501, 38712, 38918,\ |
13 |
|
|
39120, 39318, 39512, 39703, 39890, 40073, 40254, 40431, 40604, 40775,\ |
14 |
|
|
40943, 41109, 41271, 41431, 41589, 41744, 41897, 42047, 42195, 42341,\ |
15 |
|
|
42485, 42627, 42767, 42905, 43041, 43175, 43307, 43438, 43567, 43694,\ |
16 |
|
|
43820, 43944, 44067, 44188, 44308, 44427, 44543, 44659, 44773, 44886,\ |
17 |
|
|
44998, 45109, 45218, 45326, 45433, 45539, 45643, 45747, 45850, 45951,\ |
18 |
|
|
46052, 46151, 46250, 46347, 46444, 46540, 46634, 46728, 46821, 46913,\ |
19 |
|
|
47005, 47095, 47185, 47274, 47362, 47449, 47536, 47622, 47707, 47791,\ |
20 |
|
|
47875, 47958, 48040, 48122, 48203, 48283, 48363, 48442, 48520, 48598,\ |
21 |
|
|
48675, 48752, 48828, 48903, 48978, 49053, 49127, 49200, 49273, 49345,\ |
22 |
|
|
49416, 49488, 49558, 49628, 49698, 49767, 49836, 49904, 49972, 50039,\ |
23 |
|
|
50106, 50173, 50239, 50304, 50370, 50434, 50499, 50562, 50626, 50689,\ |
24 |
|
|
50752, 50814, 50876, 50938, 50999, 51059, 51120, 51180, 51240, 51299,\ |
25 |
|
|
51358, 51417, 51475, 51533, 51591, 51648, 51705, 51761, 51818, 51874,\ |
26 |
|
|
51930, 51985, 52040, 52095, 52149, 52204, 52257, 52311, 52364, 52417,\ |
27 |
|
|
52470, 52523, 52575, 52627, 52679, 52730, 52781, 52832, 52883, 52933,\ |
28 |
|
|
52983, 53033, 53083, 53132, 53181, 53230, 53279, 53327, 53375, 53423,\ |
29 |
|
|
53471, 53519, 53566, 53613, 53660, 53706, 53753, 53799, 53845, 53891,\ |
30 |
|
|
53936, 53982, 54027, 54072, 54116, 54161, 54205, 54250, 54293, 54337,\ |
31 |
|
|
54381, 54424, 54467, 54510, 54553, 54596, 54638, 54681, 54723, 54765,\ |
32 |
|
|
54806, 54848, 54889, 54931, 54972, 55013, 55053, 55094, 55134, 55175,\ |
33 |
|
|
55215, 55255, 55294, 55334, 55373, 55413, 55452, 55491, 55530, 55568,\ |
34 |
|
|
55607, 55645, 55683, 55722, 55759, 55797, 55835, 55872, 55910, 55947,\ |
35 |
|
|
55984, 56021, 56058, 56095, 56131, 56168, 56204, 56240, 56276, 56312,\ |
36 |
|
|
56348, 56384, 56419, 56454, 56490, 56525, 56560, 56595, 56630, 56664,\ |
37 |
|
|
56699, 56733, 56768, 56802, 56836, 56870, 56904, 56937, 56971, 57004,\ |
38 |
|
|
57038, 57071, 57104, 57137, 57170, 57203, 57236, 57268, 57301, 57333,\ |
39 |
|
|
57366, 57398, 57430, 57462, 57494, 57526, 57557, 57589, 57621, 57652,\ |
40 |
|
|
57683, 57714, 57746, 57777, 57807, 57838, 57869, 57900, 57930, 57961,\ |
41 |
|
|
57991, 58021, 58051, 58081, 58111, 58141, 58171, 58201, 58230, 58260,\ |
42 |
|
|
58289, 58319, 58348, 58377, 58406, 58435, 58464, 58493, 58522, 58551,\ |
43 |
|
|
58579, 58608, 58636, 58665, 58693, 58721, 58749, 58777, 58805, 58833,\ |
44 |
|
|
58861, 58889, 58916, 58944, 58972, 58999, 59026, 59054, 59081, 59108,\ |
45 |
|
|
59135, 59162, 59189, 59216, 59243, 59269, 59296, 59322, 59349, 59375,\ |
46 |
|
|
59402, 59428, 59454, 59480, 59506, 59532, 59558, 59584, 59610, 59636,\ |
47 |
|
|
59661, 59687, 59713, 59738, 59764, 59789, 59814, 59839, 59865, 59890,\ |
48 |
|
|
59915, 59940, 59965, 59989, 60014, 60039, 60064, 60088, 60113, 60137,\ |
49 |
|
|
60162, 60186, 60210, 60234, 60259, 60283, 60307, 60331, 60355, 60379,\ |
50 |
|
|
60403, 60426, 60450, 60474, 60497, 60521, 60544, 60568, 60591, 60615,\ |
51 |
|
|
60638, 60661, 60684, 60707, 60730, 60753, 60776, 60799, 60822, 60845,\ |
52 |
|
|
60868, 60890, 60913, 60936, 60958, 60981, 61003, 61026, 61048, 61070,\ |
53 |
|
|
61092, 61115, 61137, 61159, 61181, 61203, 61225, 61247, 61269, 61291,\ |
54 |
|
|
61312, 61334, 61356, 61377, 61399, 61420, 61442, 61463, 61485, 61506,\ |
55 |
|
|
61527, 61549, 61570, 61591, 61612, 61633, 61654, 61675, 61696, 61717,\ |
56 |
|
|
61738, 61759, 61779, 61800, 61821, 61841, 61862, 61883, 61903, 61924,\ |
57 |
|
|
61944, 61964, 61985, 62005, 62025, 62046, 62066, 62086, 62106, 62126,\ |
58 |
|
|
62146, 62166, 62186, 62206, 62226, 62246, 62265, 62285, 62305, 62324,\ |
59 |
|
|
62344, 62364, 62383, 62403, 62422, 62442, 62461, 62480, 62500, 62519,\ |
60 |
|
|
62538, 62558, 62577, 62596, 62615, 62634, 62653, 62672, 62691, 62710,\ |
61 |
|
|
62729, 62748, 62766, 62785, 62804, 62823, 62841, 62860, 62879, 62897,\ |
62 |
|
|
62916, 62934, 62953, 62971, 62989, 63008, 63026, 63044, 63063, 63081,\ |
63 |
|
|
63099, 63117, 63135, 63154, 63172, 63190, 63208, 63226, 63244, 63261,\ |
64 |
|
|
63279, 63297, 63315, 63333, 63351, 63368, 63386, 63404, 63421, 63439,\ |
65 |
|
|
63456, 63474, 63491, 63509, 63526, 63544, 63561, 63578, 63596, 63613,\ |
66 |
|
|
63630, 63648, 63665, 63682, 63699, 63716, 63733, 63750, 63767, 63784,\ |
67 |
|
|
63801, 63818, 63835, 63852, 63869, 63886, 63902, 63919, 63936, 63953,\ |
68 |
|
|
63969, 63986, 64003, 64019, 64036, 64052, 64069, 64085, 64102, 64118,\ |
69 |
|
|
64135, 64151, 64167, 64184, 64200, 64216, 64232, 64249, 64265, 64281,\ |
70 |
|
|
64297, 64313, 64329, 64345, 64362, 64378, 64394, 64409, 64425, 64441,\ |
71 |
|
|
64457, 64473, 64489, 64505, 64520, 64536, 64552, 64568, 64583, 64599,\ |
72 |
|
|
64615, 64630, 64646, 64661, 64677, 64693, 64708, 64723, 64739, 64754,\ |
73 |
|
|
64770, 64785, 64800, 64816, 64831, 64846, 64862, 64877, 64892, 64907,\ |
74 |
|
|
64922, 64938, 64953, 64968, 64983, 64998, 65013, 65028, 65043, 65058,\ |
75 |
|
|
65073, 65088, 65103, 65117, 65132, 65147, 65162, 65177, 65191, 65206,\ |
76 |
|
|
65221, 65236, 65250, 65265, 65280, 65294, 65309, 65323, 65338, 65352,\ |
77 |
|
|
65367, 65381, 65396, 65410, 65425, 65439, 65453, 65468, 65482, 65497,\ |
78 |
|
|
65511, 65525, 65539, 65554, 65568, 65582, 65596, 65610, 65624, 65639,\ |
79 |
|
|
65653, 65667, 65681, 65695, 65709, 65723, 65737, 65751, 65765, 65779,\ |
80 |
|
|
65793, 65806, 65820, 65834, 65848, 65862, 65876, 65889, 65903, 65917,\ |
81 |
|
|
65930, 65944, 65958, 65971, 65985, 65999, 66012, 66026, 66039, 66053,\ |
82 |
|
|
66067, 66080, 66093, 66107, 66120, 66134, 66147, 66161, 66174, 66187,\ |
83 |
|
|
66201, 66214, 66227, 66241, 66254, 66267, 66280, 66294, 66307, 66320,\ |
84 |
|
|
66333, 66346, 66359, 66373, 66386, 66399, 66412, 66425, 66438, 66451,\ |
85 |
|
|
66464, 66477, 66490, 66503, 66516, 66529, 66542, 66554, 66567, 66580,\ |
86 |
|
|
66593, 66606, 66619, 66631, 66644, 66657, 66670, 66682, 66695, 66708,\ |
87 |
|
|
66720, 66733, 66746, 66758, 66771, 66783, 66796, 66809, 66821, 66834,\ |
88 |
|
|
66846, 66859, 66871, 66884, 66896, 66908, 66921, 66933, 66946, 66958,\ |
89 |
|
|
66970, 66983, 66995, 67007, 67020, 67032, 67044, 67056, 67069, 67081,\ |
90 |
|
|
67093, 67105, 67117, 67130, 67142, 67154, 67166, 67178, 67190, 67202,\ |
91 |
|
|
67214, 67226, 67238, 67250, 67262, 67274, 67286, 67298, 67310, 67322,\ |
92 |
|
|
67334, 67346, 67358, 67370, 67382, 67393, 67405, 67417, 67429, 67441,\ |
93 |
|
|
67452, 67464, 67476, 67488, 67499, 67511, 67523, 67534, 67546, 67558,\ |
94 |
|
|
67569, 67581, 67593, 67604, 67616, 67627, 67639, 67650, 67662, 67673,\ |
95 |
|
|
67685, 67696, 67708, 67719, 67731, 67742, 67754, 67765, 67776, 67788,\ |
96 |
|
|
67799, 67811, 67822, 67833, 67845, 67856, 67867, 67878, 67890, 67901,\ |
97 |
|
|
67912, 67923, 67935, 67946, 67957, 67968, 67979, 67991, 68002, 68013,\ |
98 |
|
|
68024, 68035, 68046, 68057, 68068, 68079, 68090, 68101, 68112, 68123,\ |
99 |
|
|
68134, 68145, 68156, 68167, 68178, 68189, 68200, 68211, 68222, 68233,\ |
100 |
|
|
68244, 68255, 68265, 68276, 68287, 68298, 68309, 68320, 68330, 68341,\ |
101 |
|
|
68352, 68363, 68373, 68384, 68395, 68405, 68416, 68427, 68437, 68448,\ |
102 |
|
|
68459, 68469, 68480, 68491, 68501, 68512, 68522, 68533, 68544, 68554,\ |
103 |
|
|
68565, 68575, 68586, 68596, 68607, 68617, 68628, 68638, 68648, 68659,\ |
104 |
|
|
68669, 68680, 68690, 68701, 68711, 68721, 68732, 68742, 68752, 68763,\ |
105 |
|
|
68773, 68783, 68794, 68804, 68814, 68824, 68835, 68845, 68855, 68865,\ |
106 |
|
|
68876, 68886, 68896, 68906, 68916, 68926, 68937, 68947, 68957, 68967,\ |
107 |
|
|
68977, 68987, 68997, 69007, 69017, 69027, 69037, 69048, 69058, 69068,\ |
108 |
|
|
69078, |
109 |
|
|
}; |
110 |
|
|
|
111 |
|
|
/* 1000 precomputed 1000 * log10(i) */ |
112 |
|
|
static int swish_log10[] = {\ |
113 |
|
|
0, 0, 3010, 4771, 6021, 6990, 7782, 8451, 9031, 9542,\ |
114 |
|
|
10000, 10414, 10792, 11139, 11461, 11761, 12041, 12304, 12553, 12788,\ |
115 |
|
|
13010, 13222, 13424, 13617, 13802, 13979, 14150, 14314, 14472, 14624,\ |
116 |
|
|
14771, 14914, 15051, 15185, 15315, 15441, 15563, 15682, 15798, 15911,\ |
117 |
|
|
16021, 16128, 16232, 16335, 16435, 16532, 16628, 16721, 16812, 16902,\ |
118 |
|
|
16990, 17076, 17160, 17243, 17324, 17404, 17482, 17559, 17634, 17709,\ |
119 |
|
|
17782, 17853, 17924, 17993, 18062, 18129, 18195, 18261, 18325, 18388,\ |
120 |
|
|
18451, 18513, 18573, 18633, 18692, 18751, 18808, 18865, 18921, 18976,\ |
121 |
|
|
19031, 19085, 19138, 19191, 19243, 19294, 19345, 19395, 19445, 19494,\ |
122 |
|
|
19542, 19590, 19638, 19685, 19731, 19777, 19823, 19868, 19912, 19956,\ |
123 |
|
|
20000, 20043, 20086, 20128, 20170, 20212, 20253, 20294, 20334, 20374,\ |
124 |
|
|
20414, 20453, 20492, 20531, 20569, 20607, 20645, 20682, 20719, 20755,\ |
125 |
|
|
20792, 20828, 20864, 20899, 20934, 20969, 21004, 21038, 21072, 21106,\ |
126 |
|
|
21139, 21173, 21206, 21239, 21271, 21303, 21335, 21367, 21399, 21430,\ |
127 |
|
|
21461, 21492, 21523, 21553, 21584, 21614, 21644, 21673, 21703, 21732,\ |
128 |
|
|
21761, 21790, 21818, 21847, 21875, 21903, 21931, 21959, 21987, 22014,\ |
129 |
|
|
22041, 22068, 22095, 22122, 22148, 22175, 22201, 22227, 22253, 22279,\ |
130 |
|
|
22304, 22330, 22355, 22380, 22405, 22430, 22455, 22480, 22504, 22529,\ |
131 |
|
|
22553, 22577, 22601, 22625, 22648, 22672, 22695, 22718, 22742, 22765,\ |
132 |
|
|
22788, 22810, 22833, 22856, 22878, 22900, 22923, 22945, 22967, 22989,\ |
133 |
|
|
23010, 23032, 23054, 23075, 23096, 23118, 23139, 23160, 23181, 23201,\ |
134 |
|
|
23222, 23243, 23263, 23284, 23304, 23324, 23345, 23365, 23385, 23404,\ |
135 |
|
|
23424, 23444, 23464, 23483, 23502, 23522, 23541, 23560, 23579, 23598,\ |
136 |
|
|
23617, 23636, 23655, 23674, 23692, 23711, 23729, 23747, 23766, 23784,\ |
137 |
|
|
23802, 23820, 23838, 23856, 23874, 23892, 23909, 23927, 23945, 23962,\ |
138 |
|
|
23979, 23997, 24014, 24031, 24048, 24065, 24082, 24099, 24116, 24133,\ |
139 |
|
|
24150, 24166, 24183, 24200, 24216, 24232, 24249, 24265, 24281, 24298,\ |
140 |
|
|
24314, 24330, 24346, 24362, 24378, 24393, 24409, 24425, 24440, 24456,\ |
141 |
|
|
24472, 24487, 24502, 24518, 24533, 24548, 24564, 24579, 24594, 24609,\ |
142 |
|
|
24624, 24639, 24654, 24669, 24683, 24698, 24713, 24728, 24742, 24757,\ |
143 |
|
|
24771, 24786, 24800, 24814, 24829, 24843, 24857, 24871, 24886, 24900,\ |
144 |
|
|
24914, 24928, 24942, 24955, 24969, 24983, 24997, 25011, 25024, 25038,\ |
145 |
|
|
25051, 25065, 25079, 25092, 25105, 25119, 25132, 25145, 25159, 25172,\ |
146 |
|
|
25185, 25198, 25211, 25224, 25237, 25250, 25263, 25276, 25289, 25302,\ |
147 |
|
|
25315, 25328, 25340, 25353, 25366, 25378, 25391, 25403, 25416, 25428,\ |
148 |
|
|
25441, 25453, 25465, 25478, 25490, 25502, 25514, 25527, 25539, 25551,\ |
149 |
|
|
25563, 25575, 25587, 25599, 25611, 25623, 25635, 25647, 25658, 25670,\ |
150 |
|
|
25682, 25694, 25705, 25717, 25729, 25740, 25752, 25763, 25775, 25786,\ |
151 |
|
|
25798, 25809, 25821, 25832, 25843, 25855, 25866, 25877, 25888, 25899,\ |
152 |
|
|
25911, 25922, 25933, 25944, 25955, 25966, 25977, 25988, 25999, 26010,\ |
153 |
|
|
26021, 26031, 26042, 26053, 26064, 26075, 26085, 26096, 26107, 26117,\ |
154 |
|
|
26128, 26138, 26149, 26160, 26170, 26180, 26191, 26201, 26212, 26222,\ |
155 |
|
|
26232, 26243, 26253, 26263, 26274, 26284, 26294, 26304, 26314, 26325,\ |
156 |
|
|
26335, 26345, 26355, 26365, 26375, 26385, 26395, 26405, 26415, 26425,\ |
157 |
|
|
26435, 26444, 26454, 26464, 26474, 26484, 26493, 26503, 26513, 26522,\ |
158 |
|
|
26532, 26542, 26551, 26561, 26571, 26580, 26590, 26599, 26609, 26618,\ |
159 |
|
|
26628, 26637, 26646, 26656, 26665, 26675, 26684, 26693, 26702, 26712,\ |
160 |
|
|
26721, 26730, 26739, 26749, 26758, 26767, 26776, 26785, 26794, 26803,\ |
161 |
|
|
26812, 26821, 26830, 26839, 26848, 26857, 26866, 26875, 26884, 26893,\ |
162 |
|
|
26902, 26911, 26920, 26928, 26937, 26946, 26955, 26964, 26972, 26981,\ |
163 |
|
|
26990, 26998, 27007, 27016, 27024, 27033, 27042, 27050, 27059, 27067,\ |
164 |
|
|
27076, 27084, 27093, 27101, 27110, 27118, 27126, 27135, 27143, 27152,\ |
165 |
|
|
27160, 27168, 27177, 27185, 27193, 27202, 27210, 27218, 27226, 27235,\ |
166 |
|
|
27243, 27251, 27259, 27267, 27275, 27284, 27292, 27300, 27308, 27316,\ |
167 |
|
|
27324, 27332, 27340, 27348, 27356, 27364, 27372, 27380, 27388, 27396,\ |
168 |
|
|
27404, 27412, 27419, 27427, 27435, 27443, 27451, 27459, 27466, 27474,\ |
169 |
|
|
27482, 27490, 27497, 27505, 27513, 27520, 27528, 27536, 27543, 27551,\ |
170 |
|
|
27559, 27566, 27574, 27582, 27589, 27597, 27604, 27612, 27619, 27627,\ |
171 |
|
|
27634, 27642, 27649, 27657, 27664, 27672, 27679, 27686, 27694, 27701,\ |
172 |
|
|
27709, 27716, 27723, 27731, 27738, 27745, 27752, 27760, 27767, 27774,\ |
173 |
|
|
27782, 27789, 27796, 27803, 27810, 27818, 27825, 27832, 27839, 27846,\ |
174 |
|
|
27853, 27860, 27868, 27875, 27882, 27889, 27896, 27903, 27910, 27917,\ |
175 |
|
|
27924, 27931, 27938, 27945, 27952, 27959, 27966, 27973, 27980, 27987,\ |
176 |
|
|
27993, 28000, 28007, 28014, 28021, 28028, 28035, 28041, 28048, 28055,\ |
177 |
|
|
28062, 28069, 28075, 28082, 28089, 28096, 28102, 28109, 28116, 28122,\ |
178 |
|
|
28129, 28136, 28142, 28149, 28156, 28162, 28169, 28176, 28182, 28189,\ |
179 |
|
|
28195, 28202, 28209, 28215, 28222, 28228, 28235, 28241, 28248, 28254,\ |
180 |
|
|
28261, 28267, 28274, 28280, 28287, 28293, 28299, 28306, 28312, 28319,\ |
181 |
|
|
28325, 28331, 28338, 28344, 28351, 28357, 28363, 28370, 28376, 28382,\ |
182 |
|
|
28388, 28395, 28401, 28407, 28414, 28420, 28426, 28432, 28439, 28445,\ |
183 |
|
|
28451, 28457, 28463, 28470, 28476, 28482, 28488, 28494, 28500, 28506,\ |
184 |
|
|
28513, 28519, 28525, 28531, 28537, 28543, 28549, 28555, 28561, 28567,\ |
185 |
|
|
28573, 28579, 28585, 28591, 28597, 28603, 28609, 28615, 28621, 28627,\ |
186 |
|
|
28633, 28639, 28645, 28651, 28657, 28663, 28669, 28675, 28681, 28686,\ |
187 |
|
|
28692, 28698, 28704, 28710, 28716, 28722, 28727, 28733, 28739, 28745,\ |
188 |
|
|
28751, 28756, 28762, 28768, 28774, 28779, 28785, 28791, 28797, 28802,\ |
189 |
|
|
28808, 28814, 28820, 28825, 28831, 28837, 28842, 28848, 28854, 28859,\ |
190 |
|
|
28865, 28871, 28876, 28882, 28887, 28893, 28899, 28904, 28910, 28915,\ |
191 |
|
|
28921, 28927, 28932, 28938, 28943, 28949, 28954, 28960, 28965, 28971,\ |
192 |
|
|
28976, 28982, 28987, 28993, 28998, 29004, 29009, 29015, 29020, 29025,\ |
193 |
|
|
29031, 29036, 29042, 29047, 29053, 29058, 29063, 29069, 29074, 29079,\ |
194 |
|
|
29085, 29090, 29096, 29101, 29106, 29112, 29117, 29122, 29128, 29133,\ |
195 |
|
|
29138, 29143, 29149, 29154, 29159, 29165, 29170, 29175, 29180, 29186,\ |
196 |
|
|
29191, 29196, 29201, 29206, 29212, 29217, 29222, 29227, 29232, 29238,\ |
197 |
|
|
29243, 29248, 29253, 29258, 29263, 29269, 29274, 29279, 29284, 29289,\ |
198 |
|
|
29294, 29299, 29304, 29309, 29315, 29320, 29325, 29330, 29335, 29340,\ |
199 |
|
|
29345, 29350, 29355, 29360, 29365, 29370, 29375, 29380, 29385, 29390,\ |
200 |
|
|
29395, 29400, 29405, 29410, 29415, 29420, 29425, 29430, 29435, 29440,\ |
201 |
|
|
29445, 29450, 29455, 29460, 29465, 29469, 29474, 29479, 29484, 29489,\ |
202 |
|
|
29494, 29499, 29504, 29509, 29513, 29518, 29523, 29528, 29533, 29538,\ |
203 |
|
|
29542, 29547, 29552, 29557, 29562, 29566, 29571, 29576, 29581, 29586,\ |
204 |
|
|
29590, 29595, 29600, 29605, 29609, 29614, 29619, 29624, 29628, 29633,\ |
205 |
|
|
29638, 29643, 29647, 29652, 29657, 29661, 29666, 29671, 29675, 29680,\ |
206 |
|
|
29685, 29689, 29694, 29699, 29703, 29708, 29713, 29717, 29722, 29727,\ |
207 |
|
|
29731, 29736, 29741, 29745, 29750, 29754, 29759, 29763, 29768, 29773,\ |
208 |
|
|
29777, 29782, 29786, 29791, 29795, 29800, 29805, 29809, 29814, 29818,\ |
209 |
|
|
29823, 29827, 29832, 29836, 29841, 29845, 29850, 29854, 29859, 29863,\ |
210 |
|
|
29868, 29872, 29877, 29881, 29886, 29890, 29894, 29899, 29903, 29908,\ |
211 |
|
|
29912, 29917, 29921, 29926, 29930, 29934, 29939, 29943, 29948, 29952,\ |
212 |
|
|
29956, 29961, 29965, 29969, 29974, 29978, 29983, 29987, 29991, 29996,\ |
213 |
|
|
30000, |
214 |
|
|
}; |
215 |
|
|
|
216 |
|
|
typedef struct { |
217 |
|
|
int mask; |
218 |
|
|
int rank; |
219 |
|
|
} RankFactor; |
220 |
|
|
|
221 |
|
|
static RankFactor ranks[] = { |
222 |
|
|
{IN_TITLE, RANK_TITLE}, |
223 |
|
|
{IN_HEADER, RANK_HEADER}, |
224 |
|
|
{IN_META, RANK_META}, |
225 |
|
|
{IN_COMMENTS, RANK_COMMENTS}, |
226 |
|
|
{IN_EMPHASIZED, RANK_EMPHASIZED} |
227 |
|
|
}; |
228 |
|
|
|
229 |
|
|
#define numRanks (sizeof(ranks)/sizeof(ranks[0])) |
230 |
|
|
|
231 |
|
|
|
232 |
|
|
/* 2001-11 jmruiz With thousands results (>1000000) this routine is a bottleneck. |
233 |
|
|
** (it is called thousands of times) Trying to avoid |
234 |
|
|
** this I have added some optimizations. |
235 |
|
|
** To avoid the annoying conversion in "return (int)rank" |
236 |
|
|
** from double to int that degrades performance search |
237 |
|
|
** I have switched to integer computations. |
238 |
|
|
** |
239 |
|
|
** To avoid the loss of precission I use rank *10000, |
240 |
|
|
** reduction *10000, factor *10000, etc... |
241 |
|
|
*/ |
242 |
|
|
int getrank(SWISH * sw, int freq, int tfreq, int *posdata, IndexFILE *indexf, int filenum ) |
243 |
|
|
{ |
244 |
|
|
int factor; |
245 |
|
|
int rank; |
246 |
|
|
int reduction; |
247 |
|
|
int structure; |
248 |
|
|
int i; |
249 |
|
|
|
250 |
|
|
factor = 1; |
251 |
|
|
|
252 |
|
|
|
253 |
|
|
/* add up the multiplier factor based on where the word occurs */ |
254 |
|
|
|
255 |
|
|
/* 2002/jmruiz - This must be rewritten */ |
256 |
|
|
for(structure = 0, i = 0; i < freq; i++) |
257 |
|
|
structure |= GET_STRUCTURE(posdata[i]); |
258 |
|
|
|
259 |
|
|
if(GET_STRUCTURE(structure) != IN_FILE) |
260 |
|
|
for (i = 0; i < numRanks; i++) |
261 |
|
|
if (ranks[i].mask & structure) |
262 |
|
|
factor += ranks[i].rank; |
263 |
|
|
|
264 |
|
|
if(freq > 1000) /* rare case - Do not overrun the static arrays (they only have 1000 entries) */ |
265 |
|
|
rank = (int)(10000 * (floor(log((double)freq) + 0.5))); |
266 |
|
|
else |
267 |
|
|
rank = swish_log[freq] + 100000; /* 100000 = 10 * 10000 */ |
268 |
|
|
|
269 |
|
|
/* if word count is significant, reduce rank by a number between 1.0 and 5.0 */ |
270 |
|
|
if ( !indexf->header.ignoreTotalWordCountWhenRanking ) |
271 |
|
|
{ |
272 |
|
|
int words; |
273 |
|
|
|
274 |
|
|
getTotalWordsPerFile(sw, indexf, filenum-1, &words); |
275 |
|
|
|
276 |
|
|
if (words <= 10) |
277 |
|
|
reduction = 10000; /* 10000 * log10(10) = 10000 */ |
278 |
|
|
else if (words > 1000) |
279 |
|
|
{ |
280 |
|
|
if(words >= 100000) /* log10(10000) is 5 */ |
281 |
|
|
reduction = 50000; /* As it was in previous version (5 * 10000) */ |
282 |
|
|
else /* rare case - do not overrun the static arrays (tehy only have 1000 entries) */ |
283 |
|
|
reduction = (int) (10000 * (floor(log10((double)words) + 0.5))); |
284 |
|
|
} |
285 |
|
|
else reduction = swish_log10[words]; |
286 |
|
|
rank = (rank * factor * 100) / reduction; |
287 |
|
|
} |
288 |
|
|
/* multiply by the weighting factor, and scale to be sure we don't loose |
289 |
|
|
precision when converted to an integer. The rank will be normalized later */ |
290 |
|
|
else |
291 |
|
|
{ |
292 |
|
|
rank = (rank * factor) / 100; |
293 |
|
|
} |
294 |
|
|
|
295 |
|
|
//rank = freq * factor; |
296 |
|
|
//printf("* Filenum %d freq %d factor %d rank %d\n", filenum, freq, factor, rank ); |
297 |
|
|
|
298 |
|
|
return rank; |
299 |
|
|
} |
300 |
|
|
|
301 |
|
|
int getrank_old(SWISH * sw, int freq, int tfreq, int *posdata, IndexFILE *indexf, int filenum ) |
302 |
|
|
{ |
303 |
|
|
double factor; |
304 |
|
|
double rank; |
305 |
|
|
double reduction; |
306 |
|
|
int structure; |
307 |
|
|
int i; |
308 |
|
|
|
309 |
|
|
/* 2002/jmruiz - This must be rewritten */ |
310 |
|
|
for(structure = 0, i = 0; i < freq; i++) |
311 |
|
|
structure |= GET_STRUCTURE(posdata[i]); |
312 |
|
|
|
313 |
|
|
factor = 1.0; |
314 |
|
|
|
315 |
|
|
/* add up the multiplier factor based on where the word occurs */ |
316 |
|
|
for (i = 0; i < numRanks; i++) |
317 |
|
|
if (ranks[i].mask & structure) |
318 |
|
|
factor += ranks[i].rank; |
319 |
|
|
|
320 |
|
|
rank = log((double)freq) + 10.0; |
321 |
|
|
|
322 |
|
|
/* if word count is significant, reduce rank by a number between 1.0 and 5.0 */ |
323 |
|
|
if ( !indexf->header.ignoreTotalWordCountWhenRanking ) |
324 |
|
|
{ |
325 |
|
|
int words; |
326 |
|
|
|
327 |
|
|
getTotalWordsPerFile(sw, indexf, filenum-1, &words); |
328 |
|
|
|
329 |
|
|
if (words < 10) words = 10; |
330 |
|
|
reduction = log10((double)words); |
331 |
|
|
if (reduction > 5.0) reduction = 5.0; |
332 |
|
|
rank /= reduction; |
333 |
|
|
} |
334 |
|
|
|
335 |
|
|
/* multiply by the weighting factor, and scale to be sure we don't loose |
336 |
|
|
precision when converted to an integer. The rank will be normalized later */ |
337 |
|
|
rank = rank * factor * 100.0 + 0.5; |
338 |
|
|
|
339 |
|
|
return (int)rank; |
340 |
|
|
} |
341 |
|
|
|