code wiki / (root) / nx_arousal.nx

nx_arousal.nx source

↩ module page · 213 lines · 10579 B

1// nx_arousal.nx -- CLI over nx_arousal_lib (simulate verbs). Holds NO math of its own: all 2// physiology lives in the lib so the fit organ shares one substrate and cannot drift from it. 3// Every constant is conf-bound (arousal_params.conf, rule 11); compiled defaults are the fallback. 4// 5// usage: nx_arousal traj <sex0m1f> <t_ms> <stim> <ses> <sis1> <sis2> 6// nx_arousal contract <type1|2|3> <n> <total> 7// nx_arousal ct <vel_cms_x100> 8// nx_arousal residual <tau_ms> <drive> <t1> <o1> <t2> <o2> 9// nx_arousal selftest 10// license_tier: ORIGINAL expect_exit: 0 11import "nx_arousal_lib.nx" 12const K_MAGIC_32100: i64 = 32100 13const K_MAGIC_1800: i64 = 1800 14const K_MAGIC_2500: i64 = 2500 15const K_MAGIC_185000: i64 = 185000 16const K_MAGIC_210000: i64 = 210000 17const K_MAGIC_15000: i64 = 15000 18const K_MAGIC_1200000: i64 = 1200000 19const K_MAGIC_12345: i64 = 12345 20const K_MAGIC_3000: i64 = 3000 21 22func main(argc: i64, argv: *i64) -> i64 { 23 if argc < 2 { a_puts("REFUSED reason=no_verb\n" as *u8); return 2 } 24 let verb: *u8 = argv[1] as *u8 25 let cl: *i64 = sys_mmap(16) as *i64 26 cl[0] = 0 27 let cbuf: *u8 = sys_read_file("arousal_params.conf" as *u8, cl) 28 let cn: i64 = cl[0] 29 let tbase: i64 = a_conf(cbuf, cn, "t_base_mc" as *u8, K_MAGIC_32100) 30 let tspan: i64 = a_conf(cbuf, cn, "dt_max_mc" as *u8, K_MAGIC_1800) 31 let tfast: i64 = a_conf(cbuf, cn, "tau_fast_ms" as *u8, K_MAGIC_2500) 32 let tsm: i64 = a_conf(cbuf, cn, "tau_slow_m_ms" as *u8, K_MAGIC_185000) 33 let tsf: i64 = a_conf(cbuf, cn, "tau_slow_f_ms" as *u8, K_MAGIC_210000) 34 let hb: i64 = a_conf(cbuf, cn, "hr_base" as *u8, 70) 35 let hs: i64 = a_conf(cbuf, cn, "hr_span" as *u8, 110) 36 let rb: i64 = a_conf(cbuf, cn, "rr_base" as *u8, 12) 37 let rs: i64 = a_conf(cbuf, cn, "rr_span" as *u8, 28) 38 let bb: i64 = a_conf(cbuf, cn, "bp_base" as *u8, 120) 39 let bs: i64 = a_conf(cbuf, cn, "bp_span" as *u8, 21) 40 let bpl: i64 = a_conf(cbuf, cn, "bp_plateau_drive" as *u8, 700) 41 let cm: i64 = a_conf(cbuf, cn, "coup_m" as *u8, 900) 42 let cf: i64 = a_conf(cbuf, cn, "coup_f" as *u8, 260) 43 let c0: i64 = a_conf(cbuf, cn, "c0_ms" as *u8, 800) 44 let csl: i64 = a_conf(cbuf, cn, "cslope_ms" as *u8, 100) 45 let fth: i64 = a_conf(cbuf, cn, "flush_thresh" as *u8, 600) 46 47 if verb[0] == (116 as u8) { 48 if verb[1] == (114 as u8) { 49 if argc < 8 { a_puts("REFUSED reason=traj_needs_6_args\n" as *u8); return 2 } 50 let sex: i64 = a_atoi(argv[2] as *u8) 51 let t: i64 = a_atoi(argv[3] as *u8) 52 let stim: i64 = a_atoi(argv[4] as *u8) 53 let ses: i64 = a_atoi(argv[5] as *u8) 54 let s1: i64 = a_atoi(argv[6] as *u8) 55 let s2: i64 = a_atoi(argv[7] as *u8) 56 if t < 0 { a_puts("REFUSED reason=negative_time\n" as *u8); return 3 } 57 if stim < 0 { a_puts("REFUSED reason=negative_stim\n" as *u8); return 3 } 58 var tau: i64 = tsm 59 var coup: i64 = cm 60 if sex == 1 { tau = tsf; coup = cf } 61 let dr: i64 = a_drive(stim, ses, s1, s2) 62 let ps: i64 = a_perf(t, dr, tau) 63 let pf: i64 = a_perf(t, dr, tfast) 64 a_puts("ok t=" as *u8); a_putn(t) 65 a_puts(" drive=" as *u8); a_putn(dr) 66 a_puts(" pfast=" as *u8); a_putn(pf) 67 a_puts(" pslow=" as *u8); a_putn(ps) 68 a_puts(" temp_mc=" as *u8); a_putn(a_temp(ps, tbase, tspan)) 69 a_puts(" hr=" as *u8); a_putn(a_hr(dr, hb, hs)) 70 a_puts(" rr=" as *u8); a_putn(a_rr(dr, rb, rs)) 71 a_puts(" bp=" as *u8); a_putn(a_bp(dr, bb, bs, bpl)) 72 a_puts(" subj=" as *u8); a_putn(a_subj(ps, coup)) 73 a_puts(" flush=" as *u8); a_putn(a_flush(ps, fth, 1000)) 74 a_puts("\n" as *u8) 75 return 0 76 } 77 } 78 if verb[0] == (99 as u8) { 79 if verb[1] == (111 as u8) { 80 if argc < 5 { a_puts("REFUSED reason=contract_needs_3_args\n" as *u8); return 2 } 81 let ty: i64 = a_atoi(argv[2] as *u8) 82 let n: i64 = a_atoi(argv[3] as *u8) 83 let tot: i64 = a_atoi(argv[4] as *u8) 84 // Bohlen type III: orgasm reported with NO regular contraction train (2 of 11 women). 85 // Must be representable -- contractions are not definitional of orgasm. 86 if ty == 3 { a_puts("REFUSED reason=no_contraction_train type=3\n" as *u8); return 4 } 87 if ty < 1 { a_puts("REFUSED reason=bad_type\n" as *u8); return 3 } 88 if ty > 3 { a_puts("REFUSED reason=bad_type\n" as *u8); return 3 } 89 if n < 0 { a_puts("REFUSED reason=negative_index\n" as *u8); return 3 } 90 if tot <= 0 { a_puts("REFUSED reason=nonpositive_total\n" as *u8); return 3 } 91 if n > tot { a_puts("REFUSED reason=index_past_total\n" as *u8); return 3 } 92 a_puts("ok n=" as *u8); a_putn(n) 93 a_puts(" interval_ms=" as *u8); a_putn(a_interval(n, c0, csl)) 94 a_puts(" amp=" as *u8); a_putn(a_amp(n, tot)) 95 a_puts("\n" as *u8) 96 return 0 97 } 98 if verb[1] == (116 as u8) { 99 if argc < 3 { a_puts("REFUSED reason=ct_needs_velocity\n" as *u8); return 2 } 100 let v: i64 = a_atoi(argv[2] as *u8) 101 if v <= 0 { a_puts("REFUSED reason=nonpositive_velocity\n" as *u8); return 3 } 102 a_puts("ok v=" as *u8); a_putn(v) 103 a_puts(" ct=" as *u8); a_putn(a_ct(v, 300)) 104 a_puts("\n" as *u8) 105 return 0 106 } 107 } 108 if verb[0] == (114 as u8) { 109 if argc < 8 { a_puts("REFUSED reason=residual_needs_6_args\n" as *u8); return 2 } 110 let tau: i64 = a_atoi(argv[2] as *u8) 111 let dr: i64 = a_atoi(argv[3] as *u8) 112 let t1: i64 = a_atoi(argv[4] as *u8) 113 let o1: i64 = a_atoi(argv[5] as *u8) 114 let t2: i64 = a_atoi(argv[6] as *u8) 115 let o2: i64 = a_atoi(argv[7] as *u8) 116 if tau <= 0 { a_puts("REFUSED reason=nonpositive_tau\n" as *u8); return 3 } 117 let m1: i64 = a_perf(t1, dr, tau) 118 let m2: i64 = a_perf(t2, dr, tau) 119 let res: i64 = a_residual(tau, dr, t1, o1, t2, o2) 120 if res >= A_RESMAX { a_puts("REFUSED reason=degenerate_residual\n" as *u8); return 5 } 121 a_puts("ok tau=" as *u8); a_putn(tau) 122 a_puts(" m1=" as *u8); a_putn(m1) 123 a_puts(" m2=" as *u8); a_putn(m2) 124 a_puts(" residual=" as *u8); a_putn(res) 125 a_puts("\n" as *u8) 126 return 0 127 } 128 // male: tumescence / rigidity / RigiScan potency criteria / refractory suppression. 129 if verb[0] == (109 as u8) { 130 if argc < 4 { a_puts("REFUSED reason=male_needs_2_args\n" as *u8); return 2 } 131 let mt: i64 = a_atoi(argv[2] as *u8) 132 let mdr: i64 = a_atoi(argv[3] as *u8) 133 var since: i64 = 0 - 1 134 if argc >= 5 { since = a_atoi(argv[4] as *u8) } 135 if mt < 0 { a_puts("REFUSED reason=negative_time\n" as *u8); return 3 } 136 if mdr < 0 { a_puts("REFUSED reason=negative_drive\n" as *u8); return 3 } 137 if mdr > 1000 { a_puts("REFUSED reason=drive_over_permil\n" as *u8); return 3 } 138 let tau_t: i64 = a_conf(cbuf, cn, "tau_tume_ms" as *u8, K_MAGIC_15000) 139 let rth: i64 = a_conf(cbuf, cn, "rig_thresh" as *u8, 550) 140 let tipf: i64 = a_conf(cbuf, cn, "tip_factor" as *u8, 780) 141 let taur: i64 = a_conf(cbuf, cn, "tau_refr_ms" as *u8, K_MAGIC_1200000) 142 var eff: i64 = mdr 143 var refr: i64 = 0 144 if since >= 0 { 145 refr = a_refractory(since, taur) 146 eff = (mdr * (1000 - refr)) / 1000 147 } 148 let tume: i64 = a_perf(mt, eff, tau_t) 149 let rb: i64 = a_rigidity(tume, rth) 150 let rt: i64 = a_rigidity_tip(rb, tipf) 151 // the two clinical criteria DISAGREE over a real band -- both are reported, never merged 152 var p60: i64 = 0 153 if rt >= 600 { p60 = 1 } 154 var p70: i64 = 0 155 if rt >= 700 { p70 = 1 } 156 a_puts("ok t=" as *u8); a_putn(mt) 157 a_puts(" eff_drive=" as *u8); a_putn(eff) 158 a_puts(" tume=" as *u8); a_putn(tume) 159 a_puts(" rig_base=" as *u8); a_putn(rb) 160 a_puts(" rig_tip=" as *u8); a_putn(rt) 161 a_puts(" potent60=" as *u8); a_putn(p60) 162 a_puts(" potent70=" as *u8); a_putn(p70) 163 a_puts(" refractory=" as *u8); a_putn(refr) 164 a_puts("\n" as *u8) 165 return 0 166 } 167 // gen: emit a synthetic "t_ms obs_permil" trajectory at a KNOWN tau/drive. 168 // This is the ground-truth source for fitter recovery tests -- the fit gate must be able to 169 // generate its own truth rather than trusting hand-copied constants. 170 if verb[0] == (103 as u8) { 171 if argc < 6 { a_puts("REFUSED reason=gen_needs_4_args\n" as *u8); return 2 } 172 let gtau: i64 = a_atoi(argv[2] as *u8) 173 let gdr: i64 = a_atoi(argv[3] as *u8) 174 let gstep: i64 = a_atoi(argv[4] as *u8) 175 let gcnt: i64 = a_atoi(argv[5] as *u8) 176 if gtau <= 0 { a_puts("REFUSED reason=nonpositive_tau\n" as *u8); return 3 } 177 if gdr <= 0 { a_puts("REFUSED reason=nonpositive_drive\n" as *u8); return 3 } 178 if gdr > 1000 { a_puts("REFUSED reason=drive_over_permil\n" as *u8); return 3 } 179 if gstep <= 0 { a_puts("REFUSED reason=nonpositive_step\n" as *u8); return 3 } 180 if gcnt <= 0 { a_puts("REFUSED reason=nonpositive_count\n" as *u8); return 3 } 181 var gnoise: i64 = 0 182 var gseed: i64 = K_MAGIC_12345 183 if argc >= 7 { gnoise = a_atoi(argv[6] as *u8) } 184 if argc >= 8 { gseed = a_atoi(argv[7] as *u8) } 185 if gnoise < 0 { a_puts("REFUSED reason=negative_noise\n" as *u8); return 3 } 186 if gnoise > 1000 { a_puts("REFUSED reason=noise_over_permil\n" as *u8); return 3 } 187 var gi: i64 = 1 188 var gs: i64 = gseed 189 while gi <= gcnt { 190 let gt: i64 = gstep * gi 191 var gv: i64 = a_perf(gt, gdr, gtau) 192 if gnoise > 0 { 193 gs = a_lcg(gs) 194 let jit: i64 = (gs % (2 * gnoise + 1)) - gnoise 195 gv = gv + jit 196 if gv < 0 { gv = 0 } 197 if gv > 1000 { gv = 1000 } 198 } 199 a_putn(gt); a_puts(" " as *u8); a_putn(gv); a_puts("\n" as *u8) 200 gi = gi + 1 201 } 202 return 0 203 } 204 if verb[0] == (115 as u8) { 205 a_puts("AROUSAL-SELFTEST conf_bytes=" as *u8); a_putn(cn) 206 a_puts(" ct300=" as *u8); a_putn(a_ct(300, 300)) 207 a_puts(" ct3000=" as *u8); a_putn(a_ct(K_MAGIC_3000, 300)) 208 a_puts("\n" as *u8) 209 return 0 210 } 211 a_puts("REFUSED reason=unknown_verb\n" as *u8) 212 return 2 213}