nx_taste_transduce_test.nx source
↩ module page · 56 lines · 2364 B
1// nx_taste_transduce_test.nx -- smoke for nx_taste_transduce (T0).
2//
3// Proves real receptor transduction + the MEASURED EXCEED over a static/
4// linear taste score:
5// - monotone dose-response, half-max at K (1-4)
6// - SATURATION: 8x stimulus -> < 2x perception (5), and far below the
7// linear prediction (6) -- the exceed a static score cannot make
8// - high-dose saturation toward Imax (7)
9// - THRESHOLD gating: sub-threshold registers 0 (8-9)
10// - 1000x sensitivity range: bitter detected where sweet is not (10-11)
11// - cooperative (h=2) half-max at K for bitter (12-13)
12// Exit code = failed assertion number; 0 = all pass.
13
14import "nx_syscalls.nx"
15import "nx_taste_transduce.nx"
16
17func main() -> i64 {
18 let sweet: *NxTasteReceptor = nx_taste_receptor(NX_TQ_SWEET)
19 let bitter: *NxTasteReceptor = nx_taste_receptor(NX_TQ_BITTER)
20
21 // --- monotone dose-response ---
22 if nx_taste_response_milli(sweet, 60000) <= nx_taste_response_milli(sweet, 30000) { return 1 }
23 if nx_taste_response_milli(sweet, 30000) <= nx_taste_response_milli(sweet, 10000) { return 2 }
24
25 // --- half-max at K = 30000 (h=1 -> Imax/2 = 500) ---
26 let rk: i64 = nx_taste_response_milli(sweet, 30000)
27 if rk < 490 { return 3 }
28 if rk > 510 { return 4 }
29
30 // --- SATURATION: 8x the stimulus (K -> 8K) gives < 2x perception ---
31 let r8: i64 = nx_taste_response_milli(sweet, 240000)
32 if r8 >= rk * 2 { return 5 }
33
34 // --- MEASURED EXCEED vs a linear/static score: a linear model would
35 // predict 8x the at-K response; Hill gives less than HALF of that ---
36 let lin_pred: i64 = rk * 8
37 if r8 >= lin_pred / 2 { return 6 }
38
39 // --- high dose saturates toward Imax (100x K) ---
40 if nx_taste_response_milli(sweet, 3000000) < 900 { return 7 }
41
42 // --- THRESHOLD gating: sub-threshold registers as not-detected ---
43 if nx_taste_detectable(sweet, 100) != 0 { return 8 }
44 if nx_taste_detectable(sweet, 10000) != 1 { return 9 }
45
46 // --- 1000x sensitivity range: bitter detected at 10 uM, sweet not ---
47 if nx_taste_detectable(bitter, 10) != 1 { return 10 }
48 if nx_taste_detectable(sweet, 10) != 0 { return 11 }
49
50 // --- cooperative receptor (h=2): half-max at K=25 -> 500 ---
51 let bk: i64 = nx_taste_response_milli(bitter, 25)
52 if bk < 490 { return 12 }
53 if bk > 510 { return 13 }
54
55 return 0
56}