whispercpp 1.3.6 → 1.3.7

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 (828) hide show
  1. checksums.yaml +4 -4
  2. data/.document +3 -0
  3. data/.rdoc_options +2 -0
  4. data/README.md +38 -5
  5. data/Rakefile +18 -3
  6. data/ext/dependencies.rb +10 -4
  7. data/ext/dependencies_for_windows.rb +17 -0
  8. data/ext/extconf.rb +20 -8
  9. data/ext/options.rb +54 -14
  10. data/ext/options_for_windows.rb +51 -0
  11. data/ext/ruby_whisper.c +36 -42
  12. data/ext/ruby_whisper.h +135 -0
  13. data/ext/ruby_whisper_context.c +107 -28
  14. data/ext/ruby_whisper_log_queue.c +180 -0
  15. data/ext/ruby_whisper_log_settable.h +47 -0
  16. data/ext/ruby_whisper_parakeet.c +49 -0
  17. data/ext/ruby_whisper_parakeet_context.c +304 -0
  18. data/ext/ruby_whisper_parakeet_context_params.c +117 -0
  19. data/ext/ruby_whisper_parakeet_model.c +84 -0
  20. data/ext/ruby_whisper_parakeet_params.c +548 -0
  21. data/ext/ruby_whisper_parakeet_segment.c +157 -0
  22. data/ext/ruby_whisper_parakeet_token.c +188 -0
  23. data/ext/ruby_whisper_parakeet_transcribe.cpp +58 -0
  24. data/ext/ruby_whisper_params.c +256 -65
  25. data/ext/ruby_whisper_segment.c +6 -6
  26. data/ext/ruby_whisper_transcribe.cpp +42 -15
  27. data/ext/sources/CMakeLists.txt +41 -3
  28. data/ext/sources/CMakePresets.json +95 -0
  29. data/ext/sources/cmake/parakeet-config.cmake.in +30 -0
  30. data/ext/sources/cmake/parakeet.pc.in +10 -0
  31. data/ext/sources/cmake/whisper.pc.in +1 -1
  32. data/ext/sources/examples/CMakeLists.txt +4 -2
  33. data/ext/sources/examples/bench/bench.cpp +1 -1
  34. data/ext/sources/examples/cli/cli.cpp +43 -9
  35. data/ext/sources/examples/common-ggml.cpp +2 -0
  36. data/ext/sources/examples/common-whisper.cpp +139 -67
  37. data/ext/sources/examples/common-whisper.h +11 -0
  38. data/ext/sources/examples/ffmpeg-transcode.cpp +211 -341
  39. data/ext/sources/examples/parakeet-cli/CMakeLists.txt +8 -0
  40. data/ext/sources/examples/parakeet-cli/parakeet-cli.cpp +243 -0
  41. data/ext/sources/examples/parakeet-quantize/CMakeLists.txt +7 -0
  42. data/ext/sources/examples/parakeet-quantize/parakeet-quantize.cpp +230 -0
  43. data/ext/sources/examples/server/server.cpp +199 -163
  44. data/ext/sources/ggml/CMakeLists.txt +21 -13
  45. data/ext/sources/ggml/cmake/FindNCCL.cmake +36 -0
  46. data/ext/sources/ggml/cmake/ggml-config.cmake.in +12 -2
  47. data/ext/sources/ggml/include/ggml-alloc.h +1 -0
  48. data/ext/sources/ggml/include/ggml-backend.h +72 -10
  49. data/ext/sources/ggml/include/ggml-cuda.h +3 -0
  50. data/ext/sources/ggml/include/ggml-rpc.h +3 -3
  51. data/ext/sources/ggml/include/ggml.h +101 -9
  52. data/ext/sources/ggml/include/gguf.h +10 -2
  53. data/ext/sources/ggml/src/CMakeLists.txt +22 -5
  54. data/ext/sources/ggml/src/ggml-alloc.c +5 -1
  55. data/ext/sources/ggml/src/ggml-backend-impl.h +22 -2
  56. data/ext/sources/ggml/src/ggml-backend-meta.cpp +2263 -0
  57. data/ext/sources/ggml/src/ggml-backend-reg.cpp +12 -0
  58. data/ext/sources/ggml/src/ggml-backend.cpp +110 -9
  59. data/ext/sources/ggml/src/ggml-blas/ggml-blas.cpp +4 -0
  60. data/ext/sources/ggml/src/ggml-cann/aclnn_ops.cpp +672 -257
  61. data/ext/sources/ggml/src/ggml-cann/aclnn_ops.h +71 -0
  62. data/ext/sources/ggml/src/ggml-cann/common.h +20 -10
  63. data/ext/sources/ggml/src/ggml-cann/ggml-cann.cpp +211 -30
  64. data/ext/sources/ggml/src/ggml-common.h +11 -0
  65. data/ext/sources/ggml/src/ggml-cpu/CMakeLists.txt +58 -29
  66. data/ext/sources/ggml/src/ggml-cpu/amx/amx.cpp +2 -0
  67. data/ext/sources/ggml/src/ggml-cpu/amx/mmq.cpp +16 -16
  68. data/ext/sources/ggml/src/ggml-cpu/arch/arm/quants.c +116 -7
  69. data/ext/sources/ggml/src/ggml-cpu/arch/arm/repack.cpp +65 -0
  70. data/ext/sources/ggml/src/ggml-cpu/arch/loongarch/quants.c +151 -1
  71. data/ext/sources/ggml/src/ggml-cpu/arch/powerpc/quants.c +0 -1
  72. data/ext/sources/ggml/src/ggml-cpu/arch/riscv/quants.c +4279 -1292
  73. data/ext/sources/ggml/src/ggml-cpu/arch/riscv/repack.cpp +5 -35
  74. data/ext/sources/ggml/src/ggml-cpu/arch/s390/quants.c +0 -1
  75. data/ext/sources/ggml/src/ggml-cpu/arch/wasm/quants.c +72 -1
  76. data/ext/sources/ggml/src/ggml-cpu/arch/x86/quants.c +177 -27
  77. data/ext/sources/ggml/src/ggml-cpu/arch/x86/repack.cpp +1 -1
  78. data/ext/sources/ggml/src/ggml-cpu/arch-fallback.h +5 -0
  79. data/ext/sources/ggml/src/ggml-cpu/cmake/FindSMTIME.cmake +32 -0
  80. data/ext/sources/ggml/src/ggml-cpu/ggml-cpu-impl.h +10 -0
  81. data/ext/sources/ggml/src/ggml-cpu/ggml-cpu.c +95 -5
  82. data/ext/sources/ggml/src/ggml-cpu/ggml-cpu.cpp +2 -0
  83. data/ext/sources/ggml/src/ggml-cpu/kleidiai/kleidiai.cpp +146 -134
  84. data/ext/sources/ggml/src/ggml-cpu/llamafile/sgemm.cpp +88 -70
  85. data/ext/sources/ggml/src/ggml-cpu/ops.cpp +372 -73
  86. data/ext/sources/ggml/src/ggml-cpu/ops.h +3 -0
  87. data/ext/sources/ggml/src/ggml-cpu/quants.c +55 -0
  88. data/ext/sources/ggml/src/ggml-cpu/quants.h +3 -0
  89. data/ext/sources/ggml/src/ggml-cpu/repack.cpp +3 -0
  90. data/ext/sources/ggml/src/ggml-cpu/simd-gemm.h +90 -0
  91. data/ext/sources/ggml/src/ggml-cpu/simd-mappings.h +3 -16
  92. data/ext/sources/ggml/src/ggml-cpu/spacemit/ime.cpp +1402 -687
  93. data/ext/sources/ggml/src/ggml-cpu/spacemit/ime.h +8 -0
  94. data/ext/sources/ggml/src/ggml-cpu/spacemit/ime1_kernels.cpp +597 -2766
  95. data/ext/sources/ggml/src/ggml-cpu/spacemit/ime2_kernels.cpp +5768 -0
  96. data/ext/sources/ggml/src/ggml-cpu/spacemit/ime_env.cpp +320 -0
  97. data/ext/sources/ggml/src/ggml-cpu/spacemit/ime_env.h +55 -0
  98. data/ext/sources/ggml/src/ggml-cpu/spacemit/ime_kernels.h +182 -19
  99. data/ext/sources/ggml/src/ggml-cpu/spacemit/repack.cpp +1795 -0
  100. data/ext/sources/ggml/src/ggml-cpu/spacemit/repack.h +14 -0
  101. data/ext/sources/ggml/src/ggml-cpu/spacemit/rvv_kernels.cpp +3178 -0
  102. data/ext/sources/ggml/src/ggml-cpu/spacemit/rvv_kernels.h +95 -0
  103. data/ext/sources/ggml/src/ggml-cpu/spacemit/spine_barrier.h +34 -0
  104. data/ext/sources/ggml/src/ggml-cpu/spacemit/spine_mem_pool.cpp +760 -0
  105. data/ext/sources/ggml/src/ggml-cpu/spacemit/spine_mem_pool.h +32 -0
  106. data/ext/sources/ggml/src/ggml-cpu/spacemit/spine_tcm.h +409 -0
  107. data/ext/sources/ggml/src/ggml-cpu/vec.cpp +37 -53
  108. data/ext/sources/ggml/src/ggml-cpu/vec.h +225 -240
  109. data/ext/sources/ggml/src/ggml-cuda/CMakeLists.txt +17 -7
  110. data/ext/sources/ggml/src/ggml-cuda/allreduce.cu +971 -0
  111. data/ext/sources/ggml/src/ggml-cuda/allreduce.cuh +29 -0
  112. data/ext/sources/ggml/src/ggml-cuda/argsort.cu +62 -26
  113. data/ext/sources/ggml/src/ggml-cuda/binbcast.cu +44 -18
  114. data/ext/sources/ggml/src/ggml-cuda/binbcast.cuh +1 -0
  115. data/ext/sources/ggml/src/ggml-cuda/common.cuh +242 -28
  116. data/ext/sources/ggml/src/ggml-cuda/concat.cu +120 -114
  117. data/ext/sources/ggml/src/ggml-cuda/conv2d-transpose.cu +45 -21
  118. data/ext/sources/ggml/src/ggml-cuda/conv2d-transpose.cuh +1 -0
  119. data/ext/sources/ggml/src/ggml-cuda/convert.cu +53 -0
  120. data/ext/sources/ggml/src/ggml-cuda/convert.cuh +10 -0
  121. data/ext/sources/ggml/src/ggml-cuda/cpy.cu +14 -6
  122. data/ext/sources/ggml/src/ggml-cuda/dequantize.cuh +22 -0
  123. data/ext/sources/ggml/src/ggml-cuda/fattn-common.cuh +278 -44
  124. data/ext/sources/ggml/src/ggml-cuda/fattn-mma-f16.cuh +331 -130
  125. data/ext/sources/ggml/src/ggml-cuda/fattn-tile.cu +12 -0
  126. data/ext/sources/ggml/src/ggml-cuda/fattn-tile.cuh +126 -27
  127. data/ext/sources/ggml/src/ggml-cuda/fattn-vec.cuh +40 -15
  128. data/ext/sources/ggml/src/ggml-cuda/fattn-wmma-f16.cu +18 -9
  129. data/ext/sources/ggml/src/ggml-cuda/fattn.cu +152 -49
  130. data/ext/sources/ggml/src/ggml-cuda/fattn.cuh +2 -0
  131. data/ext/sources/ggml/src/ggml-cuda/fwht.cu +101 -0
  132. data/ext/sources/ggml/src/ggml-cuda/fwht.cuh +4 -0
  133. data/ext/sources/ggml/src/ggml-cuda/gated_delta_net.cu +84 -35
  134. data/ext/sources/ggml/src/ggml-cuda/getrows.cu +34 -12
  135. data/ext/sources/ggml/src/ggml-cuda/ggml-cuda.cu +1069 -609
  136. data/ext/sources/ggml/src/ggml-cuda/im2col.cu +32 -29
  137. data/ext/sources/ggml/src/ggml-cuda/mean.cu +4 -2
  138. data/ext/sources/ggml/src/ggml-cuda/mma.cuh +242 -195
  139. data/ext/sources/ggml/src/ggml-cuda/mmf.cuh +3 -3
  140. data/ext/sources/ggml/src/ggml-cuda/mmq.cu +18 -12
  141. data/ext/sources/ggml/src/ggml-cuda/mmq.cuh +502 -423
  142. data/ext/sources/ggml/src/ggml-cuda/mmvf.cu +19 -12
  143. data/ext/sources/ggml/src/ggml-cuda/mmvq.cu +485 -57
  144. data/ext/sources/ggml/src/ggml-cuda/mmvq.cuh +6 -1
  145. data/ext/sources/ggml/src/ggml-cuda/norm.cu +36 -10
  146. data/ext/sources/ggml/src/ggml-cuda/out-prod.cu +23 -7
  147. data/ext/sources/ggml/src/ggml-cuda/quantize.cu +133 -26
  148. data/ext/sources/ggml/src/ggml-cuda/quantize.cuh +1 -1
  149. data/ext/sources/ggml/src/ggml-cuda/reduce_rows.cuh +5 -1
  150. data/ext/sources/ggml/src/ggml-cuda/rope.cu +11 -4
  151. data/ext/sources/ggml/src/ggml-cuda/scale.cu +4 -1
  152. data/ext/sources/ggml/src/ggml-cuda/set-rows.cu +14 -6
  153. data/ext/sources/ggml/src/ggml-cuda/snake.cu +72 -0
  154. data/ext/sources/ggml/src/ggml-cuda/snake.cuh +8 -0
  155. data/ext/sources/ggml/src/ggml-cuda/softcap.cu +4 -1
  156. data/ext/sources/ggml/src/ggml-cuda/ssm-conv.cu +45 -13
  157. data/ext/sources/ggml/src/ggml-cuda/ssm-conv.cuh +1 -1
  158. data/ext/sources/ggml/src/ggml-cuda/ssm-scan.cu +40 -18
  159. data/ext/sources/ggml/src/ggml-cuda/sumrows.cu +8 -4
  160. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_1-ncols2_16.cu +1 -0
  161. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_1-ncols2_32.cu +1 -0
  162. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_1-ncols2_8.cu +2 -0
  163. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_16-ncols2_4.cu +1 -0
  164. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_2-ncols2_16.cu +1 -0
  165. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_2-ncols2_32.cu +1 -0
  166. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_2-ncols2_4.cu +1 -0
  167. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_2-ncols2_8.cu +2 -0
  168. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_4-ncols2_16.cu +1 -0
  169. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_4-ncols2_4.cu +1 -0
  170. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_4-ncols2_8.cu +2 -0
  171. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_8-ncols2_4.cu +1 -0
  172. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_8-ncols2_8.cu +2 -0
  173. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-tile-instance-dkq192-dv128.cu +5 -0
  174. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-tile-instance-dkq320-dv256.cu +5 -0
  175. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-tile-instance-dkq512-dv512.cu +5 -0
  176. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-bf16.cu +7 -0
  177. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-f16.cu +7 -0
  178. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-q4_0.cu +7 -0
  179. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-q4_1.cu +7 -0
  180. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-q5_0.cu +7 -0
  181. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-q5_1.cu +7 -0
  182. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-q8_0.cu +7 -0
  183. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-f16-bf16.cu +7 -0
  184. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_0-bf16.cu +7 -0
  185. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_1-bf16.cu +7 -0
  186. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_0-bf16.cu +7 -0
  187. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_1-bf16.cu +7 -0
  188. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q8_0-bf16.cu +7 -0
  189. data/ext/sources/ggml/src/ggml-cuda/template-instances/mmq-instance-nvfp4.cu +5 -0
  190. data/ext/sources/ggml/src/ggml-cuda/template-instances/mmq-instance-q1_0.cu +5 -0
  191. data/ext/sources/ggml/src/ggml-cuda/top-k.cu +5 -4
  192. data/ext/sources/ggml/src/ggml-cuda/topk-moe.cu +26 -23
  193. data/ext/sources/ggml/src/ggml-cuda/unary.cu +31 -2
  194. data/ext/sources/ggml/src/ggml-cuda/unary.cuh +2 -0
  195. data/ext/sources/ggml/src/ggml-cuda/vecdotq.cuh +80 -0
  196. data/ext/sources/ggml/src/ggml-cuda/vendors/cuda.h +7 -2
  197. data/ext/sources/ggml/src/ggml-cuda/vendors/hip.h +22 -4
  198. data/ext/sources/ggml/src/ggml-cuda/vendors/musa.h +3 -0
  199. data/ext/sources/ggml/src/ggml-hexagon/CMakeLists.txt +2 -1
  200. data/ext/sources/ggml/src/ggml-hexagon/ggml-hexagon.cpp +1428 -743
  201. data/ext/sources/ggml/src/ggml-hexagon/htp/CMakeLists.txt +45 -7
  202. data/ext/sources/ggml/src/ggml-hexagon/htp/act-ops.c +53 -84
  203. data/ext/sources/ggml/src/ggml-hexagon/htp/argsort-ops.c +25 -12
  204. data/ext/sources/ggml/src/ggml-hexagon/htp/binary-ops.c +165 -184
  205. data/ext/sources/ggml/src/ggml-hexagon/htp/cmake-toolchain.cmake +5 -5
  206. data/ext/sources/ggml/src/ggml-hexagon/htp/concat-ops.c +277 -0
  207. data/ext/sources/ggml/src/ggml-hexagon/htp/cpy-ops.c +170 -127
  208. data/ext/sources/ggml/src/ggml-hexagon/htp/cumsum-ops.c +270 -0
  209. data/ext/sources/ggml/src/ggml-hexagon/htp/diag-ops.c +216 -0
  210. data/ext/sources/ggml/src/ggml-hexagon/htp/fill-ops.c +123 -0
  211. data/ext/sources/ggml/src/ggml-hexagon/htp/flash-attn-ops.c +125 -97
  212. data/ext/sources/ggml/src/ggml-hexagon/htp/gated-delta-net-ops.c +1148 -0
  213. data/ext/sources/ggml/src/ggml-hexagon/htp/get-rows-ops.c +148 -42
  214. data/ext/sources/ggml/src/ggml-hexagon/htp/hex-dma.c +2 -2
  215. data/ext/sources/ggml/src/ggml-hexagon/htp/hex-dma.h +252 -62
  216. data/ext/sources/ggml/src/ggml-hexagon/htp/hex-dump.h +9 -0
  217. data/ext/sources/ggml/src/ggml-hexagon/htp/hex-utils.h +87 -1
  218. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-flash-attn-ops.c +1878 -0
  219. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-matmul-ops.c +2066 -0
  220. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-ops.c +6 -0
  221. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-ops.h +88 -0
  222. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-profile.h +34 -0
  223. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-queue.c +158 -0
  224. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-queue.h +134 -0
  225. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-utils.h +200 -0
  226. data/ext/sources/ggml/src/ggml-hexagon/htp/htp-ctx.h +96 -13
  227. data/ext/sources/ggml/src/ggml-hexagon/htp/htp-ops.h +182 -57
  228. data/ext/sources/ggml/src/ggml-hexagon/htp/htp_iface.idl +9 -3
  229. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-base.h +71 -3
  230. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-copy.h +27 -10
  231. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-div.h +63 -23
  232. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-exp.h +9 -8
  233. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-flash-attn.h +47 -0
  234. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-log.h +65 -0
  235. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-pow.h +42 -0
  236. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-repl.h +74 -0
  237. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-sigmoid.h +1 -0
  238. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-sin-cos.h +90 -0
  239. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-utils.h +5 -8
  240. data/ext/sources/ggml/src/ggml-hexagon/htp/main.c +529 -815
  241. data/ext/sources/ggml/src/ggml-hexagon/htp/matmul-ops.c +2522 -234
  242. data/ext/sources/ggml/src/ggml-hexagon/htp/pad-ops.c +547 -0
  243. data/ext/sources/ggml/src/ggml-hexagon/htp/repeat-ops.c +148 -0
  244. data/ext/sources/ggml/src/ggml-hexagon/htp/rope-ops.c +291 -95
  245. data/ext/sources/ggml/src/ggml-hexagon/htp/set-rows-ops.c +59 -37
  246. data/ext/sources/ggml/src/ggml-hexagon/htp/softmax-ops.c +121 -133
  247. data/ext/sources/ggml/src/ggml-hexagon/htp/solve-tri-ops.c +267 -0
  248. data/ext/sources/ggml/src/ggml-hexagon/htp/ssm-conv.c +244 -151
  249. data/ext/sources/ggml/src/ggml-hexagon/htp/sum-rows-ops.c +6 -6
  250. data/ext/sources/ggml/src/ggml-hexagon/htp/unary-ops.c +719 -45
  251. data/ext/sources/ggml/src/ggml-hexagon/htp/vtcm-utils.h +16 -0
  252. data/ext/sources/ggml/src/ggml-hexagon/htp-opnode.h +272 -0
  253. data/ext/sources/ggml/src/ggml-hexagon/libggml-htp.inf +3 -1
  254. data/ext/sources/ggml/src/ggml-hip/CMakeLists.txt +22 -9
  255. data/ext/sources/ggml/src/ggml-impl.h +6 -1
  256. data/ext/sources/ggml/src/ggml-metal/ggml-metal-device.cpp +138 -13
  257. data/ext/sources/ggml/src/ggml-metal/ggml-metal-device.h +32 -1
  258. data/ext/sources/ggml/src/ggml-metal/ggml-metal-device.m +164 -28
  259. data/ext/sources/ggml/src/ggml-metal/ggml-metal-impl.h +80 -0
  260. data/ext/sources/ggml/src/ggml-metal/ggml-metal-ops.cpp +190 -19
  261. data/ext/sources/ggml/src/ggml-metal/ggml-metal-ops.h +2 -0
  262. data/ext/sources/ggml/src/ggml-metal/ggml-metal.cpp +39 -26
  263. data/ext/sources/ggml/src/ggml-metal/ggml-metal.metal +823 -322
  264. data/ext/sources/ggml/src/ggml-musa/CMakeLists.txt +5 -6
  265. data/ext/sources/ggml/src/ggml-opencl/CMakeLists.txt +54 -5
  266. data/ext/sources/ggml/src/ggml-opencl/ggml-opencl.cpp +12248 -5907
  267. data/ext/sources/ggml/src/ggml-opencl/kernels/concat.cl +67 -0
  268. data/ext/sources/ggml/src/ggml-opencl/kernels/cpy.cl +59 -0
  269. data/ext/sources/ggml/src/ggml-opencl/kernels/cvt.cl +1819 -112
  270. data/ext/sources/ggml/src/ggml-opencl/kernels/gated_delta_net.cl +249 -0
  271. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_mxfp4_f32_ns.cl +306 -0
  272. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q4_0_f32_ns.cl +256 -0
  273. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q4_1_f32_ns.cl +258 -0
  274. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q4_k_f32_ns.cl +283 -0
  275. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q5_0_f32_ns.cl +260 -0
  276. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q5_1_f32_ns.cl +262 -0
  277. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q5_k_f32_ns.cl +288 -0
  278. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q6_k_f32_ns.cl +267 -0
  279. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_noshuffle_iq4_nl_f32.cl +150 -0
  280. data/ext/sources/ggml/src/ggml-opencl/kernels/{mul_mat_Ab_Bi_8x4.cl → gemm_noshuffle_q4_0_f32.cl} +1 -1
  281. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_noshuffle_q4_k_f32.cl +172 -0
  282. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_noshuffle_q5_0_f32.cl +131 -0
  283. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_noshuffle_q5_1_f32.cl +134 -0
  284. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_noshuffle_q5_k_f32.cl +176 -0
  285. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_noshuffle_q6_k_f32.cl +140 -0
  286. data/ext/sources/ggml/src/ggml-opencl/kernels/{mul_mm_q8_0_f32_8x4.cl → gemm_noshuffle_q8_0_f32.cl} +1 -1
  287. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_xmem_f16_f32_os8.cl +233 -0
  288. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_moe_mxfp4_f32_ns.cl +165 -0
  289. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_moe_q4_0_f32_ns.cl +120 -0
  290. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_moe_q4_1_f32_ns.cl +123 -0
  291. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_moe_q4_k_f32_ns.cl +155 -0
  292. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_moe_q5_0_f32_ns.cl +123 -0
  293. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_moe_q5_1_f32_ns.cl +125 -0
  294. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_moe_q5_k_f32_ns.cl +160 -0
  295. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_moe_q6_k_f32_ns.cl +141 -0
  296. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_noshuffle_iq4_nl_f32.cl +302 -0
  297. data/ext/sources/ggml/src/ggml-opencl/kernels/{gemv_noshuffle_general.cl → gemv_noshuffle_q4_0_f32.cl} +5 -5
  298. data/ext/sources/ggml/src/ggml-opencl/kernels/{gemv_noshuffle.cl → gemv_noshuffle_q4_0_f32_spec.cl} +5 -5
  299. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_noshuffle_q4_k_f32.cl +318 -0
  300. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_noshuffle_q5_0_f32.cl +291 -0
  301. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_noshuffle_q5_1_f32.cl +294 -0
  302. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_noshuffle_q5_k_f32.cl +326 -0
  303. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_noshuffle_q6_k_f32.cl +293 -0
  304. data/ext/sources/ggml/src/ggml-opencl/kernels/get_rows.cl +15 -9
  305. data/ext/sources/ggml/src/ggml-opencl/kernels/moe_reorder_b.cl +30 -0
  306. data/ext/sources/ggml/src/ggml-opencl/kernels/moe_sort_by_expert.cl +82 -0
  307. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mm_iq4_nl_f32_l4_lm.cl +171 -0
  308. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mm_q4_k_f32_l4_lm.cl +179 -0
  309. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mm_q5_0_f32_l4_lm.cl +173 -0
  310. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mm_q5_1_f32_l4_lm.cl +175 -0
  311. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mm_q5_k_f32_l4_lm.cl +192 -0
  312. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_iq4_nl_f32.cl +164 -0
  313. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_iq4_nl_f32_flat.cl +202 -0
  314. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q4_k_f32_flat.cl +196 -0
  315. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q5_0_f32.cl +241 -0
  316. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q5_0_f32_flat.cl +243 -0
  317. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q5_1_f32.cl +243 -0
  318. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q5_1_f32_flat.cl +247 -0
  319. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q5_k_f32.cl +187 -0
  320. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q5_k_f32_flat.cl +203 -0
  321. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q6_k_f32_flat.cl +48 -64
  322. data/ext/sources/ggml/src/ggml-openvino/ggml-decoder.cpp +15 -5
  323. data/ext/sources/ggml/src/ggml-openvino/ggml-openvino-extra.cpp +18 -11
  324. data/ext/sources/ggml/src/ggml-openvino/ggml-openvino.cpp +35 -13
  325. data/ext/sources/ggml/src/ggml-openvino/ggml-quants.cpp +264 -192
  326. data/ext/sources/ggml/src/ggml-openvino/openvino/op/rope.cpp +33 -7
  327. data/ext/sources/ggml/src/ggml-openvino/openvino/op/unary_gelu.cpp +25 -0
  328. data/ext/sources/ggml/src/ggml-openvino/openvino/op_table.cpp +1 -0
  329. data/ext/sources/ggml/src/ggml-openvino/openvino/op_table.h +1 -0
  330. data/ext/sources/ggml/src/ggml-openvino/openvino/rt_info/weightless_caching_attributes.hpp +41 -0
  331. data/ext/sources/ggml/src/ggml-openvino/openvino/translate_session.cpp +27 -3
  332. data/ext/sources/ggml/src/ggml-openvino/openvino/utils.cpp +67 -36
  333. data/ext/sources/ggml/src/ggml-openvino/openvino/utils.h +1 -0
  334. data/ext/sources/ggml/src/ggml-openvino/utils.cpp +101 -44
  335. data/ext/sources/ggml/src/ggml-openvino/utils.h +23 -3
  336. data/ext/sources/ggml/src/ggml-opt.cpp +1 -0
  337. data/ext/sources/ggml/src/ggml-quants.c +289 -114
  338. data/ext/sources/ggml/src/ggml-quants.h +3 -0
  339. data/ext/sources/ggml/src/ggml-rpc/CMakeLists.txt +24 -0
  340. data/ext/sources/ggml/src/ggml-rpc/ggml-rpc.cpp +167 -311
  341. data/ext/sources/ggml/src/ggml-rpc/transport.cpp +683 -0
  342. data/ext/sources/ggml/src/ggml-rpc/transport.h +34 -0
  343. data/ext/sources/ggml/src/ggml-sycl/CMakeLists.txt +50 -4
  344. data/ext/sources/ggml/src/ggml-sycl/add-id.cpp +1 -1
  345. data/ext/sources/ggml/src/ggml-sycl/backend.hpp +3 -1
  346. data/ext/sources/ggml/src/ggml-sycl/common.cpp +74 -2
  347. data/ext/sources/ggml/src/ggml-sycl/common.hpp +41 -1
  348. data/ext/sources/ggml/src/ggml-sycl/convert.cpp +115 -13
  349. data/ext/sources/ggml/src/ggml-sycl/convert.hpp +9 -0
  350. data/ext/sources/ggml/src/ggml-sycl/cumsum.cpp +148 -0
  351. data/ext/sources/ggml/src/ggml-sycl/cumsum.hpp +5 -0
  352. data/ext/sources/ggml/src/ggml-sycl/dequantize.hpp +663 -0
  353. data/ext/sources/ggml/src/ggml-sycl/diag.cpp +67 -0
  354. data/ext/sources/ggml/src/ggml-sycl/diag.hpp +5 -0
  355. data/ext/sources/ggml/src/ggml-sycl/dmmv.cpp +586 -6
  356. data/ext/sources/ggml/src/ggml-sycl/element_wise.cpp +1 -90
  357. data/ext/sources/ggml/src/ggml-sycl/element_wise.hpp +0 -2
  358. data/ext/sources/ggml/src/ggml-sycl/fattn-buffers.cpp +56 -0
  359. data/ext/sources/ggml/src/ggml-sycl/fattn-buffers.hpp +63 -0
  360. data/ext/sources/ggml/src/ggml-sycl/fattn-common.hpp +7 -5
  361. data/ext/sources/ggml/src/ggml-sycl/fattn-tile.cpp +4 -0
  362. data/ext/sources/ggml/src/ggml-sycl/fattn-tile.hpp +76 -168
  363. data/ext/sources/ggml/src/ggml-sycl/fattn-vec.hpp +7 -0
  364. data/ext/sources/ggml/src/ggml-sycl/fattn.cpp +3 -1
  365. data/ext/sources/ggml/src/ggml-sycl/fill.cpp +55 -0
  366. data/ext/sources/ggml/src/ggml-sycl/fill.hpp +5 -0
  367. data/ext/sources/ggml/src/ggml-sycl/gated_delta_net.cpp +69 -31
  368. data/ext/sources/ggml/src/ggml-sycl/gated_delta_net.hpp +1 -0
  369. data/ext/sources/ggml/src/ggml-sycl/gemm.hpp +3 -0
  370. data/ext/sources/ggml/src/ggml-sycl/getrows.cpp +79 -3
  371. data/ext/sources/ggml/src/ggml-sycl/ggml-sycl.cpp +823 -190
  372. data/ext/sources/ggml/src/ggml-sycl/im2col.cpp +353 -89
  373. data/ext/sources/ggml/src/ggml-sycl/im2col.hpp +5 -3
  374. data/ext/sources/ggml/src/ggml-sycl/mmvq.cpp +1344 -26
  375. data/ext/sources/ggml/src/ggml-sycl/mmvq.hpp +16 -0
  376. data/ext/sources/ggml/src/ggml-sycl/pad.cpp +27 -27
  377. data/ext/sources/ggml/src/ggml-sycl/quants.hpp +71 -0
  378. data/ext/sources/ggml/src/ggml-sycl/set_rows.cpp +7 -1
  379. data/ext/sources/ggml/src/ggml-sycl/solve_tri.cpp +172 -0
  380. data/ext/sources/ggml/src/ggml-sycl/solve_tri.hpp +8 -0
  381. data/ext/sources/ggml/src/ggml-sycl/ssm_conv.cpp +6 -1
  382. data/ext/sources/ggml/src/ggml-sycl/ssm_scan.cpp +156 -0
  383. data/ext/sources/ggml/src/ggml-sycl/ssm_scan.hpp +5 -0
  384. data/ext/sources/ggml/src/ggml-sycl/sycl_hw.cpp +62 -10
  385. data/ext/sources/ggml/src/ggml-sycl/sycl_hw.hpp +18 -6
  386. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-tile-instance-dkq512-dv512.cpp +6 -0
  387. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-f16-f16.cpp +1 -0
  388. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-f16-q4_0.cpp +1 -0
  389. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-f16-q4_1.cpp +1 -0
  390. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-f16-q5_0.cpp +1 -0
  391. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-f16-q5_1.cpp +1 -0
  392. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-f16-q8_0.cpp +1 -0
  393. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_0-f16.cpp +1 -0
  394. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_0-q4_0.cpp +1 -0
  395. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_0-q4_1.cpp +1 -0
  396. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_0-q5_0.cpp +1 -0
  397. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_0-q5_1.cpp +1 -0
  398. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_0-q8_0.cpp +1 -0
  399. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_1-f16.cpp +1 -0
  400. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_1-q4_0.cpp +1 -0
  401. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_1-q4_1.cpp +1 -0
  402. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_1-q5_0.cpp +1 -0
  403. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_1-q5_1.cpp +1 -0
  404. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_1-q8_0.cpp +1 -0
  405. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_0-f16.cpp +1 -0
  406. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_0-q4_0.cpp +1 -0
  407. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_0-q4_1.cpp +1 -0
  408. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_0-q5_0.cpp +1 -0
  409. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_0-q5_1.cpp +1 -0
  410. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_0-q8_0.cpp +1 -0
  411. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_1-f16.cpp +1 -0
  412. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_1-q4_0.cpp +1 -0
  413. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_1-q4_1.cpp +1 -0
  414. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_1-q5_0.cpp +1 -0
  415. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_1-q5_1.cpp +1 -0
  416. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_1-q8_0.cpp +1 -0
  417. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q8_0-f16.cpp +1 -0
  418. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q8_0-q4_0.cpp +1 -0
  419. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q8_0-q4_1.cpp +1 -0
  420. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q8_0-q5_0.cpp +1 -0
  421. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q8_0-q5_1.cpp +1 -0
  422. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q8_0-q8_0.cpp +1 -0
  423. data/ext/sources/ggml/src/ggml-sycl/type.hpp +112 -0
  424. data/ext/sources/ggml/src/ggml-sycl/upscale.cpp +410 -0
  425. data/ext/sources/ggml/src/ggml-sycl/upscale.hpp +9 -0
  426. data/ext/sources/ggml/src/ggml-sycl/vecdotq.hpp +215 -53
  427. data/ext/sources/ggml/src/ggml-virtgpu/ggml-backend-buffer.cpp +4 -0
  428. data/ext/sources/ggml/src/ggml-virtgpu/ggml-backend-device.cpp +2 -0
  429. data/ext/sources/ggml/src/ggml-virtgpu/ggml-backend.cpp +2 -0
  430. data/ext/sources/ggml/src/ggml-virtgpu/virtgpu-shm.cpp +1 -0
  431. data/ext/sources/ggml/src/ggml-virtgpu/virtgpu.cpp +1 -0
  432. data/ext/sources/ggml/src/ggml-virtgpu/virtgpu.h +0 -2
  433. data/ext/sources/ggml/src/ggml-vulkan/CMakeLists.txt +11 -0
  434. data/ext/sources/ggml/src/ggml-vulkan/ggml-vulkan.cpp +2060 -535
  435. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/CMakeLists.txt +4 -0
  436. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/contig_copy.comp +6 -2
  437. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/conv2d_mm.comp +146 -13
  438. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/copy.comp +3 -1
  439. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/copy_from_quant.comp +1 -1
  440. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/copy_to_quant.comp +25 -1
  441. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/dequant_funcs.glsl +88 -0
  442. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/dequant_funcs_cm2.glsl +643 -1
  443. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/dequant_nvfp4.comp +32 -0
  444. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/dequant_q1_0.comp +29 -0
  445. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/diag.comp +0 -1
  446. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/dot_product_funcs.glsl +27 -0
  447. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/exp.comp +0 -1
  448. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/feature-tests/coopmat2_decode_vector.comp +7 -0
  449. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/flash_attn.comp +197 -48
  450. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/flash_attn_base.glsl +60 -59
  451. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/flash_attn_cm1.comp +115 -113
  452. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/flash_attn_cm2.comp +122 -31
  453. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/flash_attn_dequant.glsl +131 -0
  454. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/flash_attn_mmq_funcs.glsl +203 -0
  455. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/fwht.comp +115 -0
  456. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/gated_delta_net.comp +125 -64
  457. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/generic_binary_head.glsl +0 -1
  458. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/glu_head.glsl +10 -1
  459. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/glu_main.glsl +16 -6
  460. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/im2col.comp +76 -54
  461. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/im2col_3d.comp +0 -1
  462. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/log.comp +0 -1
  463. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec.comp +122 -27
  464. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_iface.glsl +6 -6
  465. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q2_k.comp +1 -1
  466. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q4_k.comp +1 -1
  467. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q5_k.comp +1 -1
  468. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vecq.comp +1 -0
  469. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vecq_funcs.glsl +88 -55
  470. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm.comp +11 -17
  471. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_cm2.comp +43 -10
  472. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_funcs.glsl +159 -125
  473. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq_funcs.glsl +8 -8
  474. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq_shmem_types.glsl +24 -9
  475. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/multi_add.comp +0 -1
  476. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/rope_funcs.glsl +5 -2
  477. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/rope_head.glsl +0 -1
  478. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/rope_params.glsl +3 -2
  479. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/snake.comp +49 -0
  480. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/ssm_conv.comp +11 -1
  481. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/tri.comp +0 -1
  482. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/types.glsl +79 -2
  483. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp +171 -147
  484. data/ext/sources/ggml/src/ggml-webgpu/CMakeLists.txt +5 -2
  485. data/ext/sources/ggml/src/ggml-webgpu/ggml-webgpu-shader-lib.hpp +2202 -283
  486. data/ext/sources/ggml/src/ggml-webgpu/ggml-webgpu.cpp +2610 -1403
  487. data/ext/sources/ggml/src/ggml-webgpu/pre_wgsl.hpp +37 -7
  488. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/add_id.wgsl +64 -0
  489. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/binary.wgsl +8 -7
  490. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/common_decls.tmpl +76 -95
  491. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/concat.wgsl +19 -1
  492. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/conv2d.wgsl +165 -0
  493. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/{cpy.tmpl.wgsl → cpy.wgsl} +25 -50
  494. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/flash_attn.wgsl +107 -184
  495. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/flash_attn_quant_staging.tmpl +124 -0
  496. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/flash_attn_tile.wgsl +397 -0
  497. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/flash_attn_vec_blk.wgsl +101 -0
  498. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/flash_attn_vec_reduce.wgsl +84 -0
  499. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/flash_attn_vec_split.wgsl +619 -0
  500. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/gated_delta_net.wgsl +149 -0
  501. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/get_rows.wgsl +183 -78
  502. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/glu.wgsl +155 -0
  503. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/im2col.wgsl +101 -0
  504. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_decls.tmpl +655 -495
  505. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_id.wgsl +195 -0
  506. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_id_gather.wgsl +52 -0
  507. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_id_vec.wgsl +154 -0
  508. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_reg_tile.wgsl +8 -6
  509. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_subgroup_matrix.wgsl +5 -1
  510. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec.wgsl +80 -409
  511. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec_acc.tmpl +1432 -0
  512. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec_q_acc.tmpl +303 -0
  513. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/quant_inner_loops.tmpl +21 -0
  514. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/quantize_q8.wgsl +173 -0
  515. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/rms_norm_mul.wgsl +152 -0
  516. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/{rope.tmpl.wgsl → rope.wgsl} +71 -142
  517. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/row_norm.wgsl +153 -0
  518. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/scale.wgsl +6 -4
  519. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/set.wgsl +109 -0
  520. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/set_rows.wgsl +2 -3
  521. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/set_rows_quant.wgsl +224 -0
  522. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/{soft_max.tmpl.wgsl → soft_max.wgsl} +106 -206
  523. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/solve_tri.wgsl +121 -0
  524. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/ssm_conv.wgsl +65 -0
  525. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/ssm_scan.wgsl +193 -0
  526. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/unary.wgsl +68 -48
  527. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/upscale.wgsl +240 -0
  528. data/ext/sources/ggml/src/ggml-zdnn/ggml-zdnn.cpp +18 -14
  529. data/ext/sources/ggml/src/ggml-zendnn/CMakeLists.txt +1 -1
  530. data/ext/sources/ggml/src/ggml-zendnn/ggml-zendnn.cpp +244 -10
  531. data/ext/sources/ggml/src/ggml.c +110 -28
  532. data/ext/sources/ggml/src/gguf.cpp +173 -28
  533. data/ext/sources/include/parakeet.h +342 -0
  534. data/ext/sources/include/whisper.h +10 -0
  535. data/ext/sources/media/matmul.png +0 -0
  536. data/ext/sources/src/CMakeLists.txt +23 -0
  537. data/ext/sources/src/parakeet-arch.h +188 -0
  538. data/ext/sources/src/parakeet.cpp +3838 -0
  539. data/ext/sources/src/whisper.cpp +56 -12
  540. data/extsources.rb +26 -10
  541. data/lib/whisper/log_settable.rb +36 -0
  542. data/lib/whisper/model/uri.rb +13 -1
  543. data/lib/whisper/output.rb +74 -0
  544. data/sig/whisper.rbs +411 -62
  545. data/test/helper.rb +2 -0
  546. data/test/jfk_reader/jfk_reader.c +50 -7
  547. data/test/test_callback.rb +1 -0
  548. data/test/test_package.rb +6 -5
  549. data/test/test_parakeet.rb +28 -0
  550. data/test/test_parakeet_callback.rb +107 -0
  551. data/test/test_parakeet_context.rb +116 -0
  552. data/test/test_parakeet_context_params.rb +24 -0
  553. data/test/test_parakeet_model.rb +21 -0
  554. data/test/test_parakeet_params.rb +78 -0
  555. data/test/test_parakeet_segment.rb +42 -0
  556. data/test/test_parakeet_token.rb +73 -0
  557. data/test/test_params.rb +2 -0
  558. data/test/test_vad_segment.rb +1 -1
  559. data/test/test_whisper.rb +24 -6
  560. data/whispercpp.gemspec +2 -2
  561. metadata +215 -281
  562. data/ext/sources/bindings/javascript/CMakeLists.txt +0 -41
  563. data/ext/sources/bindings/javascript/emscripten.cpp +0 -93
  564. data/ext/sources/bindings/javascript/libwhisper.worker.js +0 -1
  565. data/ext/sources/bindings/javascript/package.json +0 -26
  566. data/ext/sources/bindings/javascript/whisper.js +0 -19
  567. data/ext/sources/examples/addon.node/CMakeLists.txt +0 -31
  568. data/ext/sources/examples/addon.node/__test__/whisper.spec.js +0 -133
  569. data/ext/sources/examples/addon.node/addon.cpp +0 -557
  570. data/ext/sources/examples/addon.node/index.js +0 -59
  571. data/ext/sources/examples/addon.node/package.json +0 -16
  572. data/ext/sources/examples/addon.node/vad-example.js +0 -132
  573. data/ext/sources/examples/bench.wasm/CMakeLists.txt +0 -49
  574. data/ext/sources/examples/bench.wasm/emscripten.cpp +0 -87
  575. data/ext/sources/examples/bench.wasm/index-tmpl.html +0 -285
  576. data/ext/sources/examples/coi-serviceworker.js +0 -146
  577. data/ext/sources/examples/command/CMakeLists.txt +0 -10
  578. data/ext/sources/examples/command/command.cpp +0 -802
  579. data/ext/sources/examples/command/commands.txt +0 -9
  580. data/ext/sources/examples/command.wasm/CMakeLists.txt +0 -50
  581. data/ext/sources/examples/command.wasm/emscripten.cpp +0 -327
  582. data/ext/sources/examples/command.wasm/index-tmpl.html +0 -415
  583. data/ext/sources/examples/generate-karaoke.sh +0 -57
  584. data/ext/sources/examples/helpers.js +0 -191
  585. data/ext/sources/examples/livestream.sh +0 -112
  586. data/ext/sources/examples/lsp/CMakeLists.txt +0 -10
  587. data/ext/sources/examples/lsp/lsp.cpp +0 -471
  588. data/ext/sources/examples/lsp/whisper.vim +0 -362
  589. data/ext/sources/examples/python/test_whisper_processor.py +0 -7
  590. data/ext/sources/examples/python/whisper_processor.py +0 -54
  591. data/ext/sources/examples/server/bench.js +0 -29
  592. data/ext/sources/examples/server.py +0 -120
  593. data/ext/sources/examples/stream/CMakeLists.txt +0 -10
  594. data/ext/sources/examples/stream/stream.cpp +0 -437
  595. data/ext/sources/examples/stream.wasm/CMakeLists.txt +0 -49
  596. data/ext/sources/examples/stream.wasm/emscripten.cpp +0 -216
  597. data/ext/sources/examples/stream.wasm/index-tmpl.html +0 -491
  598. data/ext/sources/examples/sycl/CMakeLists.txt +0 -9
  599. data/ext/sources/examples/sycl/build.sh +0 -22
  600. data/ext/sources/examples/sycl/ls-sycl-device.cpp +0 -11
  601. data/ext/sources/examples/sycl/run-whisper.sh +0 -17
  602. data/ext/sources/examples/talk-llama/CMakeLists.txt +0 -48
  603. data/ext/sources/examples/talk-llama/eleven-labs.py +0 -80
  604. data/ext/sources/examples/talk-llama/llama-adapter.cpp +0 -488
  605. data/ext/sources/examples/talk-llama/llama-adapter.h +0 -89
  606. data/ext/sources/examples/talk-llama/llama-arch.cpp +0 -2877
  607. data/ext/sources/examples/talk-llama/llama-arch.h +0 -628
  608. data/ext/sources/examples/talk-llama/llama-batch.cpp +0 -919
  609. data/ext/sources/examples/talk-llama/llama-batch.h +0 -173
  610. data/ext/sources/examples/talk-llama/llama-chat.cpp +0 -896
  611. data/ext/sources/examples/talk-llama/llama-chat.h +0 -71
  612. data/ext/sources/examples/talk-llama/llama-context.cpp +0 -3633
  613. data/ext/sources/examples/talk-llama/llama-context.h +0 -359
  614. data/ext/sources/examples/talk-llama/llama-cparams.cpp +0 -5
  615. data/ext/sources/examples/talk-llama/llama-cparams.h +0 -47
  616. data/ext/sources/examples/talk-llama/llama-ext.h +0 -12
  617. data/ext/sources/examples/talk-llama/llama-grammar.cpp +0 -1464
  618. data/ext/sources/examples/talk-llama/llama-grammar.h +0 -194
  619. data/ext/sources/examples/talk-llama/llama-graph.cpp +0 -2735
  620. data/ext/sources/examples/talk-llama/llama-graph.h +0 -1031
  621. data/ext/sources/examples/talk-llama/llama-hparams.cpp +0 -258
  622. data/ext/sources/examples/talk-llama/llama-hparams.h +0 -353
  623. data/ext/sources/examples/talk-llama/llama-impl.cpp +0 -171
  624. data/ext/sources/examples/talk-llama/llama-impl.h +0 -75
  625. data/ext/sources/examples/talk-llama/llama-io.cpp +0 -15
  626. data/ext/sources/examples/talk-llama/llama-io.h +0 -35
  627. data/ext/sources/examples/talk-llama/llama-kv-cache-iswa.cpp +0 -330
  628. data/ext/sources/examples/talk-llama/llama-kv-cache-iswa.h +0 -137
  629. data/ext/sources/examples/talk-llama/llama-kv-cache.cpp +0 -2285
  630. data/ext/sources/examples/talk-llama/llama-kv-cache.h +0 -389
  631. data/ext/sources/examples/talk-llama/llama-kv-cells.h +0 -533
  632. data/ext/sources/examples/talk-llama/llama-memory-hybrid-iswa.cpp +0 -275
  633. data/ext/sources/examples/talk-llama/llama-memory-hybrid-iswa.h +0 -140
  634. data/ext/sources/examples/talk-llama/llama-memory-hybrid.cpp +0 -268
  635. data/ext/sources/examples/talk-llama/llama-memory-hybrid.h +0 -139
  636. data/ext/sources/examples/talk-llama/llama-memory-recurrent.cpp +0 -1165
  637. data/ext/sources/examples/talk-llama/llama-memory-recurrent.h +0 -182
  638. data/ext/sources/examples/talk-llama/llama-memory.cpp +0 -59
  639. data/ext/sources/examples/talk-llama/llama-memory.h +0 -122
  640. data/ext/sources/examples/talk-llama/llama-mmap.cpp +0 -752
  641. data/ext/sources/examples/talk-llama/llama-mmap.h +0 -73
  642. data/ext/sources/examples/talk-llama/llama-model-loader.cpp +0 -1655
  643. data/ext/sources/examples/talk-llama/llama-model-loader.h +0 -206
  644. data/ext/sources/examples/talk-llama/llama-model-saver.cpp +0 -299
  645. data/ext/sources/examples/talk-llama/llama-model-saver.h +0 -40
  646. data/ext/sources/examples/talk-llama/llama-model.cpp +0 -9056
  647. data/ext/sources/examples/talk-llama/llama-model.h +0 -597
  648. data/ext/sources/examples/talk-llama/llama-quant.cpp +0 -1304
  649. data/ext/sources/examples/talk-llama/llama-quant.h +0 -1
  650. data/ext/sources/examples/talk-llama/llama-sampler.cpp +0 -3885
  651. data/ext/sources/examples/talk-llama/llama-sampler.h +0 -42
  652. data/ext/sources/examples/talk-llama/llama-vocab.cpp +0 -3970
  653. data/ext/sources/examples/talk-llama/llama-vocab.h +0 -187
  654. data/ext/sources/examples/talk-llama/llama.cpp +0 -1194
  655. data/ext/sources/examples/talk-llama/llama.h +0 -1573
  656. data/ext/sources/examples/talk-llama/models/afmoe.cpp +0 -190
  657. data/ext/sources/examples/talk-llama/models/apertus.cpp +0 -125
  658. data/ext/sources/examples/talk-llama/models/arcee.cpp +0 -135
  659. data/ext/sources/examples/talk-llama/models/arctic.cpp +0 -137
  660. data/ext/sources/examples/talk-llama/models/arwkv7.cpp +0 -86
  661. data/ext/sources/examples/talk-llama/models/baichuan.cpp +0 -123
  662. data/ext/sources/examples/talk-llama/models/bailingmoe.cpp +0 -143
  663. data/ext/sources/examples/talk-llama/models/bailingmoe2.cpp +0 -133
  664. data/ext/sources/examples/talk-llama/models/bert.cpp +0 -184
  665. data/ext/sources/examples/talk-llama/models/bitnet.cpp +0 -145
  666. data/ext/sources/examples/talk-llama/models/bloom.cpp +0 -101
  667. data/ext/sources/examples/talk-llama/models/chameleon.cpp +0 -178
  668. data/ext/sources/examples/talk-llama/models/chatglm.cpp +0 -132
  669. data/ext/sources/examples/talk-llama/models/codeshell.cpp +0 -111
  670. data/ext/sources/examples/talk-llama/models/cogvlm.cpp +0 -102
  671. data/ext/sources/examples/talk-llama/models/cohere2-iswa.cpp +0 -134
  672. data/ext/sources/examples/talk-llama/models/command-r.cpp +0 -122
  673. data/ext/sources/examples/talk-llama/models/dbrx.cpp +0 -122
  674. data/ext/sources/examples/talk-llama/models/deci.cpp +0 -135
  675. data/ext/sources/examples/talk-llama/models/deepseek.cpp +0 -142
  676. data/ext/sources/examples/talk-llama/models/deepseek2.cpp +0 -262
  677. data/ext/sources/examples/talk-llama/models/delta-net-base.cpp +0 -445
  678. data/ext/sources/examples/talk-llama/models/dots1.cpp +0 -132
  679. data/ext/sources/examples/talk-llama/models/dream.cpp +0 -105
  680. data/ext/sources/examples/talk-llama/models/ernie4-5-moe.cpp +0 -148
  681. data/ext/sources/examples/talk-llama/models/ernie4-5.cpp +0 -110
  682. data/ext/sources/examples/talk-llama/models/eurobert.cpp +0 -97
  683. data/ext/sources/examples/talk-llama/models/exaone-moe.cpp +0 -145
  684. data/ext/sources/examples/talk-llama/models/exaone.cpp +0 -114
  685. data/ext/sources/examples/talk-llama/models/exaone4.cpp +0 -123
  686. data/ext/sources/examples/talk-llama/models/falcon-h1.cpp +0 -111
  687. data/ext/sources/examples/talk-llama/models/falcon.cpp +0 -120
  688. data/ext/sources/examples/talk-llama/models/gemma-embedding.cpp +0 -116
  689. data/ext/sources/examples/talk-llama/models/gemma.cpp +0 -112
  690. data/ext/sources/examples/talk-llama/models/gemma2-iswa.cpp +0 -128
  691. data/ext/sources/examples/talk-llama/models/gemma3.cpp +0 -155
  692. data/ext/sources/examples/talk-llama/models/gemma3n-iswa.cpp +0 -384
  693. data/ext/sources/examples/talk-llama/models/glm4-moe.cpp +0 -170
  694. data/ext/sources/examples/talk-llama/models/glm4.cpp +0 -157
  695. data/ext/sources/examples/talk-llama/models/gpt2.cpp +0 -105
  696. data/ext/sources/examples/talk-llama/models/gptneox.cpp +0 -144
  697. data/ext/sources/examples/talk-llama/models/granite-hybrid.cpp +0 -195
  698. data/ext/sources/examples/talk-llama/models/granite.cpp +0 -210
  699. data/ext/sources/examples/talk-llama/models/grok.cpp +0 -159
  700. data/ext/sources/examples/talk-llama/models/grovemoe.cpp +0 -139
  701. data/ext/sources/examples/talk-llama/models/hunyuan-dense.cpp +0 -132
  702. data/ext/sources/examples/talk-llama/models/hunyuan-moe.cpp +0 -153
  703. data/ext/sources/examples/talk-llama/models/internlm2.cpp +0 -120
  704. data/ext/sources/examples/talk-llama/models/jais.cpp +0 -86
  705. data/ext/sources/examples/talk-llama/models/jais2.cpp +0 -123
  706. data/ext/sources/examples/talk-llama/models/jamba.cpp +0 -106
  707. data/ext/sources/examples/talk-llama/models/kimi-linear.cpp +0 -381
  708. data/ext/sources/examples/talk-llama/models/lfm2.cpp +0 -196
  709. data/ext/sources/examples/talk-llama/models/llada-moe.cpp +0 -122
  710. data/ext/sources/examples/talk-llama/models/llada.cpp +0 -99
  711. data/ext/sources/examples/talk-llama/models/llama-iswa.cpp +0 -178
  712. data/ext/sources/examples/talk-llama/models/llama.cpp +0 -175
  713. data/ext/sources/examples/talk-llama/models/maincoder.cpp +0 -117
  714. data/ext/sources/examples/talk-llama/models/mamba-base.cpp +0 -289
  715. data/ext/sources/examples/talk-llama/models/mamba.cpp +0 -54
  716. data/ext/sources/examples/talk-llama/models/mimo2-iswa.cpp +0 -129
  717. data/ext/sources/examples/talk-llama/models/minicpm3.cpp +0 -200
  718. data/ext/sources/examples/talk-llama/models/minimax-m2.cpp +0 -123
  719. data/ext/sources/examples/talk-llama/models/mistral3.cpp +0 -160
  720. data/ext/sources/examples/talk-llama/models/models.h +0 -704
  721. data/ext/sources/examples/talk-llama/models/modern-bert.cpp +0 -109
  722. data/ext/sources/examples/talk-llama/models/mpt.cpp +0 -126
  723. data/ext/sources/examples/talk-llama/models/nemotron-h.cpp +0 -162
  724. data/ext/sources/examples/talk-llama/models/nemotron.cpp +0 -122
  725. data/ext/sources/examples/talk-llama/models/neo-bert.cpp +0 -104
  726. data/ext/sources/examples/talk-llama/models/olmo.cpp +0 -121
  727. data/ext/sources/examples/talk-llama/models/olmo2.cpp +0 -150
  728. data/ext/sources/examples/talk-llama/models/olmoe.cpp +0 -124
  729. data/ext/sources/examples/talk-llama/models/openai-moe-iswa.cpp +0 -127
  730. data/ext/sources/examples/talk-llama/models/openelm.cpp +0 -124
  731. data/ext/sources/examples/talk-llama/models/orion.cpp +0 -123
  732. data/ext/sources/examples/talk-llama/models/paddleocr.cpp +0 -122
  733. data/ext/sources/examples/talk-llama/models/pangu-embedded.cpp +0 -121
  734. data/ext/sources/examples/talk-llama/models/phi2.cpp +0 -121
  735. data/ext/sources/examples/talk-llama/models/phi3.cpp +0 -152
  736. data/ext/sources/examples/talk-llama/models/plamo.cpp +0 -110
  737. data/ext/sources/examples/talk-llama/models/plamo2.cpp +0 -320
  738. data/ext/sources/examples/talk-llama/models/plamo3.cpp +0 -128
  739. data/ext/sources/examples/talk-llama/models/plm.cpp +0 -169
  740. data/ext/sources/examples/talk-llama/models/qwen.cpp +0 -108
  741. data/ext/sources/examples/talk-llama/models/qwen2.cpp +0 -126
  742. data/ext/sources/examples/talk-llama/models/qwen2moe.cpp +0 -151
  743. data/ext/sources/examples/talk-llama/models/qwen2vl.cpp +0 -117
  744. data/ext/sources/examples/talk-llama/models/qwen3.cpp +0 -120
  745. data/ext/sources/examples/talk-llama/models/qwen35.cpp +0 -381
  746. data/ext/sources/examples/talk-llama/models/qwen35moe.cpp +0 -422
  747. data/ext/sources/examples/talk-llama/models/qwen3moe.cpp +0 -131
  748. data/ext/sources/examples/talk-llama/models/qwen3next.cpp +0 -525
  749. data/ext/sources/examples/talk-llama/models/qwen3vl-moe.cpp +0 -140
  750. data/ext/sources/examples/talk-llama/models/qwen3vl.cpp +0 -132
  751. data/ext/sources/examples/talk-llama/models/refact.cpp +0 -94
  752. data/ext/sources/examples/talk-llama/models/rnd1.cpp +0 -126
  753. data/ext/sources/examples/talk-llama/models/rwkv6-base.cpp +0 -164
  754. data/ext/sources/examples/talk-llama/models/rwkv6.cpp +0 -94
  755. data/ext/sources/examples/talk-llama/models/rwkv6qwen2.cpp +0 -86
  756. data/ext/sources/examples/talk-llama/models/rwkv7-base.cpp +0 -137
  757. data/ext/sources/examples/talk-llama/models/rwkv7.cpp +0 -90
  758. data/ext/sources/examples/talk-llama/models/seed-oss.cpp +0 -124
  759. data/ext/sources/examples/talk-llama/models/smallthinker.cpp +0 -126
  760. data/ext/sources/examples/talk-llama/models/smollm3.cpp +0 -128
  761. data/ext/sources/examples/talk-llama/models/stablelm.cpp +0 -146
  762. data/ext/sources/examples/talk-llama/models/starcoder.cpp +0 -100
  763. data/ext/sources/examples/talk-llama/models/starcoder2.cpp +0 -121
  764. data/ext/sources/examples/talk-llama/models/step35-iswa.cpp +0 -165
  765. data/ext/sources/examples/talk-llama/models/t5-dec.cpp +0 -166
  766. data/ext/sources/examples/talk-llama/models/t5-enc.cpp +0 -96
  767. data/ext/sources/examples/talk-llama/models/wavtokenizer-dec.cpp +0 -149
  768. data/ext/sources/examples/talk-llama/models/xverse.cpp +0 -108
  769. data/ext/sources/examples/talk-llama/prompts/talk-alpaca.txt +0 -23
  770. data/ext/sources/examples/talk-llama/speak +0 -40
  771. data/ext/sources/examples/talk-llama/speak.bat +0 -1
  772. data/ext/sources/examples/talk-llama/speak.ps1 +0 -14
  773. data/ext/sources/examples/talk-llama/talk-llama.cpp +0 -813
  774. data/ext/sources/examples/talk-llama/unicode-data.cpp +0 -7034
  775. data/ext/sources/examples/talk-llama/unicode-data.h +0 -20
  776. data/ext/sources/examples/talk-llama/unicode.cpp +0 -1103
  777. data/ext/sources/examples/talk-llama/unicode.h +0 -111
  778. data/ext/sources/examples/wchess/CMakeLists.txt +0 -10
  779. data/ext/sources/examples/wchess/libwchess/CMakeLists.txt +0 -19
  780. data/ext/sources/examples/wchess/libwchess/Chessboard.cpp +0 -803
  781. data/ext/sources/examples/wchess/libwchess/Chessboard.h +0 -33
  782. data/ext/sources/examples/wchess/libwchess/WChess.cpp +0 -193
  783. data/ext/sources/examples/wchess/libwchess/WChess.h +0 -63
  784. data/ext/sources/examples/wchess/libwchess/test-chessboard.cpp +0 -117
  785. data/ext/sources/examples/wchess/wchess.cmd/CMakeLists.txt +0 -8
  786. data/ext/sources/examples/wchess/wchess.cmd/wchess.cmd.cpp +0 -253
  787. data/ext/sources/examples/whisper.wasm/CMakeLists.txt +0 -50
  788. data/ext/sources/examples/whisper.wasm/emscripten.cpp +0 -118
  789. data/ext/sources/examples/whisper.wasm/index-tmpl.html +0 -659
  790. data/ext/sources/ggml/src/ggml-cuda/template-instances/generate_cu_files.py +0 -99
  791. data/ext/sources/ggml/src/ggml-hexagon/htp/htp-msg.h +0 -155
  792. data/ext/sources/ggml/src/ggml-hexagon/op-desc.h +0 -153
  793. data/ext/sources/ggml/src/ggml-opencl/kernels/embed_kernel.py +0 -26
  794. data/ext/sources/ggml/src/ggml-openvino/openvino/pass/eliminate_zp.cpp +0 -123
  795. data/ext/sources/ggml/src/ggml-openvino/openvino/pass/eliminate_zp.h +0 -17
  796. data/ext/sources/ggml/src/ggml-virtgpu/regenerate_remoting.py +0 -333
  797. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/rte.glsl +0 -5
  798. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/embed_wgsl.py +0 -182
  799. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/glu.tmpl.wgsl +0 -323
  800. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat.wgsl +0 -718
  801. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/rms_norm.wgsl +0 -123
  802. data/ext/sources/tests/CMakeLists.txt +0 -112
  803. data/ext/sources/tests/earnings21/eval.mk +0 -58
  804. data/ext/sources/tests/earnings21/eval.py +0 -68
  805. data/ext/sources/tests/earnings21/normalizers/__init__.py +0 -2
  806. data/ext/sources/tests/earnings21/normalizers/basic.py +0 -80
  807. data/ext/sources/tests/earnings21/normalizers/english.json +0 -1741
  808. data/ext/sources/tests/earnings21/normalizers/english.py +0 -550
  809. data/ext/sources/tests/earnings21/requirements.txt +0 -6
  810. data/ext/sources/tests/en-0-ref.txt +0 -1
  811. data/ext/sources/tests/en-1-ref.txt +0 -1
  812. data/ext/sources/tests/en-2-ref.txt +0 -1
  813. data/ext/sources/tests/es-0-ref.txt +0 -1
  814. data/ext/sources/tests/librispeech/eval.mk +0 -39
  815. data/ext/sources/tests/librispeech/eval.py +0 -47
  816. data/ext/sources/tests/librispeech/normalizers/__init__.py +0 -2
  817. data/ext/sources/tests/librispeech/normalizers/basic.py +0 -80
  818. data/ext/sources/tests/librispeech/normalizers/english.json +0 -1741
  819. data/ext/sources/tests/librispeech/normalizers/english.py +0 -550
  820. data/ext/sources/tests/librispeech/requirements.txt +0 -6
  821. data/ext/sources/tests/run-tests.sh +0 -130
  822. data/ext/sources/tests/test-c.c +0 -3
  823. data/ext/sources/tests/test-vad-full.cpp +0 -56
  824. data/ext/sources/tests/test-vad.cpp +0 -83
  825. data/ext/sources/tests/test-whisper.js +0 -58
  826. data/lib/whisper/context.rb +0 -15
  827. data/lib/whisper/segment.rb +0 -58
  828. /data/ext/sources/ggml/src/ggml-opencl/kernels/{gemv_noshuffle_general_q8_0_f32.cl → gemv_noshuffle_q8_0_f32.cl} +0 -0
