diff --git a/include/r3.h b/include/r3.h index f69d2ab..6d6fc9b 100644 --- a/include/r3.h +++ b/include/r3.h @@ -71,8 +71,7 @@ struct _edge { node * child; /* the parent node */ node * parent; - uint64_t hits; - float score; + float score; bool has_slug:1; }; diff --git a/src/edge.c b/src/edge.c index c01d744..f737f9c 100644 --- a/src/edge.c +++ b/src/edge.c @@ -35,7 +35,7 @@ edge * r3_edge_create(char * pattern, int pattern_len, node * child) { child->parent_edge = e; // default stats - e->hits = 0; + // e->hits = 0; e->score = 0; return e; } diff --git a/src/node.c b/src/node.c index 7082c4b..ebe0038 100644 --- a/src/node.c +++ b/src/node.c @@ -116,9 +116,22 @@ edge * r3_node_add_child(node * n, char * pat , node *child) { } void r3_tree_feedback(node *tree, node *end) { - edge * e; - while( (e = end->parent_edge) != NULL ) { + edge * e = end->parent_edge; + node * p = e->parent; + while( p && e ) { + e->score += 0.1; + + if (e->score > 100) { + for (int i = 0 ; i < p->edge_len ; i++ ) { + if ( p->edges[i]->score > 0 ) { + p->edges[i]->score /= 100; + } + } + } + + e = p->parent_edge; + p = e ? e->parent : NULL; } } @@ -564,10 +577,6 @@ void r3_tree_dump(node * n, int level) { printf(" regexp:%s", n->combined_pattern); } - if ( n->parent_edge ) { - printf(" belongs to edge:%p", n->parent_edge); - } - printf(" endpoint:%d", n->endpoint); if (n->data) { @@ -580,6 +589,9 @@ void r3_tree_dump(node * n, int level) { print_indent(level + 1); printf("|-\"%s\"", e->pattern); + // printf(" hits:%lld score:%.1f ", e->hits, e->score); + printf(" score:%.1f ", e->score); + if ( e->child ) { printf("\n"); r3_tree_dump( e->child, level + 1); diff --git a/tests/bench_str.csv b/tests/bench_str.csv index 2d98f6a..08bedda 100644 --- a/tests/bench_str.csv +++ b/tests/bench_str.csv @@ -453,3 +453,19 @@ 1400749326,13242705.99 1400749599,13245418.70 1400749614,12494314.81 +1400749643,12690632.63 +1400749676,10154614.63 +1400749681,10313142.07 +1400749696,10511488.62 +1400749780,10359781.60 +1400749808,10187594.58 +1400749822,10446286.96 +1400749888,10342786.49 +1400749944,10491740.29 +1400749951,10544104.04 +1400750350,10391028.46 +1400750424,9445761.22 +1400750472,9248611.74 +1400750479,10757562.36 +1400750512,10126746.58 +1400750536,10568568.26 diff --git a/tests/check_tree.c b/tests/check_tree.c index 15fe542..b94f28a 100644 --- a/tests/check_tree.c +++ b/tests/check_tree.c @@ -737,10 +737,20 @@ START_TEST(test_feedback) r3_tree_insert_path(t, "/garply/corge/grault", NULL); r3_tree_compile(t); - node * m = r3_tree_match(t, "/foo/grault/bar", NULL); - ck_assert(m != NULL); + node * m1 = r3_tree_match(t, "/foo/grault/bar", NULL); + node * m2 = r3_tree_match(t, "/garply/corge/grault", NULL); + ck_assert(m1 != NULL); + ck_assert(m2 != NULL); - r3_tree_feedback(t, m); + for ( int i = 0 ; i < 120 ; i++ ) { + r3_tree_feedback(t, m1); + } + + for ( int i = 0 ; i < 200 ; i++ ) { + r3_tree_feedback(t, m2); + } + + r3_tree_dump(t, 0); r3_tree_free(t); } @@ -764,6 +774,7 @@ Suite* r3_suite (void) { tcase_add_test(tcase, test_pcre_patterns_insert); tcase_add_test(tcase, test_pcre_patterns_insert_2); tcase_add_test(tcase, test_pcre_patterns_insert_3); + tcase_add_test(tcase, test_feedback); tcase_add_test(tcase, benchmark_str); suite_add_tcase(suite, tcase);