numbl 0.4.7 → 0.4.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (552) hide show
  1. package/dist-browser/browser/index.d.ts +21 -0
  2. package/dist-browser/browser/mip.d.ts +10 -0
  3. package/dist-browser/browser/protocol.d.ts +59 -0
  4. package/dist-browser/browser/session.d.ts +55 -0
  5. package/dist-browser/browser/system-store.d.ts +30 -0
  6. package/dist-browser/browser/worker.d.ts +1 -0
  7. package/dist-browser/browser.js +131 -0
  8. package/dist-browser/db/operations.d.ts +25 -0
  9. package/dist-browser/db/schema.d.ts +26 -0
  10. package/dist-browser/graphics/axisLimits.d.ts +23 -0
  11. package/dist-browser/graphics/figuresReducer.d.ts +86 -0
  12. package/dist-browser/graphics/types.d.ts +423 -0
  13. package/dist-browser/hooks/useProjectFiles.d.ts +45 -0
  14. package/dist-browser/numbl-core/diagnostics/errors.d.ts +8 -0
  15. package/dist-browser/numbl-core/diagnostics/index.d.ts +27 -0
  16. package/dist-browser/numbl-core/executeCode.d.ts +108 -0
  17. package/dist-browser/numbl-core/executors/cache.d.ts +26 -0
  18. package/dist-browser/numbl-core/executors/classification.d.ts +134 -0
  19. package/dist-browser/numbl-core/executors/context.d.ts +76 -0
  20. package/dist-browser/numbl-core/executors/handleInline.d.ts +58 -0
  21. package/dist-browser/numbl-core/executors/index.d.ts +14 -0
  22. package/dist-browser/numbl-core/executors/jit/cJitCallExecutor.d.ts +35 -0
  23. package/dist-browser/numbl-core/executors/jit/cJitLoopExecutor.d.ts +31 -0
  24. package/dist-browser/numbl-core/executors/jit/cJitTopLevelExecutor.d.ts +29 -0
  25. package/dist-browser/numbl-core/executors/jit/callExecutor.d.ts +45 -0
  26. package/dist-browser/numbl-core/executors/jit/compileC.d.ts +51 -0
  27. package/dist-browser/numbl-core/executors/jit/compileC.node.d.ts +25 -0
  28. package/dist-browser/numbl-core/executors/jit/hostHelpers.d.ts +31 -0
  29. package/dist-browser/numbl-core/executors/jit/loopExecutor.d.ts +41 -0
  30. package/dist-browser/numbl-core/executors/jit/session.d.ts +17 -0
  31. package/dist-browser/numbl-core/executors/jit/topLevelExecutor.d.ts +36 -0
  32. package/dist-browser/numbl-core/executors/jit/typeAdapter.d.ts +28 -0
  33. package/dist-browser/numbl-core/executors/jit/typeAdapterC.d.ts +73 -0
  34. package/dist-browser/numbl-core/executors/jit/valueAdapter.d.ts +55 -0
  35. package/dist-browser/numbl-core/executors/jit/valueAdapterC.d.ts +108 -0
  36. package/dist-browser/numbl-core/executors/lowering.d.ts +120 -0
  37. package/dist-browser/numbl-core/executors/plugins.d.ts +41 -0
  38. package/dist-browser/numbl-core/executors/registry.d.ts +148 -0
  39. package/dist-browser/numbl-core/executors/types.d.ts +103 -0
  40. package/dist-browser/numbl-core/externalAccessDirective.d.ts +6 -0
  41. package/dist-browser/numbl-core/fileIOAdapter.d.ts +88 -0
  42. package/dist-browser/numbl-core/functionResolve.d.ts +70 -0
  43. package/dist-browser/numbl-core/helpers/arithmetic.d.ts +47 -0
  44. package/dist-browser/numbl-core/helpers/bessel.d.ts +49 -0
  45. package/dist-browser/numbl-core/helpers/check-helpers.d.ts +49 -0
  46. package/dist-browser/numbl-core/helpers/constants.d.ts +6 -0
  47. package/dist-browser/numbl-core/helpers/dummy.d.ts +5 -0
  48. package/dist-browser/numbl-core/helpers/effectively-real.d.ts +25 -0
  49. package/dist-browser/numbl-core/helpers/eigs-select.d.ts +25 -0
  50. package/dist-browser/numbl-core/helpers/erf.d.ts +5 -0
  51. package/dist-browser/numbl-core/helpers/gmres.d.ts +51 -0
  52. package/dist-browser/numbl-core/helpers/linsolve.d.ts +25 -0
  53. package/dist-browser/numbl-core/helpers/marching-cubes-tables.d.ts +10 -0
  54. package/dist-browser/numbl-core/helpers/marching-cubes.d.ts +46 -0
  55. package/dist-browser/numbl-core/helpers/ode-rk.d.ts +83 -0
  56. package/dist-browser/numbl-core/helpers/prng.d.ts +19 -0
  57. package/dist-browser/numbl-core/helpers/quadgk.d.ts +32 -0
  58. package/dist-browser/numbl-core/helpers/reduction/cumulative.d.ts +8 -0
  59. package/dist-browser/numbl-core/helpers/reduction/min-max.d.ts +5 -0
  60. package/dist-browser/numbl-core/helpers/reduction-helpers.d.ts +66 -0
  61. package/dist-browser/numbl-core/helpers/registry.d.ts +7 -0
  62. package/dist-browser/numbl-core/helpers/scanFormat.d.ts +11 -0
  63. package/dist-browser/numbl-core/helpers/shape-utils.d.ts +7 -0
  64. package/dist-browser/numbl-core/helpers/sparse-arithmetic.d.ts +16 -0
  65. package/dist-browser/numbl-core/helpers/string.d.ts +11 -0
  66. package/dist-browser/numbl-core/interpreter/builtins/arithmetic.d.ts +4 -0
  67. package/dist-browser/numbl-core/interpreter/builtins/array-construction.d.ts +10 -0
  68. package/dist-browser/numbl-core/interpreter/builtins/array-extras.d.ts +5 -0
  69. package/dist-browser/numbl-core/interpreter/builtins/array-manipulation.d.ts +7 -0
  70. package/dist-browser/numbl-core/interpreter/builtins/cell-struct.d.ts +5 -0
  71. package/dist-browser/numbl-core/interpreter/builtins/complex.d.ts +4 -0
  72. package/dist-browser/numbl-core/interpreter/builtins/datetime.d.ts +40 -0
  73. package/dist-browser/numbl-core/interpreter/builtins/dictionary.d.ts +15 -0
  74. package/dist-browser/numbl-core/interpreter/builtins/fft.d.ts +7 -0
  75. package/dist-browser/numbl-core/interpreter/builtins/gallery.d.ts +7 -0
  76. package/dist-browser/numbl-core/interpreter/builtins/geometry.d.ts +10 -0
  77. package/dist-browser/numbl-core/interpreter/builtins/graph.d.ts +29 -0
  78. package/dist-browser/numbl-core/interpreter/builtins/help-text.d.ts +5 -0
  79. package/dist-browser/numbl-core/interpreter/builtins/index.d.ts +39 -0
  80. package/dist-browser/numbl-core/interpreter/builtins/introspection.d.ts +6 -0
  81. package/dist-browser/numbl-core/interpreter/builtins/linear-algebra.d.ts +9 -0
  82. package/dist-browser/numbl-core/interpreter/builtins/logical.d.ts +9 -0
  83. package/dist-browser/numbl-core/interpreter/builtins/math.d.ts +4 -0
  84. package/dist-browser/numbl-core/interpreter/builtins/misc.d.ts +7 -0
  85. package/dist-browser/numbl-core/interpreter/builtins/numerical.d.ts +10 -0
  86. package/dist-browser/numbl-core/interpreter/builtins/predicates.d.ts +4 -0
  87. package/dist-browser/numbl-core/interpreter/builtins/prng.d.ts +4 -0
  88. package/dist-browser/numbl-core/interpreter/builtins/reductions.d.ts +6 -0
  89. package/dist-browser/numbl-core/interpreter/builtins/set-operations.d.ts +4 -0
  90. package/dist-browser/numbl-core/interpreter/builtins/sparse.d.ts +4 -0
  91. package/dist-browser/numbl-core/interpreter/builtins/special-math.d.ts +4 -0
  92. package/dist-browser/numbl-core/interpreter/builtins/string-extras.d.ts +5 -0
  93. package/dist-browser/numbl-core/interpreter/builtins/strings.d.ts +7 -0
  94. package/dist-browser/numbl-core/interpreter/builtins/time-system.d.ts +6 -0
  95. package/dist-browser/numbl-core/interpreter/builtins/type-constructors.d.ts +5 -0
  96. package/dist-browser/numbl-core/interpreter/builtins/types.d.ts +98 -0
  97. package/dist-browser/numbl-core/interpreter/builtins/utility.d.ts +4 -0
  98. package/dist-browser/numbl-core/interpreter/builtins/validation.d.ts +4 -0
  99. package/dist-browser/numbl-core/interpreter/interpreter.d.ts +199 -0
  100. package/dist-browser/numbl-core/interpreter/interpreterExec.d.ts +81 -0
  101. package/dist-browser/numbl-core/interpreter/interpreterFunctions.d.ts +62 -0
  102. package/dist-browser/numbl-core/interpreter/interpreterSpecialBuiltins.d.ts +35 -0
  103. package/dist-browser/numbl-core/interpreter/types.d.ts +114 -0
  104. package/dist-browser/numbl-core/jit/builtins/defs/_shared.d.ts +43 -0
  105. package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/_elemwise.d.ts +123 -0
  106. package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/minus.d.ts +2 -0
  107. package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/mpower.d.ts +12 -0
  108. package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/mrdivide.d.ts +5 -0
  109. package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/mtimes.d.ts +2 -0
  110. package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/plus.d.ts +2 -0
  111. package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/power.d.ts +30 -0
  112. package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/rdivide.d.ts +2 -0
  113. package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/times.d.ts +2 -0
  114. package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/uminus.d.ts +2 -0
  115. package/dist-browser/numbl-core/jit/builtins/defs/compare/_compare.d.ts +12 -0
  116. package/dist-browser/numbl-core/jit/builtins/defs/compare/eq.d.ts +2 -0
  117. package/dist-browser/numbl-core/jit/builtins/defs/compare/ge.d.ts +2 -0
  118. package/dist-browser/numbl-core/jit/builtins/defs/compare/gt.d.ts +2 -0
  119. package/dist-browser/numbl-core/jit/builtins/defs/compare/le.d.ts +2 -0
  120. package/dist-browser/numbl-core/jit/builtins/defs/compare/lt.d.ts +2 -0
  121. package/dist-browser/numbl-core/jit/builtins/defs/compare/ne.d.ts +2 -0
  122. package/dist-browser/numbl-core/jit/builtins/defs/diag/assert.d.ts +6 -0
  123. package/dist-browser/numbl-core/jit/builtins/defs/io/_format_args.d.ts +17 -0
  124. package/dist-browser/numbl-core/jit/builtins/defs/io/disp.d.ts +2 -0
  125. package/dist-browser/numbl-core/jit/builtins/defs/io/error.d.ts +2 -0
  126. package/dist-browser/numbl-core/jit/builtins/defs/io/fprintf.d.ts +2 -0
  127. package/dist-browser/numbl-core/jit/builtins/defs/io/sprintf.d.ts +2 -0
  128. package/dist-browser/numbl-core/jit/builtins/defs/io/warning.d.ts +15 -0
  129. package/dist-browser/numbl-core/jit/builtins/defs/logical/_shortcircuit.d.ts +30 -0
  130. package/dist-browser/numbl-core/jit/builtins/defs/logical/_unary_pred.d.ts +30 -0
  131. package/dist-browser/numbl-core/jit/builtins/defs/logical/and.d.ts +5 -0
  132. package/dist-browser/numbl-core/jit/builtins/defs/logical/andand.d.ts +1 -0
  133. package/dist-browser/numbl-core/jit/builtins/defs/logical/boolconst.d.ts +3 -0
  134. package/dist-browser/numbl-core/jit/builtins/defs/logical/classBuiltin.d.ts +21 -0
  135. package/dist-browser/numbl-core/jit/builtins/defs/logical/fieldnames.d.ts +15 -0
  136. package/dist-browser/numbl-core/jit/builtins/defs/logical/isa.d.ts +13 -0
  137. package/dist-browser/numbl-core/jit/builtins/defs/logical/iscell.d.ts +8 -0
  138. package/dist-browser/numbl-core/jit/builtins/defs/logical/isempty.d.ts +2 -0
  139. package/dist-browser/numbl-core/jit/builtins/defs/logical/isequal.d.ts +2 -0
  140. package/dist-browser/numbl-core/jit/builtins/defs/logical/isfield.d.ts +20 -0
  141. package/dist-browser/numbl-core/jit/builtins/defs/logical/isinf.d.ts +2 -0
  142. package/dist-browser/numbl-core/jit/builtins/defs/logical/isnan.d.ts +1 -0
  143. package/dist-browser/numbl-core/jit/builtins/defs/logical/isnumeric.d.ts +7 -0
  144. package/dist-browser/numbl-core/jit/builtins/defs/logical/isreal.d.ts +2 -0
  145. package/dist-browser/numbl-core/jit/builtins/defs/logical/isscalar.d.ts +20 -0
  146. package/dist-browser/numbl-core/jit/builtins/defs/logical/isstruct.d.ts +7 -0
  147. package/dist-browser/numbl-core/jit/builtins/defs/logical/logical.d.ts +1 -0
  148. package/dist-browser/numbl-core/jit/builtins/defs/logical/not.d.ts +15 -0
  149. package/dist-browser/numbl-core/jit/builtins/defs/logical/or.d.ts +11 -0
  150. package/dist-browser/numbl-core/jit/builtins/defs/logical/oror.d.ts +1 -0
  151. package/dist-browser/numbl-core/jit/builtins/defs/logical/strcmp.d.ts +21 -0
  152. package/dist-browser/numbl-core/jit/builtins/defs/logical/typequery.d.ts +10 -0
  153. package/dist-browser/numbl-core/jit/builtins/defs/logical/xor.d.ts +12 -0
  154. package/dist-browser/numbl-core/jit/builtins/defs/math/_complex_fold.d.ts +34 -0
  155. package/dist-browser/numbl-core/jit/builtins/defs/math/_unary_real.d.ts +51 -0
  156. package/dist-browser/numbl-core/jit/builtins/defs/math/abs.d.ts +7 -0
  157. package/dist-browser/numbl-core/jit/builtins/defs/math/angle.d.ts +7 -0
  158. package/dist-browser/numbl-core/jit/builtins/defs/math/asinh.d.ts +1 -0
  159. package/dist-browser/numbl-core/jit/builtins/defs/math/atan.d.ts +1 -0
  160. package/dist-browser/numbl-core/jit/builtins/defs/math/atan2.d.ts +3 -0
  161. package/dist-browser/numbl-core/jit/builtins/defs/math/besselh.d.ts +2 -0
  162. package/dist-browser/numbl-core/jit/builtins/defs/math/ceil.d.ts +4 -0
  163. package/dist-browser/numbl-core/jit/builtins/defs/math/conj.d.ts +7 -0
  164. package/dist-browser/numbl-core/jit/builtins/defs/math/constants.d.ts +7 -0
  165. package/dist-browser/numbl-core/jit/builtins/defs/math/cos.d.ts +1 -0
  166. package/dist-browser/numbl-core/jit/builtins/defs/math/cosh.d.ts +1 -0
  167. package/dist-browser/numbl-core/jit/builtins/defs/math/dot.d.ts +20 -0
  168. package/dist-browser/numbl-core/jit/builtins/defs/math/double.d.ts +28 -0
  169. package/dist-browser/numbl-core/jit/builtins/defs/math/exp.d.ts +1 -0
  170. package/dist-browser/numbl-core/jit/builtins/defs/math/fix.d.ts +4 -0
  171. package/dist-browser/numbl-core/jit/builtins/defs/math/floor.d.ts +4 -0
  172. package/dist-browser/numbl-core/jit/builtins/defs/math/hypot.d.ts +3 -0
  173. package/dist-browser/numbl-core/jit/builtins/defs/math/imag.d.ts +7 -0
  174. package/dist-browser/numbl-core/jit/builtins/defs/math/linspace.d.ts +6 -0
  175. package/dist-browser/numbl-core/jit/builtins/defs/math/log.d.ts +4 -0
  176. package/dist-browser/numbl-core/jit/builtins/defs/math/log10.d.ts +3 -0
  177. package/dist-browser/numbl-core/jit/builtins/defs/math/log2.d.ts +5 -0
  178. package/dist-browser/numbl-core/jit/builtins/defs/math/logspace.d.ts +8 -0
  179. package/dist-browser/numbl-core/jit/builtins/defs/math/mod.d.ts +1 -0
  180. package/dist-browser/numbl-core/jit/builtins/defs/math/norm.d.ts +2 -0
  181. package/dist-browser/numbl-core/jit/builtins/defs/math/rand.d.ts +2 -0
  182. package/dist-browser/numbl-core/jit/builtins/defs/math/real.d.ts +7 -0
  183. package/dist-browser/numbl-core/jit/builtins/defs/math/rem.d.ts +3 -0
  184. package/dist-browser/numbl-core/jit/builtins/defs/math/round.d.ts +1 -0
  185. package/dist-browser/numbl-core/jit/builtins/defs/math/sign.d.ts +5 -0
  186. package/dist-browser/numbl-core/jit/builtins/defs/math/sin.d.ts +1 -0
  187. package/dist-browser/numbl-core/jit/builtins/defs/math/sinh.d.ts +1 -0
  188. package/dist-browser/numbl-core/jit/builtins/defs/math/sqrt.d.ts +11 -0
  189. package/dist-browser/numbl-core/jit/builtins/defs/math/tan.d.ts +1 -0
  190. package/dist-browser/numbl-core/jit/builtins/defs/math/tanh.d.ts +1 -0
  191. package/dist-browser/numbl-core/jit/builtins/defs/math/uniquetol.d.ts +22 -0
  192. package/dist-browser/numbl-core/jit/builtins/defs/plot/dispatch.d.ts +6 -0
  193. package/dist-browser/numbl-core/jit/builtins/defs/reduction/_cumulative.d.ts +49 -0
  194. package/dist-browser/numbl-core/jit/builtins/defs/reduction/_shape.d.ts +126 -0
  195. package/dist-browser/numbl-core/jit/builtins/defs/reduction/_variance.d.ts +17 -0
  196. package/dist-browser/numbl-core/jit/builtins/defs/reduction/all.d.ts +1 -0
  197. package/dist-browser/numbl-core/jit/builtins/defs/reduction/any.d.ts +1 -0
  198. package/dist-browser/numbl-core/jit/builtins/defs/reduction/cummax.d.ts +1 -0
  199. package/dist-browser/numbl-core/jit/builtins/defs/reduction/cummin.d.ts +1 -0
  200. package/dist-browser/numbl-core/jit/builtins/defs/reduction/cumprod.d.ts +1 -0
  201. package/dist-browser/numbl-core/jit/builtins/defs/reduction/cumsum.d.ts +1 -0
  202. package/dist-browser/numbl-core/jit/builtins/defs/reduction/diff.d.ts +16 -0
  203. package/dist-browser/numbl-core/jit/builtins/defs/reduction/length.d.ts +2 -0
  204. package/dist-browser/numbl-core/jit/builtins/defs/reduction/max.d.ts +1 -0
  205. package/dist-browser/numbl-core/jit/builtins/defs/reduction/mean.d.ts +1 -0
  206. package/dist-browser/numbl-core/jit/builtins/defs/reduction/min.d.ts +1 -0
  207. package/dist-browser/numbl-core/jit/builtins/defs/reduction/numel.d.ts +2 -0
  208. package/dist-browser/numbl-core/jit/builtins/defs/reduction/prod.d.ts +1 -0
  209. package/dist-browser/numbl-core/jit/builtins/defs/reduction/std.d.ts +1 -0
  210. package/dist-browser/numbl-core/jit/builtins/defs/reduction/sum.d.ts +1 -0
  211. package/dist-browser/numbl-core/jit/builtins/defs/reduction/var.d.ts +1 -0
  212. package/dist-browser/numbl-core/jit/builtins/defs/shape/_construct.d.ts +67 -0
  213. package/dist-browser/numbl-core/jit/builtins/defs/shape/_triangular.d.ts +34 -0
  214. package/dist-browser/numbl-core/jit/builtins/defs/shape/cat.d.ts +33 -0
  215. package/dist-browser/numbl-core/jit/builtins/defs/shape/diag.d.ts +29 -0
  216. package/dist-browser/numbl-core/jit/builtins/defs/shape/eye.d.ts +5 -0
  217. package/dist-browser/numbl-core/jit/builtins/defs/shape/flip.d.ts +7 -0
  218. package/dist-browser/numbl-core/jit/builtins/defs/shape/meshgrid.d.ts +12 -0
  219. package/dist-browser/numbl-core/jit/builtins/defs/shape/ones.d.ts +1 -0
  220. package/dist-browser/numbl-core/jit/builtins/defs/shape/repmat.d.ts +37 -0
  221. package/dist-browser/numbl-core/jit/builtins/defs/shape/reshape.d.ts +39 -0
  222. package/dist-browser/numbl-core/jit/builtins/defs/shape/size.d.ts +20 -0
  223. package/dist-browser/numbl-core/jit/builtins/defs/shape/sort.d.ts +19 -0
  224. package/dist-browser/numbl-core/jit/builtins/defs/shape/transpose.d.ts +6 -0
  225. package/dist-browser/numbl-core/jit/builtins/defs/shape/tril.d.ts +16 -0
  226. package/dist-browser/numbl-core/jit/builtins/defs/shape/triu.d.ts +16 -0
  227. package/dist-browser/numbl-core/jit/builtins/defs/shape/zeros.d.ts +1 -0
  228. package/dist-browser/numbl-core/jit/builtins/defs/system/deal.d.ts +20 -0
  229. package/dist-browser/numbl-core/jit/builtins/defs/system/feval.d.ts +36 -0
  230. package/dist-browser/numbl-core/jit/builtins/defs/system/pathBuiltins.d.ts +4 -0
  231. package/dist-browser/numbl-core/jit/builtins/defs/system/tic.d.ts +8 -0
  232. package/dist-browser/numbl-core/jit/builtins/defs/system/toc.d.ts +5 -0
  233. package/dist-browser/numbl-core/jit/builtins/index.d.ts +16 -0
  234. package/dist-browser/numbl-core/jit/builtins/registry.d.ts +138 -0
  235. package/dist-browser/numbl-core/jit/builtins/runtime/cell/cell.d.ts +24 -0
  236. package/dist-browser/numbl-core/jit/builtins/runtime/indexing/loop_count.d.ts +1 -0
  237. package/dist-browser/numbl-core/jit/builtins/runtime/indexing/range_value.d.ts +1 -0
  238. package/dist-browser/numbl-core/jit/builtins/runtime/indexing/scalar_index.d.ts +11 -0
  239. package/dist-browser/numbl-core/jit/builtins/runtime/indexing/tensor_make_range.d.ts +5 -0
  240. package/dist-browser/numbl-core/jit/builtins/runtime/io/assert_fmt.d.ts +1 -0
  241. package/dist-browser/numbl-core/jit/builtins/runtime/io/disp_complex.d.ts +1 -0
  242. package/dist-browser/numbl-core/jit/builtins/runtime/io/disp_double.d.ts +1 -0
  243. package/dist-browser/numbl-core/jit/builtins/runtime/io/disp_struct.d.ts +1 -0
  244. package/dist-browser/numbl-core/jit/builtins/runtime/io/disp_tensor.d.ts +1 -0
  245. package/dist-browser/numbl-core/jit/builtins/runtime/io/disp_tensor_complex.d.ts +1 -0
  246. package/dist-browser/numbl-core/jit/builtins/runtime/io/error_fmt.d.ts +2 -0
  247. package/dist-browser/numbl-core/jit/builtins/runtime/io/format_complex.d.ts +1 -0
  248. package/dist-browser/numbl-core/jit/builtins/runtime/io/format_double.d.ts +1 -0
  249. package/dist-browser/numbl-core/jit/builtins/runtime/io/format_engine.d.ts +1 -0
  250. package/dist-browser/numbl-core/jit/builtins/runtime/io/fprintf.d.ts +1 -0
  251. package/dist-browser/numbl-core/jit/builtins/runtime/io/sprintf.d.ts +5 -0
  252. package/dist-browser/numbl-core/jit/builtins/runtime/io/warning_fmt.d.ts +2 -0
  253. package/dist-browser/numbl-core/jit/builtins/runtime/plot/plot_dispatch.d.ts +1 -0
  254. package/dist-browser/numbl-core/jit/builtins/runtime/snippets.c.gen.d.ts +4 -0
  255. package/dist-browser/numbl-core/jit/builtins/runtime/snippets.gen.d.ts +85 -0
  256. package/dist-browser/numbl-core/jit/builtins/runtime/system/cdiv.d.ts +4 -0
  257. package/dist-browser/numbl-core/jit/builtins/runtime/system/cscalar.d.ts +103 -0
  258. package/dist-browser/numbl-core/jit/builtins/runtime/system/deep_clone.d.ts +1 -0
  259. package/dist-browser/numbl-core/jit/builtins/runtime/system/isequal.d.ts +2 -0
  260. package/dist-browser/numbl-core/jit/builtins/runtime/system/tictoc.d.ts +5 -0
  261. package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor.d.ts +6 -0
  262. package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_alloc.d.ts +5 -0
  263. package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_alloc_complex.d.ts +6 -0
  264. package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_alloc_nd.d.ts +5 -0
  265. package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_alloc_nd_complex.d.ts +6 -0
  266. package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_copy_complex.d.ts +6 -0
  267. package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_from_matrix.d.ts +5 -0
  268. package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_from_matrix_complex.d.ts +6 -0
  269. package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_from_row.d.ts +5 -0
  270. package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_from_row_complex.d.ts +6 -0
  271. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_cat.d.ts +11 -0
  272. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_cumulative.d.ts +32 -0
  273. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_diag.d.ts +33 -0
  274. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_diff.d.ts +5 -0
  275. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_dot.d.ts +16 -0
  276. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_elemwise_complex.d.ts +90 -0
  277. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_elemwise_real.d.ts +75 -0
  278. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_elemwise_real_fn.d.ts +95 -0
  279. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_eye.d.ts +10 -0
  280. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_fill_nd.d.ts +11 -0
  281. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_fill_square.d.ts +5 -0
  282. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_flip.d.ts +11 -0
  283. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_imag_all_zero.d.ts +1 -0
  284. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_linspace.d.ts +5 -0
  285. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_logical_real.d.ts +10 -0
  286. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_logspace.d.ts +5 -0
  287. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_meshgrid.d.ts +29 -0
  288. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_mtimes_complex.d.ts +10 -0
  289. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_mtimes_real.d.ts +6 -0
  290. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_norm.d.ts +4 -0
  291. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_ones_nd.d.ts +5 -0
  292. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_ones_square.d.ts +5 -0
  293. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_predicate.d.ts +42 -0
  294. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_reduce_complex.d.ts +53 -0
  295. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_reduce_real.d.ts +42 -0
  296. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_repmat.d.ts +11 -0
  297. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_reshape_nd.d.ts +5 -0
  298. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_reshape_nd_complex.d.ts +6 -0
  299. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_size.d.ts +5 -0
  300. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_sort_real.d.ts +36 -0
  301. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_transpose.d.ts +5 -0
  302. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_transpose_complex.d.ts +6 -0
  303. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_triangular.d.ts +22 -0
  304. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_unary_complex_math.d.ts +128 -0
  305. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_unary_real_math.d.ts +95 -0
  306. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_uniquetol.d.ts +5 -0
  307. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_var.d.ts +12 -0
  308. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_zeros_nd.d.ts +5 -0
  309. package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_zeros_square.d.ts +5 -0
  310. package/dist-browser/numbl-core/jit/builtins/runtime/text/strcmp.d.ts +2 -0
  311. package/dist-browser/numbl-core/jit/codegen/cFormat.d.ts +36 -0
  312. package/dist-browser/numbl-core/jit/codegen/cHelpers.d.ts +48 -0
  313. package/dist-browser/numbl-core/jit/codegen/emit.d.ts +55 -0
  314. package/dist-browser/numbl-core/jit/codegen/emitCellTypedef.d.ts +23 -0
  315. package/dist-browser/numbl-core/jit/codegen/emitExpr.d.ts +33 -0
  316. package/dist-browser/numbl-core/jit/codegen/emitIndex.d.ts +56 -0
  317. package/dist-browser/numbl-core/jit/codegen/emitJs.d.ts +64 -0
  318. package/dist-browser/numbl-core/jit/codegen/emitNamedTypedef.d.ts +58 -0
  319. package/dist-browser/numbl-core/jit/codegen/emitStmt.d.ts +76 -0
  320. package/dist-browser/numbl-core/jit/codegen/emitTensorConcat.d.ts +23 -0
  321. package/dist-browser/numbl-core/jit/codegen/emitTensorConcatJs.d.ts +16 -0
  322. package/dist-browser/numbl-core/jit/codegen/emitTensorFused.d.ts +77 -0
  323. package/dist-browser/numbl-core/jit/codegen/inlinePass.d.ts +66 -0
  324. package/dist-browser/numbl-core/jit/codegen/liveness.d.ts +58 -0
  325. package/dist-browser/numbl-core/jit/codegen/prettyIR.d.ts +24 -0
  326. package/dist-browser/numbl-core/jit/codegen/runtime.d.ts +152 -0
  327. package/dist-browser/numbl-core/jit/compileSpec.d.ts +84 -0
  328. package/dist-browser/numbl-core/jit/compileSpecC.d.ts +100 -0
  329. package/dist-browser/numbl-core/jit/index.d.ts +15 -0
  330. package/dist-browser/numbl-core/jit/lowering/classDefs.d.ts +109 -0
  331. package/dist-browser/numbl-core/jit/lowering/definiteAssign.d.ts +42 -0
  332. package/dist-browser/numbl-core/jit/lowering/errors.d.ts +35 -0
  333. package/dist-browser/numbl-core/jit/lowering/indexFold.d.ts +31 -0
  334. package/dist-browser/numbl-core/jit/lowering/indexResolve.d.ts +100 -0
  335. package/dist-browser/numbl-core/jit/lowering/ir.d.ts +584 -0
  336. package/dist-browser/numbl-core/jit/lowering/lower.d.ts +271 -0
  337. package/dist-browser/numbl-core/jit/lowering/lowerCellIndex.d.ts +41 -0
  338. package/dist-browser/numbl-core/jit/lowering/lowerCellLit.d.ts +19 -0
  339. package/dist-browser/numbl-core/jit/lowering/lowerClassConstructor.d.ts +55 -0
  340. package/dist-browser/numbl-core/jit/lowering/lowerFuncCall.d.ts +34 -0
  341. package/dist-browser/numbl-core/jit/lowering/lowerHandle.d.ts +57 -0
  342. package/dist-browser/numbl-core/jit/lowering/lowerIndexLoad.d.ts +16 -0
  343. package/dist-browser/numbl-core/jit/lowering/lowerIndexSlice.d.ts +29 -0
  344. package/dist-browser/numbl-core/jit/lowering/lowerIndexSliceStore.d.ts +19 -0
  345. package/dist-browser/numbl-core/jit/lowering/lowerIndexStore.d.ts +14 -0
  346. package/dist-browser/numbl-core/jit/lowering/lowerMethodCall.d.ts +45 -0
  347. package/dist-browser/numbl-core/jit/lowering/lowerMultiAssign.d.ts +36 -0
  348. package/dist-browser/numbl-core/jit/lowering/lowerTensorLit.d.ts +25 -0
  349. package/dist-browser/numbl-core/jit/lowering/rangeCount.d.ts +19 -0
  350. package/dist-browser/numbl-core/jit/lowering/specialize.d.ts +93 -0
  351. package/dist-browser/numbl-core/jit/lowering/types.d.ts +503 -0
  352. package/dist-browser/numbl-core/jit/lowering/walk.d.ts +17 -0
  353. package/dist-browser/numbl-core/jit/numbl/index.d.ts +30 -0
  354. package/dist-browser/numbl-core/jit/parser/astUtils.d.ts +43 -0
  355. package/dist-browser/numbl-core/jit/parser/index.d.ts +12 -0
  356. package/dist-browser/numbl-core/jit/parser/sourceLoc.d.ts +12 -0
  357. package/dist-browser/numbl-core/jit/runtime/context.d.ts +23 -0
  358. package/dist-browser/numbl-core/jit/runtime/inferType.d.ts +10 -0
  359. package/dist-browser/numbl-core/jit/runtime/value.d.ts +101 -0
  360. package/dist-browser/numbl-core/jit/workspace/driverPrologue.d.ts +59 -0
  361. package/dist-browser/numbl-core/jit/workspace/mtoc2UserFunctionLoader.d.ts +62 -0
  362. package/dist-browser/numbl-core/jit/workspace/workspace.d.ts +243 -0
  363. package/dist-browser/numbl-core/jitDeclineDiagnostics.d.ts +32 -0
  364. package/dist-browser/numbl-core/jitTypes.d.ts +94 -0
  365. package/dist-browser/numbl-core/jsUserFunctions.d.ts +61 -0
  366. package/dist-browser/numbl-core/lexer/helpers.d.ts +15 -0
  367. package/dist-browser/numbl-core/lexer/index.d.ts +4 -0
  368. package/dist-browser/numbl-core/lexer/keywords.d.ts +3 -0
  369. package/dist-browser/numbl-core/lexer/token-config.d.ts +94 -0
  370. package/dist-browser/numbl-core/lexer/tokenizer.d.ts +9 -0
  371. package/dist-browser/numbl-core/lexer/types.d.ts +80 -0
  372. package/dist-browser/numbl-core/lowering/classInfo.d.ts +53 -0
  373. package/dist-browser/numbl-core/lowering/constants.d.ts +4 -0
  374. package/dist-browser/numbl-core/lowering/errors.d.ts +17 -0
  375. package/dist-browser/numbl-core/lowering/index.d.ts +3 -0
  376. package/dist-browser/numbl-core/lowering/itemTypes.d.ts +87 -0
  377. package/dist-browser/numbl-core/lowering/loweringContext.d.ts +241 -0
  378. package/dist-browser/numbl-core/native/bridge-resolve.d.ts +14 -0
  379. package/dist-browser/numbl-core/native/geometry-bridge.d.ts +39 -0
  380. package/dist-browser/numbl-core/native/lapack-bridge.d.ts +482 -0
  381. package/dist-browser/numbl-core/native/qhull-browser.d.ts +15 -0
  382. package/dist-browser/numbl-core/native/qhull-node.d.ts +13 -0
  383. package/dist-browser/numbl-core/native/ts-lapack-bridge.d.ts +9 -0
  384. package/dist-browser/numbl-core/native/ts-lapack-eig-complex.d.ts +32 -0
  385. package/dist-browser/numbl-core/ops/bessel.d.ts +18 -0
  386. package/dist-browser/numbl-core/ops/comparison.d.ts +11 -0
  387. package/dist-browser/numbl-core/ops/complexBinaryElemwise.d.ts +10 -0
  388. package/dist-browser/numbl-core/ops/complexUnaryElemwise.d.ts +8 -0
  389. package/dist-browser/numbl-core/ops/dispatch.d.ts +26 -0
  390. package/dist-browser/numbl-core/ops/index.d.ts +8 -0
  391. package/dist-browser/numbl-core/ops/opCodes.d.ts +70 -0
  392. package/dist-browser/numbl-core/ops/realBinaryElemwise.d.ts +8 -0
  393. package/dist-browser/numbl-core/ops/realUnaryElemwise.d.ts +5 -0
  394. package/dist-browser/numbl-core/ops/reduce.d.ts +6 -0
  395. package/dist-browser/numbl-core/parser/ArgumentsParser.d.ts +33 -0
  396. package/dist-browser/numbl-core/parser/ClassParser.d.ts +21 -0
  397. package/dist-browser/numbl-core/parser/CommandParser.d.ts +31 -0
  398. package/dist-browser/numbl-core/parser/ControlFlowParser.d.ts +16 -0
  399. package/dist-browser/numbl-core/parser/ExpressionParser.d.ts +32 -0
  400. package/dist-browser/numbl-core/parser/FunctionParser.d.ts +10 -0
  401. package/dist-browser/numbl-core/parser/Parser.d.ts +17 -0
  402. package/dist-browser/numbl-core/parser/ParserBase.d.ts +35 -0
  403. package/dist-browser/numbl-core/parser/StatementParser.d.ts +13 -0
  404. package/dist-browser/numbl-core/parser/errors.d.ts +15 -0
  405. package/dist-browser/numbl-core/parser/index.d.ts +7 -0
  406. package/dist-browser/numbl-core/parser/types.d.ts +342 -0
  407. package/dist-browser/numbl-core/runtime/alloc.d.ts +12 -0
  408. package/dist-browser/numbl-core/runtime/axisCommand.d.ts +34 -0
  409. package/dist-browser/numbl-core/runtime/compare.d.ts +5 -0
  410. package/dist-browser/numbl-core/runtime/constructors.d.ts +39 -0
  411. package/dist-browser/numbl-core/runtime/convert.d.ts +10 -0
  412. package/dist-browser/numbl-core/runtime/cow.d.ts +33 -0
  413. package/dist-browser/numbl-core/runtime/display.d.ts +6 -0
  414. package/dist-browser/numbl-core/runtime/error.d.ts +78 -0
  415. package/dist-browser/numbl-core/runtime/index.d.ts +13 -0
  416. package/dist-browser/numbl-core/runtime/indexing.d.ts +28 -0
  417. package/dist-browser/numbl-core/runtime/plotBuiltinDispatch.d.ts +92 -0
  418. package/dist-browser/numbl-core/runtime/plotUtils.d.ts +336 -0
  419. package/dist-browser/numbl-core/runtime/refcount.d.ts +85 -0
  420. package/dist-browser/numbl-core/runtime/runtime.d.ts +354 -0
  421. package/dist-browser/numbl-core/runtime/runtimeDispatch.d.ts +27 -0
  422. package/dist-browser/numbl-core/runtime/runtimeHelpers.d.ts +31 -0
  423. package/dist-browser/numbl-core/runtime/runtimeIndexing.d.ts +28 -0
  424. package/dist-browser/numbl-core/runtime/runtimeMemberAccess.d.ts +26 -0
  425. package/dist-browser/numbl-core/runtime/runtimeOperators.d.ts +24 -0
  426. package/dist-browser/numbl-core/runtime/runtimePlot.d.ts +129 -0
  427. package/dist-browser/numbl-core/runtime/sentinels.d.ts +4 -0
  428. package/dist-browser/numbl-core/runtime/specialBuiltinNames.d.ts +2 -0
  429. package/dist-browser/numbl-core/runtime/specialBuiltins.d.ts +13 -0
  430. package/dist-browser/numbl-core/runtime/struct-access.d.ts +11 -0
  431. package/dist-browser/numbl-core/runtime/syncChannel.d.ts +1 -0
  432. package/dist-browser/numbl-core/runtime/tensor-construction.d.ts +10 -0
  433. package/dist-browser/numbl-core/runtime/types.d.ts +197 -0
  434. package/dist-browser/numbl-core/runtime/uihtmlSession.d.ts +40 -0
  435. package/dist-browser/numbl-core/runtime/utils.d.ts +19 -0
  436. package/dist-browser/numbl-core/stdlib-bundle.d.ts +3 -0
  437. package/dist-browser/numbl-core/systemAdapter.d.ts +23 -0
  438. package/dist-browser/numbl-core/version.d.ts +2 -0
  439. package/dist-browser/numbl-core/workspace/index.d.ts +4 -0
  440. package/dist-browser/numbl-core/workspace/types.d.ts +24 -0
  441. package/dist-browser/ts-lapack/src/BLAS/daxpy.d.ts +1 -0
  442. package/dist-browser/ts-lapack/src/BLAS/dcopy.d.ts +1 -0
  443. package/dist-browser/ts-lapack/src/BLAS/ddot.d.ts +1 -0
  444. package/dist-browser/ts-lapack/src/BLAS/dgemm.d.ts +1 -0
  445. package/dist-browser/ts-lapack/src/BLAS/dgemm_optimized.d.ts +1 -0
  446. package/dist-browser/ts-lapack/src/BLAS/dgemv.d.ts +1 -0
  447. package/dist-browser/ts-lapack/src/BLAS/dger.d.ts +1 -0
  448. package/dist-browser/ts-lapack/src/BLAS/dnrm2.d.ts +1 -0
  449. package/dist-browser/ts-lapack/src/BLAS/drot.d.ts +1 -0
  450. package/dist-browser/ts-lapack/src/BLAS/dscal.d.ts +1 -0
  451. package/dist-browser/ts-lapack/src/BLAS/dswap.d.ts +1 -0
  452. package/dist-browser/ts-lapack/src/BLAS/dtrmm.d.ts +1 -0
  453. package/dist-browser/ts-lapack/src/BLAS/dtrmv.d.ts +1 -0
  454. package/dist-browser/ts-lapack/src/BLAS/dtrsm.d.ts +1 -0
  455. package/dist-browser/ts-lapack/src/BLAS/idamax.d.ts +1 -0
  456. package/dist-browser/ts-lapack/src/SRC/dbdsqr.d.ts +10 -0
  457. package/dist-browser/ts-lapack/src/SRC/dgebak.d.ts +1 -0
  458. package/dist-browser/ts-lapack/src/SRC/dgebal.d.ts +5 -0
  459. package/dist-browser/ts-lapack/src/SRC/dgebd2.d.ts +1 -0
  460. package/dist-browser/ts-lapack/src/SRC/dgebrd.d.ts +1 -0
  461. package/dist-browser/ts-lapack/src/SRC/dgeev.d.ts +3 -0
  462. package/dist-browser/ts-lapack/src/SRC/dgehd2.d.ts +1 -0
  463. package/dist-browser/ts-lapack/src/SRC/dgehrd.d.ts +1 -0
  464. package/dist-browser/ts-lapack/src/SRC/dgelq2.d.ts +1 -0
  465. package/dist-browser/ts-lapack/src/SRC/dgelqf.d.ts +1 -0
  466. package/dist-browser/ts-lapack/src/SRC/dgeqr2.d.ts +1 -0
  467. package/dist-browser/ts-lapack/src/SRC/dgeqrf.d.ts +1 -0
  468. package/dist-browser/ts-lapack/src/SRC/dgeqrf_optimized.d.ts +1 -0
  469. package/dist-browser/ts-lapack/src/SRC/dgesvd.d.ts +28 -0
  470. package/dist-browser/ts-lapack/src/SRC/dgetrf.d.ts +1 -0
  471. package/dist-browser/ts-lapack/src/SRC/dgetrf2.d.ts +1 -0
  472. package/dist-browser/ts-lapack/src/SRC/dgetri.d.ts +1 -0
  473. package/dist-browser/ts-lapack/src/SRC/dhseqr.d.ts +32 -0
  474. package/dist-browser/ts-lapack/src/SRC/dlabrd.d.ts +1 -0
  475. package/dist-browser/ts-lapack/src/SRC/dlacpy.d.ts +18 -0
  476. package/dist-browser/ts-lapack/src/SRC/dladiv.d.ts +9 -0
  477. package/dist-browser/ts-lapack/src/SRC/dlaexc.d.ts +21 -0
  478. package/dist-browser/ts-lapack/src/SRC/dlahqr.d.ts +24 -0
  479. package/dist-browser/ts-lapack/src/SRC/dlahr2.d.ts +1 -0
  480. package/dist-browser/ts-lapack/src/SRC/dlaln2.d.ts +5 -0
  481. package/dist-browser/ts-lapack/src/SRC/dlamch.d.ts +1 -0
  482. package/dist-browser/ts-lapack/src/SRC/dlange.d.ts +1 -0
  483. package/dist-browser/ts-lapack/src/SRC/dlanv2.d.ts +12 -0
  484. package/dist-browser/ts-lapack/src/SRC/dlapy2.d.ts +1 -0
  485. package/dist-browser/ts-lapack/src/SRC/dlaqr1.d.ts +1 -0
  486. package/dist-browser/ts-lapack/src/SRC/dlaqr30.d.ts +81 -0
  487. package/dist-browser/ts-lapack/src/SRC/dlaqr5.d.ts +38 -0
  488. package/dist-browser/ts-lapack/src/SRC/dlarf.d.ts +18 -0
  489. package/dist-browser/ts-lapack/src/SRC/dlarf1f.d.ts +1 -0
  490. package/dist-browser/ts-lapack/src/SRC/dlarfb.d.ts +25 -0
  491. package/dist-browser/ts-lapack/src/SRC/dlarfg.d.ts +4 -0
  492. package/dist-browser/ts-lapack/src/SRC/dlarft.d.ts +20 -0
  493. package/dist-browser/ts-lapack/src/SRC/dlarfx.d.ts +17 -0
  494. package/dist-browser/ts-lapack/src/SRC/dlartg.d.ts +5 -0
  495. package/dist-browser/ts-lapack/src/SRC/dlas2.d.ts +4 -0
  496. package/dist-browser/ts-lapack/src/SRC/dlascl.d.ts +1 -0
  497. package/dist-browser/ts-lapack/src/SRC/dlaset.d.ts +19 -0
  498. package/dist-browser/ts-lapack/src/SRC/dlasr.d.ts +1 -0
  499. package/dist-browser/ts-lapack/src/SRC/dlassq.d.ts +18 -0
  500. package/dist-browser/ts-lapack/src/SRC/dlasv2.d.ts +8 -0
  501. package/dist-browser/ts-lapack/src/SRC/dlaswp.d.ts +1 -0
  502. package/dist-browser/ts-lapack/src/SRC/dlasy2.d.ts +5 -0
  503. package/dist-browser/ts-lapack/src/SRC/dorg2r.d.ts +1 -0
  504. package/dist-browser/ts-lapack/src/SRC/dorgbr.d.ts +1 -0
  505. package/dist-browser/ts-lapack/src/SRC/dorghr.d.ts +1 -0
  506. package/dist-browser/ts-lapack/src/SRC/dorgl2.d.ts +1 -0
  507. package/dist-browser/ts-lapack/src/SRC/dorglq.d.ts +1 -0
  508. package/dist-browser/ts-lapack/src/SRC/dorgqr.d.ts +1 -0
  509. package/dist-browser/ts-lapack/src/SRC/dorgqr_optimized.d.ts +1 -0
  510. package/dist-browser/ts-lapack/src/SRC/dorm2r.d.ts +1 -0
  511. package/dist-browser/ts-lapack/src/SRC/dormhr.d.ts +1 -0
  512. package/dist-browser/ts-lapack/src/SRC/dormqr.d.ts +1 -0
  513. package/dist-browser/ts-lapack/src/SRC/dpotf2.d.ts +1 -0
  514. package/dist-browser/ts-lapack/src/SRC/dtrevc3.d.ts +27 -0
  515. package/dist-browser/ts-lapack/src/SRC/dtrexc.d.ts +24 -0
  516. package/dist-browser/ts-lapack/src/SRC/dtrti2.d.ts +1 -0
  517. package/dist-browser/ts-lapack/src/SRC/dtrtri.d.ts +1 -0
  518. package/dist-browser/ts-lapack/src/utils/constants.d.ts +28 -0
  519. package/dist-browser/ts-lapack/src/utils/iladlc.d.ts +1 -0
  520. package/dist-browser/ts-lapack/src/utils/iladlr.d.ts +1 -0
  521. package/dist-browser/ts-lapack/src/utils/ilaenv.d.ts +1 -0
  522. package/dist-browser/ts-lapack/src/utils/xerbla.d.ts +1 -0
  523. package/dist-browser/vfs/BrowserFileIOAdapter.d.ts +60 -0
  524. package/dist-browser/vfs/BrowserSystemAdapter.d.ts +27 -0
  525. package/dist-browser/vfs/VirtualFileSystem.d.ts +66 -0
  526. package/dist-browser/vfs/syncVfsChanges.d.ts +23 -0
  527. package/dist-browser/vfs/unzipToFiles.d.ts +7 -0
  528. package/dist-cli/cli.js +1527 -205
  529. package/dist-lib/lib.d.ts +4 -0
  530. package/dist-lib/lib.js +2217 -199
  531. package/dist-lib/numbl-core/executors/jit/hostHelpers.d.ts +4 -0
  532. package/dist-lib/numbl-core/fileIOAdapter.d.ts +13 -0
  533. package/dist-lib/numbl-core/helpers/scanFormat.d.ts +11 -0
  534. package/dist-lib/numbl-core/jit/builtins/defs/logical/fieldnames.d.ts +2 -2
  535. package/dist-lib/numbl-core/jit/builtins/defs/math/rand.d.ts +2 -0
  536. package/dist-lib/numbl-core/jitDeclineDiagnostics.d.ts +32 -0
  537. package/dist-lib/numbl-core/jsUserFunctions.d.ts +13 -0
  538. package/dist-lib/numbl-core/runtime/constructors.d.ts +3 -1
  539. package/dist-lib/numbl-core/runtime/indexing.d.ts +3 -0
  540. package/dist-lib/numbl-core/runtime/runtime.d.ts +1 -0
  541. package/dist-lib/numbl-core/runtime/types.d.ts +15 -1
  542. package/dist-lib/numbl-core/runtime/utils.d.ts +3 -0
  543. package/dist-lib/numbl-core/version.d.ts +1 -1
  544. package/dist-lib/vfs/BrowserFileIOAdapter.d.ts +60 -0
  545. package/dist-lib/vfs/BrowserSystemAdapter.d.ts +27 -0
  546. package/dist-lib/vfs/VirtualFileSystem.d.ts +66 -0
  547. package/dist-site-viewer/assets/index-CT9HA1Pn.js +4831 -0
  548. package/dist-site-viewer/assets/numbl-worker-CYPflGmm.js +5246 -0
  549. package/dist-site-viewer/index.html +1 -1
  550. package/package.json +9 -3
  551. package/dist-site-viewer/assets/index-RucHpf4b.js +0 -4826
  552. package/dist-site-viewer/assets/numbl-worker-IO39kohI.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);
