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}