numbl 0.4.8 → 0.4.9

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 (543) hide show
  1. package/dist-browser/browser/index.d.ts +21 -0
  2. package/dist-browser/browser/mip.d.ts +10 -0
  3. package/dist-browser/browser/protocol.d.ts +59 -0
  4. package/dist-browser/browser/session.d.ts +55 -0
  5. package/dist-browser/browser/system-store.d.ts +30 -0
  6. package/dist-browser/browser/worker.d.ts +1 -0
  7. package/dist-browser/browser.js +131 -0
  8. package/dist-browser/db/operations.d.ts +25 -0
  9. package/dist-browser/db/schema.d.ts +26 -0
  10. package/dist-browser/graphics/axisLimits.d.ts +23 -0
  11. package/dist-browser/graphics/figuresReducer.d.ts +86 -0
  12. package/dist-browser/graphics/types.d.ts +423 -0
  13. package/dist-browser/hooks/useProjectFiles.d.ts +45 -0
  14. package/dist-browser/numbl-core/diagnostics/errors.d.ts +8 -0
  15. package/dist-browser/numbl-core/diagnostics/index.d.ts +27 -0
  16. package/dist-browser/numbl-core/executeCode.d.ts +108 -0
  17. package/dist-browser/numbl-core/executors/cache.d.ts +26 -0
  18. package/dist-browser/numbl-core/executors/classification.d.ts +134 -0
  19. package/dist-browser/numbl-core/executors/context.d.ts +76 -0
  20. package/dist-browser/numbl-core/executors/handleInline.d.ts +58 -0
  21. package/dist-browser/numbl-core/executors/index.d.ts +14 -0
  22. package/dist-browser/numbl-core/executors/jit/cJitCallExecutor.d.ts +35 -0
  23. package/dist-browser/numbl-core/executors/jit/cJitLoopExecutor.d.ts +31 -0
  24. package/dist-browser/numbl-core/executors/jit/cJitTopLevelExecutor.d.ts +29 -0
  25. package/dist-browser/numbl-core/executors/jit/callExecutor.d.ts +45 -0
  26. package/dist-browser/numbl-core/executors/jit/compileC.d.ts +51 -0
  27. package/dist-browser/numbl-core/executors/jit/compileC.node.d.ts +25 -0
  28. package/dist-browser/numbl-core/executors/jit/hostHelpers.d.ts +31 -0
  29. package/dist-browser/numbl-core/executors/jit/loopExecutor.d.ts +41 -0
  30. package/dist-browser/numbl-core/executors/jit/session.d.ts +17 -0
  31. package/dist-browser/numbl-core/executors/jit/topLevelExecutor.d.ts +36 -0
  32. package/dist-browser/numbl-core/executors/jit/typeAdapter.d.ts +28 -0
  33. package/dist-browser/numbl-core/executors/jit/typeAdapterC.d.ts +73 -0
  34. package/dist-browser/numbl-core/executors/jit/valueAdapter.d.ts +55 -0
  35. package/dist-browser/numbl-core/executors/jit/valueAdapterC.d.ts +108 -0
  36. package/dist-browser/numbl-core/executors/lowering.d.ts +120 -0
  37. package/dist-browser/numbl-core/executors/plugins.d.ts +41 -0
  38. package/dist-browser/numbl-core/executors/registry.d.ts +148 -0
  39. package/dist-browser/numbl-core/executors/types.d.ts +103 -0
  40. package/dist-browser/numbl-core/externalAccessDirective.d.ts +6 -0
  41. package/dist-browser/numbl-core/fileIOAdapter.d.ts +88 -0
  42. package/dist-browser/numbl-core/functionResolve.d.ts +70 -0
  43. package/dist-browser/numbl-core/helpers/arithmetic.d.ts +47 -0
  44. package/dist-browser/numbl-core/helpers/bessel.d.ts +49 -0
  45. package/dist-browser/numbl-core/helpers/check-helpers.d.ts +49 -0
  46. package/dist-browser/numbl-core/helpers/constants.d.ts +6 -0
  47. package/dist-browser/numbl-core/helpers/dummy.d.ts +5 -0
  48. package/dist-browser/numbl-core/helpers/effectively-real.d.ts +25 -0
  49. package/dist-browser/numbl-core/helpers/eigs-select.d.ts +25 -0
  50. package/dist-browser/numbl-core/helpers/erf.d.ts +5 -0
  51. package/dist-browser/numbl-core/helpers/gmres.d.ts +51 -0
  52. package/dist-browser/numbl-core/helpers/linsolve.d.ts +25 -0
  53. package/dist-browser/numbl-core/helpers/marching-cubes-tables.d.ts +10 -0
  54. package/dist-browser/numbl-core/helpers/marching-cubes.d.ts +46 -0
  55. package/dist-browser/numbl-core/helpers/ode-rk.d.ts +83 -0
  56. package/dist-browser/numbl-core/helpers/prng.d.ts +19 -0
  57. package/dist-browser/numbl-core/helpers/quadgk.d.ts +32 -0
  58. package/dist-browser/numbl-core/helpers/reduction/cumulative.d.ts +8 -0
  59. package/dist-browser/numbl-core/helpers/reduction/min-max.d.ts +5 -0
  60. package/dist-browser/numbl-core/helpers/reduction-helpers.d.ts +66 -0
  61. package/dist-browser/numbl-core/helpers/registry.d.ts +7 -0
  62. package/dist-browser/numbl-core/helpers/scanFormat.d.ts +11 -0
  63. package/dist-browser/numbl-core/helpers/shape-utils.d.ts +7 -0
  64. package/dist-browser/numbl-core/helpers/sparse-arithmetic.d.ts +16 -0
  65. package/dist-browser/numbl-core/helpers/string.d.ts +11 -0
  66. package/dist-browser/numbl-core/interpreter/builtins/arithmetic.d.ts +4 -0
  67. package/dist-browser/numbl-core/interpreter/builtins/array-construction.d.ts +10 -0
  68. package/dist-browser/numbl-core/interpreter/builtins/array-extras.d.ts +5 -0
  69. package/dist-browser/numbl-core/interpreter/builtins/array-manipulation.d.ts +7 -0
  70. package/dist-browser/numbl-core/interpreter/builtins/cell-struct.d.ts +5 -0
  71. package/dist-browser/numbl-core/interpreter/builtins/complex.d.ts +4 -0
  72. package/dist-browser/numbl-core/interpreter/builtins/datetime.d.ts +40 -0
  73. package/dist-browser/numbl-core/interpreter/builtins/dictionary.d.ts +15 -0
  74. package/dist-browser/numbl-core/interpreter/builtins/fft.d.ts +7 -0
  75. package/dist-browser/numbl-core/interpreter/builtins/gallery.d.ts +7 -0
  76. package/dist-browser/numbl-core/interpreter/builtins/geometry.d.ts +10 -0
  77. package/dist-browser/numbl-core/interpreter/builtins/graph.d.ts +29 -0
  78. package/dist-browser/numbl-core/interpreter/builtins/help-text.d.ts +5 -0
  79. package/dist-browser/numbl-core/interpreter/builtins/index.d.ts +39 -0
  80. package/dist-browser/numbl-core/interpreter/builtins/introspection.d.ts +6 -0
  81. package/dist-browser/numbl-core/interpreter/builtins/linear-algebra.d.ts +9 -0
  82. package/dist-browser/numbl-core/interpreter/builtins/logical.d.ts +9 -0
  83. package/dist-browser/numbl-core/interpreter/builtins/math.d.ts +4 -0
  84. package/dist-browser/numbl-core/interpreter/builtins/misc.d.ts +7 -0
  85. package/dist-browser/numbl-core/interpreter/builtins/numerical.d.ts +10 -0
  86. package/dist-browser/numbl-core/interpreter/builtins/predicates.d.ts +4 -0
  87. package/dist-browser/numbl-core/interpreter/builtins/prng.d.ts +4 -0
  88. package/dist-browser/numbl-core/interpreter/builtins/reductions.d.ts +6 -0
  89. package/dist-browser/numbl-core/interpreter/builtins/set-operations.d.ts +4 -0
  90. package/dist-browser/numbl-core/interpreter/builtins/sparse.d.ts +4 -0
  91. package/dist-browser/numbl-core/interpreter/builtins/special-math.d.ts +4 -0
  92. package/dist-browser/numbl-core/interpreter/builtins/string-extras.d.ts +5 -0
  93. package/dist-browser/numbl-core/interpreter/builtins/strings.d.ts +7 -0
  94. package/dist-browser/numbl-core/interpreter/builtins/time-system.d.ts +6 -0
  95. package/dist-browser/numbl-core/interpreter/builtins/type-constructors.d.ts +5 -0
  96. package/dist-browser/numbl-core/interpreter/builtins/types.d.ts +98 -0
  97. package/dist-browser/numbl-core/interpreter/builtins/utility.d.ts +4 -0
  98. package/dist-browser/numbl-core/interpreter/builtins/validation.d.ts +4 -0
  99. package/dist-browser/numbl-core/interpreter/interpreter.d.ts +199 -0
  100. package/dist-browser/numbl-core/interpreter/interpreterExec.d.ts +81 -0
  101. package/dist-browser/numbl-core/interpreter/interpreterFunctions.d.ts +62 -0
  102. package/dist-browser/numbl-core/interpreter/interpreterSpecialBuiltins.d.ts +35 -0
  103. package/dist-browser/numbl-core/interpreter/types.d.ts +114 -0
  104. package/dist-browser/numbl-core/jit/builtins/defs/_shared.d.ts +43 -0
  105. package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/_elemwise.d.ts +123 -0
  106. package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/minus.d.ts +2 -0
  107. package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/mpower.d.ts +12 -0
  108. package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/mrdivide.d.ts +5 -0
  109. package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/mtimes.d.ts +2 -0
  110. package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/plus.d.ts +2 -0
  111. package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/power.d.ts +30 -0
  112. package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/rdivide.d.ts +2 -0
  113. package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/times.d.ts +2 -0
  114. package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/uminus.d.ts +2 -0
  115. package/dist-browser/numbl-core/jit/builtins/defs/compare/_compare.d.ts +12 -0
  116. package/dist-browser/numbl-core/jit/builtins/defs/compare/eq.d.ts +2 -0
  117. package/dist-browser/numbl-core/jit/builtins/defs/compare/ge.d.ts +2 -0
  118. package/dist-browser/numbl-core/jit/builtins/defs/compare/gt.d.ts +2 -0
  119. package/dist-browser/numbl-core/jit/builtins/defs/compare/le.d.ts +2 -0
  120. package/dist-browser/numbl-core/jit/builtins/defs/compare/lt.d.ts +2 -0
  121. package/dist-browser/numbl-core/jit/builtins/defs/compare/ne.d.ts +2 -0
  122. package/dist-browser/numbl-core/jit/builtins/defs/diag/assert.d.ts +6 -0
  123. package/dist-browser/numbl-core/jit/builtins/defs/io/_format_args.d.ts +17 -0
  124. package/dist-browser/numbl-core/jit/builtins/defs/io/disp.d.ts +2 -0
  125. package/dist-browser/numbl-core/jit/builtins/defs/io/error.d.ts +2 -0
  126. package/dist-browser/numbl-core/jit/builtins/defs/io/fprintf.d.ts +2 -0
  127. package/dist-browser/numbl-core/jit/builtins/defs/io/sprintf.d.ts +2 -0
  128. package/dist-browser/numbl-core/jit/builtins/defs/io/warning.d.ts +15 -0
  129. package/dist-browser/numbl-core/jit/builtins/defs/logical/_shortcircuit.d.ts +30 -0
  130. package/dist-browser/numbl-core/jit/builtins/defs/logical/_unary_pred.d.ts +30 -0
  131. package/dist-browser/numbl-core/jit/builtins/defs/logical/and.d.ts +5 -0
  132. package/dist-browser/numbl-core/jit/builtins/defs/logical/andand.d.ts +1 -0
  133. package/dist-browser/numbl-core/jit/builtins/defs/logical/boolconst.d.ts +3 -0
  134. package/dist-browser/numbl-core/jit/builtins/defs/logical/classBuiltin.d.ts +21 -0
  135. package/dist-browser/numbl-core/jit/builtins/defs/logical/fieldnames.d.ts +15 -0
  136. package/dist-browser/numbl-core/jit/builtins/defs/logical/isa.d.ts +13 -0
  137. package/dist-browser/numbl-core/jit/builtins/defs/logical/iscell.d.ts +8 -0
  138. package/dist-browser/numbl-core/jit/builtins/defs/logical/isempty.d.ts +2 -0
  139. package/dist-browser/numbl-core/jit/builtins/defs/logical/isequal.d.ts +2 -0
  140. package/dist-browser/numbl-core/jit/builtins/defs/logical/isfield.d.ts +20 -0
  141. package/dist-browser/numbl-core/jit/builtins/defs/logical/isinf.d.ts +2 -0
  142. package/dist-browser/numbl-core/jit/builtins/defs/logical/isnan.d.ts +1 -0
  143. package/dist-browser/numbl-core/jit/builtins/defs/logical/isnumeric.d.ts +7 -0
  144. package/dist-browser/numbl-core/jit/builtins/defs/logical/isreal.d.ts +2 -0
  145. package/dist-browser/numbl-core/jit/builtins/defs/logical/isscalar.d.ts +20 -0
  146. package/dist-browser/numbl-core/jit/builtins/defs/logical/isstruct.d.ts +7 -0
  147. package/dist-browser/numbl-core/jit/builtins/defs/logical/logical.d.ts +1 -0
  148. package/dist-browser/numbl-core/jit/builtins/defs/logical/not.d.ts +15 -0
  149. package/dist-browser/numbl-core/jit/builtins/defs/logical/or.d.ts +11 -0
  150. package/dist-browser/numbl-core/jit/builtins/defs/logical/oror.d.ts +1 -0
  151. package/dist-browser/numbl-core/jit/builtins/defs/logical/strcmp.d.ts +21 -0
  152. package/dist-browser/numbl-core/jit/builtins/defs/logical/typequery.d.ts +10 -0
  153. package/dist-browser/numbl-core/jit/builtins/defs/logical/xor.d.ts +12 -0
  154. package/dist-browser/numbl-core/jit/builtins/defs/math/_complex_fold.d.ts +34 -0
  155. package/dist-browser/numbl-core/jit/builtins/defs/math/_unary_real.d.ts +51 -0
  156. package/dist-browser/numbl-core/jit/builtins/defs/math/abs.d.ts +7 -0
  157. package/dist-browser/numbl-core/jit/builtins/defs/math/angle.d.ts +7 -0
  158. package/dist-browser/numbl-core/jit/builtins/defs/math/asinh.d.ts +1 -0
  159. package/dist-browser/numbl-core/jit/builtins/defs/math/atan.d.ts +1 -0
  160. package/dist-browser/numbl-core/jit/builtins/defs/math/atan2.d.ts +3 -0
  161. package/dist-browser/numbl-core/jit/builtins/defs/math/besselh.d.ts +2 -0
  162. package/dist-browser/numbl-core/jit/builtins/defs/math/ceil.d.ts +4 -0
  163. package/dist-browser/numbl-core/jit/builtins/defs/math/conj.d.ts +7 -0
  164. package/dist-browser/numbl-core/jit/builtins/defs/math/constants.d.ts +7 -0
  165. package/dist-browser/numbl-core/jit/builtins/defs/math/cos.d.ts +1 -0
  166. package/dist-browser/numbl-core/jit/builtins/defs/math/cosh.d.ts +1 -0
  167. package/dist-browser/numbl-core/jit/builtins/defs/math/dot.d.ts +20 -0
  168. package/dist-browser/numbl-core/jit/builtins/defs/math/double.d.ts +28 -0
  169. package/dist-browser/numbl-core/jit/builtins/defs/math/exp.d.ts +1 -0
  170. package/dist-browser/numbl-core/jit/builtins/defs/math/fix.d.ts +4 -0
  171. package/dist-browser/numbl-core/jit/builtins/defs/math/floor.d.ts +4 -0
  172. package/dist-browser/numbl-core/jit/builtins/defs/math/hypot.d.ts +3 -0
  173. package/dist-browser/numbl-core/jit/builtins/defs/math/imag.d.ts +7 -0
  174. package/dist-browser/numbl-core/jit/builtins/defs/math/linspace.d.ts +6 -0
  175. package/dist-browser/numbl-core/jit/builtins/defs/math/log.d.ts +4 -0
  176. package/dist-browser/numbl-core/jit/builtins/defs/math/log10.d.ts +3 -0
  177. package/dist-browser/numbl-core/jit/builtins/defs/math/log2.d.ts +5 -0
  178. package/dist-browser/numbl-core/jit/builtins/defs/math/logspace.d.ts +8 -0
  179. package/dist-browser/numbl-core/jit/builtins/defs/math/mod.d.ts +1 -0
  180. package/dist-browser/numbl-core/jit/builtins/defs/math/norm.d.ts +2 -0
  181. package/dist-browser/numbl-core/jit/builtins/defs/math/rand.d.ts +2 -0
  182. package/dist-browser/numbl-core/jit/builtins/defs/math/real.d.ts +7 -0
  183. package/dist-browser/numbl-core/jit/builtins/defs/math/rem.d.ts +3 -0
  184. package/dist-browser/numbl-core/jit/builtins/defs/math/round.d.ts +1 -0
  185. package/dist-browser/numbl-core/jit/builtins/defs/math/sign.d.ts +5 -0
  186. package/dist-browser/numbl-core/jit/builtins/defs/math/sin.d.ts +1 -0
  187. package/dist-browser/numbl-core/jit/builtins/defs/math/sinh.d.ts +1 -0
  188. package/dist-browser/numbl-core/jit/builtins/defs/math/sqrt.d.ts +11 -0
  189. package/dist-browser/numbl-core/jit/builtins/defs/math/tan.d.ts +1 -0
  190. package/dist-browser/numbl-core/jit/builtins/defs/math/tanh.d.ts +1 -0
  191. package/dist-browser/numbl-core/jit/builtins/defs/math/uniquetol.d.ts +22 -0
  192. package/dist-browser/numbl-core/jit/builtins/defs/plot/dispatch.d.ts +6 -0
  193. package/dist-browser/numbl-core/jit/builtins/defs/reduction/_cumulative.d.ts +49 -0
  194. package/dist-browser/numbl-core/jit/builtins/defs/reduction/_shape.d.ts +126 -0
  195. package/dist-browser/numbl-core/jit/builtins/defs/reduction/_variance.d.ts +17 -0
  196. package/dist-browser/numbl-core/jit/builtins/defs/reduction/all.d.ts +1 -0
  197. package/dist-browser/numbl-core/jit/builtins/defs/reduction/any.d.ts +1 -0
  198. package/dist-browser/numbl-core/jit/builtins/defs/reduction/cummax.d.ts +1 -0
  199. package/dist-browser/numbl-core/jit/builtins/defs/reduction/cummin.d.ts +1 -0
  200. package/dist-browser/numbl-core/jit/builtins/defs/reduction/cumprod.d.ts +1 -0
  201. package/dist-browser/numbl-core/jit/builtins/defs/reduction/cumsum.d.ts +1 -0
  202. package/dist-browser/numbl-core/jit/builtins/defs/reduction/diff.d.ts +16 -0
  203. package/dist-browser/numbl-core/jit/builtins/defs/reduction/length.d.ts +2 -0
  204. package/dist-browser/numbl-core/jit/builtins/defs/reduction/max.d.ts +1 -0
  205. package/dist-browser/numbl-core/jit/builtins/defs/reduction/mean.d.ts +1 -0
  206. package/dist-browser/numbl-core/jit/builtins/defs/reduction/min.d.ts +1 -0
  207. package/dist-browser/numbl-core/jit/builtins/defs/reduction/numel.d.ts +2 -0
  208. package/dist-browser/numbl-core/jit/builtins/defs/reduction/prod.d.ts +1 -0
  209. package/dist-browser/numbl-core/jit/builtins/defs/reduction/std.d.ts +1 -0
  210. package/dist-browser/numbl-core/jit/builtins/defs/reduction/sum.d.ts +1 -0
  211. package/dist-browser/numbl-core/jit/builtins/defs/reduction/var.d.ts +1 -0
  212. package/dist-browser/numbl-core/jit/builtins/defs/shape/_construct.d.ts +67 -0
  213. package/dist-browser/numbl-core/jit/builtins/defs/shape/_triangular.d.ts +34 -0
  214. package/dist-browser/numbl-core/jit/builtins/defs/shape/cat.d.ts +33 -0
  215. package/dist-browser/numbl-core/jit/builtins/defs/shape/diag.d.ts +29 -0
  216. package/dist-browser/numbl-core/jit/builtins/defs/shape/eye.d.ts +5 -0
  217. package/dist-browser/numbl-core/jit/builtins/defs/shape/flip.d.ts +7 -0
  218. package/dist-browser/numbl-core/jit/builtins/defs/shape/meshgrid.d.ts +12 -0
  219. package/dist-browser/numbl-core/jit/builtins/defs/shape/ones.d.ts +1 -0
  220. package/dist-browser/numbl-core/jit/builtins/defs/shape/repmat.d.ts +37 -0
  221. package/dist-browser/numbl-core/jit/builtins/defs/shape/reshape.d.ts +39 -0
  222. package/dist-browser/numbl-core/jit/builtins/defs/shape/size.d.ts +20 -0
  223. package/dist-browser/numbl-core/jit/builtins/defs/shape/sort.d.ts +19 -0
  224. package/dist-browser/numbl-core/jit/builtins/defs/shape/transpose.d.ts +6 -0
  225. package/dist-browser/numbl-core/jit/builtins/defs/shape/tril.d.ts +16 -0
  226. package/dist-browser/numbl-core/jit/builtins/defs/shape/triu.d.ts +16 -0
  227. package/dist-browser/numbl-core/jit/builtins/defs/shape/zeros.d.ts +1 -0
  228. package/dist-browser/numbl-core/jit/builtins/defs/system/deal.d.ts +20 -0
  229. package/dist-browser/numbl-core/jit/builtins/defs/system/feval.d.ts +36 -0
  230. package/dist-browser/numbl-core/jit/builtins/defs/system/pathBuiltins.d.ts +4 -0
  231. package/dist-browser/numbl-core/jit/builtins/defs/system/tic.d.ts +8 -0
  232. package/dist-browser/numbl-core/jit/builtins/defs/system/toc.d.ts +5 -0
  233. package/dist-browser/numbl-core/jit/builtins/index.d.ts +16 -0
  234. package/dist-browser/numbl-core/jit/builtins/registry.d.ts +138 -0
  235. package/dist-browser/numbl-core/jit/builtins/runtime/cell/cell.d.ts +24 -0
  236. package/dist-browser/numbl-core/jit/builtins/runtime/indexing/loop_count.d.ts +1 -0
  237. package/dist-browser/numbl-core/jit/builtins/runtime/indexing/range_value.d.ts +1 -0
  238. package/dist-browser/numbl-core/jit/builtins/runtime/indexing/scalar_index.d.ts +11 -0
  239. package/dist-browser/numbl-core/jit/builtins/runtime/indexing/tensor_make_range.d.ts +5 -0
  240. package/dist-browser/numbl-core/jit/builtins/runtime/io/assert_fmt.d.ts +1 -0
  241. package/dist-browser/numbl-core/jit/builtins/runtime/io/disp_complex.d.ts +1 -0
  242. package/dist-browser/numbl-core/jit/builtins/runtime/io/disp_double.d.ts +1 -0
  243. package/dist-browser/numbl-core/jit/builtins/runtime/io/disp_struct.d.ts +1 -0
  244. package/dist-browser/numbl-core/jit/builtins/runtime/io/disp_tensor.d.ts +1 -0
  245. package/dist-browser/numbl-core/jit/builtins/runtime/io/disp_tensor_complex.d.ts +1 -0
  246. package/dist-browser/numbl-core/jit/builtins/runtime/io/error_fmt.d.ts +2 -0
  247. package/dist-browser/numbl-core/jit/builtins/runtime/io/format_complex.d.ts +1 -0
  248. package/dist-browser/numbl-core/jit/builtins/runtime/io/format_double.d.ts +1 -0
  249. package/dist-browser/numbl-core/jit/builtins/runtime/io/format_engine.d.ts +1 -0
  250. package/dist-browser/numbl-core/jit/builtins/runtime/io/fprintf.d.ts +1 -0
  251. package/dist-browser/numbl-core/jit/builtins/runtime/io/sprintf.d.ts +5 -0
  252. package/dist-browser/numbl-core/jit/builtins/runtime/io/warning_fmt.d.ts +2 -0
  253. package/dist-browser/numbl-core/jit/builtins/runtime/plot/plot_dispatch.d.ts +1 -0
  254. package/dist-browser/numbl-core/jit/builtins/runtime/snippets.c.gen.d.ts +4 -0
  255. package/dist-browser/numbl-core/jit/builtins/runtime/snippets.gen.d.ts +85 -0
  256. package/dist-browser/numbl-core/jit/builtins/runtime/system/cdiv.d.ts +4 -0
  257. package/dist-browser/numbl-core/jit/builtins/runtime/system/cscalar.d.ts +103 -0
  258. package/dist-browser/numbl-core/jit/builtins/runtime/system/deep_clone.d.ts +1 -0
  259. package/dist-browser/numbl-core/jit/builtins/runtime/system/isequal.d.ts +2 -0
  260. package/dist-browser/numbl-core/jit/builtins/runtime/system/tictoc.d.ts +5 -0
  261. package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor.d.ts +6 -0
  262. package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_alloc.d.ts +5 -0
  263. package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_alloc_complex.d.ts +6 -0
  264. package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_alloc_nd.d.ts +5 -0
  265. package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_alloc_nd_complex.d.ts +6 -0
  266. package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_copy_complex.d.ts +6 -0
  267. package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_from_matrix.d.ts +5 -0
  268. package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_from_matrix_complex.d.ts +6 -0
  269. package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_from_row.d.ts +5 -0
  270. package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_from_row_complex.d.ts +6 -0
  271. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_cat.d.ts +11 -0
  272. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_cumulative.d.ts +32 -0
  273. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_diag.d.ts +33 -0
  274. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_diff.d.ts +5 -0
  275. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_dot.d.ts +16 -0
  276. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_elemwise_complex.d.ts +90 -0
  277. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_elemwise_real.d.ts +75 -0
  278. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_elemwise_real_fn.d.ts +95 -0
  279. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_eye.d.ts +10 -0
  280. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_fill_nd.d.ts +11 -0
  281. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_fill_square.d.ts +5 -0
  282. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_flip.d.ts +11 -0
  283. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_imag_all_zero.d.ts +1 -0
  284. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_linspace.d.ts +5 -0
  285. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_logical_real.d.ts +10 -0
  286. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_logspace.d.ts +5 -0
  287. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_meshgrid.d.ts +29 -0
  288. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_mtimes_complex.d.ts +10 -0
  289. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_mtimes_real.d.ts +6 -0
  290. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_norm.d.ts +4 -0
  291. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_ones_nd.d.ts +5 -0
  292. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_ones_square.d.ts +5 -0
  293. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_predicate.d.ts +42 -0
  294. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_reduce_complex.d.ts +53 -0
  295. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_reduce_real.d.ts +42 -0
  296. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_repmat.d.ts +11 -0
  297. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_reshape_nd.d.ts +5 -0
  298. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_reshape_nd_complex.d.ts +6 -0
  299. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_size.d.ts +5 -0
  300. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_sort_real.d.ts +36 -0
  301. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_transpose.d.ts +5 -0
  302. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_transpose_complex.d.ts +6 -0
  303. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_triangular.d.ts +22 -0
  304. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_unary_complex_math.d.ts +128 -0
  305. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_unary_real_math.d.ts +95 -0
  306. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_uniquetol.d.ts +5 -0
  307. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_var.d.ts +12 -0
  308. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_zeros_nd.d.ts +5 -0
  309. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_zeros_square.d.ts +5 -0
  310. package/dist-browser/numbl-core/jit/builtins/runtime/text/strcmp.d.ts +2 -0
  311. package/dist-browser/numbl-core/jit/codegen/cFormat.d.ts +36 -0
  312. package/dist-browser/numbl-core/jit/codegen/cHelpers.d.ts +48 -0
  313. package/dist-browser/numbl-core/jit/codegen/emit.d.ts +55 -0
  314. package/dist-browser/numbl-core/jit/codegen/emitCellTypedef.d.ts +23 -0
  315. package/dist-browser/numbl-core/jit/codegen/emitExpr.d.ts +33 -0
  316. package/dist-browser/numbl-core/jit/codegen/emitIndex.d.ts +56 -0
  317. package/dist-browser/numbl-core/jit/codegen/emitJs.d.ts +64 -0
  318. package/dist-browser/numbl-core/jit/codegen/emitNamedTypedef.d.ts +58 -0
  319. package/dist-browser/numbl-core/jit/codegen/emitStmt.d.ts +76 -0
  320. package/dist-browser/numbl-core/jit/codegen/emitTensorConcat.d.ts +23 -0
  321. package/dist-browser/numbl-core/jit/codegen/emitTensorConcatJs.d.ts +16 -0
  322. package/dist-browser/numbl-core/jit/codegen/emitTensorFused.d.ts +77 -0
  323. package/dist-browser/numbl-core/jit/codegen/inlinePass.d.ts +66 -0
  324. package/dist-browser/numbl-core/jit/codegen/liveness.d.ts +58 -0
  325. package/dist-browser/numbl-core/jit/codegen/prettyIR.d.ts +24 -0
  326. package/dist-browser/numbl-core/jit/codegen/runtime.d.ts +152 -0
  327. package/dist-browser/numbl-core/jit/compileSpec.d.ts +84 -0
  328. package/dist-browser/numbl-core/jit/compileSpecC.d.ts +100 -0
  329. package/dist-browser/numbl-core/jit/index.d.ts +15 -0
  330. package/dist-browser/numbl-core/jit/lowering/classDefs.d.ts +109 -0
  331. package/dist-browser/numbl-core/jit/lowering/definiteAssign.d.ts +42 -0
  332. package/dist-browser/numbl-core/jit/lowering/errors.d.ts +35 -0
  333. package/dist-browser/numbl-core/jit/lowering/indexFold.d.ts +31 -0
  334. package/dist-browser/numbl-core/jit/lowering/indexResolve.d.ts +100 -0
  335. package/dist-browser/numbl-core/jit/lowering/ir.d.ts +584 -0
  336. package/dist-browser/numbl-core/jit/lowering/lower.d.ts +271 -0
  337. package/dist-browser/numbl-core/jit/lowering/lowerCellIndex.d.ts +41 -0
  338. package/dist-browser/numbl-core/jit/lowering/lowerCellLit.d.ts +19 -0
  339. package/dist-browser/numbl-core/jit/lowering/lowerClassConstructor.d.ts +55 -0
  340. package/dist-browser/numbl-core/jit/lowering/lowerFuncCall.d.ts +34 -0
  341. package/dist-browser/numbl-core/jit/lowering/lowerHandle.d.ts +57 -0
  342. package/dist-browser/numbl-core/jit/lowering/lowerIndexLoad.d.ts +16 -0
  343. package/dist-browser/numbl-core/jit/lowering/lowerIndexSlice.d.ts +29 -0
  344. package/dist-browser/numbl-core/jit/lowering/lowerIndexSliceStore.d.ts +19 -0
  345. package/dist-browser/numbl-core/jit/lowering/lowerIndexStore.d.ts +14 -0
  346. package/dist-browser/numbl-core/jit/lowering/lowerMethodCall.d.ts +45 -0
  347. package/dist-browser/numbl-core/jit/lowering/lowerMultiAssign.d.ts +36 -0
  348. package/dist-browser/numbl-core/jit/lowering/lowerTensorLit.d.ts +25 -0
  349. package/dist-browser/numbl-core/jit/lowering/rangeCount.d.ts +19 -0
  350. package/dist-browser/numbl-core/jit/lowering/specialize.d.ts +93 -0
  351. package/dist-browser/numbl-core/jit/lowering/types.d.ts +503 -0
  352. package/dist-browser/numbl-core/jit/lowering/walk.d.ts +17 -0
  353. package/dist-browser/numbl-core/jit/numbl/index.d.ts +30 -0
  354. package/dist-browser/numbl-core/jit/parser/astUtils.d.ts +43 -0
  355. package/dist-browser/numbl-core/jit/parser/index.d.ts +12 -0
  356. package/dist-browser/numbl-core/jit/parser/sourceLoc.d.ts +12 -0
  357. package/dist-browser/numbl-core/jit/runtime/context.d.ts +23 -0
  358. package/dist-browser/numbl-core/jit/runtime/inferType.d.ts +10 -0
  359. package/dist-browser/numbl-core/jit/runtime/value.d.ts +101 -0
  360. package/dist-browser/numbl-core/jit/workspace/driverPrologue.d.ts +59 -0
  361. package/dist-browser/numbl-core/jit/workspace/mtoc2UserFunctionLoader.d.ts +62 -0
  362. package/dist-browser/numbl-core/jit/workspace/workspace.d.ts +243 -0
  363. package/dist-browser/numbl-core/jitDeclineDiagnostics.d.ts +32 -0
  364. package/dist-browser/numbl-core/jitTypes.d.ts +94 -0
  365. package/dist-browser/numbl-core/jsUserFunctions.d.ts +61 -0
  366. package/dist-browser/numbl-core/lexer/helpers.d.ts +15 -0
  367. package/dist-browser/numbl-core/lexer/index.d.ts +4 -0
  368. package/dist-browser/numbl-core/lexer/keywords.d.ts +3 -0
  369. package/dist-browser/numbl-core/lexer/token-config.d.ts +94 -0
  370. package/dist-browser/numbl-core/lexer/tokenizer.d.ts +9 -0
  371. package/dist-browser/numbl-core/lexer/types.d.ts +80 -0
  372. package/dist-browser/numbl-core/lowering/classInfo.d.ts +53 -0
  373. package/dist-browser/numbl-core/lowering/constants.d.ts +4 -0
  374. package/dist-browser/numbl-core/lowering/errors.d.ts +17 -0
  375. package/dist-browser/numbl-core/lowering/index.d.ts +3 -0
  376. package/dist-browser/numbl-core/lowering/itemTypes.d.ts +87 -0
  377. package/dist-browser/numbl-core/lowering/loweringContext.d.ts +241 -0
  378. package/dist-browser/numbl-core/native/bridge-resolve.d.ts +14 -0
  379. package/dist-browser/numbl-core/native/geometry-bridge.d.ts +39 -0
  380. package/dist-browser/numbl-core/native/lapack-bridge.d.ts +482 -0
  381. package/dist-browser/numbl-core/native/qhull-browser.d.ts +15 -0
  382. package/dist-browser/numbl-core/native/qhull-node.d.ts +13 -0
  383. package/dist-browser/numbl-core/native/ts-lapack-bridge.d.ts +9 -0
  384. package/dist-browser/numbl-core/native/ts-lapack-eig-complex.d.ts +32 -0
  385. package/dist-browser/numbl-core/ops/bessel.d.ts +18 -0
  386. package/dist-browser/numbl-core/ops/comparison.d.ts +11 -0
  387. package/dist-browser/numbl-core/ops/complexBinaryElemwise.d.ts +10 -0
  388. package/dist-browser/numbl-core/ops/complexUnaryElemwise.d.ts +8 -0
  389. package/dist-browser/numbl-core/ops/dispatch.d.ts +26 -0
  390. package/dist-browser/numbl-core/ops/index.d.ts +8 -0
  391. package/dist-browser/numbl-core/ops/opCodes.d.ts +70 -0
  392. package/dist-browser/numbl-core/ops/realBinaryElemwise.d.ts +8 -0
  393. package/dist-browser/numbl-core/ops/realUnaryElemwise.d.ts +5 -0
  394. package/dist-browser/numbl-core/ops/reduce.d.ts +6 -0
  395. package/dist-browser/numbl-core/parser/ArgumentsParser.d.ts +33 -0
  396. package/dist-browser/numbl-core/parser/ClassParser.d.ts +21 -0
  397. package/dist-browser/numbl-core/parser/CommandParser.d.ts +31 -0
  398. package/dist-browser/numbl-core/parser/ControlFlowParser.d.ts +16 -0
  399. package/dist-browser/numbl-core/parser/ExpressionParser.d.ts +32 -0
  400. package/dist-browser/numbl-core/parser/FunctionParser.d.ts +10 -0
  401. package/dist-browser/numbl-core/parser/Parser.d.ts +17 -0
  402. package/dist-browser/numbl-core/parser/ParserBase.d.ts +35 -0
  403. package/dist-browser/numbl-core/parser/StatementParser.d.ts +13 -0
  404. package/dist-browser/numbl-core/parser/errors.d.ts +15 -0
  405. package/dist-browser/numbl-core/parser/index.d.ts +7 -0
  406. package/dist-browser/numbl-core/parser/types.d.ts +342 -0
  407. package/dist-browser/numbl-core/runtime/alloc.d.ts +12 -0
  408. package/dist-browser/numbl-core/runtime/axisCommand.d.ts +34 -0
  409. package/dist-browser/numbl-core/runtime/compare.d.ts +5 -0
  410. package/dist-browser/numbl-core/runtime/constructors.d.ts +39 -0
  411. package/dist-browser/numbl-core/runtime/convert.d.ts +10 -0
  412. package/dist-browser/numbl-core/runtime/cow.d.ts +33 -0
  413. package/dist-browser/numbl-core/runtime/display.d.ts +6 -0
  414. package/dist-browser/numbl-core/runtime/error.d.ts +78 -0
  415. package/dist-browser/numbl-core/runtime/index.d.ts +13 -0
  416. package/dist-browser/numbl-core/runtime/indexing.d.ts +28 -0
  417. package/dist-browser/numbl-core/runtime/plotBuiltinDispatch.d.ts +92 -0
  418. package/dist-browser/numbl-core/runtime/plotUtils.d.ts +336 -0
  419. package/dist-browser/numbl-core/runtime/refcount.d.ts +85 -0
  420. package/dist-browser/numbl-core/runtime/runtime.d.ts +354 -0
  421. package/dist-browser/numbl-core/runtime/runtimeDispatch.d.ts +27 -0
  422. package/dist-browser/numbl-core/runtime/runtimeHelpers.d.ts +31 -0
  423. package/dist-browser/numbl-core/runtime/runtimeIndexing.d.ts +28 -0
  424. package/dist-browser/numbl-core/runtime/runtimeMemberAccess.d.ts +26 -0
  425. package/dist-browser/numbl-core/runtime/runtimeOperators.d.ts +24 -0
  426. package/dist-browser/numbl-core/runtime/runtimePlot.d.ts +129 -0
  427. package/dist-browser/numbl-core/runtime/sentinels.d.ts +4 -0
  428. package/dist-browser/numbl-core/runtime/specialBuiltinNames.d.ts +2 -0
  429. package/dist-browser/numbl-core/runtime/specialBuiltins.d.ts +13 -0
  430. package/dist-browser/numbl-core/runtime/struct-access.d.ts +11 -0
  431. package/dist-browser/numbl-core/runtime/syncChannel.d.ts +1 -0
  432. package/dist-browser/numbl-core/runtime/tensor-construction.d.ts +10 -0
  433. package/dist-browser/numbl-core/runtime/types.d.ts +197 -0
  434. package/dist-browser/numbl-core/runtime/uihtmlSession.d.ts +40 -0
  435. package/dist-browser/numbl-core/runtime/utils.d.ts +19 -0
  436. package/dist-browser/numbl-core/stdlib-bundle.d.ts +3 -0
  437. package/dist-browser/numbl-core/systemAdapter.d.ts +23 -0
  438. package/dist-browser/numbl-core/version.d.ts +2 -0
  439. package/dist-browser/numbl-core/workspace/index.d.ts +4 -0
  440. package/dist-browser/numbl-core/workspace/types.d.ts +24 -0
  441. package/dist-browser/ts-lapack/src/BLAS/daxpy.d.ts +1 -0
  442. package/dist-browser/ts-lapack/src/BLAS/dcopy.d.ts +1 -0
  443. package/dist-browser/ts-lapack/src/BLAS/ddot.d.ts +1 -0
  444. package/dist-browser/ts-lapack/src/BLAS/dgemm.d.ts +1 -0
  445. package/dist-browser/ts-lapack/src/BLAS/dgemm_optimized.d.ts +1 -0
  446. package/dist-browser/ts-lapack/src/BLAS/dgemv.d.ts +1 -0
  447. package/dist-browser/ts-lapack/src/BLAS/dger.d.ts +1 -0
  448. package/dist-browser/ts-lapack/src/BLAS/dnrm2.d.ts +1 -0
  449. package/dist-browser/ts-lapack/src/BLAS/drot.d.ts +1 -0
  450. package/dist-browser/ts-lapack/src/BLAS/dscal.d.ts +1 -0
  451. package/dist-browser/ts-lapack/src/BLAS/dswap.d.ts +1 -0
  452. package/dist-browser/ts-lapack/src/BLAS/dtrmm.d.ts +1 -0
  453. package/dist-browser/ts-lapack/src/BLAS/dtrmv.d.ts +1 -0
  454. package/dist-browser/ts-lapack/src/BLAS/dtrsm.d.ts +1 -0
  455. package/dist-browser/ts-lapack/src/BLAS/idamax.d.ts +1 -0
  456. package/dist-browser/ts-lapack/src/SRC/dbdsqr.d.ts +10 -0
  457. package/dist-browser/ts-lapack/src/SRC/dgebak.d.ts +1 -0
  458. package/dist-browser/ts-lapack/src/SRC/dgebal.d.ts +5 -0
  459. package/dist-browser/ts-lapack/src/SRC/dgebd2.d.ts +1 -0
  460. package/dist-browser/ts-lapack/src/SRC/dgebrd.d.ts +1 -0
  461. package/dist-browser/ts-lapack/src/SRC/dgeev.d.ts +3 -0
  462. package/dist-browser/ts-lapack/src/SRC/dgehd2.d.ts +1 -0
  463. package/dist-browser/ts-lapack/src/SRC/dgehrd.d.ts +1 -0
  464. package/dist-browser/ts-lapack/src/SRC/dgelq2.d.ts +1 -0
  465. package/dist-browser/ts-lapack/src/SRC/dgelqf.d.ts +1 -0
  466. package/dist-browser/ts-lapack/src/SRC/dgeqr2.d.ts +1 -0
  467. package/dist-browser/ts-lapack/src/SRC/dgeqrf.d.ts +1 -0
  468. package/dist-browser/ts-lapack/src/SRC/dgeqrf_optimized.d.ts +1 -0
  469. package/dist-browser/ts-lapack/src/SRC/dgesvd.d.ts +28 -0
  470. package/dist-browser/ts-lapack/src/SRC/dgetrf.d.ts +1 -0
  471. package/dist-browser/ts-lapack/src/SRC/dgetrf2.d.ts +1 -0
  472. package/dist-browser/ts-lapack/src/SRC/dgetri.d.ts +1 -0
  473. package/dist-browser/ts-lapack/src/SRC/dhseqr.d.ts +32 -0
  474. package/dist-browser/ts-lapack/src/SRC/dlabrd.d.ts +1 -0
  475. package/dist-browser/ts-lapack/src/SRC/dlacpy.d.ts +18 -0
  476. package/dist-browser/ts-lapack/src/SRC/dladiv.d.ts +9 -0
  477. package/dist-browser/ts-lapack/src/SRC/dlaexc.d.ts +21 -0
  478. package/dist-browser/ts-lapack/src/SRC/dlahqr.d.ts +24 -0
  479. package/dist-browser/ts-lapack/src/SRC/dlahr2.d.ts +1 -0
  480. package/dist-browser/ts-lapack/src/SRC/dlaln2.d.ts +5 -0
  481. package/dist-browser/ts-lapack/src/SRC/dlamch.d.ts +1 -0
  482. package/dist-browser/ts-lapack/src/SRC/dlange.d.ts +1 -0
  483. package/dist-browser/ts-lapack/src/SRC/dlanv2.d.ts +12 -0
  484. package/dist-browser/ts-lapack/src/SRC/dlapy2.d.ts +1 -0
  485. package/dist-browser/ts-lapack/src/SRC/dlaqr1.d.ts +1 -0
  486. package/dist-browser/ts-lapack/src/SRC/dlaqr30.d.ts +81 -0
  487. package/dist-browser/ts-lapack/src/SRC/dlaqr5.d.ts +38 -0
  488. package/dist-browser/ts-lapack/src/SRC/dlarf.d.ts +18 -0
  489. package/dist-browser/ts-lapack/src/SRC/dlarf1f.d.ts +1 -0
  490. package/dist-browser/ts-lapack/src/SRC/dlarfb.d.ts +25 -0
  491. package/dist-browser/ts-lapack/src/SRC/dlarfg.d.ts +4 -0
  492. package/dist-browser/ts-lapack/src/SRC/dlarft.d.ts +20 -0
  493. package/dist-browser/ts-lapack/src/SRC/dlarfx.d.ts +17 -0
  494. package/dist-browser/ts-lapack/src/SRC/dlartg.d.ts +5 -0
  495. package/dist-browser/ts-lapack/src/SRC/dlas2.d.ts +4 -0
  496. package/dist-browser/ts-lapack/src/SRC/dlascl.d.ts +1 -0
  497. package/dist-browser/ts-lapack/src/SRC/dlaset.d.ts +19 -0
  498. package/dist-browser/ts-lapack/src/SRC/dlasr.d.ts +1 -0
  499. package/dist-browser/ts-lapack/src/SRC/dlassq.d.ts +18 -0
  500. package/dist-browser/ts-lapack/src/SRC/dlasv2.d.ts +8 -0
  501. package/dist-browser/ts-lapack/src/SRC/dlaswp.d.ts +1 -0
  502. package/dist-browser/ts-lapack/src/SRC/dlasy2.d.ts +5 -0
  503. package/dist-browser/ts-lapack/src/SRC/dorg2r.d.ts +1 -0
  504. package/dist-browser/ts-lapack/src/SRC/dorgbr.d.ts +1 -0
  505. package/dist-browser/ts-lapack/src/SRC/dorghr.d.ts +1 -0
  506. package/dist-browser/ts-lapack/src/SRC/dorgl2.d.ts +1 -0
  507. package/dist-browser/ts-lapack/src/SRC/dorglq.d.ts +1 -0
  508. package/dist-browser/ts-lapack/src/SRC/dorgqr.d.ts +1 -0
  509. package/dist-browser/ts-lapack/src/SRC/dorgqr_optimized.d.ts +1 -0
  510. package/dist-browser/ts-lapack/src/SRC/dorm2r.d.ts +1 -0
  511. package/dist-browser/ts-lapack/src/SRC/dormhr.d.ts +1 -0
  512. package/dist-browser/ts-lapack/src/SRC/dormqr.d.ts +1 -0
  513. package/dist-browser/ts-lapack/src/SRC/dpotf2.d.ts +1 -0
  514. package/dist-browser/ts-lapack/src/SRC/dtrevc3.d.ts +27 -0
  515. package/dist-browser/ts-lapack/src/SRC/dtrexc.d.ts +24 -0
  516. package/dist-browser/ts-lapack/src/SRC/dtrti2.d.ts +1 -0
  517. package/dist-browser/ts-lapack/src/SRC/dtrtri.d.ts +1 -0
  518. package/dist-browser/ts-lapack/src/utils/constants.d.ts +28 -0
  519. package/dist-browser/ts-lapack/src/utils/iladlc.d.ts +1 -0
  520. package/dist-browser/ts-lapack/src/utils/iladlr.d.ts +1 -0
  521. package/dist-browser/ts-lapack/src/utils/ilaenv.d.ts +1 -0
  522. package/dist-browser/ts-lapack/src/utils/xerbla.d.ts +1 -0
  523. package/dist-browser/vfs/BrowserFileIOAdapter.d.ts +60 -0
  524. package/dist-browser/vfs/BrowserSystemAdapter.d.ts +27 -0
  525. package/dist-browser/vfs/VirtualFileSystem.d.ts +66 -0
  526. package/dist-browser/vfs/syncVfsChanges.d.ts +23 -0
  527. package/dist-browser/vfs/unzipToFiles.d.ts +7 -0
  528. package/dist-cli/cli.js +1290 -197
  529. package/dist-lib/lib.js +1284 -197
  530. package/dist-lib/numbl-core/helpers/scanFormat.d.ts +11 -0
  531. package/dist-lib/numbl-core/jit/builtins/defs/logical/fieldnames.d.ts +2 -2
  532. package/dist-lib/numbl-core/runtime/constructors.d.ts +3 -1
  533. package/dist-lib/numbl-core/runtime/indexing.d.ts +3 -0
  534. package/dist-lib/numbl-core/runtime/runtime.d.ts +1 -0
  535. package/dist-lib/numbl-core/runtime/types.d.ts +15 -1
  536. package/dist-lib/numbl-core/runtime/utils.d.ts +3 -0
  537. package/dist-lib/numbl-core/version.d.ts +1 -1
  538. package/dist-lib/vfs/BrowserFileIOAdapter.d.ts +6 -0
  539. package/dist-site-viewer/assets/{index-C-wfkZK0.js → index-CT9HA1Pn.js} +318 -316
  540. package/dist-site-viewer/assets/numbl-worker-CYPflGmm.js +5246 -0
  541. package/dist-site-viewer/index.html +1 -1
  542. package/package.json +9 -3
  543. package/dist-site-viewer/assets/numbl-worker-Bnbz2rMQ.js +0 -5228
