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 |