nx_ice_stabiliser.nx
buildroot/runtime/nx_ice_stabiliser.nx
about
nx_ice_stabiliser.nx -- THE HYDROCOLLOID TERM, and the reason it is much
smaller than this lane assumed.
===== WHY THIS EXISTS ============================================
nx_ice_recrystal models Ostwald ripening and nx_ice_distribution derives
the geometry, but neither knows what a stabiliser does. The gap ledger
named this four separate times, each time in the same words: "no
stabiliser/hydrocolloid term, and locust bean gum is exactly how industry
slows this mechanism".
**THAT SENTENCE CONTAINS TWO ERRORS AND THIS ORGAN CORRECTS BOTH.**
ERROR 1 -- THE REFERENCE PRODUCT DOES NOT USE LBG. Ben & Jerry's Vanilla
declares GUAR (primary) and CARRAGEENAN (secondary). Haagen-Dazs Vanilla
declares no stabiliser at all. The lane had been planning to model the
competitor's lever using a gum the competitor does not buy.
ERROR 2 -- AND THE LARGER ONE: **IN FINISHED ICE CREAM THE EFFECT IS NOT
STATISTICALLY SIGNIFICANT.** Flores & Goff 1999 (JDS 82:1408-1415) cycled
full ice cream at 0.2% stabiliser and every stabilised sample shared
significance letter "a" with the unstabilised control. The mean X50
values LOOK like a 15-25% improvement. The study did not find one.
★★★A DIFFERENCE VISIBLE IN A TABLE IS NOT A DIFFERENCE THE STUDY FOUND.
This organ therefore stores the Flores means AND the significance verdict
together, and stab_flores_difference_is_significant() returns 0 as a
FUNCTION, so no downstream planner can read the means alone and price a
lever that the evidence does not support.
===== WHERE THE EFFECT IS REAL ===================================
In MODEL SOLUTIONS the effect is real, and it is CONDITIONAL ON MILK
PROTEIN rather than monotonic in dose. Regand & Goff (Guelph thesis Table
5.2), 5 cycles -3.5/-6 C, recrystallisation rate in um per cycle:
no milk solids with milk solids
none 4.02 4.59
LBG 4.05 3.17
carrageenan 3.80 3.02
dependencies 1 imports · 1 importers
imports: nx_syscalls.nx
imported by: nx_ice_stabiliser_gate.nx
structs
| none |
consts
| 92 | const STAB_MAGIC_100000: i64 = 100000 |
| 93 | const STAB_MAGIC_2068: i64 = 2068 |
| 94 | const STAB_MAGIC_1792: i64 = 1792 |
| 95 | const STAB_MAGIC_1724: i64 = 1724 |
| 96 | const STAB_MAGIC_1636: i64 = 1636 |
| 97 | const STAB_MAGIC_2076: i64 = 2076 |
| 98 | const STAB_MAGIC_1745: i64 = 1745 |
| 99 | const STAB_MAGIC_1541: i64 = 1541 |
| 100 | const STAB_MAGIC_1542: i64 = 1542 |
| 101 | const STAB_MAGIC_2979: i64 = 2979 |
| 102 | const STAB_MAGIC_2706: i64 = 2706 |
| 103 | const STAB_MAGIC_2335: i64 = 2335 |
| 104 | const STAB_MAGIC_2520: i64 = 2520 |
| 106 | const STAB_INVALID: i64 = 0 - 1 |
| 107 | const STAB_UNKNOWN: i64 = 0 - 2 |
| 111 | const STAB_NONE: i64 = 0 |
| 112 | const STAB_LBG: i64 = 1 |
| 113 | const STAB_GUAR: i64 = 2 |
| 114 | const STAB_CARRAGEENAN: i64 = 3 |
| 115 | const STAB_CMC: i64 = 4 |
| 116 | const STAB_XANTHAN: i64 = 5 |
| 117 | const STAB_ALGINATE: i64 = 6 |
| 118 | const STAB_GELATIN: i64 = 7 |
| 123 | const STAB_SATURATION_Q4: i64 = 30 |
| 127 | const STAB_CASEIN_CARRAGEENAN_RATIO: i64 = 243 |
| 130 | const STAB_CARRAGEENAN_GEL_Q4: i64 = 3 |
| 131 | const STAB_CARRAGEENAN_FAIL_Q4: i64 = 5 |
| 134 | const STAB_CASEIN_OF_PROTEIN_PERMIL: i64 = 800 |
| 282 | const STAB_FLORES_MILD: i64 = 0 // -15 +/- 2 C, 3 cycles |
| 283 | const STAB_FLORES_HARSH: i64 = 1 // -15 +/- 5 C, 3 cycles |
| 284 | const STAB_FLORES_ABUSED: i64 = 2 // -15 +/- 5 C, 9 cycles |
functions
| 143 | func stab_rate_no_protein_q2(gum: i64) -> i64 |
| 155 | func stab_rate_with_protein_q2(gum: i64) -> i64 |
| 167 | func stab_rate_q2(gum: i64, has_milk_protein: i64) -> i64 |
| 172 | func stab_rate_is_measured(gum: i64, has_milk_protein: i64) -> i64 |
| 182 | func stab_retardation_permil(gum: i64, has_milk_protein: i64) -> i64 |
| 192 | func stab_is_protein_conditional(gum: i64) -> i64 |
| 203 | func stab_lbg_inert_without_protein() -> i64 |
| 211 | func stab_effective_dose_q4(dose_q4: i64) -> i64 |
| 217 | func stab_wasted_dose_q4(dose_q4: i64) -> i64 called by 1: t5 |
| 225 | func stab_recommended_total_q4(fat_permil: i64) -> i64 called by 1: t6 |
| 238 | func stab_casein_permil(protein_permil: i64) -> i64 |
| 244 | func stab_min_carrageenan_q5(protein_permil: i64) -> i64 |
| 251 | func stab_carrageenan_dose_ok_q4(dose_q4: i64, protein_permil: i64) -> i64 |
| 261 | func stab_incompatibility_rank(gum: i64) -> i64 |
| 271 | func stab_needs_secondary_colloid(primary_gum: i64) -> i64 |
| 286 | func stab_flores_x50_q2(regime: i64, gum: i64) -> i64 |
| 312 | func stab_flores_apparent_gain_permil(regime: i64, gum: i64) -> i64 |
| 325 | func stab_flores_difference_is_significant() -> i64 { return 0 } called by 1: t10 |
| 330 | func stab_model_result_transfers_to_product() -> i64 { return 0 } called by 1: t11 |
| 335 | func stab_gum_swap_is_a_supported_lever(gum: i64) -> i64 { return 0 } called by 1: t11 |
| 341 | func stab_mechanism_is_ice_adsorption() -> i64 { return 1 } called by 1: t12 |
| 342 | func stab_viscosity_explains_retardation() -> i64 { return 0 } called by 1: t12 |
| 346 | func stab_acts_on_storage_not_freezing() -> i64 { return 1 } called by 1: t12 |
| 347 | func stab_improves_initial_crystal_size() -> i64 { return 0 } called by 1: t12 |