TabFM inference engine, with a real batch dimension B (predict_batch) — e.g. one batch
item per ensemble member, so ensemble::orchestrate can share the fixed cost of the 24-block
ICL stage across all members in one forward pass instead of paying it once per member. The
single-table predict() is a thin B=1 wrapper around the same code path; none of the
attention/RMSNorm/RoPE math below changed to add batching — only the four “stage” functions
(cell_embed, col_embedding_forward, row_interaction_forward, icl_forward) gained a
leading B dimension, via reshapes around the same 3D attention calls they always made
(masks/weights are shared scalars across the batch — every member has the same row/feature
count, train_size, and d; only cell values and cat_mask vary per member).