aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@rspamd.com>2024-04-08 19:05:22 +0100
committerVsevolod Stakhov <vsevolod@rspamd.com>2024-04-08 19:05:22 +0100
commitd1e16266e182057f68c70ec9c824f1c8aede3f3e (patch)
tree05450b2fd84e02ebf8c5fa11d0170857dde7e60f /src
parentae103665a2ce2321f109a21a7534db6629a6132b (diff)
downloadrspamd-d1e16266e182057f68c70ec9c824f1c8aede3f3e.tar.gz
rspamd-d1e16266e182057f68c70ec9c824f1c8aede3f3e.zip
[Project] Write a function to adjust grow factor properly
Diffstat (limited to 'src')
-rw-r--r--src/libmime/scan_result.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/libmime/scan_result.c b/src/libmime/scan_result.c
index 54d6d5841..5324d6082 100644
--- a/src/libmime/scan_result.c
+++ b/src/libmime/scan_result.c
@@ -1078,3 +1078,45 @@ rspamd_find_metric_result(struct rspamd_task *task,
return NULL;
}
+
+void rspamd_task_result_adjust_grow_factor(struct rspamd_task *task,
+ struct rspamd_scan_result *result,
+ double grow_factor)
+{
+ const char *kk;
+ struct rspamd_symbol_result *res;
+ 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) {
+
+
+ kh_foreach(result->symbols, kk, res, {
+ if (res->score > 0) {
+ double mult = 1.0 - grow_factor;
+ if (max_limit > 0 && !isnan(res->score)) {
+ mult *= res->score / max_limit;
+ final_grow_factor *= 1.0 + mult;
+ }
+ }
+ });
+
+ if (final_grow_factor > grow_factor) {
+ 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) {
+ res->score *= final_grow_factor;
+ }
+ });
+ }
+ }
+}