/*********************************************** !!!! DO NOT EDIT THIS FILE !!!! This file was auto-generated by Build.PL from lib/KinoSearch/Search/Similarity.pm See KinoSearch::Docs::DevGuide for details. ***********************************************/ #line 239 "lib/KinoSearch/Search/Similarity.pm" #include "KinoSearchSearchSimilarity.h" Similarity* Kino_Sim_new() { int i; unsigned char aUChar; Similarity *sim; Kino_New(0, sim, 1, Similarity); /* cache decoded norms */ Kino_New(0, sim->norm_decoder, 256, float); for (i = 0; i < 256; i++) { aUChar = i; sim->norm_decoder[i] = Kino_Sim_byte2float(sim, (char)aUChar); } sim->tf = Kino_Sim_default_tf; sim->coord = Kino_Sim_coord; return sim; } float Kino_Sim_default_tf(Similarity *sim, float freq) { return( sqrt(freq) ); } float Kino_Sim_title_tf(Similarity *sim, float freq) { return 1.0; } char Kino_Sim_float2byte(Similarity *sim, float f) { char norm; I32 mantissa; I32 exponent; I32 bits; if (f < 0.0) f = 0.0; if (f == 0.0) { norm = 0; } else { bits = *(I32*)&f; mantissa = (bits & 0xffffff) >> 21; exponent = (((bits >> 24) & 0x7f)-63) + 15; if (exponent > 31) { exponent = 31; mantissa = 7; } if (exponent < 0) { exponent = 0; mantissa = 1; } norm = (char)((exponent << 3) | mantissa); } return norm; } float Kino_Sim_byte2float(Similarity *sim, char b) { I32 mantissa; I32 exponent; I32 result; if (b == 0) { result = 0; } else { mantissa = b & 7; exponent = (b >> 3) & 31; result = ((exponent+(63-15)) << 24) | (mantissa << 21); } return *(float*)&result; } /* Calculate a score factor based on the number of terms which match. */ float Kino_Sim_coord(Similarity *sim, U32 overlap, U32 max_overlap) { if (max_overlap == 0) return 1; return (float)overlap / (float)max_overlap; } void Kino_Sim_destroy(Similarity *sim) { Kino_Safefree(sim->norm_decoder); Kino_Safefree(sim); }