code wiki / (root) / nx_drug_pathway_test.nx

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}