package/dist-lib/lib.js CHANGED
@@ -110,6 +110,7 @@ var isRuntimeStructArray = (value) => typeof value === "object" && value !== nul
110
110
  var isRuntimeClassInstanceArray = (value) => typeof value === "object" && value !== null && value.kind === "class_instance_array";
111
111
  var isRuntimeSparseMatrix = (value) => typeof value === "object" && value !== null && value.kind === "sparse_matrix";
112
112
  var isRuntimeDictionary = (value) => typeof value === "object" && value !== null && value.kind === "dictionary";
113
+ var isRuntimeStringArray = (value) => typeof value === "object" && value !== null && value.kind === "string_array";
113
114
  var kstr = (value) => {
114
115
  if (isRuntimeNumber(value)) return "number";
115
116
  if (isRuntimeLogical(value)) return "logical";
@@ -128,6 +129,7 @@ var kstr = (value) => {
128
129
  if (isRuntimeStructArray(value)) return "struct array";
129
130
  if (isRuntimeSparseMatrix(value)) return "sparse matrix";
130
131
  if (isRuntimeDictionary(value)) return "dictionary";
132
+ if (isRuntimeStringArray(value)) return "string array";
131
133
  return "unknown";
132
134
  };
133
135
  var RuntimeTensor = class extends Refcounted {
@@ -159,6 +161,24 @@ var RuntimeChar = class extends Refcounted {
159
161
  this.shape = shape;
160
162
  }
161
163
  };
164
+ var RuntimeStringArray = class extends Refcounted {
165
+ kind = "string_array";
166
+ /** Elements in column-major order (plain JS strings). */
167
+ data;
168
+ /** 2-D shape [rows, cols]; data.length === rows*cols. A 1x1 string is
169
+ * normally represented as a primitive JS string, not a 1x1 array —
170
+ * use stringArrayValue() to build results so scalars collapse. */
171
+ shape;
172
+ constructor(data, shape) {
173
+ super();
174
+ this.data = data;
175
+ this.shape = shape;
176
+ }
177
+ };
178
+ function stringArrayValue(data, shape) {
179
+ if (data.length === 1 && shape[0] === 1 && shape[1] === 1) return data[0];
180
+ return new RuntimeStringArray(data, shape);
181
+ }
162
182
  var RuntimeCell = class extends Refcounted {
163
183
  kind = "cell";
164
184
  data;
@@ -613,6 +633,29 @@ function sub2ind(shape, subs) {
613
633
  }
614
634
  return idx;
615
635
  }
636
+ function matlabNumToString(n) {
637
+ if (n === Infinity) return "Inf";
638
+ if (n === -Infinity) return "-Inf";
639
+ if (isNaN(n)) return "NaN";
640
+ if (n === 0) return "0";
641
+ if (Number.isInteger(n)) return String(n);
642
+ const prec = 5;
643
+ const exp2 = Math.floor(Math.log10(Math.abs(n)));
644
+ let s;
645
+ if (exp2 < -4 || exp2 >= prec) {
646
+ s = n.toExponential(prec - 1);
647
+ const ePos = s.indexOf("e");
648
+ let mantissa = s.slice(0, ePos);
649
+ const expPart0 = s.slice(ePos);
650
+ if (mantissa.includes(".")) mantissa = mantissa.replace(/\.?0+$/, "");
651
+ const expPart = expPart0.replace(/([eE][+-])(\d)$/, "$10$2");
652
+ s = mantissa + expPart;
653
+ } else {
654
+ s = n.toPrecision(prec);
655
+ if (s.includes(".")) s = s.replace(/\.?0+$/, "");
656
+ }
657
+ return s;
658
+ }
616
659
 
617
660
  // src/numbl-core/runtime/convert.ts
618
661
  function toNumber(v) {
@@ -689,6 +732,11 @@ function toString(v) {
689
732
  switch (v.kind) {
690
733
  case "char":
691
734
  return v.value;
735
+ case "string_array":
736
+ if (v.data.length === 1) return v.data[0];
737
+ throw new RuntimeError(
738
+ "Expected a scalar text value, got a string array"
739
+ );
692
740
  default:
693
741
  throw new RuntimeError(`Cannot convert ${kstr(v)} to string`);
694
742
  }
@@ -748,6 +796,15 @@ var valuesAreEqual = (a, b) => {
748
796
  }
749
797
  case "dictionary":
750
798
  return a === b;
799
+ case "string_array": {
800
+ const sb = b;
801
+ if (a.shape[0] !== sb.shape[0] || a.shape[1] !== sb.shape[1])
802
+ return false;
803
+ for (let i = 0; i < a.data.length; i++) {
804
+ if (a.data[i] !== sb.data[i]) return false;
805
+ }
806
+ return true;
807
+ }
751
808
  default:
752
809
  return false;
753
810
  }
@@ -800,7 +857,34 @@ function displayValue(v) {
800
857
  return formatDictionary(v);
801
858
  case "class_instance_array":
802
859
  return ` ${v.shape[0]}x${v.shape[1]} ${v.className} array`;
860
+ case "string_array":
861
+ return formatStringArray(v);
862
+ }
863
+ }
864
+ function formatStringArray(v) {
865
+ const [rows, cols] = v.shape;
866
+ if (v.data.length === 0) {
867
+ return ` ${rows}x${cols} empty string array`;
868
+ }
869
+ const quoted = v.data.map((s) => `"${s}"`);
870
+ const widths = [];
871
+ for (let c = 0; c < cols; c++) {
872
+ let w = 0;
873
+ for (let r = 0; r < rows; r++) {
874
+ w = Math.max(w, quoted[c * rows + r].length);
875
+ }
876
+ widths.push(w);
877
+ }
878
+ const lines = [];
879
+ for (let r = 0; r < rows; r++) {
880
+ const parts = [];
881
+ for (let c = 0; c < cols; c++) {
882
+ const q = quoted[c * rows + r];
883
+ parts.push(c === cols - 1 ? q : q.padEnd(widths[c]));
884
+ }
885
+ lines.push(" " + parts.join(" "));
803
886
  }
887
+ return lines.join("\n");
804
888
  }
805
889
  var formatStructArray = (v) => {
806
890
  const elements = v.elements;
@@ -1115,6 +1199,10 @@ var RTV = {
1115
1199
  string(value) {
1116
1200
  return value;
1117
1201
  },
1202
+ /** String array (does NOT collapse 1x1 — use stringArrayValue for that). */
1203
+ stringArray(data, shape) {
1204
+ return new RuntimeStringArray(data, shape);
1205
+ },
1118
1206
  char(value) {
1119
1207
  return new RuntimeChar(value);
1120
1208
  },
@@ -22719,6 +22807,28 @@ function coerceToConcatString(v) {
22719
22807
  return null;
22720
22808
  }
22721
22809
  function mAdd(a, b) {
22810
+ if (isRuntimeStringArray(a) || isRuntimeStringArray(b)) {
22811
+ const sa = isRuntimeStringArray(a) ? a : null;
22812
+ const sb = isRuntimeStringArray(b) ? b : null;
22813
+ if (sa && sb) {
22814
+ if (sa.shape[0] !== sb.shape[0] || sa.shape[1] !== sb.shape[1]) {
22815
+ throw new RuntimeError("Array dimensions must match for string plus");
22816
+ }
22817
+ return stringArrayValue(
22818
+ sa.data.map((s, i) => s + sb.data[i]),
22819
+ sa.shape
22820
+ );
22821
+ }
22822
+ const arr = sa ?? sb;
22823
+ const other = coerceToConcatString(sa ? b : a);
22824
+ if (other === null) {
22825
+ throw new RuntimeError("Cannot concatenate this value with a string");
22826
+ }
22827
+ return stringArrayValue(
22828
+ arr.data.map((s) => sa ? s + other : other + s),
22829
+ arr.shape
22830
+ );
22831
+ }
22722
22832
  if (isRuntimeString(a) || isRuntimeString(b)) {
22723
22833
  const aStr = coerceToConcatString(a);
22724
22834
  const bStr = coerceToConcatString(b);
@@ -23225,12 +23335,24 @@ function transposeClassInstanceArray(v) {
23225
23335
  }
23226
23336
  return new RuntimeClassInstanceArray(v.className, out, [c, r]);
23227
23337
  }
23338
+ function transposeStringArray(v) {
23339
+ const [r, c] = v.shape;
23340
+ const out = new Array(r * c);
23341
+ for (let i = 0; i < r; i++) {
23342
+ for (let j = 0; j < c; j++) {
23343
+ out[i * c + j] = v.data[j * r + i];
23344
+ }
23345
+ }
23346
+ return stringArrayValue(out, [c, r]);
23347
+ }
23228
23348
  function mTranspose(v) {
23229
23349
  if (isRuntimeSparseMatrix(v)) return sparseTranspose(v);
23230
23350
  if (isRuntimeComplexNumber(v)) return v;
23231
23351
  if (isRuntimeNumber(v) || isRuntimeLogical(v)) return v;
23232
23352
  if (isRuntimeCell(v)) return transposeCellArray(v);
23233
23353
  if (isRuntimeChar(v)) return v;
23354
+ if (isRuntimeString(v)) return v;
23355
+ if (isRuntimeStringArray(v)) return transposeStringArray(v);
23234
23356
  if (isRuntimeClassInstance(v)) return v;
23235
23357
  if (isRuntimeClassInstanceArray(v)) return transposeClassInstanceArray(v);
23236
23358
  if (!isRuntimeTensor(v))
@@ -23243,6 +23365,8 @@ function mConjugateTranspose(v) {
23243
23365
  if (isRuntimeNumber(v) || isRuntimeLogical(v)) return v;
23244
23366
  if (isRuntimeCell(v)) return transposeCellArray(v);
23245
23367
  if (isRuntimeChar(v)) return v;
23368
+ if (isRuntimeString(v)) return v;
23369
+ if (isRuntimeStringArray(v)) return transposeStringArray(v);
23246
23370
  if (isRuntimeClassInstance(v)) return v;
23247
23371
  if (isRuntimeClassInstanceArray(v)) return transposeClassInstanceArray(v);
23248
23372
  if (!isRuntimeTensor(v))
@@ -23255,7 +23379,38 @@ function asStringPair(a, b) {
23255
23379
  if (isRuntimeChar(a) && isRuntimeString(b)) return [a.value, b];
23256
23380
  return null;
23257
23381
  }
23382
+ function textOperandElems(v) {
23383
+ if (isRuntimeString(v)) return { data: [v], shape: [1, 1] };
23384
+ if (isRuntimeChar(v)) {
23385
+ const rows = v.shape ? v.shape[0] : 1;
23386
+ if (rows > 1) return null;
23387
+ return { data: [v.value], shape: [1, 1] };
23388
+ }
23389
+ if (isRuntimeStringArray(v)) return { data: v.data, shape: v.shape };
23390
+ return null;
23391
+ }
23258
23392
  function stringComparisonOp(a, b, op) {
23393
+ if (isRuntimeStringArray(a) || isRuntimeStringArray(b)) {
23394
+ const ta = textOperandElems(a);
23395
+ const tb = textOperandElems(b);
23396
+ if (ta === null || tb === null) return null;
23397
+ const aScalar = ta.data.length === 1 && ta.shape[0] * ta.shape[1] === 1;
23398
+ const bScalar = tb.data.length === 1 && tb.shape[0] * tb.shape[1] === 1;
23399
+ if (!aScalar && !bScalar && (ta.shape[0] !== tb.shape[0] || ta.shape[1] !== tb.shape[1])) {
23400
+ throw new RuntimeError("Array dimensions must match for comparison");
23401
+ }
23402
+ const shape = aScalar ? tb.shape : ta.shape;
23403
+ const n = aScalar ? tb.data.length : ta.data.length;
23404
+ const out = allocFloat64Array(n);
23405
+ for (let i = 0; i < n; i++) {
23406
+ const x = aScalar ? ta.data[0] : ta.data[i];
23407
+ const y = bScalar ? tb.data[0] : tb.data[i];
23408
+ out[i] = op(x, y) ? 1 : 0;
23409
+ }
23410
+ const t = RTV.tensor(out, [shape[0], shape[1]]);
23411
+ t._isLogical = true;
23412
+ return t;
23413
+ }
23259
23414
  const pair = asStringPair(a, b);
23260
23415
  if (pair === null) return null;
23261
23416
  return RTV.logical(op(pair[0], pair[1]));
@@ -24638,6 +24793,68 @@ function indexIntoChar(base, indices) {
24638
24793
  }
24639
24794
  throw new RuntimeError("Char indexing supports 1 or 2 dimensions");
24640
24795
  }
24796
+ function stringArraySubscript(idx, extent) {
24797
+ if (isColonIndex(idx)) {
24798
+ return Array.from({ length: extent }, (_, i) => i);
24799
+ }
24800
+ if (isRuntimeTensor(idx)) {
24801
+ if (idx._isLogical) {
24802
+ const out = [];
24803
+ for (let i = 0; i < idx.data.length; i++)
24804
+ if (idx.data[i] !== 0) out.push(i);
24805
+ return out;
24806
+ }
24807
+ return Array.from(idx.data, (v) => Math.round(v) - 1);
24808
+ }
24809
+ if (isRuntimeLogical(idx)) return idx ? [0] : [];
24810
+ return [Math.round(toNumber(idx)) - 1];
24811
+ }
24812
+ function indexIntoStringArray(base, indices) {
24813
+ const [rows, cols] = base.shape;
24814
+ const total = base.data.length;
24815
+ if (indices.length === 2) {
24816
+ const ri = stringArraySubscript(indices[0], rows);
24817
+ const ci = stringArraySubscript(indices[1], cols);
24818
+ const out2 = [];
24819
+ for (const c of ci) {
24820
+ if (c < 0 || c >= cols)
24821
+ throw new RuntimeError("Index exceeds array bounds");
24822
+ for (const r of ri) {
24823
+ if (r < 0 || r >= rows)
24824
+ throw new RuntimeError("Index exceeds array bounds");
24825
+ out2.push(base.data[c * rows + r]);
24826
+ }
24827
+ }
24828
+ return stringArrayValue(out2, [ri.length, ci.length]);
24829
+ }
24830
+ if (indices.length !== 1) {
24831
+ throw new RuntimeError("String array indexing supports 1 or 2 subscripts");
24832
+ }
24833
+ const idx = indices[0];
24834
+ if (isColonIndex(idx)) {
24835
+ return stringArrayValue(base.data.slice(), [total, 1]);
24836
+ }
24837
+ const linear = stringArraySubscript(idx, total);
24838
+ const out = [];
24839
+ for (const i of linear) {
24840
+ if (i < 0 || i >= total)
24841
+ throw new RuntimeError("Index exceeds array bounds");
24842
+ out.push(base.data[i]);
24843
+ }
24844
+ let shape;
24845
+ if (rows === 1 || cols === 1) {
24846
+ shape = rows === 1 ? [1, out.length] : [out.length, 1];
24847
+ } else if (isRuntimeTensor(idx) && !idx._isLogical) {
24848
+ const is = idx.shape;
24849
+ const im = is.length >= 2 ? is[0] : 1;
24850
+ shape = [im, out.length / (im || 1)];
24851
+ } else if (isRuntimeTensor(idx) && idx._isLogical) {
24852
+ shape = [out.length, 1];
24853
+ } else {
24854
+ shape = [1, out.length];
24855
+ }
24856
+ return stringArrayValue(out, shape);
24857
+ }
24641
24858
  function indexIntoLogical(base, indices) {
24642
24859
  if (indices.length === 1) {
24643
24860
  const idx = indices[0];
@@ -24768,6 +24985,9 @@ function indexIntoRTValue(base, indices) {
24768
24985
  return base;
24769
24986
  }
24770
24987
  }
24988
+ if (isRuntimeStringArray(base)) {
24989
+ return indexIntoStringArray(base, indices);
24990
+ }
24771
24991
  if (isRuntimeLogical(base)) {
24772
24992
  return indexIntoLogical(base, indices);
24773
24993
  }
@@ -25589,26 +25809,18 @@ function horzcat(...values) {
25589
25809
  if (values.some((v) => isRuntimeCell(v))) {
25590
25810
  return cellCatAlongDim(values, 1);
25591
25811
  }
25812
+ if (values.some((v) => isRuntimeString(v) || isRuntimeStringArray(v))) {
25813
+ return stringCat(values, 1);
25814
+ }
25592
25815
  if (values.some((v) => isRuntimeChar(v))) {
25593
25816
  let result = "";
25594
25817
  for (const v of values) {
25595
25818
  if (isRuntimeChar(v)) result += v.value;
25596
- else if (isRuntimeString(v)) result += v;
25597
25819
  else if (isRuntimeNumber(v)) result += String.fromCharCode(Math.round(v));
25598
25820
  else throw new RuntimeError(`Cannot concatenate ${kstr(v)} into char`);
25599
25821
  }
25600
25822
  return RTV.char(result);
25601
25823
  }
25602
- if (values.some((v) => isRuntimeString(v) || isRuntimeChar(v))) {
25603
- let result = "";
25604
- for (const v of values) {
25605
- if (isRuntimeString(v)) result += v;
25606
- else if (isRuntimeChar(v)) result += v.value;
25607
- else if (isRuntimeNumber(v)) result += String(v);
25608
- else throw new RuntimeError(`Cannot concatenate ${v} into string`);
25609
- }
25610
- return RTV.string(result);
25611
- }
25612
25824
  if (values.some((v) => isRuntimeStruct(v) || isRuntimeStructArray(v))) {
25613
25825
  return structCat(values);
25614
25826
  }
@@ -25623,6 +25835,9 @@ function vertcat(...values) {
25623
25835
  if (values.some((v) => isRuntimeCell(v))) {
25624
25836
  return cellCatAlongDim(values, 0);
25625
25837
  }
25838
+ if (values.some((v) => isRuntimeString(v) || isRuntimeStringArray(v))) {
25839
+ return stringCat(values, 0);
25840
+ }
25626
25841
  if (values.some((v) => isRuntimeChar(v))) {
25627
25842
  return vertcatChars(values);
25628
25843
  }
@@ -25631,6 +25846,86 @@ function vertcat(...values) {
25631
25846
  }
25632
25847
  return catAlongDim(values, 0);
25633
25848
  }
25849
+ function toStringBlock(v) {
25850
+ if (isRuntimeString(v)) return { data: [v], rows: 1, cols: 1 };
25851
+ if (isRuntimeStringArray(v)) {
25852
+ if (v.data.length === 0) return null;
25853
+ return { data: v.data.slice(), rows: v.shape[0], cols: v.shape[1] };
25854
+ }
25855
+ if (isRuntimeChar(v)) {
25856
+ const rows = v.shape ? v.shape[0] : 1;
25857
+ const width = v.shape ? v.shape[1] : v.value.length;
25858
+ if (rows <= 1) return { data: [v.value], rows: 1, cols: 1 };
25859
+ const out = [];
25860
+ for (let r = 0; r < rows; r++) {
25861
+ out.push(v.value.slice(r * width, (r + 1) * width));
25862
+ }
25863
+ return { data: out, rows, cols: 1 };
25864
+ }
25865
+ if (isRuntimeNumber(v)) {
25866
+ return { data: [matlabNumToString(v)], rows: 1, cols: 1 };
25867
+ }
25868
+ if (isRuntimeLogical(v)) {
25869
+ return { data: [v ? "true" : "false"], rows: 1, cols: 1 };
25870
+ }
25871
+ if (isRuntimeTensor(v)) {
25872
+ if (v.data.length === 0) return null;
25873
+ const rows = v.shape.length >= 2 ? v.shape[0] : 1;
25874
+ const cols = v.data.length / (rows || 1);
25875
+ const out = [];
25876
+ for (let i = 0; i < v.data.length; i++) {
25877
+ out.push(
25878
+ v._isLogical ? v.data[i] ? "true" : "false" : matlabNumToString(v.data[i])
25879
+ );
25880
+ }
25881
+ return { data: out, rows, cols };
25882
+ }
25883
+ throw new RuntimeError(`Cannot concatenate ${kstr(v)} into string array`);
25884
+ }
25885
+ function stringCat(values, dim) {
25886
+ const blocks = [];
25887
+ for (const v of values) {
25888
+ const b = toStringBlock(v);
25889
+ if (b) blocks.push(b);
25890
+ }
25891
+ if (blocks.length === 0) return RTV.stringArray([], [0, 0]);
25892
+ if (dim === 1) {
25893
+ const rows2 = blocks[0].rows;
25894
+ let cols2 = 0;
25895
+ for (const b of blocks) {
25896
+ if (b.rows !== rows2) {
25897
+ throw new RuntimeError(
25898
+ "Dimensions of arrays being concatenated are not consistent"
25899
+ );
25900
+ }
25901
+ cols2 += b.cols;
25902
+ }
25903
+ const data2 = [];
25904
+ for (const b of blocks) data2.push(...b.data);
25905
+ return stringArrayValue(data2, [rows2, cols2]);
25906
+ }
25907
+ const cols = blocks[0].cols;
25908
+ let rows = 0;
25909
+ for (const b of blocks) {
25910
+ if (b.cols !== cols) {
25911
+ throw new RuntimeError(
25912
+ "Dimensions of arrays being concatenated are not consistent"
25913
+ );
25914
+ }
25915
+ rows += b.rows;
25916
+ }
25917
+ const data = new Array(rows * cols);
25918
+ let rOff = 0;
25919
+ for (const b of blocks) {
25920
+ for (let c = 0; c < cols; c++) {
25921
+ for (let r = 0; r < b.rows; r++) {
25922
+ data[c * rows + rOff + r] = b.data[c * b.rows + r];
25923
+ }
25924
+ }
25925
+ rOff += b.rows;
25926
+ }
25927
+ return stringArrayValue(data, [rows, cols]);
25928
+ }
25634
25929
  function vertcatChars(values) {
25635
25930
  let cols = null;
25636
25931
  let totalRows = 0;
@@ -29860,9 +30155,9 @@ var ExpressionParser = class extends ParserBase {
29860
30155
  if (this.consume(50 /* LParen */)) {
29861
30156
  const args = [];
29862
30157
  if (!this.consume(51 /* RParen */)) {
29863
- args.push(this.parseExpr());
30158
+ this.parseFuncArg(args);
29864
30159
  while (this.consume(47 /* Comma */)) {
29865
- args.push(this.parseExpr());
30160
+ this.parseFuncArg(args);
29866
30161
  }
29867
30162
  if (!this.consume(51 /* RParen */)) {
29868
30163
  throw this.error("expected ')' after method arguments");
@@ -29891,9 +30186,9 @@ var ExpressionParser = class extends ParserBase {
29891
30186
  }
29892
30187
  const args = [];
29893
30188
  if (!this.consume(51 /* RParen */)) {
29894
- args.push(this.parseExpr());
30189
+ this.parseFuncArg(args);
29895
30190
  while (this.consume(47 /* Comma */)) {
29896
- args.push(this.parseExpr());
30191
+ this.parseFuncArg(args);
29897
30192
  }
29898
30193
  if (!this.consume(51 /* RParen */)) {
29899
30194
  throw this.error("expected ')' after super call arguments");
@@ -30740,13 +31035,8 @@ var FunctionParser = class extends ArgumentsParser {
30740
31035
  }
30741
31036
  }
30742
31037
  const vararginIdx = params.indexOf("varargin");
30743
- if (vararginIdx !== -1) {
30744
- if (vararginIdx !== params.length - 1) {
30745
- throw this.error("'varargin' must be the last input parameter");
30746
- }
30747
- if (params.filter((p2) => p2 === "varargin").length > 1) {
30748
- throw this.error("'varargin' cannot appear more than once");
30749
- }
31038
+ if (vararginIdx !== -1 && params.filter((p2) => p2 === "varargin").length > 1) {
31039
+ throw this.error("'varargin' cannot appear more than once");
30750
31040
  }
30751
31041
  const varargoutIdx = outputs.indexOf("varargout");
30752
31042
  if (varargoutIdx !== -1) {
@@ -30758,6 +31048,22 @@ var FunctionParser = class extends ArgumentsParser {
30758
31048
  }
30759
31049
  }
30760
31050
  const argumentsBlocks = this.parseArgumentsBlocks();
31051
+ if (vararginIdx !== -1 && vararginIdx !== params.length - 1) {
31052
+ const nvBases = /* @__PURE__ */ new Set();
31053
+ for (const block of argumentsBlocks) {
31054
+ if (block.kind === "Output" || block.kind === "OutputRepeating")
31055
+ continue;
31056
+ for (const e of block.entries) {
31057
+ const dot2 = e.name.indexOf(".");
31058
+ if (dot2 >= 0) nvBases.add(e.name.slice(0, dot2));
31059
+ }
31060
+ }
31061
+ for (const p2 of params.slice(vararginIdx + 1)) {
31062
+ if (!nvBases.has(p2)) {
31063
+ throw this.error("'varargin' must be the last input parameter");
31064
+ }
31065
+ }
31066
+ }
30761
31067
  const body = this.parseBlock((t) => t === 15 /* End */);
30762
31068
  if (!this.consume(15 /* End */)) {
30763
31069
  throw this.error("expected 'end'");
@@ -32170,6 +32476,16 @@ function forIter(v) {
32170
32476
  if (isRuntimeChar(mv)) {
32171
32477
  return Array.from(mv.value).map((c) => RTV.char(c));
32172
32478
  }
32479
+ if (isRuntimeStringArray(mv)) {
32480
+ const [rows, cols] = mv.shape;
32481
+ const out = [];
32482
+ for (let c = 0; c < cols; c++) {
32483
+ out.push(
32484
+ stringArrayValue(mv.data.slice(c * rows, (c + 1) * rows), [rows, 1])
32485
+ );
32486
+ }
32487
+ return out;
32488
+ }
32173
32489
  return [v];
32174
32490
  }
32175
32491
  function emptyTensor() {
@@ -34601,6 +34917,13 @@ function valuesEqualSimple(a, b) {
34601
34917
  }
34602
34918
  return true;
34603
34919
  }
34920
+ if (isRuntimeStringArray(a) && isRuntimeStringArray(b)) {
34921
+ if (a.shape[0] !== b.shape[0] || a.shape[1] !== b.shape[1]) return false;
34922
+ for (let i = 0; i < a.data.length; i++) {
34923
+ if (a.data[i] !== b.data[i]) return false;
34924
+ }
34925
+ return true;
34926
+ }
34604
34927
  return false;
34605
34928
  }
34606
34929
  function textValue(v) {
@@ -34873,6 +35196,7 @@ function getShape(v) {
34873
35196
  if (isRuntimeCell(v)) return v.shape;
34874
35197
  if (isRuntimeStructArray(v)) return [1, v.elements.length];
34875
35198
  if (isRuntimeClassInstanceArray(v)) return [...v.shape];
35199
+ if (isRuntimeStringArray(v)) return [...v.shape];
34876
35200
  return [1, 1];
34877
35201
  }
34878
35202
  defineBuiltin({
@@ -34928,7 +35252,11 @@ defineBuiltin({
34928
35252
  });
34929
35253
  defineBuiltin({
34930
35254
  name: "isstring",
34931
- cases: [anyToLogicalCase((args) => isRuntimeString(args[0]))]
35255
+ cases: [
35256
+ anyToLogicalCase(
35257
+ (args) => isRuntimeString(args[0]) || isRuntimeStringArray(args[0])
35258
+ )
35259
+ ]
34932
35260
  });
34933
35261
  var MATLAB_KEYWORDS = /* @__PURE__ */ new Set([
34934
35262
  "break",
@@ -35111,6 +35439,7 @@ defineBuiltin({
35111
35439
  if (isRuntimeString(v)) return false;
35112
35440
  if (isRuntimeStructArray(v)) return v.elements.length === 0;
35113
35441
  if (isRuntimeClassInstanceArray(v)) return v.elements.length === 0;
35442
+ if (isRuntimeStringArray(v)) return v.data.length === 0;
35114
35443
  return false;
35115
35444
  })
35116
35445
  ]
@@ -35165,6 +35494,7 @@ defineBuiltin({
35165
35494
  if (isRuntimeString(v)) return 1;
35166
35495
  if (isRuntimeStructArray(v)) return v.elements.length;
35167
35496
  if (isRuntimeClassInstanceArray(v)) return v.elements.length;
35497
+ if (isRuntimeStringArray(v)) return v.data.length;
35168
35498
  return 1;
35169
35499
  }
35170
35500
  }
@@ -35195,6 +35525,8 @@ defineBuiltin({
35195
35525
  if (isRuntimeStructArray(v)) return v.elements.length;
35196
35526
  if (isRuntimeClassInstanceArray(v))
35197
35527
  return v.elements.length === 0 ? 0 : Math.max(...v.shape);
35528
+ if (isRuntimeStringArray(v))
35529
+ return v.data.length === 0 ? 0 : Math.max(...v.shape);
35198
35530
  return 1;
35199
35531
  }
35200
35532
  }
@@ -35322,6 +35654,7 @@ defineBuiltin({
35322
35654
  return mkChar(v._isLogical ? "logical" : "double");
35323
35655
  if (isRuntimeSparseMatrix(v)) return mkChar("double");
35324
35656
  if (isRuntimeString(v)) return mkChar("string");
35657
+ if (isRuntimeStringArray(v)) return mkChar("string");
35325
35658
  if (isRuntimeChar(v)) return mkChar("char");
35326
35659
  if (isRuntimeStruct(v) || isRuntimeStructArray(v))
35327
35660
  return mkChar("struct");
@@ -35372,7 +35705,7 @@ function fieldnamesApply(args) {
35372
35705
  if (isRuntimeStructArray(v)) {
35373
35706
  const names2 = v.fieldNames;
35374
35707
  return RTV.cell(
35375
- names2.map((n) => RTV.string(n)),
35708
+ names2.map((n) => RTV.char(n)),
35376
35709
  [names2.length, 1]
35377
35710
  );
35378
35711
  }
@@ -35380,7 +35713,7 @@ function fieldnamesApply(args) {
35380
35713
  throw new RuntimeError("fieldnames: argument must be a struct");
35381
35714
  const names = [...v.fields.keys()];
35382
35715
  return RTV.cell(
35383
- names.map((n) => RTV.string(n)),
35716
+ names.map((n) => RTV.char(n)),
35384
35717
  [names.length, 1]
35385
35718
  );
35386
35719
  }
@@ -36457,6 +36790,87 @@ defineBuiltin({
36457
36790
  ]
36458
36791
  });
36459
36792
 
36793
+ // src/numbl-core/helpers/scanFormat.ts
36794
+ function scanFormat(str, fmt, maxCount) {
36795
+ const results = [];
36796
+ let strPos = 0;
36797
+ let fmtPos = 0;
36798
+ let matchFailure = false;
36799
+ while (fmtPos < fmt.length && strPos < str.length && results.length < maxCount) {
36800
+ if (fmt[fmtPos] === "%") {
36801
+ fmtPos++;
36802
+ if (fmtPos >= fmt.length) break;
36803
+ while (fmtPos < fmt.length && /[\d.]/.test(fmt[fmtPos])) fmtPos++;
36804
+ if (fmtPos >= fmt.length) break;
36805
+ const spec = fmt[fmtPos];
36806
+ fmtPos++;
36807
+ if (spec !== "c" && spec !== "s") {
36808
+ while (strPos < str.length && /\s/.test(str[strPos])) strPos++;
36809
+ }
36810
+ if (spec === "d" || spec === "i" || spec === "u") {
36811
+ const m = str.slice(strPos).match(/^[+-]?\d+/);
36812
+ if (!m) {
36813
+ matchFailure = true;
36814
+ break;
36815
+ }
36816
+ results.push(parseInt(m[0], 10));
36817
+ strPos += m[0].length;
36818
+ } else if (spec === "f" || spec === "e" || spec === "g") {
36819
+ const m = str.slice(strPos).match(/^[+-]?(\d+\.?\d*|\.\d+)([eE][+-]?\d+)?/);
36820
+ if (!m) {
36821
+ matchFailure = true;
36822
+ break;
36823
+ }
36824
+ results.push(parseFloat(m[0]));
36825
+ strPos += m[0].length;
36826
+ } else if (spec === "x") {
36827
+ const m = str.slice(strPos).match(/^[+-]?[0-9a-fA-F]+/);
36828
+ if (!m) {
36829
+ matchFailure = true;
36830
+ break;
36831
+ }
36832
+ results.push(parseInt(m[0], 16));
36833
+ strPos += m[0].length;
36834
+ } else if (spec === "o") {
36835
+ const m = str.slice(strPos).match(/^[+-]?[0-7]+/);
36836
+ if (!m) {
36837
+ matchFailure = true;
36838
+ break;
36839
+ }
36840
+ results.push(parseInt(m[0], 8));
36841
+ strPos += m[0].length;
36842
+ } else if (spec === "c") {
36843
+ results.push(str.charCodeAt(strPos));
36844
+ strPos++;
36845
+ } else if (spec === "s") {
36846
+ const m = str.slice(strPos).match(/^\S+/);
36847
+ if (!m) {
36848
+ matchFailure = true;
36849
+ break;
36850
+ }
36851
+ for (let ci = 0; ci < m[0].length && results.length < maxCount; ci++) {
36852
+ results.push(m[0].charCodeAt(ci));
36853
+ }
36854
+ strPos += m[0].length;
36855
+ }
36856
+ } else if (/\s/.test(fmt[fmtPos])) {
36857
+ fmtPos++;
36858
+ while (strPos < str.length && /\s/.test(str[strPos])) strPos++;
36859
+ } else {
36860
+ if (str[strPos] !== fmt[fmtPos]) {
36861
+ matchFailure = true;
36862
+ break;
36863
+ }
36864
+ strPos++;
36865
+ fmtPos++;
36866
+ }
36867
+ if (fmtPos >= fmt.length && results.length < maxCount && strPos < str.length) {
36868
+ fmtPos = 0;
36869
+ }
36870
+ }
36871
+ return { results, consumed: strPos, matchFailure };
36872
+ }
36873
+
36460
36874
  // src/numbl-core/interpreter/builtins/strings.ts
36461
36875
  function isTextType(t) {
36462
36876
  return t.kind === "char" || t.kind === "string";
@@ -36481,6 +36895,9 @@ function applyTextFn(v, fn) {
36481
36895
  return RTV.char(fn(v.value));
36482
36896
  }
36483
36897
  if (isRuntimeString(v)) return RTV.string(fn(toString(v)));
36898
+ if (isRuntimeStringArray(v)) {
36899
+ return RTV.stringArray(v.data.map(fn), [v.shape[0], v.shape[1]]);
36900
+ }
36484
36901
  return v;
36485
36902
  }
36486
36903
  function textPreserveResolve(fn) {
@@ -36493,6 +36910,16 @@ function textPreserveResolve(fn) {
36493
36910
  apply: (args) => applyTextFn(args[0], fn)
36494
36911
  };
36495
36912
  }
36913
+ if (t.kind === "unknown") {
36914
+ return {
36915
+ outputTypes: [{ kind: "unknown" }],
36916
+ apply: (args) => {
36917
+ if (!isRuntimeStringArray(args[0]))
36918
+ throw new RuntimeError("Expected a text input");
36919
+ return applyTextFn(args[0], fn);
36920
+ }
36921
+ };
36922
+ }
36496
36923
  const out = preserveTextType(t);
36497
36924
  if (!out) return null;
36498
36925
  return {
@@ -36582,17 +37009,14 @@ registerIBuiltin({
36582
37009
  name: "erase",
36583
37010
  resolve: (argTypes) => {
36584
37011
  if (argTypes.length !== 2) return null;
36585
- const out = preserveTextType(argTypes[0]);
37012
+ const out = argTypes[0].kind === "unknown" ? { kind: "unknown" } : preserveTextType(argTypes[0]);
36586
37013
  if (!out) return null;
36587
37014
  if (!isTextType(argTypes[1])) return null;
36588
37015
  return {
36589
37016
  outputTypes: [out],
36590
37017
  apply: (args) => {
36591
- const v = args[0];
36592
- const s = toString(v);
36593
37018
  const pat = toString(args[1]);
36594
- const result = s.split(pat).join("");
36595
- return isRuntimeChar(v) ? RTV.char(result) : RTV.string(result);
37019
+ return applyTextFn(args[0], (s) => s.split(pat).join(""));
36596
37020
  }
36597
37021
  };
36598
37022
  }
@@ -36600,18 +37024,15 @@ registerIBuiltin({
36600
37024
  function strreplaceResolve() {
36601
37025
  return (argTypes) => {
36602
37026
  if (argTypes.length !== 3) return null;
36603
- const out = preserveTextType(argTypes[0]);
37027
+ const out = argTypes[0].kind === "unknown" || argTypes[0].kind === "cell" ? { kind: argTypes[0].kind } : preserveTextType(argTypes[0]);
36604
37028
  if (!out) return null;
36605
37029
  if (!isTextType(argTypes[1]) || !isTextType(argTypes[2])) return null;
36606
37030
  return {
36607
37031
  outputTypes: [out],
36608
37032
  apply: (args) => {
36609
- const v = args[0];
36610
- const s = toString(v);
36611
37033
  const old = toString(args[1]);
36612
37034
  const rep = toString(args[2]);
36613
- const result = s.split(old).join(rep);
36614
- return isRuntimeChar(v) ? RTV.char(result) : RTV.string(result);
37035
+ return applyTextFn(args[0], (s) => s.split(old).join(rep));
36615
37036
  }
36616
37037
  };
36617
37038
  };
@@ -36779,9 +37200,16 @@ registerIBuiltin({
36779
37200
  function isText(v) {
36780
37201
  return isRuntimeChar(v) || isRuntimeString(v);
36781
37202
  }
37203
+ function stringArrayToCell(v) {
37204
+ if (!isRuntimeStringArray(v)) return v;
37205
+ return RTV.cell(
37206
+ v.data.map((s) => RTV.string(s)),
37207
+ [v.shape[0], v.shape[1]]
37208
+ );
37209
+ }
36782
37210
  function strcmpApply(args, cmp) {
36783
- const a = args[0];
36784
- const b = args[1];
37211
+ const a = stringArrayToCell(args[0]);
37212
+ const b = stringArrayToCell(args[1]);
36785
37213
  const aIsCell = isRuntimeCell(a);
36786
37214
  const bIsCell = isRuntimeCell(b);
36787
37215
  if (!aIsCell && !bIsCell) {
@@ -37027,24 +37455,43 @@ registerIBuiltin({
37027
37455
  };
37028
37456
  }
37029
37457
  });
37458
+ function patternList(pat) {
37459
+ if (isRuntimeCell(pat)) return pat.data.map((e) => toString(e));
37460
+ if (isRuntimeStringArray(pat)) return pat.data.slice();
37461
+ return [toString(pat)];
37462
+ }
37463
+ function textSubjectApply(subject, perElem) {
37464
+ if (isRuntimeStringArray(subject)) {
37465
+ return new RuntimeTensor(
37466
+ allocFloat64Array(subject.data.map((s) => perElem(s) ? 1 : 0)),
37467
+ [subject.shape[0], subject.shape[1]],
37468
+ void 0,
37469
+ true
37470
+ );
37471
+ }
37472
+ if (isRuntimeCell(subject)) {
37473
+ return new RuntimeTensor(
37474
+ allocFloat64Array(subject.data.map((e) => perElem(toString(e)) ? 1 : 0)),
37475
+ subject.shape.slice(),
37476
+ void 0,
37477
+ true
37478
+ );
37479
+ }
37480
+ return RTV.logical(perElem(toString(subject)));
37481
+ }
37482
+ function subjectTypeOk(t) {
37483
+ return isTextType(t) || t.kind === "cell" || t.kind === "unknown";
37484
+ }
37030
37485
  registerIBuiltin({
37031
37486
  name: "contains",
37032
37487
  resolve: (argTypes) => {
37033
37488
  if (argTypes.length < 2) return null;
37034
- if (!isTextType(argTypes[0])) return null;
37035
- if (argTypes[1].kind === "unknown") return null;
37489
+ if (!subjectTypeOk(argTypes[0])) return null;
37036
37490
  return {
37037
37491
  outputTypes: [{ kind: "boolean" }],
37038
37492
  apply: (args) => {
37039
- const s = toString(args[0]);
37040
- const pat = args[1];
37041
- if (isRuntimeCell(pat)) {
37042
- for (let i = 0; i < pat.data.length; i++) {
37043
- if (s.includes(toString(pat.data[i]))) return RTV.logical(true);
37044
- }
37045
- return RTV.logical(false);
37046
- }
37047
- return RTV.logical(s.includes(toString(pat)));
37493
+ const pats = patternList(args[1]);
37494
+ return textSubjectApply(args[0], (s) => pats.some((p2) => s.includes(p2)));
37048
37495
  }
37049
37496
  };
37050
37497
  }
@@ -37054,7 +37501,7 @@ function resolveStartsEndsWith(name, testFn) {
37054
37501
  name,
37055
37502
  resolve: (argTypes) => {
37056
37503
  if (argTypes.length < 2) return null;
37057
- if (!isTextType(argTypes[0])) return null;
37504
+ if (!subjectTypeOk(argTypes[0])) return null;
37058
37505
  return {
37059
37506
  outputTypes: [{ kind: "boolean" }],
37060
37507
  apply: (args) => {
@@ -37064,20 +37511,12 @@ function resolveStartsEndsWith(name, testFn) {
37064
37511
  ic = !!toNumber(args[i + 1]);
37065
37512
  }
37066
37513
  }
37067
- let s = toString(args[0]);
37068
- if (ic) s = s.toLowerCase();
37069
- const pat = args[1];
37070
- if (isRuntimeCell(pat)) {
37071
- for (let i = 0; i < pat.data.length; i++) {
37072
- let p3 = toString(pat.data[i]);
37073
- if (ic) p3 = p3.toLowerCase();
37074
- if (testFn(s, p3)) return RTV.logical(true);
37075
- }
37076
- return RTV.logical(false);
37077
- }
37078
- let p2 = toString(pat);
37079
- if (ic) p2 = p2.toLowerCase();
37080
- return RTV.logical(testFn(s, p2));
37514
+ let pats = patternList(args[1]);
37515
+ if (ic) pats = pats.map((p2) => p2.toLowerCase());
37516
+ return textSubjectApply(args[0], (s0) => {
37517
+ const s = ic ? s0.toLowerCase() : s0;
37518
+ return pats.some((p2) => testFn(s, p2));
37519
+ });
37081
37520
  }
37082
37521
  };
37083
37522
  }
@@ -37089,13 +37528,19 @@ registerIBuiltin({
37089
37528
  name: "strlength",
37090
37529
  resolve: (argTypes) => {
37091
37530
  if (argTypes.length !== 1) return null;
37092
- if (!isTextType(argTypes[0])) return null;
37531
+ if (!isTextType(argTypes[0]) && argTypes[0].kind !== "unknown") return null;
37093
37532
  return {
37094
37533
  outputTypes: [{ kind: "number", sign: "nonneg" }],
37095
37534
  apply: (args) => {
37096
37535
  const v = args[0];
37097
37536
  if (isRuntimeString(v)) return RTV.num(v.length);
37098
37537
  if (isRuntimeChar(v)) return RTV.num(v.value.length);
37538
+ if (isRuntimeStringArray(v)) {
37539
+ return RTV.tensor(allocFloat64Array(v.data.map((s) => s.length)), [
37540
+ v.shape[0],
37541
+ v.shape[1]
37542
+ ]);
37543
+ }
37099
37544
  throw new RuntimeError("strlength: argument must be a string or char");
37100
37545
  }
37101
37546
  };
@@ -37151,6 +37596,20 @@ registerIBuiltin({
37151
37596
  }
37152
37597
  };
37153
37598
  }
37599
+ if (t.kind === "unknown") {
37600
+ return {
37601
+ outputTypes: [{ kind: "tensor", isComplex: false }],
37602
+ apply: (args) => {
37603
+ const v = args[0];
37604
+ if (!isRuntimeStringArray(v))
37605
+ throw new RuntimeError("str2double: expected text input");
37606
+ return RTV.tensor(
37607
+ allocFloat64Array(v.data.map((s) => str2doubleScalar(s))),
37608
+ [v.shape[0], v.shape[1]]
37609
+ );
37610
+ }
37611
+ };
37612
+ }
37154
37613
  return null;
37155
37614
  }
37156
37615
  });
@@ -37336,29 +37795,7 @@ registerIBuiltin({
37336
37795
  };
37337
37796
  }
37338
37797
  });
37339
- function numStr2(n) {
37340
- if (n === Infinity) return "Inf";
37341
- if (n === -Infinity) return "-Inf";
37342
- if (isNaN(n)) return "NaN";
37343
- if (n === 0) return "0";
37344
- if (Number.isInteger(n)) return String(n);
37345
- const prec = 5;
37346
- const exp2 = Math.floor(Math.log10(Math.abs(n)));
37347
- let s;
37348
- if (exp2 < -4 || exp2 >= prec) {
37349
- s = n.toExponential(prec - 1);
37350
- const ePos = s.indexOf("e");
37351
- let mantissa = s.slice(0, ePos);
37352
- const expPart0 = s.slice(ePos);
37353
- if (mantissa.includes(".")) mantissa = mantissa.replace(/\.?0+$/, "");
37354
- const expPart = expPart0.replace(/([eE][+-])(\d)$/, "$10$2");
37355
- s = mantissa + expPart;
37356
- } else {
37357
- s = n.toPrecision(prec);
37358
- if (s.includes(".")) s = s.replace(/\.?0+$/, "");
37359
- }
37360
- return s;
37361
- }
37798
+ var numStr2 = matlabNumToString;
37362
37799
  registerIBuiltin({
37363
37800
  name: "num2str",
37364
37801
  resolve: (argTypes) => {
@@ -37569,7 +38006,7 @@ registerIBuiltin({
37569
38006
  resolve: (argTypes) => {
37570
38007
  if (argTypes.length !== 1) return null;
37571
38008
  const a = argTypes[0];
37572
- if (a.kind !== "char" && a.kind !== "string" && a.kind !== "number" && a.kind !== "tensor" && a.kind !== "cell")
38009
+ if (a.kind !== "char" && a.kind !== "string" && a.kind !== "number" && a.kind !== "tensor" && a.kind !== "cell" && a.kind !== "unknown")
37573
38010
  return null;
37574
38011
  return {
37575
38012
  outputTypes: [{ kind: "char" }],
@@ -37591,6 +38028,9 @@ registerIBuiltin({
37591
38028
  for (const el of v.data) rows.push(...valueToCharRows(el));
37592
38029
  return charRowsToMatrix(rows);
37593
38030
  }
38031
+ if (isRuntimeStringArray(v)) {
38032
+ return charRowsToMatrix(v.data.slice());
38033
+ }
37594
38034
  throw new RuntimeError("char: unsupported arguments");
37595
38035
  }
37596
38036
  };
@@ -37601,14 +38041,260 @@ registerIBuiltin({
37601
38041
  resolve: (argTypes) => {
37602
38042
  if (argTypes.length !== 1) return null;
37603
38043
  const a = argTypes[0];
37604
- if (a.kind === "unknown") return null;
38044
+ const scalarText = a.kind === "char" || a.kind === "string" || a.kind === "number" || a.kind === "boolean";
37605
38045
  return {
37606
- outputTypes: [{ kind: "string" }],
38046
+ outputTypes: [scalarText ? { kind: "string" } : { kind: "unknown" }],
38047
+ apply: (args) => {
38048
+ const v = args[0];
38049
+ if (isRuntimeString(v) || isRuntimeStringArray(v)) return v;
38050
+ if (isRuntimeChar(v)) {
38051
+ const rows = v.shape ? v.shape[0] : 1;
38052
+ if (rows <= 1) return RTV.string(v.value);
38053
+ const width = v.shape[1];
38054
+ const out = [];
38055
+ for (let r = 0; r < rows; r++) {
38056
+ out.push(v.value.slice(r * width, (r + 1) * width));
38057
+ }
38058
+ return RTV.stringArray(out, [rows, 1]);
38059
+ }
38060
+ if (isRuntimeNumber(v)) return RTV.string(numStr2(v));
38061
+ if (isRuntimeLogical(v)) return RTV.string(v ? "true" : "false");
38062
+ if (isRuntimeTensor(v)) {
38063
+ const rows = v.shape.length >= 2 ? v.shape[0] : 1;
38064
+ const cols = v.data.length === 0 ? v.shape[1] ?? 0 : v.data.length / (rows || 1);
38065
+ const out = [];
38066
+ for (let i = 0; i < v.data.length; i++) {
38067
+ out.push(
38068
+ v._isLogical ? v.data[i] ? "true" : "false" : numStr2(v.data[i])
38069
+ );
38070
+ }
38071
+ return stringArrayValue(out, [rows, cols]);
38072
+ }
38073
+ if (isRuntimeCell(v)) {
38074
+ const rows = v.shape.length >= 2 ? v.shape[0] : 1;
38075
+ const cols = v.data.length / (rows || 1);
38076
+ const out = v.data.map((el) => {
38077
+ const rv = ensureRuntimeValue(el);
38078
+ if (isRuntimeChar(rv)) return rv.value;
38079
+ if (isRuntimeString(rv)) return rv;
38080
+ if (isRuntimeNumber(rv)) return numStr2(rv);
38081
+ if (isRuntimeLogical(rv)) return rv ? "true" : "false";
38082
+ throw new RuntimeError(
38083
+ "string: cell elements must be text or numbers"
38084
+ );
38085
+ });
38086
+ return stringArrayValue(out, [rows, cols]);
38087
+ }
38088
+ return RTV.string(displayValue(v));
38089
+ }
38090
+ };
38091
+ }
38092
+ });
38093
+ registerIBuiltin({
38094
+ name: "strings",
38095
+ help: {
38096
+ signatures: ["strings", "strings(n)", "strings(m,n)", "strings([m n])"],
38097
+ description: 'Create a string array with every element set to "" (empty string).'
38098
+ },
38099
+ resolve: (argTypes) => {
38100
+ if (argTypes.some((t) => t.kind !== "number" && t.kind !== "tensor"))
38101
+ return null;
38102
+ return {
38103
+ outputTypes: [{ kind: "unknown" }],
38104
+ apply: (args) => {
38105
+ const dims = [];
38106
+ for (const a of args) {
38107
+ const rv = ensureRuntimeValue(a);
38108
+ if (isRuntimeTensor(rv)) {
38109
+ for (const d of rv.data) dims.push(Math.max(0, Math.round(d)));
38110
+ } else {
38111
+ dims.push(Math.max(0, Math.round(toNumber(rv))));
38112
+ }
38113
+ }
38114
+ if (dims.length === 0) dims.push(1, 1);
38115
+ if (dims.length === 1) dims.push(dims[0]);
38116
+ const m = dims[0];
38117
+ const n = dims.slice(1).reduce((a, b) => a * b, 1);
38118
+ return stringArrayValue(new Array(m * n).fill(""), [m, n]);
38119
+ }
38120
+ };
38121
+ }
38122
+ });
38123
+ registerIBuiltin({
38124
+ name: "newline",
38125
+ help: {
38126
+ signatures: ["newline"],
38127
+ description: "Newline character, char(10)."
38128
+ },
38129
+ resolve: (argTypes) => {
38130
+ if (argTypes.length !== 0) return null;
38131
+ return {
38132
+ outputTypes: [{ kind: "char" }],
38133
+ apply: () => RTV.char("\n")
38134
+ };
38135
+ }
38136
+ });
38137
+ registerIBuiltin({
38138
+ name: "split",
38139
+ help: {
38140
+ signatures: ["split(str)", "split(str, delimiter)"],
38141
+ description: "Split text at whitespace (or the given delimiter(s)) into a string array. A scalar input yields a column of parts."
38142
+ },
38143
+ resolve: (argTypes) => {
38144
+ if (argTypes.length < 1 || argTypes.length > 2) return null;
38145
+ const a = argTypes[0];
38146
+ if (!isTextType(a) && a.kind !== "cell" && a.kind !== "unknown")
38147
+ return null;
38148
+ return {
38149
+ outputTypes: [{ kind: "unknown" }],
38150
+ apply: (args) => {
38151
+ const delims = args.length >= 2 ? patternList(args[1]) : null;
38152
+ const splitOne = (s) => {
38153
+ if (delims === null) {
38154
+ const trimmed = s.trim();
38155
+ return trimmed.length === 0 ? [""] : trimmed.split(/\s+/);
38156
+ }
38157
+ const escaped = delims.map((d) => d.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("|");
38158
+ return s.split(new RegExp(escaped));
38159
+ };
38160
+ const v = args[0];
38161
+ const subjects = isRuntimeStringArray(v) ? v.data.slice() : isRuntimeCell(v) ? v.data.map((e) => toString(e)) : [toString(v)];
38162
+ const partsPer = subjects.map(splitOne);
38163
+ const nParts = partsPer[0].length;
38164
+ if (partsPer.some((p2) => p2.length !== nParts)) {
38165
+ throw new RuntimeError(
38166
+ "split: all elements must split into the same number of parts"
38167
+ );
38168
+ }
38169
+ if (subjects.length === 1) {
38170
+ return stringArrayValue(partsPer[0], [nParts, 1]);
38171
+ }
38172
+ const m = subjects.length;
38173
+ const out = new Array(m * nParts);
38174
+ for (let i = 0; i < m; i++) {
38175
+ for (let j = 0; j < nParts; j++) {
38176
+ out[j * m + i] = partsPer[i][j];
38177
+ }
38178
+ }
38179
+ return stringArrayValue(out, [m, nParts]);
38180
+ }
38181
+ };
38182
+ }
38183
+ });
38184
+ registerIBuiltin({
38185
+ name: "join",
38186
+ help: {
38187
+ signatures: ["join(str)", "join(str, delimiter)"],
38188
+ description: "Combine the elements of a string array into single strings, separated by a space (or the given delimiter)."
38189
+ },
38190
+ resolve: (argTypes) => {
38191
+ if (argTypes.length < 1 || argTypes.length > 2) return null;
38192
+ const a = argTypes[0];
38193
+ if (!isTextType(a) && a.kind !== "cell" && a.kind !== "unknown")
38194
+ return null;
38195
+ return {
38196
+ outputTypes: [{ kind: "unknown" }],
37607
38197
  apply: (args) => {
38198
+ const delim = args.length >= 2 ? toString(args[1]) : " ";
37608
38199
  const v = args[0];
37609
38200
  if (isRuntimeString(v)) return v;
37610
38201
  if (isRuntimeChar(v)) return RTV.string(v.value);
37611
- return RTV.string(displayValue(v));
38202
+ const elems = isRuntimeStringArray(v) ? v.data : isRuntimeCell(v) ? v.data.map((e) => toString(e)) : [toString(v)];
38203
+ const shape = isRuntimeStringArray(v) ? v.shape : [1, elems.length];
38204
+ const [m, n] = shape;
38205
+ if (m === 1 || n === 1) {
38206
+ return RTV.string(elems.join(delim));
38207
+ }
38208
+ const out = [];
38209
+ for (let r = 0; r < m; r++) {
38210
+ const parts = [];
38211
+ for (let c = 0; c < n; c++) parts.push(elems[c * m + r]);
38212
+ out.push(parts.join(delim));
38213
+ }
38214
+ return stringArrayValue(out, [m, 1]);
38215
+ }
38216
+ };
38217
+ }
38218
+ });
38219
+ registerIBuiltin({
38220
+ name: "cellstr",
38221
+ help: {
38222
+ signatures: ["cellstr(A)"],
38223
+ description: "Convert a string array, char array, or cell array of text to a cell array of character vectors."
38224
+ },
38225
+ resolve: (argTypes) => {
38226
+ if (argTypes.length !== 1) return null;
38227
+ const a = argTypes[0];
38228
+ if (!isTextType(a) && a.kind !== "cell" && a.kind !== "unknown")
38229
+ return null;
38230
+ return {
38231
+ outputTypes: [{ kind: "cell" }],
38232
+ apply: (args) => {
38233
+ const v = args[0];
38234
+ if (isRuntimeCell(v)) {
38235
+ return RTV.cell(
38236
+ v.data.map((e) => RTV.char(toString(e))),
38237
+ [...v.shape]
38238
+ );
38239
+ }
38240
+ if (isRuntimeStringArray(v)) {
38241
+ return RTV.cell(
38242
+ v.data.map((s) => RTV.char(s)),
38243
+ [v.shape[0], v.shape[1]]
38244
+ );
38245
+ }
38246
+ if (isRuntimeString(v)) return RTV.cell([RTV.char(v)], [1, 1]);
38247
+ if (isRuntimeChar(v)) {
38248
+ const rows = v.shape ? v.shape[0] : 1;
38249
+ if (rows <= 1) {
38250
+ return RTV.cell([RTV.char(v.value.replace(/\s+$/, ""))], [1, 1]);
38251
+ }
38252
+ const width = v.shape[1];
38253
+ const out = [];
38254
+ for (let r = 0; r < rows; r++) {
38255
+ out.push(
38256
+ RTV.char(
38257
+ v.value.slice(r * width, (r + 1) * width).replace(/\s+$/, "")
38258
+ )
38259
+ );
38260
+ }
38261
+ return RTV.cell(out, [rows, 1]);
38262
+ }
38263
+ throw new RuntimeError("cellstr: unsupported argument");
38264
+ }
38265
+ };
38266
+ }
38267
+ });
38268
+ registerIBuiltin({
38269
+ name: "ismissing",
38270
+ help: {
38271
+ signatures: ["ismissing(A)"],
38272
+ description: "Logical array marking missing elements. numbl has no <missing> value, so string inputs return all-false."
38273
+ },
38274
+ resolve: (argTypes) => {
38275
+ if (argTypes.length !== 1) return null;
38276
+ return {
38277
+ outputTypes: [{ kind: "boolean" }],
38278
+ apply: (args) => {
38279
+ const v = args[0];
38280
+ if (isRuntimeStringArray(v)) {
38281
+ const t = RTV.tensor(allocFloat64Array(v.data.length), [
38282
+ v.shape[0],
38283
+ v.shape[1]
38284
+ ]);
38285
+ t._isLogical = true;
38286
+ return t;
38287
+ }
38288
+ if (isRuntimeTensor(v)) {
38289
+ const t = RTV.tensor(
38290
+ allocFloat64Array(v.data.map((x) => isNaN(x) ? 1 : 0)),
38291
+ [...v.shape]
38292
+ );
38293
+ t._isLogical = true;
38294
+ return t;
38295
+ }
38296
+ if (isRuntimeNumber(v)) return RTV.logical(isNaN(v));
38297
+ return RTV.logical(false);
37612
38298
  }
37613
38299
  };
37614
38300
  }
@@ -37645,7 +38331,10 @@ registerIBuiltin({
37645
38331
  outputTypes: [outType],
37646
38332
  apply: (args) => {
37647
38333
  const fmt = toString(args[0]);
37648
- const result = sprintfFormat(fmt, args.slice(1));
38334
+ const rest = args.slice(1).flatMap(
38335
+ (a) => isRuntimeStringArray(a) ? a.data.map((s) => RTV.string(s)) : [a]
38336
+ );
38337
+ const result = sprintfFormat(fmt, rest);
37649
38338
  return isChar5 ? RTV.char(result) : RTV.string(result);
37650
38339
  }
37651
38340
  };
@@ -37666,80 +38355,11 @@ registerIBuiltin({
37666
38355
  const str = toString(args[0]);
37667
38356
  const fmt = toString(args[1]);
37668
38357
  const maxCount = args.length >= 3 ? toNumber(args[2]) : Infinity;
37669
- const results = [];
37670
- let strPos = 0;
37671
- let fmtPos = 0;
37672
- let matchFailure = false;
37673
- while (fmtPos < fmt.length && strPos < str.length && results.length < maxCount) {
37674
- if (fmt[fmtPos] === "%") {
37675
- fmtPos++;
37676
- if (fmtPos >= fmt.length) break;
37677
- const spec = fmt[fmtPos];
37678
- fmtPos++;
37679
- if (spec !== "c" && spec !== "s") {
37680
- while (strPos < str.length && /\s/.test(str[strPos])) strPos++;
37681
- }
37682
- if (spec === "d" || spec === "i") {
37683
- const m = str.slice(strPos).match(/^[+-]?\d+/);
37684
- if (!m) {
37685
- matchFailure = true;
37686
- break;
37687
- }
37688
- results.push(parseInt(m[0], 10));
37689
- strPos += m[0].length;
37690
- } else if (spec === "f" || spec === "e" || spec === "g") {
37691
- const m = str.slice(strPos).match(/^[+-]?(\d+\.?\d*|\.\d+)([eE][+-]?\d+)?/);
37692
- if (!m) {
37693
- matchFailure = true;
37694
- break;
37695
- }
37696
- results.push(parseFloat(m[0]));
37697
- strPos += m[0].length;
37698
- } else if (spec === "x") {
37699
- const m = str.slice(strPos).match(/^[+-]?[0-9a-fA-F]+/);
37700
- if (!m) {
37701
- matchFailure = true;
37702
- break;
37703
- }
37704
- results.push(parseInt(m[0], 16));
37705
- strPos += m[0].length;
37706
- } else if (spec === "o") {
37707
- const m = str.slice(strPos).match(/^[+-]?[0-7]+/);
37708
- if (!m) {
37709
- matchFailure = true;
37710
- break;
37711
- }
37712
- results.push(parseInt(m[0], 8));
37713
- strPos += m[0].length;
37714
- } else if (spec === "c") {
37715
- results.push(str.charCodeAt(strPos));
37716
- strPos++;
37717
- } else if (spec === "s") {
37718
- const m = str.slice(strPos).match(/^\S+/);
37719
- if (!m) {
37720
- matchFailure = true;
37721
- break;
37722
- }
37723
- for (let ci = 0; ci < m[0].length && results.length < maxCount; ci++) {
37724
- results.push(m[0].charCodeAt(ci));
37725
- }
37726
- strPos += m[0].length;
37727
- }
37728
- } else if (/\s/.test(fmt[fmtPos])) {
37729
- fmtPos++;
37730
- while (strPos < str.length && /\s/.test(str[strPos])) strPos++;
37731
- } else {
37732
- if (str[strPos] !== fmt[fmtPos]) {
37733
- matchFailure = true;
37734
- break;
37735
- }
37736
- strPos++;
37737
- fmtPos++;
37738
- }
37739
- if (fmtPos >= fmt.length && results.length < maxCount && strPos < str.length) {
37740
- fmtPos = 0;
37741
- }
37742
- }
38358
+ const {
38359
+ results,
38360
+ consumed: strPos,
38361
+ matchFailure
38362
+ } = scanFormat(str, fmt, maxCount);
37743
38363
  const vals = results.length === 1 ? RTV.num(results[0]) : RTV.tensor(allocFloat64Array(results), [results.length, 1]);
37744
38364
  if (nout >= 2) {
37745
38365
  const out = [vals, RTV.num(results.length)];
@@ -38018,6 +38638,10 @@ defineBuiltin({
38018
38638
  };
38019
38639
  return nargout > 1 ? [out, idx] : [out];
38020
38640
  }
38641
+ if (a.kind === "string" || a.kind === "unknown") {
38642
+ const out = { kind: "unknown" };
38643
+ return nargout > 1 ? [out, { kind: "unknown" }] : [out];
38644
+ }
38021
38645
  return null;
38022
38646
  },
38023
38647
  apply: (args, nargout) => {
@@ -38036,6 +38660,33 @@ defineBuiltin({
38036
38660
  if (args.length >= 3 && (isRuntimeString(args[2]) || isRuntimeChar(args[2]))) {
38037
38661
  descend = rstr(args[2]).toLowerCase() === "descend";
38038
38662
  }
38663
+ if (isRuntimeStringArray(v)) {
38664
+ const order = v.data.map((_, i) => i);
38665
+ order.sort((i, j) => {
38666
+ const x = v.data[i];
38667
+ const y = v.data[j];
38668
+ const c = x < y ? -1 : x > y ? 1 : 0;
38669
+ return descend ? -c : c;
38670
+ });
38671
+ const sorted = order.map((i) => v.data[i]);
38672
+ const isRow = v.shape[0] === 1;
38673
+ const shape = isRow ? [1, sorted.length] : [sorted.length, 1];
38674
+ const result = stringArrayValue(sorted, shape);
38675
+ if (nargout > 1) {
38676
+ return [
38677
+ result,
38678
+ RTV.tensor(allocFloat64Array(order.map((i) => i + 1)), [
38679
+ shape[0],
38680
+ shape[1]
38681
+ ])
38682
+ ];
38683
+ }
38684
+ return result;
38685
+ }
38686
+ if (isRuntimeString(v)) {
38687
+ if (nargout > 1) return [v, RTV.num(1)];
38688
+ return v;
38689
+ }
38039
38690
  if (isRuntimeNumber(v)) {
38040
38691
  if (nargout > 1) return [v, RTV.num(1)];
38041
38692
  return v;
@@ -38351,8 +39002,12 @@ var ismemberCases = [
38351
39002
  apply: (args, nargout) => {
38352
39003
  if (args.length < 2)
38353
39004
  throw new RuntimeError("ismember requires 2 arguments");
38354
- const v = args[0];
38355
- const b = args[1];
39005
+ const asCellstr = (x) => isRuntimeStringArray(x) ? RTV.cell(
39006
+ x.data.map((s) => RTV.string(s)),
39007
+ [x.shape[0], x.shape[1]]
39008
+ ) : x;
39009
+ const v = asCellstr(args[0]);
39010
+ const b = asCellstr(args[1]);
38356
39011
  const isStringLike = (x) => isRuntimeString(x) || isRuntimeChar(x);
38357
39012
  const isCellOfStrings = (x) => isRuntimeCell(x) && x.data.every(
38358
39013
  (e) => isRuntimeString(e) || isRuntimeChar(e)
@@ -38655,6 +39310,30 @@ defineBuiltin({
38655
39310
  )) {
38656
39311
  return uniqueCellOfStrings(v, nargout, stable);
38657
39312
  }
39313
+ if (isRuntimeStringArray(v)) {
39314
+ const elems = v.data;
39315
+ const seen = /* @__PURE__ */ new Map();
39316
+ for (let i = 0; i < elems.length; i++) {
39317
+ if (!seen.has(elems[i])) seen.set(elems[i], i);
39318
+ }
39319
+ let vals = [...seen.keys()];
39320
+ if (!stable) vals = vals.sort();
39321
+ const isRow = v.shape[0] === 1;
39322
+ const shape = isRow ? [1, vals.length] : [vals.length, 1];
39323
+ const result = stringArrayValue(vals, shape);
39324
+ if (nargout <= 1) return result;
39325
+ const ia = RTV.tensor(
39326
+ allocFloat64Array(vals.map((s) => seen.get(s) + 1)),
39327
+ [vals.length, 1]
39328
+ );
39329
+ if (nargout === 2) return [result, ia];
39330
+ const pos = new Map(vals.map((s, i) => [s, i + 1]));
39331
+ const ic = RTV.tensor(
39332
+ allocFloat64Array(elems.map((s) => pos.get(s))),
39333
+ [elems.length, 1]
39334
+ );
39335
+ return [result, ia, ic];
39336
+ }
38658
39337
  if (!isRuntimeTensor(v))
38659
39338
  throw new RuntimeError("unique: argument must be numeric");
38660
39339
  if (byRows) return uniqueByRows(v, nargout, stable);
@@ -41858,6 +42537,27 @@ function flipAlongDim(v, dimIdx) {
41858
42537
  }
41859
42538
  return RTV.tensor(result, [...shape], resultImag);
41860
42539
  }
42540
+ function flipCellAlongDim(v, dimIdx) {
42541
+ const shape = v.shape.length >= 2 ? v.shape : [1, v.shape[0] ?? v.data.length];
42542
+ const totalElems = v.data.length;
42543
+ const dimSize = dimIdx < shape.length ? shape[dimIdx] : 1;
42544
+ let strideDim = 1;
42545
+ for (let d = 0; d < dimIdx; d++) strideDim *= shape[d];
42546
+ const slabSize = strideDim * dimSize;
42547
+ const numOuter = totalElems / slabSize;
42548
+ const result = new Array(totalElems);
42549
+ for (let outer = 0; outer < numOuter; outer++) {
42550
+ const base = outer * slabSize;
42551
+ for (let k = 0; k < dimSize; k++) {
42552
+ const srcOff = base + k * strideDim;
42553
+ const dstOff = base + (dimSize - 1 - k) * strideDim;
42554
+ for (let i = 0; i < strideDim; i++) {
42555
+ result[dstOff + i] = v.data[srcOff + i];
42556
+ }
42557
+ }
42558
+ }
42559
+ return RTV.cell(result, [...shape]);
42560
+ }
41861
42561
  function flipSparse(v, dimIdx) {
41862
42562
  const isComplex = v.pi !== void 0;
41863
42563
  const nnz = v.jc[v.n];
@@ -42034,6 +42734,41 @@ defineBuiltin({
42034
42734
  chars[i2 * nc + j2] = linear[j2 * nr + i2];
42035
42735
  return new RuntimeChar(chars.join(""), [nr, nc]);
42036
42736
  }
42737
+ if (isRuntimeStringArray(v)) {
42738
+ const s = parseReshapeDims(args, v.data.length);
42739
+ while (s.length > 2 && s[s.length - 1] === 1) s.pop();
42740
+ if (s.length > 2)
42741
+ throw new RuntimeError("reshape: string arrays must be 2-D");
42742
+ const nr = s[0];
42743
+ const nc = s.length >= 2 ? s[1] : 1;
42744
+ return stringArrayValue(v.data.slice(), [nr, nc]);
42745
+ }
42746
+ if (isRuntimeString(v)) {
42747
+ parseReshapeDims(args, 1);
42748
+ return v;
42749
+ }
42750
+ if (isRuntimeClassInstanceArray(v)) {
42751
+ const total = v.elements.length;
42752
+ const s = parseReshapeDims(args, total);
42753
+ while (s.length > 2 && s[s.length - 1] === 1) s.pop();
42754
+ if (s.length > 2)
42755
+ throw new RuntimeError("reshape: object arrays must be 2-D");
42756
+ const nr = s[0];
42757
+ const nc = s.length >= 2 ? s[1] : 1;
42758
+ if (nr * nc !== total)
42759
+ throw new RuntimeError(
42760
+ "reshape: number of elements must not change"
42761
+ );
42762
+ return RTV.classInstanceArray(v.className, v.elements, [nr, nc]);
42763
+ }
42764
+ if (isRuntimeClassInstance(v)) {
42765
+ const s = parseReshapeDims(args, 1);
42766
+ if (s.reduce((a, b) => a * b, 1) !== 1)
42767
+ throw new RuntimeError(
42768
+ "reshape: number of elements must not change"
42769
+ );
42770
+ return v;
42771
+ }
42037
42772
  if (!isRuntimeTensor(v) && !isRuntimeNumber(v) && !isRuntimeComplexNumber(v))
42038
42773
  throw new RuntimeError("reshape: first argument must be numeric");
42039
42774
  const data = isRuntimeTensor(v) ? v.data : isRuntimeComplexNumber(v) ? allocFloat64Array([v.re]) : allocFloat64Array([v]);
@@ -42345,6 +43080,7 @@ defineBuiltin({
42345
43080
  if (isRuntimeChar(v))
42346
43081
  return RTV.char(v.value.split("").reverse().join(""));
42347
43082
  if (isRuntimeSparseMatrix(v)) return flipSparse(v, 1);
43083
+ if (isRuntimeCell(v)) return flipCellAlongDim(v, 1);
42348
43084
  if (!isRuntimeTensor(v))
42349
43085
  throw new RuntimeError("fliplr: argument must be numeric or char");
42350
43086
  return flipAlongDim(v, 1);
@@ -42365,6 +43101,7 @@ defineBuiltin({
42365
43101
  if (isRuntimeNumber(v)) return v;
42366
43102
  if (isRuntimeChar(v)) return v;
42367
43103
  if (isRuntimeSparseMatrix(v)) return flipSparse(v, 0);
43104
+ if (isRuntimeCell(v)) return flipCellAlongDim(v, 0);
42368
43105
  if (!isRuntimeTensor(v))
42369
43106
  throw new RuntimeError("flipud: argument must be numeric or char");
42370
43107
  return flipAlongDim(v, 0);
@@ -42383,8 +43120,8 @@ defineBuiltin({
42383
43120
  apply: (args) => {
42384
43121
  const v = args[0];
42385
43122
  if (isRuntimeNumber(v)) return v;
42386
- if (!isRuntimeTensor(v))
42387
- throw new RuntimeError("flip: argument must be numeric");
43123
+ if (!isRuntimeTensor(v) && !isRuntimeCell(v))
43124
+ throw new RuntimeError("flip: argument must be numeric or cell");
42388
43125
  let dimIdx = 0;
42389
43126
  if (args.length >= 2) {
42390
43127
  dimIdx = Math.round(toNumber(args[1])) - 1;
@@ -42393,7 +43130,7 @@ defineBuiltin({
42393
43130
  dimIdx = shape.findIndex((d) => d > 1);
42394
43131
  if (dimIdx === -1) dimIdx = 0;
42395
43132
  }
42396
- return flipAlongDim(v, dimIdx);
43133
+ return isRuntimeCell(v) ? flipCellAlongDim(v, dimIdx) : flipAlongDim(v, dimIdx);
42397
43134
  }
42398
43135
  }
42399
43136
  ]
@@ -44063,6 +44800,8 @@ function getValClassName(v) {
44063
44800
  return "double";
44064
44801
  case "dictionary":
44065
44802
  return "dictionary";
44803
+ case "string_array":
44804
+ return "string";
44066
44805
  default:
44067
44806
  return "unknown";
44068
44807
  }
@@ -44092,6 +44831,8 @@ function getShapeOf(v) {
44092
44831
  return [1, 1];
44093
44832
  case "struct_array":
44094
44833
  return [1, obj.elements.length];
44834
+ case "string_array":
44835
+ return [...obj.shape];
44095
44836
  default:
44096
44837
  return [1, 1];
44097
44838
  }
@@ -45759,6 +46500,12 @@ defineBuiltin({
45759
46500
  });
45760
46501
 
45761
46502
  // src/numbl-core/interpreter/builtins/type-constructors.ts
46503
+ function parseDoubleText(s) {
46504
+ const t = s.trim();
46505
+ if (t === "") return NaN;
46506
+ if (/^[+-]?inf(inity)?$/i.test(t)) return t[0] === "-" ? -Infinity : Infinity;
46507
+ return Number(t);
46508
+ }
45762
46509
  defineBuiltin({
45763
46510
  name: "double",
45764
46511
  cases: [
@@ -45766,7 +46513,7 @@ defineBuiltin({
45766
46513
  match: (argTypes) => {
45767
46514
  if (argTypes.length !== 1) return null;
45768
46515
  const a = argTypes[0];
45769
- if (a.kind === "number" || a.kind === "boolean" || a.kind === "char" || a.kind === "complex_or_number" || a.kind === "class_instance")
46516
+ if (a.kind === "number" || a.kind === "boolean" || a.kind === "char" || a.kind === "string" || a.kind === "unknown" || a.kind === "complex_or_number" || a.kind === "class_instance")
45770
46517
  return [{ kind: "number" }];
45771
46518
  if (a.kind === "tensor")
45772
46519
  return [
@@ -45788,6 +46535,13 @@ defineBuiltin({
45788
46535
  const codes = Array.from(v.value).map((c) => c.charCodeAt(0));
45789
46536
  return RTV.row(codes);
45790
46537
  }
46538
+ if (isRuntimeString(v)) return RTV.num(parseDoubleText(v));
46539
+ if (isRuntimeStringArray(v)) {
46540
+ return RTV.tensor(allocFloat64Array(v.data.map(parseDoubleText)), [
46541
+ v.shape[0],
46542
+ v.shape[1]
46543
+ ]);
46544
+ }
45791
46545
  if (isRuntimeLogical(v)) return RTV.num(v ? 1 : 0);
45792
46546
  if (isRuntimeNumber(v)) return v;
45793
46547
  if (isRuntimeComplexNumber(v)) return v.re;
@@ -46491,14 +47245,19 @@ registerIBuiltin({
46491
47245
  let delims;
46492
47246
  if (isRuntimeCell(args[1])) {
46493
47247
  delims = args[1].data.map((d) => toString(d));
47248
+ } else if (isRuntimeStringArray(args[1])) {
47249
+ delims = args[1].data.slice();
46494
47250
  } else {
46495
47251
  delims = [toString(args[1])];
46496
47252
  }
46497
47253
  const escaped = delims.map((d) => d.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("|");
46498
47254
  parts = s.split(new RegExp("(?:" + escaped + ")+"));
46499
47255
  }
47256
+ if (isRuntimeString(args[0]) || isRuntimeStringArray(args[0])) {
47257
+ return stringArrayValue(parts, [1, parts.length]);
47258
+ }
46500
47259
  return RTV.cell(
46501
- parts.map((p2) => RTV.string(p2)),
47260
+ parts.map((p2) => RTV.char(p2)),
46502
47261
  [1, parts.length]
46503
47262
  );
46504
47263
  }
@@ -46512,11 +47271,18 @@ registerIBuiltin({
46512
47271
  return {
46513
47272
  outputTypes: [{ kind: "string" }],
46514
47273
  apply: (args) => {
46515
- if (!isRuntimeCell(args[0]))
47274
+ let elements;
47275
+ if (isRuntimeCell(args[0])) {
47276
+ elements = args[0].data.map((v) => toString(v));
47277
+ } else if (isRuntimeStringArray(args[0])) {
47278
+ elements = args[0].data.slice();
47279
+ } else if (isRuntimeString(args[0])) {
47280
+ elements = [args[0]];
47281
+ } else {
46516
47282
  throw new RuntimeError(
46517
- "strjoin: first argument must be a cell array"
47283
+ "strjoin: first argument must be a cell array or string array"
46518
47284
  );
46519
- const elements = args[0].data.map((v) => toString(v));
47285
+ }
46520
47286
  const delim = args.length >= 2 ? toString(args[1]) : " ";
46521
47287
  return RTV.string(elements.join(delim));
46522
47288
  }
@@ -46593,6 +47359,19 @@ function regexpImpl(caseSensitive, name, args, nargout) {
46593
47359
  [1, tokensList.length]
46594
47360
  );
46595
47361
  }
47362
+ if (mode === "split") {
47363
+ const splits = [];
47364
+ let prev = 0;
47365
+ for (let i = 0; i < starts.length; i++) {
47366
+ splits.push(str.slice(prev, starts[i] - 1));
47367
+ prev = ends[i];
47368
+ }
47369
+ splits.push(str.slice(prev));
47370
+ return RTV.cell(
47371
+ splits.map((s) => RTV.char(s)),
47372
+ [1, splits.length]
47373
+ );
47374
+ }
46596
47375
  if (mode === "names") {
46597
47376
  if (starts.length === 0) return RTV.tensor(allocFloat64Array(0), [0, 0]);
46598
47377
  const namedRe = new RegExp(pat, flags);
@@ -55036,6 +55815,7 @@ var SPECIAL_BUILTIN_NAMES = [
55036
55815
  "fclose",
55037
55816
  "fgetl",
55038
55817
  "fgets",
55818
+ "fscanf",
55039
55819
  "fileread",
55040
55820
  "feof",
55041
55821
  "ferror",
@@ -55303,7 +56083,10 @@ function registerSpecialBuiltins(rt) {
55303
56083
  fmtIdx = 1;
55304
56084
  }
55305
56085
  const fmt = toString(margs[fmtIdx]);
55306
- output = sprintfFormat(fmt, margs.slice(fmtIdx + 1));
56086
+ const rest = margs.slice(fmtIdx + 1).flatMap(
56087
+ (a) => isRuntimeStringArray(a) ? a.data.map((s) => RTV.string(s)) : [a]
56088
+ );
56089
+ output = sprintfFormat(fmt, rest);
55307
56090
  if (fid === 1 || fid === 2) {
55308
56091
  rt.output(output);
55309
56092
  } else {
@@ -55457,6 +56240,53 @@ function registerSpecialBuiltins(rt) {
55457
56240
  const result = io.fgets(toNumber(margs[0]));
55458
56241
  return typeof result === "number" ? RTV.num(result) : RTV.char(result);
55459
56242
  });
56243
+ registerSpecial("fscanf", (nargout, args) => {
56244
+ const io = requireFileIO();
56245
+ const margs = args.map((a) => ensureRuntimeValue(a));
56246
+ if (margs.length < 2)
56247
+ throw new RuntimeError("fscanf requires at least 2 arguments");
56248
+ if (!io.ftell || !io.fseek || !io.freadBytes)
56249
+ throw new RuntimeError("fscanf is not supported in this environment");
56250
+ const fid = toNumber(margs[0]);
56251
+ const fmt = toString(margs[1]);
56252
+ let maxCount = Infinity;
56253
+ let rows = null;
56254
+ if (margs.length >= 3) {
56255
+ const sz = margs[2];
56256
+ if (isRuntimeTensor(sz) && sz.data.length >= 2) {
56257
+ rows = sz.data[0];
56258
+ maxCount = sz.data[0] * sz.data[1];
56259
+ } else {
56260
+ maxCount = toNumber(sz);
56261
+ }
56262
+ }
56263
+ const pos = io.ftell(fid);
56264
+ const CHUNK = 1 << 16;
56265
+ const chunks = [];
56266
+ for (; ; ) {
56267
+ const bytes = io.freadBytes(fid, CHUNK);
56268
+ let s = "";
56269
+ for (let i = 0; i < bytes.length; i++) s += String.fromCharCode(bytes[i]);
56270
+ chunks.push(s);
56271
+ if (bytes.length < CHUNK) break;
56272
+ }
56273
+ const { results, consumed } = scanFormat(chunks.join(""), fmt, maxCount);
56274
+ io.fseek(fid, pos + consumed, -1);
56275
+ const n = results.length;
56276
+ let out;
56277
+ if (rows !== null && Number.isFinite(rows) && rows > 0) {
56278
+ const cols = Math.ceil(n / rows);
56279
+ const data = allocFloat64Array(rows * cols);
56280
+ for (let i = 0; i < n; i++) data[i] = results[i];
56281
+ out = RTV.tensor(data, [rows, cols]);
56282
+ } else if (n === 1) {
56283
+ out = RTV.num(results[0]);
56284
+ } else {
56285
+ out = RTV.tensor(allocFloat64Array(results), [n, 1]);
56286
+ }
56287
+ if (nargout >= 2) return [out, RTV.num(n)];
56288
+ return out;
56289
+ });
55460
56290
  registerSpecial("fileread", (_nargout, args) => {
55461
56291
  const io = requireFileIO();
55462
56292
  const margs = args.map((a) => ensureRuntimeValue(a));
@@ -57884,6 +58714,9 @@ function isa(rt, value, classNameArg) {
57884
58714
  case "class_instance_array":
57885
58715
  valueClass = mv.className;
57886
58716
  break;
58717
+ case "string_array":
58718
+ valueClass = "string";
58719
+ break;
57887
58720
  default:
57888
58721
  valueClass = "unknown";
57889
58722
  break;
@@ -58457,6 +59290,8 @@ function numblClass(v) {
58457
59290
  return "double";
58458
59291
  case "class_instance":
58459
59292
  return v.className;
59293
+ case "string_array":
59294
+ return "string";
58460
59295
  default:
58461
59296
  return "unknown";
58462
59297
  }
@@ -58626,6 +59461,10 @@ function endResolver(mv, numIndices) {
58626
59461
  }
58627
59462
  if (isRuntimeStructArray(mv)) return mv.elements.length;
58628
59463
  if (isRuntimeClassInstanceArray(mv)) return mv.elements.length;
59464
+ if (isRuntimeStringArray(mv)) {
59465
+ if (numIndices === 1) return mv.data.length;
59466
+ return dim < 2 ? mv.shape[dim] : 1;
59467
+ }
58629
59468
  if (isRuntimeSparseMatrix(mv)) {
58630
59469
  if (numIndices === 1) return mv.m * mv.n;
58631
59470
  return dim === 0 ? mv.m : dim === 1 ? mv.n : 1;
@@ -58912,6 +59751,28 @@ function indexCell(rt, base, indices) {
58912
59751
  if (isRuntimeCell(val) && val.data.length === 1) return val.data[0];
58913
59752
  return val;
58914
59753
  }
59754
+ if (isRuntimeString(mv) || isRuntimeStringArray(mv)) {
59755
+ const idxMvals2 = resolveIndices(indices, endResolver(mv, indices.length));
59756
+ const elems = isRuntimeString(mv) ? [mv] : mv.data;
59757
+ const shape = isRuntimeString(mv) ? [1, 1] : mv.shape;
59758
+ let lin;
59759
+ if (idxMvals2.length === 1) {
59760
+ lin = Math.round(toNumber(idxMvals2[0])) - 1;
59761
+ } else if (idxMvals2.length === 2) {
59762
+ const r = Math.round(toNumber(idxMvals2[0])) - 1;
59763
+ const c = Math.round(toNumber(idxMvals2[1])) - 1;
59764
+ if (r < 0 || r >= shape[0] || c < 0 || c >= shape[1])
59765
+ throw new RuntimeError("Index exceeds array bounds");
59766
+ lin = c * shape[0] + r;
59767
+ } else {
59768
+ throw new RuntimeError(
59769
+ "String brace indexing supports 1 or 2 subscripts"
59770
+ );
59771
+ }
59772
+ if (lin < 0 || lin >= elems.length)
59773
+ throw new RuntimeError("Index exceeds array bounds");
59774
+ return RTV.char(elems[lin]);
59775
+ }
58915
59776
  if (!isRuntimeCell(mv)) throw new RuntimeError("Cell indexing on non-cell");
58916
59777
  const idxMvals = resolveIndices(indices, endResolver(mv, indices.length));
58917
59778
  if (idxMvals.length === 1) {
@@ -59105,6 +59966,15 @@ function indexStore(rt, base, indices, rhs, skipSubsasgn = false) {
59105
59966
  return rhsMv2;
59106
59967
  }
59107
59968
  }
59969
+ {
59970
+ const rhsMv0 = ensureRuntimeValue(rhs);
59971
+ const baseIsStr = isRuntimeString(mv) || isRuntimeStringArray(mv);
59972
+ const baseEmpty = isRuntimeTensor(mv) && mv.data.length === 0;
59973
+ const rhsIsStr = isRuntimeString(rhsMv0) || isRuntimeStringArray(rhsMv0);
59974
+ if (baseIsStr || baseEmpty && rhsIsStr) {
59975
+ return stringArrayIndexStore(mv, indices, rhsMv0);
59976
+ }
59977
+ }
59108
59978
  let wasScalar = false;
59109
59979
  let wasChar = false;
59110
59980
  if (!isRuntimeTensor(mv)) {
@@ -59148,6 +60018,109 @@ function indexStore(rt, base, indices, rhs, skipSubsasgn = false) {
59148
60018
  }
59149
60019
  return result;
59150
60020
  }
60021
+ function rhsToStringElems(rhsMv) {
60022
+ if (isRuntimeString(rhsMv)) return [rhsMv];
60023
+ if (isRuntimeStringArray(rhsMv)) return rhsMv.data.slice();
60024
+ if (isRuntimeChar(rhsMv)) {
60025
+ const rows = rhsMv.shape ? rhsMv.shape[0] : 1;
60026
+ if (rows <= 1) return [rhsMv.value];
60027
+ const width = rhsMv.shape[1];
60028
+ const out = [];
60029
+ for (let r = 0; r < rows; r++)
60030
+ out.push(rhsMv.value.slice(r * width, (r + 1) * width));
60031
+ return out;
60032
+ }
60033
+ if (isRuntimeNumber(rhsMv)) return [matlabNumToString(rhsMv)];
60034
+ if (isRuntimeLogical(rhsMv)) return [rhsMv ? "true" : "false"];
60035
+ if (isRuntimeTensor(rhsMv))
60036
+ return Array.from(rhsMv.data, (d) => matlabNumToString(d));
60037
+ return null;
60038
+ }
60039
+ function stringArrayIndexStore(mv, indices, rhsMv) {
60040
+ let data;
60041
+ let rows;
60042
+ let cols;
60043
+ if (isRuntimeStringArray(mv)) {
60044
+ data = mv.data.slice();
60045
+ [rows, cols] = mv.shape;
60046
+ } else if (isRuntimeString(mv)) {
60047
+ data = [mv];
60048
+ rows = 1;
60049
+ cols = 1;
60050
+ } else {
60051
+ data = [];
60052
+ rows = 0;
60053
+ cols = 0;
60054
+ }
60055
+ const idxMvals = resolveIndices(indices, endResolver(mv, indices.length));
60056
+ if (isRuntimeTensor(rhsMv) && rhsMv.data.length === 0 && idxMvals.length === 1) {
60057
+ const del = new Set(stringArraySubscript(idxMvals[0], data.length));
60058
+ const kept = data.filter((_, i) => !del.has(i));
60059
+ if (cols === 1 && rows > 1) return stringArrayValue(kept, [kept.length, 1]);
60060
+ return stringArrayValue(kept, [1, kept.length]);
60061
+ }
60062
+ const rhsElems = rhsToStringElems(rhsMv);
60063
+ if (rhsElems === null) {
60064
+ throw new RuntimeError("Cannot assign this value into a string array");
60065
+ }
60066
+ if (idxMvals.length === 1) {
60067
+ const positions = stringArraySubscript(idxMvals[0], data.length);
60068
+ const maxPos = positions.length ? Math.max(...positions) : -1;
60069
+ if (positions.some((p2) => p2 < 0)) {
60070
+ throw new RuntimeError("Index must be a positive integer");
60071
+ }
60072
+ if (maxPos >= data.length) {
60073
+ if (rows > 1 && cols > 1) {
60074
+ throw new RuntimeError("Index exceeds array bounds");
60075
+ }
60076
+ while (data.length <= maxPos) data.push("");
60077
+ }
60078
+ if (rhsElems.length !== 1 && rhsElems.length !== positions.length) {
60079
+ throw new RuntimeError(
60080
+ "Unable to perform assignment because the left and right sides have a different number of elements"
60081
+ );
60082
+ }
60083
+ positions.forEach((p2, k) => {
60084
+ data[p2] = rhsElems.length === 1 ? rhsElems[0] : rhsElems[k];
60085
+ });
60086
+ if (rows > 1 && cols > 1) return stringArrayValue(data, [rows, cols]);
60087
+ if (cols === 1 && rows > 1) return stringArrayValue(data, [data.length, 1]);
60088
+ return stringArrayValue(data, [1, data.length]);
60089
+ }
60090
+ if (idxMvals.length === 2) {
60091
+ const ri = stringArraySubscript(idxMvals[0], rows);
60092
+ const ci = stringArraySubscript(idxMvals[1], cols);
60093
+ if (ri.some((p2) => p2 < 0) || ci.some((p2) => p2 < 0)) {
60094
+ throw new RuntimeError("Index must be a positive integer");
60095
+ }
60096
+ const newRows = Math.max(rows, ri.length ? Math.max(...ri) + 1 : 0);
60097
+ const newCols = Math.max(cols, ci.length ? Math.max(...ci) + 1 : 0);
60098
+ let grid = data;
60099
+ if (newRows !== rows || newCols !== cols) {
60100
+ grid = new Array(newRows * newCols).fill("");
60101
+ for (let c = 0; c < cols; c++) {
60102
+ for (let r = 0; r < rows; r++) {
60103
+ grid[c * newRows + r] = data[c * rows + r];
60104
+ }
60105
+ }
60106
+ }
60107
+ const count = ri.length * ci.length;
60108
+ if (rhsElems.length !== 1 && rhsElems.length !== count) {
60109
+ throw new RuntimeError(
60110
+ "Unable to perform assignment because the left and right sides have a different number of elements"
60111
+ );
60112
+ }
60113
+ let k = 0;
60114
+ for (const c of ci) {
60115
+ for (const r of ri) {
60116
+ grid[c * newRows + r] = rhsElems.length === 1 ? rhsElems[0] : rhsElems[k];
60117
+ k++;
60118
+ }
60119
+ }
60120
+ return stringArrayValue(grid, [newRows, newCols]);
60121
+ }
60122
+ throw new RuntimeError("String array assignment supports 1 or 2 subscripts");
60123
+ }
59151
60124
  function indexCellStore(base, indices, rhs, rt) {
59152
60125
  if (base === void 0 || base === null) base = RTV.cell([], [0, 0]);
59153
60126
  let mv = ensureRuntimeValue(base);
@@ -61361,6 +62334,7 @@ var Runtime = class _Runtime {
61361
62334
  if (isRuntimeChar(rv))
61362
62335
  return rv.shape ?? (rv.value.length === 0 ? [0, 0] : [1, rv.value.length]);
61363
62336
  if (isRuntimeString(rv)) return [1, 1];
62337
+ if (isRuntimeStringArray(rv)) return [...rv.shape];
61364
62338
  if (isRuntimeClassInstance(rv)) return [1, 1];
61365
62339
  return [1, 1];
61366
62340
  }
@@ -64372,13 +65346,16 @@ function evalExprNargout(expr, nargout) {
64372
65346
  return ctx.dimIndex < rv.shape.length ? rv.shape[ctx.dimIndex] : 1;
64373
65347
  }
64374
65348
  if (isRuntimeChar(rv)) return rv.value.length;
64375
- if (isRuntimeString(rv)) return rv.length;
65349
+ if (isRuntimeString(rv)) return 1;
64376
65350
  if (isRuntimeClassInstance(rv)) {
64377
- return this.rt.dispatch("end", 1, [
64378
- rv,
64379
- ctx.dimIndex + 1,
64380
- ctx.numIndices
64381
- ]);
65351
+ if (this.rt.resolveClassMethod?.(rv.className, "end")) {
65352
+ return this.rt.dispatch("end", 1, [
65353
+ rv,
65354
+ ctx.dimIndex + 1,
65355
+ ctx.numIndices
65356
+ ]);
65357
+ }
65358
+ return 1;
64382
65359
  }
64383
65360
  if (isRuntimeStructArray(rv)) {
64384
65361
  return rv.elements.length;
@@ -64387,6 +65364,10 @@ function evalExprNargout(expr, nargout) {
64387
65364
  if (ctx.numIndices === 1) return rv.elements.length;
64388
65365
  return ctx.dimIndex < rv.shape.length ? rv.shape[ctx.dimIndex] : 1;
64389
65366
  }
65367
+ if (isRuntimeStringArray(rv)) {
65368
+ if (ctx.numIndices === 1) return rv.data.length;
65369
+ return ctx.dimIndex < 2 ? rv.shape[ctx.dimIndex] : 1;
65370
+ }
64390
65371
  if (isRuntimeSparseMatrix(rv)) {
64391
65372
  if (ctx.numIndices === 1) return rv.m * rv.n;
64392
65373
  return ctx.dimIndex === 0 ? rv.m : ctx.dimIndex === 1 ? rv.n : 1;
@@ -64711,7 +65692,8 @@ function evalMember(expr, nargout) {
64711
65692
  if (lastDot > 0) {
64712
65693
  const prefix = dottedName.slice(0, lastDot);
64713
65694
  const methodName = dottedName.slice(lastDot + 1);
64714
- if (this.functionIndex.classStaticMethods.get(prefix)?.has(methodName)) {
65695
+ if (this.functionIndex.classStaticMethods.get(prefix)?.has(methodName) || // Implicit static `ClassName.empty` (handled by interpretClassMethod)
65696
+ methodName === "empty" && this.functionIndex.workspaceClasses.has(prefix)) {
64715
65697
  const target = {
64716
65698
  kind: "classMethod",
64717
65699
  className: prefix,
@@ -65963,6 +66945,22 @@ function interpretClassMethod(target, args, nargout) {
65963
66945
  () => this.callUserFunction(extFn, actualArgs2, nargout)
65964
66946
  );
65965
66947
  }
66948
+ if (methodName === "empty") {
66949
+ const dims = [];
66950
+ for (const a of args) {
66951
+ const rv = ensureRuntimeValue(a);
66952
+ if (isRuntimeTensor(rv)) for (const d of rv.data) dims.push(d);
66953
+ else dims.push(toNumber(rv));
66954
+ }
66955
+ if (dims.length === 1) dims.push(dims[0]);
66956
+ if (dims.length === 0) dims.push(0, 0);
66957
+ if (!dims.some((d) => d === 0)) {
66958
+ throw new RuntimeError(
66959
+ `${className}.empty: at least one dimension must be zero`
66960
+ );
66961
+ }
66962
+ return RTV.classInstanceArray(className, [], [dims[0], dims[1]]);
66963
+ }
65966
66964
  throw new RuntimeError(
65967
66965
  `No method '${methodName}' for class '${className}'`
65968
66966
  );
@@ -66088,8 +67086,9 @@ function callUserFunction(fn, args, nargout, narginOverride) {
66088
67086
  const fnEnv = new Environment();
66089
67087
  fnEnv.rt = this.rt;
66090
67088
  fnEnv.persistentFuncId = `${this.currentFile}:${fn.name}`;
66091
- const hasVarargin = fn.params.length > 0 && fn.params[fn.params.length - 1] === "varargin";
66092
- const regularParams = hasVarargin ? fn.params.slice(0, -1) : fn.params;
67089
+ const vararginIdx = fn.params.indexOf("varargin");
67090
+ const hasVarargin = vararginIdx !== -1;
67091
+ const regularParams = hasVarargin ? fn.params.slice(0, vararginIdx) : fn.params;
66093
67092
  let numPositional = regularParams.length;
66094
67093
  const inputBlocks = (fn.argumentsBlocks ?? []).filter(
66095
67094
  (b) => b.kind !== "Output"
@@ -66108,7 +67107,14 @@ function callUserFunction(fn, args, nargout, narginOverride) {
66108
67107
  }
66109
67108
  }
66110
67109
  if (hasVarargin) {
66111
- const extraArgs = sharedArgs.slice(regularParams.length).map((a) => ensureRuntimeValue(a));
67110
+ let extras = sharedArgs.slice(regularParams.length);
67111
+ if (vararginIdx !== fn.params.length - 1) {
67112
+ extras = extras.slice(
67113
+ 0,
67114
+ nameValueTailStart(extras, nameValueFieldNames(fn))
67115
+ );
67116
+ }
67117
+ const extraArgs = extras.map((a) => ensureRuntimeValue(a));
66112
67118
  fnEnv.set("varargin", RTV.cell(extraArgs, [1, extraArgs.length]));
66113
67119
  }
66114
67120
  fnEnv.set("$nargin", narginOverride ?? args.length);
@@ -66493,6 +67499,28 @@ function evalInLocalScope(codeArg, fileName) {
66493
67499
  }
66494
67500
  throw new RuntimeError("eval not available in this context");
66495
67501
  }
67502
+ function nameValueFieldNames(fn) {
67503
+ const names = /* @__PURE__ */ new Set();
67504
+ for (const block of fn.argumentsBlocks ?? []) {
67505
+ if (block.kind === "Output" || block.kind === "OutputRepeating") continue;
67506
+ for (const e of block.entries) {
67507
+ const dot2 = e.name.indexOf(".");
67508
+ if (dot2 >= 0) names.add(e.name.slice(dot2 + 1));
67509
+ }
67510
+ }
67511
+ return names;
67512
+ }
67513
+ function nameValueTailStart(extras, fieldNames) {
67514
+ if (fieldNames.size === 0) return extras.length;
67515
+ for (let i = 0; i < extras.length; i++) {
67516
+ if (extras[i] === void 0) continue;
67517
+ const rv = ensureRuntimeValue(extras[i]);
67518
+ if ((isRuntimeChar(rv) || isRuntimeString(rv)) && fieldNames.has(toString(rv))) {
67519
+ return i;
67520
+ }
67521
+ }
67522
+ return extras.length;
67523
+ }
66496
67524
  function processArgumentsBlocks(fn, args) {
66497
67525
  const argBlocks = fn.argumentsBlocks;
66498
67526
  if (!argBlocks || argBlocks.length === 0) return;
@@ -66527,9 +67555,18 @@ function processArgumentsBlocks(fn, args) {
66527
67555
  );
66528
67556
  }
66529
67557
  }
67558
+ const vararginIdx = fn.params.indexOf("varargin");
66530
67559
  for (const [paramName, fields] of nvGroups) {
66531
67560
  const pIdx = fn.params.indexOf(paramName);
66532
- const nvArgs = args.slice(pIdx >= 0 ? pIdx : args.length);
67561
+ let nvArgs;
67562
+ if (pIdx >= 0 && vararginIdx >= 0 && vararginIdx < pIdx) {
67563
+ const extras = args.slice(vararginIdx);
67564
+ nvArgs = extras.slice(
67565
+ nameValueTailStart(extras, nameValueFieldNames(fn))
67566
+ );
67567
+ } else {
67568
+ nvArgs = args.slice(pIdx >= 0 ? pIdx : args.length);
67569
+ }
66533
67570
  const defaults = {};
66534
67571
  for (const { field, defaultExpr } of fields) {
66535
67572
  if (defaultExpr) defaults[field] = this.evalExpr(defaultExpr);
@@ -67815,6 +68852,11 @@ var shimFiles = [
67815
68852
  else
67816
68853
  result = val;
67817
68854
  end
68855
+ % The backing dictionary stores char values as strings;
68856
+ % MATLAB's containers.Map hands back char.
68857
+ if strcmp(obj.ValueType, 'char') && isstring(result)
68858
+ result = char(result);
68859
+ end
67818
68860
  elseif strcmp(S(1).type, '.')
67819
68861
  result = builtin('subsref', obj, S);
67820
68862
  elseif strcmp(S(1).type, '{}')
@@ -67848,11 +68890,14 @@ var shimFiles = [
67848
68890
  end
67849
68891
  k = keys(obj.data_);
67850
68892
  if strcmp(obj.KeyType, 'char')
67851
- % Return cell array of char vectors
67852
- if iscell(k)
67853
- result = k;
67854
- else
67855
- result = {k};
68893
+ % Return a cellstr: the backing dictionary stores keys as
68894
+ % strings, but MATLAB's containers.Map returns char vectors.
68895
+ if ~iscell(k)
68896
+ k = {k};
68897
+ end
68898
+ result = cell(size(k));
68899
+ for i = 1:numel(k)
68900
+ result{i} = char(k{i});
67856
68901
  end
67857
68902
  else
67858
68903
  % Numeric keys: parse back from string
@@ -67885,6 +68930,14 @@ var shimFiles = [
67885
68930
  result{i} = v(i);
67886
68931
  end
67887
68932
  end
68933
+ if strcmp(obj.ValueType, 'char')
68934
+ % Stored as strings in the dictionary; MATLAB returns char.
68935
+ for i = 1:numel(result)
68936
+ if isstring(result{i})
68937
+ result{i} = char(result{i});
68938
+ end
68939
+ end
68940
+ end
67888
68941
  end
67889
68942
  end
67890
68943
 
@@ -91025,6 +92078,31 @@ function executeCode(source, options = {}, workspaceFiles, mainFileName = "scrip
91025
92078
  implicitCwdPath = null;
91026
92079
  }
91027
92080
  }
92081
+ if (searchPaths && options.fileIO?.scanDirectory) {
92082
+ const haveM = new Set(mWorkspaceFiles.map((f) => f.name));
92083
+ for (const dir of searchPaths) {
92084
+ try {
92085
+ const absDir = options.fileIO.resolvePath?.(dir) ?? dir;
92086
+ for (const f of options.fileIO.scanDirectory(absDir)) {
92087
+ if (f.name.endsWith(".m")) {
92088
+ if (!haveM.has(f.name)) {
92089
+ mWorkspaceFiles.push(f);
92090
+ haveM.add(f.name);
92091
+ }
92092
+ } else if (isNumblJsFile(f.name)) {
92093
+ if (!jsWorkspaceFiles.some((e) => e.name === f.name)) {
92094
+ jsWorkspaceFiles.push(f);
92095
+ }
92096
+ } else if (f.name.endsWith(".wasm")) {
92097
+ if (!wasmWorkspaceFiles.some((e) => e.name === f.name)) {
92098
+ wasmWorkspaceFiles.push(f);
92099
+ }
92100
+ }
92101
+ }
92102
+ } catch {
92103
+ }
92104
+ }
92105
+ }
91028
92106
  const jsUserFunctions = loadJsUserFunctions(
91029
92107
  jsWorkspaceFiles,
91030
92108
  wasmWorkspaceFiles,
@@ -92139,18 +93217,24 @@ var BrowserFileIOAdapter = class {
92139
93217
  }
92140
93218
  entry.dirty = true;
92141
93219
  }
93220
+ /**
93221
+ * `entry.pos` stays the logical (consumed) byte position: the text buffer
93222
+ * holds the bytes starting at `entry.pos`, and consuming a line advances
93223
+ * `entry.pos` by its byte length. This keeps fgetl/fgets coherent with
93224
+ * freadBytes/fseek/ftell (and fscanf, which mixes the two).
93225
+ */
92142
93226
  readLine(entry, keepNewline) {
92143
93227
  while (!entry.eof) {
92144
93228
  const nlIdx2 = entry.buffer.indexOf("\n");
92145
93229
  if (nlIdx2 !== -1) break;
92146
- const available = entry.dataLen - entry.pos;
93230
+ const bufStart = entry.pos + TEXT_ENCODER.encode(entry.buffer).length;
93231
+ const available = entry.dataLen - bufStart;
92147
93232
  if (available <= 0) {
92148
93233
  entry.eof = true;
92149
93234
  break;
92150
93235
  }
92151
93236
  const toRead = Math.min(READ_CHUNK_SIZE, available);
92152
- const chunk = entry.data.subarray(entry.pos, entry.pos + toRead);
92153
- entry.pos += toRead;
93237
+ const chunk = entry.data.subarray(bufStart, bufStart + toRead);
92154
93238
  entry.buffer += TEXT_DECODER.decode(chunk, { stream: true });
92155
93239
  }
92156
93240
  if (entry.buffer.length === 0) {
@@ -92158,12 +93242,15 @@ var BrowserFileIOAdapter = class {
92158
93242
  }
92159
93243
  const nlIdx = entry.buffer.indexOf("\n");
92160
93244
  if (nlIdx !== -1) {
92161
- const line2 = keepNewline ? entry.buffer.slice(0, nlIdx + 1) : entry.buffer.slice(0, nlIdx);
93245
+ const consumed = entry.buffer.slice(0, nlIdx + 1);
93246
+ const line2 = keepNewline ? consumed : entry.buffer.slice(0, nlIdx);
92162
93247
  entry.buffer = entry.buffer.slice(nlIdx + 1);
93248
+ entry.pos += TEXT_ENCODER.encode(consumed).length;
92163
93249
  return line2;
92164
93250
  }
92165
93251
  const line = entry.buffer;
92166
93252
  entry.buffer = "";
93253
+ entry.pos += TEXT_ENCODER.encode(line).length;
92167
93254
  return line;
92168
93255
  }
92169
93256
  listDirGlob(pattern) {