double final_grow_factor = grow_factor;
double max_limit = G_MINDOUBLE;
- for (unsigned int i = 0; i < result->nactions; i++) {
- struct rspamd_action_config *cur = &result->actions_config[i];
-
- if (cur->cur_limit > 0 && max_limit < cur->cur_limit) {
- max_limit = cur->cur_limit;
- }
- }
-
if (grow_factor > 1.0) {
+ for (unsigned int i = 0; i < result->nactions; i++) {
+ struct rspamd_action_config *cur = &result->actions_config[i];
+
+ if (cur->cur_limit > 0 && max_limit < cur->cur_limit) {
+ max_limit = cur->cur_limit;
+ }
+ }
+ /* Adjust factor by selecting all symbols and checking those with positive scores */
kh_foreach(result->symbols, kk, res, {
if (res->score > 0) {
double mult = 1.0 - grow_factor;
+ /* We adjust the factor by the ratio of the score to the max limit */
if (max_limit > 0 && !isnan(res->score)) {
mult *= res->score / max_limit;
final_grow_factor *= 1.0 + mult;
}
});
- if (final_grow_factor > grow_factor) {
+ /* At this stage we know that we have some grow factor to apply */
+ if (final_grow_factor > 1.0) {
msg_info_task("calculated final grow factor for task: %.3f (%.2f the original one)",
final_grow_factor, grow_factor);
kh_foreach(result->symbols, kk, res, {
if (res->score > 0) {
+ result->score -= res->score;
res->score *= final_grow_factor;
+ result->score += res->score;
}
});
}
all_done = rspamd_symcache_process_symbols(task, task->cfg->cache,
st);
+ if (all_done) {
+ rspamd_task_result_adjust_grow_factor(task, task->result, task->cfg->grow_factor);
+ }
+
if (all_done && (task->flags & RSPAMD_TASK_FLAG_LEARN_AUTO) &&
!RSPAMD_TASK_IS_EMPTY(task) &&
!(task->flags & (RSPAMD_TASK_FLAG_LEARN_SPAM | RSPAMD_TASK_FLAG_LEARN_HAM))) {