GCC Code Coverage Report


Directory: brotensor/
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 98.0% 244 / 0 / 249
Functions: 99.0% 103 / 0 / 104
Branches: 50.7% 206 / 0 / 406

src/api/api.cpp
Line Branch Exec Source
1 #include "api.h"
2 #include "api_internal.h"
3 #include "native_tensor_decl.h"
4 #include "native_tensor_batched_decl.h"
5 #include "native_tensor_attn2_decl.h"
6 #include "native_tensor_audio_decl.h"
7 #include "native_tensor_conv_decl.h"
8 #include "native_tensor_int8_decl.h"
9 #include "native_tensor_misc_decl.h"
10 #include "native_tensor_extra_decl.h"
11
12 #include <initializer_list>
13 #include <string>
14
15 extern "C" void bronze_tensor_main(void);
16 extern "C" void bronze_tensor_ext_main(void);
17 extern "C" void bronze_tensor_batched_main(void);
18 extern "C" void bronze_tensor_attn2_main(void);
19 extern "C" void bronze_tensor_audio_main(void);
20 extern "C" void bronze_tensor_conv_main(void);
21 extern "C" void bronze_tensor_int8_main(void);
22 extern "C" void bronze_tensor_misc_main(void);
23 extern "C" void bronze_tensor_extra_main(void);
24
25 namespace brotensor::api {
26
27 namespace {
28
29 namespace ev = bronze::embed;
30
31 16 std::function<std::string(const std::string&)>& pathResolverSlot() {
32
3/4
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
16 static std::function<std::string(const std::string&)> resolver;
33 16 return resolver;
34 }
35
36 450 ev::NativeSignature sig(const char* ret, std::initializer_list<const char*> params, ev::NativeKind kind) {
37 450 ev::NativeSignature s;
38
1/2
✓ Branch 0 taken 450 times.
✗ Branch 1 not taken.
450 s.returnType = ret;
39
3/4
✓ Branch 0 taken 450 times.
✓ Branch 1 taken 2439 times.
✓ Branch 2 taken 2439 times.
✗ Branch 3 not taken.
2889 for (const char* p : params) s.paramTypes.emplace_back(p);
40 450 s.kind = kind;
41 450 return s;
42 450 }
43
44 438 bool fn(const char* path, void* f, const char* ret, std::initializer_list<const char*> params, std::string* error) {
45
1/2
✓ Branch 0 taken 438 times.
✗ Branch 1 not taken.
438 return ev::registerNative(path, f, sig(ret, params, ev::NativeKind::Function), error);
46 ✗ }
47
48 6 bool getter(const char* path, void* f, const char* ret, std::string* error) {
49
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 return ev::registerNative(path, f, sig(ret, {}, ev::NativeKind::Getter), error);
50 ✗ }
51
52 6 bool ctor(const char* path, void* f, ev::HandleDestructor dtor, bronze::runtime::Finalize finalize,
53 std::initializer_list<const char*> params, std::string* error) {
54 6 ev::NativeSignature s = sig(path, params, ev::NativeKind::Constructor);
55
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 s.className = path;
56 6 s.destructor = dtor;
57 6 s.finalize = finalize;
58
2/4
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
6 return ev::registerNative(path, f, s, error);
59 6 }
60
61 6 void publishPrototype(const char* ns, const char* className, const char* protoName) {
62 6 ev::GlobalValue root = ev::globalValue("__bro_native");
63
3/4
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
6 if (!root.found || !ev::isObject(root.value)) return;
64 4 ev::GlobalValue proto = ev::nativeClassPrototype(className);
65
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 if (!proto.found) return;
66 4 ev::Persistent rootSlot(root.value);
67
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 ev::Persistent protoSlot(proto.value);
68
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.
4 ev::Persistent nsSlot(ev::getProperty(rootSlot.get(), ns));
69
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 if (!ev::isObject(nsSlot.get())) return;
70
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.
4 ev::setProperty(nsSlot.get(), protoName, protoSlot.get());
71 6 }
72
73 template <typename F>
74 450 void* p(F* f) { return reinterpret_cast<void*>(f); }
75
76 } // namespace
77
78 8742 std::string& lastErrorSlot() {
79
2/2
✓ Branch 0 taken 8740 times.
✓ Branch 1 taken 2 times.
8742 static thread_local std::string slot;
80 8742 return slot;
81 }
82
83 16 std::string resolvePath(const std::string& path) {
84 16 auto& r = pathResolverSlot();
85
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 16 times.
16 return r ? r(path) : path;
86 }
87
88 ✗ void setPathResolver(std::function<std::string(const std::string&)> resolver) {
89 ✗ pathResolverSlot() = std::move(resolver);
90 ✗ }
91
92 3 bool registerTensorNatives(std::string* error) {
93 3 const char* kTensorCls = "__bro_native.tensor.GpuTensor";
94 3 const char* kStCls = "__bro_native.tensor.SafetensorsFile";
95 3 const char* dyn = "dynamic";
96
97 3 bool ok =
98
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 ctor(kTensorCls, p(&bro_tensor_GpuTensor_ctor), &bro_tensor_GpuTensor_dtor, bronze::runtime::Finalize::InSweep, {}, error) &&
99
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 ctor(kStCls, p(&bro_tensor_SafetensorsFile_ctor), &bro_tensor_SafetensorsFile_dtor, bronze::runtime::Finalize::InSweep, {}, error) &&
100
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.takeError", p(&bro_tensor_takeError), "str", {}, error) &&
101
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.GpuTensor_downloadInto", p(&bro_tensor_GpuTensor_downloadInto), "bool", {kTensorCls, "f32[]"}, error) &&
102 // safetensors
103
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.openSafetensors", p(&bro_tensor_openSafetensors), kStCls, {"str"}, error) &&
104
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.SafetensorsFile_isOpen", p(&bro_tensor_SafetensorsFile_isOpen), "bool", {kStCls}, error) &&
105
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.SafetensorsFile_count_get", p(&bro_tensor_SafetensorsFile_count_get), "i32", {kStCls}, error) &&
106
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.SafetensorsFile_nameAt", p(&bro_tensor_SafetensorsFile_nameAt), "str", {kStCls, "i32"}, error) &&
107
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.SafetensorsFile_dtypeAt", p(&bro_tensor_SafetensorsFile_dtypeAt), "str", {kStCls, "i32"}, error) &&
108
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.SafetensorsFile_shapeAt", p(&bro_tensor_SafetensorsFile_shapeAt), "f64[]", {kStCls, "i32"}, error) &&
109
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.SafetensorsFile_nbytesAt", p(&bro_tensor_SafetensorsFile_nbytesAt), "f64", {kStCls, "i32"}, error) &&
110
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.SafetensorsFile_get", p(&bro_tensor_SafetensorsFile_get), kTensorCls, {kStCls, "str", "i32", "i32", "str"}, error) &&
111
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.SafetensorsFile_close", p(&bro_tensor_SafetensorsFile_close), "void", {kStCls}, error) &&
112
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.saveSafetensors", p(&bro_tensor_saveSafetensors), "bool", {"str", dyn, dyn}, error) &&
113 // RNG / init
114
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.randUniform", p(&bro_tensor_randUniform), "void", {dyn, dyn, kTensorCls}, error) &&
115
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.randn", p(&bro_tensor_randn), "void", {dyn, dyn, kTensorCls}, error) &&
116
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.randBernoulli", p(&bro_tensor_randBernoulli), "void", {"f64", dyn, dyn, kTensorCls}, error) &&
117
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.randnTruncated", p(&bro_tensor_randnTruncated), "void", {"f64", "f64", dyn, dyn, kTensorCls}, error) &&
118
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.xavierInit", p(&bro_tensor_xavierInit), "f64", {kTensorCls, dyn}, error) &&
119 // restored dense / loss / concat
120
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.cast", p(&bro_tensor_cast), "void", {kTensorCls, kTensorCls, "str"}, error) &&
121
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.softmaxForwardMasked", p(&bro_tensor_softmaxForwardMasked), "void", {kTensorCls, kTensorCls, dyn}, error) &&
122
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.layernormForward", p(&bro_tensor_layernormForward), "f64[]", {kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, "f64"}, error) &&
123
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.maskedMeanPoolForward", p(&bro_tensor_maskedMeanPoolForward), "void", {kTensorCls, dyn, kTensorCls}, error) &&
124
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.maskedMeanPoolBackward", p(&bro_tensor_maskedMeanPoolBackward), "void", {kTensorCls, dyn, "i32", kTensorCls}, error) &&
125
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.softmaxXentFused", p(&bro_tensor_softmaxXentFused), "f64", {kTensorCls, kTensorCls, dyn, kTensorCls, kTensorCls}, error) &&
126
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.softmaxXentFusedBatched", p(&bro_tensor_softmaxXentFusedBatched), "void", {kTensorCls, kTensorCls, dyn, kTensorCls, "i32", kTensorCls, kTensorCls, kTensorCls}, error) &&
127
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.concatRows", p(&bro_tensor_concatRows), "void", {dyn, kTensorCls}, error) &&
128
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.splitRows", p(&bro_tensor_splitRows), "void", {kTensorCls, dyn}, error) &&
129
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.concatBatchedRows", p(&bro_tensor_concatBatchedRows), "void", {dyn, kTensorCls}, error) &&
130
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.concatNchwChannels", p(&bro_tensor_concatNchwChannels), "void", {dyn, "i32", "i32", "i32", "i32[]", kTensorCls}, error) &&
131
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.concatNchwChannelsBackward", p(&bro_tensor_concatNchwChannelsBackward), "void", {kTensorCls, "i32", "i32", "i32", "i32[]", dyn}, error) &&
132 // attention family
133
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.attentionForward", p(&bro_tensor_attentionForward), "void", {kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, dyn, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls}, error) &&
134
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.attentionBackward", p(&bro_tensor_attentionBackward), "void", {kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, dyn, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls}, error) &&
135
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.mhaForward", p(&bro_tensor_mhaForward), "void", {kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, dyn, "i32", kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls}, error) &&
136
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.mhaBackward", p(&bro_tensor_mhaBackward), "void", {kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, dyn, "i32", kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls}, error) &&
137
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.selfAttentionForward", p(&bro_tensor_selfAttentionForward), "void", {kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, dyn, "i32", kTensorCls}, error) &&
138
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.selfAttentionForwardTrain", p(&bro_tensor_selfAttentionForwardTrain), "void", {kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, dyn, "i32", kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls}, error) &&
139
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.selfAttentionBackward", p(&bro_tensor_selfAttentionBackward), "void", {kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, dyn, "i32", kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls}, error) &&
140
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.selfAttentionBiasForward", p(&bro_tensor_selfAttentionBiasForward), "void", {kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, dyn, dyn, "i32", "f64", kTensorCls}, error) &&
141
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.crossAttentionForward", p(&bro_tensor_crossAttentionForward), "void", {kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, dyn, "i32", kTensorCls}, error) &&
142
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.crossAttentionForwardWithAttn", p(&bro_tensor_crossAttentionForwardWithAttn), "void", {kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, dyn, dyn, "i32", kTensorCls, kTensorCls}, error) &&
143
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.crossAttentionForwardTrain", p(&bro_tensor_crossAttentionForwardTrain), "void", {kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, dyn, "i32", kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls}, error) &&
144
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.crossAttentionBackward", p(&bro_tensor_crossAttentionBackward), "void", {kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, dyn, "i32", kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls}, error) &&
145
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.flashAttentionForward", p(&bro_tensor_flashAttentionForward), "void", {kTensorCls, kTensorCls, kTensorCls, dyn, "i32", "bool", kTensorCls}, error) &&
146
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.flashAttentionWindowedForward", p(&bro_tensor_flashAttentionWindowedForward), "void", {kTensorCls, kTensorCls, kTensorCls, dyn, "i32", "i32", kTensorCls}, error) &&
147
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.flashAttentionBackward", p(&bro_tensor_flashAttentionBackward), "void", {kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, dyn, "i32", "bool", kTensorCls, kTensorCls, kTensorCls}, error) &&
148
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.flashAttentionQkvoForward", p(&bro_tensor_flashAttentionQkvoForward), "void", {kTensorCls, dyn, kTensorCls, dyn, kTensorCls, dyn, kTensorCls, dyn, kTensorCls, dyn, dyn, "i32", "bool", kTensorCls}, error) &&
149
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.flashAttentionQkvoBackward", p(&bro_tensor_flashAttentionQkvoBackward), "void", {kTensorCls, dyn, kTensorCls, dyn, kTensorCls, dyn, kTensorCls, dyn, kTensorCls, dyn, dyn, "i32", "bool", kTensorCls, kTensorCls, dyn, kTensorCls, dyn, kTensorCls, dyn, kTensorCls, dyn, kTensorCls, dyn}, error) &&
150
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.flashAttentionProjectKv", p(&bro_tensor_flashAttentionProjectKv), "void", {kTensorCls, kTensorCls, dyn, kTensorCls, dyn, kTensorCls, kTensorCls}, error) &&
151
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.flashAttentionQWithKvCachedForward", p(&bro_tensor_flashAttentionQWithKvCachedForward), "void", {kTensorCls, kTensorCls, kTensorCls, kTensorCls, dyn, kTensorCls, dyn, dyn, "i32", "bool", kTensorCls}, error) &&
152
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.resblockForward", p(&bro_tensor_resblockForward), "void", {kTensorCls, kTensorCls, kTensorCls, kTensorCls, dyn, dyn, kTensorCls, kTensorCls, kTensorCls, dyn, dyn, dyn, "i32", "i32", "i32", "i32", "i32", "i32", "f64", kTensorCls}, error) &&
153
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.resblockBackward", p(&bro_tensor_resblockBackward), "void", {kTensorCls, kTensorCls, kTensorCls, kTensorCls, dyn, dyn, kTensorCls, kTensorCls, kTensorCls, dyn, dyn, dyn, "i32", "i32", "i32", "i32", "i32", "i32", "f64", kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, dyn, dyn, kTensorCls, kTensorCls, kTensorCls, dyn, dyn, dyn}, error) &&
154
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.createTensor", p(&bro_tensor_createTensor), kTensorCls, {"i32", "i32", "str"}, error) &&
155
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.GpuTensor_rows_get", p(&bro_tensor_GpuTensor_rows_get), "i32", {kTensorCls}, error) &&
156
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.GpuTensor_cols_get", p(&bro_tensor_GpuTensor_cols_get), "i32", {kTensorCls}, error) &&
157
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.GpuTensor_size_get", p(&bro_tensor_GpuTensor_size_get), "i32", {kTensorCls}, error) &&
158
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.GpuTensor_bytes_get", p(&bro_tensor_GpuTensor_bytes_get), "i32", {kTensorCls}, error) &&
159
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.GpuTensor_zero", p(&bro_tensor_GpuTensor_zero), "void", {kTensorCls}, error) &&
160
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.GpuTensor_resize", p(&bro_tensor_GpuTensor_resize), "void", {kTensorCls, "i32", "i32", "str"}, error) &&
161
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.GpuTensor_dtype", p(&bro_tensor_GpuTensor_dtype), "str", {kTensorCls}, error) &&
162
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.GpuTensor_clone", p(&bro_tensor_GpuTensor_clone), kTensorCls, {kTensorCls}, error) &&
163
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.GpuTensor_upload", p(&bro_tensor_GpuTensor_upload), "void", {kTensorCls, "f32[]"}, error) &&
164
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.GpuTensor_download", p(&bro_tensor_GpuTensor_download), "f32[]", {kTensorCls}, error) &&
165
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.GpuTensor_uploadFp16", p(&bro_tensor_GpuTensor_uploadFp16), "void", {kTensorCls, "u16[]"}, error) &&
166
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.GpuTensor_downloadFp16", p(&bro_tensor_GpuTensor_downloadFp16), "u16[]", {kTensorCls}, error) &&
167
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.GpuTensor_uploadInt8", p(&bro_tensor_GpuTensor_uploadInt8), "void", {kTensorCls, "i8[]"}, error) &&
168
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.GpuTensor_downloadInt8", p(&bro_tensor_GpuTensor_downloadInt8), "i8[]", {kTensorCls}, error) &&
169
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 getter("__bro_native.tensor.available", p(&bro_tensor_available_get), "bool", error) &&
170
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 getter("__bro_native.tensor.backend", p(&bro_tensor_backend_get), "str", error) &&
171
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.init", p(&bro_tensor_init), "void", {}, error) &&
172
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.sync", p(&bro_tensor_sync), "void", {}, error) &&
173
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.linearForward", p(&bro_tensor_linearForward), "void", {kTensorCls, kTensorCls, kTensorCls, kTensorCls}, error) &&
174
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.linearBackward", p(&bro_tensor_linearBackward), "void", {kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls}, error) &&
175
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.reluForward", p(&bro_tensor_reluForward), "void", {kTensorCls, kTensorCls}, error) &&
176
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.reluBackward", p(&bro_tensor_reluBackward), "void", {kTensorCls, kTensorCls, kTensorCls}, error) &&
177
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.tanhForward", p(&bro_tensor_tanhForward), "void", {kTensorCls, kTensorCls}, error) &&
178
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.tanhBackward", p(&bro_tensor_tanhBackward), "void", {kTensorCls, kTensorCls, kTensorCls}, error) &&
179
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.sigmoidForward", p(&bro_tensor_sigmoidForward), "void", {kTensorCls, kTensorCls}, error) &&
180
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.sigmoidBackward", p(&bro_tensor_sigmoidBackward), "void", {kTensorCls, kTensorCls, kTensorCls}, error) &&
181
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.addInplace", p(&bro_tensor_addInplace), "void", {kTensorCls, kTensorCls}, error) &&
182
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.addScalarInplace", p(&bro_tensor_addScalarInplace), "void", {kTensorCls, "f64"}, error) &&
183
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.scaleInplace", p(&bro_tensor_scaleInplace), "void", {kTensorCls, "f64"}, error) &&
184
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.mulInplace", p(&bro_tensor_mulInplace), "void", {kTensorCls, kTensorCls}, error) &&
185
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.clamp", p(&bro_tensor_clamp), "void", {kTensorCls, "f64", "f64"}, error) &&
186
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.siluForward", p(&bro_tensor_siluForward), "void", {kTensorCls, kTensorCls}, error) &&
187
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.siluBackward", p(&bro_tensor_siluBackward), "void", {kTensorCls, kTensorCls, kTensorCls}, error) &&
188
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.geluForward", p(&bro_tensor_geluForward), "void", {kTensorCls, kTensorCls}, error) &&
189
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.geluBackward", p(&bro_tensor_geluBackward), "void", {kTensorCls, kTensorCls, kTensorCls}, error) &&
190
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.geluExactForward", p(&bro_tensor_geluExactForward), "void", {kTensorCls, kTensorCls}, error) &&
191
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.geluExactBackward", p(&bro_tensor_geluExactBackward), "void", {kTensorCls, kTensorCls, kTensorCls}, error) &&
192
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.quickGeluForward", p(&bro_tensor_quickGeluForward), "void", {kTensorCls, kTensorCls}, error) &&
193
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.quickGeluBackward", p(&bro_tensor_quickGeluBackward), "void", {kTensorCls, kTensorCls, kTensorCls}, error) &&
194
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.swigluForward", p(&bro_tensor_swigluForward), "void", {kTensorCls, kTensorCls}, error) &&
195
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.swigluBackward", p(&bro_tensor_swigluBackward), "void", {kTensorCls, kTensorCls, kTensorCls}, error) &&
196
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.gegluForward", p(&bro_tensor_gegluForward), "void", {kTensorCls, kTensorCls}, error) &&
197
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.gegluBackward", p(&bro_tensor_gegluBackward), "void", {kTensorCls, kTensorCls, kTensorCls}, error) &&
198
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.gegluExactForward", p(&bro_tensor_gegluExactForward), "void", {kTensorCls, kTensorCls}, error) &&
199
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.gegluExactBackward", p(&bro_tensor_gegluExactBackward), "void", {kTensorCls, kTensorCls, kTensorCls}, error) &&
200
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.softmaxForward", p(&bro_tensor_softmaxForward), "void", {kTensorCls, kTensorCls, "f64"}, error) &&
201
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.softmaxBackward", p(&bro_tensor_softmaxBackward), "void", {kTensorCls, kTensorCls, kTensorCls}, error) &&
202
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.matmul", p(&bro_tensor_matmul), "void", {kTensorCls, kTensorCls, kTensorCls}, error) &&
203
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.matmulBackward", p(&bro_tensor_matmulBackward), "void", {kTensorCls, kTensorCls, kTensorCls, kTensorCls, kTensorCls}, error) &&
204
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.conv2dForward", p(&bro_tensor_conv2dForward), "void", {kTensorCls, kTensorCls, "dynamic", "i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32", kTensorCls}, error) &&
205
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.conv2dBackwardInput", p(&bro_tensor_conv2dBackwardInput), "void", {kTensorCls, kTensorCls, "i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32", kTensorCls}, error) &&
206
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.conv2dBackwardWeight", p(&bro_tensor_conv2dBackwardWeight), "void", {kTensorCls, kTensorCls, "i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32", kTensorCls}, error) &&
207
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.conv2dBackwardBias", p(&bro_tensor_conv2dBackwardBias), "void", {kTensorCls, "i32", "i32", "i32", "i32", kTensorCls}, error) &&
208
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.upsampleNearest2xForward", p(&bro_tensor_upsampleNearest2xForward), "void", {kTensorCls, "i32", "i32", "i32", "i32", kTensorCls}, error) &&
209
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.upsampleNearest2xBackward", p(&bro_tensor_upsampleNearest2xBackward), "void", {kTensorCls, "i32", "i32", "i32", "i32", kTensorCls}, error) &&
210
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.upsampleBilinear2xForward", p(&bro_tensor_upsampleBilinear2xForward), "void", {kTensorCls, "i32", "i32", "i32", "i32", kTensorCls}, error) &&
211
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.upsampleBilinear2xBackward", p(&bro_tensor_upsampleBilinear2xBackward), "void", {kTensorCls, "i32", "i32", "i32", "i32", kTensorCls}, error) &&
212
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.downsampleAvg2xForward", p(&bro_tensor_downsampleAvg2xForward), "void", {kTensorCls, "i32", "i32", "i32", "i32", kTensorCls}, error) &&
213
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.downsampleAvg2xBackward", p(&bro_tensor_downsampleAvg2xBackward), "void", {kTensorCls, "i32", "i32", "i32", "i32", kTensorCls}, error) &&
214
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.sumRows", p(&bro_tensor_sumRows), "void", {kTensorCls, kTensorCls}, error) &&
215
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.sumCols", p(&bro_tensor_sumCols), "void", {kTensorCls, kTensorCls}, error) &&
216
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.argmaxRows", p(&bro_tensor_argmaxRows), "void", {kTensorCls, kTensorCls}, error) &&
217
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.copyD2D", p(&bro_tensor_copyD2D), "void", {kTensorCls, "i32", kTensorCls, "i32", "i32"}, error) &&
218
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.nchwToSequence", p(&bro_tensor_nchwToSequence), "void", {kTensorCls, "i32", "i32", "i32", "i32", kTensorCls}, error) &&
219
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_tensor_sequenceToNchw", p(&bro_tensor_sequenceToNchw), "void", {kTensorCls, "i32", "i32", "i32", "i32", kTensorCls}, error) &&
220
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.sequenceToNchw", p(&bro_tensor_sequenceToNchw), "void", {kTensorCls, "i32", "i32", "i32", "i32", kTensorCls}, error) &&
221
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.interp2dForward", p(&bro_tensor_interp2dForward), "void", {kTensorCls, "i32", "i32", "i32", "i32", "i32", "i32", "i32", kTensorCls}, error) &&
222
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.interp2dAlignCornersForward", p(&bro_tensor_interp2dAlignCornersForward), "void", {kTensorCls, "i32", "i32", "i32", "i32", "i32", "i32", "i32", kTensorCls}, error) &&
223
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.unfold2dForward", p(&bro_tensor_unfold2dForward), "void", {kTensorCls, "i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32", "i32", kTensorCls}, error) &&
224
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.l2NormalizeNchwForward", p(&bro_tensor_l2NormalizeNchwForward), "void", {kTensorCls, "i32", "i32", "i32", "i32", "f64", kTensorCls}, error) &&
225
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.convexUpsampleForward", p(&bro_tensor_convexUpsampleForward), "void", {kTensorCls, kTensorCls, "i32", "i32", "i32", "i32", "i32", kTensorCls}, error) &&
226
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.mseVecForward", p(&bro_tensor_mseVecForward), "f64", {kTensorCls, kTensorCls}, error) &&
227
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.mseVecBackward", p(&bro_tensor_mseVecBackward), "void", {kTensorCls, kTensorCls, kTensorCls}, error) &&
228
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.mseVecPerSample", p(&bro_tensor_mseVecPerSample), "void", {kTensorCls, kTensorCls, kTensorCls, kTensorCls}, error) &&
229
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.layernormBackward", p(&bro_tensor_layernormBackward), "void", {kTensorCls, kTensorCls, kTensorCls, "f64", kTensorCls, kTensorCls, kTensorCls}, error) &&
230
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.layernormForwardInferenceBatched", p(&bro_tensor_layernormForwardInferenceBatched), "void", {kTensorCls, kTensorCls, kTensorCls, kTensorCls, "f64"}, error) &&
231
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.layernormForwardInferenceBatchedFp16", p(&bro_tensor_layernormForwardInferenceBatchedFp16), "void", {kTensorCls, kTensorCls, kTensorCls, kTensorCls, "f64"}, error) &&
232
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.rmsNormForward", p(&bro_tensor_rmsNormForward), "void", {kTensorCls, kTensorCls, "f64", kTensorCls}, error) &&
233
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.rmsNormBackward", p(&bro_tensor_rmsNormBackward), "void", {kTensorCls, kTensorCls, kTensorCls, "f64", kTensorCls, kTensorCls}, error) &&
234
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.groupNormForward", p(&bro_tensor_groupNormForward), "void", {kTensorCls, kTensorCls, kTensorCls, "i32", "i32", "i32", "i32", "i32", "f64", kTensorCls}, error) &&
235
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.groupNormBackward", p(&bro_tensor_groupNormBackward), "void", {kTensorCls, kTensorCls, kTensorCls, "i32", "i32", "i32", "i32", "i32", "f64", kTensorCls, kTensorCls, kTensorCls}, error) &&
236
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.ropeForward", p(&bro_tensor_ropeForward), "void", {kTensorCls, "i32", "i32", "i32", "f64", kTensorCls}, error) &&
237
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.ropeBackward", p(&bro_tensor_ropeBackward), "void", {kTensorCls, "i32", "i32", "i32", "f64", kTensorCls}, error) &&
238
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.ropeApply", p(&bro_tensor_ropeApply), "void", {kTensorCls, kTensorCls, kTensorCls, "i32", "i32", kTensorCls}, error) &&
239
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.ropeApplyBackward", p(&bro_tensor_ropeApplyBackward), "void", {kTensorCls, kTensorCls, kTensorCls, "i32", "i32", kTensorCls}, error) &&
240
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.modulate", p(&bro_tensor_modulate), "void", {kTensorCls, kTensorCls, kTensorCls, kTensorCls}, error) &&
241
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.broadcastMul", p(&bro_tensor_broadcastMul), "void", {kTensorCls, kTensorCls, kTensorCls}, error) &&
242
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.attentionTokenMoments", p(&bro_tensor_attentionTokenMoments), "void", {kTensorCls, "i32", "i32", kTensorCls, kTensorCls}, error) &&
243
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.buildSlotMask", p(&bro_tensor_buildSlotMask), "void", {kTensorCls, "i32", "i32", "i32", kTensorCls}, error) &&
244
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.buildCausalMaskRow", p(&bro_tensor_buildCausalMaskRow), "void", {"i32", "i32", kTensorCls}, error) &&
245
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.flashAttentionDecode", p(&bro_tensor_flashAttentionDecode), "void", {kTensorCls, kTensorCls, kTensorCls, "i32", "i32", kTensorCls, "bool", "i32", "f64", "i32"}, error) &&
246
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.flashAttentionDecodeMasked", p(&bro_tensor_flashAttentionDecodeMasked), "void", {kTensorCls, kTensorCls, kTensorCls, kTensorCls, "i32", kTensorCls, "bool", "i32", "f64", "i32"}, error) &&
247
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.kvCacheAppend", p(&bro_tensor_kvCacheAppend), "void", {kTensorCls, kTensorCls, "i32", kTensorCls, kTensorCls}, error) &&
248
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.embeddingLookupForward", p(&bro_tensor_embeddingLookupForward), "void", {kTensorCls, kTensorCls, "i32", kTensorCls}, error) &&
249
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 fn("__bro_native.tensor.embeddingLookupBackward", p(&bro_tensor_embeddingLookupBackward), "void", {kTensorCls, kTensorCls, "i32", kTensorCls}, error) &&
250
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 fn("__bro_native.tensor.sgdStep", p(&bro_tensor_sgdStep), "void", {kTensorCls, kTensorCls, kTensorCls, "f64", "f64"}, error) &&
251 3 fn("__bro_native.tensor.adamStep", p(&bro_tensor_adamStep), "void", {kTensorCls, kTensorCls, kTensorCls, kTensorCls, "f64", "f64", "f64", "f64", "i32"}, error);
252
253 // The restored free-function groups: each native file owns its own table
254 // so the files stay readable (see native_register.h).
255
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
6 ok = ok &&
256
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 registerTensorNatives_batched(error) &&
257
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 registerTensorNatives_attn2(error) &&
258
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 registerTensorNatives_audio(error) &&
259
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 registerTensorNatives_conv(error) &&
260
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 registerTensorNatives_int8(error) &&
261
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 registerTensorNatives_misc(error) &&
262 3 registerTensorNatives_extra(error);
263
264
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 if (!ok) return false;
265 3 publishPrototype("tensor", kTensorCls, "GpuTensorProto");
266 3 publishPrototype("tensor", kStCls, "SafetensorsFileProto");
267 3 return true;
268 3 }
269
270 2 void installTensorJS() {
271 // js/tensor.js first (it mounts bro.tensor and GpuTensor), then
272 // js/tensor_ext.js, which decorates that namespace with the attention /
273 // loss / concat family and reads GpuTensor for its argument checks.
274 2 ev::runEntry(bronze_tensor_main);
275 2 ev::runEntry(bronze_tensor_ext_main);
276 // The restored groups decorate the same namespace and read GpuTensor for
277 // their argument checks, so they all run after those two.
278 2 ev::runEntry(bronze_tensor_batched_main);
279 2 ev::runEntry(bronze_tensor_attn2_main);
280 2 ev::runEntry(bronze_tensor_audio_main);
281 2 ev::runEntry(bronze_tensor_conv_main);
282 2 ev::runEntry(bronze_tensor_int8_main);
283 2 ev::runEntry(bronze_tensor_misc_main);
284 2 ev::runEntry(bronze_tensor_extra_main);
285 2 }
286
287 2 void installTensor() {
288 2 auto g = ev::globalValue("__bro_native");
289
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2 if (!g.found || !ev::isObject(g.value)) {
290 2 ev::Value obj = ev::createObject();
291 2 ev::registerGlobal("__bro_native", obj);
292 2 }
293 2 auto bn = ev::globalValue("__bro_native").value;
294 2 ev::Persistent bnSlot(bn);
295
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 ev::Persistent tensorSlot(ev::createObject());
296
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 ev::setProperty(bnSlot.get(), "tensor", tensorSlot.get());
297
298
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 auto gt = ev::globalValue("globalThis");
299
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 if (gt.found && ev::isObject(gt.value)) {
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 ev::setProperty(gt.value, "__bro_native", bnSlot.get());
301 2 }
302
303
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 registerTensorNatives();
304
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 installTensorJS();
305 2 }
306
307 2 brotensor::Tensor* getTensorFromHandle(bronze::Value val) {
308 2 void* data = bronze::embed::handleData(val);
309
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 if (!data) return nullptr;
310 2 return toTensor(data);
311 2 }
312
313 2 bronze::Value createGpuTensorValue(brotensor::Tensor tensor) {
314 2 auto* h = new GpuTensorHandle();
315 2 h->tensor = std::move(tensor);
316 2 return bronze::embed::wrapNative(h, "__bro_native.tensor.GpuTensor");
317 }
318
319 } // namespace brotensor::api
320