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}