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.
- package/dist-browser/browser/index.d.ts +21 -0
- package/dist-browser/browser/mip.d.ts +10 -0
- package/dist-browser/browser/protocol.d.ts +59 -0
- package/dist-browser/browser/session.d.ts +55 -0
- package/dist-browser/browser/system-store.d.ts +30 -0
- package/dist-browser/browser/worker.d.ts +1 -0
- package/dist-browser/browser.js +131 -0
- package/dist-browser/db/operations.d.ts +25 -0
- package/dist-browser/db/schema.d.ts +26 -0
- package/dist-browser/graphics/axisLimits.d.ts +23 -0
- package/dist-browser/graphics/figuresReducer.d.ts +86 -0
- package/dist-browser/graphics/types.d.ts +423 -0
- package/dist-browser/hooks/useProjectFiles.d.ts +45 -0
- package/dist-browser/numbl-core/diagnostics/errors.d.ts +8 -0
- package/dist-browser/numbl-core/diagnostics/index.d.ts +27 -0
- package/dist-browser/numbl-core/executeCode.d.ts +108 -0
- package/dist-browser/numbl-core/executors/cache.d.ts +26 -0
- package/dist-browser/numbl-core/executors/classification.d.ts +134 -0
- package/dist-browser/numbl-core/executors/context.d.ts +76 -0
- package/dist-browser/numbl-core/executors/handleInline.d.ts +58 -0
- package/dist-browser/numbl-core/executors/index.d.ts +14 -0
- package/dist-browser/numbl-core/executors/jit/cJitCallExecutor.d.ts +35 -0
- package/dist-browser/numbl-core/executors/jit/cJitLoopExecutor.d.ts +31 -0
- package/dist-browser/numbl-core/executors/jit/cJitTopLevelExecutor.d.ts +29 -0
- package/dist-browser/numbl-core/executors/jit/callExecutor.d.ts +45 -0
- package/dist-browser/numbl-core/executors/jit/compileC.d.ts +51 -0
- package/dist-browser/numbl-core/executors/jit/compileC.node.d.ts +25 -0
- package/dist-browser/numbl-core/executors/jit/hostHelpers.d.ts +31 -0
- package/dist-browser/numbl-core/executors/jit/loopExecutor.d.ts +41 -0
- package/dist-browser/numbl-core/executors/jit/session.d.ts +17 -0
- package/dist-browser/numbl-core/executors/jit/topLevelExecutor.d.ts +36 -0
- package/dist-browser/numbl-core/executors/jit/typeAdapter.d.ts +28 -0
- package/dist-browser/numbl-core/executors/jit/typeAdapterC.d.ts +73 -0
- package/dist-browser/numbl-core/executors/jit/valueAdapter.d.ts +55 -0
- package/dist-browser/numbl-core/executors/jit/valueAdapterC.d.ts +108 -0
- package/dist-browser/numbl-core/executors/lowering.d.ts +120 -0
- package/dist-browser/numbl-core/executors/plugins.d.ts +41 -0
- package/dist-browser/numbl-core/executors/registry.d.ts +148 -0
- package/dist-browser/numbl-core/executors/types.d.ts +103 -0
- package/dist-browser/numbl-core/externalAccessDirective.d.ts +6 -0
- package/dist-browser/numbl-core/fileIOAdapter.d.ts +88 -0
- package/dist-browser/numbl-core/functionResolve.d.ts +70 -0
- package/dist-browser/numbl-core/helpers/arithmetic.d.ts +47 -0
- package/dist-browser/numbl-core/helpers/bessel.d.ts +49 -0
- package/dist-browser/numbl-core/helpers/check-helpers.d.ts +49 -0
- package/dist-browser/numbl-core/helpers/constants.d.ts +6 -0
- package/dist-browser/numbl-core/helpers/dummy.d.ts +5 -0
- package/dist-browser/numbl-core/helpers/effectively-real.d.ts +25 -0
- package/dist-browser/numbl-core/helpers/eigs-select.d.ts +25 -0
- package/dist-browser/numbl-core/helpers/erf.d.ts +5 -0
- package/dist-browser/numbl-core/helpers/gmres.d.ts +51 -0
- package/dist-browser/numbl-core/helpers/linsolve.d.ts +25 -0
- package/dist-browser/numbl-core/helpers/marching-cubes-tables.d.ts +10 -0
- package/dist-browser/numbl-core/helpers/marching-cubes.d.ts +46 -0
- package/dist-browser/numbl-core/helpers/ode-rk.d.ts +83 -0
- package/dist-browser/numbl-core/helpers/prng.d.ts +19 -0
- package/dist-browser/numbl-core/helpers/quadgk.d.ts +32 -0
- package/dist-browser/numbl-core/helpers/reduction/cumulative.d.ts +8 -0
- package/dist-browser/numbl-core/helpers/reduction/min-max.d.ts +5 -0
- package/dist-browser/numbl-core/helpers/reduction-helpers.d.ts +66 -0
- package/dist-browser/numbl-core/helpers/registry.d.ts +7 -0
- package/dist-browser/numbl-core/helpers/scanFormat.d.ts +11 -0
- package/dist-browser/numbl-core/helpers/shape-utils.d.ts +7 -0
- package/dist-browser/numbl-core/helpers/sparse-arithmetic.d.ts +16 -0
- package/dist-browser/numbl-core/helpers/string.d.ts +11 -0
- package/dist-browser/numbl-core/interpreter/builtins/arithmetic.d.ts +4 -0
- package/dist-browser/numbl-core/interpreter/builtins/array-construction.d.ts +10 -0
- package/dist-browser/numbl-core/interpreter/builtins/array-extras.d.ts +5 -0
- package/dist-browser/numbl-core/interpreter/builtins/array-manipulation.d.ts +7 -0
- package/dist-browser/numbl-core/interpreter/builtins/cell-struct.d.ts +5 -0
- package/dist-browser/numbl-core/interpreter/builtins/complex.d.ts +4 -0
- package/dist-browser/numbl-core/interpreter/builtins/datetime.d.ts +40 -0
- package/dist-browser/numbl-core/interpreter/builtins/dictionary.d.ts +15 -0
- package/dist-browser/numbl-core/interpreter/builtins/fft.d.ts +7 -0
- package/dist-browser/numbl-core/interpreter/builtins/gallery.d.ts +7 -0
- package/dist-browser/numbl-core/interpreter/builtins/geometry.d.ts +10 -0
- package/dist-browser/numbl-core/interpreter/builtins/graph.d.ts +29 -0
- package/dist-browser/numbl-core/interpreter/builtins/help-text.d.ts +5 -0
- package/dist-browser/numbl-core/interpreter/builtins/index.d.ts +39 -0
- package/dist-browser/numbl-core/interpreter/builtins/introspection.d.ts +6 -0
- package/dist-browser/numbl-core/interpreter/builtins/linear-algebra.d.ts +9 -0
- package/dist-browser/numbl-core/interpreter/builtins/logical.d.ts +9 -0
- package/dist-browser/numbl-core/interpreter/builtins/math.d.ts +4 -0
- package/dist-browser/numbl-core/interpreter/builtins/misc.d.ts +7 -0
- package/dist-browser/numbl-core/interpreter/builtins/numerical.d.ts +10 -0
- package/dist-browser/numbl-core/interpreter/builtins/predicates.d.ts +4 -0
- package/dist-browser/numbl-core/interpreter/builtins/prng.d.ts +4 -0
- package/dist-browser/numbl-core/interpreter/builtins/reductions.d.ts +6 -0
- package/dist-browser/numbl-core/interpreter/builtins/set-operations.d.ts +4 -0
- package/dist-browser/numbl-core/interpreter/builtins/sparse.d.ts +4 -0
- package/dist-browser/numbl-core/interpreter/builtins/special-math.d.ts +4 -0
- package/dist-browser/numbl-core/interpreter/builtins/string-extras.d.ts +5 -0
- package/dist-browser/numbl-core/interpreter/builtins/strings.d.ts +7 -0
- package/dist-browser/numbl-core/interpreter/builtins/time-system.d.ts +6 -0
- package/dist-browser/numbl-core/interpreter/builtins/type-constructors.d.ts +5 -0
- package/dist-browser/numbl-core/interpreter/builtins/types.d.ts +98 -0
- package/dist-browser/numbl-core/interpreter/builtins/utility.d.ts +4 -0
- package/dist-browser/numbl-core/interpreter/builtins/validation.d.ts +4 -0
- package/dist-browser/numbl-core/interpreter/interpreter.d.ts +199 -0
- package/dist-browser/numbl-core/interpreter/interpreterExec.d.ts +81 -0
- package/dist-browser/numbl-core/interpreter/interpreterFunctions.d.ts +62 -0
- package/dist-browser/numbl-core/interpreter/interpreterSpecialBuiltins.d.ts +35 -0
- package/dist-browser/numbl-core/interpreter/types.d.ts +114 -0
- package/dist-browser/numbl-core/jit/builtins/defs/_shared.d.ts +43 -0
- package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/_elemwise.d.ts +123 -0
- package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/minus.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/mpower.d.ts +12 -0
- package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/mrdivide.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/mtimes.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/plus.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/power.d.ts +30 -0
- package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/rdivide.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/times.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/arithmetic/uminus.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/compare/_compare.d.ts +12 -0
- package/dist-browser/numbl-core/jit/builtins/defs/compare/eq.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/compare/ge.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/compare/gt.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/compare/le.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/compare/lt.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/compare/ne.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/diag/assert.d.ts +6 -0
- package/dist-browser/numbl-core/jit/builtins/defs/io/_format_args.d.ts +17 -0
- package/dist-browser/numbl-core/jit/builtins/defs/io/disp.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/io/error.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/io/fprintf.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/io/sprintf.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/io/warning.d.ts +15 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/_shortcircuit.d.ts +30 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/_unary_pred.d.ts +30 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/and.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/andand.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/boolconst.d.ts +3 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/classBuiltin.d.ts +21 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/fieldnames.d.ts +15 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/isa.d.ts +13 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/iscell.d.ts +8 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/isempty.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/isequal.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/isfield.d.ts +20 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/isinf.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/isnan.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/isnumeric.d.ts +7 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/isreal.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/isscalar.d.ts +20 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/isstruct.d.ts +7 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/logical.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/not.d.ts +15 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/or.d.ts +11 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/oror.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/strcmp.d.ts +21 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/typequery.d.ts +10 -0
- package/dist-browser/numbl-core/jit/builtins/defs/logical/xor.d.ts +12 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/_complex_fold.d.ts +34 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/_unary_real.d.ts +51 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/abs.d.ts +7 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/angle.d.ts +7 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/asinh.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/atan.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/atan2.d.ts +3 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/besselh.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/ceil.d.ts +4 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/conj.d.ts +7 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/constants.d.ts +7 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/cos.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/cosh.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/dot.d.ts +20 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/double.d.ts +28 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/exp.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/fix.d.ts +4 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/floor.d.ts +4 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/hypot.d.ts +3 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/imag.d.ts +7 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/linspace.d.ts +6 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/log.d.ts +4 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/log10.d.ts +3 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/log2.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/logspace.d.ts +8 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/mod.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/norm.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/rand.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/real.d.ts +7 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/rem.d.ts +3 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/round.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/sign.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/sin.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/sinh.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/sqrt.d.ts +11 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/tan.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/tanh.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/math/uniquetol.d.ts +22 -0
- package/dist-browser/numbl-core/jit/builtins/defs/plot/dispatch.d.ts +6 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/_cumulative.d.ts +49 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/_shape.d.ts +126 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/_variance.d.ts +17 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/all.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/any.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/cummax.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/cummin.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/cumprod.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/cumsum.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/diff.d.ts +16 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/length.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/max.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/mean.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/min.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/numel.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/prod.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/std.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/sum.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/reduction/var.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/shape/_construct.d.ts +67 -0
- package/dist-browser/numbl-core/jit/builtins/defs/shape/_triangular.d.ts +34 -0
- package/dist-browser/numbl-core/jit/builtins/defs/shape/cat.d.ts +33 -0
- package/dist-browser/numbl-core/jit/builtins/defs/shape/diag.d.ts +29 -0
- package/dist-browser/numbl-core/jit/builtins/defs/shape/eye.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/defs/shape/flip.d.ts +7 -0
- package/dist-browser/numbl-core/jit/builtins/defs/shape/meshgrid.d.ts +12 -0
- package/dist-browser/numbl-core/jit/builtins/defs/shape/ones.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/shape/repmat.d.ts +37 -0
- package/dist-browser/numbl-core/jit/builtins/defs/shape/reshape.d.ts +39 -0
- package/dist-browser/numbl-core/jit/builtins/defs/shape/size.d.ts +20 -0
- package/dist-browser/numbl-core/jit/builtins/defs/shape/sort.d.ts +19 -0
- package/dist-browser/numbl-core/jit/builtins/defs/shape/transpose.d.ts +6 -0
- package/dist-browser/numbl-core/jit/builtins/defs/shape/tril.d.ts +16 -0
- package/dist-browser/numbl-core/jit/builtins/defs/shape/triu.d.ts +16 -0
- package/dist-browser/numbl-core/jit/builtins/defs/shape/zeros.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/defs/system/deal.d.ts +20 -0
- package/dist-browser/numbl-core/jit/builtins/defs/system/feval.d.ts +36 -0
- package/dist-browser/numbl-core/jit/builtins/defs/system/pathBuiltins.d.ts +4 -0
- package/dist-browser/numbl-core/jit/builtins/defs/system/tic.d.ts +8 -0
- package/dist-browser/numbl-core/jit/builtins/defs/system/toc.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/index.d.ts +16 -0
- package/dist-browser/numbl-core/jit/builtins/registry.d.ts +138 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/cell/cell.d.ts +24 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/indexing/loop_count.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/indexing/range_value.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/indexing/scalar_index.d.ts +11 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/indexing/tensor_make_range.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/io/assert_fmt.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/io/disp_complex.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/io/disp_double.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/io/disp_struct.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/io/disp_tensor.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/io/disp_tensor_complex.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/io/error_fmt.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/io/format_complex.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/io/format_double.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/io/format_engine.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/io/fprintf.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/io/sprintf.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/io/warning_fmt.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/plot/plot_dispatch.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/snippets.c.gen.d.ts +4 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/snippets.gen.d.ts +85 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/system/cdiv.d.ts +4 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/system/cscalar.d.ts +103 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/system/deep_clone.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/system/isequal.d.ts +2 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/system/tictoc.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor.d.ts +6 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_alloc.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_alloc_complex.d.ts +6 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_alloc_nd.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_alloc_nd_complex.d.ts +6 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_copy_complex.d.ts +6 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_from_matrix.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_from_matrix_complex.d.ts +6 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_from_row.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor/tensor_from_row_complex.d.ts +6 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_cat.d.ts +11 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_cumulative.d.ts +32 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_diag.d.ts +33 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_diff.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_dot.d.ts +16 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_elemwise_complex.d.ts +90 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_elemwise_real.d.ts +75 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_elemwise_real_fn.d.ts +95 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_eye.d.ts +10 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_fill_nd.d.ts +11 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_fill_square.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_flip.d.ts +11 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_imag_all_zero.d.ts +1 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_linspace.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_logical_real.d.ts +10 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_logspace.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_meshgrid.d.ts +29 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_mtimes_complex.d.ts +10 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_mtimes_real.d.ts +6 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_norm.d.ts +4 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_ones_nd.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_ones_square.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_predicate.d.ts +42 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_reduce_complex.d.ts +53 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_reduce_real.d.ts +42 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_repmat.d.ts +11 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_reshape_nd.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_reshape_nd_complex.d.ts +6 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_size.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_sort_real.d.ts +36 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_transpose.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_transpose_complex.d.ts +6 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_triangular.d.ts +22 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_unary_complex_math.d.ts +128 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_unary_real_math.d.ts +95 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_uniquetol.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_var.d.ts +12 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_zeros_nd.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/tensor_ops/tensor_zeros_square.d.ts +5 -0
- package/dist-browser/numbl-core/jit/builtins/runtime/text/strcmp.d.ts +2 -0
- package/dist-browser/numbl-core/jit/codegen/cFormat.d.ts +36 -0
- package/dist-browser/numbl-core/jit/codegen/cHelpers.d.ts +48 -0
- package/dist-browser/numbl-core/jit/codegen/emit.d.ts +55 -0
- package/dist-browser/numbl-core/jit/codegen/emitCellTypedef.d.ts +23 -0
- package/dist-browser/numbl-core/jit/codegen/emitExpr.d.ts +33 -0
- package/dist-browser/numbl-core/jit/codegen/emitIndex.d.ts +56 -0
- package/dist-browser/numbl-core/jit/codegen/emitJs.d.ts +64 -0
- package/dist-browser/numbl-core/jit/codegen/emitNamedTypedef.d.ts +58 -0
- package/dist-browser/numbl-core/jit/codegen/emitStmt.d.ts +76 -0
- package/dist-browser/numbl-core/jit/codegen/emitTensorConcat.d.ts +23 -0
- package/dist-browser/numbl-core/jit/codegen/emitTensorConcatJs.d.ts +16 -0
- package/dist-browser/numbl-core/jit/codegen/emitTensorFused.d.ts +77 -0
- package/dist-browser/numbl-core/jit/codegen/inlinePass.d.ts +66 -0
- package/dist-browser/numbl-core/jit/codegen/liveness.d.ts +58 -0
- package/dist-browser/numbl-core/jit/codegen/prettyIR.d.ts +24 -0
- package/dist-browser/numbl-core/jit/codegen/runtime.d.ts +152 -0
- package/dist-browser/numbl-core/jit/compileSpec.d.ts +84 -0
- package/dist-browser/numbl-core/jit/compileSpecC.d.ts +100 -0
- package/dist-browser/numbl-core/jit/index.d.ts +15 -0
- package/dist-browser/numbl-core/jit/lowering/classDefs.d.ts +109 -0
- package/dist-browser/numbl-core/jit/lowering/definiteAssign.d.ts +42 -0
- package/dist-browser/numbl-core/jit/lowering/errors.d.ts +35 -0
- package/dist-browser/numbl-core/jit/lowering/indexFold.d.ts +31 -0
- package/dist-browser/numbl-core/jit/lowering/indexResolve.d.ts +100 -0
- package/dist-browser/numbl-core/jit/lowering/ir.d.ts +584 -0
- package/dist-browser/numbl-core/jit/lowering/lower.d.ts +271 -0
- package/dist-browser/numbl-core/jit/lowering/lowerCellIndex.d.ts +41 -0
- package/dist-browser/numbl-core/jit/lowering/lowerCellLit.d.ts +19 -0
- package/dist-browser/numbl-core/jit/lowering/lowerClassConstructor.d.ts +55 -0
- package/dist-browser/numbl-core/jit/lowering/lowerFuncCall.d.ts +34 -0
- package/dist-browser/numbl-core/jit/lowering/lowerHandle.d.ts +57 -0
- package/dist-browser/numbl-core/jit/lowering/lowerIndexLoad.d.ts +16 -0
- package/dist-browser/numbl-core/jit/lowering/lowerIndexSlice.d.ts +29 -0
- package/dist-browser/numbl-core/jit/lowering/lowerIndexSliceStore.d.ts +19 -0
- package/dist-browser/numbl-core/jit/lowering/lowerIndexStore.d.ts +14 -0
- package/dist-browser/numbl-core/jit/lowering/lowerMethodCall.d.ts +45 -0
- package/dist-browser/numbl-core/jit/lowering/lowerMultiAssign.d.ts +36 -0
- package/dist-browser/numbl-core/jit/lowering/lowerTensorLit.d.ts +25 -0
- package/dist-browser/numbl-core/jit/lowering/rangeCount.d.ts +19 -0
- package/dist-browser/numbl-core/jit/lowering/specialize.d.ts +93 -0
- package/dist-browser/numbl-core/jit/lowering/types.d.ts +503 -0
- package/dist-browser/numbl-core/jit/lowering/walk.d.ts +17 -0
- package/dist-browser/numbl-core/jit/numbl/index.d.ts +30 -0
- package/dist-browser/numbl-core/jit/parser/astUtils.d.ts +43 -0
- package/dist-browser/numbl-core/jit/parser/index.d.ts +12 -0
- package/dist-browser/numbl-core/jit/parser/sourceLoc.d.ts +12 -0
- package/dist-browser/numbl-core/jit/runtime/context.d.ts +23 -0
- package/dist-browser/numbl-core/jit/runtime/inferType.d.ts +10 -0
- package/dist-browser/numbl-core/jit/runtime/value.d.ts +101 -0
- package/dist-browser/numbl-core/jit/workspace/driverPrologue.d.ts +59 -0
- package/dist-browser/numbl-core/jit/workspace/mtoc2UserFunctionLoader.d.ts +62 -0
- package/dist-browser/numbl-core/jit/workspace/workspace.d.ts +243 -0
- package/dist-browser/numbl-core/jitDeclineDiagnostics.d.ts +32 -0
- package/dist-browser/numbl-core/jitTypes.d.ts +94 -0
- package/dist-browser/numbl-core/jsUserFunctions.d.ts +61 -0
- package/dist-browser/numbl-core/lexer/helpers.d.ts +15 -0
- package/dist-browser/numbl-core/lexer/index.d.ts +4 -0
- package/dist-browser/numbl-core/lexer/keywords.d.ts +3 -0
- package/dist-browser/numbl-core/lexer/token-config.d.ts +94 -0
- package/dist-browser/numbl-core/lexer/tokenizer.d.ts +9 -0
- package/dist-browser/numbl-core/lexer/types.d.ts +80 -0
- package/dist-browser/numbl-core/lowering/classInfo.d.ts +53 -0
- package/dist-browser/numbl-core/lowering/constants.d.ts +4 -0
- package/dist-browser/numbl-core/lowering/errors.d.ts +17 -0
- package/dist-browser/numbl-core/lowering/index.d.ts +3 -0
- package/dist-browser/numbl-core/lowering/itemTypes.d.ts +87 -0
- package/dist-browser/numbl-core/lowering/loweringContext.d.ts +241 -0
- package/dist-browser/numbl-core/native/bridge-resolve.d.ts +14 -0
- package/dist-browser/numbl-core/native/geometry-bridge.d.ts +39 -0
- package/dist-browser/numbl-core/native/lapack-bridge.d.ts +482 -0
- package/dist-browser/numbl-core/native/qhull-browser.d.ts +15 -0
- package/dist-browser/numbl-core/native/qhull-node.d.ts +13 -0
- package/dist-browser/numbl-core/native/ts-lapack-bridge.d.ts +9 -0
- package/dist-browser/numbl-core/native/ts-lapack-eig-complex.d.ts +32 -0
- package/dist-browser/numbl-core/ops/bessel.d.ts +18 -0
- package/dist-browser/numbl-core/ops/comparison.d.ts +11 -0
- package/dist-browser/numbl-core/ops/complexBinaryElemwise.d.ts +10 -0
- package/dist-browser/numbl-core/ops/complexUnaryElemwise.d.ts +8 -0
- package/dist-browser/numbl-core/ops/dispatch.d.ts +26 -0
- package/dist-browser/numbl-core/ops/index.d.ts +8 -0
- package/dist-browser/numbl-core/ops/opCodes.d.ts +70 -0
- package/dist-browser/numbl-core/ops/realBinaryElemwise.d.ts +8 -0
- package/dist-browser/numbl-core/ops/realUnaryElemwise.d.ts +5 -0
- package/dist-browser/numbl-core/ops/reduce.d.ts +6 -0
- package/dist-browser/numbl-core/parser/ArgumentsParser.d.ts +33 -0
- package/dist-browser/numbl-core/parser/ClassParser.d.ts +21 -0
- package/dist-browser/numbl-core/parser/CommandParser.d.ts +31 -0
- package/dist-browser/numbl-core/parser/ControlFlowParser.d.ts +16 -0
- package/dist-browser/numbl-core/parser/ExpressionParser.d.ts +32 -0
- package/dist-browser/numbl-core/parser/FunctionParser.d.ts +10 -0
- package/dist-browser/numbl-core/parser/Parser.d.ts +17 -0
- package/dist-browser/numbl-core/parser/ParserBase.d.ts +35 -0
- package/dist-browser/numbl-core/parser/StatementParser.d.ts +13 -0
- package/dist-browser/numbl-core/parser/errors.d.ts +15 -0
- package/dist-browser/numbl-core/parser/index.d.ts +7 -0
- package/dist-browser/numbl-core/parser/types.d.ts +342 -0
- package/dist-browser/numbl-core/runtime/alloc.d.ts +12 -0
- package/dist-browser/numbl-core/runtime/axisCommand.d.ts +34 -0
- package/dist-browser/numbl-core/runtime/compare.d.ts +5 -0
- package/dist-browser/numbl-core/runtime/constructors.d.ts +39 -0
- package/dist-browser/numbl-core/runtime/convert.d.ts +10 -0
- package/dist-browser/numbl-core/runtime/cow.d.ts +33 -0
- package/dist-browser/numbl-core/runtime/display.d.ts +6 -0
- package/dist-browser/numbl-core/runtime/error.d.ts +78 -0
- package/dist-browser/numbl-core/runtime/index.d.ts +13 -0
- package/dist-browser/numbl-core/runtime/indexing.d.ts +28 -0
- package/dist-browser/numbl-core/runtime/plotBuiltinDispatch.d.ts +92 -0
- package/dist-browser/numbl-core/runtime/plotUtils.d.ts +336 -0
- package/dist-browser/numbl-core/runtime/refcount.d.ts +85 -0
- package/dist-browser/numbl-core/runtime/runtime.d.ts +354 -0
- package/dist-browser/numbl-core/runtime/runtimeDispatch.d.ts +27 -0
- package/dist-browser/numbl-core/runtime/runtimeHelpers.d.ts +31 -0
- package/dist-browser/numbl-core/runtime/runtimeIndexing.d.ts +28 -0
- package/dist-browser/numbl-core/runtime/runtimeMemberAccess.d.ts +26 -0
- package/dist-browser/numbl-core/runtime/runtimeOperators.d.ts +24 -0
- package/dist-browser/numbl-core/runtime/runtimePlot.d.ts +129 -0
- package/dist-browser/numbl-core/runtime/sentinels.d.ts +4 -0
- package/dist-browser/numbl-core/runtime/specialBuiltinNames.d.ts +2 -0
- package/dist-browser/numbl-core/runtime/specialBuiltins.d.ts +13 -0
- package/dist-browser/numbl-core/runtime/struct-access.d.ts +11 -0
- package/dist-browser/numbl-core/runtime/syncChannel.d.ts +1 -0
- package/dist-browser/numbl-core/runtime/tensor-construction.d.ts +10 -0
- package/dist-browser/numbl-core/runtime/types.d.ts +197 -0
- package/dist-browser/numbl-core/runtime/uihtmlSession.d.ts +40 -0
- package/dist-browser/numbl-core/runtime/utils.d.ts +19 -0
- package/dist-browser/numbl-core/stdlib-bundle.d.ts +3 -0
- package/dist-browser/numbl-core/systemAdapter.d.ts +23 -0
- package/dist-browser/numbl-core/version.d.ts +2 -0
- package/dist-browser/numbl-core/workspace/index.d.ts +4 -0
- package/dist-browser/numbl-core/workspace/types.d.ts +24 -0
- package/dist-browser/ts-lapack/src/BLAS/daxpy.d.ts +1 -0
- package/dist-browser/ts-lapack/src/BLAS/dcopy.d.ts +1 -0
- package/dist-browser/ts-lapack/src/BLAS/ddot.d.ts +1 -0
- package/dist-browser/ts-lapack/src/BLAS/dgemm.d.ts +1 -0
- package/dist-browser/ts-lapack/src/BLAS/dgemm_optimized.d.ts +1 -0
- package/dist-browser/ts-lapack/src/BLAS/dgemv.d.ts +1 -0
- package/dist-browser/ts-lapack/src/BLAS/dger.d.ts +1 -0
- package/dist-browser/ts-lapack/src/BLAS/dnrm2.d.ts +1 -0
- package/dist-browser/ts-lapack/src/BLAS/drot.d.ts +1 -0
- package/dist-browser/ts-lapack/src/BLAS/dscal.d.ts +1 -0
- package/dist-browser/ts-lapack/src/BLAS/dswap.d.ts +1 -0
- package/dist-browser/ts-lapack/src/BLAS/dtrmm.d.ts +1 -0
- package/dist-browser/ts-lapack/src/BLAS/dtrmv.d.ts +1 -0
- package/dist-browser/ts-lapack/src/BLAS/dtrsm.d.ts +1 -0
- package/dist-browser/ts-lapack/src/BLAS/idamax.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dbdsqr.d.ts +10 -0
- package/dist-browser/ts-lapack/src/SRC/dgebak.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dgebal.d.ts +5 -0
- package/dist-browser/ts-lapack/src/SRC/dgebd2.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dgebrd.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dgeev.d.ts +3 -0
- package/dist-browser/ts-lapack/src/SRC/dgehd2.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dgehrd.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dgelq2.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dgelqf.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dgeqr2.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dgeqrf.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dgeqrf_optimized.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dgesvd.d.ts +28 -0
- package/dist-browser/ts-lapack/src/SRC/dgetrf.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dgetrf2.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dgetri.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dhseqr.d.ts +32 -0
- package/dist-browser/ts-lapack/src/SRC/dlabrd.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dlacpy.d.ts +18 -0
- package/dist-browser/ts-lapack/src/SRC/dladiv.d.ts +9 -0
- package/dist-browser/ts-lapack/src/SRC/dlaexc.d.ts +21 -0
- package/dist-browser/ts-lapack/src/SRC/dlahqr.d.ts +24 -0
- package/dist-browser/ts-lapack/src/SRC/dlahr2.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dlaln2.d.ts +5 -0
- package/dist-browser/ts-lapack/src/SRC/dlamch.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dlange.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dlanv2.d.ts +12 -0
- package/dist-browser/ts-lapack/src/SRC/dlapy2.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dlaqr1.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dlaqr30.d.ts +81 -0
- package/dist-browser/ts-lapack/src/SRC/dlaqr5.d.ts +38 -0
- package/dist-browser/ts-lapack/src/SRC/dlarf.d.ts +18 -0
- package/dist-browser/ts-lapack/src/SRC/dlarf1f.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dlarfb.d.ts +25 -0
- package/dist-browser/ts-lapack/src/SRC/dlarfg.d.ts +4 -0
- package/dist-browser/ts-lapack/src/SRC/dlarft.d.ts +20 -0
- package/dist-browser/ts-lapack/src/SRC/dlarfx.d.ts +17 -0
- package/dist-browser/ts-lapack/src/SRC/dlartg.d.ts +5 -0
- package/dist-browser/ts-lapack/src/SRC/dlas2.d.ts +4 -0
- package/dist-browser/ts-lapack/src/SRC/dlascl.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dlaset.d.ts +19 -0
- package/dist-browser/ts-lapack/src/SRC/dlasr.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dlassq.d.ts +18 -0
- package/dist-browser/ts-lapack/src/SRC/dlasv2.d.ts +8 -0
- package/dist-browser/ts-lapack/src/SRC/dlaswp.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dlasy2.d.ts +5 -0
- package/dist-browser/ts-lapack/src/SRC/dorg2r.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dorgbr.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dorghr.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dorgl2.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dorglq.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dorgqr.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dorgqr_optimized.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dorm2r.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dormhr.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dormqr.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dpotf2.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dtrevc3.d.ts +27 -0
- package/dist-browser/ts-lapack/src/SRC/dtrexc.d.ts +24 -0
- package/dist-browser/ts-lapack/src/SRC/dtrti2.d.ts +1 -0
- package/dist-browser/ts-lapack/src/SRC/dtrtri.d.ts +1 -0
- package/dist-browser/ts-lapack/src/utils/constants.d.ts +28 -0
- package/dist-browser/ts-lapack/src/utils/iladlc.d.ts +1 -0
- package/dist-browser/ts-lapack/src/utils/iladlr.d.ts +1 -0
- package/dist-browser/ts-lapack/src/utils/ilaenv.d.ts +1 -0
- package/dist-browser/ts-lapack/src/utils/xerbla.d.ts +1 -0
- package/dist-browser/vfs/BrowserFileIOAdapter.d.ts +60 -0
- package/dist-browser/vfs/BrowserSystemAdapter.d.ts +27 -0
- package/dist-browser/vfs/VirtualFileSystem.d.ts +66 -0
- package/dist-browser/vfs/syncVfsChanges.d.ts +23 -0
- package/dist-browser/vfs/unzipToFiles.d.ts +7 -0
- package/dist-cli/cli.js +1527 -205
- package/dist-lib/lib.d.ts +4 -0
- package/dist-lib/lib.js +2217 -199
- package/dist-lib/numbl-core/executors/jit/hostHelpers.d.ts +4 -0
- package/dist-lib/numbl-core/fileIOAdapter.d.ts +13 -0
- package/dist-lib/numbl-core/helpers/scanFormat.d.ts +11 -0
- package/dist-lib/numbl-core/jit/builtins/defs/logical/fieldnames.d.ts +2 -2
- package/dist-lib/numbl-core/jit/builtins/defs/math/rand.d.ts +2 -0
- package/dist-lib/numbl-core/jitDeclineDiagnostics.d.ts +32 -0
- package/dist-lib/numbl-core/jsUserFunctions.d.ts +13 -0
- package/dist-lib/numbl-core/runtime/constructors.d.ts +3 -1
- package/dist-lib/numbl-core/runtime/indexing.d.ts +3 -0
- package/dist-lib/numbl-core/runtime/runtime.d.ts +1 -0
- package/dist-lib/numbl-core/runtime/types.d.ts +15 -1
- package/dist-lib/numbl-core/runtime/utils.d.ts +3 -0
- package/dist-lib/numbl-core/version.d.ts +1 -1
- package/dist-lib/vfs/BrowserFileIOAdapter.d.ts +60 -0
- package/dist-lib/vfs/BrowserSystemAdapter.d.ts +27 -0
- package/dist-lib/vfs/VirtualFileSystem.d.ts +66 -0
- package/dist-site-viewer/assets/index-CT9HA1Pn.js +4831 -0
- package/dist-site-viewer/assets/numbl-worker-CYPflGmm.js +5246 -0
- package/dist-site-viewer/index.html +1 -1
- package/package.json +9 -3
- package/dist-site-viewer/assets/index-RucHpf4b.js +0 -4826
- 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
|
-
|
|
31858
|
+
this.parseFuncArg(args);
|
|
31564
31859
|
while (this.consume(47 /* Comma */)) {
|
|
31565
|
-
|
|
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
|
-
|
|
31889
|
+
this.parseFuncArg(args);
|
|
31595
31890
|
while (this.consume(47 /* Comma */)) {
|
|
31596
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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: [
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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 (!
|
|
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
|
|
48090
|
-
|
|
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 (!
|
|
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
|
|
48118
|
-
if (ic)
|
|
48119
|
-
|
|
48120
|
-
|
|
48121
|
-
|
|
48122
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
48720
|
-
|
|
48721
|
-
|
|
48722
|
-
|
|
48723
|
-
|
|
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
|
|
49405
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
66163
|
+
if (isRuntimeString(rv)) return 1;
|
|
65073
66164
|
if (isRuntimeClassInstance(rv)) {
|
|
65074
|
-
|
|
65075
|
-
|
|
65076
|
-
|
|
65077
|
-
|
|
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
|
|
66789
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
68549
|
-
|
|
68550
|
-
|
|
68551
|
-
|
|
68552
|
-
|
|
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,
|
|
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(
|
|
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
|
|
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
|
|
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, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
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(
|