==> tests/infer.c <==1/* infer on the simulator: no train loaded -> R_NO_TRAIN; with a train slot
2 * (its view written here), every grid point's y == the CPU reference
3 * (@ajax/mesh-ref-cubic) bitwise; peer reads are gated by `reads`. */
4#include "mesh/check.h"
5#include "mesh/ref/cubic.h"
6#include "mesh/rt/sim_mailbox.h"
7
8#include "../src/infer.c"
9
10int main(void) {
11 uint8_t *mb = mesh_sim_mailbox();
12 mesh_sim_prog p = {.name = "infer", .view_off = MESH_VIEW_HEAP, .view_bytes = MESH_INFER_VIEW_BYTES, .reads_mask = 1u << 4};
13 uint8_t *view = mesh_sim_install(mb, 1, &p);
14 mesh_sim_launch *l = mesh_sim_launch_prog(mb, 1, &p, mesh_main);
15 CHECK_U(mesh_sim_call(mb, 1, MESH_OP_INIT, 0), MESH_R_NONE);
16 float grid[MESH_INFER_POINTS];
17 mesh_cubic_grid(MESH_INFER_POINTS, grid);
18 for (uint32_t i = 0; i < MESH_INFER_POINTS; i++) CHECK_U(mesh_sim_u32(view + MESH_INFER_I_X + 4 * i), mesh_f32_bits(grid[i]));
19 CHECK_U(mesh_sim_call(mb, 1, MESH_OP_TASK, 0), MESH_INFER_R_NO_TRAIN);
20 /* A train in slot 4 (readable): its params and step. */
21 mesh_sim_prog t = {.name = "train", .view_off = MESH_VIEW_HEAP + 0x10000, .view_bytes = MESH_TRAIN_VIEW_BYTES};
22 uint8_t *tv = mesh_sim_install(mb, 4, &t);
23 const float params[4] = {0.0123f, 2.75f, -0.03125f, -2.5f};
24 for (int k = 0; k < 4; k++) mesh_sim_set_f32(tv + MESH_TRAIN_T_PARAMS + 4 * k, params[k]);
25 mesh_sim_set_u32(tv + MESH_TRAIN_T_NEXT_STEP, 640);
26 CHECK_U(mesh_sim_call(mb, 1, MESH_OP_TASK, 0), MESH_INFER_POINTS);
27 for (uint32_t i = 0; i < MESH_INFER_POINTS; i++)
28 CHECK_U(mesh_sim_u32(view + MESH_INFER_I_Y + 4 * i), mesh_f32_bits(mesh_cubic(params, grid[i])));
29 for (int k = 0; k < 4; k++) CHECK_U(mesh_sim_u32(view + MESH_INFER_I_PARAMS + 4 * k), mesh_f32_bits(params[k]));
30 CHECK_U(mesh_sim_u32(view + MESH_INFER_I_RUNS), 1);
31 CHECK_U(mesh_sim_u32(view + MESH_INFER_I_TRAIN_STEP), 640);
32 /* Probe reads: slot 4 is in `reads`, slot 2 is not (a fault). */
33 CHECK_U(mesh_sim_call(mb, 1, MESH_INFER_OP_PROBE_READ, 4), MESH_TRAIN_VIEW_BYTES);
34 CHECK_U(mesh_sim_u32(mesh_sim_ctl(mb, 1) + MESH_P_FAULT), 0);
35 CHECK_U(mesh_sim_call(mb, 1, MESH_INFER_OP_PROBE_READ, 2), MESH_INFER_R_NO_VIEW);
36 CHECK_U(mesh_sim_u32(mesh_sim_ctl(mb, 1) + MESH_P_FAULT), MESH_FAULT_PEER_VIEW | 2u << 8);
37 /* An unloaded train is gone. */
38 mesh_sim_set_state(mb, 4, MESH_ST_EMPTY);
39 CHECK_U(mesh_sim_call(mb, 1, MESH_OP_TASK, 0), MESH_INFER_R_NO_TRAIN);
40 mesh_sim_halt(mb, 1, l);
41 mesh_sim_mailbox_free(mb);
42 return mesh_check_done();
43}