numbl 0.4.8 → 0.4.10

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 +69 -0
  4. package/dist-browser/browser/session.d.ts +60 -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 +151 -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-cli/cli.js CHANGED
@@ -678,6 +678,7 @@ var isRuntimeStructArray = (value) => typeof value === "object" && value !== nul
678
678
  var isRuntimeClassInstanceArray = (value) => typeof value === "object" && value !== null && value.kind === "class_instance_array";
679
679
  var isRuntimeSparseMatrix = (value) => typeof value === "object" && value !== null && value.kind === "sparse_matrix";
680
680
  var isRuntimeDictionary = (value) => typeof value === "object" && value !== null && value.kind === "dictionary";
681
+ var isRuntimeStringArray = (value) => typeof value === "object" && value !== null && value.kind === "string_array";
681
682
  var kstr = (value) => {
682
683
  if (isRuntimeNumber(value)) return "number";
683
684
  if (isRuntimeLogical(value)) return "logical";
@@ -696,6 +697,7 @@ var kstr = (value) => {
696
697
  if (isRuntimeStructArray(value)) return "struct array";
697
698
  if (isRuntimeSparseMatrix(value)) return "sparse matrix";
698
699
  if (isRuntimeDictionary(value)) return "dictionary";
700
+ if (isRuntimeStringArray(value)) return "string array";
699
701
  return "unknown";
700
702
  };
701
703
  var RuntimeTensor = class extends Refcounted {
@@ -727,6 +729,24 @@ var RuntimeChar = class extends Refcounted {
727
729
  this.shape = shape;
728
730
  }
729
731
  };
732
+ var RuntimeStringArray = class extends Refcounted {
733
+ kind = "string_array";
734
+ /** Elements in column-major order (plain JS strings). */
735
+ data;
736
+ /** 2-D shape [rows, cols]; data.length === rows*cols. A 1x1 string is
737
+ * normally represented as a primitive JS string, not a 1x1 array —
738
+ * use stringArrayValue() to build results so scalars collapse. */
739
+ shape;
740
+ constructor(data, shape) {
741
+ super();
742
+ this.data = data;
743
+ this.shape = shape;
744
+ }
745
+ };
746
+ function stringArrayValue(data, shape) {
747
+ if (data.length === 1 && shape[0] === 1 && shape[1] === 1) return data[0];
748
+ return new RuntimeStringArray(data, shape);
749
+ }
730
750
  var RuntimeCell = class extends Refcounted {
731
751
  kind = "cell";
732
752
  data;
@@ -2603,6 +2623,10 @@ var RTV = {
2603
2623
  string(value) {
2604
2624
  return value;
2605
2625
  },
2626
+ /** String array (does NOT collapse 1x1 — use stringArrayValue for that). */
2627
+ stringArray(data, shape) {
2628
+ return new RuntimeStringArray(data, shape);
2629
+ },
2606
2630
  char(value) {
2607
2631
  return new RuntimeChar(value);
2608
2632
  },
@@ -3237,6 +3261,29 @@ function sub2ind(shape, subs) {
3237
3261
  }
3238
3262
  return idx;
3239
3263
  }
3264
+ function matlabNumToString(n) {
3265
+ if (n === Infinity) return "Inf";
3266
+ if (n === -Infinity) return "-Inf";
3267
+ if (isNaN(n)) return "NaN";
3268
+ if (n === 0) return "0";
3269
+ if (Number.isInteger(n)) return String(n);
3270
+ const prec = 5;
3271
+ const exp2 = Math.floor(Math.log10(Math.abs(n)));
3272
+ let s;
3273
+ if (exp2 < -4 || exp2 >= prec) {
3274
+ s = n.toExponential(prec - 1);
3275
+ const ePos = s.indexOf("e");
3276
+ let mantissa = s.slice(0, ePos);
3277
+ const expPart0 = s.slice(ePos);
3278
+ if (mantissa.includes(".")) mantissa = mantissa.replace(/\.?0+$/, "");
3279
+ const expPart = expPart0.replace(/([eE][+-])(\d)$/, "$10$2");
3280
+ s = mantissa + expPart;
3281
+ } else {
3282
+ s = n.toPrecision(prec);
3283
+ if (s.includes(".")) s = s.replace(/\.?0+$/, "");
3284
+ }
3285
+ return s;
3286
+ }
3240
3287
 
3241
3288
  // src/numbl-core/helpers/sparse-arithmetic.ts
3242
3289
  function isComplexSparse(S) {
@@ -3993,6 +4040,11 @@ function toString(v) {
3993
4040
  switch (v.kind) {
3994
4041
  case "char":
3995
4042
  return v.value;
4043
+ case "string_array":
4044
+ if (v.data.length === 1) return v.data[0];
4045
+ throw new RuntimeError(
4046
+ "Expected a scalar text value, got a string array"
4047
+ );
3996
4048
  default:
3997
4049
  throw new RuntimeError(`Cannot convert ${kstr(v)} to string`);
3998
4050
  }
@@ -21626,6 +21678,15 @@ var valuesAreEqual = (a, b) => {
21626
21678
  }
21627
21679
  case "dictionary":
21628
21680
  return a === b;
21681
+ case "string_array": {
21682
+ const sb = b;
21683
+ if (a.shape[0] !== sb.shape[0] || a.shape[1] !== sb.shape[1])
21684
+ return false;
21685
+ for (let i = 0; i < a.data.length; i++) {
21686
+ if (a.data[i] !== sb.data[i]) return false;
21687
+ }
21688
+ return true;
21689
+ }
21629
21690
  default:
21630
21691
  return false;
21631
21692
  }
@@ -21678,7 +21739,34 @@ function displayValue(v) {
21678
21739
  return formatDictionary(v);
21679
21740
  case "class_instance_array":
21680
21741
  return ` ${v.shape[0]}x${v.shape[1]} ${v.className} array`;
21742
+ case "string_array":
21743
+ return formatStringArray(v);
21744
+ }
21745
+ }
21746
+ function formatStringArray(v) {
21747
+ const [rows, cols] = v.shape;
21748
+ if (v.data.length === 0) {
21749
+ return ` ${rows}x${cols} empty string array`;
21750
+ }
21751
+ const quoted = v.data.map((s) => `"${s}"`);
21752
+ const widths = [];
21753
+ for (let c = 0; c < cols; c++) {
21754
+ let w = 0;
21755
+ for (let r = 0; r < rows; r++) {
21756
+ w = Math.max(w, quoted[c * rows + r].length);
21757
+ }
21758
+ widths.push(w);
21759
+ }
21760
+ const lines = [];
21761
+ for (let r = 0; r < rows; r++) {
21762
+ const parts = [];
21763
+ for (let c = 0; c < cols; c++) {
21764
+ const q = quoted[c * rows + r];
21765
+ parts.push(c === cols - 1 ? q : q.padEnd(widths[c]));
21766
+ }
21767
+ lines.push(" " + parts.join(" "));
21681
21768
  }
21769
+ return lines.join("\n");
21682
21770
  }
21683
21771
  var formatStructArray = (v) => {
21684
21772
  const elements = v.elements;
@@ -22799,6 +22887,68 @@ function indexIntoChar(base, indices) {
22799
22887
  }
22800
22888
  throw new RuntimeError("Char indexing supports 1 or 2 dimensions");
22801
22889
  }
22890
+ function stringArraySubscript(idx, extent) {
22891
+ if (isColonIndex(idx)) {
22892
+ return Array.from({ length: extent }, (_, i) => i);
22893
+ }
22894
+ if (isRuntimeTensor(idx)) {
22895
+ if (idx._isLogical) {
22896
+ const out = [];
22897
+ for (let i = 0; i < idx.data.length; i++)
22898
+ if (idx.data[i] !== 0) out.push(i);
22899
+ return out;
22900
+ }
22901
+ return Array.from(idx.data, (v) => Math.round(v) - 1);
22902
+ }
22903
+ if (isRuntimeLogical(idx)) return idx ? [0] : [];
22904
+ return [Math.round(toNumber(idx)) - 1];
22905
+ }
22906
+ function indexIntoStringArray(base, indices) {
22907
+ const [rows, cols] = base.shape;
22908
+ const total = base.data.length;
22909
+ if (indices.length === 2) {
22910
+ const ri = stringArraySubscript(indices[0], rows);
22911
+ const ci = stringArraySubscript(indices[1], cols);
22912
+ const out2 = [];
22913
+ for (const c of ci) {
22914
+ if (c < 0 || c >= cols)
22915
+ throw new RuntimeError("Index exceeds array bounds");
22916
+ for (const r of ri) {
22917
+ if (r < 0 || r >= rows)
22918
+ throw new RuntimeError("Index exceeds array bounds");
22919
+ out2.push(base.data[c * rows + r]);
22920
+ }
22921
+ }
22922
+ return stringArrayValue(out2, [ri.length, ci.length]);
22923
+ }
22924
+ if (indices.length !== 1) {
22925
+ throw new RuntimeError("String array indexing supports 1 or 2 subscripts");
22926
+ }
22927
+ const idx = indices[0];
22928
+ if (isColonIndex(idx)) {
22929
+ return stringArrayValue(base.data.slice(), [total, 1]);
22930
+ }
22931
+ const linear = stringArraySubscript(idx, total);
22932
+ const out = [];
22933
+ for (const i of linear) {
22934
+ if (i < 0 || i >= total)
22935
+ throw new RuntimeError("Index exceeds array bounds");
22936
+ out.push(base.data[i]);
22937
+ }
22938
+ let shape;
22939
+ if (rows === 1 || cols === 1) {
22940
+ shape = rows === 1 ? [1, out.length] : [out.length, 1];
22941
+ } else if (isRuntimeTensor(idx) && !idx._isLogical) {
22942
+ const is = idx.shape;
22943
+ const im = is.length >= 2 ? is[0] : 1;
22944
+ shape = [im, out.length / (im || 1)];
22945
+ } else if (isRuntimeTensor(idx) && idx._isLogical) {
22946
+ shape = [out.length, 1];
22947
+ } else {
22948
+ shape = [1, out.length];
22949
+ }
22950
+ return stringArrayValue(out, shape);
22951
+ }
22802
22952
  function indexIntoLogical(base, indices) {
22803
22953
  if (indices.length === 1) {
22804
22954
  const idx = indices[0];
@@ -22929,6 +23079,9 @@ function indexIntoRTValue(base, indices) {
22929
23079
  return base;
22930
23080
  }
22931
23081
  }
23082
+ if (isRuntimeStringArray(base)) {
23083
+ return indexIntoStringArray(base, indices);
23084
+ }
22932
23085
  if (isRuntimeLogical(base)) {
22933
23086
  return indexIntoLogical(base, indices);
22934
23087
  }
@@ -23750,26 +23903,18 @@ function horzcat(...values) {
23750
23903
  if (values.some((v) => isRuntimeCell(v))) {
23751
23904
  return cellCatAlongDim(values, 1);
23752
23905
  }
23906
+ if (values.some((v) => isRuntimeString(v) || isRuntimeStringArray(v))) {
23907
+ return stringCat(values, 1);
23908
+ }
23753
23909
  if (values.some((v) => isRuntimeChar(v))) {
23754
23910
  let result = "";
23755
23911
  for (const v of values) {
23756
23912
  if (isRuntimeChar(v)) result += v.value;
23757
- else if (isRuntimeString(v)) result += v;
23758
23913
  else if (isRuntimeNumber(v)) result += String.fromCharCode(Math.round(v));
23759
23914
  else throw new RuntimeError(`Cannot concatenate ${kstr(v)} into char`);
23760
23915
  }
23761
23916
  return RTV.char(result);
23762
23917
  }
23763
- if (values.some((v) => isRuntimeString(v) || isRuntimeChar(v))) {
23764
- let result = "";
23765
- for (const v of values) {
23766
- if (isRuntimeString(v)) result += v;
23767
- else if (isRuntimeChar(v)) result += v.value;
23768
- else if (isRuntimeNumber(v)) result += String(v);
23769
- else throw new RuntimeError(`Cannot concatenate ${v} into string`);
23770
- }
23771
- return RTV.string(result);
23772
- }
23773
23918
  if (values.some((v) => isRuntimeStruct(v) || isRuntimeStructArray(v))) {
23774
23919
  return structCat(values);
23775
23920
  }
@@ -23784,6 +23929,9 @@ function vertcat(...values) {
23784
23929
  if (values.some((v) => isRuntimeCell(v))) {
23785
23930
  return cellCatAlongDim(values, 0);
23786
23931
  }
23932
+ if (values.some((v) => isRuntimeString(v) || isRuntimeStringArray(v))) {
23933
+ return stringCat(values, 0);
23934
+ }
23787
23935
  if (values.some((v) => isRuntimeChar(v))) {
23788
23936
  return vertcatChars(values);
23789
23937
  }
@@ -23792,6 +23940,86 @@ function vertcat(...values) {
23792
23940
  }
23793
23941
  return catAlongDim(values, 0);
23794
23942
  }
23943
+ function toStringBlock(v) {
23944
+ if (isRuntimeString(v)) return { data: [v], rows: 1, cols: 1 };
23945
+ if (isRuntimeStringArray(v)) {
23946
+ if (v.data.length === 0) return null;
23947
+ return { data: v.data.slice(), rows: v.shape[0], cols: v.shape[1] };
23948
+ }
23949
+ if (isRuntimeChar(v)) {
23950
+ const rows = v.shape ? v.shape[0] : 1;
23951
+ const width = v.shape ? v.shape[1] : v.value.length;
23952
+ if (rows <= 1) return { data: [v.value], rows: 1, cols: 1 };
23953
+ const out = [];
23954
+ for (let r = 0; r < rows; r++) {
23955
+ out.push(v.value.slice(r * width, (r + 1) * width));
23956
+ }
23957
+ return { data: out, rows, cols: 1 };
23958
+ }
23959
+ if (isRuntimeNumber(v)) {
23960
+ return { data: [matlabNumToString(v)], rows: 1, cols: 1 };
23961
+ }
23962
+ if (isRuntimeLogical(v)) {
23963
+ return { data: [v ? "true" : "false"], rows: 1, cols: 1 };
23964
+ }
23965
+ if (isRuntimeTensor(v)) {
23966
+ if (v.data.length === 0) return null;
23967
+ const rows = v.shape.length >= 2 ? v.shape[0] : 1;
23968
+ const cols = v.data.length / (rows || 1);
23969
+ const out = [];
23970
+ for (let i = 0; i < v.data.length; i++) {
23971
+ out.push(
23972
+ v._isLogical ? v.data[i] ? "true" : "false" : matlabNumToString(v.data[i])
23973
+ );
23974
+ }
23975
+ return { data: out, rows, cols };
23976
+ }
23977
+ throw new RuntimeError(`Cannot concatenate ${kstr(v)} into string array`);
23978
+ }
23979
+ function stringCat(values, dim) {
23980
+ const blocks = [];
23981
+ for (const v of values) {
23982
+ const b = toStringBlock(v);
23983
+ if (b) blocks.push(b);
23984
+ }
23985
+ if (blocks.length === 0) return RTV.stringArray([], [0, 0]);
23986
+ if (dim === 1) {
23987
+ const rows2 = blocks[0].rows;
23988
+ let cols2 = 0;
23989
+ for (const b of blocks) {
23990
+ if (b.rows !== rows2) {
23991
+ throw new RuntimeError(
23992
+ "Dimensions of arrays being concatenated are not consistent"
23993
+ );
23994
+ }
23995
+ cols2 += b.cols;
23996
+ }
23997
+ const data2 = [];
23998
+ for (const b of blocks) data2.push(...b.data);
23999
+ return stringArrayValue(data2, [rows2, cols2]);
24000
+ }
24001
+ const cols = blocks[0].cols;
24002
+ let rows = 0;
24003
+ for (const b of blocks) {
24004
+ if (b.cols !== cols) {
24005
+ throw new RuntimeError(
24006
+ "Dimensions of arrays being concatenated are not consistent"
24007
+ );
24008
+ }
24009
+ rows += b.rows;
24010
+ }
24011
+ const data = new Array(rows * cols);
24012
+ let rOff = 0;
24013
+ for (const b of blocks) {
24014
+ for (let c = 0; c < cols; c++) {
24015
+ for (let r = 0; r < b.rows; r++) {
24016
+ data[c * rows + rOff + r] = b.data[c * b.rows + r];
24017
+ }
24018
+ }
24019
+ rOff += b.rows;
24020
+ }
24021
+ return stringArrayValue(data, [rows, cols]);
24022
+ }
23795
24023
  function vertcatChars(values) {
23796
24024
  let cols = null;
23797
24025
  let totalRows = 0;
@@ -27736,6 +27964,28 @@ function coerceToConcatString(v) {
27736
27964
  return null;
27737
27965
  }
27738
27966
  function mAdd(a, b) {
27967
+ if (isRuntimeStringArray(a) || isRuntimeStringArray(b)) {
27968
+ const sa = isRuntimeStringArray(a) ? a : null;
27969
+ const sb = isRuntimeStringArray(b) ? b : null;
27970
+ if (sa && sb) {
27971
+ if (sa.shape[0] !== sb.shape[0] || sa.shape[1] !== sb.shape[1]) {
27972
+ throw new RuntimeError("Array dimensions must match for string plus");
27973
+ }
27974
+ return stringArrayValue(
27975
+ sa.data.map((s, i) => s + sb.data[i]),
27976
+ sa.shape
27977
+ );
27978
+ }
27979
+ const arr = sa ?? sb;
27980
+ const other = coerceToConcatString(sa ? b : a);
27981
+ if (other === null) {
27982
+ throw new RuntimeError("Cannot concatenate this value with a string");
27983
+ }
27984
+ return stringArrayValue(
27985
+ arr.data.map((s) => sa ? s + other : other + s),
27986
+ arr.shape
27987
+ );
27988
+ }
27739
27989
  if (isRuntimeString(a) || isRuntimeString(b)) {
27740
27990
  const aStr = coerceToConcatString(a);
27741
27991
  const bStr = coerceToConcatString(b);
@@ -28242,12 +28492,24 @@ function transposeClassInstanceArray(v) {
28242
28492
  }
28243
28493
  return new RuntimeClassInstanceArray(v.className, out, [c, r]);
28244
28494
  }
28495
+ function transposeStringArray(v) {
28496
+ const [r, c] = v.shape;
28497
+ const out = new Array(r * c);
28498
+ for (let i = 0; i < r; i++) {
28499
+ for (let j = 0; j < c; j++) {
28500
+ out[i * c + j] = v.data[j * r + i];
28501
+ }
28502
+ }
28503
+ return stringArrayValue(out, [c, r]);
28504
+ }
28245
28505
  function mTranspose(v) {
28246
28506
  if (isRuntimeSparseMatrix(v)) return sparseTranspose(v);
28247
28507
  if (isRuntimeComplexNumber(v)) return v;
28248
28508
  if (isRuntimeNumber(v) || isRuntimeLogical(v)) return v;
28249
28509
  if (isRuntimeCell(v)) return transposeCellArray(v);
28250
28510
  if (isRuntimeChar(v)) return v;
28511
+ if (isRuntimeString(v)) return v;
28512
+ if (isRuntimeStringArray(v)) return transposeStringArray(v);
28251
28513
  if (isRuntimeClassInstance(v)) return v;
28252
28514
  if (isRuntimeClassInstanceArray(v)) return transposeClassInstanceArray(v);
28253
28515
  if (!isRuntimeTensor(v))
@@ -28260,6 +28522,8 @@ function mConjugateTranspose(v) {
28260
28522
  if (isRuntimeNumber(v) || isRuntimeLogical(v)) return v;
28261
28523
  if (isRuntimeCell(v)) return transposeCellArray(v);
28262
28524
  if (isRuntimeChar(v)) return v;
28525
+ if (isRuntimeString(v)) return v;
28526
+ if (isRuntimeStringArray(v)) return transposeStringArray(v);
28263
28527
  if (isRuntimeClassInstance(v)) return v;
28264
28528
  if (isRuntimeClassInstanceArray(v)) return transposeClassInstanceArray(v);
28265
28529
  if (!isRuntimeTensor(v))
@@ -28272,7 +28536,38 @@ function asStringPair(a, b) {
28272
28536
  if (isRuntimeChar(a) && isRuntimeString(b)) return [a.value, b];
28273
28537
  return null;
28274
28538
  }
28539
+ function textOperandElems(v) {
28540
+ if (isRuntimeString(v)) return { data: [v], shape: [1, 1] };
28541
+ if (isRuntimeChar(v)) {
28542
+ const rows = v.shape ? v.shape[0] : 1;
28543
+ if (rows > 1) return null;
28544
+ return { data: [v.value], shape: [1, 1] };
28545
+ }
28546
+ if (isRuntimeStringArray(v)) return { data: v.data, shape: v.shape };
28547
+ return null;
28548
+ }
28275
28549
  function stringComparisonOp(a, b, op) {
28550
+ if (isRuntimeStringArray(a) || isRuntimeStringArray(b)) {
28551
+ const ta = textOperandElems(a);
28552
+ const tb = textOperandElems(b);
28553
+ if (ta === null || tb === null) return null;
28554
+ const aScalar = ta.data.length === 1 && ta.shape[0] * ta.shape[1] === 1;
28555
+ const bScalar = tb.data.length === 1 && tb.shape[0] * tb.shape[1] === 1;
28556
+ if (!aScalar && !bScalar && (ta.shape[0] !== tb.shape[0] || ta.shape[1] !== tb.shape[1])) {
28557
+ throw new RuntimeError("Array dimensions must match for comparison");
28558
+ }
28559
+ const shape = aScalar ? tb.shape : ta.shape;
28560
+ const n = aScalar ? tb.data.length : ta.data.length;
28561
+ const out = allocFloat64Array(n);
28562
+ for (let i = 0; i < n; i++) {
28563
+ const x = aScalar ? ta.data[0] : ta.data[i];
28564
+ const y = bScalar ? tb.data[0] : tb.data[i];
28565
+ out[i] = op(x, y) ? 1 : 0;
28566
+ }
28567
+ const t = RTV.tensor(out, [shape[0], shape[1]]);
28568
+ t._isLogical = true;
28569
+ return t;
28570
+ }
28276
28571
  const pair = asStringPair(a, b);
28277
28572
  if (pair === null) return null;
28278
28573
  return RTV.logical(op(pair[0], pair[1]));
@@ -31560,9 +31855,9 @@ var ExpressionParser = class extends ParserBase {
31560
31855
  if (this.consume(50 /* LParen */)) {
31561
31856
  const args = [];
31562
31857
  if (!this.consume(51 /* RParen */)) {
31563
- args.push(this.parseExpr());
31858
+ this.parseFuncArg(args);
31564
31859
  while (this.consume(47 /* Comma */)) {
31565
- args.push(this.parseExpr());
31860
+ this.parseFuncArg(args);
31566
31861
  }
31567
31862
  if (!this.consume(51 /* RParen */)) {
31568
31863
  throw this.error("expected ')' after method arguments");
@@ -31591,9 +31886,9 @@ var ExpressionParser = class extends ParserBase {
31591
31886
  }
31592
31887
  const args = [];
31593
31888
  if (!this.consume(51 /* RParen */)) {
31594
- args.push(this.parseExpr());
31889
+ this.parseFuncArg(args);
31595
31890
  while (this.consume(47 /* Comma */)) {
31596
- args.push(this.parseExpr());
31891
+ this.parseFuncArg(args);
31597
31892
  }
31598
31893
  if (!this.consume(51 /* RParen */)) {
31599
31894
  throw this.error("expected ')' after super call arguments");
@@ -32440,13 +32735,8 @@ var FunctionParser = class extends ArgumentsParser {
32440
32735
  }
32441
32736
  }
32442
32737
  const vararginIdx = params.indexOf("varargin");
32443
- if (vararginIdx !== -1) {
32444
- if (vararginIdx !== params.length - 1) {
32445
- throw this.error("'varargin' must be the last input parameter");
32446
- }
32447
- if (params.filter((p2) => p2 === "varargin").length > 1) {
32448
- throw this.error("'varargin' cannot appear more than once");
32449
- }
32738
+ if (vararginIdx !== -1 && params.filter((p2) => p2 === "varargin").length > 1) {
32739
+ throw this.error("'varargin' cannot appear more than once");
32450
32740
  }
32451
32741
  const varargoutIdx = outputs.indexOf("varargout");
32452
32742
  if (varargoutIdx !== -1) {
@@ -32458,6 +32748,22 @@ var FunctionParser = class extends ArgumentsParser {
32458
32748
  }
32459
32749
  }
32460
32750
  const argumentsBlocks = this.parseArgumentsBlocks();
32751
+ if (vararginIdx !== -1 && vararginIdx !== params.length - 1) {
32752
+ const nvBases = /* @__PURE__ */ new Set();
32753
+ for (const block of argumentsBlocks) {
32754
+ if (block.kind === "Output" || block.kind === "OutputRepeating")
32755
+ continue;
32756
+ for (const e of block.entries) {
32757
+ const dot2 = e.name.indexOf(".");
32758
+ if (dot2 >= 0) nvBases.add(e.name.slice(0, dot2));
32759
+ }
32760
+ }
32761
+ for (const p2 of params.slice(vararginIdx + 1)) {
32762
+ if (!nvBases.has(p2)) {
32763
+ throw this.error("'varargin' must be the last input parameter");
32764
+ }
32765
+ }
32766
+ }
32461
32767
  const body = this.parseBlock((t) => t === 15 /* End */);
32462
32768
  if (!this.consume(15 /* End */)) {
32463
32769
  throw this.error("expected 'end'");
@@ -33870,6 +34176,16 @@ function forIter(v) {
33870
34176
  if (isRuntimeChar(mv)) {
33871
34177
  return Array.from(mv.value).map((c) => RTV.char(c));
33872
34178
  }
34179
+ if (isRuntimeStringArray(mv)) {
34180
+ const [rows, cols] = mv.shape;
34181
+ const out = [];
34182
+ for (let c = 0; c < cols; c++) {
34183
+ out.push(
34184
+ stringArrayValue(mv.data.slice(c * rows, (c + 1) * rows), [rows, 1])
34185
+ );
34186
+ }
34187
+ return out;
34188
+ }
33873
34189
  return [v];
33874
34190
  }
33875
34191
  function emptyTensor() {
@@ -35377,6 +35693,9 @@ function isa(rt, value, classNameArg) {
35377
35693
  case "class_instance_array":
35378
35694
  valueClass = mv.className;
35379
35695
  break;
35696
+ case "string_array":
35697
+ valueClass = "string";
35698
+ break;
35380
35699
  default:
35381
35700
  valueClass = "unknown";
35382
35701
  break;
@@ -35950,6 +36269,8 @@ function numblClass(v) {
35950
36269
  return "double";
35951
36270
  case "class_instance":
35952
36271
  return v.className;
36272
+ case "string_array":
36273
+ return "string";
35953
36274
  default:
35954
36275
  return "unknown";
35955
36276
  }
@@ -36505,6 +36826,10 @@ function endResolver(mv, numIndices) {
36505
36826
  }
36506
36827
  if (isRuntimeStructArray(mv)) return mv.elements.length;
36507
36828
  if (isRuntimeClassInstanceArray(mv)) return mv.elements.length;
36829
+ if (isRuntimeStringArray(mv)) {
36830
+ if (numIndices === 1) return mv.data.length;
36831
+ return dim < 2 ? mv.shape[dim] : 1;
36832
+ }
36508
36833
  if (isRuntimeSparseMatrix(mv)) {
36509
36834
  if (numIndices === 1) return mv.m * mv.n;
36510
36835
  return dim === 0 ? mv.m : dim === 1 ? mv.n : 1;
@@ -36791,6 +37116,28 @@ function indexCell(rt, base, indices) {
36791
37116
  if (isRuntimeCell(val) && val.data.length === 1) return val.data[0];
36792
37117
  return val;
36793
37118
  }
37119
+ if (isRuntimeString(mv) || isRuntimeStringArray(mv)) {
37120
+ const idxMvals2 = resolveIndices(indices, endResolver(mv, indices.length));
37121
+ const elems = isRuntimeString(mv) ? [mv] : mv.data;
37122
+ const shape = isRuntimeString(mv) ? [1, 1] : mv.shape;
37123
+ let lin;
37124
+ if (idxMvals2.length === 1) {
37125
+ lin = Math.round(toNumber(idxMvals2[0])) - 1;
37126
+ } else if (idxMvals2.length === 2) {
37127
+ const r = Math.round(toNumber(idxMvals2[0])) - 1;
37128
+ const c = Math.round(toNumber(idxMvals2[1])) - 1;
37129
+ if (r < 0 || r >= shape[0] || c < 0 || c >= shape[1])
37130
+ throw new RuntimeError("Index exceeds array bounds");
37131
+ lin = c * shape[0] + r;
37132
+ } else {
37133
+ throw new RuntimeError(
37134
+ "String brace indexing supports 1 or 2 subscripts"
37135
+ );
37136
+ }
37137
+ if (lin < 0 || lin >= elems.length)
37138
+ throw new RuntimeError("Index exceeds array bounds");
37139
+ return RTV.char(elems[lin]);
37140
+ }
36794
37141
  if (!isRuntimeCell(mv)) throw new RuntimeError("Cell indexing on non-cell");
36795
37142
  const idxMvals = resolveIndices(indices, endResolver(mv, indices.length));
36796
37143
  if (idxMvals.length === 1) {
@@ -36984,6 +37331,15 @@ function indexStore(rt, base, indices, rhs, skipSubsasgn = false) {
36984
37331
  return rhsMv2;
36985
37332
  }
36986
37333
  }
37334
+ {
37335
+ const rhsMv0 = ensureRuntimeValue(rhs);
37336
+ const baseIsStr = isRuntimeString(mv) || isRuntimeStringArray(mv);
37337
+ const baseEmpty = isRuntimeTensor(mv) && mv.data.length === 0;
37338
+ const rhsIsStr = isRuntimeString(rhsMv0) || isRuntimeStringArray(rhsMv0);
37339
+ if (baseIsStr || baseEmpty && rhsIsStr) {
37340
+ return stringArrayIndexStore(mv, indices, rhsMv0);
37341
+ }
37342
+ }
36987
37343
  let wasScalar = false;
36988
37344
  let wasChar = false;
36989
37345
  if (!isRuntimeTensor(mv)) {
@@ -37027,6 +37383,109 @@ function indexStore(rt, base, indices, rhs, skipSubsasgn = false) {
37027
37383
  }
37028
37384
  return result;
37029
37385
  }
37386
+ function rhsToStringElems(rhsMv) {
37387
+ if (isRuntimeString(rhsMv)) return [rhsMv];
37388
+ if (isRuntimeStringArray(rhsMv)) return rhsMv.data.slice();
37389
+ if (isRuntimeChar(rhsMv)) {
37390
+ const rows = rhsMv.shape ? rhsMv.shape[0] : 1;
37391
+ if (rows <= 1) return [rhsMv.value];
37392
+ const width = rhsMv.shape[1];
37393
+ const out = [];
37394
+ for (let r = 0; r < rows; r++)
37395
+ out.push(rhsMv.value.slice(r * width, (r + 1) * width));
37396
+ return out;
37397
+ }
37398
+ if (isRuntimeNumber(rhsMv)) return [matlabNumToString(rhsMv)];
37399
+ if (isRuntimeLogical(rhsMv)) return [rhsMv ? "true" : "false"];
37400
+ if (isRuntimeTensor(rhsMv))
37401
+ return Array.from(rhsMv.data, (d) => matlabNumToString(d));
37402
+ return null;
37403
+ }
37404
+ function stringArrayIndexStore(mv, indices, rhsMv) {
37405
+ let data;
37406
+ let rows;
37407
+ let cols;
37408
+ if (isRuntimeStringArray(mv)) {
37409
+ data = mv.data.slice();
37410
+ [rows, cols] = mv.shape;
37411
+ } else if (isRuntimeString(mv)) {
37412
+ data = [mv];
37413
+ rows = 1;
37414
+ cols = 1;
37415
+ } else {
37416
+ data = [];
37417
+ rows = 0;
37418
+ cols = 0;
37419
+ }
37420
+ const idxMvals = resolveIndices(indices, endResolver(mv, indices.length));
37421
+ if (isRuntimeTensor(rhsMv) && rhsMv.data.length === 0 && idxMvals.length === 1) {
37422
+ const del = new Set(stringArraySubscript(idxMvals[0], data.length));
37423
+ const kept = data.filter((_, i) => !del.has(i));
37424
+ if (cols === 1 && rows > 1) return stringArrayValue(kept, [kept.length, 1]);
37425
+ return stringArrayValue(kept, [1, kept.length]);
37426
+ }
37427
+ const rhsElems = rhsToStringElems(rhsMv);
37428
+ if (rhsElems === null) {
37429
+ throw new RuntimeError("Cannot assign this value into a string array");
37430
+ }
37431
+ if (idxMvals.length === 1) {
37432
+ const positions = stringArraySubscript(idxMvals[0], data.length);
37433
+ const maxPos = positions.length ? Math.max(...positions) : -1;
37434
+ if (positions.some((p2) => p2 < 0)) {
37435
+ throw new RuntimeError("Index must be a positive integer");
37436
+ }
37437
+ if (maxPos >= data.length) {
37438
+ if (rows > 1 && cols > 1) {
37439
+ throw new RuntimeError("Index exceeds array bounds");
37440
+ }
37441
+ while (data.length <= maxPos) data.push("");
37442
+ }
37443
+ if (rhsElems.length !== 1 && rhsElems.length !== positions.length) {
37444
+ throw new RuntimeError(
37445
+ "Unable to perform assignment because the left and right sides have a different number of elements"
37446
+ );
37447
+ }
37448
+ positions.forEach((p2, k) => {
37449
+ data[p2] = rhsElems.length === 1 ? rhsElems[0] : rhsElems[k];
37450
+ });
37451
+ if (rows > 1 && cols > 1) return stringArrayValue(data, [rows, cols]);
37452
+ if (cols === 1 && rows > 1) return stringArrayValue(data, [data.length, 1]);
37453
+ return stringArrayValue(data, [1, data.length]);
37454
+ }
37455
+ if (idxMvals.length === 2) {
37456
+ const ri = stringArraySubscript(idxMvals[0], rows);
37457
+ const ci = stringArraySubscript(idxMvals[1], cols);
37458
+ if (ri.some((p2) => p2 < 0) || ci.some((p2) => p2 < 0)) {
37459
+ throw new RuntimeError("Index must be a positive integer");
37460
+ }
37461
+ const newRows = Math.max(rows, ri.length ? Math.max(...ri) + 1 : 0);
37462
+ const newCols = Math.max(cols, ci.length ? Math.max(...ci) + 1 : 0);
37463
+ let grid = data;
37464
+ if (newRows !== rows || newCols !== cols) {
37465
+ grid = new Array(newRows * newCols).fill("");
37466
+ for (let c = 0; c < cols; c++) {
37467
+ for (let r = 0; r < rows; r++) {
37468
+ grid[c * newRows + r] = data[c * rows + r];
37469
+ }
37470
+ }
37471
+ }
37472
+ const count = ri.length * ci.length;
37473
+ if (rhsElems.length !== 1 && rhsElems.length !== count) {
37474
+ throw new RuntimeError(
37475
+ "Unable to perform assignment because the left and right sides have a different number of elements"
37476
+ );
37477
+ }
37478
+ let k = 0;
37479
+ for (const c of ci) {
37480
+ for (const r of ri) {
37481
+ grid[c * newRows + r] = rhsElems.length === 1 ? rhsElems[0] : rhsElems[k];
37482
+ k++;
37483
+ }
37484
+ }
37485
+ return stringArrayValue(grid, [newRows, newCols]);
37486
+ }
37487
+ throw new RuntimeError("String array assignment supports 1 or 2 subscripts");
37488
+ }
37030
37489
  function indexCellStore(base, indices, rhs, rt) {
37031
37490
  if (base === void 0 || base === null) base = RTV.cell([], [0, 0]);
37032
37491
  let mv = ensureRuntimeValue(base);
@@ -37073,6 +37532,87 @@ function multiOutputCellAssign(base, indices, results, rt) {
37073
37532
  return mv;
37074
37533
  }
37075
37534
 
37535
+ // src/numbl-core/helpers/scanFormat.ts
37536
+ function scanFormat(str, fmt, maxCount) {
37537
+ const results = [];
37538
+ let strPos = 0;
37539
+ let fmtPos = 0;
37540
+ let matchFailure = false;
37541
+ while (fmtPos < fmt.length && strPos < str.length && results.length < maxCount) {
37542
+ if (fmt[fmtPos] === "%") {
37543
+ fmtPos++;
37544
+ if (fmtPos >= fmt.length) break;
37545
+ while (fmtPos < fmt.length && /[\d.]/.test(fmt[fmtPos])) fmtPos++;
37546
+ if (fmtPos >= fmt.length) break;
37547
+ const spec = fmt[fmtPos];
37548
+ fmtPos++;
37549
+ if (spec !== "c" && spec !== "s") {
37550
+ while (strPos < str.length && /\s/.test(str[strPos])) strPos++;
37551
+ }
37552
+ if (spec === "d" || spec === "i" || spec === "u") {
37553
+ const m = str.slice(strPos).match(/^[+-]?\d+/);
37554
+ if (!m) {
37555
+ matchFailure = true;
37556
+ break;
37557
+ }
37558
+ results.push(parseInt(m[0], 10));
37559
+ strPos += m[0].length;
37560
+ } else if (spec === "f" || spec === "e" || spec === "g") {
37561
+ const m = str.slice(strPos).match(/^[+-]?(\d+\.?\d*|\.\d+)([eE][+-]?\d+)?/);
37562
+ if (!m) {
37563
+ matchFailure = true;
37564
+ break;
37565
+ }
37566
+ results.push(parseFloat(m[0]));
37567
+ strPos += m[0].length;
37568
+ } else if (spec === "x") {
37569
+ const m = str.slice(strPos).match(/^[+-]?[0-9a-fA-F]+/);
37570
+ if (!m) {
37571
+ matchFailure = true;
37572
+ break;
37573
+ }
37574
+ results.push(parseInt(m[0], 16));
37575
+ strPos += m[0].length;
37576
+ } else if (spec === "o") {
37577
+ const m = str.slice(strPos).match(/^[+-]?[0-7]+/);
37578
+ if (!m) {
37579
+ matchFailure = true;
37580
+ break;
37581
+ }
37582
+ results.push(parseInt(m[0], 8));
37583
+ strPos += m[0].length;
37584
+ } else if (spec === "c") {
37585
+ results.push(str.charCodeAt(strPos));
37586
+ strPos++;
37587
+ } else if (spec === "s") {
37588
+ const m = str.slice(strPos).match(/^\S+/);
37589
+ if (!m) {
37590
+ matchFailure = true;
37591
+ break;
37592
+ }
37593
+ for (let ci = 0; ci < m[0].length && results.length < maxCount; ci++) {
37594
+ results.push(m[0].charCodeAt(ci));
37595
+ }
37596
+ strPos += m[0].length;
37597
+ }
37598
+ } else if (/\s/.test(fmt[fmtPos])) {
37599
+ fmtPos++;
37600
+ while (strPos < str.length && /\s/.test(str[strPos])) strPos++;
37601
+ } else {
37602
+ if (str[strPos] !== fmt[fmtPos]) {
37603
+ matchFailure = true;
37604
+ break;
37605
+ }
37606
+ strPos++;
37607
+ fmtPos++;
37608
+ }
37609
+ if (fmtPos >= fmt.length && results.length < maxCount && strPos < str.length) {
37610
+ fmtPos = 0;
37611
+ }
37612
+ }
37613
+ return { results, consumed: strPos, matchFailure };
37614
+ }
37615
+
37076
37616
  // src/numbl-core/interpreter/builtins/datetime.ts
37077
37617
  var MATLAB_EPOCH_DAYS = 719529;
37078
37618
  function makeDatetime(year, month, day, hour, minute, second) {
@@ -39098,6 +39638,7 @@ var SPECIAL_BUILTIN_NAMES = [
39098
39638
  "fclose",
39099
39639
  "fgetl",
39100
39640
  "fgets",
39641
+ "fscanf",
39101
39642
  "fileread",
39102
39643
  "feof",
39103
39644
  "ferror",
@@ -39365,7 +39906,10 @@ function registerSpecialBuiltins(rt) {
39365
39906
  fmtIdx = 1;
39366
39907
  }
39367
39908
  const fmt = toString(margs[fmtIdx]);
39368
- output = sprintfFormat(fmt, margs.slice(fmtIdx + 1));
39909
+ const rest = margs.slice(fmtIdx + 1).flatMap(
39910
+ (a) => isRuntimeStringArray(a) ? a.data.map((s) => RTV.string(s)) : [a]
39911
+ );
39912
+ output = sprintfFormat(fmt, rest);
39369
39913
  if (fid === 1 || fid === 2) {
39370
39914
  rt.output(output);
39371
39915
  } else {
@@ -39519,6 +40063,53 @@ function registerSpecialBuiltins(rt) {
39519
40063
  const result = io.fgets(toNumber(margs[0]));
39520
40064
  return typeof result === "number" ? RTV.num(result) : RTV.char(result);
39521
40065
  });
40066
+ registerSpecial("fscanf", (nargout, args) => {
40067
+ const io = requireFileIO();
40068
+ const margs = args.map((a) => ensureRuntimeValue(a));
40069
+ if (margs.length < 2)
40070
+ throw new RuntimeError("fscanf requires at least 2 arguments");
40071
+ if (!io.ftell || !io.fseek || !io.freadBytes)
40072
+ throw new RuntimeError("fscanf is not supported in this environment");
40073
+ const fid = toNumber(margs[0]);
40074
+ const fmt = toString(margs[1]);
40075
+ let maxCount = Infinity;
40076
+ let rows = null;
40077
+ if (margs.length >= 3) {
40078
+ const sz = margs[2];
40079
+ if (isRuntimeTensor(sz) && sz.data.length >= 2) {
40080
+ rows = sz.data[0];
40081
+ maxCount = sz.data[0] * sz.data[1];
40082
+ } else {
40083
+ maxCount = toNumber(sz);
40084
+ }
40085
+ }
40086
+ const pos = io.ftell(fid);
40087
+ const CHUNK = 1 << 16;
40088
+ const chunks = [];
40089
+ for (; ; ) {
40090
+ const bytes = io.freadBytes(fid, CHUNK);
40091
+ let s = "";
40092
+ for (let i = 0; i < bytes.length; i++) s += String.fromCharCode(bytes[i]);
40093
+ chunks.push(s);
40094
+ if (bytes.length < CHUNK) break;
40095
+ }
40096
+ const { results, consumed } = scanFormat(chunks.join(""), fmt, maxCount);
40097
+ io.fseek(fid, pos + consumed, -1);
40098
+ const n = results.length;
40099
+ let out;
40100
+ if (rows !== null && Number.isFinite(rows) && rows > 0) {
40101
+ const cols = Math.ceil(n / rows);
40102
+ const data = allocFloat64Array(rows * cols);
40103
+ for (let i = 0; i < n; i++) data[i] = results[i];
40104
+ out = RTV.tensor(data, [rows, cols]);
40105
+ } else if (n === 1) {
40106
+ out = RTV.num(results[0]);
40107
+ } else {
40108
+ out = RTV.tensor(allocFloat64Array(results), [n, 1]);
40109
+ }
40110
+ if (nargout >= 2) return [out, RTV.num(n)];
40111
+ return out;
40112
+ });
39522
40113
  registerSpecial("fileread", (_nargout, args) => {
39523
40114
  const io = requireFileIO();
39524
40115
  const margs = args.map((a) => ensureRuntimeValue(a));
@@ -43968,6 +44559,7 @@ var Runtime = class _Runtime {
43968
44559
  if (isRuntimeChar(rv))
43969
44560
  return rv.shape ?? (rv.value.length === 0 ? [0, 0] : [1, rv.value.length]);
43970
44561
  if (isRuntimeString(rv)) return [1, 1];
44562
+ if (isRuntimeStringArray(rv)) return [...rv.shape];
43971
44563
  if (isRuntimeClassInstance(rv)) return [1, 1];
43972
44564
  return [1, 1];
43973
44565
  }
@@ -45987,6 +46579,13 @@ function valuesEqualSimple(a, b) {
45987
46579
  }
45988
46580
  return true;
45989
46581
  }
46582
+ if (isRuntimeStringArray(a) && isRuntimeStringArray(b)) {
46583
+ if (a.shape[0] !== b.shape[0] || a.shape[1] !== b.shape[1]) return false;
46584
+ for (let i = 0; i < a.data.length; i++) {
46585
+ if (a.data[i] !== b.data[i]) return false;
46586
+ }
46587
+ return true;
46588
+ }
45990
46589
  return false;
45991
46590
  }
45992
46591
  function textValue(v) {
@@ -46259,6 +46858,7 @@ function getShape(v) {
46259
46858
  if (isRuntimeCell(v)) return v.shape;
46260
46859
  if (isRuntimeStructArray(v)) return [1, v.elements.length];
46261
46860
  if (isRuntimeClassInstanceArray(v)) return [...v.shape];
46861
+ if (isRuntimeStringArray(v)) return [...v.shape];
46262
46862
  return [1, 1];
46263
46863
  }
46264
46864
  defineBuiltin({
@@ -46314,7 +46914,11 @@ defineBuiltin({
46314
46914
  });
46315
46915
  defineBuiltin({
46316
46916
  name: "isstring",
46317
- cases: [anyToLogicalCase((args) => isRuntimeString(args[0]))]
46917
+ cases: [
46918
+ anyToLogicalCase(
46919
+ (args) => isRuntimeString(args[0]) || isRuntimeStringArray(args[0])
46920
+ )
46921
+ ]
46318
46922
  });
46319
46923
  var MATLAB_KEYWORDS = /* @__PURE__ */ new Set([
46320
46924
  "break",
@@ -46497,6 +47101,7 @@ defineBuiltin({
46497
47101
  if (isRuntimeString(v)) return false;
46498
47102
  if (isRuntimeStructArray(v)) return v.elements.length === 0;
46499
47103
  if (isRuntimeClassInstanceArray(v)) return v.elements.length === 0;
47104
+ if (isRuntimeStringArray(v)) return v.data.length === 0;
46500
47105
  return false;
46501
47106
  })
46502
47107
  ]
@@ -46551,6 +47156,7 @@ defineBuiltin({
46551
47156
  if (isRuntimeString(v)) return 1;
46552
47157
  if (isRuntimeStructArray(v)) return v.elements.length;
46553
47158
  if (isRuntimeClassInstanceArray(v)) return v.elements.length;
47159
+ if (isRuntimeStringArray(v)) return v.data.length;
46554
47160
  return 1;
46555
47161
  }
46556
47162
  }
@@ -46581,6 +47187,8 @@ defineBuiltin({
46581
47187
  if (isRuntimeStructArray(v)) return v.elements.length;
46582
47188
  if (isRuntimeClassInstanceArray(v))
46583
47189
  return v.elements.length === 0 ? 0 : Math.max(...v.shape);
47190
+ if (isRuntimeStringArray(v))
47191
+ return v.data.length === 0 ? 0 : Math.max(...v.shape);
46584
47192
  return 1;
46585
47193
  }
46586
47194
  }
@@ -46708,6 +47316,7 @@ defineBuiltin({
46708
47316
  return mkChar(v._isLogical ? "logical" : "double");
46709
47317
  if (isRuntimeSparseMatrix(v)) return mkChar("double");
46710
47318
  if (isRuntimeString(v)) return mkChar("string");
47319
+ if (isRuntimeStringArray(v)) return mkChar("string");
46711
47320
  if (isRuntimeChar(v)) return mkChar("char");
46712
47321
  if (isRuntimeStruct(v) || isRuntimeStructArray(v))
46713
47322
  return mkChar("struct");
@@ -46758,7 +47367,7 @@ function fieldnamesApply(args) {
46758
47367
  if (isRuntimeStructArray(v)) {
46759
47368
  const names2 = v.fieldNames;
46760
47369
  return RTV.cell(
46761
- names2.map((n) => RTV.string(n)),
47370
+ names2.map((n) => RTV.char(n)),
46762
47371
  [names2.length, 1]
46763
47372
  );
46764
47373
  }
@@ -46766,7 +47375,7 @@ function fieldnamesApply(args) {
46766
47375
  throw new RuntimeError("fieldnames: argument must be a struct");
46767
47376
  const names = [...v.fields.keys()];
46768
47377
  return RTV.cell(
46769
- names.map((n) => RTV.string(n)),
47378
+ names.map((n) => RTV.char(n)),
46770
47379
  [names.length, 1]
46771
47380
  );
46772
47381
  }
@@ -47594,6 +48203,9 @@ function applyTextFn(v, fn) {
47594
48203
  return RTV.char(fn(v.value));
47595
48204
  }
47596
48205
  if (isRuntimeString(v)) return RTV.string(fn(toString(v)));
48206
+ if (isRuntimeStringArray(v)) {
48207
+ return RTV.stringArray(v.data.map(fn), [v.shape[0], v.shape[1]]);
48208
+ }
47597
48209
  return v;
47598
48210
  }
47599
48211
  function textPreserveResolve(fn) {
@@ -47606,6 +48218,16 @@ function textPreserveResolve(fn) {
47606
48218
  apply: (args) => applyTextFn(args[0], fn)
47607
48219
  };
47608
48220
  }
48221
+ if (t.kind === "unknown") {
48222
+ return {
48223
+ outputTypes: [{ kind: "unknown" }],
48224
+ apply: (args) => {
48225
+ if (!isRuntimeStringArray(args[0]))
48226
+ throw new RuntimeError("Expected a text input");
48227
+ return applyTextFn(args[0], fn);
48228
+ }
48229
+ };
48230
+ }
47609
48231
  const out = preserveTextType(t);
47610
48232
  if (!out) return null;
47611
48233
  return {
@@ -47695,17 +48317,14 @@ registerIBuiltin({
47695
48317
  name: "erase",
47696
48318
  resolve: (argTypes) => {
47697
48319
  if (argTypes.length !== 2) return null;
47698
- const out = preserveTextType(argTypes[0]);
48320
+ const out = argTypes[0].kind === "unknown" ? { kind: "unknown" } : preserveTextType(argTypes[0]);
47699
48321
  if (!out) return null;
47700
48322
  if (!isTextType(argTypes[1])) return null;
47701
48323
  return {
47702
48324
  outputTypes: [out],
47703
48325
  apply: (args) => {
47704
- const v = args[0];
47705
- const s = toString(v);
47706
48326
  const pat = toString(args[1]);
47707
- const result = s.split(pat).join("");
47708
- return isRuntimeChar(v) ? RTV.char(result) : RTV.string(result);
48327
+ return applyTextFn(args[0], (s) => s.split(pat).join(""));
47709
48328
  }
47710
48329
  };
47711
48330
  }
@@ -47713,18 +48332,15 @@ registerIBuiltin({
47713
48332
  function strreplaceResolve() {
47714
48333
  return (argTypes) => {
47715
48334
  if (argTypes.length !== 3) return null;
47716
- const out = preserveTextType(argTypes[0]);
48335
+ const out = argTypes[0].kind === "unknown" || argTypes[0].kind === "cell" ? { kind: argTypes[0].kind } : preserveTextType(argTypes[0]);
47717
48336
  if (!out) return null;
47718
48337
  if (!isTextType(argTypes[1]) || !isTextType(argTypes[2])) return null;
47719
48338
  return {
47720
48339
  outputTypes: [out],
47721
48340
  apply: (args) => {
47722
- const v = args[0];
47723
- const s = toString(v);
47724
48341
  const old = toString(args[1]);
47725
48342
  const rep = toString(args[2]);
47726
- const result = s.split(old).join(rep);
47727
- return isRuntimeChar(v) ? RTV.char(result) : RTV.string(result);
48343
+ return applyTextFn(args[0], (s) => s.split(old).join(rep));
47728
48344
  }
47729
48345
  };
47730
48346
  };
@@ -47892,9 +48508,16 @@ registerIBuiltin({
47892
48508
  function isText(v) {
47893
48509
  return isRuntimeChar(v) || isRuntimeString(v);
47894
48510
  }
48511
+ function stringArrayToCell(v) {
48512
+ if (!isRuntimeStringArray(v)) return v;
48513
+ return RTV.cell(
48514
+ v.data.map((s) => RTV.string(s)),
48515
+ [v.shape[0], v.shape[1]]
48516
+ );
48517
+ }
47895
48518
  function strcmpApply(args, cmp) {
47896
- const a = args[0];
47897
- const b = args[1];
48519
+ const a = stringArrayToCell(args[0]);
48520
+ const b = stringArrayToCell(args[1]);
47898
48521
  const aIsCell = isRuntimeCell(a);
47899
48522
  const bIsCell = isRuntimeCell(b);
47900
48523
  if (!aIsCell && !bIsCell) {
@@ -48140,24 +48763,43 @@ registerIBuiltin({
48140
48763
  };
48141
48764
  }
48142
48765
  });
48766
+ function patternList(pat) {
48767
+ if (isRuntimeCell(pat)) return pat.data.map((e) => toString(e));
48768
+ if (isRuntimeStringArray(pat)) return pat.data.slice();
48769
+ return [toString(pat)];
48770
+ }
48771
+ function textSubjectApply(subject, perElem) {
48772
+ if (isRuntimeStringArray(subject)) {
48773
+ return new RuntimeTensor(
48774
+ allocFloat64Array(subject.data.map((s) => perElem(s) ? 1 : 0)),
48775
+ [subject.shape[0], subject.shape[1]],
48776
+ void 0,
48777
+ true
48778
+ );
48779
+ }
48780
+ if (isRuntimeCell(subject)) {
48781
+ return new RuntimeTensor(
48782
+ allocFloat64Array(subject.data.map((e) => perElem(toString(e)) ? 1 : 0)),
48783
+ subject.shape.slice(),
48784
+ void 0,
48785
+ true
48786
+ );
48787
+ }
48788
+ return RTV.logical(perElem(toString(subject)));
48789
+ }
48790
+ function subjectTypeOk(t) {
48791
+ return isTextType(t) || t.kind === "cell" || t.kind === "unknown";
48792
+ }
48143
48793
  registerIBuiltin({
48144
48794
  name: "contains",
48145
48795
  resolve: (argTypes) => {
48146
48796
  if (argTypes.length < 2) return null;
48147
- if (!isTextType(argTypes[0])) return null;
48148
- if (argTypes[1].kind === "unknown") return null;
48797
+ if (!subjectTypeOk(argTypes[0])) return null;
48149
48798
  return {
48150
48799
  outputTypes: [{ kind: "boolean" }],
48151
48800
  apply: (args) => {
48152
- const s = toString(args[0]);
48153
- const pat = args[1];
48154
- if (isRuntimeCell(pat)) {
48155
- for (let i = 0; i < pat.data.length; i++) {
48156
- if (s.includes(toString(pat.data[i]))) return RTV.logical(true);
48157
- }
48158
- return RTV.logical(false);
48159
- }
48160
- return RTV.logical(s.includes(toString(pat)));
48801
+ const pats = patternList(args[1]);
48802
+ return textSubjectApply(args[0], (s) => pats.some((p2) => s.includes(p2)));
48161
48803
  }
48162
48804
  };
48163
48805
  }
@@ -48167,7 +48809,7 @@ function resolveStartsEndsWith(name, testFn) {
48167
48809
  name,
48168
48810
  resolve: (argTypes) => {
48169
48811
  if (argTypes.length < 2) return null;
48170
- if (!isTextType(argTypes[0])) return null;
48812
+ if (!subjectTypeOk(argTypes[0])) return null;
48171
48813
  return {
48172
48814
  outputTypes: [{ kind: "boolean" }],
48173
48815
  apply: (args) => {
@@ -48177,20 +48819,12 @@ function resolveStartsEndsWith(name, testFn) {
48177
48819
  ic = !!toNumber(args[i + 1]);
48178
48820
  }
48179
48821
  }
48180
- let s = toString(args[0]);
48181
- if (ic) s = s.toLowerCase();
48182
- const pat = args[1];
48183
- if (isRuntimeCell(pat)) {
48184
- for (let i = 0; i < pat.data.length; i++) {
48185
- let p3 = toString(pat.data[i]);
48186
- if (ic) p3 = p3.toLowerCase();
48187
- if (testFn(s, p3)) return RTV.logical(true);
48188
- }
48189
- return RTV.logical(false);
48190
- }
48191
- let p2 = toString(pat);
48192
- if (ic) p2 = p2.toLowerCase();
48193
- return RTV.logical(testFn(s, p2));
48822
+ let pats = patternList(args[1]);
48823
+ if (ic) pats = pats.map((p2) => p2.toLowerCase());
48824
+ return textSubjectApply(args[0], (s0) => {
48825
+ const s = ic ? s0.toLowerCase() : s0;
48826
+ return pats.some((p2) => testFn(s, p2));
48827
+ });
48194
48828
  }
48195
48829
  };
48196
48830
  }
@@ -48202,13 +48836,19 @@ registerIBuiltin({
48202
48836
  name: "strlength",
48203
48837
  resolve: (argTypes) => {
48204
48838
  if (argTypes.length !== 1) return null;
48205
- if (!isTextType(argTypes[0])) return null;
48839
+ if (!isTextType(argTypes[0]) && argTypes[0].kind !== "unknown") return null;
48206
48840
  return {
48207
48841
  outputTypes: [{ kind: "number", sign: "nonneg" }],
48208
48842
  apply: (args) => {
48209
48843
  const v = args[0];
48210
48844
  if (isRuntimeString(v)) return RTV.num(v.length);
48211
48845
  if (isRuntimeChar(v)) return RTV.num(v.value.length);
48846
+ if (isRuntimeStringArray(v)) {
48847
+ return RTV.tensor(allocFloat64Array(v.data.map((s) => s.length)), [
48848
+ v.shape[0],
48849
+ v.shape[1]
48850
+ ]);
48851
+ }
48212
48852
  throw new RuntimeError("strlength: argument must be a string or char");
48213
48853
  }
48214
48854
  };
@@ -48264,6 +48904,20 @@ registerIBuiltin({
48264
48904
  }
48265
48905
  };
48266
48906
  }
48907
+ if (t.kind === "unknown") {
48908
+ return {
48909
+ outputTypes: [{ kind: "tensor", isComplex: false }],
48910
+ apply: (args) => {
48911
+ const v = args[0];
48912
+ if (!isRuntimeStringArray(v))
48913
+ throw new RuntimeError("str2double: expected text input");
48914
+ return RTV.tensor(
48915
+ allocFloat64Array(v.data.map((s) => str2doubleScalar(s))),
48916
+ [v.shape[0], v.shape[1]]
48917
+ );
48918
+ }
48919
+ };
48920
+ }
48267
48921
  return null;
48268
48922
  }
48269
48923
  });
@@ -48449,29 +49103,7 @@ registerIBuiltin({
48449
49103
  };
48450
49104
  }
48451
49105
  });
48452
- function numStr2(n) {
48453
- if (n === Infinity) return "Inf";
48454
- if (n === -Infinity) return "-Inf";
48455
- if (isNaN(n)) return "NaN";
48456
- if (n === 0) return "0";
48457
- if (Number.isInteger(n)) return String(n);
48458
- const prec = 5;
48459
- const exp2 = Math.floor(Math.log10(Math.abs(n)));
48460
- let s;
48461
- if (exp2 < -4 || exp2 >= prec) {
48462
- s = n.toExponential(prec - 1);
48463
- const ePos = s.indexOf("e");
48464
- let mantissa = s.slice(0, ePos);
48465
- const expPart0 = s.slice(ePos);
48466
- if (mantissa.includes(".")) mantissa = mantissa.replace(/\.?0+$/, "");
48467
- const expPart = expPart0.replace(/([eE][+-])(\d)$/, "$10$2");
48468
- s = mantissa + expPart;
48469
- } else {
48470
- s = n.toPrecision(prec);
48471
- if (s.includes(".")) s = s.replace(/\.?0+$/, "");
48472
- }
48473
- return s;
48474
- }
49106
+ var numStr2 = matlabNumToString;
48475
49107
  registerIBuiltin({
48476
49108
  name: "num2str",
48477
49109
  resolve: (argTypes) => {
@@ -48682,7 +49314,7 @@ registerIBuiltin({
48682
49314
  resolve: (argTypes) => {
48683
49315
  if (argTypes.length !== 1) return null;
48684
49316
  const a = argTypes[0];
48685
- if (a.kind !== "char" && a.kind !== "string" && a.kind !== "number" && a.kind !== "tensor" && a.kind !== "cell")
49317
+ if (a.kind !== "char" && a.kind !== "string" && a.kind !== "number" && a.kind !== "tensor" && a.kind !== "cell" && a.kind !== "unknown")
48686
49318
  return null;
48687
49319
  return {
48688
49320
  outputTypes: [{ kind: "char" }],
@@ -48704,6 +49336,9 @@ registerIBuiltin({
48704
49336
  for (const el of v.data) rows.push(...valueToCharRows(el));
48705
49337
  return charRowsToMatrix(rows);
48706
49338
  }
49339
+ if (isRuntimeStringArray(v)) {
49340
+ return charRowsToMatrix(v.data.slice());
49341
+ }
48707
49342
  throw new RuntimeError("char: unsupported arguments");
48708
49343
  }
48709
49344
  };
@@ -48714,14 +49349,260 @@ registerIBuiltin({
48714
49349
  resolve: (argTypes) => {
48715
49350
  if (argTypes.length !== 1) return null;
48716
49351
  const a = argTypes[0];
48717
- if (a.kind === "unknown") return null;
49352
+ const scalarText = a.kind === "char" || a.kind === "string" || a.kind === "number" || a.kind === "boolean";
48718
49353
  return {
48719
- outputTypes: [{ kind: "string" }],
49354
+ outputTypes: [scalarText ? { kind: "string" } : { kind: "unknown" }],
49355
+ apply: (args) => {
49356
+ const v = args[0];
49357
+ if (isRuntimeString(v) || isRuntimeStringArray(v)) return v;
49358
+ if (isRuntimeChar(v)) {
49359
+ const rows = v.shape ? v.shape[0] : 1;
49360
+ if (rows <= 1) return RTV.string(v.value);
49361
+ const width = v.shape[1];
49362
+ const out = [];
49363
+ for (let r = 0; r < rows; r++) {
49364
+ out.push(v.value.slice(r * width, (r + 1) * width));
49365
+ }
49366
+ return RTV.stringArray(out, [rows, 1]);
49367
+ }
49368
+ if (isRuntimeNumber(v)) return RTV.string(numStr2(v));
49369
+ if (isRuntimeLogical(v)) return RTV.string(v ? "true" : "false");
49370
+ if (isRuntimeTensor(v)) {
49371
+ const rows = v.shape.length >= 2 ? v.shape[0] : 1;
49372
+ const cols = v.data.length === 0 ? v.shape[1] ?? 0 : v.data.length / (rows || 1);
49373
+ const out = [];
49374
+ for (let i = 0; i < v.data.length; i++) {
49375
+ out.push(
49376
+ v._isLogical ? v.data[i] ? "true" : "false" : numStr2(v.data[i])
49377
+ );
49378
+ }
49379
+ return stringArrayValue(out, [rows, cols]);
49380
+ }
49381
+ if (isRuntimeCell(v)) {
49382
+ const rows = v.shape.length >= 2 ? v.shape[0] : 1;
49383
+ const cols = v.data.length / (rows || 1);
49384
+ const out = v.data.map((el) => {
49385
+ const rv = ensureRuntimeValue(el);
49386
+ if (isRuntimeChar(rv)) return rv.value;
49387
+ if (isRuntimeString(rv)) return rv;
49388
+ if (isRuntimeNumber(rv)) return numStr2(rv);
49389
+ if (isRuntimeLogical(rv)) return rv ? "true" : "false";
49390
+ throw new RuntimeError(
49391
+ "string: cell elements must be text or numbers"
49392
+ );
49393
+ });
49394
+ return stringArrayValue(out, [rows, cols]);
49395
+ }
49396
+ return RTV.string(displayValue(v));
49397
+ }
49398
+ };
49399
+ }
49400
+ });
49401
+ registerIBuiltin({
49402
+ name: "strings",
49403
+ help: {
49404
+ signatures: ["strings", "strings(n)", "strings(m,n)", "strings([m n])"],
49405
+ description: 'Create a string array with every element set to "" (empty string).'
49406
+ },
49407
+ resolve: (argTypes) => {
49408
+ if (argTypes.some((t) => t.kind !== "number" && t.kind !== "tensor"))
49409
+ return null;
49410
+ return {
49411
+ outputTypes: [{ kind: "unknown" }],
49412
+ apply: (args) => {
49413
+ const dims = [];
49414
+ for (const a of args) {
49415
+ const rv = ensureRuntimeValue(a);
49416
+ if (isRuntimeTensor(rv)) {
49417
+ for (const d of rv.data) dims.push(Math.max(0, Math.round(d)));
49418
+ } else {
49419
+ dims.push(Math.max(0, Math.round(toNumber(rv))));
49420
+ }
49421
+ }
49422
+ if (dims.length === 0) dims.push(1, 1);
49423
+ if (dims.length === 1) dims.push(dims[0]);
49424
+ const m = dims[0];
49425
+ const n = dims.slice(1).reduce((a, b) => a * b, 1);
49426
+ return stringArrayValue(new Array(m * n).fill(""), [m, n]);
49427
+ }
49428
+ };
49429
+ }
49430
+ });
49431
+ registerIBuiltin({
49432
+ name: "newline",
49433
+ help: {
49434
+ signatures: ["newline"],
49435
+ description: "Newline character, char(10)."
49436
+ },
49437
+ resolve: (argTypes) => {
49438
+ if (argTypes.length !== 0) return null;
49439
+ return {
49440
+ outputTypes: [{ kind: "char" }],
49441
+ apply: () => RTV.char("\n")
49442
+ };
49443
+ }
49444
+ });
49445
+ registerIBuiltin({
49446
+ name: "split",
49447
+ help: {
49448
+ signatures: ["split(str)", "split(str, delimiter)"],
49449
+ description: "Split text at whitespace (or the given delimiter(s)) into a string array. A scalar input yields a column of parts."
49450
+ },
49451
+ resolve: (argTypes) => {
49452
+ if (argTypes.length < 1 || argTypes.length > 2) return null;
49453
+ const a = argTypes[0];
49454
+ if (!isTextType(a) && a.kind !== "cell" && a.kind !== "unknown")
49455
+ return null;
49456
+ return {
49457
+ outputTypes: [{ kind: "unknown" }],
48720
49458
  apply: (args) => {
49459
+ const delims = args.length >= 2 ? patternList(args[1]) : null;
49460
+ const splitOne = (s) => {
49461
+ if (delims === null) {
49462
+ const trimmed = s.trim();
49463
+ return trimmed.length === 0 ? [""] : trimmed.split(/\s+/);
49464
+ }
49465
+ const escaped = delims.map((d) => d.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("|");
49466
+ return s.split(new RegExp(escaped));
49467
+ };
49468
+ const v = args[0];
49469
+ const subjects = isRuntimeStringArray(v) ? v.data.slice() : isRuntimeCell(v) ? v.data.map((e) => toString(e)) : [toString(v)];
49470
+ const partsPer = subjects.map(splitOne);
49471
+ const nParts = partsPer[0].length;
49472
+ if (partsPer.some((p2) => p2.length !== nParts)) {
49473
+ throw new RuntimeError(
49474
+ "split: all elements must split into the same number of parts"
49475
+ );
49476
+ }
49477
+ if (subjects.length === 1) {
49478
+ return stringArrayValue(partsPer[0], [nParts, 1]);
49479
+ }
49480
+ const m = subjects.length;
49481
+ const out = new Array(m * nParts);
49482
+ for (let i = 0; i < m; i++) {
49483
+ for (let j = 0; j < nParts; j++) {
49484
+ out[j * m + i] = partsPer[i][j];
49485
+ }
49486
+ }
49487
+ return stringArrayValue(out, [m, nParts]);
49488
+ }
49489
+ };
49490
+ }
49491
+ });
49492
+ registerIBuiltin({
49493
+ name: "join",
49494
+ help: {
49495
+ signatures: ["join(str)", "join(str, delimiter)"],
49496
+ description: "Combine the elements of a string array into single strings, separated by a space (or the given delimiter)."
49497
+ },
49498
+ resolve: (argTypes) => {
49499
+ if (argTypes.length < 1 || argTypes.length > 2) return null;
49500
+ const a = argTypes[0];
49501
+ if (!isTextType(a) && a.kind !== "cell" && a.kind !== "unknown")
49502
+ return null;
49503
+ return {
49504
+ outputTypes: [{ kind: "unknown" }],
49505
+ apply: (args) => {
49506
+ const delim = args.length >= 2 ? toString(args[1]) : " ";
48721
49507
  const v = args[0];
48722
49508
  if (isRuntimeString(v)) return v;
48723
49509
  if (isRuntimeChar(v)) return RTV.string(v.value);
48724
- return RTV.string(displayValue(v));
49510
+ const elems = isRuntimeStringArray(v) ? v.data : isRuntimeCell(v) ? v.data.map((e) => toString(e)) : [toString(v)];
49511
+ const shape = isRuntimeStringArray(v) ? v.shape : [1, elems.length];
49512
+ const [m, n] = shape;
49513
+ if (m === 1 || n === 1) {
49514
+ return RTV.string(elems.join(delim));
49515
+ }
49516
+ const out = [];
49517
+ for (let r = 0; r < m; r++) {
49518
+ const parts = [];
49519
+ for (let c = 0; c < n; c++) parts.push(elems[c * m + r]);
49520
+ out.push(parts.join(delim));
49521
+ }
49522
+ return stringArrayValue(out, [m, 1]);
49523
+ }
49524
+ };
49525
+ }
49526
+ });
49527
+ registerIBuiltin({
49528
+ name: "cellstr",
49529
+ help: {
49530
+ signatures: ["cellstr(A)"],
49531
+ description: "Convert a string array, char array, or cell array of text to a cell array of character vectors."
49532
+ },
49533
+ resolve: (argTypes) => {
49534
+ if (argTypes.length !== 1) return null;
49535
+ const a = argTypes[0];
49536
+ if (!isTextType(a) && a.kind !== "cell" && a.kind !== "unknown")
49537
+ return null;
49538
+ return {
49539
+ outputTypes: [{ kind: "cell" }],
49540
+ apply: (args) => {
49541
+ const v = args[0];
49542
+ if (isRuntimeCell(v)) {
49543
+ return RTV.cell(
49544
+ v.data.map((e) => RTV.char(toString(e))),
49545
+ [...v.shape]
49546
+ );
49547
+ }
49548
+ if (isRuntimeStringArray(v)) {
49549
+ return RTV.cell(
49550
+ v.data.map((s) => RTV.char(s)),
49551
+ [v.shape[0], v.shape[1]]
49552
+ );
49553
+ }
49554
+ if (isRuntimeString(v)) return RTV.cell([RTV.char(v)], [1, 1]);
49555
+ if (isRuntimeChar(v)) {
49556
+ const rows = v.shape ? v.shape[0] : 1;
49557
+ if (rows <= 1) {
49558
+ return RTV.cell([RTV.char(v.value.replace(/\s+$/, ""))], [1, 1]);
49559
+ }
49560
+ const width = v.shape[1];
49561
+ const out = [];
49562
+ for (let r = 0; r < rows; r++) {
49563
+ out.push(
49564
+ RTV.char(
49565
+ v.value.slice(r * width, (r + 1) * width).replace(/\s+$/, "")
49566
+ )
49567
+ );
49568
+ }
49569
+ return RTV.cell(out, [rows, 1]);
49570
+ }
49571
+ throw new RuntimeError("cellstr: unsupported argument");
49572
+ }
49573
+ };
49574
+ }
49575
+ });
49576
+ registerIBuiltin({
49577
+ name: "ismissing",
49578
+ help: {
49579
+ signatures: ["ismissing(A)"],
49580
+ description: "Logical array marking missing elements. numbl has no <missing> value, so string inputs return all-false."
49581
+ },
49582
+ resolve: (argTypes) => {
49583
+ if (argTypes.length !== 1) return null;
49584
+ return {
49585
+ outputTypes: [{ kind: "boolean" }],
49586
+ apply: (args) => {
49587
+ const v = args[0];
49588
+ if (isRuntimeStringArray(v)) {
49589
+ const t = RTV.tensor(allocFloat64Array(v.data.length), [
49590
+ v.shape[0],
49591
+ v.shape[1]
49592
+ ]);
49593
+ t._isLogical = true;
49594
+ return t;
49595
+ }
49596
+ if (isRuntimeTensor(v)) {
49597
+ const t = RTV.tensor(
49598
+ allocFloat64Array(v.data.map((x) => isNaN(x) ? 1 : 0)),
49599
+ [...v.shape]
49600
+ );
49601
+ t._isLogical = true;
49602
+ return t;
49603
+ }
49604
+ if (isRuntimeNumber(v)) return RTV.logical(isNaN(v));
49605
+ return RTV.logical(false);
48725
49606
  }
48726
49607
  };
48727
49608
  }
@@ -48758,7 +49639,10 @@ registerIBuiltin({
48758
49639
  outputTypes: [outType],
48759
49640
  apply: (args) => {
48760
49641
  const fmt = toString(args[0]);
48761
- const result = sprintfFormat(fmt, args.slice(1));
49642
+ const rest = args.slice(1).flatMap(
49643
+ (a) => isRuntimeStringArray(a) ? a.data.map((s) => RTV.string(s)) : [a]
49644
+ );
49645
+ const result = sprintfFormat(fmt, rest);
48762
49646
  return isChar5 ? RTV.char(result) : RTV.string(result);
48763
49647
  }
48764
49648
  };
@@ -48779,80 +49663,11 @@ registerIBuiltin({
48779
49663
  const str = toString(args[0]);
48780
49664
  const fmt = toString(args[1]);
48781
49665
  const maxCount = args.length >= 3 ? toNumber(args[2]) : Infinity;
48782
- const results = [];
48783
- let strPos = 0;
48784
- let fmtPos = 0;
48785
- let matchFailure = false;
48786
- while (fmtPos < fmt.length && strPos < str.length && results.length < maxCount) {
48787
- if (fmt[fmtPos] === "%") {
48788
- fmtPos++;
48789
- if (fmtPos >= fmt.length) break;
48790
- const spec = fmt[fmtPos];
48791
- fmtPos++;
48792
- if (spec !== "c" && spec !== "s") {
48793
- while (strPos < str.length && /\s/.test(str[strPos])) strPos++;
48794
- }
48795
- if (spec === "d" || spec === "i") {
48796
- const m = str.slice(strPos).match(/^[+-]?\d+/);
48797
- if (!m) {
48798
- matchFailure = true;
48799
- break;
48800
- }
48801
- results.push(parseInt(m[0], 10));
48802
- strPos += m[0].length;
48803
- } else if (spec === "f" || spec === "e" || spec === "g") {
48804
- const m = str.slice(strPos).match(/^[+-]?(\d+\.?\d*|\.\d+)([eE][+-]?\d+)?/);
48805
- if (!m) {
48806
- matchFailure = true;
48807
- break;
48808
- }
48809
- results.push(parseFloat(m[0]));
48810
- strPos += m[0].length;
48811
- } else if (spec === "x") {
48812
- const m = str.slice(strPos).match(/^[+-]?[0-9a-fA-F]+/);
48813
- if (!m) {
48814
- matchFailure = true;
48815
- break;
48816
- }
48817
- results.push(parseInt(m[0], 16));
48818
- strPos += m[0].length;
48819
- } else if (spec === "o") {
48820
- const m = str.slice(strPos).match(/^[+-]?[0-7]+/);
48821
- if (!m) {
48822
- matchFailure = true;
48823
- break;
48824
- }
48825
- results.push(parseInt(m[0], 8));
48826
- strPos += m[0].length;
48827
- } else if (spec === "c") {
48828
- results.push(str.charCodeAt(strPos));
48829
- strPos++;
48830
- } else if (spec === "s") {
48831
- const m = str.slice(strPos).match(/^\S+/);
48832
- if (!m) {
48833
- matchFailure = true;
48834
- break;
48835
- }
48836
- for (let ci = 0; ci < m[0].length && results.length < maxCount; ci++) {
48837
- results.push(m[0].charCodeAt(ci));
48838
- }
48839
- strPos += m[0].length;
48840
- }
48841
- } else if (/\s/.test(fmt[fmtPos])) {
48842
- fmtPos++;
48843
- while (strPos < str.length && /\s/.test(str[strPos])) strPos++;
48844
- } else {
48845
- if (str[strPos] !== fmt[fmtPos]) {
48846
- matchFailure = true;
48847
- break;
48848
- }
48849
- strPos++;
48850
- fmtPos++;
48851
- }
48852
- if (fmtPos >= fmt.length && results.length < maxCount && strPos < str.length) {
48853
- fmtPos = 0;
48854
- }
48855
- }
49666
+ const {
49667
+ results,
49668
+ consumed: strPos,
49669
+ matchFailure
49670
+ } = scanFormat(str, fmt, maxCount);
48856
49671
  const vals = results.length === 1 ? RTV.num(results[0]) : RTV.tensor(allocFloat64Array(results), [results.length, 1]);
48857
49672
  if (nout >= 2) {
48858
49673
  const out = [vals, RTV.num(results.length)];
@@ -49131,6 +49946,10 @@ defineBuiltin({
49131
49946
  };
49132
49947
  return nargout > 1 ? [out, idx] : [out];
49133
49948
  }
49949
+ if (a.kind === "string" || a.kind === "unknown") {
49950
+ const out = { kind: "unknown" };
49951
+ return nargout > 1 ? [out, { kind: "unknown" }] : [out];
49952
+ }
49134
49953
  return null;
49135
49954
  },
49136
49955
  apply: (args, nargout) => {
@@ -49149,6 +49968,33 @@ defineBuiltin({
49149
49968
  if (args.length >= 3 && (isRuntimeString(args[2]) || isRuntimeChar(args[2]))) {
49150
49969
  descend = rstr(args[2]).toLowerCase() === "descend";
49151
49970
  }
49971
+ if (isRuntimeStringArray(v)) {
49972
+ const order = v.data.map((_, i) => i);
49973
+ order.sort((i, j) => {
49974
+ const x = v.data[i];
49975
+ const y = v.data[j];
49976
+ const c = x < y ? -1 : x > y ? 1 : 0;
49977
+ return descend ? -c : c;
49978
+ });
49979
+ const sorted = order.map((i) => v.data[i]);
49980
+ const isRow = v.shape[0] === 1;
49981
+ const shape = isRow ? [1, sorted.length] : [sorted.length, 1];
49982
+ const result = stringArrayValue(sorted, shape);
49983
+ if (nargout > 1) {
49984
+ return [
49985
+ result,
49986
+ RTV.tensor(allocFloat64Array(order.map((i) => i + 1)), [
49987
+ shape[0],
49988
+ shape[1]
49989
+ ])
49990
+ ];
49991
+ }
49992
+ return result;
49993
+ }
49994
+ if (isRuntimeString(v)) {
49995
+ if (nargout > 1) return [v, RTV.num(1)];
49996
+ return v;
49997
+ }
49152
49998
  if (isRuntimeNumber(v)) {
49153
49999
  if (nargout > 1) return [v, RTV.num(1)];
49154
50000
  return v;
@@ -49464,8 +50310,12 @@ var ismemberCases = [
49464
50310
  apply: (args, nargout) => {
49465
50311
  if (args.length < 2)
49466
50312
  throw new RuntimeError("ismember requires 2 arguments");
49467
- const v = args[0];
49468
- const b = args[1];
50313
+ const asCellstr = (x) => isRuntimeStringArray(x) ? RTV.cell(
50314
+ x.data.map((s) => RTV.string(s)),
50315
+ [x.shape[0], x.shape[1]]
50316
+ ) : x;
50317
+ const v = asCellstr(args[0]);
50318
+ const b = asCellstr(args[1]);
49469
50319
  const isStringLike = (x) => isRuntimeString(x) || isRuntimeChar(x);
49470
50320
  const isCellOfStrings = (x) => isRuntimeCell(x) && x.data.every(
49471
50321
  (e) => isRuntimeString(e) || isRuntimeChar(e)
@@ -49768,6 +50618,30 @@ defineBuiltin({
49768
50618
  )) {
49769
50619
  return uniqueCellOfStrings(v, nargout, stable);
49770
50620
  }
50621
+ if (isRuntimeStringArray(v)) {
50622
+ const elems = v.data;
50623
+ const seen = /* @__PURE__ */ new Map();
50624
+ for (let i = 0; i < elems.length; i++) {
50625
+ if (!seen.has(elems[i])) seen.set(elems[i], i);
50626
+ }
50627
+ let vals = [...seen.keys()];
50628
+ if (!stable) vals = vals.sort();
50629
+ const isRow = v.shape[0] === 1;
50630
+ const shape = isRow ? [1, vals.length] : [vals.length, 1];
50631
+ const result = stringArrayValue(vals, shape);
50632
+ if (nargout <= 1) return result;
50633
+ const ia = RTV.tensor(
50634
+ allocFloat64Array(vals.map((s) => seen.get(s) + 1)),
50635
+ [vals.length, 1]
50636
+ );
50637
+ if (nargout === 2) return [result, ia];
50638
+ const pos = new Map(vals.map((s, i) => [s, i + 1]));
50639
+ const ic = RTV.tensor(
50640
+ allocFloat64Array(elems.map((s) => pos.get(s))),
50641
+ [elems.length, 1]
50642
+ );
50643
+ return [result, ia, ic];
50644
+ }
49771
50645
  if (!isRuntimeTensor(v))
49772
50646
  throw new RuntimeError("unique: argument must be numeric");
49773
50647
  if (byRows) return uniqueByRows(v, nargout, stable);
@@ -52971,6 +53845,27 @@ function flipAlongDim(v, dimIdx) {
52971
53845
  }
52972
53846
  return RTV.tensor(result, [...shape], resultImag);
52973
53847
  }
53848
+ function flipCellAlongDim(v, dimIdx) {
53849
+ const shape = v.shape.length >= 2 ? v.shape : [1, v.shape[0] ?? v.data.length];
53850
+ const totalElems = v.data.length;
53851
+ const dimSize = dimIdx < shape.length ? shape[dimIdx] : 1;
53852
+ let strideDim = 1;
53853
+ for (let d = 0; d < dimIdx; d++) strideDim *= shape[d];
53854
+ const slabSize = strideDim * dimSize;
53855
+ const numOuter = totalElems / slabSize;
53856
+ const result = new Array(totalElems);
53857
+ for (let outer = 0; outer < numOuter; outer++) {
53858
+ const base = outer * slabSize;
53859
+ for (let k = 0; k < dimSize; k++) {
53860
+ const srcOff = base + k * strideDim;
53861
+ const dstOff = base + (dimSize - 1 - k) * strideDim;
53862
+ for (let i = 0; i < strideDim; i++) {
53863
+ result[dstOff + i] = v.data[srcOff + i];
53864
+ }
53865
+ }
53866
+ }
53867
+ return RTV.cell(result, [...shape]);
53868
+ }
52974
53869
  function flipSparse(v, dimIdx) {
52975
53870
  const isComplex = v.pi !== void 0;
52976
53871
  const nnz = v.jc[v.n];
@@ -53147,6 +54042,41 @@ defineBuiltin({
53147
54042
  chars[i2 * nc + j2] = linear[j2 * nr + i2];
53148
54043
  return new RuntimeChar(chars.join(""), [nr, nc]);
53149
54044
  }
54045
+ if (isRuntimeStringArray(v)) {
54046
+ const s = parseReshapeDims(args, v.data.length);
54047
+ while (s.length > 2 && s[s.length - 1] === 1) s.pop();
54048
+ if (s.length > 2)
54049
+ throw new RuntimeError("reshape: string arrays must be 2-D");
54050
+ const nr = s[0];
54051
+ const nc = s.length >= 2 ? s[1] : 1;
54052
+ return stringArrayValue(v.data.slice(), [nr, nc]);
54053
+ }
54054
+ if (isRuntimeString(v)) {
54055
+ parseReshapeDims(args, 1);
54056
+ return v;
54057
+ }
54058
+ if (isRuntimeClassInstanceArray(v)) {
54059
+ const total = v.elements.length;
54060
+ const s = parseReshapeDims(args, total);
54061
+ while (s.length > 2 && s[s.length - 1] === 1) s.pop();
54062
+ if (s.length > 2)
54063
+ throw new RuntimeError("reshape: object arrays must be 2-D");
54064
+ const nr = s[0];
54065
+ const nc = s.length >= 2 ? s[1] : 1;
54066
+ if (nr * nc !== total)
54067
+ throw new RuntimeError(
54068
+ "reshape: number of elements must not change"
54069
+ );
54070
+ return RTV.classInstanceArray(v.className, v.elements, [nr, nc]);
54071
+ }
54072
+ if (isRuntimeClassInstance(v)) {
54073
+ const s = parseReshapeDims(args, 1);
54074
+ if (s.reduce((a, b) => a * b, 1) !== 1)
54075
+ throw new RuntimeError(
54076
+ "reshape: number of elements must not change"
54077
+ );
54078
+ return v;
54079
+ }
53150
54080
  if (!isRuntimeTensor(v) && !isRuntimeNumber(v) && !isRuntimeComplexNumber(v))
53151
54081
  throw new RuntimeError("reshape: first argument must be numeric");
53152
54082
  const data = isRuntimeTensor(v) ? v.data : isRuntimeComplexNumber(v) ? allocFloat64Array([v.re]) : allocFloat64Array([v]);
@@ -53458,6 +54388,7 @@ defineBuiltin({
53458
54388
  if (isRuntimeChar(v))
53459
54389
  return RTV.char(v.value.split("").reverse().join(""));
53460
54390
  if (isRuntimeSparseMatrix(v)) return flipSparse(v, 1);
54391
+ if (isRuntimeCell(v)) return flipCellAlongDim(v, 1);
53461
54392
  if (!isRuntimeTensor(v))
53462
54393
  throw new RuntimeError("fliplr: argument must be numeric or char");
53463
54394
  return flipAlongDim(v, 1);
@@ -53478,6 +54409,7 @@ defineBuiltin({
53478
54409
  if (isRuntimeNumber(v)) return v;
53479
54410
  if (isRuntimeChar(v)) return v;
53480
54411
  if (isRuntimeSparseMatrix(v)) return flipSparse(v, 0);
54412
+ if (isRuntimeCell(v)) return flipCellAlongDim(v, 0);
53481
54413
  if (!isRuntimeTensor(v))
53482
54414
  throw new RuntimeError("flipud: argument must be numeric or char");
53483
54415
  return flipAlongDim(v, 0);
@@ -53496,8 +54428,8 @@ defineBuiltin({
53496
54428
  apply: (args) => {
53497
54429
  const v = args[0];
53498
54430
  if (isRuntimeNumber(v)) return v;
53499
- if (!isRuntimeTensor(v))
53500
- throw new RuntimeError("flip: argument must be numeric");
54431
+ if (!isRuntimeTensor(v) && !isRuntimeCell(v))
54432
+ throw new RuntimeError("flip: argument must be numeric or cell");
53501
54433
  let dimIdx = 0;
53502
54434
  if (args.length >= 2) {
53503
54435
  dimIdx = Math.round(toNumber(args[1])) - 1;
@@ -53506,7 +54438,7 @@ defineBuiltin({
53506
54438
  dimIdx = shape.findIndex((d) => d > 1);
53507
54439
  if (dimIdx === -1) dimIdx = 0;
53508
54440
  }
53509
- return flipAlongDim(v, dimIdx);
54441
+ return isRuntimeCell(v) ? flipCellAlongDim(v, dimIdx) : flipAlongDim(v, dimIdx);
53510
54442
  }
53511
54443
  }
53512
54444
  ]
@@ -55176,6 +56108,8 @@ function getValClassName(v) {
55176
56108
  return "double";
55177
56109
  case "dictionary":
55178
56110
  return "dictionary";
56111
+ case "string_array":
56112
+ return "string";
55179
56113
  default:
55180
56114
  return "unknown";
55181
56115
  }
@@ -55205,6 +56139,8 @@ function getShapeOf(v) {
55205
56139
  return [1, 1];
55206
56140
  case "struct_array":
55207
56141
  return [1, obj.elements.length];
56142
+ case "string_array":
56143
+ return [...obj.shape];
55208
56144
  default:
55209
56145
  return [1, 1];
55210
56146
  }
@@ -56872,6 +57808,12 @@ defineBuiltin({
56872
57808
  });
56873
57809
 
56874
57810
  // src/numbl-core/interpreter/builtins/type-constructors.ts
57811
+ function parseDoubleText(s) {
57812
+ const t = s.trim();
57813
+ if (t === "") return NaN;
57814
+ if (/^[+-]?inf(inity)?$/i.test(t)) return t[0] === "-" ? -Infinity : Infinity;
57815
+ return Number(t);
57816
+ }
56875
57817
  defineBuiltin({
56876
57818
  name: "double",
56877
57819
  cases: [
@@ -56879,7 +57821,7 @@ defineBuiltin({
56879
57821
  match: (argTypes) => {
56880
57822
  if (argTypes.length !== 1) return null;
56881
57823
  const a = argTypes[0];
56882
- if (a.kind === "number" || a.kind === "boolean" || a.kind === "char" || a.kind === "complex_or_number" || a.kind === "class_instance")
57824
+ 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")
56883
57825
  return [{ kind: "number" }];
56884
57826
  if (a.kind === "tensor")
56885
57827
  return [
@@ -56901,6 +57843,13 @@ defineBuiltin({
56901
57843
  const codes = Array.from(v.value).map((c) => c.charCodeAt(0));
56902
57844
  return RTV.row(codes);
56903
57845
  }
57846
+ if (isRuntimeString(v)) return RTV.num(parseDoubleText(v));
57847
+ if (isRuntimeStringArray(v)) {
57848
+ return RTV.tensor(allocFloat64Array(v.data.map(parseDoubleText)), [
57849
+ v.shape[0],
57850
+ v.shape[1]
57851
+ ]);
57852
+ }
56904
57853
  if (isRuntimeLogical(v)) return RTV.num(v ? 1 : 0);
56905
57854
  if (isRuntimeNumber(v)) return v;
56906
57855
  if (isRuntimeComplexNumber(v)) return v.re;
@@ -57604,14 +58553,19 @@ registerIBuiltin({
57604
58553
  let delims;
57605
58554
  if (isRuntimeCell(args[1])) {
57606
58555
  delims = args[1].data.map((d) => toString(d));
58556
+ } else if (isRuntimeStringArray(args[1])) {
58557
+ delims = args[1].data.slice();
57607
58558
  } else {
57608
58559
  delims = [toString(args[1])];
57609
58560
  }
57610
58561
  const escaped = delims.map((d) => d.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("|");
57611
58562
  parts = s.split(new RegExp("(?:" + escaped + ")+"));
57612
58563
  }
58564
+ if (isRuntimeString(args[0]) || isRuntimeStringArray(args[0])) {
58565
+ return stringArrayValue(parts, [1, parts.length]);
58566
+ }
57613
58567
  return RTV.cell(
57614
- parts.map((p2) => RTV.string(p2)),
58568
+ parts.map((p2) => RTV.char(p2)),
57615
58569
  [1, parts.length]
57616
58570
  );
57617
58571
  }
@@ -57625,11 +58579,18 @@ registerIBuiltin({
57625
58579
  return {
57626
58580
  outputTypes: [{ kind: "string" }],
57627
58581
  apply: (args) => {
57628
- if (!isRuntimeCell(args[0]))
58582
+ let elements;
58583
+ if (isRuntimeCell(args[0])) {
58584
+ elements = args[0].data.map((v) => toString(v));
58585
+ } else if (isRuntimeStringArray(args[0])) {
58586
+ elements = args[0].data.slice();
58587
+ } else if (isRuntimeString(args[0])) {
58588
+ elements = [args[0]];
58589
+ } else {
57629
58590
  throw new RuntimeError(
57630
- "strjoin: first argument must be a cell array"
58591
+ "strjoin: first argument must be a cell array or string array"
57631
58592
  );
57632
- const elements = args[0].data.map((v) => toString(v));
58593
+ }
57633
58594
  const delim = args.length >= 2 ? toString(args[1]) : " ";
57634
58595
  return RTV.string(elements.join(delim));
57635
58596
  }
@@ -57706,6 +58667,19 @@ function regexpImpl(caseSensitive, name, args, nargout) {
57706
58667
  [1, tokensList.length]
57707
58668
  );
57708
58669
  }
58670
+ if (mode === "split") {
58671
+ const splits = [];
58672
+ let prev = 0;
58673
+ for (let i = 0; i < starts.length; i++) {
58674
+ splits.push(str.slice(prev, starts[i] - 1));
58675
+ prev = ends[i];
58676
+ }
58677
+ splits.push(str.slice(prev));
58678
+ return RTV.cell(
58679
+ splits.map((s) => RTV.char(s)),
58680
+ [1, splits.length]
58681
+ );
58682
+ }
57709
58683
  if (mode === "names") {
57710
58684
  if (starts.length === 0) return RTV.tensor(allocFloat64Array(0), [0, 0]);
57711
58685
  const namedRe = new RegExp(pat, flags);
@@ -62917,7 +63891,7 @@ function getSourceLine(getSource, file, line) {
62917
63891
  }
62918
63892
 
62919
63893
  // src/numbl-core/version.ts
62920
- var NUMBL_VERSION = "0.4.8";
63894
+ var NUMBL_VERSION = "0.4.10";
62921
63895
 
62922
63896
  // src/cli-repl.ts
62923
63897
  import { createInterface } from "readline";
@@ -65186,13 +66160,16 @@ function evalExprNargout(expr, nargout) {
65186
66160
  return ctx.dimIndex < rv.shape.length ? rv.shape[ctx.dimIndex] : 1;
65187
66161
  }
65188
66162
  if (isRuntimeChar(rv)) return rv.value.length;
65189
- if (isRuntimeString(rv)) return rv.length;
66163
+ if (isRuntimeString(rv)) return 1;
65190
66164
  if (isRuntimeClassInstance(rv)) {
65191
- return this.rt.dispatch("end", 1, [
65192
- rv,
65193
- ctx.dimIndex + 1,
65194
- ctx.numIndices
65195
- ]);
66165
+ if (this.rt.resolveClassMethod?.(rv.className, "end")) {
66166
+ return this.rt.dispatch("end", 1, [
66167
+ rv,
66168
+ ctx.dimIndex + 1,
66169
+ ctx.numIndices
66170
+ ]);
66171
+ }
66172
+ return 1;
65196
66173
  }
65197
66174
  if (isRuntimeStructArray(rv)) {
65198
66175
  return rv.elements.length;
@@ -65201,6 +66178,10 @@ function evalExprNargout(expr, nargout) {
65201
66178
  if (ctx.numIndices === 1) return rv.elements.length;
65202
66179
  return ctx.dimIndex < rv.shape.length ? rv.shape[ctx.dimIndex] : 1;
65203
66180
  }
66181
+ if (isRuntimeStringArray(rv)) {
66182
+ if (ctx.numIndices === 1) return rv.data.length;
66183
+ return ctx.dimIndex < 2 ? rv.shape[ctx.dimIndex] : 1;
66184
+ }
65204
66185
  if (isRuntimeSparseMatrix(rv)) {
65205
66186
  if (ctx.numIndices === 1) return rv.m * rv.n;
65206
66187
  return ctx.dimIndex === 0 ? rv.m : ctx.dimIndex === 1 ? rv.n : 1;
@@ -65525,7 +66506,8 @@ function evalMember(expr, nargout) {
65525
66506
  if (lastDot > 0) {
65526
66507
  const prefix = dottedName.slice(0, lastDot);
65527
66508
  const methodName = dottedName.slice(lastDot + 1);
65528
- if (this.functionIndex.classStaticMethods.get(prefix)?.has(methodName)) {
66509
+ if (this.functionIndex.classStaticMethods.get(prefix)?.has(methodName) || // Implicit static `ClassName.empty` (handled by interpretClassMethod)
66510
+ methodName === "empty" && this.functionIndex.workspaceClasses.has(prefix)) {
65529
66511
  const target = {
65530
66512
  kind: "classMethod",
65531
66513
  className: prefix,
@@ -66777,6 +67759,22 @@ function interpretClassMethod(target, args, nargout) {
66777
67759
  () => this.callUserFunction(extFn, actualArgs2, nargout)
66778
67760
  );
66779
67761
  }
67762
+ if (methodName === "empty") {
67763
+ const dims = [];
67764
+ for (const a of args) {
67765
+ const rv = ensureRuntimeValue(a);
67766
+ if (isRuntimeTensor(rv)) for (const d of rv.data) dims.push(d);
67767
+ else dims.push(toNumber(rv));
67768
+ }
67769
+ if (dims.length === 1) dims.push(dims[0]);
67770
+ if (dims.length === 0) dims.push(0, 0);
67771
+ if (!dims.some((d) => d === 0)) {
67772
+ throw new RuntimeError(
67773
+ `${className}.empty: at least one dimension must be zero`
67774
+ );
67775
+ }
67776
+ return RTV.classInstanceArray(className, [], [dims[0], dims[1]]);
67777
+ }
66780
67778
  throw new RuntimeError(
66781
67779
  `No method '${methodName}' for class '${className}'`
66782
67780
  );
@@ -66902,8 +67900,9 @@ function callUserFunction(fn, args, nargout, narginOverride) {
66902
67900
  const fnEnv = new Environment();
66903
67901
  fnEnv.rt = this.rt;
66904
67902
  fnEnv.persistentFuncId = `${this.currentFile}:${fn.name}`;
66905
- const hasVarargin = fn.params.length > 0 && fn.params[fn.params.length - 1] === "varargin";
66906
- const regularParams = hasVarargin ? fn.params.slice(0, -1) : fn.params;
67903
+ const vararginIdx = fn.params.indexOf("varargin");
67904
+ const hasVarargin = vararginIdx !== -1;
67905
+ const regularParams = hasVarargin ? fn.params.slice(0, vararginIdx) : fn.params;
66907
67906
  let numPositional = regularParams.length;
66908
67907
  const inputBlocks = (fn.argumentsBlocks ?? []).filter(
66909
67908
  (b) => b.kind !== "Output"
@@ -66922,7 +67921,14 @@ function callUserFunction(fn, args, nargout, narginOverride) {
66922
67921
  }
66923
67922
  }
66924
67923
  if (hasVarargin) {
66925
- const extraArgs = sharedArgs.slice(regularParams.length).map((a) => ensureRuntimeValue(a));
67924
+ let extras = sharedArgs.slice(regularParams.length);
67925
+ if (vararginIdx !== fn.params.length - 1) {
67926
+ extras = extras.slice(
67927
+ 0,
67928
+ nameValueTailStart(extras, nameValueFieldNames(fn))
67929
+ );
67930
+ }
67931
+ const extraArgs = extras.map((a) => ensureRuntimeValue(a));
66926
67932
  fnEnv.set("varargin", RTV.cell(extraArgs, [1, extraArgs.length]));
66927
67933
  }
66928
67934
  fnEnv.set("$nargin", narginOverride ?? args.length);
@@ -67307,6 +68313,28 @@ function evalInLocalScope(codeArg, fileName) {
67307
68313
  }
67308
68314
  throw new RuntimeError("eval not available in this context");
67309
68315
  }
68316
+ function nameValueFieldNames(fn) {
68317
+ const names = /* @__PURE__ */ new Set();
68318
+ for (const block of fn.argumentsBlocks ?? []) {
68319
+ if (block.kind === "Output" || block.kind === "OutputRepeating") continue;
68320
+ for (const e of block.entries) {
68321
+ const dot2 = e.name.indexOf(".");
68322
+ if (dot2 >= 0) names.add(e.name.slice(dot2 + 1));
68323
+ }
68324
+ }
68325
+ return names;
68326
+ }
68327
+ function nameValueTailStart(extras, fieldNames) {
68328
+ if (fieldNames.size === 0) return extras.length;
68329
+ for (let i = 0; i < extras.length; i++) {
68330
+ if (extras[i] === void 0) continue;
68331
+ const rv = ensureRuntimeValue(extras[i]);
68332
+ if ((isRuntimeChar(rv) || isRuntimeString(rv)) && fieldNames.has(toString(rv))) {
68333
+ return i;
68334
+ }
68335
+ }
68336
+ return extras.length;
68337
+ }
67310
68338
  function processArgumentsBlocks(fn, args) {
67311
68339
  const argBlocks = fn.argumentsBlocks;
67312
68340
  if (!argBlocks || argBlocks.length === 0) return;
@@ -67341,9 +68369,18 @@ function processArgumentsBlocks(fn, args) {
67341
68369
  );
67342
68370
  }
67343
68371
  }
68372
+ const vararginIdx = fn.params.indexOf("varargin");
67344
68373
  for (const [paramName, fields] of nvGroups) {
67345
68374
  const pIdx = fn.params.indexOf(paramName);
67346
- const nvArgs = args.slice(pIdx >= 0 ? pIdx : args.length);
68375
+ let nvArgs;
68376
+ if (pIdx >= 0 && vararginIdx >= 0 && vararginIdx < pIdx) {
68377
+ const extras = args.slice(vararginIdx);
68378
+ nvArgs = extras.slice(
68379
+ nameValueTailStart(extras, nameValueFieldNames(fn))
68380
+ );
68381
+ } else {
68382
+ nvArgs = args.slice(pIdx >= 0 ? pIdx : args.length);
68383
+ }
67347
68384
  const defaults = {};
67348
68385
  for (const { field, defaultExpr } of fields) {
67349
68386
  if (defaultExpr) defaults[field] = this.evalExpr(defaultExpr);
@@ -68629,6 +69666,11 @@ var shimFiles = [
68629
69666
  else
68630
69667
  result = val;
68631
69668
  end
69669
+ % The backing dictionary stores char values as strings;
69670
+ % MATLAB's containers.Map hands back char.
69671
+ if strcmp(obj.ValueType, 'char') && isstring(result)
69672
+ result = char(result);
69673
+ end
68632
69674
  elseif strcmp(S(1).type, '.')
68633
69675
  result = builtin('subsref', obj, S);
68634
69676
  elseif strcmp(S(1).type, '{}')
@@ -68662,11 +69704,14 @@ var shimFiles = [
68662
69704
  end
68663
69705
  k = keys(obj.data_);
68664
69706
  if strcmp(obj.KeyType, 'char')
68665
- % Return cell array of char vectors
68666
- if iscell(k)
68667
- result = k;
68668
- else
68669
- result = {k};
69707
+ % Return a cellstr: the backing dictionary stores keys as
69708
+ % strings, but MATLAB's containers.Map returns char vectors.
69709
+ if ~iscell(k)
69710
+ k = {k};
69711
+ end
69712
+ result = cell(size(k));
69713
+ for i = 1:numel(k)
69714
+ result{i} = char(k{i});
68670
69715
  end
68671
69716
  else
68672
69717
  % Numeric keys: parse back from string
@@ -68699,6 +69744,14 @@ var shimFiles = [
68699
69744
  result{i} = v(i);
68700
69745
  end
68701
69746
  end
69747
+ if strcmp(obj.ValueType, 'char')
69748
+ % Stored as strings in the dictionary; MATLAB returns char.
69749
+ for i = 1:numel(result)
69750
+ if isstring(result{i})
69751
+ result{i} = char(result{i});
69752
+ end
69753
+ end
69754
+ end
68702
69755
  end
68703
69756
  end
68704
69757
 
@@ -95159,6 +96212,31 @@ function executeCode(source, options = {}, workspaceFiles, mainFileName = "scrip
95159
96212
  implicitCwdPath = null;
95160
96213
  }
95161
96214
  }
96215
+ if (searchPaths && options.fileIO?.scanDirectory) {
96216
+ const haveM = new Set(mWorkspaceFiles.map((f) => f.name));
96217
+ for (const dir of searchPaths) {
96218
+ try {
96219
+ const absDir = options.fileIO.resolvePath?.(dir) ?? dir;
96220
+ for (const f of options.fileIO.scanDirectory(absDir)) {
96221
+ if (f.name.endsWith(".m")) {
96222
+ if (!haveM.has(f.name)) {
96223
+ mWorkspaceFiles.push(f);
96224
+ haveM.add(f.name);
96225
+ }
96226
+ } else if (isNumblJsFile(f.name)) {
96227
+ if (!jsWorkspaceFiles.some((e) => e.name === f.name)) {
96228
+ jsWorkspaceFiles.push(f);
96229
+ }
96230
+ } else if (f.name.endsWith(".wasm")) {
96231
+ if (!wasmWorkspaceFiles.some((e) => e.name === f.name)) {
96232
+ wasmWorkspaceFiles.push(f);
96233
+ }
96234
+ }
96235
+ }
96236
+ } catch {
96237
+ }
96238
+ }
96239
+ }
95162
96240
  const jsUserFunctions = loadJsUserFunctions(
95163
96241
  jsWorkspaceFiles,
95164
96242
  wasmWorkspaceFiles,
@@ -95791,7 +96869,7 @@ var NodeFileIOAdapter = class {
95791
96869
  if (entry.eof) return 1;
95792
96870
  const buf = Buffer.alloc(1);
95793
96871
  try {
95794
- const bytesRead = readSync(entry.fd, buf, 0, 1, null);
96872
+ const bytesRead = readSync(entry.fd, buf, 0, 1, entry.pos);
95795
96873
  if (bytesRead === 0) {
95796
96874
  entry.eof = true;
95797
96875
  return 1;
@@ -96294,6 +97372,12 @@ var NodeFileIOAdapter = class {
96294
97372
  }
96295
97373
  /**
96296
97374
  * Read one line from the file's buffer, refilling from the fd as needed.
97375
+ *
97376
+ * All reads are positional so `entry.pos` stays the single source of truth
97377
+ * for the logical file position: the buffer always holds the bytes starting
97378
+ * at `entry.pos`, and consuming a line advances `entry.pos` by its byte
97379
+ * length. This keeps text I/O (fgetl/fgets) coherent with binary I/O and
97380
+ * fscanf (freadBytes/fseek/ftell).
96297
97381
  * @param keepNewline - if true, keep the trailing newline (fgets); if false, strip it (fgetl)
96298
97382
  */
96299
97383
  readLine(entry, keepNewline) {
@@ -96303,7 +97387,13 @@ var NodeFileIOAdapter = class {
96303
97387
  const buf = Buffer.alloc(READ_CHUNK_SIZE);
96304
97388
  let bytesRead;
96305
97389
  try {
96306
- bytesRead = readSync(entry.fd, buf, 0, READ_CHUNK_SIZE, null);
97390
+ bytesRead = readSync(
97391
+ entry.fd,
97392
+ buf,
97393
+ 0,
97394
+ READ_CHUNK_SIZE,
97395
+ entry.pos + Buffer.byteLength(entry.buffer, "utf-8")
97396
+ );
96307
97397
  entry.lastError = "";
96308
97398
  } catch (e) {
96309
97399
  entry.lastError = e instanceof Error ? e.message : String(e);
@@ -96321,12 +97411,15 @@ var NodeFileIOAdapter = class {
96321
97411
  }
96322
97412
  const nlIdx = entry.buffer.indexOf("\n");
96323
97413
  if (nlIdx !== -1) {
96324
- const line2 = keepNewline ? entry.buffer.slice(0, nlIdx + 1) : entry.buffer.slice(0, nlIdx);
97414
+ const consumed = entry.buffer.slice(0, nlIdx + 1);
97415
+ const line2 = keepNewline ? consumed : entry.buffer.slice(0, nlIdx);
96325
97416
  entry.buffer = entry.buffer.slice(nlIdx + 1);
97417
+ entry.pos += Buffer.byteLength(consumed, "utf-8");
96326
97418
  return line2;
96327
97419
  }
96328
97420
  const line = entry.buffer;
96329
97421
  entry.buffer = "";
97422
+ entry.pos += Buffer.byteLength(line, "utf-8");
96330
97423
  return line;
96331
97424
  }
96332
97425
  };