code wiki / _hdl_build / nx_meal_plan_gate.nx
nx_meal_plan_gate.nx source
↩ module page · 122 lines · 7050 B
1// nx_meal_plan_gate.nx -- proves the recipe/unit spine on per-run /tmp fixtures. The BITE cell guards the
2// vacuous-requirement trap: a recipe with NO ingredients is trivially satisfied by an EMPTY pantry, so a naive
3// "can I cook it" check recommends phantom dishes to someone with nothing in the house.
4// license_tier: ORIGINAL No hw writes (Rule 26).
5import "nx_syscalls.nx"
6import "nx_meal_plan.nx"
7import "nx_gate_verdict.nx"
8
9const PG_PFX: i64 = 160
10const PG_FLD: i64 = 512
11
12func main(argc: i64, argv: *i64) -> i64 {
13 let ctr: *i64 = gv_ctr()
14 gv_head("nx_meal_plan -- recipes, units (family/person/restaurant), similarity, and cook-from-stock" as *u8)
15
16 let ep: i64 = sys_now_realtime_sec()
17 let pfx: *u8 = sys_mmap(PG_PFX)
18 var o: i64 = as_append(pfx, 0, "/tmp/mpl_" as *u8)
19 o = fd_apnum(pfx, o, ep)
20 o = as_append(pfx, o, "-" as *u8)
21 pfx[o] = 0 as u8
22 let inv: *u8 = sys_mmap(PG_PFX)
23 var q: i64 = as_append(inv, 0, "/tmp/mplinv_" as *u8)
24 q = fd_apnum(inv, q, ep)
25 q = as_append(inv, q, "-" as *u8)
26 inv[q] = 0 as u8
27
28 let dom: *u8 = "wests" as *u8
29
30 mp_add_recipe(pfx, "shortribs" as *u8, "Gochujang Braised Short Ribs" as *u8, "Slow-braised, deeply savoury" as *u8, 6, "beef garlic ginger soy scallion" as *u8)
31 mp_add_recipe(pfx, "twin" as *u8, "Sunday Braised Ribs" as *u8, "The same pantry, another name" as *u8, 6, "beef garlic ginger soy scallion" as *u8)
32 mp_add_recipe(pfx, "beefstirfry" as *u8, "Beef and Broccoli" as *u8, "Weeknight wok dish" as *u8, 4, "beef garlic ginger broccoli soy" as *u8)
33 mp_add_recipe(pfx, "tofusalad" as *u8, "Chilled Tofu Salad" as *u8, "No cooking at all" as *u8, 2, "tofu lettuce lemon" as *u8)
34 mp_add_recipe(pfx, "phantom" as *u8, "Dish With No Ingredients" as *u8, "The vacuity trap" as *u8, 1, "" as *u8)
35
36 // the unit's pantry: everything for the ribs, but no broccoli
37 iv_add(inv, dom, "beef" as *u8, "Short rib" as *u8, "meat" as *u8, 2, "lb" as *u8, "freezer" as *u8, 1800, 0, "" as *u8)
38 iv_add(inv, dom, "garlic" as *u8, "Garlic" as *u8, "produce" as *u8, 3, "bulb" as *u8, "pantry" as *u8, 90, 0, "" as *u8)
39 iv_add(inv, dom, "ginger" as *u8, "Ginger" as *u8, "produce" as *u8, 1, "knob" as *u8, "fridge" as *u8, 120, 0, "" as *u8)
40 iv_add(inv, dom, "soy" as *u8, "Soy sauce" as *u8, "pantry" as *u8, 1, "bottle" as *u8, "pantry" as *u8, 340, 0, "" as *u8)
41 iv_add(inv, dom, "scallion" as *u8, "Scallion" as *u8, "produce" as *u8, 4, "stalk" as *u8, "fridge" as *u8, 60, 0, "" as *u8)
42
43 // ---- T1 recipe round-trip ----
44 let f: *u8 = sys_mmap(PG_FLD)
45 var t1: i64 = 1
46 mp_field(pfx, "shortribs" as *u8, MP_F_TITLE, f)
47 if fd_streq(f, "Gochujang Braised Short Ribs" as *u8) == 0 { t1 = 0 }
48 mp_field(pfx, "shortribs" as *u8, MP_F_BLURB, f)
49 if fd_streq(f, "Slow-braised, deeply savoury" as *u8) == 0 { t1 = 0 }
50 if mp_serves(pfx, "shortribs" as *u8) != 6 { t1 = 0 }
51 let it: *i64 = sys_mmap(8 * 64) as *i64
52 if mp_items(pfx, "shortribs" as *u8, it) != 5 { t1 = 0 }
53 if fd_streq(it[0] as *u8, "beef" as *u8) == 0 { t1 = 0 }
54 if fd_streq(it[4] as *u8, "scallion" as *u8) == 0 { t1 = 0 }
55 let allr: *i64 = sys_mmap(8 * 64) as *i64
56 if mp_recipes(pfx, allr) != 5 { t1 = 0 }
57 gv_check("T1 recipe round-trips: title, blurb, serves, and its 5 ingredient ids" as *u8, t1, ctr)
58
59 // ---- T2 one engine, three kinds of unit ----
60 mp_add_unit(pfx, "wests" as *u8, "The West Family" as *u8, "family" as *u8, "wests" as *u8, "seattle" as *u8)
61 mp_add_unit(pfx, "ana" as *u8, "Ana" as *u8, "person" as *u8, "ana" as *u8, "seattle" as *u8)
62 mp_add_unit(pfx, "spicehouse" as *u8, "Sichuan Spice House" as *u8, "restaurant" as *u8, "spicehouse" as *u8, "portland" as *u8)
63 var t2: i64 = 1
64 mp_unit_field(pfx, "spicehouse" as *u8, MP_U_LABEL, f)
65 if fd_streq(f, "Sichuan Spice House" as *u8) == 0 { t2 = 0 }
66 mp_unit_field(pfx, "spicehouse" as *u8, MP_U_KIND, f)
67 if fd_streq(f, "restaurant" as *u8) == 0 { t2 = 0 }
68 mp_unit_field(pfx, "ana" as *u8, MP_U_KIND, f)
69 if fd_streq(f, "person" as *u8) == 0 { t2 = 0 }
70 mp_unit_field(pfx, "wests" as *u8, MP_U_AREA, f)
71 if fd_streq(f, "seattle" as *u8) == 0 { t2 = 0 }
72 let un: *i64 = sys_mmap(8 * 64) as *i64
73 if mp_units(pfx, un) != 3 { t2 = 0 }
74 gv_check("T2 family, person and restaurant register through ONE engine, none a special case" as *u8, t2, ctr)
75
76 // ---- T3 similarity is exact integer permille ----
77 var t3: i64 = 1
78 if mp_similarity(pfx, "shortribs" as *u8, "twin" as *u8) != 1000 { t3 = 0 }
79 if mp_shared(pfx, "shortribs" as *u8, "beefstirfry" as *u8) != 4 { t3 = 0 }
80 if mp_similarity(pfx, "shortribs" as *u8, "beefstirfry" as *u8) != 666 { t3 = 0 } // 1000*4/6
81 if mp_similarity(pfx, "shortribs" as *u8, "tofusalad" as *u8) != 0 { t3 = 0 }
82 if mp_similarity(pfx, "shortribs" as *u8, "nosuchrecipe" as *u8) != 0 { t3 = 0 }
83 gv_check("T3 similarity: identical sets 1000, 4-of-6 union 666, no overlap 0, unknown resembles NOTHING" as *u8, t3, ctr)
84
85 // ---- T4 ranking ----
86 let sr: *i64 = sys_mmap(8 * 32) as *i64
87 let ss: *i64 = sys_mmap(8 * 32) as *i64
88 let ns: i64 = mp_similar(pfx, "shortribs" as *u8, sr, ss, 8)
89 var t4: i64 = 1
90 if ns != 2 { t4 = 0 } // zero-overlap candidates omitted
91 if fd_streq(sr[0] as *u8, "twin" as *u8) == 0 { t4 = 0 }
92 if ss[0] != 1000 { t4 = 0 }
93 if fd_streq(sr[1] as *u8, "beefstirfry" as *u8) == 0 { t4 = 0 }
94 if ss[1] != 666 { t4 = 0 }
95 gv_check("T4 more-like-this ranks 1000 then 666 and omits the two zero-overlap dishes" as *u8, t4, ctr)
96
97 // ---- T5 BITE the vacuous-requirement trap ----
98 var vac_bad: i64 = 0
99 if mp_can_cook(inv, dom, pfx, "phantom" as *u8) == 0 { vac_bad = 1 }
100 var vac_good: i64 = 0
101 if mp_can_cook(inv, dom, pfx, "shortribs" as *u8) == 0 { vac_good = 1 }
102 gv_bite("T5 cookability refuses the zero-ingredient dish, still accepts the fully stocked one" as *u8, vac_bad, vac_good, ctr)
103
104 // ---- T6 cook from stock / nearly there ----
105 let ck: *i64 = sys_mmap(8 * 32) as *i64
106 let nk: i64 = mp_cookable(inv, dom, pfx, ck, 16)
107 var t6: i64 = 1
108 if nk != 2 { t6 = 0 } // shortribs + twin, never phantom
109 if mp_missing(inv, dom, pfx, "beefstirfry" as *u8) != 1 { t6 = 0 } // only broccoli
110 if mp_missing(inv, dom, pfx, "tofusalad" as *u8) != 3 { t6 = 0 }
111 let nr: *i64 = sys_mmap(8 * 32) as *i64
112 let nm: *i64 = sys_mmap(8 * 32) as *i64
113 let nn: i64 = mp_nearly(inv, dom, pfx, 1, nr, nm, 16)
114 if nn != 1 { t6 = 0 }
115 if fd_streq(nr[0] as *u8, "beefstirfry" as *u8) == 0 { t6 = 0 }
116 if nm[0] != 1 { t6 = 0 }
117 gv_check("T6 two dishes cookable now; beef-and-broccoli is one item away; tofu salad is three" as *u8, t6, ctr)
118
119 let rc: i64 = gv_verdict("MEAL-PLAN" as *u8, ctr, "units are one engine; similarity is explainable; an empty requirement is never satisfied" as *u8)
120 sys_exit(rc)
121 return 0
122}