code wiki / (root) / nx_ferment_kinetics_test.nx

nx_ferment_kinetics_test.nx source

↩ module page · 52 lines · 2408 B

1// nx_ferment_kinetics_test.nx -- smoke for nx_ferment_kinetics (R3). 2// 3// Proves the predictive science, MEASURED not asserted: 4// - temperature factor is monotone in T (1-4) 5// - the ferment sets within the horizon (5-6) 6// - WARMER SETS FASTER: set(43) < set(30) < set(20) (7-8) -- the Q10 claim 7// - science -> safety link: 43 C acidifies inside the 48 h window (9) 8// while 15 C does NOT (10), and R0 agrees on both batches (11-12) 9// Exit code = failed assertion number; 0 = all pass. 10 11import "nx_ferment_safety.nx" 12import "nx_ferment_kinetics.nx" 13 14func main() -> i64 { 15 // --- temperature factor monotone (Q10) --- 16 let f43: i64 = nx_ferment_kinetics_temp_factor_q10(43) 17 let f30: i64 = nx_ferment_kinetics_temp_factor_q10(30) 18 let f20: i64 = nx_ferment_kinetics_temp_factor_q10(20) 19 if f43 <= 1024 { return 1 } // warmer than ref -> faster 20 if f20 >= 1024 { return 2 } // cooler than ref -> slower 21 if f43 <= f30 { return 3 } 22 if f30 <= f20 { return 4 } 23 24 // --- predicted set-times --- 25 let s43: i64 = nx_ferment_kinetics_set_time(43) 26 let s30: i64 = nx_ferment_kinetics_set_time(30) 27 let s20: i64 = nx_ferment_kinetics_set_time(20) 28 if s43 <= 0 { return 5 } // it sets 29 if s20 <= 0 { return 6 } // even cool sets within the horizon 30 if s43 >= s30 { return 7 } // WARMER SETS FASTER 31 if s30 >= s20 { return 8 } 32 33 // --- science -> safety: 43 C makes the 48 h window, 15 C does not --- 34 if s43 >= 48 { return 9 } 35 let s15: i64 = nx_ferment_kinetics_set_time(15) 36 if s15 <= 48 { return 10 } // too cold -> misses the window 37 38 // --- R0 agrees: predicted 43 C batch is SAFE --- 39 let env: *NxFermentSafetyEnvelope = nx_ferment_safety_envelope_default(1) 40 let nolog: *NxFermentReadingLog = (0) as *NxFermentReadingLog 41 let ph43: i64 = nx_ferment_kinetics_ph_at(43, 48) 42 if nx_ferment_validate(env, NX_FK_DAIRY_CULTURED, NX_OX_ANAEROBIC, 43 43000, ph43 as nx_size, 0, 48, 0, nolog, 48) != NX_FS_OK { return 11 } 44 45 // --- R0 agrees: predicted 15 C anaerobic batch is UNSAFE (botulism: 46 // never acidified within the window) --- 47 let ph15: i64 = nx_ferment_kinetics_ph_at(15, 48) 48 if nx_ferment_validate(env, NX_FK_DAIRY_CULTURED, NX_OX_ANAEROBIC, 49 15000, ph15 as nx_size, 0, 48, 0, nolog, 48) != NX_FS_REFUSED_BOTULISM_PH { return 12 } 50 51 return 0 52}