21681
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(" "));
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",
@@ -39194,6 +39735,8 @@ var SPECIAL_BUILTIN_NAMES = [
39194
39735
  "delete",
39195
39736
  "rmdir",
39196
39737
  "movefile",
39738
+ "copyfile",
39739
+ "fileattrib",
39197
39740
  "unzip",
39198
39741
  "dir",
39199
39742
  "warning",
@@ -39203,6 +39746,7 @@ var SPECIAL_BUILTIN_NAMES = [
39203
39746
  "userpath",
39204
39747
  "getenv",
39205
39748
  "setenv",
39749
+ "maxNumCompThreads",
39206
39750
  "pwd",
39207
39751
  "cd",
39208
39752
  "ode45",
@@ -39362,7 +39906,10 @@ function registerSpecialBuiltins(rt) {
39362
39906
  fmtIdx = 1;
39363
39907
  }
39364
39908
  const fmt = toString(margs[fmtIdx]);
39365
- 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);
39366
39913
  if (fid === 1 || fid === 2) {
39367
39914
  rt.output(output);
39368
39915
  } else {
@@ -39516,6 +40063,53 @@ function registerSpecialBuiltins(rt) {
39516
40063
  const result = io.fgets(toNumber(margs[0]));
39517
40064
  return typeof result === "number" ? RTV.num(result) : RTV.char(result);
39518
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
+ });
39519
40113
  registerSpecial("fileread", (_nargout, args) => {
39520
40114
  const io = requireFileIO();
39521
40115
  const margs = args.map((a) => ensureRuntimeValue(a));
@@ -40144,6 +40738,65 @@ function registerSpecialBuiltins(rt) {
40144
40738
  RTV.char("")
40145
40739
  ];
40146
40740
  });
40741
+ registerSpecial("copyfile", (nargout, args) => {
40742
+ const io = requireFileIO();
40743
+ if (!io.copyfile)
40744
+ throw new RuntimeError("copyfile is not available in this environment");
40745
+ const margs = args.map((a) => ensureRuntimeValue(a));
40746
+ if (margs.length < 1)
40747
+ throw new RuntimeError("copyfile requires at least 1 argument");
40748
+ const source = toString(margs[0]);
40749
+ const destination = margs.length >= 2 ? toString(margs[1]) : rt.system?.cwd() ?? ".";
40750
+ let force = false;
40751
+ if (margs.length >= 3) {
40752
+ const third = toString(margs[2]);
40753
+ if (third.toLowerCase() === "f") force = true;
40754
+ }
40755
+ const ok = io.copyfile(source, destination, force);
40756
+ if (nargout === 0) {
40757
+ if (!ok)
40758
+ throw new RuntimeError(
40759
+ `copyfile: cannot copy '${source}' to '${destination}'`
40760
+ );
40761
+ return void 0;
40762
+ }
40763
+ return nargout <= 1 ? RTV.num(ok ? 1 : 0) : [
40764
+ RTV.num(ok ? 1 : 0),
40765
+ RTV.char(ok ? "" : `Cannot copy '${source}' to '${destination}'`),
40766
+ RTV.char("")
40767
+ ];
40768
+ });
40769
+ registerSpecial("fileattrib", (nargout, args) => {
40770
+ const io = requireFileIO();
40771
+ if (!io.fileattrib)
40772
+ throw new RuntimeError("fileattrib is not available in this environment");
40773
+ const margs = args.map((a) => ensureRuntimeValue(a));
40774
+ if (margs.length < 1)
40775
+ throw new RuntimeError("fileattrib requires at least 1 argument");
40776
+ const p2 = toString(margs[0]);
40777
+ const info = io.fileattrib(p2);
40778
+ if (nargout === 0) {
40779
+ if (!info)
40780
+ throw new RuntimeError(
40781
+ `fileattrib: cannot find '${p2}': No such file or directory`
40782
+ );
40783
+ return void 0;
40784
+ }
40785
+ const values = info ? RTV.struct(
40786
+ /* @__PURE__ */ new Map([
40787
+ ["Name", RTV.char(info.Name)],
40788
+ ["archive", RTV.num(0)],
40789
+ ["system", RTV.num(0)],
40790
+ ["hidden", RTV.num(0)],
40791
+ ["directory", RTV.num(info.directory ? 1 : 0)],
40792
+ ["UserRead", RTV.num(info.UserRead ? 1 : 0)],
40793
+ ["UserWrite", RTV.num(info.UserWrite ? 1 : 0)],
40794
+ ["UserExecute", RTV.num(info.UserExecute ? 1 : 0)]
40795
+ ])
40796
+ ) : RTV.char(`No such file or directory: ${p2}`);
40797
+ if (nargout <= 1) return RTV.num(info ? 1 : 0);
40798
+ return [RTV.num(info ? 1 : 0), values, RTV.char("")];
40799
+ });
40147
40800
  registerSpecial("unzip", (nargout, args) => {
40148
40801
  const io = requireFileIO();
40149
40802
  if (!io.unzip)
@@ -40469,6 +41122,7 @@ function registerSpecialBuiltins(rt) {
40469
41122
  }
40470
41123
  return RTV.char(sys?.getEnv(toString(args[0])) ?? "");
40471
41124
  });
41125
+ registerSpecial("maxNumCompThreads", () => RTV.num(1));
40472
41126
  registerSpecialVoid("setenv", (args) => {
40473
41127
  const sys = rt.system;
40474
41128
  if (args.length === 2) {
@@ -43905,6 +44559,7 @@ var Runtime = class _Runtime {
43905
44559
  if (isRuntimeChar(rv))
43906
44560
  return rv.shape ?? (rv.value.length === 0 ? [0, 0] : [1, rv.value.length]);
43907
44561
  if (isRuntimeString(rv)) return [1, 1];
44562
+ if (isRuntimeStringArray(rv)) return [...rv.shape];
43908
44563
  if (isRuntimeClassInstance(rv)) return [1, 1];
43909
44564
  return [1, 1];
43910
44565
  }
@@ -45924,6 +46579,13 @@ function valuesEqualSimple(a, b) {
45924
46579
  }
45925
46580
  return true;
45926
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
+ }
45927
46589
  return false;
45928
46590
  }
45929
46591
  function textValue(v) {
@@ -46196,6 +46858,7 @@ function getShape(v) {
46196
46858
  if (isRuntimeCell(v)) return v.shape;
46197
46859
  if (isRuntimeStructArray(v)) return [1, v.elements.length];
46198
46860
  if (isRuntimeClassInstanceArray(v)) return [...v.shape];
46861
+ if (isRuntimeStringArray(v)) return [...v.shape];
46199
46862
  return [1, 1];
46200
46863
  }
46201
46864
  defineBuiltin({
@@ -46251,7 +46914,11 @@ defineBuiltin({
46251
46914
  });
46252
46915
  defineBuiltin({
46253
46916
  name: "isstring",
46254
- cases: [anyToLogicalCase((args) => isRuntimeString(args[0]))]
46917
+ cases: [
46918
+ anyToLogicalCase(
46919
+ (args) => isRuntimeString(args[0]) || isRuntimeStringArray(args[0])
46920
+ )
46921
+ ]
46255
46922
  });
46256
46923
  var MATLAB_KEYWORDS = /* @__PURE__ */ new Set([
46257
46924
  "break",
@@ -46434,6 +47101,7 @@ defineBuiltin({
46434
47101
  if (isRuntimeString(v)) return false;
46435
47102
  if (isRuntimeStructArray(v)) return v.elements.length === 0;
46436
47103
  if (isRuntimeClassInstanceArray(v)) return v.elements.length === 0;
47104
+ if (isRuntimeStringArray(v)) return v.data.length === 0;
46437
47105
  return false;
46438
47106
  })
46439
47107
  ]
@@ -46488,6 +47156,7 @@ defineBuiltin({
46488
47156
  if (isRuntimeString(v)) return 1;
46489
47157
  if (isRuntimeStructArray(v)) return v.elements.length;
46490
47158
  if (isRuntimeClassInstanceArray(v)) return v.elements.length;
47159
+ if (isRuntimeStringArray(v)) return v.data.length;
46491
47160
  return 1;
46492
47161
  }
46493
47162
  }
@@ -46518,6 +47187,8 @@ defineBuiltin({
46518
47187
  if (isRuntimeStructArray(v)) return v.elements.length;
46519
47188
  if (isRuntimeClassInstanceArray(v))
46520
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);
46521
47192
  return 1;
46522
47193
  }
46523
47194
  }
@@ -46645,6 +47316,7 @@ defineBuiltin({
46645
47316
  return mkChar(v._isLogical ? "logical" : "double");
46646
47317
  if (isRuntimeSparseMatrix(v)) return mkChar("double");
46647
47318
  if (isRuntimeString(v)) return mkChar("string");
47319
+ if (isRuntimeStringArray(v)) return mkChar("string");
46648
47320
  if (isRuntimeChar(v)) return mkChar("char");
46649
47321
  if (isRuntimeStruct(v) || isRuntimeStructArray(v))
46650
47322
  return mkChar("struct");
@@ -46695,7 +47367,7 @@ function fieldnamesApply(args) {
46695
47367
  if (isRuntimeStructArray(v)) {
46696
47368
  const names2 = v.fieldNames;
46697
47369
  return RTV.cell(
46698
- names2.map((n) => RTV.string(n)),
47370
+ names2.map((n) => RTV.char(n)),
46699
47371
  [names2.length, 1]
46700
47372
  );
46701
47373
  }
@@ -46703,7 +47375,7 @@ function fieldnamesApply(args) {
46703
47375
  throw new RuntimeError("fieldnames: argument must be a struct");
46704
47376
  const names = [...v.fields.keys()];
46705
47377
  return RTV.cell(
46706
- names.map((n) => RTV.string(n)),
47378
+ names.map((n) => RTV.char(n)),
46707
47379
  [names.length, 1]
46708
47380
  );
46709
47381
  }
@@ -47531,6 +48203,9 @@ function applyTextFn(v, fn) {
47531
48203
  return RTV.char(fn(v.value));
47532
48204
  }
47533
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
+ }
47534
48209
  return v;
47535
48210
  }
47536
48211
  function textPreserveResolve(fn) {
@@ -47543,6 +48218,16 @@ function textPreserveResolve(fn) {
47543
48218
  apply: (args) => applyTextFn(args[0], fn)
47544
48219
  };
47545
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
+ }
47546
48231
  const out = preserveTextType(t);
47547
48232
  if (!out) return null;
47548
48233
  return {
@@ -47632,17 +48317,14 @@ registerIBuiltin({
47632
48317
  name: "erase",
47633
48318
  resolve: (argTypes) => {
47634
48319
  if (argTypes.length !== 2) return null;
47635
- const out = preserveTextType(argTypes[0]);
48320
+ const out = argTypes[0].kind === "unknown" ? { kind: "unknown" } : preserveTextType(argTypes[0]);
47636
48321
  if (!out) return null;
47637
48322
  if (!isTextType(argTypes[1])) return null;
47638
48323
  return {
47639
48324
  outputTypes: [out],
47640
48325
  apply: (args) => {
47641
- const v = args[0];
47642
- const s = toString(v);
47643
48326
  const pat = toString(args[1]);
47644
- const result = s.split(pat).join("");
47645
- return isRuntimeChar(v) ? RTV.char(result) : RTV.string(result);
48327
+ return applyTextFn(args[0], (s) => s.split(pat).join(""));
47646
48328
  }
47647
48329
  };
47648
48330
  }
@@ -47650,18 +48332,15 @@ registerIBuiltin({
47650
48332
  function strreplaceResolve() {
47651
48333
  return (argTypes) => {
47652
48334
  if (argTypes.length !== 3) return null;
47653
- const out = preserveTextType(argTypes[0]);
48335
+ const out = argTypes[0].kind === "unknown" || argTypes[0].kind === "cell" ? { kind: argTypes[0].kind } : preserveTextType(argTypes[0]);
47654
48336
  if (!out) return null;
47655
48337
  if (!isTextType(argTypes[1]) || !isTextType(argTypes[2])) return null;
47656
48338
  return {
47657
48339
  outputTypes: [out],
47658
48340
  apply: (args) => {
47659
- const v = args[0];
47660
- const s = toString(v);
47661
48341
  const old = toString(args[1]);
47662
48342
  const rep = toString(args[2]);
47663
- const result = s.split(old).join(rep);
47664
- return isRuntimeChar(v) ? RTV.char(result) : RTV.string(result);
48343
+ return applyTextFn(args[0], (s) => s.split(old).join(rep));
47665
48344
  }
47666
48345
  };
47667
48346
  };
@@ -47829,9 +48508,16 @@ registerIBuiltin({
47829
48508
  function isText(v) {
47830
48509
  return isRuntimeChar(v) || isRuntimeString(v);
47831
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
+ }
47832
48518
  function strcmpApply(args, cmp) {
47833
- const a = args[0];
47834
- const b = args[1];
48519
+ const a = stringArrayToCell(args[0]);
48520
+ const b = stringArrayToCell(args[1]);
47835
48521
  const aIsCell = isRuntimeCell(a);
47836
48522
  const bIsCell = isRuntimeCell(b);
47837
48523
  if (!aIsCell && !bIsCell) {
@@ -48077,24 +48763,43 @@ registerIBuiltin({
48077
48763
  };
48078
48764
  }
48079
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
+ }
48080
48793
  registerIBuiltin({
48081
48794
  name: "contains",
48082
48795
  resolve: (argTypes) => {
48083
48796
  if (argTypes.length < 2) return null;
48084
- if (!isTextType(argTypes[0])) return null;
48085
- if (argTypes[1].kind === "unknown") return null;
48797
+ if (!subjectTypeOk(argTypes[0])) return null;
48086
48798
  return {
48087
48799
  outputTypes: [{ kind: "boolean" }],
48088
48800
  apply: (args) => {
48089
- const s = toString(args[0]);
48090
- const pat = args[1];
48091
- if (isRuntimeCell(pat)) {
48092
- for (let i = 0; i < pat.data.length; i++) {
48093
- if (s.includes(toString(pat.data[i]))) return RTV.logical(true);
48094
- }
48095
- return RTV.logical(false);
48096
- }
48097
- 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)));
48098
48803
  }
48099
48804
  };
48100
48805
  }
@@ -48104,7 +48809,7 @@ function resolveStartsEndsWith(name, testFn) {
48104
48809
  name,
48105
48810
  resolve: (argTypes) => {
48106
48811
  if (argTypes.length < 2) return null;
48107
- if (!isTextType(argTypes[0])) return null;
48812
+ if (!subjectTypeOk(argTypes[0])) return null;
48108
48813
  return {
48109
48814
  outputTypes: [{ kind: "boolean" }],
48110
48815
  apply: (args) => {
@@ -48114,20 +48819,12 @@ function resolveStartsEndsWith(name, testFn) {
48114
48819
  ic = !!toNumber(args[i + 1]);
48115
48820
  }
48116
48821
  }
48117
- let s = toString(args[0]);
48118
- if (ic) s = s.toLowerCase();
48119
- const pat = args[1];
48120
- if (isRuntimeCell(pat)) {
48121
- for (let i = 0; i < pat.data.length; i++) {
48122
- let p3 = toString(pat.data[i]);
48123
- if (ic) p3 = p3.toLowerCase();
48124
- if (testFn(s, p3)) return RTV.logical(true);
48125
- }
48126
- return RTV.logical(false);
48127
- }
48128
- let p2 = toString(pat);
48129
- if (ic) p2 = p2.toLowerCase();
48130
- 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
+ });
48131
48828
  }
48132
48829
  };
48133
48830
  }
@@ -48139,13 +48836,19 @@ registerIBuiltin({
48139
48836
  name: "strlength",
48140
48837
  resolve: (argTypes) => {
48141
48838
  if (argTypes.length !== 1) return null;
48142
- if (!isTextType(argTypes[0])) return null;
48839
+ if (!isTextType(argTypes[0]) && argTypes[0].kind !== "unknown") return null;
48143
48840
  return {
48144
48841
  outputTypes: [{ kind: "number", sign: "nonneg" }],
48145
48842
  apply: (args) => {
48146
48843
  const v = args[0];
48147
48844
  if (isRuntimeString(v)) return RTV.num(v.length);
48148
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
+ }
48149
48852
  throw new RuntimeError("strlength: argument must be a string or char");
48150
48853
  }
48151
48854
  };
@@ -48201,6 +48904,20 @@ registerIBuiltin({
48201
48904
  }
48202
48905
  };
48203
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
+ }
48204
48921
  return null;
48205
48922
  }
48206
48923
  });
@@ -48386,29 +49103,7 @@ registerIBuiltin({
48386
49103
  };
48387
49104
  }
48388
49105
  });
48389
- function numStr2(n) {
48390
- if (n === Infinity) return "Inf";
48391
- if (n === -Infinity) return "-Inf";
48392
- if (isNaN(n)) return "NaN";
48393
- if (n === 0) return "0";
48394
- if (Number.isInteger(n)) return String(n);
48395
- const prec = 5;
48396
- const exp2 = Math.floor(Math.log10(Math.abs(n)));
48397
- let s;
48398
- if (exp2 < -4 || exp2 >= prec) {
48399
- s = n.toExponential(prec - 1);
48400
- const ePos = s.indexOf("e");
48401
- let mantissa = s.slice(0, ePos);
48402
- const expPart0 = s.slice(ePos);
48403
- if (mantissa.includes(".")) mantissa = mantissa.replace(/\.?0+$/, "");
48404
- const expPart = expPart0.replace(/([eE][+-])(\d)$/, "$10$2");
48405
- s = mantissa + expPart;
48406
- } else {
48407
- s = n.toPrecision(prec);
48408
- if (s.includes(".")) s = s.replace(/\.?0+$/, "");
48409
- }
48410
- return s;
48411
- }
49106
+ var numStr2 = matlabNumToString;
48412
49107
  registerIBuiltin({
48413
49108
  name: "num2str",
48414
49109
  resolve: (argTypes) => {
@@ -48619,7 +49314,7 @@ registerIBuiltin({
48619
49314
  resolve: (argTypes) => {
48620
49315
  if (argTypes.length !== 1) return null;
48621
49316
  const a = argTypes[0];
48622
- 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")
48623
49318
  return null;
48624
49319
  return {
48625
49320
  outputTypes: [{ kind: "char" }],
@@ -48641,6 +49336,9 @@ registerIBuiltin({
48641
49336
  for (const el of v.data) rows.push(...valueToCharRows(el));
48642
49337
  return charRowsToMatrix(rows);
48643
49338
  }
49339
+ if (isRuntimeStringArray(v)) {
49340
+ return charRowsToMatrix(v.data.slice());
49341
+ }
48644
49342
  throw new RuntimeError("char: unsupported arguments");
48645
49343
  }
48646
49344
  };
@@ -48651,14 +49349,260 @@ registerIBuiltin({
48651
49349
  resolve: (argTypes) => {
48652
49350
  if (argTypes.length !== 1) return null;
48653
49351
  const a = argTypes[0];
48654
- if (a.kind === "unknown") return null;
49352
+ const scalarText = a.kind === "char" || a.kind === "string" || a.kind === "number" || a.kind === "boolean";
48655
49353
  return {
48656
- outputTypes: [{ kind: "string" }],
49354
+ outputTypes: [scalarText ? { kind: "string" } : { kind: "unknown" }],
48657
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" }],
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]) : " ";
48658
49507
  const v = args[0];
48659
49508
  if (isRuntimeString(v)) return v;
48660
49509
  if (isRuntimeChar(v)) return RTV.string(v.value);
48661
- 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);
48662
49606
  }
48663
49607
  };
48664
49608
  }
@@ -48695,7 +49639,10 @@ registerIBuiltin({
48695
49639
  outputTypes: [outType],
48696
49640
  apply: (args) => {
48697
49641
  const fmt = toString(args[0]);
48698
- 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);
48699
49646
  return isChar5 ? RTV.char(result) : RTV.string(result);
48700
49647
  }
48701
49648
  };
@@ -48716,80 +49663,11 @@ registerIBuiltin({
48716
49663
  const str = toString(args[0]);
48717
49664
  const fmt = toString(args[1]);
48718
49665
  const maxCount = args.length >= 3 ? toNumber(args[2]) : Infinity;
48719
- const results = [];
48720
- let strPos = 0;
48721
- let fmtPos = 0;
48722
- let matchFailure = false;
48723
- while (fmtPos < fmt.length && strPos < str.length && results.length < maxCount) {
48724
- if (fmt[fmtPos] === "%") {
48725
- fmtPos++;
48726
- if (fmtPos >= fmt.length) break;
48727
- const spec = fmt[fmtPos];
48728
- fmtPos++;
48729
- if (spec !== "c" && spec !== "s") {
48730
- while (strPos < str.length && /\s/.test(str[strPos])) strPos++;
48731
- }
48732
- if (spec === "d" || spec === "i") {
48733
- const m = str.slice(strPos).match(/^[+-]?\d+/);
48734
- if (!m) {
48735
- matchFailure = true;
48736
- break;
48737
- }
48738
- results.push(parseInt(m[0], 10));
48739
- strPos += m[0].length;
48740
- } else if (spec === "f" || spec === "e" || spec === "g") {
48741
- const m = str.slice(strPos).match(/^[+-]?(\d+\.?\d*|\.\d+)([eE][+-]?\d+)?/);
48742
- if (!m) {
48743
- matchFailure = true;
48744
- break;
48745
- }
48746
- results.push(parseFloat(m[0]));
48747
- strPos += m[0].length;
48748
- } else if (spec === "x") {
48749
- const m = str.slice(strPos).match(/^[+-]?[0-9a-fA-F]+/);
48750
- if (!m) {
48751
- matchFailure = true;
48752
- break;
48753
- }
48754
- results.push(parseInt(m[0], 16));
48755
- strPos += m[0].length;
48756
- } else if (spec === "o") {
48757
- const m = str.slice(strPos).match(/^[+-]?[0-7]+/);
48758
- if (!m) {
48759
- matchFailure = true;
48760
- break;
48761
- }
48762
- results.push(parseInt(m[0], 8));
48763
- strPos += m[0].length;
48764
- } else if (spec === "c") {
48765
- results.push(str.charCodeAt(strPos));
48766
- strPos++;
48767
- } else if (spec === "s") {
48768
- const m = str.slice(strPos).match(/^\S+/);
48769
- if (!m) {
48770
- matchFailure = true;
48771
- break;
48772
- }
48773
- for (let ci = 0; ci < m[0].length && results.length < maxCount; ci++) {
48774
- results.push(m[0].charCodeAt(ci));
48775
- }
48776
- strPos += m[0].length;
48777
- }
48778
- } else if (/\s/.test(fmt[fmtPos])) {
48779
- fmtPos++;
48780
- while (strPos < str.length && /\s/.test(str[strPos])) strPos++;
48781
- } else {
48782
- if (str[strPos] !== fmt[fmtPos]) {
48783
- matchFailure = true;
48784
- break;
48785
- }
48786
- strPos++;
48787
- fmtPos++;
48788
- }
48789
- if (fmtPos >= fmt.length && results.length < maxCount && strPos < str.length) {
48790
- fmtPos = 0;
48791
- }
48792
- }
49666
+ const {
49667
+ results,
49668
+ consumed: strPos,
49669
+ matchFailure
49670
+ } = scanFormat(str, fmt, maxCount);
48793
49671
  const vals = results.length === 1 ? RTV.num(results[0]) : RTV.tensor(allocFloat64Array(results), [results.length, 1]);
48794
49672
  if (nout >= 2) {
48795
49673
  const out = [vals, RTV.num(results.length)];
@@ -49068,6 +49946,10 @@ defineBuiltin({
49068
49946
  };
49069
49947
  return nargout > 1 ? [out, idx] : [out];
49070
49948
  }
49949
+ if (a.kind === "string" || a.kind === "unknown") {
49950
+ const out = { kind: "unknown" };
49951
+ return nargout > 1 ? [out, { kind: "unknown" }] : [out];
49952
+ }
49071
49953
  return null;
49072
49954
  },
49073
49955
  apply: (args, nargout) => {
@@ -49086,6 +49968,33 @@ defineBuiltin({
49086
49968
  if (args.length >= 3 && (isRuntimeString(args[2]) || isRuntimeChar(args[2]))) {
49087
49969
  descend = rstr(args[2]).toLowerCase() === "descend";
49088
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
+ }
49089
49998
  if (isRuntimeNumber(v)) {
49090
49999
  if (nargout > 1) return [v, RTV.num(1)];
49091
50000
  return v;
@@ -49401,8 +50310,12 @@ var ismemberCases = [
49401
50310
  apply: (args, nargout) => {
49402
50311
  if (args.length < 2)
49403
50312
  throw new RuntimeError("ismember requires 2 arguments");
49404
- const v = args[0];
49405
- 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]);
49406
50319
  const isStringLike = (x) => isRuntimeString(x) || isRuntimeChar(x);
49407
50320
  const isCellOfStrings = (x) => isRuntimeCell(x) && x.data.every(
49408
50321
  (e) => isRuntimeString(e) || isRuntimeChar(e)
@@ -49705,6 +50618,30 @@ defineBuiltin({
49705
50618
  )) {
49706
50619
  return uniqueCellOfStrings(v, nargout, stable);
49707
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
+ }
49708
50645
  if (!isRuntimeTensor(v))
49709
50646
  throw new RuntimeError("unique: argument must be numeric");
49710
50647
  if (byRows) return uniqueByRows(v, nargout, stable);
@@ -52908,6 +53845,27 @@ function flipAlongDim(v, dimIdx) {
52908
53845
  }
52909
53846
  return RTV.tensor(result, [...shape], resultImag);
52910
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
+ }
52911
53869
  function flipSparse(v, dimIdx) {
52912
53870
  const isComplex = v.pi !== void 0;
52913
53871
  const nnz = v.jc[v.n];
@@ -53084,6 +54042,41 @@ defineBuiltin({
53084
54042
  chars[i2 * nc + j2] = linear[j2 * nr + i2];
53085
54043
  return new RuntimeChar(chars.join(""), [nr, nc]);
53086
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
+ }
53087
54080
  if (!isRuntimeTensor(v) && !isRuntimeNumber(v) && !isRuntimeComplexNumber(v))
53088
54081
  throw new RuntimeError("reshape: first argument must be numeric");
53089
54082
  const data = isRuntimeTensor(v) ? v.data : isRuntimeComplexNumber(v) ? allocFloat64Array([v.re]) : allocFloat64Array([v]);
@@ -53395,6 +54388,7 @@ defineBuiltin({
53395
54388
  if (isRuntimeChar(v))
53396
54389
  return RTV.char(v.value.split("").reverse().join(""));
53397
54390
  if (isRuntimeSparseMatrix(v)) return flipSparse(v, 1);
54391
+ if (isRuntimeCell(v)) return flipCellAlongDim(v, 1);
53398
54392
  if (!isRuntimeTensor(v))
53399
54393
  throw new RuntimeError("fliplr: argument must be numeric or char");
53400
54394
  return flipAlongDim(v, 1);
@@ -53415,6 +54409,7 @@ defineBuiltin({
53415
54409
  if (isRuntimeNumber(v)) return v;
53416
54410
  if (isRuntimeChar(v)) return v;
53417
54411
  if (isRuntimeSparseMatrix(v)) return flipSparse(v, 0);
54412
+ if (isRuntimeCell(v)) return flipCellAlongDim(v, 0);
53418
54413
  if (!isRuntimeTensor(v))
53419
54414
  throw new RuntimeError("flipud: argument must be numeric or char");
53420
54415
  return flipAlongDim(v, 0);
@@ -53433,8 +54428,8 @@ defineBuiltin({
53433
54428
  apply: (args) => {
53434
54429
  const v = args[0];
53435
54430
  if (isRuntimeNumber(v)) return v;
53436
- if (!isRuntimeTensor(v))
53437
- 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");
53438
54433
  let dimIdx = 0;
53439
54434
  if (args.length >= 2) {
53440
54435
  dimIdx = Math.round(toNumber(args[1])) - 1;
@@ -53443,7 +54438,7 @@ defineBuiltin({
53443
54438
  dimIdx = shape.findIndex((d) => d > 1);
53444
54439
  if (dimIdx === -1) dimIdx = 0;
53445
54440
  }
53446
- return flipAlongDim(v, dimIdx);
54441
+ return isRuntimeCell(v) ? flipCellAlongDim(v, dimIdx) : flipAlongDim(v, dimIdx);
53447
54442
  }
53448
54443
  }
53449
54444
  ]
@@ -55113,6 +56108,8 @@ function getValClassName(v) {
55113
56108
  return "double";
55114
56109
  case "dictionary":
55115
56110
  return "dictionary";
56111
+ case "string_array":
56112
+ return "string";
55116
56113
  default:
55117
56114
  return "unknown";
55118
56115
  }
@@ -55142,6 +56139,8 @@ function getShapeOf(v) {
55142
56139
  return [1, 1];
55143
56140
  case "struct_array":
55144
56141
  return [1, obj.elements.length];
56142
+ case "string_array":
56143
+ return [...obj.shape];
55145
56144
  default:
55146
56145
  return [1, 1];
55147
56146
  }
@@ -56809,6 +57808,12 @@ defineBuiltin({
56809
57808
  });
56810
57809
 
56811
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
+ }
56812
57817
  defineBuiltin({
56813
57818
  name: "double",
56814
57819
  cases: [
@@ -56816,7 +57821,7 @@ defineBuiltin({
56816
57821
  match: (argTypes) => {
56817
57822
  if (argTypes.length !== 1) return null;
56818
57823
  const a = argTypes[0];
56819
- 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")
56820
57825
  return [{ kind: "number" }];
56821
57826
  if (a.kind === "tensor")
56822
57827
  return [
@@ -56838,6 +57843,13 @@ defineBuiltin({
56838
57843
  const codes = Array.from(v.value).map((c) => c.charCodeAt(0));
56839
57844
  return RTV.row(codes);
56840
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
+ }
56841
57853
  if (isRuntimeLogical(v)) return RTV.num(v ? 1 : 0);
56842
57854
  if (isRuntimeNumber(v)) return v;
56843
57855
  if (isRuntimeComplexNumber(v)) return v.re;
@@ -57541,14 +58553,19 @@ registerIBuiltin({
57541
58553
  let delims;
57542
58554
  if (isRuntimeCell(args[1])) {
57543
58555
  delims = args[1].data.map((d) => toString(d));
58556
+ } else if (isRuntimeStringArray(args[1])) {
58557
+ delims = args[1].data.slice();
57544
58558
  } else {
57545
58559
  delims = [toString(args[1])];
57546
58560
  }
57547
58561
  const escaped = delims.map((d) => d.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("|");
57548
58562
  parts = s.split(new RegExp("(?:" + escaped + ")+"));
57549
58563
  }
58564
+ if (isRuntimeString(args[0]) || isRuntimeStringArray(args[0])) {
58565
+ return stringArrayValue(parts, [1, parts.length]);
58566
+ }
57550
58567
  return RTV.cell(
57551
- parts.map((p2) => RTV.string(p2)),
58568
+ parts.map((p2) => RTV.char(p2)),
57552
58569
  [1, parts.length]
57553
58570
  );
57554
58571
  }
@@ -57562,11 +58579,18 @@ registerIBuiltin({
57562
58579
  return {
57563
58580
  outputTypes: [{ kind: "string" }],
57564
58581
  apply: (args) => {
57565
- 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 {
57566
58590
  throw new RuntimeError(
57567
- "strjoin: first argument must be a cell array"
58591
+ "strjoin: first argument must be a cell array or string array"
57568
58592
  );
57569
- const elements = args[0].data.map((v) => toString(v));
58593
+ }
57570
58594
  const delim = args.length >= 2 ? toString(args[1]) : " ";
57571
58595
  return RTV.string(elements.join(delim));
57572
58596
  }
@@ -57643,6 +58667,19 @@ function regexpImpl(caseSensitive, name, args, nargout) {
57643
58667
  [1, tokensList.length]
57644
58668
  );
57645
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
+ }
57646
58683
  if (mode === "names") {
57647
58684
  if (starts.length === 0) return RTV.tensor(allocFloat64Array(0), [0, 0]);
57648
58685
  const namedRe = new RegExp(pat, flags);
@@ -62854,7 +63891,7 @@ function getSourceLine(getSource, file, line) {
62854
63891
  }
62855
63892
 
62856
63893
  // src/numbl-core/version.ts
62857
- var NUMBL_VERSION = "0.4.7";
63894
+ var NUMBL_VERSION = "0.4.9";
62858
63895
 
62859
63896
  // src/cli-repl.ts
62860
63897
  import { createInterface } from "readline";
@@ -62870,6 +63907,13 @@ import { join as join4 } from "path";
62870
63907
  import { homedir as homedir2 } from "os";
62871
63908
 
62872
63909
  // src/numbl-core/jsUserFunctions.ts
63910
+ function callHandle(handle, args, nargout = 1) {
63911
+ const rt = getCurrentRuntime();
63912
+ if (!rt) {
63913
+ throw new RuntimeError("callHandle: no active runtime to invoke handle");
63914
+ }
63915
+ return rt.index(handle, args, nargout);
63916
+ }
62873
63917
  function funcNameFromFile(fileName) {
62874
63918
  const base = fileName.split("/").pop();
62875
63919
  return base.replace(/\.numbl\.js$/, "");
@@ -62915,6 +63959,8 @@ function instantiateWasm(wasmData) {
62915
63959
  const moduleImports = WebAssembly.Module.imports(wasmModule);
62916
63960
  const importObject = {};
62917
63961
  const neededModules = new Set(moduleImports.map((i) => i.module));
63962
+ const callbacks = /* @__PURE__ */ new Map();
63963
+ let nextCbId = 1;
62918
63964
  if (neededModules.has("wasi_snapshot_preview1")) {
62919
63965
  importObject.wasi_snapshot_preview1 = {
62920
63966
  fd_write: () => 0,
@@ -62934,10 +63980,36 @@ function instantiateWasm(wasmData) {
62934
63980
  if (neededModules.has("env")) {
62935
63981
  importObject.env = {
62936
63982
  emscripten_notify_memory_growth: () => {
63983
+ },
63984
+ // Scalar callback: WASM calls back into a registered handle with one
63985
+ // f64 and receives an f64. Exceptions thrown here (incl. a missing id)
63986
+ // propagate out through the WASM call into the apply.
63987
+ numbl_cb_d: (id, x) => {
63988
+ const fn = callbacks.get(id);
63989
+ if (!fn) {
63990
+ throw new RuntimeError(
63991
+ `numbl_cb_d: no callback registered for id ${id}`
63992
+ );
63993
+ }
63994
+ return fn(x);
62937
63995
  }
62938
63996
  };
62939
63997
  }
62940
- return new WebAssembly.Instance(wasmModule, importObject);
63998
+ const instance = new WebAssembly.Instance(
63999
+ wasmModule,
64000
+ importObject
64001
+ );
64002
+ instance.callbacks = {
64003
+ add(fn) {
64004
+ const id = nextCbId++;
64005
+ callbacks.set(id, fn);
64006
+ return id;
64007
+ },
64008
+ remove(id) {
64009
+ callbacks.delete(id);
64010
+ }
64011
+ };
64012
+ return instance;
62941
64013
  }
62942
64014
  function resolveBindings(file, directives, getWasmInstance, nativeBridge2) {
62943
64015
  const wasmInstance = directives.wasm ? getWasmInstance(directives.wasm) : void 0;
@@ -63012,6 +64084,8 @@ function loadJsUserFunctions(jsFiles, wasmFiles, nativeBridge2) {
63012
64084
  "wasm",
63013
64085
  "native",
63014
64086
  "importJS",
64087
+ "callHandle",
64088
+ "toNumber",
63015
64089
  libFile.source
63016
64090
  );
63017
64091
  const exports = factory(
@@ -63021,7 +64095,9 @@ function loadJsUserFunctions(jsFiles, wasmFiles, nativeBridge2) {
63021
64095
  dummyRegister,
63022
64096
  wasmInstance,
63023
64097
  nativeLib,
63024
- importJS
64098
+ importJS,
64099
+ callHandle,
64100
+ toNumber
63025
64101
  );
63026
64102
  libCache.set(name, exports);
63027
64103
  return exports;
@@ -63059,6 +64135,8 @@ function loadJsUserFunctions(jsFiles, wasmFiles, nativeBridge2) {
63059
64135
  "wasm",
63060
64136
  "native",
63061
64137
  "importJS",
64138
+ "callHandle",
64139
+ "toNumber",
63062
64140
  file.source
63063
64141
  );
63064
64142
  factory(
@@ -63068,7 +64146,9 @@ function loadJsUserFunctions(jsFiles, wasmFiles, nativeBridge2) {
63068
64146
  registerFn,
63069
64147
  wasmInstance,
63070
64148
  nativeLib,
63071
- importJS
64149
+ importJS,
64150
+ callHandle,
64151
+ toNumber
63072
64152
  );
63073
64153
  if (!builtin) {
63074
64154
  throw new Error(
@@ -64688,6 +65768,15 @@ __export(interpreterExec_exports, {
64688
65768
  writeLValueBase: () => writeLValueBase
64689
65769
  });
64690
65770
 
65771
+ // src/numbl-core/jitDeclineDiagnostics.ts
65772
+ var lastDecline = null;
65773
+ function recordJitDecline(d) {
65774
+ lastDecline = d;
65775
+ }
65776
+ function getLastJitDecline() {
65777
+ return lastDecline;
65778
+ }
65779
+
64691
65780
  // src/numbl-core/runtime/cow.ts
64692
65781
  function cowCopy(v) {
64693
65782
  if (isRuntimeTensor(v)) {
@@ -64990,14 +66079,16 @@ function execStmtInner(stmt) {
64990
66079
  case "Directive": {
64991
66080
  if (stmt.directive === "assert_jit") {
64992
66081
  const wantC = stmt.args.includes("c");
66082
+ const decline = getLastJitDecline();
66083
+ const why = decline ? ` Most recent JIT decline (${decline.where}, ${decline.kind}): ${decline.message}` : ` (no JIT decline reason was recorded \u2014 the unit may have been declined before lowering, e.g. an unsupported input type.)`;
64993
66084
  if (this.optimization === "1") {
64994
66085
  throw new RuntimeError(
64995
- `%!numbl:assert_jit: expected the enclosing loop/function/script to be JS-JIT-compiled at --opt 1, but it ran in the interpreter. (Run with --opt 0 to silence.)`
66086
+ `%!numbl:assert_jit: expected the enclosing loop/function/script to be JS-JIT-compiled at --opt 1, but it ran in the interpreter.${why} (Run with --opt 0 to silence.)`
64996
66087
  );
64997
66088
  }
64998
66089
  if (this.optimization === "2" && wantC) {
64999
66090
  throw new RuntimeError(
65000
- `%!numbl:assert_jit c: expected the enclosing loop/function/script to be C-JIT-compiled at --opt 2, but it ran in the interpreter. (Run with --opt 0 to silence.)`
66091
+ `%!numbl:assert_jit c: expected the enclosing loop/function/script to be C-JIT-compiled at --opt 2, but it ran in the interpreter.${why} (Run with --opt 0 to silence.)`
65001
66092
  );
65002
66093
  }
65003
66094
  }
@@ -65069,13 +66160,16 @@ function evalExprNargout(expr, nargout) {
65069
66160
  return ctx.dimIndex < rv.shape.length ? rv.shape[ctx.dimIndex] : 1;
65070
66161
  }
65071
66162
  if (isRuntimeChar(rv)) return rv.value.length;
65072
- if (isRuntimeString(rv)) return rv.length;
66163
+ if (isRuntimeString(rv)) return 1;
65073
66164
  if (isRuntimeClassInstance(rv)) {
65074
- return this.rt.dispatch("end", 1, [
65075
- rv,
65076
- ctx.dimIndex + 1,
65077
- ctx.numIndices
65078
- ]);
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;
65079
66173
  }
65080
66174
  if (isRuntimeStructArray(rv)) {
65081
66175
  return rv.elements.length;
@@ -65084,6 +66178,10 @@ function evalExprNargout(expr, nargout) {
65084
66178
  if (ctx.numIndices === 1) return rv.elements.length;
65085
66179
  return ctx.dimIndex < rv.shape.length ? rv.shape[ctx.dimIndex] : 1;
65086
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
+ }
65087
66185
  if (isRuntimeSparseMatrix(rv)) {
65088
66186
  if (ctx.numIndices === 1) return rv.m * rv.n;
65089
66187
  return ctx.dimIndex === 0 ? rv.m : ctx.dimIndex === 1 ? rv.n : 1;
@@ -65408,7 +66506,8 @@ function evalMember(expr, nargout) {
65408
66506
  if (lastDot > 0) {
65409
66507
  const prefix = dottedName.slice(0, lastDot);
65410
66508
  const methodName = dottedName.slice(lastDot + 1);
65411
- 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)) {
65412
66511
  const target = {
65413
66512
  kind: "classMethod",
65414
66513
  className: prefix,
@@ -66660,6 +67759,22 @@ function interpretClassMethod(target, args, nargout) {
66660
67759
  () => this.callUserFunction(extFn, actualArgs2, nargout)
66661
67760
  );
66662
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
+ }
66663
67778
  throw new RuntimeError(
66664
67779
  `No method '${methodName}' for class '${className}'`
66665
67780
  );
@@ -66785,8 +67900,9 @@ function callUserFunction(fn, args, nargout, narginOverride) {
66785
67900
  const fnEnv = new Environment();
66786
67901
  fnEnv.rt = this.rt;
66787
67902
  fnEnv.persistentFuncId = `${this.currentFile}:${fn.name}`;
66788
- const hasVarargin = fn.params.length > 0 && fn.params[fn.params.length - 1] === "varargin";
66789
- 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;
66790
67906
  let numPositional = regularParams.length;
66791
67907
  const inputBlocks = (fn.argumentsBlocks ?? []).filter(
66792
67908
  (b) => b.kind !== "Output"
@@ -66805,7 +67921,14 @@ function callUserFunction(fn, args, nargout, narginOverride) {
66805
67921
  }
66806
67922
  }
66807
67923
  if (hasVarargin) {
66808
- 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));
66809
67932
  fnEnv.set("varargin", RTV.cell(extraArgs, [1, extraArgs.length]));
66810
67933
  }
66811
67934
  fnEnv.set("$nargin", narginOverride ?? args.length);
@@ -67190,6 +68313,28 @@ function evalInLocalScope(codeArg, fileName) {
67190
68313
  }
67191
68314
  throw new RuntimeError("eval not available in this context");
67192
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
+ }
67193
68338
  function processArgumentsBlocks(fn, args) {
67194
68339
  const argBlocks = fn.argumentsBlocks;
67195
68340
  if (!argBlocks || argBlocks.length === 0) return;
@@ -67224,9 +68369,18 @@ function processArgumentsBlocks(fn, args) {
67224
68369
  );
67225
68370
  }
67226
68371
  }
68372
+ const vararginIdx = fn.params.indexOf("varargin");
67227
68373
  for (const [paramName, fields] of nvGroups) {
67228
68374
  const pIdx = fn.params.indexOf(paramName);
67229
- 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
+ }
67230
68384
  const defaults = {};
67231
68385
  for (const { field, defaultExpr } of fields) {
67232
68386
  if (defaultExpr) defaults[field] = this.evalExpr(defaultExpr);
@@ -68512,6 +69666,11 @@ var shimFiles = [
68512
69666
  else
68513
69667
  result = val;
68514
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
68515
69674
  elseif strcmp(S(1).type, '.')
68516
69675
  result = builtin('subsref', obj, S);
68517
69676
  elseif strcmp(S(1).type, '{}')
@@ -68545,11 +69704,14 @@ var shimFiles = [
68545
69704
  end
68546
69705
  k = keys(obj.data_);
68547
69706
  if strcmp(obj.KeyType, 'char')
68548
- % Return cell array of char vectors
68549
- if iscell(k)
68550
- result = k;
68551
- else
68552
- 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});
68553
69715
  end
68554
69716
  else
68555
69717
  % Numeric keys: parse back from string
@@ -68582,6 +69744,14 @@ var shimFiles = [
68582
69744
  result{i} = v(i);
68583
69745
  end
68584
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
68585
69755
  end
68586
69756
  end
68587
69757
 
@@ -78009,6 +79179,30 @@ var sin = defineUnaryRealMath({
78009
79179
  complex: { cFnComplex: "mtoc2_csin", jsFnComplex: cSin }
78010
79180
  });
78011
79181
 
79182
+ // src/numbl-core/jit/builtins/defs/math/rand.ts
79183
+ var rand = {
79184
+ name: "rand",
79185
+ transfer(argTypes, nargout) {
79186
+ if (nargout > 1) {
79187
+ throw new UnsupportedConstruct(
79188
+ `'rand' does not support multi-output (nargout=${nargout})`
79189
+ );
79190
+ }
79191
+ if (argTypes.length !== 0) {
79192
+ throw new UnsupportedConstruct(
79193
+ `JS-JIT 'rand' supports only the scalar form rand() so far (got ${argTypes.length} arg(s)); matrix/seed forms run in the interpreter`
79194
+ );
79195
+ }
79196
+ return [scalarDouble("nonneg")];
79197
+ },
79198
+ emitJs() {
79199
+ return "$rand()";
79200
+ },
79201
+ call() {
79202
+ return [rngRandom()];
79203
+ }
79204
+ };
79205
+
78012
79206
  // src/numbl-core/jit/builtins/defs/math/tan.ts
78013
79207
  var tan = defineUnaryRealMath({
78014
79208
  name: "tan",
@@ -83392,6 +84586,7 @@ for (const b of [
83392
84586
  stdBuiltin,
83393
84587
  min,
83394
84588
  max,
84589
+ rand,
83395
84590
  any,
83396
84591
  all,
83397
84592
  zeros,
@@ -89231,12 +90426,13 @@ function emitJsProgram(prog, opts = {}) {
89231
90426
  const wrapperLines = [];
89232
90427
  if (opts.exposeSpec !== void 0) {
89233
90428
  wrapperLines.push(
89234
- `return function ($h) { globalThis.$write = $h.write; globalThis.$plotDispatch = $h.plotDispatch; return ${opts.exposeSpec}; };`
90429
+ `return function ($h) { globalThis.$write = $h.write; globalThis.$plotDispatch = $h.plotDispatch; globalThis.$rand = $h.rand; return ${opts.exposeSpec}; };`
89235
90430
  );
89236
90431
  } else {
89237
90432
  wrapperLines.push("function run($h) {");
89238
90433
  wrapperLines.push(" globalThis.$write = $h.write;");
89239
90434
  wrapperLines.push(" globalThis.$plotDispatch = $h.plotDispatch;");
90435
+ wrapperLines.push(" globalThis.$rand = $h.rand;");
89240
90436
  const locals = collectAssignedLocals(prog.topLevelStmts);
89241
90437
  if (locals.length > 0) {
89242
90438
  wrapperLines.push(` let ${locals.join(", ")};`);
@@ -94431,6 +95627,7 @@ function getOrCreateSession(interp) {
94431
95627
  function buildHostHelpers(rt) {
94432
95628
  return {
94433
95629
  write: (s) => rt.output(s),
95630
+ rand: () => rngRandom(),
94434
95631
  plotDispatch: (name, args) => {
94435
95632
  const runtimeArgs = args.map((a) => jitToNumbl(a));
94436
95633
  const handled = dispatchPlotBuiltin(
@@ -94523,6 +95720,11 @@ var jitCallExecutor = {
94523
95720
  return { specFn };
94524
95721
  } catch (e) {
94525
95722
  if (e instanceof UnsupportedConstruct || e instanceof TypeError2) {
95723
+ recordJitDecline({
95724
+ message: e.message,
95725
+ kind: e.constructor.name,
95726
+ where: "jit-call"
95727
+ });
94526
95728
  return null;
94527
95729
  }
94528
95730
  throw e;
@@ -94649,6 +95851,11 @@ var jitLoopExecutor = {
94649
95851
  return { specFn };
94650
95852
  } catch (e) {
94651
95853
  if (e instanceof UnsupportedConstruct || e instanceof TypeError2) {
95854
+ recordJitDecline({
95855
+ message: e.message,
95856
+ kind: e.constructor.name,
95857
+ where: "jit-loop"
95858
+ });
94652
95859
  return null;
94653
95860
  }
94654
95861
  throw e;
@@ -94789,6 +95996,11 @@ var jitTopLevelExecutor = {
94789
95996
  return { specFn, nargout };
94790
95997
  } catch (e) {
94791
95998
  if (e instanceof UnsupportedConstruct || e instanceof TypeError2) {
95999
+ recordJitDecline({
96000
+ message: e.message,
96001
+ kind: e.constructor.name,
96002
+ where: "jit-top-level"
96003
+ });
94792
96004
  return null;
94793
96005
  }
94794
96006
  throw e;
@@ -95000,6 +96212,31 @@ function executeCode(source, options = {}, workspaceFiles, mainFileName = "scrip
95000
96212
  implicitCwdPath = null;
95001
96213
  }
95002
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
+ }
95003
96240
  const jsUserFunctions = loadJsUserFunctions(
95004
96241
  jsWorkspaceFiles,
95005
96242
  wasmWorkspaceFiles,
@@ -95463,7 +96700,8 @@ import {
95463
96700
  rmSync,
95464
96701
  rmdirSync,
95465
96702
  renameSync,
95466
- chmodSync
96703
+ chmodSync,
96704
+ realpathSync
95467
96705
  } from "fs";
95468
96706
  import { unzipSync } from "fflate";
95469
96707
  import { execFileSync } from "child_process";
@@ -95631,7 +96869,7 @@ var NodeFileIOAdapter = class {
95631
96869
  if (entry.eof) return 1;
95632
96870
  const buf = Buffer.alloc(1);
95633
96871
  try {
95634
- const bytesRead = readSync(entry.fd, buf, 0, 1, null);
96872
+ const bytesRead = readSync(entry.fd, buf, 0, 1, entry.pos);
95635
96873
  if (bytesRead === 0) {
95636
96874
  entry.eof = true;
95637
96875
  return 1;
@@ -95855,6 +97093,51 @@ var NodeFileIOAdapter = class {
95855
97093
  return false;
95856
97094
  }
95857
97095
  }
97096
+ copyfile(source, destination, force) {
97097
+ try {
97098
+ const src = expandTilde(source);
97099
+ const srcStat = statSync2(src);
97100
+ let dst = expandTilde(destination);
97101
+ try {
97102
+ if (statSync2(dst).isDirectory()) dst = join3(dst, basename(src));
97103
+ } catch {
97104
+ }
97105
+ if (srcStat.isDirectory()) {
97106
+ copyDirRecursive(src, dst);
97107
+ return true;
97108
+ }
97109
+ const parent = dirname(dst);
97110
+ if (parent && parent !== "." && parent !== "/") {
97111
+ mkdirSync(parent, { recursive: true });
97112
+ }
97113
+ if (force) {
97114
+ try {
97115
+ chmodSync(dst, 438);
97116
+ } catch {
97117
+ }
97118
+ }
97119
+ writeFileSync(dst, readFileSync3(src));
97120
+ return true;
97121
+ } catch {
97122
+ return false;
97123
+ }
97124
+ }
97125
+ fileattrib(path) {
97126
+ try {
97127
+ const p2 = expandTilde(path);
97128
+ const st2 = statSync2(p2);
97129
+ const mode = st2.mode;
97130
+ return {
97131
+ Name: realpathSync(p2),
97132
+ directory: st2.isDirectory(),
97133
+ UserRead: (mode & 256) !== 0,
97134
+ UserWrite: (mode & 128) !== 0,
97135
+ UserExecute: (mode & 64) !== 0
97136
+ };
97137
+ } catch {
97138
+ return null;
97139
+ }
97140
+ }
95858
97141
  deleteFile(pattern) {
95859
97142
  const p2 = expandTilde(pattern);
95860
97143
  if (p2.includes("*") || p2.includes("?")) {
@@ -96089,6 +97372,12 @@ var NodeFileIOAdapter = class {
96089
97372
  }
96090
97373
  /**
96091
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).
96092
97381
  * @param keepNewline - if true, keep the trailing newline (fgets); if false, strip it (fgetl)
96093
97382
  */
96094
97383
  readLine(entry, keepNewline) {
@@ -96098,7 +97387,13 @@ var NodeFileIOAdapter = class {
96098
97387
  const buf = Buffer.alloc(READ_CHUNK_SIZE);
96099
97388
  let bytesRead;
96100
97389
  try {
96101
- 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
+ );
96102
97397
  entry.lastError = "";
96103
97398
  } catch (e) {
96104
97399
  entry.lastError = e instanceof Error ? e.message : String(e);
@@ -96116,12 +97411,15 @@ var NodeFileIOAdapter = class {
96116
97411
  }
96117
97412
  const nlIdx = entry.buffer.indexOf("\n");
96118
97413
  if (nlIdx !== -1) {
96119
- 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);
96120
97416
  entry.buffer = entry.buffer.slice(nlIdx + 1);
97417
+ entry.pos += Buffer.byteLength(consumed, "utf-8");
96121
97418
  return line2;
96122
97419
  }
96123
97420
  const line = entry.buffer;
96124
97421
  entry.buffer = "";
97422
+ entry.pos += Buffer.byteLength(line, "utf-8");
96125
97423
  return line;
96126
97424
  }
96127
97425
  };
@@ -98736,6 +100034,9 @@ Options (for build-site):
98736
100034
  the first script)
98737
100035
  --repo-url <url> Source repository URL, shown as a link in the deployed
98738
100036
  site (default: from numbl-project.json)
100037
+ --max-initial-output-panel-height <px>
100038
+ Cap the initial height (px) of the output panel so the
100039
+ figure panel below it starts larger (desktop layout)
98739
100040
 
98740
100041
  Options (for parse):
98741
100042
  --dump-ast <file> Write the AST as indented JSON to <file> (default: stdout)
@@ -99265,6 +100566,9 @@ async function cmdBuildAddon(args) {
99265
100566
  }
99266
100567
  var SITE_DEFAULT_IGNORE_DIRS = /* @__PURE__ */ new Set([".git", ".github", "node_modules"]);
99267
100568
  var SITE_MAX_FILE_BYTES = 25 * 1024 * 1024;
100569
+ function isAgentInstructionFile(name) {
100570
+ return name === "GEMINI.md" || /^(CLAUDE|AGENT)[^/]*\.md$/i.test(name);
100571
+ }
99268
100572
  function readNumblIgnore(projectDir) {
99269
100573
  const p2 = join7(projectDir, ".numblignore");
99270
100574
  if (!existsSync3(p2)) return [];
@@ -99313,6 +100617,7 @@ function collectSiteFiles(projectDir, outDirAbs, ignore) {
99313
100617
  walk2(full);
99314
100618
  } else if (e.isFile()) {
99315
100619
  if (e.name === ".numblignore" || e.name === ".DS_Store") continue;
100620
+ if (isAgentInstructionFile(e.name)) continue;
99316
100621
  const st2 = statSync3(full);
99317
100622
  if (st2.size > SITE_MAX_FILE_BYTES) {
99318
100623
  console.error(
@@ -99334,6 +100639,7 @@ async function cmdBuildSite(args) {
99334
100639
  let title;
99335
100640
  let entry;
99336
100641
  let repoUrl;
100642
+ let maxInitialOutputPanelHeight;
99337
100643
  const positional = [];
99338
100644
  for (let i = 0; i < args.length; i++) {
99339
100645
  const a = args[i];
@@ -99342,7 +100648,16 @@ async function cmdBuildSite(args) {
99342
100648
  else if (a === "--title") title = args[++i];
99343
100649
  else if (a === "--entry") entry = args[++i];
99344
100650
  else if (a === "--repo-url") repoUrl = args[++i];
99345
- else if (a.startsWith("-")) {
100651
+ else if (a === "--max-initial-output-panel-height") {
100652
+ const n = Number(args[++i]);
100653
+ if (!Number.isFinite(n) || n <= 0) {
100654
+ console.error(
100655
+ "Error: --max-initial-output-panel-height must be a positive number"
100656
+ );
100657
+ process.exit(1);
100658
+ }
100659
+ maxInitialOutputPanelHeight = n;
100660
+ } else if (a.startsWith("-")) {
99346
100661
  console.error(`Unknown option: ${a}`);
99347
100662
  process.exit(1);
99348
100663
  } else positional.push(a);
@@ -99395,6 +100710,8 @@ async function cmdBuildSite(args) {
99395
100710
  if (title !== void 0) manifest.title = title;
99396
100711
  if (entry !== void 0) manifest.entry = entry;
99397
100712
  if (repoUrl !== void 0) manifest.repository = repoUrl;
100713
+ if (maxInitialOutputPanelHeight !== void 0)
100714
+ manifest.maxInitialOutputPanelHeight = maxInitialOutputPanelHeight;
99398
100715
  if (!manifest.title) manifest.title = basename2(projectDirAbs);
99399
100716
  const zipEntries = {};
99400
100717
  for (const f of collected) {
@@ -99425,6 +100742,11 @@ async function cmdBuildSite(args) {
99425
100742
  let indexHtml = readFileSync6(indexPath, "utf-8");
99426
100743
  indexHtml = indexHtml.includes("<!-- numbl:base -->") ? indexHtml.replace("<!-- numbl:base -->", inject) : indexHtml.replace("</head>", ` ${inject}
99427
100744
  </head>`);
100745
+ const escapeHtml = (s) => s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
100746
+ indexHtml = indexHtml.replace(
100747
+ /<title>.*?<\/title>/,
100748
+ `<title>${escapeHtml(manifest.title)}</title>`
100749
+ );
99428
100750
  writeFileSync4(indexPath, indexHtml);
99429
100751
  const redirectTarget = normBase ?? "/";
99430
100752
  writeFileSync4(