cohere-transcribe 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (480) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +21 -0
  3. data/LICENSE.txt +201 -0
  4. data/NOTICE +5 -0
  5. data/README.md +265 -0
  6. data/THIRD_PARTY_NOTICES.md +67 -0
  7. data/exe/cohere-transcribe +8 -0
  8. data/exe/cohere-transcribe-doctor +8 -0
  9. data/ext/cohere_transcribe_native/CMakeLists.txt +262 -0
  10. data/ext/cohere_transcribe_native/README.md +26 -0
  11. data/ext/cohere_transcribe_native/audio_abi.cpp +1416 -0
  12. data/ext/cohere_transcribe_native/audio_exports.macos +5 -0
  13. data/ext/cohere_transcribe_native/audio_exports.map +10 -0
  14. data/ext/cohere_transcribe_native/cohere_abi.cpp +1209 -0
  15. data/ext/cohere_transcribe_native/exports.macos +40 -0
  16. data/ext/cohere_transcribe_native/exports.map +45 -0
  17. data/ext/cohere_transcribe_native/extconf.rb +89 -0
  18. data/ext/cohere_transcribe_native/test/abi_smoke.rb +232 -0
  19. data/ext/cohere_transcribe_native/test/audio_matrix_smoke.cpp +121 -0
  20. data/ext/cohere_transcribe_native/test/audio_reliability_smoke.cpp +198 -0
  21. data/ext/cohere_transcribe_native/test/native_abi_reliability_smoke.cpp +186 -0
  22. data/ext/cohere_transcribe_native/test/native_batch_projection_probe.rb +81 -0
  23. data/ext/cohere_transcribe_native/test/native_cancellation_smoke.cpp +194 -0
  24. data/lib/cohere/transcribe/alignment/ATTRIBUTION.md +23 -0
  25. data/lib/cohere/transcribe/alignment/LICENSE.ctc-forced-aligner +407 -0
  26. data/lib/cohere/transcribe/alignment/LICENSE.torchaudio +25 -0
  27. data/lib/cohere/transcribe/alignment/LICENSE.uroman +26 -0
  28. data/lib/cohere/transcribe/alignment/aligner.rb +476 -0
  29. data/lib/cohere/transcribe/alignment/ctc.rb +224 -0
  30. data/lib/cohere/transcribe/alignment/text.rb +237 -0
  31. data/lib/cohere/transcribe/alignment/uroman_data.rb +4950 -0
  32. data/lib/cohere/transcribe/api.rb +173 -0
  33. data/lib/cohere/transcribe/asr/batching.rb +472 -0
  34. data/lib/cohere/transcribe/asr/failure_policy.rb +112 -0
  35. data/lib/cohere/transcribe/asr/native.rb +676 -0
  36. data/lib/cohere/transcribe/audio/ATTRIBUTION.md +8 -0
  37. data/lib/cohere/transcribe/audio/LICENSE.auditok +21 -0
  38. data/lib/cohere/transcribe/audio/decoder.rb +315 -0
  39. data/lib/cohere/transcribe/audio/ffmpeg_native.rb +248 -0
  40. data/lib/cohere/transcribe/audio/segmentation.rb +260 -0
  41. data/lib/cohere/transcribe/cli.rb +727 -0
  42. data/lib/cohere/transcribe/configuration.rb +282 -0
  43. data/lib/cohere/transcribe/constants.rb +14 -0
  44. data/lib/cohere/transcribe/dense_converter.rb +548 -0
  45. data/lib/cohere/transcribe/doctor.rb +576 -0
  46. data/lib/cohere/transcribe/errors.rb +57 -0
  47. data/lib/cohere/transcribe/gguf_writer.rb +268 -0
  48. data/lib/cohere/transcribe/hub.rb +436 -0
  49. data/lib/cohere/transcribe/input.rb +110 -0
  50. data/lib/cohere/transcribe/licenses/crispasr.txt +21 -0
  51. data/lib/cohere/transcribe/loader.rb +128 -0
  52. data/lib/cohere/transcribe/model_identity.rb +440 -0
  53. data/lib/cohere/transcribe/output/publication.rb +1118 -0
  54. data/lib/cohere/transcribe/output/rendering.rb +105 -0
  55. data/lib/cohere/transcribe/output/timing.rb +86 -0
  56. data/lib/cohere/transcribe/python_text.rb +70 -0
  57. data/lib/cohere/transcribe/pytorch_checkpoint.rb +1180 -0
  58. data/lib/cohere/transcribe/runtime/engine.rb +1676 -0
  59. data/lib/cohere/transcribe/runtime/model_provider.rb +390 -0
  60. data/lib/cohere/transcribe/runtime/precision.rb +57 -0
  61. data/lib/cohere/transcribe/runtime/preparation.rb +215 -0
  62. data/lib/cohere/transcribe/runtime/resources.rb +165 -0
  63. data/lib/cohere/transcribe/runtime/word_pipeline.rb +364 -0
  64. data/lib/cohere/transcribe/safetensors.rb +579 -0
  65. data/lib/cohere/transcribe/state/checkpoint.rb +224 -0
  66. data/lib/cohere/transcribe/state/contracts.rb +141 -0
  67. data/lib/cohere/transcribe/state/io.rb +727 -0
  68. data/lib/cohere/transcribe/state/locking.rb +211 -0
  69. data/lib/cohere/transcribe/state/manifest.rb +155 -0
  70. data/lib/cohere/transcribe/state.rb +7 -0
  71. data/lib/cohere/transcribe/types.rb +535 -0
  72. data/lib/cohere/transcribe/vad/ATTRIBUTION.md +14 -0
  73. data/lib/cohere/transcribe/vad/LICENSE.faster-whisper +21 -0
  74. data/lib/cohere/transcribe/vad/LICENSE.silero-vad +21 -0
  75. data/lib/cohere/transcribe/vad/silero.rb +344 -0
  76. data/lib/cohere/transcribe/vad/silero_vad_v6.onnx +0 -0
  77. data/lib/cohere/transcribe/vad/timestamps.rb +219 -0
  78. data/lib/cohere/transcribe/version.rb +7 -0
  79. data/lib/cohere/transcribe.rb +26 -0
  80. data/sig/cohere/transcribe.rbs +250 -0
  81. data/vendor/crispasr/AUTHORS +510 -0
  82. data/vendor/crispasr/LICENSE +21 -0
  83. data/vendor/crispasr/UPSTREAM.md +9 -0
  84. data/vendor/crispasr/VERSION +1 -0
  85. data/vendor/crispasr/ggml/AUTHORS +335 -0
  86. data/vendor/crispasr/ggml/CMakeLists.txt +512 -0
  87. data/vendor/crispasr/ggml/LICENSE +21 -0
  88. data/vendor/crispasr/ggml/README.md +49 -0
  89. data/vendor/crispasr/ggml/cmake/FindNCCL.cmake +36 -0
  90. data/vendor/crispasr/ggml/cmake/GitVars.cmake +22 -0
  91. data/vendor/crispasr/ggml/cmake/common.cmake +50 -0
  92. data/vendor/crispasr/ggml/cmake/ggml-config.cmake.in +191 -0
  93. data/vendor/crispasr/ggml/ggml.pc.in +10 -0
  94. data/vendor/crispasr/ggml/include/ggml-alloc.h +85 -0
  95. data/vendor/crispasr/ggml/include/ggml-backend.h +431 -0
  96. data/vendor/crispasr/ggml/include/ggml-blas.h +25 -0
  97. data/vendor/crispasr/ggml/include/ggml-cann.h +123 -0
  98. data/vendor/crispasr/ggml/include/ggml-cpp.h +39 -0
  99. data/vendor/crispasr/ggml/include/ggml-cpu.h +151 -0
  100. data/vendor/crispasr/ggml/include/ggml-cuda.h +50 -0
  101. data/vendor/crispasr/ggml/include/ggml-hexagon.h +19 -0
  102. data/vendor/crispasr/ggml/include/ggml-metal.h +61 -0
  103. data/vendor/crispasr/ggml/include/ggml-opencl.h +26 -0
  104. data/vendor/crispasr/ggml/include/ggml-openvino.h +37 -0
  105. data/vendor/crispasr/ggml/include/ggml-opt.h +256 -0
  106. data/vendor/crispasr/ggml/include/ggml-rpc.h +35 -0
  107. data/vendor/crispasr/ggml/include/ggml-sycl.h +49 -0
  108. data/vendor/crispasr/ggml/include/ggml-virtgpu.h +14 -0
  109. data/vendor/crispasr/ggml/include/ggml-vulkan.h +29 -0
  110. data/vendor/crispasr/ggml/include/ggml-webgpu.h +19 -0
  111. data/vendor/crispasr/ggml/include/ggml-zdnn.h +17 -0
  112. data/vendor/crispasr/ggml/include/ggml-zendnn.h +22 -0
  113. data/vendor/crispasr/ggml/include/ggml.h +2887 -0
  114. data/vendor/crispasr/ggml/include/gguf.h +204 -0
  115. data/vendor/crispasr/ggml/src/CMakeLists.txt +493 -0
  116. data/vendor/crispasr/ggml/src/ggml-alloc.c +1323 -0
  117. data/vendor/crispasr/ggml/src/ggml-backend-dl.cpp +48 -0
  118. data/vendor/crispasr/ggml/src/ggml-backend-dl.h +44 -0
  119. data/vendor/crispasr/ggml/src/ggml-backend-impl.h +275 -0
  120. data/vendor/crispasr/ggml/src/ggml-backend-meta.cpp +2145 -0
  121. data/vendor/crispasr/ggml/src/ggml-backend-reg.cpp +586 -0
  122. data/vendor/crispasr/ggml/src/ggml-backend.cpp +2437 -0
  123. data/vendor/crispasr/ggml/src/ggml-common.h +1900 -0
  124. data/vendor/crispasr/ggml/src/ggml-cpu/CMakeLists.txt +718 -0
  125. data/vendor/crispasr/ggml/src/ggml-cpu/amx/amx.cpp +249 -0
  126. data/vendor/crispasr/ggml/src/ggml-cpu/amx/amx.h +8 -0
  127. data/vendor/crispasr/ggml/src/ggml-cpu/amx/common.h +115 -0
  128. data/vendor/crispasr/ggml/src/ggml-cpu/amx/mmq.cpp +2512 -0
  129. data/vendor/crispasr/ggml/src/ggml-cpu/amx/mmq.h +10 -0
  130. data/vendor/crispasr/ggml/src/ggml-cpu/arch/arm/cpu-feats.cpp +98 -0
  131. data/vendor/crispasr/ggml/src/ggml-cpu/arch/arm/quants.c +4244 -0
  132. data/vendor/crispasr/ggml/src/ggml-cpu/arch/arm/repack.cpp +5156 -0
  133. data/vendor/crispasr/ggml/src/ggml-cpu/arch/loongarch/quants.c +2158 -0
  134. data/vendor/crispasr/ggml/src/ggml-cpu/arch/powerpc/cpu-feats.cpp +82 -0
  135. data/vendor/crispasr/ggml/src/ggml-cpu/arch/powerpc/quants.c +2304 -0
  136. data/vendor/crispasr/ggml/src/ggml-cpu/arch/riscv/cpu-feats.cpp +38 -0
  137. data/vendor/crispasr/ggml/src/ggml-cpu/arch/riscv/quants.c +4455 -0
  138. data/vendor/crispasr/ggml/src/ggml-cpu/arch/riscv/repack.cpp +1703 -0
  139. data/vendor/crispasr/ggml/src/ggml-cpu/arch/s390/cpu-feats.cpp +50 -0
  140. data/vendor/crispasr/ggml/src/ggml-cpu/arch/s390/quants.c +1465 -0
  141. data/vendor/crispasr/ggml/src/ggml-cpu/arch/wasm/quants.c +1220 -0
  142. data/vendor/crispasr/ggml/src/ggml-cpu/arch/x86/cpu-feats.cpp +327 -0
  143. data/vendor/crispasr/ggml/src/ggml-cpu/arch/x86/quants.c +3970 -0
  144. data/vendor/crispasr/ggml/src/ggml-cpu/arch/x86/repack.cpp +6407 -0
  145. data/vendor/crispasr/ggml/src/ggml-cpu/arch-fallback.h +349 -0
  146. data/vendor/crispasr/ggml/src/ggml-cpu/binary-ops.cpp +154 -0
  147. data/vendor/crispasr/ggml/src/ggml-cpu/binary-ops.h +16 -0
  148. data/vendor/crispasr/ggml/src/ggml-cpu/cmake/FindSIMD.cmake +100 -0
  149. data/vendor/crispasr/ggml/src/ggml-cpu/common.h +95 -0
  150. data/vendor/crispasr/ggml/src/ggml-cpu/ggml-cpu-impl.h +539 -0
  151. data/vendor/crispasr/ggml/src/ggml-cpu/ggml-cpu.c +3791 -0
  152. data/vendor/crispasr/ggml/src/ggml-cpu/ggml-cpu.cpp +703 -0
  153. data/vendor/crispasr/ggml/src/ggml-cpu/hbm.cpp +55 -0
  154. data/vendor/crispasr/ggml/src/ggml-cpu/hbm.h +8 -0
  155. data/vendor/crispasr/ggml/src/ggml-cpu/kleidiai/kernels.cpp +939 -0
  156. data/vendor/crispasr/ggml/src/ggml-cpu/kleidiai/kernels.h +90 -0
  157. data/vendor/crispasr/ggml/src/ggml-cpu/kleidiai/kleidiai.cpp +1513 -0
  158. data/vendor/crispasr/ggml/src/ggml-cpu/kleidiai/kleidiai.h +17 -0
  159. data/vendor/crispasr/ggml/src/ggml-cpu/llamafile/sgemm.cpp +4051 -0
  160. data/vendor/crispasr/ggml/src/ggml-cpu/llamafile/sgemm.h +25 -0
  161. data/vendor/crispasr/ggml/src/ggml-cpu/ops.cpp +11662 -0
  162. data/vendor/crispasr/ggml/src/ggml-cpu/ops.h +121 -0
  163. data/vendor/crispasr/ggml/src/ggml-cpu/quants.c +1288 -0
  164. data/vendor/crispasr/ggml/src/ggml-cpu/quants.h +103 -0
  165. data/vendor/crispasr/ggml/src/ggml-cpu/repack.cpp +4836 -0
  166. data/vendor/crispasr/ggml/src/ggml-cpu/repack.h +245 -0
  167. data/vendor/crispasr/ggml/src/ggml-cpu/simd-gemm.h +226 -0
  168. data/vendor/crispasr/ggml/src/ggml-cpu/simd-mappings.h +1329 -0
  169. data/vendor/crispasr/ggml/src/ggml-cpu/spacemit/ime.cpp +1025 -0
  170. data/vendor/crispasr/ggml/src/ggml-cpu/spacemit/ime.h +13 -0
  171. data/vendor/crispasr/ggml/src/ggml-cpu/spacemit/ime1_kernels.cpp +3196 -0
  172. data/vendor/crispasr/ggml/src/ggml-cpu/spacemit/ime_kernels.h +26 -0
  173. data/vendor/crispasr/ggml/src/ggml-cpu/traits.cpp +36 -0
  174. data/vendor/crispasr/ggml/src/ggml-cpu/traits.h +38 -0
  175. data/vendor/crispasr/ggml/src/ggml-cpu/unary-ops.cpp +336 -0
  176. data/vendor/crispasr/ggml/src/ggml-cpu/unary-ops.h +35 -0
  177. data/vendor/crispasr/ggml/src/ggml-cpu/vec.cpp +681 -0
  178. data/vendor/crispasr/ggml/src/ggml-cpu/vec.h +1606 -0
  179. data/vendor/crispasr/ggml/src/ggml-cuda/CMakeLists.txt +272 -0
  180. data/vendor/crispasr/ggml/src/ggml-cuda/acc.cu +61 -0
  181. data/vendor/crispasr/ggml/src/ggml-cuda/acc.cuh +5 -0
  182. data/vendor/crispasr/ggml/src/ggml-cuda/add-id.cu +58 -0
  183. data/vendor/crispasr/ggml/src/ggml-cuda/add-id.cuh +3 -0
  184. data/vendor/crispasr/ggml/src/ggml-cuda/arange.cu +34 -0
  185. data/vendor/crispasr/ggml/src/ggml-cuda/arange.cuh +5 -0
  186. data/vendor/crispasr/ggml/src/ggml-cuda/argmax.cu +91 -0
  187. data/vendor/crispasr/ggml/src/ggml-cuda/argmax.cuh +3 -0
  188. data/vendor/crispasr/ggml/src/ggml-cuda/argsort.cu +265 -0
  189. data/vendor/crispasr/ggml/src/ggml-cuda/argsort.cuh +19 -0
  190. data/vendor/crispasr/ggml/src/ggml-cuda/binbcast.cu +534 -0
  191. data/vendor/crispasr/ggml/src/ggml-cuda/binbcast.cuh +12 -0
  192. data/vendor/crispasr/ggml/src/ggml-cuda/clamp.cu +45 -0
  193. data/vendor/crispasr/ggml/src/ggml-cuda/clamp.cuh +5 -0
  194. data/vendor/crispasr/ggml/src/ggml-cuda/col2im-1d.cu +81 -0
  195. data/vendor/crispasr/ggml/src/ggml-cuda/col2im-1d.cuh +3 -0
  196. data/vendor/crispasr/ggml/src/ggml-cuda/common.cuh +1489 -0
  197. data/vendor/crispasr/ggml/src/ggml-cuda/concat.cu +204 -0
  198. data/vendor/crispasr/ggml/src/ggml-cuda/concat.cuh +5 -0
  199. data/vendor/crispasr/ggml/src/ggml-cuda/conv-transpose-1d.cu +97 -0
  200. data/vendor/crispasr/ggml/src/ggml-cuda/conv-transpose-1d.cuh +5 -0
  201. data/vendor/crispasr/ggml/src/ggml-cuda/conv2d-dw.cu +161 -0
  202. data/vendor/crispasr/ggml/src/ggml-cuda/conv2d-dw.cuh +5 -0
  203. data/vendor/crispasr/ggml/src/ggml-cuda/conv2d-transpose.cu +115 -0
  204. data/vendor/crispasr/ggml/src/ggml-cuda/conv2d-transpose.cuh +5 -0
  205. data/vendor/crispasr/ggml/src/ggml-cuda/conv2d.cu +166 -0
  206. data/vendor/crispasr/ggml/src/ggml-cuda/conv2d.cuh +5 -0
  207. data/vendor/crispasr/ggml/src/ggml-cuda/convert.cu +892 -0
  208. data/vendor/crispasr/ggml/src/ggml-cuda/convert.cuh +66 -0
  209. data/vendor/crispasr/ggml/src/ggml-cuda/count-equal.cu +64 -0
  210. data/vendor/crispasr/ggml/src/ggml-cuda/count-equal.cuh +5 -0
  211. data/vendor/crispasr/ggml/src/ggml-cuda/cp-async.cuh +57 -0
  212. data/vendor/crispasr/ggml/src/ggml-cuda/cpy-utils.cuh +217 -0
  213. data/vendor/crispasr/ggml/src/ggml-cuda/cpy.cu +581 -0
  214. data/vendor/crispasr/ggml/src/ggml-cuda/cpy.cuh +7 -0
  215. data/vendor/crispasr/ggml/src/ggml-cuda/cross-entropy-loss.cu +177 -0
  216. data/vendor/crispasr/ggml/src/ggml-cuda/cross-entropy-loss.cuh +7 -0
  217. data/vendor/crispasr/ggml/src/ggml-cuda/cumsum.cu +307 -0
  218. data/vendor/crispasr/ggml/src/ggml-cuda/cumsum.cuh +5 -0
  219. data/vendor/crispasr/ggml/src/ggml-cuda/dequantize.cuh +99 -0
  220. data/vendor/crispasr/ggml/src/ggml-cuda/diag.cu +77 -0
  221. data/vendor/crispasr/ggml/src/ggml-cuda/diag.cuh +5 -0
  222. data/vendor/crispasr/ggml/src/ggml-cuda/diagmask.cu +40 -0
  223. data/vendor/crispasr/ggml/src/ggml-cuda/diagmask.cuh +5 -0
  224. data/vendor/crispasr/ggml/src/ggml-cuda/fattn-common.cuh +1212 -0
  225. data/vendor/crispasr/ggml/src/ggml-cuda/fattn-mma-f16.cuh +1860 -0
  226. data/vendor/crispasr/ggml/src/ggml-cuda/fattn-tile.cu +57 -0
  227. data/vendor/crispasr/ggml/src/ggml-cuda/fattn-tile.cuh +1309 -0
  228. data/vendor/crispasr/ggml/src/ggml-cuda/fattn-vec.cuh +600 -0
  229. data/vendor/crispasr/ggml/src/ggml-cuda/fattn-wmma-f16.cu +696 -0
  230. data/vendor/crispasr/ggml/src/ggml-cuda/fattn-wmma-f16.cuh +51 -0
  231. data/vendor/crispasr/ggml/src/ggml-cuda/fattn.cu +620 -0
  232. data/vendor/crispasr/ggml/src/ggml-cuda/fattn.cuh +5 -0
  233. data/vendor/crispasr/ggml/src/ggml-cuda/fill.cu +37 -0
  234. data/vendor/crispasr/ggml/src/ggml-cuda/fill.cuh +3 -0
  235. data/vendor/crispasr/ggml/src/ggml-cuda/gated_delta_net.cu +273 -0
  236. data/vendor/crispasr/ggml/src/ggml-cuda/gated_delta_net.cuh +4 -0
  237. data/vendor/crispasr/ggml/src/ggml-cuda/getrows.cu +332 -0
  238. data/vendor/crispasr/ggml/src/ggml-cuda/getrows.cuh +15 -0
  239. data/vendor/crispasr/ggml/src/ggml-cuda/ggml-cuda.cu +5580 -0
  240. data/vendor/crispasr/ggml/src/ggml-cuda/gla.cu +93 -0
  241. data/vendor/crispasr/ggml/src/ggml-cuda/gla.cuh +3 -0
  242. data/vendor/crispasr/ggml/src/ggml-cuda/im2col.cu +274 -0
  243. data/vendor/crispasr/ggml/src/ggml-cuda/im2col.cuh +6 -0
  244. data/vendor/crispasr/ggml/src/ggml-cuda/mean.cu +75 -0
  245. data/vendor/crispasr/ggml/src/ggml-cuda/mean.cuh +3 -0
  246. data/vendor/crispasr/ggml/src/ggml-cuda/mma.cuh +1333 -0
  247. data/vendor/crispasr/ggml/src/ggml-cuda/mmf.cu +191 -0
  248. data/vendor/crispasr/ggml/src/ggml-cuda/mmf.cuh +908 -0
  249. data/vendor/crispasr/ggml/src/ggml-cuda/mmid.cu +164 -0
  250. data/vendor/crispasr/ggml/src/ggml-cuda/mmid.cuh +5 -0
  251. data/vendor/crispasr/ggml/src/ggml-cuda/mmq.cu +372 -0
  252. data/vendor/crispasr/ggml/src/ggml-cuda/mmq.cuh +4175 -0
  253. data/vendor/crispasr/ggml/src/ggml-cuda/mmvf.cu +862 -0
  254. data/vendor/crispasr/ggml/src/ggml-cuda/mmvf.cuh +14 -0
  255. data/vendor/crispasr/ggml/src/ggml-cuda/mmvq.cu +1161 -0
  256. data/vendor/crispasr/ggml/src/ggml-cuda/mmvq.cuh +16 -0
  257. data/vendor/crispasr/ggml/src/ggml-cuda/norm.cu +756 -0
  258. data/vendor/crispasr/ggml/src/ggml-cuda/norm.cuh +20 -0
  259. data/vendor/crispasr/ggml/src/ggml-cuda/opt-step-adamw.cu +78 -0
  260. data/vendor/crispasr/ggml/src/ggml-cuda/opt-step-adamw.cuh +5 -0
  261. data/vendor/crispasr/ggml/src/ggml-cuda/opt-step-sgd.cu +49 -0
  262. data/vendor/crispasr/ggml/src/ggml-cuda/opt-step-sgd.cuh +5 -0
  263. data/vendor/crispasr/ggml/src/ggml-cuda/out-prod.cu +68 -0
  264. data/vendor/crispasr/ggml/src/ggml-cuda/out-prod.cuh +3 -0
  265. data/vendor/crispasr/ggml/src/ggml-cuda/pad.cu +106 -0
  266. data/vendor/crispasr/ggml/src/ggml-cuda/pad.cuh +5 -0
  267. data/vendor/crispasr/ggml/src/ggml-cuda/pad_reflect_1d.cu +91 -0
  268. data/vendor/crispasr/ggml/src/ggml-cuda/pad_reflect_1d.cuh +5 -0
  269. data/vendor/crispasr/ggml/src/ggml-cuda/pool2d.cu +94 -0
  270. data/vendor/crispasr/ggml/src/ggml-cuda/pool2d.cuh +5 -0
  271. data/vendor/crispasr/ggml/src/ggml-cuda/quantize.cu +443 -0
  272. data/vendor/crispasr/ggml/src/ggml-cuda/quantize.cuh +41 -0
  273. data/vendor/crispasr/ggml/src/ggml-cuda/reduce_rows.cuh +39 -0
  274. data/vendor/crispasr/ggml/src/ggml-cuda/roll.cu +67 -0
  275. data/vendor/crispasr/ggml/src/ggml-cuda/roll.cuh +5 -0
  276. data/vendor/crispasr/ggml/src/ggml-cuda/rope.cu +665 -0
  277. data/vendor/crispasr/ggml/src/ggml-cuda/rope.cuh +9 -0
  278. data/vendor/crispasr/ggml/src/ggml-cuda/scale.cu +34 -0
  279. data/vendor/crispasr/ggml/src/ggml-cuda/scale.cuh +5 -0
  280. data/vendor/crispasr/ggml/src/ggml-cuda/set-rows.cu +330 -0
  281. data/vendor/crispasr/ggml/src/ggml-cuda/set-rows.cuh +7 -0
  282. data/vendor/crispasr/ggml/src/ggml-cuda/set.cu +39 -0
  283. data/vendor/crispasr/ggml/src/ggml-cuda/set.cuh +7 -0
  284. data/vendor/crispasr/ggml/src/ggml-cuda/softcap.cu +34 -0
  285. data/vendor/crispasr/ggml/src/ggml-cuda/softcap.cuh +5 -0
  286. data/vendor/crispasr/ggml/src/ggml-cuda/softmax.cu +472 -0
  287. data/vendor/crispasr/ggml/src/ggml-cuda/softmax.cuh +7 -0
  288. data/vendor/crispasr/ggml/src/ggml-cuda/solve_tri.cu +275 -0
  289. data/vendor/crispasr/ggml/src/ggml-cuda/solve_tri.cuh +3 -0
  290. data/vendor/crispasr/ggml/src/ggml-cuda/ssm-conv.cu +197 -0
  291. data/vendor/crispasr/ggml/src/ggml-cuda/ssm-conv.cuh +3 -0
  292. data/vendor/crispasr/ggml/src/ggml-cuda/ssm-scan.cu +342 -0
  293. data/vendor/crispasr/ggml/src/ggml-cuda/ssm-scan.cuh +3 -0
  294. data/vendor/crispasr/ggml/src/ggml-cuda/sum.cu +41 -0
  295. data/vendor/crispasr/ggml/src/ggml-cuda/sum.cuh +5 -0
  296. data/vendor/crispasr/ggml/src/ggml-cuda/sumrows.cu +43 -0
  297. data/vendor/crispasr/ggml/src/ggml-cuda/sumrows.cuh +4 -0
  298. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_1-ncols2_16.cu +5 -0
  299. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_1-ncols2_32.cu +6 -0
  300. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_1-ncols2_8.cu +11 -0
  301. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_16-ncols2_1.cu +10 -0
  302. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_16-ncols2_2.cu +10 -0
  303. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_16-ncols2_4.cu +12 -0
  304. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_2-ncols2_16.cu +5 -0
  305. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_2-ncols2_32.cu +6 -0
  306. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_2-ncols2_4.cu +12 -0
  307. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_2-ncols2_8.cu +11 -0
  308. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_32-ncols2_1.cu +10 -0
  309. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_32-ncols2_2.cu +10 -0
  310. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_4-ncols2_16.cu +5 -0
  311. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_4-ncols2_2.cu +10 -0
  312. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_4-ncols2_4.cu +12 -0
  313. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_4-ncols2_8.cu +11 -0
  314. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_64-ncols2_1.cu +10 -0
  315. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_8-ncols2_1.cu +10 -0
  316. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_8-ncols2_2.cu +10 -0
  317. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_8-ncols2_4.cu +12 -0
  318. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_8-ncols2_8.cu +11 -0
  319. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-tile-instance-dkq112-dv112.cu +5 -0
  320. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-tile-instance-dkq128-dv128.cu +5 -0
  321. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-tile-instance-dkq256-dv256.cu +5 -0
  322. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-tile-instance-dkq320-dv256.cu +5 -0
  323. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-tile-instance-dkq40-dv40.cu +5 -0
  324. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-tile-instance-dkq512-dv512.cu +5 -0
  325. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-tile-instance-dkq576-dv512.cu +5 -0
  326. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-tile-instance-dkq64-dv64.cu +5 -0
  327. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-tile-instance-dkq72-dv72.cu +5 -0
  328. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-tile-instance-dkq80-dv80.cu +5 -0
  329. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-tile-instance-dkq96-dv96.cu +5 -0
  330. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-bf16.cu +7 -0
  331. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-f16.cu +7 -0
  332. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-q4_0.cu +7 -0
  333. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-q4_1.cu +7 -0
  334. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-q5_0.cu +7 -0
  335. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-q5_1.cu +7 -0
  336. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-q8_0.cu +7 -0
  337. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-f16-bf16.cu +7 -0
  338. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-f16-f16.cu +7 -0
  339. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-f16-q4_0.cu +7 -0
  340. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-f16-q4_1.cu +7 -0
  341. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-f16-q5_0.cu +7 -0
  342. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-f16-q5_1.cu +7 -0
  343. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-f16-q8_0.cu +7 -0
  344. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_0-bf16.cu +7 -0
  345. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_0-f16.cu +7 -0
  346. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_0-q4_0.cu +7 -0
  347. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_0-q4_1.cu +7 -0
  348. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_0-q5_0.cu +7 -0
  349. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_0-q5_1.cu +7 -0
  350. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_0-q8_0.cu +7 -0
  351. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_1-bf16.cu +7 -0
  352. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_1-f16.cu +7 -0
  353. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_1-q4_0.cu +7 -0
  354. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_1-q4_1.cu +7 -0
  355. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_1-q5_0.cu +7 -0
  356. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_1-q5_1.cu +7 -0
  357. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_1-q8_0.cu +7 -0
  358. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_0-bf16.cu +7 -0
  359. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_0-f16.cu +7 -0
  360. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_0-q4_0.cu +7 -0
  361. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_0-q4_1.cu +7 -0
  362. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_0-q5_0.cu +7 -0
  363. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_0-q5_1.cu +7 -0
  364. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_0-q8_0.cu +7 -0
  365. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_1-bf16.cu +7 -0
  366. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_1-f16.cu +7 -0
  367. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_1-q4_0.cu +7 -0
  368. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_1-q4_1.cu +7 -0
  369. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_1-q5_0.cu +7 -0
  370. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_1-q5_1.cu +7 -0
  371. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_1-q8_0.cu +7 -0
  372. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q8_0-bf16.cu +7 -0
  373. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q8_0-f16.cu +7 -0
  374. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q8_0-q4_0.cu +7 -0
  375. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q8_0-q4_1.cu +7 -0
  376. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q8_0-q5_0.cu +7 -0
  377. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q8_0-q5_1.cu +7 -0
  378. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q8_0-q8_0.cu +7 -0
  379. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_1.cu +5 -0
  380. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_10.cu +5 -0
  381. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_11.cu +5 -0
  382. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_12.cu +5 -0
  383. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_13.cu +5 -0
  384. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_14.cu +5 -0
  385. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_15.cu +5 -0
  386. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_16.cu +5 -0
  387. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_2.cu +5 -0
  388. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_3.cu +5 -0
  389. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_4.cu +5 -0
  390. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_5.cu +5 -0
  391. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_6.cu +5 -0
  392. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_7.cu +5 -0
  393. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_8.cu +5 -0
  394. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_9.cu +5 -0
  395. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-iq1_s.cu +5 -0
  396. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-iq2_s.cu +5 -0
  397. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-iq2_xs.cu +5 -0
  398. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-iq2_xxs.cu +5 -0
  399. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-iq3_s.cu +5 -0
  400. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-iq3_xxs.cu +5 -0
  401. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-iq4_nl.cu +5 -0
  402. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-iq4_xs.cu +5 -0
  403. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-mxfp4.cu +5 -0
  404. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-nvfp4.cu +5 -0
  405. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-q1_0.cu +5 -0
  406. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-q2_k.cu +5 -0
  407. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-q3_k.cu +5 -0
  408. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-q4_0.cu +5 -0
  409. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-q4_1.cu +5 -0
  410. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-q4_k.cu +5 -0
  411. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-q5_0.cu +5 -0
  412. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-q5_1.cu +5 -0
  413. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-q5_k.cu +5 -0
  414. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-q6_k.cu +5 -0
  415. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-q8_0.cu +5 -0
  416. data/vendor/crispasr/ggml/src/ggml-cuda/top-k.cu +95 -0
  417. data/vendor/crispasr/ggml/src/ggml-cuda/top-k.cuh +3 -0
  418. data/vendor/crispasr/ggml/src/ggml-cuda/topk-moe.cu +415 -0
  419. data/vendor/crispasr/ggml/src/ggml-cuda/topk-moe.cuh +27 -0
  420. data/vendor/crispasr/ggml/src/ggml-cuda/tri.cu +136 -0
  421. data/vendor/crispasr/ggml/src/ggml-cuda/tri.cuh +5 -0
  422. data/vendor/crispasr/ggml/src/ggml-cuda/tsembd.cu +47 -0
  423. data/vendor/crispasr/ggml/src/ggml-cuda/tsembd.cuh +5 -0
  424. data/vendor/crispasr/ggml/src/ggml-cuda/unary.cu +644 -0
  425. data/vendor/crispasr/ggml/src/ggml-cuda/unary.cuh +116 -0
  426. data/vendor/crispasr/ggml/src/ggml-cuda/upscale.cu +293 -0
  427. data/vendor/crispasr/ggml/src/ggml-cuda/upscale.cuh +5 -0
  428. data/vendor/crispasr/ggml/src/ggml-cuda/vecdotq.cuh +1317 -0
  429. data/vendor/crispasr/ggml/src/ggml-cuda/vendors/cuda.h +28 -0
  430. data/vendor/crispasr/ggml/src/ggml-cuda/vendors/hip.h +306 -0
  431. data/vendor/crispasr/ggml/src/ggml-cuda/vendors/musa.h +148 -0
  432. data/vendor/crispasr/ggml/src/ggml-cuda/wkv.cu +199 -0
  433. data/vendor/crispasr/ggml/src/ggml-cuda/wkv.cuh +7 -0
  434. data/vendor/crispasr/ggml/src/ggml-impl.h +783 -0
  435. data/vendor/crispasr/ggml/src/ggml-metal/CMakeLists.txt +124 -0
  436. data/vendor/crispasr/ggml/src/ggml-metal/ggml-metal-common.cpp +457 -0
  437. data/vendor/crispasr/ggml/src/ggml-metal/ggml-metal-common.h +52 -0
  438. data/vendor/crispasr/ggml/src/ggml-metal/ggml-metal-context.h +41 -0
  439. data/vendor/crispasr/ggml/src/ggml-metal/ggml-metal-context.m +778 -0
  440. data/vendor/crispasr/ggml/src/ggml-metal/ggml-metal-device.cpp +2117 -0
  441. data/vendor/crispasr/ggml/src/ggml-metal/ggml-metal-device.h +299 -0
  442. data/vendor/crispasr/ggml/src/ggml-metal/ggml-metal-device.m +2093 -0
  443. data/vendor/crispasr/ggml/src/ggml-metal/ggml-metal-impl.h +1267 -0
  444. data/vendor/crispasr/ggml/src/ggml-metal/ggml-metal-ops.cpp +5023 -0
  445. data/vendor/crispasr/ggml/src/ggml-metal/ggml-metal-ops.h +111 -0
  446. data/vendor/crispasr/ggml/src/ggml-metal/ggml-metal.cpp +954 -0
  447. data/vendor/crispasr/ggml/src/ggml-metal/ggml-metal.metal +11756 -0
  448. data/vendor/crispasr/ggml/src/ggml-opt.cpp +1094 -0
  449. data/vendor/crispasr/ggml/src/ggml-quants.c +5491 -0
  450. data/vendor/crispasr/ggml/src/ggml-quants.h +112 -0
  451. data/vendor/crispasr/ggml/src/ggml-threading.cpp +12 -0
  452. data/vendor/crispasr/ggml/src/ggml-threading.h +14 -0
  453. data/vendor/crispasr/ggml/src/ggml.c +7925 -0
  454. data/vendor/crispasr/ggml/src/ggml.cpp +26 -0
  455. data/vendor/crispasr/ggml/src/gguf.cpp +1556 -0
  456. data/vendor/crispasr/src/cohere-arch.h +137 -0
  457. data/vendor/crispasr/src/cohere.cpp +5642 -0
  458. data/vendor/crispasr/src/cohere.h +327 -0
  459. data/vendor/crispasr/src/cohere_batch_planner.h +82 -0
  460. data/vendor/crispasr/src/cohere_chunking.h +64 -0
  461. data/vendor/crispasr/src/cohere_decoder_batch_layout.h +60 -0
  462. data/vendor/crispasr/src/cohere_encoder_padded_layout.h +27 -0
  463. data/vendor/crispasr/src/cohere_frontend.cpp +189 -0
  464. data/vendor/crispasr/src/cohere_frontend.h +31 -0
  465. data/vendor/crispasr/src/cohere_ragged_controller.h +149 -0
  466. data/vendor/crispasr/src/cohere_token_renderer.h +181 -0
  467. data/vendor/crispasr/src/core/attention.h +924 -0
  468. data/vendor/crispasr/src/core/audio_chunking.h +97 -0
  469. data/vendor/crispasr/src/core/beam_decode.h +486 -0
  470. data/vendor/crispasr/src/core/cpu_ops.h +135 -0
  471. data/vendor/crispasr/src/core/gguf_loader.cpp +1021 -0
  472. data/vendor/crispasr/src/core/gguf_loader.h +216 -0
  473. data/vendor/crispasr/src/core/gpu_backend_pref.h +119 -0
  474. data/vendor/crispasr/src/core/mel.cpp +519 -0
  475. data/vendor/crispasr/src/core/mel.h +265 -0
  476. data/vendor/crispasr/src/core/ngram_loop_fix.h +173 -0
  477. data/vendor/crispasr/src/core/repetition_loop_guard.h +54 -0
  478. data/vendor/crispasr/src/crispasr_imatrix.cpp +255 -0
  479. data/vendor/crispasr/src/crispasr_imatrix.h +38 -0
  480. metadata +596 -0
