| 740 | */ |
| 741 | |
| 742 | struct edgetam_repvit_block { |
| 743 | // Token mixer: single fused DW 3×3 (after RepVGG reparameterization) |
| 744 | struct ggml_tensor* tm_w = nullptr; // [3, 3, 1, ch] |
| 745 | struct ggml_tensor* tm_b = nullptr; // [ch] |
| 746 | |
| 747 | // Squeeze-and-excitation (only on even-indexed blocks) |
| 748 | bool has_se = false; |
| 749 | struct ggml_tensor* se_fc1_w = nullptr; // [1, 1, ch, ch_rd] |
| 750 | struct ggml_tensor* se_fc1_b = nullptr; // [ch_rd] |
| 751 | struct ggml_tensor* se_fc2_w = nullptr; // [1, 1, ch_rd, ch] |
| 752 | struct ggml_tensor* se_fc2_b = nullptr; // [ch] |
| 753 | |
| 754 | // Channel mixer: 1×1 expand → GELU → 1×1 project |
| 755 | struct ggml_tensor* cm_conv1_w = nullptr; // [1, 1, ch, ch*2] |
| 756 | struct ggml_tensor* cm_conv1_b = nullptr; // [ch*2] |
| 757 | struct ggml_tensor* cm_conv2_w = nullptr; // [1, 1, ch*2, ch] |
| 758 | struct ggml_tensor* cm_conv2_b = nullptr; // [ch] |
| 759 | }; |
| 760 | |
| 761 | struct edgetam_repvit_downsample { |
| 762 | // Pre-block (RepViT block at prev-stage channels, no SE) |
nothing calls this directly
no outgoing calls
no test coverage detected