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,198 @@
1
+ #include <atomic>
2
+ #include <cmath>
3
+ #include <cstddef>
4
+ #include <cstdint>
5
+ #include <cstdio>
6
+ #include <cstring>
7
+ #include <dlfcn.h>
8
+ #include <fstream>
9
+ #include <iostream>
10
+ #include <random>
11
+ #include <stdexcept>
12
+ #include <string>
13
+ #include <thread>
14
+ #include <vector>
15
+
16
+ namespace {
17
+
18
+ using Probe = int (*)(char*, std::size_t);
19
+ using Duration = int (*)(const char*, double*, char*, std::size_t);
20
+ using Decode = int (*)(const char*, int, std::uint64_t, float**, std::int64_t*, char*, std::size_t);
21
+ using Cancel = void (*)();
22
+ using Free = void (*)(void*);
23
+
24
+ template <typename Function>
25
+ Function load(void* library, const char* name) {
26
+ auto function = reinterpret_cast<Function>(dlsym(library, name));
27
+ if (!function)
28
+ throw std::runtime_error(std::string("missing symbol ") + name);
29
+ return function;
30
+ }
31
+
32
+ template <typename Integer>
33
+ void little_endian(std::vector<std::uint8_t>& bytes, Integer value) {
34
+ for (std::size_t index = 0; index < sizeof(value); ++index)
35
+ bytes.push_back(static_cast<std::uint8_t>((static_cast<std::uint64_t>(value) >> (8 * index)) & 0xff));
36
+ }
37
+
38
+ std::vector<std::uint8_t> wav_fixture() {
39
+ constexpr std::uint32_t frames = 400;
40
+ constexpr std::uint32_t rate = 16'000;
41
+ constexpr std::uint16_t channels = 2;
42
+ constexpr std::uint32_t pcm_bytes = frames * channels * sizeof(std::int16_t);
43
+ std::vector<std::uint8_t> bytes;
44
+ const auto append = [&](const char* text, std::size_t length) {
45
+ bytes.insert(bytes.end(), text, text + length);
46
+ };
47
+ append("RIFF", 4);
48
+ little_endian(bytes, 36U + pcm_bytes);
49
+ append("WAVEfmt ", 8);
50
+ little_endian(bytes, 16U);
51
+ little_endian(bytes, static_cast<std::uint16_t>(1));
52
+ little_endian(bytes, channels);
53
+ little_endian(bytes, rate);
54
+ little_endian(bytes, static_cast<std::uint32_t>(rate * channels * sizeof(std::int16_t)));
55
+ little_endian(bytes, static_cast<std::uint16_t>(channels * sizeof(std::int16_t)));
56
+ little_endian(bytes, static_cast<std::uint16_t>(16));
57
+ append("data", 4);
58
+ little_endian(bytes, pcm_bytes);
59
+ for (std::uint32_t index = 0; index < frames; ++index) {
60
+ little_endian(bytes, static_cast<std::uint16_t>(16'384));
61
+ little_endian(bytes, static_cast<std::uint16_t>(-8'192));
62
+ }
63
+ return bytes;
64
+ }
65
+
66
+ void write_bytes(const std::string& path, const std::vector<std::uint8_t>& bytes) {
67
+ std::ofstream output(path, std::ios::binary | std::ios::trunc);
68
+ output.write(reinterpret_cast<const char*>(bytes.data()), static_cast<std::streamsize>(bytes.size()));
69
+ if (!output)
70
+ throw std::runtime_error("could not write audio reliability fixture");
71
+ }
72
+
73
+ void check_decode_result(int status, float* samples, std::int64_t count,
74
+ std::uint64_t maximum_bytes, Free release) {
75
+ if (status == 0) {
76
+ if (count < 0 || (count > 0 && !samples) ||
77
+ static_cast<std::uint64_t>(count) > maximum_bytes / sizeof(float)) {
78
+ release(samples);
79
+ throw std::runtime_error("successful decode returned invalid ownership metadata");
80
+ }
81
+ for (std::int64_t index = 0; index < count; ++index) {
82
+ if (!std::isfinite(samples[index])) {
83
+ release(samples);
84
+ throw std::runtime_error("successful decode returned a non-finite sample");
85
+ }
86
+ }
87
+ } else if (samples || count != 0) {
88
+ release(samples);
89
+ throw std::runtime_error("failed decode retained output ownership metadata");
90
+ }
91
+ release(samples);
92
+ }
93
+
94
+ } // namespace
95
+
96
+ int main(int argc, char** argv) try {
97
+ if (argc != 3)
98
+ throw std::runtime_error("usage: audio_reliability_smoke ADAPTER PATH_PREFIX");
99
+ void* library = dlopen(argv[1], RTLD_NOW | RTLD_LOCAL);
100
+ if (!library)
101
+ throw std::runtime_error(dlerror());
102
+
103
+ const auto probe = load<Probe>(library, "cohere_audio_ffmpeg_probe");
104
+ const auto duration = load<Duration>(library, "cohere_audio_ffmpeg_duration");
105
+ const auto decode = load<Decode>(library, "cohere_audio_ffmpeg_decode");
106
+ const auto cancel = load<Cancel>(library, "cohere_audio_ffmpeg_cancel");
107
+ const auto release = load<Free>(library, "cohere_audio_ffmpeg_free");
108
+ char diagnostic[1024] = {};
109
+ if (probe(diagnostic, sizeof(diagnostic)) != 0)
110
+ throw std::runtime_error(diagnostic);
111
+ probe(nullptr, 0);
112
+
113
+ const std::string valid_path = std::string(argv[2]) + "-valid.wav";
114
+ const std::string fuzz_path = std::string(argv[2]) + "-fuzz.bin";
115
+ const auto valid = wav_fixture();
116
+ write_bytes(valid_path, valid);
117
+
118
+ std::atomic<bool> concurrency_failed{false};
119
+ std::vector<std::thread> workers;
120
+ for (int worker = 0; worker < 8; ++worker) {
121
+ workers.emplace_back([&] {
122
+ for (int iteration = 0; iteration < 50; ++iteration) {
123
+ float* samples = nullptr;
124
+ std::int64_t count = 0;
125
+ char message[256] = {};
126
+ const int status = decode(valid_path.c_str(), 16'000, 4096, &samples, &count,
127
+ message, sizeof(message));
128
+ if (status != 0 || !samples || count != 400)
129
+ concurrency_failed.store(true, std::memory_order_release);
130
+ release(samples);
131
+ }
132
+ });
133
+ }
134
+ for (auto& worker : workers)
135
+ worker.join();
136
+ if (concurrency_failed.load(std::memory_order_acquire))
137
+ throw std::runtime_error("concurrent valid decodes were not stable");
138
+
139
+ float* limited_samples = nullptr;
140
+ std::int64_t limited_count = 0;
141
+ if (decode(valid_path.c_str(), 16'000, 4, &limited_samples, &limited_count,
142
+ diagnostic, sizeof(diagnostic)) != 4 || limited_samples || limited_count != 0) {
143
+ release(limited_samples);
144
+ throw std::runtime_error("decoded-audio memory limit did not fail closed");
145
+ }
146
+
147
+ std::mt19937_64 random(0xC0E4EULL);
148
+ for (int iteration = 0; iteration < 1'000; ++iteration) {
149
+ std::vector<std::uint8_t> bytes;
150
+ if (iteration < 500) {
151
+ bytes = valid;
152
+ const std::size_t mutations = 1 + (random() % 32);
153
+ for (std::size_t mutation = 0; mutation < mutations; ++mutation)
154
+ bytes[random() % bytes.size()] = static_cast<std::uint8_t>(random());
155
+ if ((iteration % 3) == 0)
156
+ bytes.resize(random() % (bytes.size() + 1));
157
+ } else {
158
+ bytes.resize(random() % 65'536);
159
+ for (auto& byte : bytes)
160
+ byte = static_cast<std::uint8_t>(random());
161
+ }
162
+ write_bytes(fuzz_path, bytes);
163
+
164
+ double seconds = 99.0;
165
+ const int duration_status = duration(fuzz_path.c_str(), &seconds, diagnostic, sizeof(diagnostic));
166
+ if ((duration_status == 0 && (!std::isfinite(seconds) || seconds < 0.0)) ||
167
+ (duration_status != 0 && seconds != -1.0)) {
168
+ throw std::runtime_error("duration fuzz returned invalid output metadata");
169
+ }
170
+
171
+ float* samples = nullptr;
172
+ std::int64_t count = 0;
173
+ const int status = decode(fuzz_path.c_str(), 16'000, 64 * 1024, &samples, &count,
174
+ diagnostic, sizeof(diagnostic));
175
+ check_decode_result(status, samples, count, 64 * 1024, release);
176
+ if ((iteration % 97) == 0)
177
+ cancel();
178
+ }
179
+
180
+ float* recovered = nullptr;
181
+ std::int64_t recovered_count = 0;
182
+ const int recovered_status = decode(valid_path.c_str(), 16'000, 4096, &recovered,
183
+ &recovered_count, diagnostic, sizeof(diagnostic));
184
+ if (recovered_status != 0 || !recovered || recovered_count != 400) {
185
+ release(recovered);
186
+ throw std::runtime_error("cancellation or malformed input poisoned later decoding");
187
+ }
188
+ release(recovered);
189
+
190
+ std::remove(valid_path.c_str());
191
+ std::remove(fuzz_path.c_str());
192
+ dlclose(library);
193
+ std::cout << "audio ABI reliability smoke: 400 concurrent valid + 1000 malformed cases\n";
194
+ return 0;
195
+ } catch (const std::exception& error) {
196
+ std::cerr << error.what() << '\n';
197
+ return 1;
198
+ }
@@ -0,0 +1,186 @@
1
+ // Standalone ownership and invalid-argument reliability test for instrumented builds.
2
+ //
3
+ // c++ -std=c++20 -O1 -g native_abi_reliability_smoke.cpp -ldl -pthread -o smoke
4
+ // ./smoke /path/to/libcrispasr.so /path/to/model.gguf
5
+
6
+ #include <atomic>
7
+ #include <cstdint>
8
+ #include <cstring>
9
+ #include <dlfcn.h>
10
+ #include <iostream>
11
+ #include <stdexcept>
12
+ #include <string>
13
+ #include <thread>
14
+ #include <vector>
15
+
16
+ namespace {
17
+
18
+ template <typename Function>
19
+ Function load(void* library, const char* name) {
20
+ auto function = reinterpret_cast<Function>(dlsym(library, name));
21
+ if (!function)
22
+ throw std::runtime_error(std::string("missing symbol ") + name);
23
+ return function;
24
+ }
25
+
26
+ struct open_params {
27
+ int abi_version;
28
+ int n_threads;
29
+ int use_gpu;
30
+ int verbosity;
31
+ int flash_attn;
32
+ int n_gpu_layers;
33
+ int reserved[6];
34
+ };
35
+
36
+ void require(bool condition, const char* message) {
37
+ if (!condition)
38
+ throw std::runtime_error(message);
39
+ }
40
+
41
+ } // namespace
42
+
43
+ int main(int argc, char** argv) try {
44
+ if (argc != 3)
45
+ throw std::runtime_error("usage: native_abi_reliability_smoke LIBCRISPASR MODEL_GGUF");
46
+ void* library = dlopen(argv[1], RTLD_NOW | RTLD_LOCAL);
47
+ if (!library)
48
+ throw std::runtime_error(dlerror());
49
+
50
+ using Open = void* (*)(const char*, const char*, const open_params*);
51
+ using Close = void (*)(void*);
52
+ using ErrorKind = int (*)();
53
+ using ErrorMessage = const char* (*)();
54
+ using ResolveDevice = const char* (*)(const char*);
55
+ using Memory = int (*)(void*, std::uint64_t*, std::uint64_t*);
56
+ using Capacity = int (*)(void*);
57
+ using Cancel = int (*)(void*);
58
+ using Transcribe = void* (*)(void*, const float*, int, const char*);
59
+ using TranscribeBatch = void* (*)(void*, const float* const*, const int*, int, const char*);
60
+ using SetInteger = int (*)(void*, int);
61
+ using FreeResult = void (*)(void*);
62
+ using Count = int (*)(void*);
63
+ using IndexedCount = int (*)(void*, int);
64
+ using IndexedText = const char* (*)(void*, int);
65
+ using WordText = const char* (*)(void*, int, int);
66
+ using BatchAt = void* (*)(void*, int);
67
+
68
+ const auto open = load<Open>(library, "crispasr_session_open_with_params");
69
+ const auto close = load<Close>(library, "crispasr_session_close");
70
+ const auto error_kind = load<ErrorKind>(library, "crispasr_last_error_kind");
71
+ const auto error_message = load<ErrorMessage>(library, "crispasr_last_error_message");
72
+ const auto resolve_device = load<ResolveDevice>(library, "crispasr_runtime_resolve_device");
73
+ const auto memory = load<Memory>(library, "crispasr_session_memory");
74
+ const auto capacity = load<Capacity>(library, "crispasr_session_batch_capacity");
75
+ const auto cancel = load<Cancel>(library, "crispasr_session_cancel");
76
+ const auto transcribe = load<Transcribe>(library, "crispasr_session_transcribe_lang");
77
+ const auto transcribe_batch =
78
+ load<TranscribeBatch>(library, "crispasr_session_transcribe_batch_lang");
79
+ const auto set_tokens = load<SetInteger>(library, "crispasr_session_set_max_new_tokens");
80
+ const auto set_beam = load<SetInteger>(library, "crispasr_session_set_beam_size");
81
+ const auto set_guard = load<SetInteger>(library, "crispasr_session_set_repetition_loop_guard");
82
+ const auto free_result = load<FreeResult>(library, "crispasr_session_result_free");
83
+ const auto free_batch = load<FreeResult>(library, "crispasr_session_batch_result_free");
84
+ const auto segment_count = load<Count>(library, "crispasr_session_result_n_segments");
85
+ const auto segment_words = load<IndexedCount>(library, "crispasr_session_result_n_words");
86
+ const auto segment_text = load<IndexedText>(library, "crispasr_session_result_segment_text");
87
+ const auto word_text = load<WordText>(library, "crispasr_session_result_word_text");
88
+ const auto batch_count = load<Count>(library, "crispasr_session_batch_result_count");
89
+ const auto batch_at = load<BatchAt>(library, "crispasr_session_batch_result_at");
90
+
91
+ require(std::strcmp(resolve_device(nullptr), "cpu") == 0 ||
92
+ std::strcmp(resolve_device(nullptr), "cuda") == 0 ||
93
+ std::strcmp(resolve_device(nullptr), "mps") == 0,
94
+ "automatic device resolution returned an invalid value");
95
+ require(std::strcmp(resolve_device("invalid"), "") == 0,
96
+ "invalid device resolution did not fail closed");
97
+
98
+ for (int iteration = 0; iteration < 32; ++iteration) {
99
+ require(!open(nullptr, "cohere", nullptr), "null model path unexpectedly opened");
100
+ require(error_kind() == 1, "null model path returned the wrong error kind");
101
+ require(!open("", "cohere", nullptr), "empty model path unexpectedly opened");
102
+ require(!open("/definitely/missing/cohere.gguf", "other", nullptr),
103
+ "unsupported backend unexpectedly opened");
104
+ }
105
+
106
+ // Error state belongs to the calling thread and concurrent callers must not
107
+ // overwrite one another's diagnostics.
108
+ require(!open(nullptr, "cohere", nullptr), "main-thread error fixture failed");
109
+ const std::string main_message = error_message();
110
+ std::atomic<bool> thread_failed{false};
111
+ std::vector<std::thread> workers;
112
+ for (int worker = 0; worker < 8; ++worker) {
113
+ workers.emplace_back([&] {
114
+ for (int iteration = 0; iteration < 200; ++iteration) {
115
+ if (transcribe(nullptr, nullptr, 0, nullptr) || error_kind() != 1 ||
116
+ std::strstr(error_message(), "invalid") == nullptr) {
117
+ thread_failed.store(true, std::memory_order_release);
118
+ }
119
+ }
120
+ });
121
+ }
122
+ for (auto& worker : workers)
123
+ worker.join();
124
+ require(!thread_failed.load(std::memory_order_acquire),
125
+ "thread-local invalid-argument diagnostics were unstable");
126
+ require(error_kind() == 1 && main_message == error_message(),
127
+ "another thread overwrote the main-thread error state");
128
+
129
+ std::uint64_t free_bytes = 99;
130
+ std::uint64_t total_bytes = 99;
131
+ require(memory(nullptr, &free_bytes, &total_bytes) == -1 && free_bytes == 0 && total_bytes == 0,
132
+ "invalid memory query did not clear outputs");
133
+ require(memory(nullptr, nullptr, nullptr) == -1, "null memory outputs were accepted");
134
+ require(capacity(nullptr) == 0, "null session reported batch capacity");
135
+ require(cancel(nullptr) == -1, "null cancellation returned the wrong status");
136
+ require(set_tokens(nullptr, 1) == -1 && set_beam(nullptr, 1) == -1 && set_guard(nullptr, 1) == -1,
137
+ "null session setter was accepted");
138
+ require(segment_count(nullptr) == 0 && segment_words(nullptr, -1) == 0,
139
+ "null result reported members");
140
+ require(std::strcmp(segment_text(nullptr, -1), "") == 0 &&
141
+ std::strcmp(word_text(nullptr, -1, -1), "") == 0,
142
+ "null result returned text");
143
+ require(batch_count(nullptr) == 0 && !batch_at(nullptr, 0),
144
+ "null batch result reported a lane");
145
+ free_result(nullptr);
146
+ free_batch(nullptr);
147
+ close(nullptr);
148
+
149
+ const open_params params{2, 4, 0, 0, 1, -1, {}};
150
+ void* session = open(argv[2], "cohere", &params);
151
+ if (!session)
152
+ throw std::runtime_error(std::string("session open failed: ") + error_message());
153
+ try {
154
+ require(capacity(session) >= 1, "real session reported no batch capacity");
155
+ const float sample = 0.0f;
156
+ const float* rows[] = {&sample};
157
+ const int zero[] = {0};
158
+ const int too_long[] = {35 * 16'000 + 1};
159
+ require(!transcribe(session, nullptr, 1, "en") && error_kind() == 1,
160
+ "null single-row PCM was accepted");
161
+ require(!transcribe(session, &sample, 0, "en") && error_kind() == 1,
162
+ "empty single-row PCM was accepted");
163
+ require(!transcribe_batch(session, nullptr, zero, 1, "en") && error_kind() == 1,
164
+ "null batch PCM table was accepted");
165
+ require(!transcribe_batch(session, rows, nullptr, 1, "en") && error_kind() == 1,
166
+ "null batch size table was accepted");
167
+ require(!transcribe_batch(session, rows, zero, 1, "en") && error_kind() == 1,
168
+ "empty batch row was accepted");
169
+ require(!transcribe_batch(session, rows, too_long, 1, "en") && error_kind() == 1,
170
+ "oversized batch row was accepted");
171
+ require(!transcribe_batch(session, rows, zero, capacity(session) + 1, "en") &&
172
+ error_kind() == 1,
173
+ "over-capacity batch was accepted");
174
+ require(cancel(session) == 0, "invalid calls poisoned the idle cancellation state");
175
+ } catch (...) {
176
+ close(session);
177
+ throw;
178
+ }
179
+ close(session);
180
+ dlclose(library);
181
+ std::cout << "native ABI reliability smoke: 32 opens + 1600 threaded failures + real-session bounds\n";
182
+ return 0;
183
+ } catch (const std::exception& error) {
184
+ std::cerr << error.what() << '\n';
185
+ return 1;
186
+ }
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Focused real-model timing probe for one retained native session.
4
+ #
5
+ # Usage:
6
+ # ruby native_batch_projection_probe.rb \
7
+ # LIBCRISPASR LIBCOHERE_AUDIO MODEL_GGUF AUDIO [BATCH_SIZE] [ITERATIONS]
8
+
9
+ require "digest"
10
+ require "fiddle"
11
+ require "json"
12
+
13
+ native_library, audio_library, model_path, audio_path, batch_text, iterations_text = ARGV
14
+ unless native_library && audio_library && model_path && audio_path
15
+ warn "usage: #{$PROGRAM_NAME} LIBCRISPASR LIBCOHERE_AUDIO MODEL_GGUF AUDIO [BATCH_SIZE] [ITERATIONS]"
16
+ exit 2
17
+ end
18
+
19
+ batch_size = Integer(batch_text || 24)
20
+ iterations = Integer(iterations_text || 2)
21
+ raise ArgumentError, "BATCH_SIZE must be between 1 and 24" unless batch_size.between?(1, 24)
22
+ raise ArgumentError, "ITERATIONS must be positive" unless iterations.positive?
23
+
24
+ ENV["COHERE_TRANSCRIBE_NATIVE_LIBRARY"] = File.expand_path(native_library)
25
+ ENV["COHERE_TRANSCRIBE_AUDIO_LIBRARY"] = File.expand_path(audio_library)
26
+
27
+ $LOAD_PATH.unshift(File.expand_path("../../../lib", __dir__))
28
+ require "cohere/transcribe"
29
+
30
+ options = Cohere::Transcribe::TranscriptionOptions.new(
31
+ device: ENV.fetch("COHERE_PROBE_DEVICE", "cuda"),
32
+ dtype: "fp16",
33
+ vad: "none",
34
+ alignment: "segment",
35
+ max_new_tokens: 445
36
+ )
37
+ samples = Cohere::Transcribe::Audio::Decoder.decode(audio_path, backend: "ffmpeg").samples
38
+ session = Cohere::Transcribe::ASR::NativeSession.new(model_path, options, threads: 6)
39
+ warmup_iterations = Integer(ENV.fetch("COHERE_PROBE_WARMUP_ITERATIONS", "0"))
40
+ raise ArgumentError, "COHERE_PROBE_WARMUP_ITERATIONS must not be negative" if warmup_iterations.negative?
41
+
42
+ profiler = if ENV["COHERE_PROBE_CUDA_CAPTURE"] == "1"
43
+ handle = Fiddle::Handle.new("libcudart.so.12")
44
+ [
45
+ handle,
46
+ Fiddle::Function.new(handle["cudaProfilerStart"], [], Fiddle::TYPE_INT),
47
+ Fiddle::Function.new(handle["cudaProfilerStop"], [], Fiddle::TYPE_INT)
48
+ ]
49
+ end
50
+ profiler_started = false
51
+
52
+ begin
53
+ warmup_iterations.times do
54
+ session.transcribe_batch(Array.new(batch_size, samples), language: "ar")
55
+ end
56
+ if profiler
57
+ status = profiler[1].call
58
+ raise "cudaProfilerStart failed with status #{status}" unless status.zero?
59
+
60
+ profiler_started = true
61
+ end
62
+
63
+ iterations.times do |iteration|
64
+ started = Process.clock_gettime(Process::CLOCK_MONOTONIC)
65
+ output = session.transcribe_batch(Array.new(batch_size, samples), language: "ar")
66
+ elapsed = Process.clock_gettime(Process::CLOCK_MONOTONIC) - started
67
+ puts JSON.generate(
68
+ iteration: iteration + 1,
69
+ batch_size: batch_size,
70
+ elapsed_seconds: elapsed,
71
+ text_sha256: Digest::SHA256.hexdigest(output.map(&:text).join("\0")),
72
+ generated_tokens: output.map(&:generated_tokens)
73
+ )
74
+ end
75
+ ensure
76
+ if profiler_started
77
+ status = profiler[2].call
78
+ warn "cudaProfilerStop failed with status #{status}" unless status.zero?
79
+ end
80
+ session.close
81
+ end
@@ -0,0 +1,194 @@
1
+ // Standalone real-model cancellation/lifetime smoke test for sanitizer builds.
2
+ //
3
+ // c++ -std=c++20 -O1 -g -pthread native_cancellation_smoke.cpp -ldl -o smoke
4
+ // ASAN_OPTIONS=detect_leaks=1 ./smoke /path/to/libcrispasr.so /path/to/model.gguf
5
+
6
+ // Keeping this process independent from Ruby avoids false positives from
7
+ // ASan's interaction with Ruby's separately mapped fiber stacks.
8
+
9
+ #include <atomic>
10
+ #include <chrono>
11
+ #include <cstdint>
12
+ #include <cstring>
13
+ #include <dlfcn.h>
14
+ #include <iostream>
15
+ #include <stdexcept>
16
+ #include <string>
17
+ #include <thread>
18
+ #include <utility>
19
+ #include <vector>
20
+
21
+ namespace {
22
+
23
+ template <typename Function>
24
+ Function load(void* library, const char* name) {
25
+ dlerror();
26
+ auto function = reinterpret_cast<Function>(dlsym(library, name));
27
+ const char* error = dlerror();
28
+ if (error || !function)
29
+ throw std::runtime_error(std::string("missing symbol ") + name + ": " +
30
+ (error ? error : "unknown loader error"));
31
+ return function;
32
+ }
33
+
34
+ struct open_params {
35
+ int abi_version;
36
+ int n_threads;
37
+ int use_gpu;
38
+ int verbosity;
39
+ int flash_attn;
40
+ int n_gpu_layers;
41
+ int reserved[6];
42
+ };
43
+
44
+ struct worker_outcome {
45
+ void* result = nullptr;
46
+ int error_kind = -1;
47
+ std::string error_message;
48
+ };
49
+
50
+ } // namespace
51
+
52
+ int main(int argc, char** argv) try {
53
+ if (argc != 3)
54
+ throw std::runtime_error("usage: native_cancellation_smoke LIBCRISPASR MODEL_GGUF");
55
+
56
+ void* library = dlopen(argv[1], RTLD_NOW | RTLD_LOCAL);
57
+ if (!library)
58
+ throw std::runtime_error(dlerror());
59
+
60
+ using Open = void* (*)(const char*, const char*, const open_params*);
61
+ using Close = void (*)(void*);
62
+ using Cancel = int (*)(void*);
63
+ using Transcribe = void* (*)(void*, const float*, int, const char*);
64
+ using TranscribeBatch = void* (*)(void*, const float* const*, const int*, int, const char*);
65
+ using FreeResult = void (*)(void*);
66
+ using BatchCount = int (*)(void*);
67
+ using FreeBatchResult = void (*)(void*);
68
+ using ErrorKind = int (*)();
69
+ using ErrorMessage = const char* (*)();
70
+ using SetInteger = int (*)(void*, int);
71
+
72
+ const auto open = load<Open>(library, "crispasr_session_open_with_params");
73
+ const auto close = load<Close>(library, "crispasr_session_close");
74
+ const auto cancel = load<Cancel>(library, "crispasr_session_cancel");
75
+ const auto transcribe = load<Transcribe>(library, "crispasr_session_transcribe_lang");
76
+ const auto transcribe_batch =
77
+ load<TranscribeBatch>(library, "crispasr_session_transcribe_batch_lang");
78
+ const auto free_result = load<FreeResult>(library, "crispasr_session_result_free");
79
+ const auto batch_count = load<BatchCount>(library, "crispasr_session_batch_result_count");
80
+ const auto free_batch_result =
81
+ load<FreeBatchResult>(library, "crispasr_session_batch_result_free");
82
+ const auto error_kind = load<ErrorKind>(library, "crispasr_last_error_kind");
83
+ const auto error_message = load<ErrorMessage>(library, "crispasr_last_error_message");
84
+ const auto set_max_tokens = load<SetInteger>(library, "crispasr_session_set_max_new_tokens");
85
+
86
+ const open_params params{2, 4, 0, 0, 1, -1, {}};
87
+ void* session = open(argv[2], "cohere", &params);
88
+ if (!session)
89
+ throw std::runtime_error(std::string("session open failed: ") + error_message());
90
+
91
+ try {
92
+ if (cancel(session) != 0)
93
+ throw std::runtime_error("idle cancellation was not a no-op");
94
+ if (set_max_tokens(session, 64) != 0)
95
+ throw std::runtime_error("could not set the generation limit");
96
+
97
+ // A maximum-length row leaves ample time to observe the running state,
98
+ // even on a fast host. Repeating exercises reset-to-idle and retained
99
+ // graph lifetime after several abort points.
100
+ const std::vector<float> long_audio(35 * 16'000, 0.0f);
101
+ for (int iteration = 0; iteration < 5; ++iteration) {
102
+ std::atomic<bool> entered{false};
103
+ worker_outcome outcome;
104
+ std::thread worker([&] {
105
+ entered.store(true, std::memory_order_release);
106
+ outcome.result = transcribe(
107
+ session,
108
+ long_audio.data(),
109
+ static_cast<int>(long_audio.size()),
110
+ "en");
111
+ outcome.error_kind = error_kind();
112
+ const char* message = error_message();
113
+ outcome.error_message = message ? message : "";
114
+ });
115
+
116
+ while (!entered.load(std::memory_order_acquire))
117
+ std::this_thread::yield();
118
+
119
+ bool requested = false;
120
+ const auto deadline = std::chrono::steady_clock::now() + std::chrono::seconds(30);
121
+ while (std::chrono::steady_clock::now() < deadline) {
122
+ if (cancel(session) == 1) {
123
+ requested = true;
124
+ break;
125
+ }
126
+ std::this_thread::sleep_for(std::chrono::milliseconds(1));
127
+ }
128
+ if (!requested) {
129
+ worker.join();
130
+ free_result(outcome.result);
131
+ throw std::runtime_error("never observed an active inference operation");
132
+ }
133
+
134
+ worker.join();
135
+ if (outcome.result) {
136
+ free_result(outcome.result);
137
+ throw std::runtime_error("cancelled inference returned a result");
138
+ }
139
+ if (outcome.error_kind != 5 || outcome.error_message.find("cancel") == std::string::npos)
140
+ throw std::runtime_error("cancelled inference returned the wrong typed diagnostic");
141
+ if (cancel(session) != 0)
142
+ throw std::runtime_error("completed cancellation poisoned the idle session");
143
+ }
144
+
145
+ // Prove the retained session remains usable after repeated aborts.
146
+ if (set_max_tokens(session, 4) != 0)
147
+ throw std::runtime_error("could not set the reuse generation limit");
148
+ const std::vector<float> short_audio(16'000, 0.0f);
149
+ void* reused = transcribe(
150
+ session,
151
+ short_audio.data(),
152
+ static_cast<int>(short_audio.size()),
153
+ "en");
154
+ if (!reused)
155
+ throw std::runtime_error(std::string("post-cancellation reuse failed: ") + error_message());
156
+ free_result(reused);
157
+ if (cancel(session) != 0)
158
+ throw std::runtime_error("post-reuse idle cancellation was not a no-op");
159
+
160
+ // Exercise the independent padded-encoder/ragged-decoder ownership
161
+ // path after a cancelled single-row graph has been replaced.
162
+ const float* rows[] = {short_audio.data(), short_audio.data()};
163
+ const int row_sizes[] = {
164
+ static_cast<int>(short_audio.size()),
165
+ static_cast<int>(short_audio.size()),
166
+ };
167
+ void* batch = transcribe_batch(session, rows, row_sizes, 2, "en");
168
+ if (!batch)
169
+ throw std::runtime_error(std::string("post-cancellation batch failed: ") + error_message());
170
+ if (batch_count(batch) != 2) {
171
+ free_batch_result(batch);
172
+ throw std::runtime_error("post-cancellation batch returned the wrong row count");
173
+ }
174
+ free_batch_result(batch);
175
+ if (cancel(session) != 0)
176
+ throw std::runtime_error("post-batch idle cancellation was not a no-op");
177
+ } catch (...) {
178
+ close(session);
179
+ #if !defined(COHERE_SANITIZER_KEEP_LIBRARY_LOADED)
180
+ dlclose(library);
181
+ #endif
182
+ throw;
183
+ }
184
+
185
+ close(session);
186
+ #if !defined(COHERE_SANITIZER_KEEP_LIBRARY_LOADED)
187
+ dlclose(library);
188
+ #endif
189
+ std::cout << "verified five cancellations plus single-row and batch reuse\n";
190
+ return 0;
191
+ } catch (const std::exception& error) {
192
+ std::cerr << error.what() << '\n';
193
+ return 1;
194
+ }
@@ -0,0 +1,23 @@
1
+ # Word-alignment attribution
2
+
3
+ ## Downloaded MMS model
4
+
5
+ The optional word-alignment runtime downloads the full-precision ONNX export of `MahmoudAshraf/mms-300m-1130-forced-aligner` into the user's Hugging Face cache. The export is pinned to `onnx-community/mms-300m-1130-forced-aligner-ONNX@2100fb247d8e43962eef24491597fbeb8b469531` and is derived from the source checkpoint revision `49402e9577b1158620820667c218cd494cc44486`.
6
+
7
+ The model is licensed under CC-BY-NC-4.0, including its non-commercial-use restriction. The model weights are downloaded only when word mode is used and are not distributed inside this gem. The runtime pins and verifies these artifacts before loading them:
8
+
9
+ - `onnx/model.onnx`: 1,262,529,881 bytes, SHA-256 `429e5d05c62acc8a9264db874a1b131e359fc626e40c253ac7b1fe52b11149b4`
10
+ - `onnx/model_fp16.onnx`: 631,591,191 bytes, SHA-256 `e98082b382375f3528ec7514e175b5cd0eb77fcc4d4531a7142b9e45a1ce6deb`
11
+
12
+ See:
13
+
14
+ - <https://huggingface.co/MahmoudAshraf/mms-300m-1130-forced-aligner>
15
+ - <https://huggingface.co/onnx-community/mms-300m-1130-forced-aligner-ONNX>
16
+
17
+ ## Packaged alignment code
18
+
19
+ Normalization, punctuation, repeated-token merging, and span behavior in `text.rb` and `ctc.rb` retain modified behavior from Fairseq MMS at revision `728b947019fd186753197add48c39cbb24ea43e2` and `ctc-forced-aligner` at revision `11855d1de76af2b490dd2e8e2db2661805ae90a0`. These bundled portions are distributed under CC-BY-NC-4.0; see `LICENSE.ctc-forced-aligner`.
20
+
21
+ The float32 CTC dynamic program in `ctc.rb` is a Ruby port of the TorchAudio 2.11.0 `forced_align` CPU kernel's documented state transitions and tie-breaking behavior. TorchAudio is BSD-2-Clause licensed; see `LICENSE.torchaudio`.
22
+
23
+ Romanization uses static, pure-Ruby single-codepoint data generated from the Uroman 1.3.1.1 reference for every character reachable from the pinned Cohere tokenizers, together with the reachable Greek and Japanese multi-codepoint/context rules. It does not invoke Python or an external romanizer at runtime. Uroman is written by Ulf Hermjakob, USC Information Sciences Institute (2015-2020), and is distributed under the permissive terms in `LICENSE.uroman`.