@@ -1,1103 +0,0 @@
1
- #include "unicode.h"
2
- #include "unicode-data.h"
3
-
4
- #include <algorithm>
5
- #include <cassert>
6
- #include <cstddef>
7
- #include <cstdint>
8
- #include <map>
9
- #include <regex>
10
- #include <stdexcept>
11
- #include <string>
12
- #include <unordered_map>
13
- #include <utility>
14
- #include <vector>
15
-
16
- size_t unicode_len_utf8(char src) {
17
- const size_t lookup[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 3, 4 };
18
- uint8_t highbits = static_cast<uint8_t>(src) >> 4;
19
- return lookup[highbits];
20
- }
21
-
22
- static std::string unicode_cpts_to_utf8(const std::vector<uint32_t> & cps) {
23
- std::string result;
24
- for (size_t i = 0; i < cps.size(); ++i) {
25
- result.append(unicode_cpt_to_utf8(cps[i]));
26
- }
27
- return result;
28
- }
29
-
30
- uint32_t unicode_cpt_from_utf8(const std::string & utf8, size_t & offset) {
31
- assert(offset < utf8.size());
32
- if (!(utf8[offset + 0] & 0x80)) {
33
- auto result = utf8[offset + 0];
34
- offset += 1;
35
- return result;
36
- }
37
- if (!(utf8[offset + 0] & 0x40)) {
38
- throw std::invalid_argument("invalid character");
39
- }
40
- if (!(utf8[offset + 0] & 0x20)) {
41
- if (offset + 1 >= utf8.size() || ! ((utf8[offset + 1] & 0xc0) == 0x80)) {
42
- throw std::invalid_argument("invalid character");
43
- }
44
- auto result = ((utf8[offset + 0] & 0x1f) << 6) | (utf8[offset + 1] & 0x3f);
45
- offset += 2;
46
- return result;
47
- }
48
- if (!(utf8[offset + 0] & 0x10)) {
49
- if (offset + 2 >= utf8.size() || ! ((utf8[offset + 1] & 0xc0) == 0x80) || ! ((utf8[offset + 2] & 0xc0) == 0x80)) {
50
- throw std::invalid_argument("invalid character");
51
- }
52
- auto result = ((utf8[offset + 0] & 0x0f) << 12) | ((utf8[offset + 1] & 0x3f) << 6) | (utf8[offset + 2] & 0x3f);
53
- offset += 3;
54
- return result;
55
- }
56
- if (!(utf8[offset + 0] & 0x08)) {
57
- if (offset + 3 >= utf8.size() || ! ((utf8[offset + 1] & 0xc0) == 0x80) || ! ((utf8[offset + 2] & 0xc0) == 0x80) || !((utf8[offset + 3] & 0xc0) == 0x80)) {
58
- throw std::invalid_argument("invalid character");
59
- }
60
- auto result = ((utf8[offset + 0] & 0x07) << 18) | ((utf8[offset + 1] & 0x3f) << 12) | ((utf8[offset + 2] & 0x3f) << 6) | (utf8[offset + 3] & 0x3f);
61
- offset += 4;
62
- return result;
63
- }
64
- throw std::invalid_argument("failed to convert utf8 to codepoint");
65
- }
66
-
67
- //static std::vector<uint16_t> unicode_cpt_to_utf16(uint32_t cpt) {
68
- // std::vector<uint16_t> result;
69
- // if (/* 0x0000 <= cpt && */ cpt <= 0xffff) {
70
- // result.emplace_back(cpt);
71
- // return result;
72
- // }
73
- // if (0x10000 <= cpt && cpt <= 0x10ffff) {
74
- // result.emplace_back(0xd800 | ((cpt - 0x10000) >> 10));
75
- // result.emplace_back(0xdc00 | ((cpt - 0x10000) & 0x03ff));
76
- // return result;
77
- // }
78
- // throw std::invalid_argument("failed to convert codepoint to utf16");
79
- //}
80
-
81
- //static std::vector<uint16_t> unicode_cpts_to_utf16(const std::vector<uint32_t> & cps) {
82
- // std::vector<uint16_t> result;
83
- // for (size_t i = 0; i < cps.size(); ++i) {
84
- // auto temp = unicode_cpt_to_utf16(cps[i]);
85
- // result.insert(result.end(), temp.begin(), temp.end());
86
- // }
87
- // return result;
88
- //}
89
-
90
- //static uint32_t unicode_cpt_from_utf16(const std::vector<uint16_t> & utf16, size_t & offset) {
91
- // assert(offset < utf16.size());
92
- // if (((utf16[0] >> 10) << 10) != 0xd800) {
93
- // auto result = utf16[offset + 0];
94
- // offset += 1;
95
- // return result;
96
- // }
97
- //
98
- // if (offset + 1 >= utf16.size() || !((utf16[1] & 0xdc00) == 0xdc00)) {
99
- // throw std::invalid_argument("invalid character");
100
- // }
101
- //
102
- // auto result = 0x10000 + (((utf16[0] & 0x03ff) << 10) | (utf16[1] & 0x03ff));
103
- // offset += 2;
104
- // return result;
105
- //}
106
-
107
- //static std::vector<uint32_t> unicode_cpts_from_utf16(const std::vector<uint16_t> & utf16) {
108
- // std::vector<uint32_t> result;
109
- // size_t offset = 0;
110
- // while (offset < utf16.size()) {
111
- // result.push_back(unicode_cpt_from_utf16(utf16, offset));
112
- // }
113
- // return result;
114
- //}
115
-
116
- static std::vector<unicode_cpt_flags> unicode_cpt_flags_array() {
117
- std::vector<unicode_cpt_flags> cpt_flags(MAX_CODEPOINTS, unicode_cpt_flags::UNDEFINED);
118
-
119
- assert (unicode_ranges_flags.begin()[0].first == 0);
120
- assert (unicode_ranges_flags.begin()[unicode_ranges_flags.size()-1].first == MAX_CODEPOINTS);
121
- for (size_t i = 1; i < unicode_ranges_flags.size(); ++i) {
122
- const auto range_ini = unicode_ranges_flags.begin()[i-1]; // codepoint_ini, flags
123
- const auto range_end = unicode_ranges_flags.begin()[i]; // codepoint_end, flags
124
- for (uint32_t cpt = range_ini.first; cpt < range_end.first; ++cpt) {
125
- cpt_flags[cpt] = range_ini.second;
126
- }
127
- }
128
-
129
- for (auto cpt : unicode_set_whitespace) {
130
- cpt_flags[cpt].is_whitespace = true;
131
- }
132
-
133
- for (auto p : unicode_map_lowercase) {
134
- cpt_flags[p.second].is_lowercase = true;
135
- }
136
-
137
- for (auto p : unicode_map_uppercase) {
138
- cpt_flags[p.second].is_uppercase = true;
139
- }
140
-
141
- for (auto &range : unicode_ranges_nfd) { // start, last, nfd
142
- cpt_flags[range.nfd].is_nfd = true;
143
- }
144
-
145
- return cpt_flags;
146
- }
147
-
148
- static std::unordered_map<uint8_t, std::string> unicode_byte_to_utf8_map() {
149
- std::unordered_map<uint8_t, std::string> map;
150
- for (int ch = 0x21; ch <= 0x7E; ++ch) { // u'!' to u'~'
151
- assert(0 <= ch && ch < 256);
152
- map[ch] = unicode_cpt_to_utf8(ch);
153
- }
154
- for (int ch = 0xA1; ch <= 0xAC; ++ch) { // u'¡' to u'¬'
155
- assert(0 <= ch && ch < 256);
156
- map[ch] = unicode_cpt_to_utf8(ch);
157
- }
158
- for (int ch = 0xAE; ch <= 0xFF; ++ch) { // u'®' to u'ÿ'
159
- assert(0 <= ch && ch < 256);
160
- map[ch] = unicode_cpt_to_utf8(ch);
161
- }
162
- auto n = 0;
163
- for (int ch = 0; ch < 256; ++ch) {
164
- if (map.find(ch) == map.end()) {
165
- map[ch] = unicode_cpt_to_utf8(256 + n);
166
- ++n;
167
- }
168
- }
169
- return map;
170
- }
171
-
172
- static std::unordered_map<std::string, uint8_t> unicode_utf8_to_byte_map() {
173
- std::unordered_map<std::string, uint8_t> map;
174
- for (int ch = 0x21; ch <= 0x7E; ++ch) { // u'!' to u'~'
175
- assert(0 <= ch && ch < 256);
176
- map[unicode_cpt_to_utf8(ch)] = ch;
177
- }
178
- for (int ch = 0xA1; ch <= 0xAC; ++ch) { // u'¡' to u'¬'
179
- assert(0 <= ch && ch < 256);
180
- map[unicode_cpt_to_utf8(ch)] = ch;
181
- }
182
- for (int ch = 0xAE; ch <= 0xFF; ++ch) { // u'®' to u'ÿ'
183
- assert(0 <= ch && ch < 256);
184
- map[unicode_cpt_to_utf8(ch)] = ch;
185
- }
186
- auto n = 0;
187
- for (int ch = 0; ch < 256; ++ch) {
188
- if (map.find(unicode_cpt_to_utf8(ch)) == map.end()) {
189
- map[unicode_cpt_to_utf8(256 + n)] = ch;
190
- ++n;
191
- }
192
- }
193
- return map;
194
- }
195
-
196
- static std::vector<std::string> unicode_byte_encoding_process(const std::vector<std::string> & bpe_words) {
197
- std::vector<std::string> bpe_encoded_words;
198
- for (const auto & word : bpe_words) {
199
- std::string text_utf;
200
- auto utf_word = unicode_cpts_from_utf8(word);
201
- for (size_t i = 0; i < utf_word.size(); ++i) {
202
- text_utf += unicode_cpt_to_utf8(utf_word[i]);
203
- }
204
-
205
- std::string encoded_token;
206
- for (char & c : text_utf) {
207
- encoded_token += unicode_byte_to_utf8(c);
208
- }
209
- bpe_encoded_words.emplace_back(encoded_token);
210
- }
211
- return bpe_encoded_words;
212
- }
213
-
214
- // GPT2 system regex: 's|'t|'re|'ve|'m|'ll|'d| ?\p{L}+| ?\p{N}+| ?[^\s\p{L}\p{N}]+|\s+(?!\S)|\s+
215
- static std::vector<size_t> unicode_regex_split_custom_gpt2(const std::string & text, const std::vector<size_t> & offsets) {
216
- std::vector<size_t> bpe_offsets; // store the offset of each word
217
- bpe_offsets.reserve(offsets.size()); // Reserve memory for the approximate size
218
-
219
- const auto cpts = unicode_cpts_from_utf8(text);
220
-
221
- size_t start = 0;
222
- for (auto offset : offsets) {
223
- const size_t offset_ini = start;
224
- const size_t offset_end = start + offset;
225
- assert(offset_end <= cpts.size());
226
- start = offset_end;
227
-
228
- static const uint32_t OUT_OF_RANGE = 0xFFFFFFFF;
229
- auto _get_cpt = [&] (const size_t pos) -> uint32_t {
230
- return (offset_ini <= pos && pos < offset_end) ? cpts[pos] : OUT_OF_RANGE;
231
- };
232
-
233
- auto _get_flags = [&] (const size_t pos) -> unicode_cpt_flags {
234
- return (offset_ini <= pos && pos < offset_end) ? unicode_cpt_flags_from_cpt(cpts[pos]) : unicode_cpt_flags{};
235
- };
236
-
237
- size_t _prev_end = offset_ini;
238
- auto _add_token = [&] (const size_t end) -> size_t {
239
- assert(_prev_end <= end && end <= offset_end);
240
- size_t len = end - _prev_end;
241
- if (len > 0) {
242
- bpe_offsets.push_back(len);
243
- }
244
- _prev_end = end;
245
- //if (len > 0) {
246
- // std::string s = "";
247
- // for(size_t p = end-len; p < end; p++)
248
- // s += unicode_cpt_to_utf8(cpts[p]);
249
- // printf(">>> '%s'\n", s.c_str());
250
- //}
251
- return len;
252
- };
253
-
254
- for (size_t pos = offset_ini; pos < offset_end; /*pos++*/ ) {
255
- const uint32_t cpt = _get_cpt(pos);
256
- const auto flags = _get_flags(pos);
257
-
258
- // regex: 's|'t|'re|'ve|'m|'ll|'d
259
- if (cpt == '\'' && pos+1 < offset_end) {
260
- uint32_t cpt_next = _get_cpt(pos+1);
261
- if (cpt_next == 's' || cpt_next == 't' || cpt_next == 'm' || cpt_next == 'd') {
262
- pos += _add_token(pos+2);
263
- continue;
264
- }
265
- if (pos+2 < offset_end) {
266
- uint32_t cpt_next_next = _get_cpt(pos+2);
267
- if ((cpt_next == 'r' && cpt_next_next == 'e') ||
268
- (cpt_next == 'v' && cpt_next_next == 'e') ||
269
- (cpt_next == 'l' && cpt_next_next == 'l')) {
270
- pos += _add_token(pos+3);
271
- continue;
272
- }
273
- }
274
- }
275
-
276
- auto flags2 = (cpt == ' ' ? _get_flags(pos+1) : flags);
277
- // regex: <space>?\p{L}+
278
- if (flags2.is_letter) {
279
- pos += (cpt == ' ');
280
- while (flags2.is_letter) {
281
- flags2 = _get_flags(++pos);
282
- }
283
- _add_token(pos);
284
- continue;
285
- }
286
- // regex: <space>?\p{N}+
287
- if (flags2.is_number) {
288
- pos += (cpt == ' ');
289
- while (flags2.is_number) {
290
- flags2 = _get_flags(++pos);
291
- }
292
- _add_token(pos);
293
- continue;
294
- }
295
- // regex: <space>?[^\s\p{L}\p{N}]+
296
- if (!(flags2.is_whitespace | flags2.is_letter | flags2.is_number) && flags2.as_uint()) {
297
- pos += (cpt == ' ');
298
- while (!(flags2.is_whitespace | flags2.is_letter | flags2.is_number) && flags2.as_uint()) {
299
- flags2 = _get_flags(++pos);
300
- }
301
- _add_token(pos);
302
- continue;
303
- }
304
-
305
- size_t num_whitespaces = 0;
306
- while (_get_flags(pos+num_whitespaces).is_whitespace) {
307
- num_whitespaces++;
308
- }
309
-
310
- // regex: \s+(?!\S)
311
- if (num_whitespaces > 1 && _get_cpt(pos+num_whitespaces) != OUT_OF_RANGE) {
312
- pos += num_whitespaces - 1;
313
- _add_token(pos);
314
- continue;
315
- }
316
-
317
- // regex: \s+
318
- if (num_whitespaces > 0) {
319
- pos += num_whitespaces;
320
- _add_token(pos);
321
- continue;
322
- }
323
-
324
- // no matches
325
- _add_token(++pos);
326
- }
327
- }
328
-
329
- return bpe_offsets;
330
- }
331
-
332
- // LLAMA3 system regex: "(?i:'s|'t|'re|'ve|'m|'ll|'d)|[^\r\n\p{L}\p{N}]?\p{L}+|\p{N}{1,3}| ?[^\s\p{L}\p{N}]+[\r\n]*|\s*[\r\n]+|\s+(?!\S)|\s+"
333
- static std::vector<size_t> unicode_regex_split_custom_llama3(const std::string & text, const std::vector<size_t> & offsets) {
334
- std::vector<size_t> bpe_offsets; // store the offset of each word
335
- bpe_offsets.reserve(offsets.size()); // Reserve memory for the approximate size
336
-
337
- const auto cpts = unicode_cpts_from_utf8(text);
338
-
339
- size_t start = 0;
340
- for (auto offset : offsets) {
341
- const size_t offset_ini = start;
342
- const size_t offset_end = start + offset;
343
- assert(offset_end <= cpts.size());
344
- start = offset_end;
345
-
346
- static const uint32_t OUT_OF_RANGE = 0xFFFFFFFF;
347
- auto _get_cpt = [&] (const size_t pos) -> uint32_t {
348
- return (offset_ini <= pos && pos < offset_end) ? cpts[pos] : OUT_OF_RANGE;
349
- };
350
-
351
- auto _get_flags = [&] (const size_t pos) -> unicode_cpt_flags {
352
- return (offset_ini <= pos && pos < offset_end) ? unicode_cpt_flags_from_cpt(cpts[pos]) : unicode_cpt_flags{};
353
- };
354
-
355
- size_t _prev_end = offset_ini;
356
- auto _add_token = [&] (const size_t end) -> size_t {
357
- assert(_prev_end <= end && end <= offset_end);
358
- size_t len = end - _prev_end;
359
- if (len > 0) {
360
- bpe_offsets.push_back(len);
361
- }
362
- _prev_end = end;
363
- //if (len > 0) {
364
- // std::string s = "";
365
- // for(size_t p = end-len; p < end; p++)
366
- // s += unicode_cpt_to_utf8(cpts[p]);
367
- // printf(">>> '%s'\n", s.c_str());
368
- //}
369
- return len;
370
- };
371
-
372
- for (size_t pos = offset_ini; pos < offset_end; /*pos++*/ ) {
373
- const uint32_t cpt = _get_cpt(pos);
374
- const auto flags = _get_flags(pos);
375
-
376
- // regex: (?i:'s|'t|'re|'ve|'m|'ll|'d) // case insensitive
377
- if (cpt == '\'' && pos+1 < offset_end) {
378
- uint32_t cpt_next = unicode_tolower(_get_cpt(pos+1));
379
- if (cpt_next == 's' || cpt_next == 't' || cpt_next == 'm' || cpt_next == 'd') {
380
- pos += _add_token(pos+2);
381
- continue;
382
- }
383
- if (pos+2 < offset_end) {
384
- uint32_t cpt_next_next = unicode_tolower(_get_cpt(pos+2));
385
- if ((cpt_next == 'r' && cpt_next_next == 'e') ||
386
- (cpt_next == 'v' && cpt_next_next == 'e') ||
387
- (cpt_next == 'l' && cpt_next_next == 'l')) {
388
- pos += _add_token(pos+3);
389
- continue;
390
- }
391
- }
392
- }
393
-
394
- // regex: [^\r\n\p{L}\p{N}]?\p{L}+
395
- if (!(cpt == '\r' || cpt == '\n' || flags.is_number)) {
396
- if (flags.is_letter || _get_flags(pos+1).is_letter) { // one or more letters
397
- pos++;
398
- while (_get_flags(pos).is_letter) {
399
- pos++;
400
- }
401
- _add_token(pos);
402
- continue;
403
- }
404
- }
405
-
406
- // regex: \p{N}{1,3}
407
- if (flags.is_number) {
408
- size_t ini = pos;
409
- while (_get_flags(pos).is_number) {
410
- if (++pos - ini >= 3 ) {
411
- _add_token(pos);
412
- ini = pos;
413
- }
414
- }
415
- _add_token(pos);
416
- continue;
417
- }
418
-
419
- // regex: <space>?[^\s\p{L}\p{N}]+[\r\n]*
420
- auto flags2 = (cpt == ' ' ? _get_flags(pos+1) : flags);
421
- if (!(flags2.is_whitespace | flags2.is_letter | flags2.is_number) && flags.as_uint()) {
422
- pos += (cpt == ' ');
423
- while (!(flags2.is_whitespace | flags2.is_letter | flags2.is_number) && flags2.as_uint()) {
424
- flags2 = _get_flags(++pos);
425
- }
426
- uint32_t cpt2 = _get_cpt(pos);
427
- while (cpt2 == '\r' || cpt2 == '\n') {
428
- cpt2 = _get_cpt(++pos);
429
- }
430
- _add_token(pos);
431
- continue;
432
- }
433
-
434
- size_t num_whitespaces = 0;
435
- size_t last_end_r_or_n = 0;
436
- while (_get_flags(pos+num_whitespaces).is_whitespace) {
437
- uint32_t cpt2 = _get_cpt(pos+num_whitespaces);
438
- if (cpt2 == '\r' || cpt2 == '\n') {
439
- last_end_r_or_n = pos + num_whitespaces + 1;
440
- }
441
- num_whitespaces++;
442
- }
443
-
444
- // regex: \s*[\r\n]+
445
- if (last_end_r_or_n > 0) {
446
- pos = last_end_r_or_n;
447
- _add_token(pos);
448
- continue;
449
- }
450
-
451
- // regex: \s+(?!\S)
452
- if (num_whitespaces > 1 && _get_cpt(pos+num_whitespaces) != OUT_OF_RANGE) {
453
- pos += num_whitespaces - 1;
454
- _add_token(pos);
455
- continue;
456
- }
457
-
458
- // regex: \s+
459
- if (num_whitespaces > 0) {
460
- pos += num_whitespaces;
461
- _add_token(pos);
462
- continue;
463
- }
464
-
465
- // no matches
466
- _add_token(++pos);
467
- }
468
- }
469
-
470
- return bpe_offsets;
471
- }
472
-
473
- template <typename CharT>
474
- static std::vector<size_t> unicode_regex_split_stl(const std::basic_string<CharT> & text, const std::basic_string<CharT> & regex, const std::vector<size_t> & offsets) {
475
- using BidirIt = typename std::basic_string<CharT>::const_iterator;
476
- #ifdef _MSC_VER
477
- // Bypass bug in MSVC: https://github.com/ggml-org/llama.cpp/issues/17830
478
- constexpr auto regex_flags = std::regex_constants::ECMAScript;
479
- #else
480
- constexpr auto regex_flags = std::regex_constants::optimize | std::regex_constants::nosubs;
481
- #endif
482
- std::basic_regex<CharT> expr(regex, regex_flags);
483
- std::vector<size_t> bpe_offsets; // store the offset of each word
484
- bpe_offsets.reserve(offsets.size()); // Reserve memory for the approximate size
485
- size_t start = 0;
486
- for (auto offset : offsets) {
487
- std::regex_iterator<BidirIt> it(text.begin() + start, text.begin() + start + offset, expr);
488
- std::regex_iterator<BidirIt> end;
489
-
490
- int64_t start_idx = 0;
491
- while (it != end) {
492
- std::match_results<BidirIt> match = *it;
493
- if (match.position() > start_idx) {
494
- bpe_offsets.emplace_back(match.position() - start_idx);
495
- }
496
- bpe_offsets.emplace_back(match.length());
497
- start_idx = match.position() + match.length();
498
- ++it;
499
- }
500
-
501
- if (start_idx < (int64_t) offset) {
502
- bpe_offsets.emplace_back(offset - start_idx);
503
- }
504
- start += offset;
505
- }
506
-
507
- return bpe_offsets;
508
- }
509
-
510
- // K2 system regex patterns (from tokenization_kimi.py):
511
- // [\p{Han}]+|[^\r\n\p{L}\p{N}]?[\p{Lu}\p{Lt}\p{Lm}\p{Lo}\p{M}&&[^\p{Han}]]*[\p{Ll}\p{Lm}\p{Lo}\p{M}&&[^\p{Han}]]+(?i:'s|'t|'re|'ve|'m|'ll|'d)?|[^\r\n\p{L}\p{N}]?[\p{Lu}\p{Lt}\p{Lm}\p{Lo}\p{M}&&[^\p{Han}]]+[\p{Ll}\p{Lm}\p{Lo}\p{M}&&[^\p{Han}]]*(?i:'s|'t|'re|'ve|'m|'ll|'d)?|\p{N}{1,3}| ?[^\s\p{L}\p{N}]+[\r\n]*|\s*[\r\n]+|\s+(?!\S)|\s+
512
- static std::vector<size_t> unicode_regex_split_custom_kimi_k2(const std::string & text, const std::vector<size_t> & offsets) {
513
- std::vector<size_t> bpe_offsets;
514
- bpe_offsets.reserve(offsets.size());
515
-
516
- const auto cpts = unicode_cpts_from_utf8(text);
517
-
518
- size_t start = 0;
519
- for (auto offset : offsets) {
520
- const size_t offset_ini = start;
521
- const size_t offset_end = start + offset;
522
- assert(offset_end <= cpts.size());
523
- start = offset_end;
524
-
525
- static const uint32_t OUT_OF_RANGE = 0xFFFFFFFF;
526
- auto _get_cpt = [&] (const size_t pos) -> uint32_t {
527
- return (offset_ini <= pos && pos < offset_end) ? cpts[pos] : OUT_OF_RANGE;
528
- };
529
-
530
- auto _get_flags = [&] (const size_t pos) -> unicode_cpt_flags {
531
- return (offset_ini <= pos && pos < offset_end) ? unicode_cpt_flags_from_cpt(cpts[pos]) : unicode_cpt_flags{};
532
- };
533
-
534
- size_t _prev_end = offset_ini;
535
- auto _add_token = [&] (const size_t end) -> size_t {
536
- assert(_prev_end <= end && end <= offset_end);
537
- size_t len = end - _prev_end;
538
- if (len > 0) {
539
- bpe_offsets.push_back(len);
540
- }
541
- _prev_end = end;
542
- return len;
543
- };
544
-
545
- for (size_t pos = offset_ini; pos < offset_end; /*pos++*/ ) {
546
- const uint32_t cpt = _get_cpt(pos);
547
- const auto flags = _get_flags(pos);
548
-
549
- // Pattern 1: [\p{Han}]+ (Chinese characters)
550
- if (unicode_cpt_is_han(cpt)) {
551
- while (unicode_cpt_is_han(_get_cpt(pos))) {
552
- pos++;
553
- }
554
- _add_token(pos);
555
- continue;
556
- }
557
-
558
- // Pattern 2 & 3: Letter words excluding Han characters with optional contractions
559
- // [^\r\n\p{L}\p{N}]?[\p{Lu}\p{Lt}\p{Lm}\p{Lo}\p{M}&&[^\p{Han}]]*[\p{Ll}\p{Lm}\p{Lo}\p{M}&&[^\p{Han}]]+(?:'s|'t|'re|'ve|'m|'ll|'d)?
560
- // [^\r\n\p{L}\p{N}]?[\p{Lu}\p{Lt}\p{Lm}\p{Lo}\p{M}&&[^\p{Han}]]+[\p{Ll}\p{Lm}\p{Lo}\p{M}&&[^\p{Han}]]*(?:'s|'t|'re|'ve|'m|'ll|'d)?
561
- // Check if current char is a letter OR if current char could be a leading char and next char is a letter
562
- bool is_letter_pattern = (flags.is_letter && !unicode_cpt_is_han(cpt)) ||
563
- (!(cpt == '\r' || cpt == '\n' || flags.is_letter || flags.is_number) &&
564
- _get_flags(pos + 1).is_letter && !unicode_cpt_is_han(_get_cpt(pos + 1)));
565
-
566
- if (is_letter_pattern) {
567
- // Handle optional leading non-letter/non-number character
568
- bool has_leading_char = false;
569
- if (!(cpt == '\r' || cpt == '\n' || flags.is_letter || flags.is_number)) {
570
- has_leading_char = true;
571
- pos++;
572
- }
573
-
574
- // Match letter sequence (excluding Han characters)
575
- bool has_letters = false;
576
- while (_get_flags(pos).is_letter && !unicode_cpt_is_han(_get_cpt(pos))) {
577
- has_letters = true;
578
- pos++;
579
- }
580
-
581
- // Only proceed if we found letters (after potentially skipping leading char)
582
- if (has_letters || (!has_leading_char && _get_flags(pos).is_letter && !unicode_cpt_is_han(_get_cpt(pos)))) {
583
- if (!has_letters) pos++; // consume the first letter if we didn't already
584
-
585
- // Continue consuming letters
586
- while (_get_flags(pos).is_letter && !unicode_cpt_is_han(_get_cpt(pos))) {
587
- pos++;
588
- }
589
-
590
- // Check for optional contractions (?:'s|'t|'re|'ve|'m|'ll|'d)
591
- if (_get_cpt(pos) == '\'' && pos + 1 < offset_end) {
592
- uint32_t cpt_next = unicode_tolower(_get_cpt(pos + 1));
593
- if (cpt_next == 's' || cpt_next == 't' || cpt_next == 'm' || cpt_next == 'd') {
594
- pos += 2;
595
- } else if (pos + 2 < offset_end) {
596
- uint32_t cpt_next_next = unicode_tolower(_get_cpt(pos + 2));
597
- if ((cpt_next == 'r' && cpt_next_next == 'e') ||
598
- (cpt_next == 'v' && cpt_next_next == 'e') ||
599
- (cpt_next == 'l' && cpt_next_next == 'l')) {
600
- pos += 3;
601
- }
602
- }
603
- }
604
-
605
- _add_token(pos);
606
- continue;
607
- } else if (has_leading_char) {
608
- // We consumed a leading char but found no letters, backtrack
609
- pos--;
610
- }
611
- }
612
-
613
- // Pattern 4: \p{N}{1,3} (numbers 1-3 digits)
614
- if (flags.is_number) {
615
- size_t ini = pos;
616
- while (_get_flags(pos).is_number) {
617
- if (++pos - ini >= 3) {
618
- _add_token(pos);
619
- ini = pos;
620
- }
621
- }
622
- _add_token(pos);
623
- continue;
624
- }
625
-
626
- // Pattern 5: ?[^\s\p{L}\p{N}]+[\r\n]* (optional space + non-word chars + optional newlines)
627
- auto flags2 = (cpt == ' ' ? _get_flags(pos + 1) : flags);
628
- if (!(flags2.is_whitespace || flags2.is_letter || flags2.is_number) && flags2.as_uint()) {
629
- pos += (cpt == ' ');
630
- while (!(flags2.is_whitespace || flags2.is_letter || flags2.is_number) && flags2.as_uint()) {
631
- flags2 = _get_flags(++pos);
632
- }
633
- // Match optional [\r\n]*
634
- uint32_t cpt2 = _get_cpt(pos);
635
- while (cpt2 == '\r' || cpt2 == '\n') {
636
- cpt2 = _get_cpt(++pos);
637
- }
638
- _add_token(pos);
639
- continue;
640
- }
641
-
642
- // Count whitespace characters
643
- size_t num_whitespaces = 0;
644
- size_t last_end_r_or_n = 0;
645
- while (_get_flags(pos + num_whitespaces).is_whitespace) {
646
- uint32_t cpt2 = _get_cpt(pos + num_whitespaces);
647
- if (cpt2 == '\r' || cpt2 == '\n') {
648
- last_end_r_or_n = pos + num_whitespaces + 1;
649
- }
650
- num_whitespaces++;
651
- }
652
-
653
- // Pattern 6: \s*[\r\n]+ (whitespace with newlines)
654
- if (last_end_r_or_n > 0) {
655
- pos = last_end_r_or_n;
656
- _add_token(pos);
657
- continue;
658
- }
659
-
660
- // Pattern 7: \s+(?!\S) (trailing whitespace)
661
- if (num_whitespaces > 1 && _get_cpt(pos + num_whitespaces) != OUT_OF_RANGE) {
662
- pos += num_whitespaces - 1;
663
- _add_token(pos);
664
- continue;
665
- }
666
-
667
- // Pattern 8: \s+ (general whitespace)
668
- if (num_whitespaces > 0) {
669
- pos += num_whitespaces;
670
- _add_token(pos);
671
- continue;
672
- }
673
-
674
- // No matches - consume single character
675
- _add_token(++pos);
676
- }
677
- }
678
-
679
- return bpe_offsets;
680
- }
681
-
682
- // AFMOE digit handling: splits digits with leading 1-2 based on total length modulo 3
683
- static std::vector<size_t> unicode_regex_split_custom_afmoe(const std::string & text, const std::vector<size_t> & offsets) {
684
- std::vector<size_t> bpe_offsets;
685
- bpe_offsets.reserve(offsets.size());
686
-
687
- const auto cpts = unicode_cpts_from_utf8(text);
688
-
689
- size_t start = 0;
690
- for (auto offset : offsets) {
691
- const size_t offset_ini = start;
692
- const size_t offset_end = start + offset;
693
- assert(offset_end <= cpts.size());
694
- start = offset_end;
695
-
696
- auto _get_flags = [&] (const size_t pos) -> unicode_cpt_flags {
697
- return (offset_ini <= pos && pos < offset_end) ? unicode_cpt_flags_from_cpt(cpts[pos]) : unicode_cpt_flags{};
698
- };
699
-
700
- size_t _prev_end = offset_ini;
701
- auto _add_token = [&] (const size_t end) -> size_t {
702
- assert(_prev_end <= end && end <= offset_end);
703
- size_t len = end - _prev_end;
704
- if (len > 0) {
705
- bpe_offsets.push_back(len);
706
- }
707
- _prev_end = end;
708
- return len;
709
- };
710
-
711
- for (size_t pos = offset_ini; pos < offset_end; ) {
712
- const auto flags = _get_flags(pos);
713
-
714
- // Handle digit sequences with special splitting logic
715
- if (flags.is_number) {
716
- size_t digit_start = pos;
717
- size_t digit_count = 0;
718
-
719
- // Count consecutive digits
720
- while (_get_flags(pos).is_number && pos < offset_end) {
721
- digit_count++;
722
- pos++;
723
- }
724
-
725
- // Split based on total length modulo 3
726
- size_t remainder = digit_count % 3;
727
- size_t current = digit_start;
728
-
729
- // Emit leading 1-2 digits if needed
730
- if (remainder > 0) {
731
- _add_token(current + remainder);
732
- current += remainder;
733
- }
734
-
735
- // Emit groups of 3
736
- while (current < digit_start + digit_count) {
737
- _add_token(current + 3);
738
- current += 3;
739
- }
740
- continue;
741
- }
742
-
743
- // For non-digits, just move forward
744
- pos++;
745
- }
746
-
747
- // Add any remaining content
748
- if (_prev_end < offset_end) {
749
- _add_token(offset_end);
750
- }
751
- }
752
-
753
- return bpe_offsets;
754
- }
755
-
756
- static std::vector<size_t> unicode_regex_split_custom(const std::string & text, const std::string & regex_expr, const std::vector<size_t> & offsets) {
757
- std::vector<size_t> bpe_offsets;
758
-
759
- if (regex_expr == "'s|'t|'re|'ve|'m|'ll|'d| ?\\p{L}+| ?\\p{N}+| ?[^\\s\\p{L}\\p{N}]+|\\s+(?!\\S)") {
760
- bpe_offsets = unicode_regex_split_custom_gpt2(text, offsets);
761
- } else if (
762
- regex_expr == "(?i:'s|'t|'re|'ve|'m|'ll|'d)|[^\\r\\n\\p{L}\\p{N}]?\\p{L}+|\\p{N}{1,3}| ?[^\\s\\p{L}\\p{N}]+[\\r\\n]*|\\s*[\\r\\n]+|\\s+(?!\\S)|\\s+" ||
763
- regex_expr == "(?:'[sS]|'[tT]|'[rR][eE]|'[vV][eE]|'[mM]|'[lL][lL]|'[dD])|[^\\r\\n\\p{L}\\p{N}]?\\p{L}+|\\p{N}{1,3}| ?[^\\s\\p{L}\\p{N}]+[\\r\\n]*|\\s*[\\r\\n]+|\\s+(?!\\S)|\\s+") {
764
-
765
- bpe_offsets = unicode_regex_split_custom_llama3(text, offsets);
766
- } else if (regex_expr == "\\p{Han}+") {
767
- // K2's first pattern - handle all K2 patterns together
768
- bpe_offsets = unicode_regex_split_custom_kimi_k2(text, offsets);
769
- } else if (regex_expr == "\\p{AFMoE_digits}") {
770
- // AFMOE digit pattern - use custom implementation for proper splitting
771
- bpe_offsets = unicode_regex_split_custom_afmoe(text, offsets);
772
- } else if (regex_expr == "\\d{1,3}(?=(?:\\d{3})*\\b)") {
773
- // tiny_aya digit grouping pattern from tokenizer.json:
774
- // {"type": "Split", "pattern": {"Regex": "\\d{1,3}(?=(?:\\d{3})*\\b)"}, "behavior": "Isolated"}
775
- // Splits digits into groups of 3 from the right (e.g., 1234567 -> 1, 234, 567)
776
- // TODO: Revisit this regex, in case there are any subtle tokenization differences with the original regex.
777
- bpe_offsets = unicode_regex_split_custom_afmoe(text, offsets);
778
- }
779
-
780
- return bpe_offsets;
781
- }
782
-
783
- //
784
- // interface
785
- //
786
-
787
- std::string unicode_cpt_to_utf8(uint32_t cpt) {
788
- std::string result;
789
-
790
- if (/* 0x00 <= cpt && */ cpt <= 0x7f) {
791
- result.push_back(cpt);
792
- return result;
793
- }
794
- if (0x80 <= cpt && cpt <= 0x7ff) {
795
- result.push_back(0xc0 | ((cpt >> 6) & 0x1f));
796
- result.push_back(0x80 | (cpt & 0x3f));
797
- return result;
798
- }
799
- if (0x800 <= cpt && cpt <= 0xffff) {
800
- result.push_back(0xe0 | ((cpt >> 12) & 0x0f));
801
- result.push_back(0x80 | ((cpt >> 6) & 0x3f));
802
- result.push_back(0x80 | (cpt & 0x3f));
803
- return result;
804
- }
805
- if (0x10000 <= cpt && cpt <= 0x10ffff) {
806
- result.push_back(0xf0 | ((cpt >> 18) & 0x07));
807
- result.push_back(0x80 | ((cpt >> 12) & 0x3f));
808
- result.push_back(0x80 | ((cpt >> 6) & 0x3f));
809
- result.push_back(0x80 | (cpt & 0x3f));
810
- return result;
811
- }
812
-
813
- throw std::invalid_argument("invalid codepoint");
814
- }
815
-
816
- std::vector<uint32_t> unicode_cpts_normalize_nfd(const std::vector<uint32_t> & cpts) {
817
- auto comp = [] (const uint32_t cpt, const range_nfd & range) {
818
- return cpt < range.first;
819
- };
820
- std::vector<uint32_t> result(cpts.size());
821
- for (size_t i = 0; i < cpts.size(); ++i) {
822
- const uint32_t cpt = cpts[i];
823
- auto it = std::upper_bound(unicode_ranges_nfd.begin(), unicode_ranges_nfd.end(), cpt, comp) - 1;
824
- result[i] = (it->first <= cpt && cpt <= it->last) ? it->nfd : cpt;
825
- }
826
- return result;
827
- }
828
-
829
- std::vector<uint32_t> unicode_cpts_from_utf8(const std::string & utf8) {
830
- std::vector<uint32_t> result;
831
- result.reserve(utf8.size());
832
- size_t offset = 0;
833
- while (offset < utf8.size()) {
834
- try {
835
- result.push_back(unicode_cpt_from_utf8(utf8, offset));
836
- }
837
- catch (const std::invalid_argument & /*ex*/) {
838
- // Silently ignore invalid UTF-8 input to avoid leaking the exception beyond llama_tokenize
839
- ++offset;
840
- result.emplace_back(0xFFFD); // replacement character
841
- }
842
- }
843
- return result;
844
- }
845
-
846
- unicode_cpt_flags unicode_cpt_flags_from_cpt(const uint32_t cpt) {
847
- static const unicode_cpt_flags undef(unicode_cpt_flags::UNDEFINED);
848
- static const auto cpt_flags = unicode_cpt_flags_array();
849
- return cpt < cpt_flags.size() ? cpt_flags[cpt] : undef;
850
- }
851
-
852
- unicode_cpt_flags unicode_cpt_flags_from_utf8(const std::string & utf8) {
853
- static const unicode_cpt_flags undef(unicode_cpt_flags::UNDEFINED);
854
- if (utf8.empty()) {
855
- return undef; // undefined
856
- }
857
- size_t offset = 0;
858
- return unicode_cpt_flags_from_cpt(unicode_cpt_from_utf8(utf8, offset));
859
- }
860
-
861
- std::string unicode_byte_to_utf8(uint8_t byte) {
862
- static std::unordered_map<uint8_t, std::string> map = unicode_byte_to_utf8_map();
863
- return map.at(byte);
864
- }
865
-
866
- uint8_t unicode_utf8_to_byte(const std::string & utf8) {
867
- static std::unordered_map<std::string, uint8_t> map = unicode_utf8_to_byte_map();
868
- return map.at(utf8);
869
- }
870
-
871
- uint32_t unicode_tolower(uint32_t cpt) {
872
- // binary search
873
- auto it = std::lower_bound(unicode_map_lowercase.begin(), unicode_map_lowercase.end(), cpt,
874
- [](const std::pair<uint32_t, uint32_t> & pair, uint32_t value) {
875
- return pair.first < value;
876
- });
877
- if (it != unicode_map_lowercase.end() && it->first == cpt) {
878
- return it->second;
879
- }
880
- return cpt; // Return the original code point if no lowercase mapping is found
881
- }
882
-
883
- bool unicode_cpt_is_han(uint32_t cpt) {
884
- // Han character ranges (Chinese/CJK characters)
885
- // CJK Unified Ideographs (most common)
886
- if (cpt >= 0x4E00 && cpt <= 0x9FFF) return true;
887
-
888
- // CJK Extension A
889
- if (cpt >= 0x3400 && cpt <= 0x4DBF) return true;
890
-
891
- // CJK Extension B
892
- if (cpt >= 0x20000 && cpt <= 0x2A6DF) return true;
893
-
894
- // CJK Extension C
895
- if (cpt >= 0x2A700 && cpt <= 0x2B73F) return true;
896
-
897
- // CJK Extension D
898
- if (cpt >= 0x2B740 && cpt <= 0x2B81F) return true;
899
-
900
- // CJK Extension E
901
- if (cpt >= 0x2B820 && cpt <= 0x2CEAF) return true;
902
-
903
- // CJK Extension F
904
- if (cpt >= 0x2CEB0 && cpt <= 0x2EBEF) return true;
905
-
906
- // CJK Compatibility Ideographs
907
- if (cpt >= 0xF900 && cpt <= 0xFAFF) return true;
908
-
909
- // CJK Compatibility Ideographs Supplement
910
- if (cpt >= 0x2F800 && cpt <= 0x2FA1F) return true;
911
-
912
- return false;
913
- }
914
-
915
- std::vector<std::string> unicode_regex_split(const std::string & text, const std::vector<std::string> & regex_exprs) {
916
- // unicode categories
917
- static const std::map<std::string, int> k_ucat_enum = {
918
- { "\\p{N}", unicode_cpt_flags::NUMBER },
919
- { "\\p{L}", unicode_cpt_flags::LETTER },
920
- { "\\p{P}", unicode_cpt_flags::PUNCTUATION },
921
- { "\\p{M}", unicode_cpt_flags::ACCENT_MARK },
922
- { "\\p{S}", unicode_cpt_flags::SYMBOL },
923
- { "\\p{Lu}", unicode_cpt_flags::LETTER }, // Uppercase letter
924
- { "\\p{Ll}", unicode_cpt_flags::LETTER }, // Lowercase letter
925
- { "\\p{Lt}", unicode_cpt_flags::LETTER }, // Titlecase letter
926
- { "\\p{Lm}", unicode_cpt_flags::LETTER }, // Modifier letter
927
- { "\\p{Lo}", unicode_cpt_flags::LETTER }, // Other letter
928
- };
929
-
930
- static const std::map<int, int> k_ucat_cpt = {
931
- { unicode_cpt_flags::NUMBER, 0xD1 },
932
- { unicode_cpt_flags::LETTER, 0xD2 },
933
- { unicode_cpt_flags::PUNCTUATION, 0xD3 },
934
- { unicode_cpt_flags::ACCENT_MARK, 0xD4 },
935
- { unicode_cpt_flags::SYMBOL, 0xD5 },
936
- };
937
-
938
- static const std::map<int, std::string> k_ucat_map = {
939
- { unicode_cpt_flags::NUMBER, "\x30-\x39" }, // 0-9
940
- { unicode_cpt_flags::LETTER, "\x41-\x5A\x61-\x7A" }, // A-Za-z
941
- { unicode_cpt_flags::PUNCTUATION, "\x21-\x23\x25-\x2A\x2C-\x2F\x3A-\x3B\x3F-\x40\\\x5B-\\\x5D\x5F\\\x7B\\\x7D" }, // !-#%-*,-/:-;?-@\[-\]_\{\}
942
- { unicode_cpt_flags::ACCENT_MARK, "" }, // no sub-128 codepoints
943
- { unicode_cpt_flags::SYMBOL, "\\\x24\\\x2B\x3C-\x3E\x5E\x60\\\x7C" }, // $+<=>^`|
944
- };
945
-
946
- // compute collapsed codepoints only if needed by at least one regex
947
- bool need_collapse = false;
948
- for (const auto & regex_expr : regex_exprs) {
949
- // search for unicode categories
950
- for (const auto & ucat : k_ucat_enum) {
951
- if (std::string::npos != regex_expr.find(ucat.first)) {
952
- need_collapse = true;
953
- break;
954
- }
955
- }
956
- }
957
-
958
- const auto cpts = unicode_cpts_from_utf8(text);
959
-
960
- // generate a "collapsed" representation of the text, where all codepoints are replaced by a single byte
961
- // ref: https://github.com/ggml-org/llama.cpp/pull/6920#issuecomment-2081479935
962
- std::string text_collapsed;
963
- if (need_collapse) {
964
- // collapse all unicode categories
965
- text_collapsed.resize(cpts.size());
966
-
967
- for (size_t i = 0; i < cpts.size(); ++i) {
968
- // keep single-byte codepoints as is
969
- if (cpts[i] < 128) {
970
- text_collapsed[i] = cpts[i];
971
- continue;
972
- }
973
-
974
- const auto flags = unicode_cpt_flags_from_cpt(cpts[i]);
975
-
976
- if (flags.is_whitespace) {
977
- //NOTE: C++ std::regex \s does not mach 0x85, Rust and Python regex does.
978
- //text_collapsed[i] = (char) 0x85; // <Next Line> as whitespace fallback
979
- text_collapsed[i] = (char) 0x0B; // <vertical tab> as whitespace fallback
980
- } else if (k_ucat_cpt.find(flags.category_flag()) != k_ucat_cpt.end()) {
981
- text_collapsed[i] = k_ucat_cpt.at(flags.category_flag());
982
- } else {
983
- text_collapsed[i] = (char) 0xD0; // fallback
984
- }
985
- }
986
- }
987
-
988
- std::vector<size_t> bpe_offsets = { cpts.size() };
989
-
990
- for (const auto & regex_expr : regex_exprs) {
991
- // first, see if we have an efficient custom regex implementation
992
- auto tmp = unicode_regex_split_custom(text, regex_expr, bpe_offsets);
993
-
994
- if (!tmp.empty()) {
995
- bpe_offsets = std::move(tmp);
996
- continue;
997
- }
998
-
999
- // fallback to general-purpose std::regex / std::wregex
1000
- try {
1001
- // if a unicode category is used in the regex, we use the collapsed text and replace the unicode category
1002
- // with the corresponding collapsed representation
1003
- bool use_collapsed = false;
1004
- for (const auto & ucat : k_ucat_enum) {
1005
- if (std::string::npos != regex_expr.find(ucat.first)) {
1006
- use_collapsed = true;
1007
- break;
1008
- }
1009
- }
1010
- const auto cpts_regex = unicode_cpts_from_utf8(regex_expr);
1011
-
1012
- if (use_collapsed) {
1013
- // sanity-check that the original regex does not contain any non-ASCII characters
1014
- for (size_t i = 0; i < cpts_regex.size(); ++i) {
1015
- if (cpts_regex[i] >= 128) {
1016
- throw std::runtime_error("Regex includes both unicode categories and non-ASCII characters - not supported");
1017
- }
1018
- }
1019
-
1020
- // generate a collapsed representation of the regex
1021
- std::string regex_expr_collapsed;
1022
-
1023
- // track if we are inside [], because nested [] are not allowed
1024
- bool inside = false;
1025
- for (size_t i = 0; i < regex_expr.size(); ++i) {
1026
- if (regex_expr[i] == '[' && (i == 0 || regex_expr[i - 1] != '\\')) {
1027
- regex_expr_collapsed += '[';
1028
- inside = true;
1029
- continue;
1030
- }
1031
-
1032
- if (inside && regex_expr[i] == ']' && regex_expr[i - 1] != '\\') {
1033
- regex_expr_collapsed += ']';
1034
- inside = false;
1035
- continue;
1036
- }
1037
-
1038
- // Match \p{...} Unicode properties of varying lengths
1039
- if (regex_expr[i + 0] == '\\' && i + 3 < regex_expr.size() &&
1040
- regex_expr[i + 1] == 'p' &&
1041
- regex_expr[i + 2] == '{') {
1042
- // Find the closing brace
1043
- size_t closing_brace = regex_expr.find('}', i + 3);
1044
- if (closing_brace != std::string::npos && closing_brace <= i + 10) { // reasonable limit
1045
- const std::string pat = regex_expr.substr(i, closing_brace - i + 1);
1046
- if (k_ucat_enum.find(pat) != k_ucat_enum.end()) {
1047
- if (!inside) {
1048
- regex_expr_collapsed += '[';
1049
- }
1050
- regex_expr_collapsed += k_ucat_cpt.at(k_ucat_enum.at(pat));
1051
- regex_expr_collapsed += k_ucat_map.at(k_ucat_enum.at(pat));
1052
- if (!inside) {
1053
- regex_expr_collapsed += ']';
1054
- }
1055
- i = closing_brace;
1056
- continue;
1057
- }
1058
- }
1059
- }
1060
-
1061
- regex_expr_collapsed += regex_expr[i];
1062
- }
1063
-
1064
- //printf("text_collapsed: %s\n", text_collapsed.c_str());
1065
- //printf("regex_expr_collapsed: %s\n", regex_expr_collapsed.c_str());
1066
- bpe_offsets = unicode_regex_split_stl(text_collapsed, regex_expr_collapsed, bpe_offsets);
1067
- } else {
1068
- // no unicode category used, we can use std::wregex directly
1069
- std::wstring wregex_expr(cpts_regex.begin(), cpts_regex.end());
1070
-
1071
- // std::wregex \s does not mach non-ASCII whitespaces, using 0x0B as fallback
1072
- std::wstring wtext(cpts.begin(), cpts.end());
1073
- for (size_t i = 0; i < wtext.size(); ++i) {
1074
- if (wtext[i] > 0x7F && unicode_cpt_flags_from_cpt(wtext[i]).is_whitespace) {
1075
- wtext[i] = 0x0B;
1076
- }
1077
- }
1078
-
1079
- //printf("text: %s\n", text.c_str());
1080
- //printf("regex_expr: %s\n", regex_expr.c_str());
1081
- bpe_offsets = unicode_regex_split_stl(wtext, wregex_expr, bpe_offsets);
1082
- }
1083
- } catch (std::regex_error & e) {
1084
- fprintf(stderr, "Failed to process regex: '%s'\n", regex_expr.c_str());
1085
- fprintf(stderr, "Regex error: %s\n", e.what());
1086
- throw std::runtime_error("Failed to process regex");
1087
- }
1088
- }
1089
-
1090
- std::vector<std::string> bpe_words;
1091
- bpe_words.reserve(bpe_offsets.size()); // reserve memory for the approximate size
1092
-
1093
- size_t start = 0;
1094
- for (size_t & offset : bpe_offsets) {
1095
- bpe_words.emplace_back();
1096
- for (size_t i = start; i < start + offset; ++i) {
1097
- bpe_words.back() += unicode_cpt_to_utf8(cpts[i]);
1098
- }
1099
- start += offset;
1100
- }
1101
-
1102
- return unicode_byte_encoding_process(bpe_words);
1103
- }