comparison mod_report_affiliations/traits.lib.lua @ 6030:e905ef16efb7

mod_report_affiliations: New module for XEP-0489: Reporting Account Affiliations
author Matthew Wild <mwild1@gmail.com>
date Fri, 22 Nov 2024 19:05:49 +0000
parents
children
comparison
equal deleted inserted replaced
6029:cc665f343690 6030:e905ef16efb7
1 local known_traits = {};
2
3 local function trait_added(event)
4 local trait = event.item;
5 local name = trait.name;
6 if known_traits[name] then return; end
7
8 known_traits[name] = trait.probabilities;
9 end
10
11 local function trait_removed(event)
12 local trait = event.item;
13 known_traits[trait.name] = nil;
14 end
15
16 module:handle_items("account-trait", trait_added, trait_removed);
17
18 local function bayes_probability(prior, prob_given_true, prob_given_false)
19 local numerator = prob_given_true * prior;
20 local denominator = numerator + prob_given_false * (1 - prior);
21 return numerator / denominator;
22 end
23
24 local function prob_is_bad(traits, prior)
25 prior = prior or 0.50;
26
27 for trait, state in pairs(traits) do
28 local probabilities = known_traits[trait];
29 if probabilities then
30 if state then
31 prior = bayes_probability(
32 prior,
33 probabilities.prob_bad_true,
34 probabilities.prob_bad_false
35 );
36 else
37 prior = bayes_probability(
38 prior,
39 1 - probabilities.prob_bad_true,
40 1 - probabilities.prob_bad_false
41 );
42 end
43 end
44 end
45
46 return prior;
47 end
48
49 local function get_probability_bad(username, prior)
50 local user_traits = {};
51 module:fire_event("get-account-traits", { username = username, host = module.host, traits = user_traits });
52 local result = prob_is_bad(user_traits, prior);
53 return result;
54 end
55
56 return {
57 get_probability_bad = get_probability_bad;
58 };