nx_drug_pathway_test.nx source
↩ module page · 151 lines · 8683 B
1// nx_drug_pathway_test.nx -- gate for the investigational-drug rung.
2// T4 is the strategic one: Australia is the cheapest place to run Phase 1,
3// computed rather than asserted, because the CTN notification scheme plus a
4// 43.5% REFUNDABLE offset beats every other site. T6 is the bigger lever --
5// an existing human record removes far more cost than any geography can.
6// expect_exit: 0 license_tier: ORIGINAL
7import "nx_syscalls.nx"
8import "nx_drug_pathway.nx"
9
10func t_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
11func t_putn(v: i64) -> i64 { let bb: *u8 = sys_mmap(28); var m: i64 = v; if m < 0 { m = 0 - m; sys_write(1, "-" as *u8, 1) } let t: *u8 = sys_mmap(28); var k: i64 = 0; if m == 0 { t[0] = 48 as u8; k = 1 } while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } var i: i64 = 0; while i < k { bb[i] = t[k - 1 - i]; i = i + 1 } sys_write(1, bb, k); return 0 }
12
13func main() -> i64 {
14 var pass: i64 = 0
15 var total: i64 = 0
16
17 // --- T1 the full programme, honestly sized ---
18 total = total + 1
19 let cost: i64 = dp_full_cost_k()
20 let months: i64 = dp_full_months()
21 let years: i64 = months / 12
22 t_puts("T1 full programme = $" as *u8); t_putn(cost); t_puts("k over " as *u8); t_putn(months); t_puts(" months (" as *u8); t_putn(years); t_puts(" years): " as *u8)
23 var ok1: i64 = 1
24 if cost != 120500 { ok1 = 0 }
25 if months != 108 { ok1 = 0 }
26 if years != 9 { ok1 = 0 }
27 if ok1 == 1 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) }
28
29 // --- T2 Phase 3 dominates: it alone is most of the budget ---
30 total = total + 1
31 let p3: i64 = dp_phase_cost_k(DP_PHASE3)
32 let half: i64 = cost / 2
33 t_puts("T2 Phase 3 = $" as *u8); t_putn(p3); t_puts("k of $" as *u8); t_putn(cost); t_puts("k total (over half): " as *u8)
34 if p3 > half { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) }
35
36 // --- T3 authorisation clocks: CTN notification is the fastest start ---
37 total = total + 1
38 let d_us: i64 = dp_authorisation_days(DP_SITE_US)
39 let d_eu: i64 = dp_authorisation_days(DP_SITE_EU)
40 let d_au: i64 = dp_authorisation_days(DP_SITE_AUSTRALIA)
41 t_puts("T3 days to dose US=" as *u8); t_putn(d_us); t_puts(" EU=" as *u8); t_putn(d_eu); t_puts(" AU=" as *u8); t_putn(d_au); t_puts(": " as *u8)
42 var ok3: i64 = 1
43 if d_au >= d_us { ok3 = 0 }
44 if d_us >= d_eu { ok3 = 0 }
45 if ok3 == 1 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) }
46
47 // --- T4 THE LEGITIMATE "GO ABROAD" ANSWER, COMPUTED ---
48 // Australia is cheapest for Phase 1 because a 43.5% REFUNDABLE offset is
49 // cash back, not a deduction -- decisive for a pre-revenue developer.
50 total = total + 1
51 let best: i64 = dp_cheapest_site(DP_PHASE1)
52 let c_us: i64 = dp_phase_cost_at_site_k(DP_PHASE1, DP_SITE_US)
53 let c_au: i64 = dp_phase_cost_at_site_k(DP_PHASE1, DP_SITE_AUSTRALIA)
54 let c_uk: i64 = dp_phase_cost_at_site_k(DP_PHASE1, DP_SITE_UK)
55 t_puts("T4 cheapest Phase 1 site = " as *u8); t_puts(dp_site_name(best)); t_puts(" ; net cost US=$" as *u8); t_putn(c_us); t_puts("k UK=$" as *u8); t_putn(c_uk); t_puts("k AU=$" as *u8); t_putn(c_au); t_puts("k: " as *u8)
56 var ok4: i64 = 1
57 if best != DP_SITE_AUSTRALIA { ok4 = 0 }
58 if c_au >= c_us { ok4 = 0 }
59 if c_au >= c_uk { ok4 = 0 }
60 if ok4 == 1 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) }
61
62 // --- T5 the rebate is what does it: gross vs net ---
63 total = total + 1
64 let reb: i64 = dp_rd_rebate_permil(DP_SITE_AUSTRALIA)
65 let reb_us: i64 = dp_rd_rebate_permil(DP_SITE_US)
66 let gross_au: i64 = dp_phase_cost_k(DP_PHASE1) * dp_cost_permil_of_us(DP_SITE_AUSTRALIA) / 1000
67 t_puts("T5 AU rebate=" as *u8); t_putn(reb); t_puts(" permil (US=" as *u8); t_putn(reb_us); t_puts(") gross AU=$" as *u8); t_putn(gross_au); t_puts("k net=$" as *u8); t_putn(c_au); t_puts("k: " as *u8)
68 var ok5: i64 = 1
69 if reb != 435 { ok5 = 0 }
70 if reb_us != 0 { ok5 = 0 }
71 if c_au >= gross_au { ok5 = 0 }
72 if ok5 == 1 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) }
73
74 // --- T6 PRIOR HUMAN DATA IS THE BIGGER LEVER, BY FAR ---
75 // Geography shaves a phase; a published clinical record removes phases.
76 total = total + 1
77 let none_k: i64 = dp_programme_cost_k(DP_DATA_NONE)
78 let p1_k: i64 = dp_programme_cost_k(DP_DATA_PHASE1)
79 let p2_k: i64 = dp_programme_cost_k(DP_DATA_PHASE2)
80 let save1: i64 = dp_reliance_saving_k(DP_DATA_PHASE1)
81 let save2: i64 = dp_reliance_saving_k(DP_DATA_PHASE2)
82 t_puts("T6 programme cost: no human data=$" as *u8); t_putn(none_k); t_puts("k, Phase1 exists=$" as *u8); t_putn(p1_k); t_puts("k, Phase2 exists=$" as *u8); t_putn(p2_k); t_puts("k ; saved " as *u8); t_putn(save1); t_puts("/" as *u8); t_putn(save2); t_puts(": " as *u8)
83 var ok6: i64 = 1
84 if p1_k >= none_k { ok6 = 0 }
85 if p2_k >= p1_k { ok6 = 0 }
86 if save1 != 3500 { ok6 = 0 }
87 if save2 != 21500 { ok6 = 0 }
88 if ok6 == 1 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) }
89
90 // --- T7 reliance NEVER removes Phase 3 or the review ---
91 total = total + 1
92 let need3: i64 = dp_phase_required(DP_PHASE3, DP_DATA_PHASE2)
93 let needr: i64 = dp_phase_required(DP_REVIEW, DP_DATA_PHASE2)
94 let needpre: i64 = dp_phase_required(DP_PRECLINICAL, DP_DATA_PHASE2)
95 t_puts("T7 with Phase 2 data still required: Phase3=" as *u8); t_putn(need3); t_puts(" review=" as *u8); t_putn(needr); t_puts(" preclinical/CMC=" as *u8); t_putn(needpre); t_puts(" want all 1: " as *u8)
96 var ok7: i64 = 1
97 if need3 != 1 { ok7 = 0 }
98 if needr != 1 { ok7 = 0 }
99 if needpre != 1 { ok7 = 0 }
100 if ok7 == 1 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) }
101
102 // --- T8 reliance availability keys off human data, not enthusiasm ---
103 total = total + 1
104 let r_none: i64 = dp_reliance_available(DP_DATA_NONE)
105 let r_p1: i64 = dp_reliance_available(DP_DATA_PHASE1)
106 let r_p2: i64 = dp_reliance_available(DP_DATA_PHASE2)
107 t_puts("T8 reliance available: rodent-only=" as *u8); t_putn(r_none); t_puts(" human-safety=" as *u8); t_putn(r_p1); t_puts(" human-efficacy=" as *u8); t_putn(r_p2); t_puts(" want 0/1/1: " as *u8)
108 var ok8: i64 = 1
109 if r_none != 0 { ok8 = 0 }
110 if r_p1 != 1 { ok8 = 0 }
111 if r_p2 != 1 { ok8 = 0 }
112 if ok8 == 1 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) }
113
114 // --- T9 even the shortest path is years, not months ---
115 total = total + 1
116 let m_best: i64 = dp_programme_months(DP_DATA_PHASE2)
117 let y_best: i64 = m_best / 12
118 t_puts("T9 shortest programme (Phase 2 data in hand) = " as *u8); t_putn(m_best); t_puts(" months = " as *u8); t_putn(y_best); t_puts(" years: " as *u8)
119 var ok9: i64 = 1
120 if m_best < 48 { ok9 = 0 }
121 if y_best < 4 { ok9 = 0 }
122 if ok9 == 1 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) }
123
124 // --- T10 THE HARD LIMITS, as functions not comments ---
125 total = total + 1
126 let dtc: i64 = dp_dtc_without_approval_anywhere()
127 let exp: i64 = dp_foreign_approval_licenses_export()
128 let rul: i64 = dp_research_use_label_changes_status()
129 t_puts("T10 consumer sale without approval anywhere=" as *u8); t_putn(dtc); t_puts(" foreign approval licenses export=" as *u8); t_putn(exp); t_puts(" 'research use only' changes status=" as *u8); t_putn(rul); t_puts(" want 0/0/0: " as *u8)
130 var ok10: i64 = 1
131 if dtc != 0 { ok10 = 0 }
132 if exp != 0 { ok10 = 0 }
133 if rul != 0 { ok10 = 0 }
134 if ok10 == 1 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) }
135
136 // --- T11 fail-closed on unknown phases and sites ---
137 total = total + 1
138 let bp: i64 = dp_phase_cost_k(99)
139 let bs: i64 = dp_authorisation_days(99)
140 let bc: i64 = dp_phase_cost_at_site_k(DP_PHASE1, 99)
141 t_puts("T11 unknown phase=" as *u8); t_putn(bp); t_puts(" unknown site days=" as *u8); t_putn(bs); t_puts(" cost at unknown site=" as *u8); t_putn(bc); t_puts(" want all -1: " as *u8)
142 var ok11: i64 = 1
143 if bp != DP_INVALID { ok11 = 0 }
144 if bs != DP_INVALID { ok11 = 0 }
145 if bc != DP_INVALID { ok11 = 0 }
146 if ok11 == 1 { pass = pass + 1; t_puts("PASS\n" as *u8) } else { t_puts("FAIL\n" as *u8) }
147
148 t_puts("DRUG-PATHWAY-GATE passed " as *u8); t_putn(pass); t_puts("/" as *u8); t_putn(total)
149 if pass == total { t_puts(" verdict=GREEN\n" as *u8); sys_exit(0); return 0 }
150 t_puts(" verdict=RED\n" as *u8); sys_exit(1); return 1
151}