code wiki / _hdl_build / nx_ad_reach.nx
nx_ad_reach.nx source
↩ module page · 44 lines · 2248 B
1// nx_ad_reach.nx -- LIB (PURE): HONEST BILLABLE REACH. The ONLY impression count an advertiser is
2// charged for = impressions that are BOTH genuinely SEEN (viewable, MRC >=50%/>=1s) AND VALID (not
3// bot / invalid traffic). This unifies the operator's two laws in the MONEY path: "no fake impressions
4// like Google/others" (viewability) + "filter the bot/useless traffic for clients" (IVT). Composes
5// nx_ad_view + nx_ad_botfilter (DRY rule 15); both are aggregate, so this can never become per-user.
6//
7// PRIVACY BY CONSTRUCTION: combined bucket = [viewed, dwell_ms, ua_class, src_class, js_class, n] --
8// all AGGREGATE class codes + a count; NO visitor id / IP / fingerprint. license_tier: ORIGINAL
9import "nx_ad_view.nx"
10import "nx_ad_botfilter.nx"
11import "nx_syscalls.nx"
12
13// 1 iff this impression is BILLABLE: genuinely seen AND human (non-bot). Either failure -> $0.
14func ar_billable_one(viewed: i64, dwell_ms: i64, ua: i64, src: i64, js: i64, min_ms: i64, rules: *i64, nrules: i64) -> i64 {
15 if av_viewable(viewed, dwell_ms, min_ms) != 1 { return 0 } // not genuinely seen -> not billable
16 if bf_invalid(ua, src, js, rules, nrules) == 1 { return 0 } // bot / invalid traffic -> not billable
17 return 1
18}
19
20// tally the honesty FUNNEL over m buckets [viewed, dwell_ms, ua, src, js, n]: served (all) -> viewable
21// (seen) -> BILLABLE (seen AND human). Writes served->*osv, viewable->*ovw, billable->*obill; returns
22// billable (the charge basis). The meter's reach goal should bill *obill, never *osv.
23func ar_tally(ev: *i64, m: i64, min_ms: i64, rules: *i64, nrules: i64, osv: *i64, ovw: *i64, obill: *i64) -> i64 {
24 var sv: i64 = 0
25 var vw: i64 = 0
26 var bill: i64 = 0
27 var b: i64 = 0
28 while b < m {
29 let viewed: i64 = ev[b * 6]
30 let dwell: i64 = ev[b * 6 + 1]
31 let ua: i64 = ev[b * 6 + 2]
32 let src: i64 = ev[b * 6 + 3]
33 let js: i64 = ev[b * 6 + 4]
34 let cnt: i64 = ev[b * 6 + 5]
35 sv = sv + cnt
36 if av_viewable(viewed, dwell, min_ms) == 1 { vw = vw + cnt }
37 if ar_billable_one(viewed, dwell, ua, src, js, min_ms, rules, nrules) == 1 { bill = bill + cnt }
38 b = b + 1
39 }
40 osv[0] = sv
41 ovw[0] = vw
42 obill[0] = bill
43 return bill
44}