@@ -0,0 +1,579 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "fiddle"
4
+ require "json"
5
+ require "rbconfig"
6
+
7
+ module Cohere
8
+ module Transcribe
9
+ # Minimal, streaming safetensors support for converting Cohere ASR weights.
10
+ # It deliberately does not materialize a multi-gigabyte checkpoint in Ruby.
11
+ module Safetensors
12
+ class Error < StandardError; end
13
+
14
+ DTYPE_BYTES = {
15
+ "BF16" => 2,
16
+ "F16" => 2,
17
+ "F32" => 4,
18
+ "I64" => 8
19
+ }.freeze
20
+ FLOAT_DTYPES = %w[BF16 F16 F32].freeze
21
+ HEADER_LIMIT = 64 * 1024 * 1024
22
+ DEFAULT_CHUNK_BYTES = 4 * 1024 * 1024
23
+
24
+ Tensor = Data.define(:reader, :name, :dtype, :shape, :data_start, :nbytes) do
25
+ def element_count
26
+ shape.empty? ? 1 : shape.reduce(1, :*)
27
+ end
28
+
29
+ def floating_point?
30
+ FLOAT_DTYPES.include?(dtype)
31
+ end
32
+ end
33
+
34
+ # Reads and validates one safetensors file. Tensor payloads stay on disk.
35
+ class Reader
36
+ attr_reader :path, :tensors
37
+
38
+ def initialize(path)
39
+ @path = Pathname(path).expand_path
40
+ @tensors = read_header.freeze
41
+ end
42
+
43
+ def names
44
+ tensors.keys
45
+ end
46
+
47
+ def key?(name)
48
+ tensors.key?(name)
49
+ end
50
+
51
+ def fetch(name)
52
+ tensors.fetch(name)
53
+ rescue KeyError
54
+ raise Error, "Tensor #{name.inspect} is not present in #{path}"
55
+ end
56
+
57
+ def write_tensor(tensor, output, target_dtype:, converter: DTypeConverter.default,
58
+ chunk_bytes: DEFAULT_CHUNK_BYTES)
59
+ raise ArgumentError, "Tensor #{tensor.name.inspect} belongs to a different safetensors reader" unless tensor.reader.equal?(self)
60
+
61
+ target_dtype = target_dtype.to_s.upcase
62
+ unless FLOAT_DTYPES.include?(tensor.dtype) && FLOAT_DTYPES.include?(target_dtype)
63
+ raise Error, "Cannot convert #{tensor.name.inspect} from #{tensor.dtype} to #{target_dtype}"
64
+ end
65
+ raise ArgumentError, "chunk_bytes must be positive" unless chunk_bytes.positive?
66
+
67
+ source_width = DTYPE_BYTES.fetch(tensor.dtype)
68
+ elements_per_chunk = [chunk_bytes / source_width, 1].max
69
+ bytes_per_chunk = elements_per_chunk * source_width
70
+ remaining = tensor.nbytes
71
+ written = 0
72
+
73
+ File.open(path, "rb") do |source|
74
+ source.seek(tensor.data_start)
75
+ while remaining.positive?
76
+ requested = [remaining, bytes_per_chunk].min
77
+ chunk = source.read(requested)
78
+ raise Error, "Unexpected end of #{path} while reading #{tensor.name.inspect}" if chunk.nil? || chunk.bytesize != requested
79
+
80
+ converted = converter.convert(chunk, from: tensor.dtype, to: target_dtype)
81
+ output.write(converted)
82
+ written += converted.bytesize
83
+ remaining -= requested
84
+ end
85
+ end
86
+
87
+ expected = tensor.element_count * DTYPE_BYTES.fetch(target_dtype)
88
+ return written if written == expected
89
+
90
+ raise Error,
91
+ "Converted tensor #{tensor.name.inspect} wrote #{written} bytes; expected #{expected}"
92
+ end
93
+
94
+ private
95
+
96
+ def read_header
97
+ size = path.size
98
+ raise Error, "Safetensors file #{path} is shorter than its header prefix" if size < 8
99
+
100
+ File.open(path, "rb") do |file|
101
+ header_length = read_exact(file, 8, "header length").unpack1("Q<")
102
+ if header_length.zero? || header_length > HEADER_LIMIT || header_length > size - 8
103
+ raise Error, "Safetensors file #{path} has invalid header length #{header_length}"
104
+ end
105
+
106
+ raw_header = read_exact(file, header_length, "JSON header")
107
+ parsed = JSON.parse(raw_header)
108
+ raise Error, "Safetensors header in #{path} is not a JSON object" unless parsed.is_a?(Hash)
109
+
110
+ parsed.delete("__metadata__")
111
+ build_tensors(parsed, data_offset: 8 + header_length, file_size: size)
112
+ end
113
+ rescue Errno::ENOENT
114
+ raise Error, "Safetensors file #{path} does not exist"
115
+ rescue Errno::EACCES => e
116
+ raise Error, "Cannot read safetensors file #{path}: #{e.message}"
117
+ rescue JSON::ParserError, EncodingError => e
118
+ raise Error, "Invalid safetensors JSON header in #{path}: #{e.message}"
119
+ end
120
+
121
+ def build_tensors(header, data_offset:, file_size:)
122
+ data_size = file_size - data_offset
123
+ ranges = []
124
+ result = {}
125
+
126
+ header.each do |name, info|
127
+ validate_tensor_name!(name)
128
+ raise Error, "Safetensors entry #{name.inspect} in #{path} is not an object" unless info.is_a?(Hash)
129
+
130
+ dtype = info["dtype"]
131
+ width = DTYPE_BYTES[dtype]
132
+ raise Error, "Tensor #{name.inspect} in #{path} uses unsupported dtype #{dtype.inspect}" unless width
133
+
134
+ shape = info["shape"]
135
+ unless shape.is_a?(Array) && shape.all? { |dimension| dimension.is_a?(Integer) && dimension >= 0 }
136
+ raise Error, "Tensor #{name.inspect} in #{path} has an invalid shape"
137
+ end
138
+
139
+ offsets = info["data_offsets"]
140
+ unless offsets.is_a?(Array) && offsets.length == 2 &&
141
+ offsets.all? { |offset| offset.is_a?(Integer) && offset >= 0 }
142
+ raise Error, "Tensor #{name.inspect} in #{path} has invalid data offsets"
143
+ end
144
+
145
+ first, last = offsets
146
+ raise Error, "Tensor #{name.inspect} in #{path} points outside the file" unless last.between?(first, data_size)
147
+
148
+ count = shape.empty? ? 1 : shape.reduce(1, :*)
149
+ expected = count * width
150
+ actual = last - first
151
+ if actual != expected
152
+ raise Error,
153
+ "Tensor #{name.inspect} in #{path} has #{actual} data bytes; expected #{expected}"
154
+ end
155
+
156
+ ranges << [first, last, name] if actual.positive?
157
+ result[name] = Tensor.new(
158
+ reader: self,
159
+ name: name.freeze,
160
+ dtype: dtype.freeze,
161
+ shape: shape.map(&:to_i).freeze,
162
+ data_start: data_offset + first,
163
+ nbytes: actual
164
+ )
165
+ end
166
+
167
+ validate_non_overlapping!(ranges)
168
+ result
169
+ end
170
+
171
+ def validate_tensor_name!(name)
172
+ return if name.is_a?(String) && !name.empty?
173
+
174
+ raise Error, "Safetensors file #{path} contains an invalid tensor name"
175
+ end
176
+
177
+ def validate_non_overlapping!(ranges)
178
+ ranges.sort_by!(&:first)
179
+ ranges.each_cons(2) do |left, right|
180
+ next if left[1] <= right[0]
181
+
182
+ raise Error,
183
+ "Tensors #{left[2].inspect} and #{right[2].inspect} overlap in #{path}"
184
+ end
185
+ end
186
+
187
+ def read_exact(io, length, description)
188
+ value = io.read(length)
189
+ return value if value && value.bytesize == length
190
+
191
+ raise Error, "Safetensors file #{path} ended while reading its #{description}"
192
+ end
193
+ end
194
+
195
+ # Presents one unsharded file or a model.safetensors.index.json shard set
196
+ # through the same tensor-name lookup API.
197
+ class TensorSet
198
+ attr_reader :directory, :readers, :tensors
199
+
200
+ def self.from_directory(directory)
201
+ directory = Pathname(directory).expand_path
202
+ single = directory.join("model.safetensors")
203
+ return new(directory, [Reader.new(single)]) if single.file?
204
+
205
+ index = directory.join("model.safetensors.index.json")
206
+ raise Error, "#{directory} does not contain model.safetensors or its index" unless index.file?
207
+
208
+ from_index(directory, index)
209
+ end
210
+
211
+ def self.from_index(directory, index_path)
212
+ payload = JSON.parse(index_path.read(encoding: "UTF-8"))
213
+ weight_map = payload["weight_map"]
214
+ unless weight_map.is_a?(Hash) && !weight_map.empty? &&
215
+ weight_map.all? { |name, file| name.is_a?(String) && file.is_a?(String) }
216
+ raise Error, "Safetensors index #{index_path} has an invalid weight_map"
217
+ end
218
+
219
+ shard_names = weight_map.values.uniq
220
+ shard_names.each do |name|
221
+ candidate = Pathname(name)
222
+ if name.empty? || candidate.absolute? || candidate.each_filename.any? { |part| part == ".." }
223
+ raise Error, "Safetensors index #{index_path} contains an invalid shard path #{name.inspect}"
224
+ end
225
+ end
226
+ readers = shard_names.to_h do |name|
227
+ path = directory.join(name)
228
+ raise Error, "Safetensors shard #{path} is missing" unless path.file?
229
+
230
+ [name, Reader.new(path)]
231
+ end
232
+
233
+ mapped = weight_map.to_h do |name, shard|
234
+ reader = readers.fetch(shard)
235
+ raise Error, "Safetensors index maps missing tensor #{name.inspect} to #{shard}" unless reader.key?(name)
236
+
237
+ [name, reader.fetch(name)]
238
+ end
239
+ readers.each do |shard, reader|
240
+ indexed_names = weight_map.filter_map { |name, filename| name if filename == shard }
241
+ unindexed = reader.names - indexed_names
242
+ next if unindexed.empty?
243
+
244
+ raise Error,
245
+ "Safetensors shard #{reader.path} contains tensors absent from its index: " \
246
+ "#{unindexed.first(8).map(&:inspect).join(", ")}"
247
+ end
248
+ new(directory, readers.values, tensors: mapped)
249
+ rescue JSON::ParserError, EncodingError => e
250
+ raise Error, "Invalid safetensors index #{index_path}: #{e.message}"
251
+ rescue Errno::EACCES, Errno::ENOENT => e
252
+ raise Error, "Cannot read safetensors index #{index_path}: #{e.message}"
253
+ end
254
+
255
+ def initialize(directory, readers, tensors: nil)
256
+ @directory = Pathname(directory).expand_path
257
+ @readers = readers.freeze
258
+ @tensors = (tensors || readers.flat_map { |reader| reader.tensors.to_a }.to_h).freeze
259
+ end
260
+
261
+ def names
262
+ tensors.keys
263
+ end
264
+
265
+ def key?(name)
266
+ tensors.key?(name)
267
+ end
268
+
269
+ def fetch(name)
270
+ tensors.fetch(name)
271
+ rescue KeyError
272
+ raise Error, "Tensor #{name.inspect} is not present in #{directory}"
273
+ end
274
+
275
+ def fetch_any(names)
276
+ name = names.find { |candidate| tensors.key?(candidate) }
277
+ return tensors.fetch(name) if name
278
+
279
+ raise Error, "None of the tensor aliases are present: #{names.map(&:inspect).join(", ")}"
280
+ end
281
+ end
282
+
283
+ # Portable Ruby dtype conversion. Conversion is chunked by Reader, so
284
+ # memory use remains bounded even when this fallback is used.
285
+ class DTypeConverter
286
+ class << self
287
+ def default
288
+ return @default if @default
289
+
290
+ @default = NativeDTypeConverter.auto
291
+ @default || (@portable_fallback ||= new)
292
+ end
293
+
294
+ attr_writer :default
295
+ end
296
+
297
+ def convert(bytes, from:, to:)
298
+ from = from.to_s.upcase
299
+ to = to.to_s.upcase
300
+ validate_input!(bytes, from)
301
+ return bytes.dup if from == to
302
+
303
+ case [from, to]
304
+ when %w[BF16 F32] then bf16_to_f32(bytes)
305
+ when %w[BF16 F16] then bf16_to_f16(bytes)
306
+ when %w[F32 F16] then f32_to_f16(bytes)
307
+ when %w[F16 F32] then f16_to_f32(bytes)
308
+ when %w[F32 BF16] then f32_to_bf16(bytes)
309
+ when %w[F16 BF16] then f32_to_bf16(f16_to_f32(bytes))
310
+ else
311
+ raise Error, "Unsupported floating-point conversion #{from} -> #{to}"
312
+ end
313
+ end
314
+
315
+ private
316
+
317
+ def validate_input!(bytes, dtype)
318
+ width = DTYPE_BYTES[dtype]
319
+ raise Error, "Unsupported source dtype #{dtype.inspect}" unless width
320
+ return if (bytes.bytesize % width).zero?
321
+
322
+ raise Error, "#{dtype} input contains a partial element"
323
+ end
324
+
325
+ def bf16_to_f32(bytes)
326
+ bytes.unpack("S<*").map! { |bits| bits << 16 }.pack("L<*")
327
+ end
328
+
329
+ def bf16_to_f16(bytes)
330
+ bytes.unpack("S<*").map! { |bits| bf16_bits_to_f16(bits) }.pack("S<*")
331
+ end
332
+
333
+ def f32_to_f16(bytes)
334
+ bytes.unpack("L<*").map! { |bits| f32_bits_to_f16(bits) }.pack("S<*")
335
+ end
336
+
337
+ def f32_to_bf16(bytes)
338
+ bytes.unpack("L<*").map! do |bits|
339
+ if (bits & 0x7fff_ffff) > 0x7f80_0000
340
+ (bits >> 16) | 0x40
341
+ else
342
+ (bits + 0x7fff + ((bits >> 16) & 1)) >> 16
343
+ end
344
+ end.pack("S<*")
345
+ end
346
+
347
+ def f16_to_f32(bytes)
348
+ bytes.unpack("S<*").map! { |bits| f16_bits_to_f32(bits) }.pack("L<*")
349
+ end
350
+
351
+ def bf16_bits_to_f16(bits)
352
+ sign = (bits & 0x8000)
353
+ exponent = (bits >> 7) & 0xff
354
+ mantissa = bits & 0x7f
355
+ return sign if exponent.zero?
356
+ return sign | 0x7c00 | nan_payload(mantissa << 3) if exponent == 0xff && !mantissa.zero?
357
+ return sign | 0x7c00 if exponent == 0xff
358
+
359
+ unbiased = exponent - 127
360
+ return sign | 0x7c00 if unbiased > 15
361
+ return sign | ((unbiased + 15) << 10) | (mantissa << 3) if unbiased >= -14
362
+ return sign if unbiased < -25
363
+
364
+ significand = 0x80 | mantissa
365
+ shift = -(unbiased + 17)
366
+ rounded = shift.positive? ? round_right(significand, shift) : significand << -shift
367
+ sign | rounded
368
+ end
369
+
370
+ def f32_bits_to_f16(bits)
371
+ sign = (bits >> 16) & 0x8000
372
+ exponent = (bits >> 23) & 0xff
373
+ mantissa = bits & 0x7fffff
374
+ if exponent == 0xff
375
+ return sign | 0x7c00 if mantissa.zero?
376
+
377
+ return sign | 0x7c00 | nan_payload(mantissa >> 13)
378
+ end
379
+ return sign if exponent.zero?
380
+
381
+ if exponent < 113
382
+ return sign if exponent < 102
383
+
384
+ rounded = round_right(0x800000 | mantissa, 126 - exponent)
385
+ return sign | rounded
386
+ end
387
+ return sign | 0x7c00 if exponent > 142
388
+
389
+ half_exponent = exponent - 112
390
+ half_mantissa = round_right(mantissa, 13)
391
+ if half_mantissa == 0x400
392
+ half_exponent += 1
393
+ half_mantissa = 0
394
+ end
395
+ return sign | 0x7c00 if half_exponent >= 31
396
+
397
+ sign | (half_exponent << 10) | half_mantissa
398
+ end
399
+
400
+ def f16_bits_to_f32(bits)
401
+ sign = (bits & 0x8000) << 16
402
+ exponent = (bits >> 10) & 0x1f
403
+ mantissa = bits & 0x3ff
404
+ if exponent.zero?
405
+ return sign if mantissa.zero?
406
+
407
+ unbiased = -14
408
+ until mantissa.anybits?(0x400)
409
+ mantissa <<= 1
410
+ unbiased -= 1
411
+ end
412
+ mantissa &= 0x3ff
413
+ return sign | ((unbiased + 127) << 23) | (mantissa << 13)
414
+ end
415
+ return sign | 0x7f800000 | (mantissa << 13) if exponent == 0x1f
416
+
417
+ sign | ((exponent - 15 + 127) << 23) | (mantissa << 13)
418
+ end
419
+
420
+ def nan_payload(payload)
421
+ payload.zero? ? 1 : payload
422
+ end
423
+
424
+ def round_right(value, shift)
425
+ base = value >> shift
426
+ remainder = value & ((1 << shift) - 1)
427
+ halfway = 1 << (shift - 1)
428
+ increment = remainder > halfway || (remainder == halfway && base.odd?)
429
+ increment ? base + 1 : base
430
+ end
431
+ end
432
+
433
+ # Uses GGML's vector conversion routines when its base library is
434
+ # available. The Ruby fallback above remains authoritative and testable.
435
+ class NativeDTypeConverter < DTypeConverter
436
+ LIBRARY_NAMES = %w[libggml-base.so libggml-base.dylib ggml-base.dll].freeze
437
+ LIBRARY_PATTERNS = case RbConfig::CONFIG["host_os"]
438
+ when /darwin/
439
+ ["libggml-base.dylib", "libggml-base*.dylib"]
440
+ when /mswin|mingw|cygwin/
441
+ ["ggml-base.dll", "libggml-base.dll"]
442
+ else
443
+ ["libggml-base.so", "libggml-base.so.*"]
444
+ end.freeze
445
+ FUNCTIONS = {
446
+ bf16_to_f32: "ggml_bf16_to_fp32_row",
447
+ f16_to_f32: "ggml_fp16_to_fp32_row",
448
+ f32_to_f16: "ggml_fp32_to_fp16_row",
449
+ f32_to_bf16: "ggml_fp32_to_bf16_row"
450
+ }.freeze
451
+ PRIVATE_FUNCTIONS = {
452
+ bf16_to_f32: "crispasr_bf16_to_fp32_row",
453
+ f16_to_f32: "crispasr_fp16_to_fp32_row",
454
+ f32_to_f16: "crispasr_fp32_to_fp16_row",
455
+ f32_to_bf16: "crispasr_fp32_to_bf16_row"
456
+ }.freeze
457
+
458
+ class << self
459
+ def auto(library = ENV.fetch("COHERE_TRANSCRIBE_GGML_LIBRARY", nil))
460
+ candidate_libraries(library).each do |candidate|
461
+ return new(candidate)
462
+ rescue Fiddle::DLError, LoadError
463
+ next
464
+ end
465
+ nil
466
+ end
467
+
468
+ # Ordered candidates used by the lazy default converter. This keeps
469
+ # dense conversion fast when GGML is packaged beside libcrispasr,
470
+ # while retaining system-library and portable Ruby fallbacks.
471
+ def candidate_libraries(library = ENV.fetch("COHERE_TRANSCRIBE_GGML_LIBRARY", nil))
472
+ explicit = library.to_s.empty? ? [] : [library]
473
+ native = native_library_candidates.select { |candidate| path_like?(candidate) && File.file?(candidate) }
474
+ [*explicit, nil, *native, *discovered_library_paths, *LIBRARY_NAMES].uniq.freeze
475
+ end
476
+
477
+ private
478
+
479
+ def discovered_library_paths
480
+ candidate_directories.flat_map do |directory|
481
+ LIBRARY_PATTERNS.flat_map do |pattern|
482
+ Dir.glob(File.join(directory, pattern)).sort
483
+ end
484
+ end.select { |path| File.file?(path) }.uniq
485
+ end
486
+
487
+ def candidate_directories
488
+ packaged = File.join(__dir__, "native")
489
+ directories = [
490
+ packaged,
491
+ *Dir.glob(File.join(packaged, "*")).select { |path| File.directory?(path) }
492
+ ]
493
+ native_library_candidates.each do |candidate|
494
+ next unless path_like?(candidate)
495
+
496
+ directory = File.directory?(candidate) ? candidate : File.dirname(candidate)
497
+ directories.push(
498
+ directory, File.join(directory, "ggml", "src"), File.expand_path("../ggml/src", directory)
499
+ )
500
+ end
501
+ directories.map { |directory| File.expand_path(directory) }.uniq
502
+ end
503
+
504
+ def native_library_candidates
505
+ candidates = [ENV.fetch("COHERE_TRANSCRIBE_NATIVE_LIBRARY", nil)]
506
+ native_library = defined?(Cohere::Transcribe::ASR::NativeLibrary) &&
507
+ Cohere::Transcribe::ASR::NativeLibrary
508
+ candidates.concat(native_library.candidate_paths) if native_library
509
+ candidates.compact
510
+ end
511
+
512
+ def path_like?(candidate)
513
+ !candidate.to_s.empty? &&
514
+ (Pathname(candidate).absolute? || candidate.include?(File::SEPARATOR) ||
515
+ (File::ALT_SEPARATOR && candidate.include?(File::ALT_SEPARATOR)))
516
+ end
517
+ end
518
+
519
+ def initialize(library = nil)
520
+ super()
521
+ @handle = library ? Fiddle::Handle.new(library) : Fiddle::Handle::DEFAULT
522
+ @functions = FUNCTIONS.to_h do |name, symbol|
523
+ address = begin
524
+ @handle[symbol]
525
+ rescue Fiddle::DLError
526
+ @handle[PRIVATE_FUNCTIONS.fetch(name)]
527
+ end
528
+ function = Fiddle::Function.new(
529
+ address,
530
+ [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP, Fiddle::TYPE_LONG_LONG],
531
+ Fiddle::TYPE_VOID
532
+ )
533
+ [name, function]
534
+ end.freeze
535
+ end
536
+
537
+ def convert(bytes, from:, to:)
538
+ from = from.to_s.upcase
539
+ to = to.to_s.upcase
540
+ validate_native_input!(bytes, from)
541
+ return bytes.dup if from == to
542
+
543
+ case [from, to]
544
+ when %w[BF16 F32] then native_call(:bf16_to_f32, bytes, 4)
545
+ when %w[F16 F32] then native_call(:f16_to_f32, bytes, 4)
546
+ when %w[F32 F16] then native_call(:f32_to_f16, bytes, 2)
547
+ when %w[F32 BF16] then native_call(:f32_to_bf16, bytes, 2)
548
+ when %w[BF16 F16]
549
+ intermediate = native_call(:bf16_to_f32, bytes, 4)
550
+ native_call(:f32_to_f16, intermediate, 2)
551
+ when %w[F16 BF16]
552
+ intermediate = native_call(:f16_to_f32, bytes, 4)
553
+ native_call(:f32_to_bf16, intermediate, 2)
554
+ else
555
+ super
556
+ end
557
+ end
558
+
559
+ private
560
+
561
+ def validate_native_input!(bytes, dtype)
562
+ width = DTYPE_BYTES[dtype]
563
+ raise Error, "Unsupported source dtype #{dtype.inspect}" unless width
564
+ return if (bytes.bytesize % width).zero?
565
+
566
+ raise Error, "#{dtype} input contains a partial element"
567
+ end
568
+
569
+ def native_call(name, source, output_width)
570
+ input_width = %i[f32_to_f16 f32_to_bf16].include?(name) ? 4 : 2
571
+ count = source.bytesize / input_width
572
+ destination = "\0".b * (count * output_width)
573
+ @functions.fetch(name).call(Fiddle::Pointer[source], Fiddle::Pointer[destination], count)
574
+ destination
575
+ end
576
+ end
577
+ end
578
+ end
579
+ end