GCC Code Coverage Report


Directory: brotensor/
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 100.0% 235 / 0 / 235
Functions: 100.0% 36 / 0 / 36
Branches: 25.8% 206 / 0 / 800

src/api/native_tensor_audio_b.cpp
Line Branch Exec Source
1 // native_tensor_audio_b.cpp — the second half of the restored audio group
2 // (see native_tensor_audio.cpp for the first half and the registration table
3 // that covers both): 1D padding, the conv1d / conv_transpose1d / causal-conv
4 // family, the vocoder + codec activations, codec quantization, 1D resampling,
5 // the log / exp / round elementwise maps and the autoregressive logit sampler.
6 //
7 // Restored from the QuickJS binding (src/js/tensor_bindings_audio.cpp). NCL
8 // layout throughout the conv family: an activation is (N, C*L), conv weights
9 // are OIL, conv-transpose weights are input-channel-major.
10
11 #include "native_tensor_audio_decl.h"
12 #include "api_internal.h"
13
14 using namespace brotensor::api;
15 using brotensor::Tensor;
16
17 namespace {
18
19 86 Tensor* T(void* p) { return toTensor(p); }
20
21 // conv1d is conv2d with H = kH = 1, and conv2d's device kernels trust the
22 // caller's dims, so the operand extents are checked here. Computes L_out.
23 16 bool conv1dGeom(const char* L, int32_t N, int32_t C_in, int32_t Lin, int32_t C_out, int32_t kL,
24 int32_t stride, int32_t padding, int32_t dilation, int32_t groups, int64_t& L_out) {
25 16 int64_t H_out = 0;
26
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 16 times.
16 if (!needNonNegative(L, {N})) return false;
27 16 return convGeom2d(L, C_in, C_out, 1, Lin, 1, kL, 1, stride, 0, padding, 1, dilation, groups, H_out, L_out);
28 16 }
29
30 // The conv1d filter is OIL: (C_out, (C_in/groups)*kL).
31 14 int64_t conv1dWeightElems(int32_t C_in, int32_t C_out, int32_t kL, int32_t groups) {
32 14 return elems({C_out, C_in / groups, kL});
33 }
34
35 } // namespace
36
37 extern "C" {
38
39 // ─── 1D padding ────────────────────────────────────────────────────────────
40
41 6 void bro_tensor_pad1dForward(void* X, int32_t N, int32_t C, int32_t L,
42 int32_t padLeft, int32_t padRight, int32_t mode, void* Y) {
43
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 if (!need("pad1dForward", {X, Y})) return;
44 BROTENSOR_API_TRY
45
3/6
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
6 brotensor::pad1d_forward(*toTensor(X), N, C, L, padLeft, padRight, mode, *toTensor(Y));
46
0/12
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
6 BROTENSOR_API_CATCH("pad1dForward")
47 6 }
48
49 2 void bro_tensor_pad1dBackward(void* dY, int32_t N, int32_t C, int32_t L,
50 int32_t padLeft, int32_t padRight, int32_t mode, void* dX) {
51
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (!need("pad1dBackward", {dY, dX})) return;
52 BROTENSOR_API_TRY
53
3/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 brotensor::pad1d_backward(*toTensor(dY), N, C, L, padLeft, padRight, mode, *toTensor(dX));
54
0/12
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
2 BROTENSOR_API_CATCH("pad1dBackward")
55 2 }
56
57 // ─── conv1d family (NCL) ───────────────────────────────────────────────────
58
59 8 void bro_tensor_conv1d(void* X, void* Wt, uint64_t bias_bits, int32_t N, int32_t C_in,
60 int32_t L, int32_t C_out, int32_t kL, int32_t stride,
61 int32_t padding, int32_t dilation, int32_t groups, void* Y) {
62 8 const char* Lb = "conv1d";
63 8 int64_t L_out = 0;
64
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
8 if (!need(Lb, {X, Wt, Y}) || !conv1dGeom(Lb, N, C_in, L, C_out, kL, stride, padding, dilation, groups, L_out)) return;
65
6/6
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 4 times.
✓ Branch 5 taken 4 times.
24 if (!needOperands(Lb, T(X), {{"X", T(X), elems({N, C_in, L})},
66 8 {"Wt", T(Wt), conv1dWeightElems(C_in, C_out, kL, groups)},
67 8 {"bias", tensorFromValue(bias_bits), C_out}})) return;
68 BROTENSOR_API_TRY
69
4/8
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4 times.
✗ Branch 7 not taken.
8 brotensor::conv1d(*toTensor(X), *toTensor(Wt), tensorFromValue(bias_bits),
70 4 N, C_in, L, C_out, kL, stride, padding, dilation, groups,
71
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 *toTensor(Y));
72
0/12
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
4 BROTENSOR_API_CATCH("conv1d")
73 8 }
74
75 2 void bro_tensor_conv1dBackwardInput(void* Wt, void* dY, int32_t N, int32_t C_in,
76 int32_t L, int32_t C_out, int32_t kL, int32_t stride,
77 int32_t padding, int32_t dilation, int32_t groups,
78 void* dX) {
79 2 const char* Lb = "conv1dBackwardInput";
80 2 int64_t L_out = 0;
81
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
2 if (!need(Lb, {Wt, dY, dX}) || !conv1dGeom(Lb, N, C_in, L, C_out, kL, stride, padding, dilation, groups, L_out)) return;
82
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
4 if (!needOperands(Lb, T(dY), {{"dY", T(dY), elems({N, C_out, L_out})},
83 2 {"Wt", T(Wt), conv1dWeightElems(C_in, C_out, kL, groups)}})) return;
84 BROTENSOR_API_TRY
85
3/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 brotensor::conv1d_backward_input(*toTensor(Wt), *toTensor(dY), N, C_in, L, C_out, kL,
86
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 stride, padding, dilation, groups, *toTensor(dX));
87
0/12
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
2 BROTENSOR_API_CATCH("conv1dBackwardInput")
88 2 }
89
90 2 void bro_tensor_conv1dBackwardWeight(void* X, void* dY, int32_t N, int32_t C_in,
91 int32_t L, int32_t C_out, int32_t kL, int32_t stride,
92 int32_t padding, int32_t dilation, int32_t groups,
93 void* dWt) {
94 2 const char* Lb = "conv1dBackwardWeight";
95 2 int64_t L_out = 0;
96
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
2 if (!need(Lb, {X, dY, dWt}) || !conv1dGeom(Lb, N, C_in, L, C_out, kL, stride, padding, dilation, groups, L_out)) return;
97 // dWt accumulates — "caller zeros".
98
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
4 if (!needOperands(Lb, T(X), {{"X", T(X), elems({N, C_in, L})}, {"dY", T(dY), elems({N, C_out, L_out})},
99 2 {"dWt", T(dWt), conv1dWeightElems(C_in, C_out, kL, groups)}})) return;
100 BROTENSOR_API_TRY
101
3/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 brotensor::conv1d_backward_weight(*toTensor(X), *toTensor(dY), N, C_in, L, C_out, kL,
102
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 stride, padding, dilation, groups, *toTensor(dWt));
103
0/12
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
2 BROTENSOR_API_CATCH("conv1dBackwardWeight")
104 2 }
105
106 2 void bro_tensor_conv1dBackwardBias(void* dY, int32_t N, int32_t C_out, int32_t L_out, void* dB) {
107 2 const char* Lb = "conv1dBackwardBias";
108
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
2 if (!need(Lb, {dY, dB}) || !needNonNegative(Lb, {N, C_out, L_out})) return;
109
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (!needOperands(Lb, T(dY), {{"dY", T(dY), elems({N, C_out, L_out})}, {"dB", T(dB), C_out}})) return;
110 BROTENSOR_API_TRY
111
3/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 brotensor::conv1d_backward_bias(*toTensor(dY), N, C_out, L_out, *toTensor(dB));
112
0/12
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
2 BROTENSOR_API_CATCH("conv1dBackwardBias")
113 2 }
114
115 // W8A16: FP16 activations, INT8 per-output-row weights. No CPU slot — the
116 // dispatcher throws "not implemented on CPU", which becomes a recorded error.
117 2 void bro_tensor_conv1dInt8wFp16(void* X, void* W_int8, void* scales, uint64_t bias_bits,
118 int32_t N, int32_t C_in, int32_t L, int32_t C_out,
119 int32_t kL, int32_t stride, int32_t padding,
120 int32_t dilation, int32_t groups, void* Y) {
121 2 const char* Lb = "conv1dInt8wFp16";
122 2 int64_t L_out = 0;
123
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
2 if (!need(Lb, {X, W_int8, scales, Y}) ||
124 2 !conv1dGeom(Lb, N, C_in, L, C_out, kL, stride, padding, dilation, groups, L_out)) return;
125 // The op checks W_int8 / scales shapes and every dtype.
126
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
4 if (!needOperands(Lb, T(X), {{"X", T(X), elems({N, C_in, L})},
127 2 {"bias", tensorFromValue(bias_bits), C_out}})) return;
128 BROTENSOR_API_TRY
129
4/8
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
4 brotensor::conv1d_int8w_fp16(*toTensor(X), *toTensor(W_int8), *toTensor(scales),
130
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 tensorFromValue(bias_bits), N, C_in, L, C_out, kL,
131
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 stride, padding, dilation, groups, *toTensor(Y));
132
0/12
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
2 BROTENSOR_API_CATCH("conv1dInt8wFp16")
133 2 }
134
135 2 void bro_tensor_convTranspose1dForward(void* X, void* Wt, uint64_t bias_bits, int32_t N,
136 int32_t C_in, int32_t L, int32_t C_out, int32_t kL,
137 int32_t stride, int32_t padding, int32_t outputPadding,
138 int32_t dilation, int32_t groups, void* Y) {
139 // The op checks Wt / bias shapes; X's extent is the caller's.
140
3/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2 if (!need("convTranspose1dForward", {X, Wt, Y}) || !needNonNegative("convTranspose1dForward", {N, C_in, L}) ||
141 2 !needElems("convTranspose1dForward", "X", T(X), elems({N, C_in, L}))) return;
142 BROTENSOR_API_TRY
143
3/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
4 brotensor::conv_transpose1d_forward(*toTensor(X), *toTensor(Wt),
144
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 tensorFromValue(bias_bits), N, C_in, L, C_out, kL,
145 2 stride, padding, outputPadding, dilation, groups,
146
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 *toTensor(Y));
147
0/12
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
2 BROTENSOR_API_CATCH("convTranspose1dForward")
148 2 }
149
150 2 void bro_tensor_convTranspose1dBackwardInput(void* Wt, void* dY, int32_t N, int32_t C_in,
151 int32_t L, int32_t C_out, int32_t kL,
152 int32_t stride, int32_t padding,
153 int32_t outputPadding, int32_t dilation,
154 int32_t groups, void* dX) {
155
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (!need("convTranspose1dBackwardInput", {Wt, dY, dX})) return;
156 BROTENSOR_API_TRY
157
3/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 brotensor::conv_transpose1d_backward_input(*toTensor(Wt), *toTensor(dY), N, C_in, L,
158 2 C_out, kL, stride, padding, outputPadding,
159
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 dilation, groups, *toTensor(dX));
160
0/12
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
2 BROTENSOR_API_CATCH("convTranspose1dBackwardInput")
161 2 }
162
163 2 void bro_tensor_convTranspose1dBackwardWeight(void* X, void* dY, int32_t N, int32_t C_in,
164 int32_t L, int32_t C_out, int32_t kL,
165 int32_t stride, int32_t padding,
166 int32_t outputPadding, int32_t dilation,
167 int32_t groups, void* dWt) {
168
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (!need("convTranspose1dBackwardWeight", {X, dY, dWt})) return;
169 BROTENSOR_API_TRY
170
3/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 brotensor::conv_transpose1d_backward_weight(*toTensor(X), *toTensor(dY), N, C_in, L,
171 2 C_out, kL, stride, padding, outputPadding,
172
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 dilation, groups, *toTensor(dWt));
173
0/12
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
2 BROTENSOR_API_CATCH("convTranspose1dBackwardWeight")
174 2 }
175
176 2 void bro_tensor_convTranspose1dBackwardBias(void* dY, int32_t N, int32_t C_out,
177 int32_t L_out, void* dB) {
178
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (!need("convTranspose1dBackwardBias", {dY, dB})) return;
179 BROTENSOR_API_TRY
180
3/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 brotensor::conv_transpose1d_backward_bias(*toTensor(dY), N, C_out, L_out, *toTensor(dB));
181
0/12
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
2 BROTENSOR_API_CATCH("convTranspose1dBackwardBias")
182 2 }
183
184 // `scratch` is a caller-owned buffer reused as the left-padded input, so the
185 // wrapper stays allocation-free across calls.
186 2 void bro_tensor_causalConv1d(void* X, void* Wt, uint64_t bias_bits, int32_t N, int32_t C_in,
187 int32_t L, int32_t C_out, int32_t kL, int32_t stride,
188 int32_t dilation, int32_t groups, void* scratch, void* Y) {
189 // pad1d checks X; the valid conv over the left-padded scratch runs on
190 // conv2d's trusted dims, so the filter and bias are checked here.
191 2 const char* Lb = "causalConv1d";
192
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
2 if (!need(Lb, {X, Wt, scratch, Y}) || !needPositive(Lb, {kL, dilation})) return;
193 2 int64_t L_out = 0;
194 2 const int64_t padded = static_cast<int64_t>(L) + static_cast<int64_t>(dilation) * (kL - 1);
195
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2 if (padded > INT32_MAX) { setError("causalConv1d: L + dilation*(kL-1) overflows"); return; }
196
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 if (!conv1dGeom(Lb, N, C_in, static_cast<int32_t>(padded), C_out, kL, stride, 0, dilation, groups, L_out)) return;
197
3/6
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6 if (!needOperands(Lb, T(X), {{"X", T(X), elems({N, C_in, L})},
198 2 {"Wt", T(Wt), conv1dWeightElems(C_in, C_out, kL, groups)},
199 2 {"bias", tensorFromValue(bias_bits), C_out}})) return;
200 BROTENSOR_API_TRY
201
4/8
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
4 brotensor::causal_conv1d(*toTensor(X), *toTensor(Wt), tensorFromValue(bias_bits),
202 2 N, C_in, L, C_out, kL, stride, dilation, groups,
203
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 *toTensor(scratch), *toTensor(Y));
204
0/12
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
2 BROTENSOR_API_CATCH("causalConv1d")
205 2 }
206
207 // `state` is the rolling (kL-1)*dilation-sample history — read AND overwritten.
208 4 void bro_tensor_causalConv1dUpdate(void* X, void* Wt, uint64_t bias_bits, int32_t N,
209 int32_t C, int32_t L_step, int32_t kL, int32_t dilation,
210 void* state, void* Y) {
211
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 if (!need("causalConv1dUpdate", {X, Wt, state, Y})) return;
212 BROTENSOR_API_TRY
213
4/8
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4 times.
✗ Branch 7 not taken.
8 brotensor::causal_conv1d_update(*toTensor(X), *toTensor(Wt), tensorFromValue(bias_bits),
214
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 N, C, L_step, kL, dilation, *toTensor(state),
215
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 *toTensor(Y));
216
0/12
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
4 BROTENSOR_API_CATCH("causalConv1dUpdate")
217 4 }
218
219 // ─── Vocoder / codec activations ───────────────────────────────────────────
220
221 4 void bro_tensor_snakeForward(void* X, void* alpha, uint64_t beta_bits, int32_t N,
222 int32_t C, int32_t L, void* Y) {
223
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 if (!need("snakeForward", {X, alpha, Y})) return;
224 BROTENSOR_API_TRY
225
4/8
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4 times.
✗ Branch 7 not taken.
8 brotensor::snake_forward(*toTensor(X), *toTensor(alpha), tensorFromValue(beta_bits),
226
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 N, C, L, *toTensor(Y));
227
0/12
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
4 BROTENSOR_API_CATCH("snakeForward")
228 4 }
229
230 // dBeta must be non-null exactly when beta is non-null.
231 4 void bro_tensor_snakeBackward(void* X, void* alpha, uint64_t beta_bits, void* dY,
232 int32_t N, int32_t C, int32_t L, void* dX, void* dAlpha,
233 uint64_t dBeta_bits) {
234
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 if (!need("snakeBackward", {X, alpha, dY, dX, dAlpha})) return;
235 BROTENSOR_API_TRY
236
4/8
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4 times.
✗ Branch 7 not taken.
8 brotensor::snake_backward(*toTensor(X), *toTensor(alpha), tensorFromValue(beta_bits),
237
3/6
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
4 *toTensor(dY), N, C, L, *toTensor(dX), *toTensor(dAlpha),
238
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 tensorFromValue(dBeta_bits));
239
0/12
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
4 BROTENSOR_API_CATCH("snakeBackward")
240 4 }
241
242 4 void bro_tensor_eluForward(void* x, double alpha, void* y) {
243
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 if (!need("eluForward", {x, y})) return;
244 BROTENSOR_API_TRY
245
3/6
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
4 brotensor::elu_forward(*toTensor(x), static_cast<float>(alpha), *toTensor(y));
246
0/12
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
4 BROTENSOR_API_CATCH("eluForward")
247 4 }
248
249 4 void bro_tensor_eluBackward(void* x, void* dY, double alpha, void* dX) {
250
3/4
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 2 times.
4 if (!need("eluBackward", {x, dY, dX}) || !needPair("eluBackward", "dY", T(dY), T(x))) return;
251 BROTENSOR_API_TRY
252
3/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 brotensor::elu_backward(*toTensor(x), *toTensor(dY), static_cast<float>(alpha),
253
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 *toTensor(dX));
254
0/12
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
2 BROTENSOR_API_CATCH("eluBackward")
255 4 }
256
257 2 void bro_tensor_leakyReluForward(void* x, double negativeSlope, void* y) {
258
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (!need("leakyReluForward", {x, y})) return;
259 BROTENSOR_API_TRY
260
3/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 brotensor::leaky_relu_forward(*toTensor(x), static_cast<float>(negativeSlope), *toTensor(y));
261
0/12
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
2 BROTENSOR_API_CATCH("leakyReluForward")
262 2 }
263
264 2 void bro_tensor_leakyReluBackward(void* x, void* dY, double negativeSlope, void* dX) {
265
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
2 if (!need("leakyReluBackward", {x, dY, dX}) || !needPair("leakyReluBackward", "dY", T(dY), T(x))) return;
266 BROTENSOR_API_TRY
267
3/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
4 brotensor::leaky_relu_backward(*toTensor(x), *toTensor(dY),
268
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 static_cast<float>(negativeSlope), *toTensor(dX));
269
0/12
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
2 BROTENSOR_API_CATCH("leakyReluBackward")
270 2 }
271
272 // ─── Codec quantization ────────────────────────────────────────────────────
273
274 2 void bro_tensor_vqEncodeForward(void* x, void* codebook, void* indices, void* quantized) {
275
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (!need("vqEncodeForward", {x, codebook, indices, quantized})) return;
276 BROTENSOR_API_TRY
277
4/8
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
4 brotensor::vq_encode_forward(*toTensor(x), *toTensor(codebook), *toTensor(indices),
278
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 *toTensor(quantized));
279
0/12
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
2 BROTENSOR_API_CATCH("vqEncodeForward")
280 2 }
281
282 2 void bro_tensor_vqEncodeBackward(void* dQuantized, void* dX) {
283
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (!need("vqEncodeBackward", {dQuantized, dX})) return;
284 BROTENSOR_API_TRY
285
3/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 brotensor::vq_encode_backward(*toTensor(dQuantized), *toTensor(dX));
286
0/12
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
2 BROTENSOR_API_CATCH("vqEncodeBackward")
287 2 }
288
289 2 void bro_tensor_fsqQuantizeForward(void* x, void* levels, void* quantized, void* packedIndices) {
290
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (!need("fsqQuantizeForward", {x, levels, quantized, packedIndices})) return;
291 BROTENSOR_API_TRY
292
4/8
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
4 brotensor::fsq_quantize_forward(*toTensor(x), *toTensor(levels), *toTensor(quantized),
293
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 *toTensor(packedIndices));
294
0/12
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
2 BROTENSOR_API_CATCH("fsqQuantizeForward")
295 2 }
296
297 2 void bro_tensor_fsqQuantizeBackward(void* dQuantized, void* dX) {
298
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (!need("fsqQuantizeBackward", {dQuantized, dX})) return;
299 BROTENSOR_API_TRY
300
3/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 brotensor::fsq_quantize_backward(*toTensor(dQuantized), *toTensor(dX));
301
0/12
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
2 BROTENSOR_API_CATCH("fsqQuantizeBackward")
302 2 }
303
304 // ─── 1D resampling ─────────────────────────────────────────────────────────
305
306 6 void bro_tensor_resample1dForward(void* X, int32_t N, int32_t C, int32_t L_in,
307 int32_t L_out, int32_t mode, void* Y) {
308
4/6
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 4 times.
6 if (!need("resample1dForward", {X, Y}) || !needNonNegative("resample1dForward", {N, C, L_in, L_out}) ||
309 8 !needElems("resample1dForward", "X", T(X), elems({N, C, L_in}))) return;
310 BROTENSOR_API_TRY
311
3/6
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
4 brotensor::resample1d_forward(*toTensor(X), N, C, L_in, L_out, mode, *toTensor(Y));
312
0/12
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
4 BROTENSOR_API_CATCH("resample1dForward")
313 6 }
314
315 4 void bro_tensor_resample1dBackward(void* dY, int32_t N, int32_t C, int32_t L_in,
316 int32_t L_out, int32_t mode, void* dX) {
317
3/6
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 4 times.
4 if (!need("resample1dBackward", {dY, dX}) || !needNonNegative("resample1dBackward", {N, C, L_in, L_out}) ||
318 4 !needElems("resample1dBackward", "dY", T(dY), elems({N, C, L_out}))) return;
319 BROTENSOR_API_TRY
320
3/6
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
4 brotensor::resample1d_backward(*toTensor(dY), N, C, L_in, L_out, mode, *toTensor(dX));
321
0/12
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
4 BROTENSOR_API_CATCH("resample1dBackward")
322 4 }
323
324 // ─── log / exp / round elementwise ─────────────────────────────────────────
325
326 2 void bro_tensor_logForward(void* x, void* y) {
327
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (!need("logForward", {x, y})) return;
328 BROTENSOR_API_TRY
329
3/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 brotensor::log_forward(*toTensor(x), *toTensor(y));
330
0/12
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
2 BROTENSOR_API_CATCH("logForward")
331 2 }
332
333 2 void bro_tensor_logBackward(void* x, void* dY, void* dX) {
334
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
2 if (!need("logBackward", {x, dY, dX}) || !needPair("logBackward", "dY", T(dY), T(x))) return;
335 BROTENSOR_API_TRY
336
4/8
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
2 brotensor::log_backward(*toTensor(x), *toTensor(dY), *toTensor(dX));
337
0/12
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
2 BROTENSOR_API_CATCH("logBackward")
338 2 }
339
340 2 void bro_tensor_expForward(void* x, void* y) {
341
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (!need("expForward", {x, y})) return;
342 BROTENSOR_API_TRY
343
3/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 brotensor::exp_forward(*toTensor(x), *toTensor(y));
344
0/12
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
2 BROTENSOR_API_CATCH("expForward")
345 2 }
346
347 2 void bro_tensor_expBackward(void* x, void* dY, void* dX) {
348
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
2 if (!need("expBackward", {x, dY, dX}) || !needPair("expBackward", "dY", T(dY), T(x))) return;
349 BROTENSOR_API_TRY
350
4/8
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
2 brotensor::exp_backward(*toTensor(x), *toTensor(dY), *toTensor(dX));
351
0/12
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
2 BROTENSOR_API_CATCH("expBackward")
352 2 }
353
354 2 void bro_tensor_roundForward(void* x, void* y) {
355
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (!need("roundForward", {x, y})) return;
356 BROTENSOR_API_TRY
357
3/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 brotensor::round_forward(*toTensor(x), *toTensor(y));
358
0/12
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
2 BROTENSOR_API_CATCH("roundForward")
359 2 }
360
361 // The straight-through estimator: dX = dY (no x needed).
362 2 void bro_tensor_roundBackward(void* dY, void* dX) {
363
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (!need("roundBackward", {dY, dX})) return;
364 BROTENSOR_API_TRY
365
3/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 brotensor::round_backward(*toTensor(dY), *toTensor(dX));
366
0/12
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
2 BROTENSOR_API_CATCH("roundBackward")
367 2 }
368
369 // ─── Autoregressive logit sampling ─────────────────────────────────────────
370 //
371 // The old binding refused sampleLogits on a CUDA build (no kernel then);
372 // brotensor carries src/cuda/sample_logits.cu today, so this dispatches on
373 // every backend. key / counter are counter-based RNG seeds: Number or BigInt,
374 // read the same way as randUniform's.
375
376 4 void bro_tensor_sampleLogits(void* logits, double temperature, int32_t topK, double topP,
377 uint64_t key_bits, uint64_t counter_bits, void* indices) {
378
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 if (!need("sampleLogits", {logits, indices})) return;
379 BROTENSOR_API_TRY
380
2/4
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
8 brotensor::sample_logits(*toTensor(logits), static_cast<float>(temperature), topK,
381 4 static_cast<float>(topP),
382
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 bronze::embed::toUint64(bronze::Value{key_bits}),
383
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 bronze::embed::toUint64(bronze::Value{counter_bits}),
384
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 *toTensor(indices));
385
0/12
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
4 BROTENSOR_API_CATCH("sampleLogits")
386 4 }
387
388 // The graph-capturable twin: counter / scratch / indices are caller-owned and
389 // touched only on-device, so a whole decode step records into a CUDA graph.
390 4 void bro_tensor_sampleLogitsInto(void* logits, double temperature, int32_t topK, double topP,
391 uint64_t key_bits, void* counter, void* scratch, void* indices) {
392
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 if (!need("sampleLogitsInto", {logits, counter, scratch, indices})) return;
393 BROTENSOR_API_TRY
394
2/4
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
8 brotensor::sample_logits_into(*toTensor(logits), static_cast<float>(temperature), topK,
395 4 static_cast<float>(topP),
396
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 bronze::embed::toUint64(bronze::Value{key_bits}),
397
3/6
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
4 *toTensor(counter), *toTensor(scratch), *toTensor(indices));
398
0/12
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
4 BROTENSOR_API_CATCH("sampleLogitsInto")
399 4 }
400
401 } // extern "C"
402