KinoSearch::Search::Scorer - score documents against a Query |
sub explain { shift->abstract_death }
1;
__END__
__XS__
MODULE = KinoSearch PACKAGE = KinoSearch::Search::Scorer
void
_construct_parent(class)
char *class;
PREINIT:
Scorer *scorer;
PPCODE:
scorer = Kino_Scorer_new();
ST(0)
= sv_newmortal();
sv_setref_pv(ST(0), class, (void*)scorer);
XSRETURN(1);
SV* _scorer_set_or_get(scorer, ...) Scorer *scorer; ALIAS: set_similarity = 1 get_similarity = 2 CODE: { KINO_START_SET_OR_GET_SWITCH
case 1: SvREFCNT_dec(scorer->similarity_sv); scorer->similarity_sv = newSVsv( ST(1) ); Kino_extract_struct( scorer->similarity_sv, scorer->sim, Similarity*, "KinoSearch::Search::Similarity" ); /* fall through */ case 2: RETVAL = newSVsv(scorer->similarity_sv); break;
KINO_END_SET_OR_GET_SWITCH } OUTPUT: RETVAL
float
score(scorer)
Scorer* scorer;
CODE:
RETVAL = scorer->score(scorer);
OUTPUT: RETVAL
bool
next(scorer)
Scorer* scorer;
CODE:
RETVAL = scorer->next(scorer);
OUTPUT: RETVAL
void score_batch(scorer, ...) Scorer *scorer; PREINIT: HV *args_hash; U32 start, end; HitCollector *hc; PPCODE: /* process hash-style params */ Kino_Verify_build_args_hash(args_hash, ``KinoSearch::Search::Scorer::score_batch_args'', 1); Kino_extract_struct_from_hv(args_hash, hc, ``hit_collector'', 13, HitCollector*, ``KinoSearch::Search::HitCollector''); start = (U32)SvUV( Kino_Verify_extract_arg(args_hash, ``start'', 5) ); end = (U32)SvUV( Kino_Verify_extract_arg(args_hash, ``end'', 3) );
/* execute scoring loop */ while (scorer->next(scorer)) { hc->collect( hc, scorer->doc(scorer), scorer->score(scorer) ); }
bool skip_to(scorer, target_doc_num) Scorer* scorer; U32 target_doc_num; CODE: RETVAL = scorer->skip_to(scorer, target_doc_num); OUTPUT: RETVAL
void
DESTROY(scorer)
Scorer *scorer;
PPCODE:
Kino_Scorer_destroy(scorer);
__H__
#ifndef H_KINO_SCORER #define H_KINO_SCORER 1
#include ``EXTERN.h'' #include ``perl.h'' #include ``XSUB.h'' #include ``KinoSearchSearchSimilarity.h'' #include ``KinoSearchUtilMemManager.h'' #include ``KinoSearchUtilCarp.h''
typedef struct scorer { void *child; Similarity *sim; float (*score)(struct scorer*); bool (*next)(struct scorer*); U32 (*doc)(struct scorer*); bool (*skip_to)(struct scorer*, U32); SV *similarity_sv; } Scorer;
Scorer* Kino_Scorer_new(); float Kino_Scorer_score_death(Scorer*); bool Kino_Scorer_next_death(Scorer*); U32 Kino_Scorer_doc_death(Scorer*); bool Kino_Scorer_skip_to_death(Scorer*, U32); void Kino_Scorer_destroy(Scorer*);
#endif /* include guard */
__C__
#include ``KinoSearchSearchScorer.h''
Scorer*
Kino_Scorer_new()
{
Scorer* scorer;
Kino_New(0, scorer, 1, Scorer); scorer->child = NULL; scorer->sim = NULL; scorer->next = Kino_Scorer_next_death; scorer->score = Kino_Scorer_score_death; scorer->skip_to = Kino_Scorer_skip_to_death; scorer->similarity_sv = &PL_sv_undef;
return scorer; }
float Kino_Scorer_score_death(Scorer* scorer) { Kino_confess(``scorer->score must be defined in a subclass''); return 1.0; }
bool Kino_Scorer_next_death(Scorer* scorer) { Kino_confess(``scorer->next must be defined in a subclass''); return 1; }
U32 Kino_Scorer_doc_death(Scorer* scorer) { Kino_confess(``scorer->doc must be defined in a subclass''); return 1; }
bool Kino_Scorer_skip_to_death(Scorer* scorer, U32 target_doc_num) { Kino_confess(``scorer->skip_to must be defined in a subclass''); return 1; }
void Kino_Scorer_destroy(Scorer* scorer) { SvREFCNT_dec(scorer->similarity_sv); Kino_Safefree(scorer); }
__POD__
KinoSearch::Search::Scorer - score documents against a Query |