numbl 0.4.8 → 0.4.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +1290 -197
- package/dist-lib/lib.js +1284 -197
- 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/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 +6 -0
- package/dist-site-viewer/assets/{index-C-wfkZK0.js → index-CT9HA1Pn.js} +318 -316
- 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/numbl-worker-Bnbz2rMQ.js +0 -5228
package/dist-lib/lib.js
CHANGED
|
@@ -110,6 +110,7 @@ var isRuntimeStructArray = (value) => typeof value === "object" && value !== nul
|
|
|
110
110
|
var isRuntimeClassInstanceArray = (value) => typeof value === "object" && value !== null && value.kind === "class_instance_array";
|
|
111
111
|
var isRuntimeSparseMatrix = (value) => typeof value === "object" && value !== null && value.kind === "sparse_matrix";
|
|
112
112
|
var isRuntimeDictionary = (value) => typeof value === "object" && value !== null && value.kind === "dictionary";
|
|
113
|
+
var isRuntimeStringArray = (value) => typeof value === "object" && value !== null && value.kind === "string_array";
|
|
113
114
|
var kstr = (value) => {
|
|
114
115
|
if (isRuntimeNumber(value)) return "number";
|
|
115
116
|
if (isRuntimeLogical(value)) return "logical";
|
|
@@ -128,6 +129,7 @@ var kstr = (value) => {
|
|
|
128
129
|
if (isRuntimeStructArray(value)) return "struct array";
|
|
129
130
|
if (isRuntimeSparseMatrix(value)) return "sparse matrix";
|
|
130
131
|
if (isRuntimeDictionary(value)) return "dictionary";
|
|
132
|
+
if (isRuntimeStringArray(value)) return "string array";
|
|
131
133
|
return "unknown";
|
|
132
134
|
};
|
|
133
135
|
var RuntimeTensor = class extends Refcounted {
|
|
@@ -159,6 +161,24 @@ var RuntimeChar = class extends Refcounted {
|
|
|
159
161
|
this.shape = shape;
|
|
160
162
|
}
|
|
161
163
|
};
|
|
164
|
+
var RuntimeStringArray = class extends Refcounted {
|
|
165
|
+
kind = "string_array";
|
|
166
|
+
/** Elements in column-major order (plain JS strings). */
|
|
167
|
+
data;
|
|
168
|
+
/** 2-D shape [rows, cols]; data.length === rows*cols. A 1x1 string is
|
|
169
|
+
* normally represented as a primitive JS string, not a 1x1 array —
|
|
170
|
+
* use stringArrayValue() to build results so scalars collapse. */
|
|
171
|
+
shape;
|
|
172
|
+
constructor(data, shape) {
|
|
173
|
+
super();
|
|
174
|
+
this.data = data;
|
|
175
|
+
this.shape = shape;
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
function stringArrayValue(data, shape) {
|
|
179
|
+
if (data.length === 1 && shape[0] === 1 && shape[1] === 1) return data[0];
|
|
180
|
+
return new RuntimeStringArray(data, shape);
|
|
181
|
+
}
|
|
162
182
|
var RuntimeCell = class extends Refcounted {
|
|
163
183
|
kind = "cell";
|
|
164
184
|
data;
|
|
@@ -613,6 +633,29 @@ function sub2ind(shape, subs) {
|
|
|
613
633
|
}
|
|
614
634
|
return idx;
|
|
615
635
|
}
|
|
636
|
+
function matlabNumToString(n) {
|
|
637
|
+
if (n === Infinity) return "Inf";
|
|
638
|
+
if (n === -Infinity) return "-Inf";
|
|
639
|
+
if (isNaN(n)) return "NaN";
|
|
640
|
+
if (n === 0) return "0";
|
|
641
|
+
if (Number.isInteger(n)) return String(n);
|
|
642
|
+
const prec = 5;
|
|
643
|
+
const exp2 = Math.floor(Math.log10(Math.abs(n)));
|
|
644
|
+
let s;
|
|
645
|
+
if (exp2 < -4 || exp2 >= prec) {
|
|
646
|
+
s = n.toExponential(prec - 1);
|
|
647
|
+
const ePos = s.indexOf("e");
|
|
648
|
+
let mantissa = s.slice(0, ePos);
|
|
649
|
+
const expPart0 = s.slice(ePos);
|
|
650
|
+
if (mantissa.includes(".")) mantissa = mantissa.replace(/\.?0+$/, "");
|
|
651
|
+
const expPart = expPart0.replace(/([eE][+-])(\d)$/, "$10$2");
|
|
652
|
+
s = mantissa + expPart;
|
|
653
|
+
} else {
|
|
654
|
+
s = n.toPrecision(prec);
|
|
655
|
+
if (s.includes(".")) s = s.replace(/\.?0+$/, "");
|
|
656
|
+
}
|
|
657
|
+
return s;
|
|
658
|
+
}
|
|
616
659
|
|
|
617
660
|
// src/numbl-core/runtime/convert.ts
|
|
618
661
|
function toNumber(v) {
|
|
@@ -689,6 +732,11 @@ function toString(v) {
|
|
|
689
732
|
switch (v.kind) {
|
|
690
733
|
case "char":
|
|
691
734
|
return v.value;
|
|
735
|
+
case "string_array":
|
|
736
|
+
if (v.data.length === 1) return v.data[0];
|
|
737
|
+
throw new RuntimeError(
|
|
738
|
+
"Expected a scalar text value, got a string array"
|
|
739
|
+
);
|
|
692
740
|
default:
|
|
693
741
|
throw new RuntimeError(`Cannot convert ${kstr(v)} to string`);
|
|
694
742
|
}
|
|
@@ -748,6 +796,15 @@ var valuesAreEqual = (a, b) => {
|
|
|
748
796
|
}
|
|
749
797
|
case "dictionary":
|
|
750
798
|
return a === b;
|
|
799
|
+
case "string_array": {
|
|
800
|
+
const sb = b;
|
|
801
|
+
if (a.shape[0] !== sb.shape[0] || a.shape[1] !== sb.shape[1])
|
|
802
|
+
return false;
|
|
803
|
+
for (let i = 0; i < a.data.length; i++) {
|
|
804
|
+
if (a.data[i] !== sb.data[i]) return false;
|
|
805
|
+
}
|
|
806
|
+
return true;
|
|
807
|
+
}
|
|
751
808
|
default:
|
|
752
809
|
return false;
|
|
753
810
|
}
|
|
@@ -800,7 +857,34 @@ function displayValue(v) {
|
|
|
800
857
|
return formatDictionary(v);
|
|
801
858
|
case "class_instance_array":
|
|
802
859
|
return ` ${v.shape[0]}x${v.shape[1]} ${v.className} array`;
|
|
860
|
+
case "string_array":
|
|
861
|
+
return formatStringArray(v);
|
|
862
|
+
}
|
|
863
|
+
}
|
|
864
|
+
function formatStringArray(v) {
|
|
865
|
+
const [rows, cols] = v.shape;
|
|
866
|
+
if (v.data.length === 0) {
|
|
867
|
+
return ` ${rows}x${cols} empty string array`;
|
|
868
|
+
}
|
|
869
|
+
const quoted = v.data.map((s) => `"${s}"`);
|
|
870
|
+
const widths = [];
|
|
871
|
+
for (let c = 0; c < cols; c++) {
|
|
872
|
+
let w = 0;
|
|
873
|
+
for (let r = 0; r < rows; r++) {
|
|
874
|
+
w = Math.max(w, quoted[c * rows + r].length);
|
|
875
|
+
}
|
|
876
|
+
widths.push(w);
|
|
877
|
+
}
|
|
878
|
+
const lines = [];
|
|
879
|
+
for (let r = 0; r < rows; r++) {
|
|
880
|
+
const parts = [];
|
|
881
|
+
for (let c = 0; c < cols; c++) {
|
|
882
|
+
const q = quoted[c * rows + r];
|
|
883
|
+
parts.push(c === cols - 1 ? q : q.padEnd(widths[c]));
|
|
884
|
+
}
|
|
885
|
+
lines.push(" " + parts.join(" "));
|
|
803
886
|
}
|
|
887
|
+
return lines.join("\n");
|
|
804
888
|
}
|
|
805
889
|
var formatStructArray = (v) => {
|
|
806
890
|
const elements = v.elements;
|
|
@@ -1115,6 +1199,10 @@ var RTV = {
|
|
|
1115
1199
|
string(value) {
|
|
1116
1200
|
return value;
|
|
1117
1201
|
},
|
|
1202
|
+
/** String array (does NOT collapse 1x1 — use stringArrayValue for that). */
|
|
1203
|
+
stringArray(data, shape) {
|
|
1204
|
+
return new RuntimeStringArray(data, shape);
|
|
1205
|
+
},
|
|
1118
1206
|
char(value) {
|
|
1119
1207
|
return new RuntimeChar(value);
|
|
1120
1208
|
},
|
|
@@ -22719,6 +22807,28 @@ function coerceToConcatString(v) {
|
|
|
22719
22807
|
return null;
|
|
22720
22808
|
}
|
|
22721
22809
|
function mAdd(a, b) {
|
|
22810
|
+
if (isRuntimeStringArray(a) || isRuntimeStringArray(b)) {
|
|
22811
|
+
const sa = isRuntimeStringArray(a) ? a : null;
|
|
22812
|
+
const sb = isRuntimeStringArray(b) ? b : null;
|
|
22813
|
+
if (sa && sb) {
|
|
22814
|
+
if (sa.shape[0] !== sb.shape[0] || sa.shape[1] !== sb.shape[1]) {
|
|
22815
|
+
throw new RuntimeError("Array dimensions must match for string plus");
|
|
22816
|
+
}
|
|
22817
|
+
return stringArrayValue(
|
|
22818
|
+
sa.data.map((s, i) => s + sb.data[i]),
|
|
22819
|
+
sa.shape
|
|
22820
|
+
);
|
|
22821
|
+
}
|
|
22822
|
+
const arr = sa ?? sb;
|
|
22823
|
+
const other = coerceToConcatString(sa ? b : a);
|
|
22824
|
+
if (other === null) {
|
|
22825
|
+
throw new RuntimeError("Cannot concatenate this value with a string");
|
|
22826
|
+
}
|
|
22827
|
+
return stringArrayValue(
|
|
22828
|
+
arr.data.map((s) => sa ? s + other : other + s),
|
|
22829
|
+
arr.shape
|
|
22830
|
+
);
|
|
22831
|
+
}
|
|
22722
22832
|
if (isRuntimeString(a) || isRuntimeString(b)) {
|
|
22723
22833
|
const aStr = coerceToConcatString(a);
|
|
22724
22834
|
const bStr = coerceToConcatString(b);
|
|
@@ -23225,12 +23335,24 @@ function transposeClassInstanceArray(v) {
|
|
|
23225
23335
|
}
|
|
23226
23336
|
return new RuntimeClassInstanceArray(v.className, out, [c, r]);
|
|
23227
23337
|
}
|
|
23338
|
+
function transposeStringArray(v) {
|
|
23339
|
+
const [r, c] = v.shape;
|
|
23340
|
+
const out = new Array(r * c);
|
|
23341
|
+
for (let i = 0; i < r; i++) {
|
|
23342
|
+
for (let j = 0; j < c; j++) {
|
|
23343
|
+
out[i * c + j] = v.data[j * r + i];
|
|
23344
|
+
}
|
|
23345
|
+
}
|
|
23346
|
+
return stringArrayValue(out, [c, r]);
|
|
23347
|
+
}
|
|
23228
23348
|
function mTranspose(v) {
|
|
23229
23349
|
if (isRuntimeSparseMatrix(v)) return sparseTranspose(v);
|
|
23230
23350
|
if (isRuntimeComplexNumber(v)) return v;
|
|
23231
23351
|
if (isRuntimeNumber(v) || isRuntimeLogical(v)) return v;
|
|
23232
23352
|
if (isRuntimeCell(v)) return transposeCellArray(v);
|
|
23233
23353
|
if (isRuntimeChar(v)) return v;
|
|
23354
|
+
if (isRuntimeString(v)) return v;
|
|
23355
|
+
if (isRuntimeStringArray(v)) return transposeStringArray(v);
|
|
23234
23356
|
if (isRuntimeClassInstance(v)) return v;
|
|
23235
23357
|
if (isRuntimeClassInstanceArray(v)) return transposeClassInstanceArray(v);
|
|
23236
23358
|
if (!isRuntimeTensor(v))
|
|
@@ -23243,6 +23365,8 @@ function mConjugateTranspose(v) {
|
|
|
23243
23365
|
if (isRuntimeNumber(v) || isRuntimeLogical(v)) return v;
|
|
23244
23366
|
if (isRuntimeCell(v)) return transposeCellArray(v);
|
|
23245
23367
|
if (isRuntimeChar(v)) return v;
|
|
23368
|
+
if (isRuntimeString(v)) return v;
|
|
23369
|
+
if (isRuntimeStringArray(v)) return transposeStringArray(v);
|
|
23246
23370
|
if (isRuntimeClassInstance(v)) return v;
|
|
23247
23371
|
if (isRuntimeClassInstanceArray(v)) return transposeClassInstanceArray(v);
|
|
23248
23372
|
if (!isRuntimeTensor(v))
|
|
@@ -23255,7 +23379,38 @@ function asStringPair(a, b) {
|
|
|
23255
23379
|
if (isRuntimeChar(a) && isRuntimeString(b)) return [a.value, b];
|
|
23256
23380
|
return null;
|
|
23257
23381
|
}
|
|
23382
|
+
function textOperandElems(v) {
|
|
23383
|
+
if (isRuntimeString(v)) return { data: [v], shape: [1, 1] };
|
|
23384
|
+
if (isRuntimeChar(v)) {
|
|
23385
|
+
const rows = v.shape ? v.shape[0] : 1;
|
|
23386
|
+
if (rows > 1) return null;
|
|
23387
|
+
return { data: [v.value], shape: [1, 1] };
|
|
23388
|
+
}
|
|
23389
|
+
if (isRuntimeStringArray(v)) return { data: v.data, shape: v.shape };
|
|
23390
|
+
return null;
|
|
23391
|
+
}
|
|
23258
23392
|
function stringComparisonOp(a, b, op) {
|
|
23393
|
+
if (isRuntimeStringArray(a) || isRuntimeStringArray(b)) {
|
|
23394
|
+
const ta = textOperandElems(a);
|
|
23395
|
+
const tb = textOperandElems(b);
|
|
23396
|
+
if (ta === null || tb === null) return null;
|
|
23397
|
+
const aScalar = ta.data.length === 1 && ta.shape[0] * ta.shape[1] === 1;
|
|
23398
|
+
const bScalar = tb.data.length === 1 && tb.shape[0] * tb.shape[1] === 1;
|
|
23399
|
+
if (!aScalar && !bScalar && (ta.shape[0] !== tb.shape[0] || ta.shape[1] !== tb.shape[1])) {
|
|
23400
|
+
throw new RuntimeError("Array dimensions must match for comparison");
|
|
23401
|
+
}
|
|
23402
|
+
const shape = aScalar ? tb.shape : ta.shape;
|
|
23403
|
+
const n = aScalar ? tb.data.length : ta.data.length;
|
|
23404
|
+
const out = allocFloat64Array(n);
|
|
23405
|
+
for (let i = 0; i < n; i++) {
|
|
23406
|
+
const x = aScalar ? ta.data[0] : ta.data[i];
|
|
23407
|
+
const y = bScalar ? tb.data[0] : tb.data[i];
|
|
23408
|
+
out[i] = op(x, y) ? 1 : 0;
|
|
23409
|
+
}
|
|
23410
|
+
const t = RTV.tensor(out, [shape[0], shape[1]]);
|
|
23411
|
+
t._isLogical = true;
|
|
23412
|
+
return t;
|
|
23413
|
+
}
|
|
23259
23414
|
const pair = asStringPair(a, b);
|
|
23260
23415
|
if (pair === null) return null;
|
|
23261
23416
|
return RTV.logical(op(pair[0], pair[1]));
|
|
@@ -24638,6 +24793,68 @@ function indexIntoChar(base, indices) {
|
|
|
24638
24793
|
}
|
|
24639
24794
|
throw new RuntimeError("Char indexing supports 1 or 2 dimensions");
|
|
24640
24795
|
}
|
|
24796
|
+
function stringArraySubscript(idx, extent) {
|
|
24797
|
+
if (isColonIndex(idx)) {
|
|
24798
|
+
return Array.from({ length: extent }, (_, i) => i);
|
|
24799
|
+
}
|
|
24800
|
+
if (isRuntimeTensor(idx)) {
|
|
24801
|
+
if (idx._isLogical) {
|
|
24802
|
+
const out = [];
|
|
24803
|
+
for (let i = 0; i < idx.data.length; i++)
|
|
24804
|
+
if (idx.data[i] !== 0) out.push(i);
|
|
24805
|
+
return out;
|
|
24806
|
+
}
|
|
24807
|
+
return Array.from(idx.data, (v) => Math.round(v) - 1);
|
|
24808
|
+
}
|
|
24809
|
+
if (isRuntimeLogical(idx)) return idx ? [0] : [];
|
|
24810
|
+
return [Math.round(toNumber(idx)) - 1];
|
|
24811
|
+
}
|
|
24812
|
+
function indexIntoStringArray(base, indices) {
|
|
24813
|
+
const [rows, cols] = base.shape;
|
|
24814
|
+
const total = base.data.length;
|
|
24815
|
+
if (indices.length === 2) {
|
|
24816
|
+
const ri = stringArraySubscript(indices[0], rows);
|
|
24817
|
+
const ci = stringArraySubscript(indices[1], cols);
|
|
24818
|
+
const out2 = [];
|
|
24819
|
+
for (const c of ci) {
|
|
24820
|
+
if (c < 0 || c >= cols)
|
|
24821
|
+
throw new RuntimeError("Index exceeds array bounds");
|
|
24822
|
+
for (const r of ri) {
|
|
24823
|
+
if (r < 0 || r >= rows)
|
|
24824
|
+
throw new RuntimeError("Index exceeds array bounds");
|
|
24825
|
+
out2.push(base.data[c * rows + r]);
|
|
24826
|
+
}
|
|
24827
|
+
}
|
|
24828
|
+
return stringArrayValue(out2, [ri.length, ci.length]);
|
|
24829
|
+
}
|
|
24830
|
+
if (indices.length !== 1) {
|
|
24831
|
+
throw new RuntimeError("String array indexing supports 1 or 2 subscripts");
|
|
24832
|
+
}
|
|
24833
|
+
const idx = indices[0];
|
|
24834
|
+
if (isColonIndex(idx)) {
|
|
24835
|
+
return stringArrayValue(base.data.slice(), [total, 1]);
|
|
24836
|
+
}
|
|
24837
|
+
const linear = stringArraySubscript(idx, total);
|
|
24838
|
+
const out = [];
|
|
24839
|
+
for (const i of linear) {
|
|
24840
|
+
if (i < 0 || i >= total)
|
|
24841
|
+
throw new RuntimeError("Index exceeds array bounds");
|
|
24842
|
+
out.push(base.data[i]);
|
|
24843
|
+
}
|
|
24844
|
+
let shape;
|
|
24845
|
+
if (rows === 1 || cols === 1) {
|
|
24846
|
+
shape = rows === 1 ? [1, out.length] : [out.length, 1];
|
|
24847
|
+
} else if (isRuntimeTensor(idx) && !idx._isLogical) {
|
|
24848
|
+
const is = idx.shape;
|
|
24849
|
+
const im = is.length >= 2 ? is[0] : 1;
|
|
24850
|
+
shape = [im, out.length / (im || 1)];
|
|
24851
|
+
} else if (isRuntimeTensor(idx) && idx._isLogical) {
|
|
24852
|
+
shape = [out.length, 1];
|
|
24853
|
+
} else {
|
|
24854
|
+
shape = [1, out.length];
|
|
24855
|
+
}
|
|
24856
|
+
return stringArrayValue(out, shape);
|
|
24857
|
+
}
|
|
24641
24858
|
function indexIntoLogical(base, indices) {
|
|
24642
24859
|
if (indices.length === 1) {
|
|
24643
24860
|
const idx = indices[0];
|
|
@@ -24768,6 +24985,9 @@ function indexIntoRTValue(base, indices) {
|
|
|
24768
24985
|
return base;
|
|
24769
24986
|
}
|
|
24770
24987
|
}
|
|
24988
|
+
if (isRuntimeStringArray(base)) {
|
|
24989
|
+
return indexIntoStringArray(base, indices);
|
|
24990
|
+
}
|
|
24771
24991
|
if (isRuntimeLogical(base)) {
|
|
24772
24992
|
return indexIntoLogical(base, indices);
|
|
24773
24993
|
}
|
|
@@ -25589,26 +25809,18 @@ function horzcat(...values) {
|
|
|
25589
25809
|
if (values.some((v) => isRuntimeCell(v))) {
|
|
25590
25810
|
return cellCatAlongDim(values, 1);
|
|
25591
25811
|
}
|
|
25812
|
+
if (values.some((v) => isRuntimeString(v) || isRuntimeStringArray(v))) {
|
|
25813
|
+
return stringCat(values, 1);
|
|
25814
|
+
}
|
|
25592
25815
|
if (values.some((v) => isRuntimeChar(v))) {
|
|
25593
25816
|
let result = "";
|
|
25594
25817
|
for (const v of values) {
|
|
25595
25818
|
if (isRuntimeChar(v)) result += v.value;
|
|
25596
|
-
else if (isRuntimeString(v)) result += v;
|
|
25597
25819
|
else if (isRuntimeNumber(v)) result += String.fromCharCode(Math.round(v));
|
|
25598
25820
|
else throw new RuntimeError(`Cannot concatenate ${kstr(v)} into char`);
|
|
25599
25821
|
}
|
|
25600
25822
|
return RTV.char(result);
|
|
25601
25823
|
}
|
|
25602
|
-
if (values.some((v) => isRuntimeString(v) || isRuntimeChar(v))) {
|
|
25603
|
-
let result = "";
|
|
25604
|
-
for (const v of values) {
|
|
25605
|
-
if (isRuntimeString(v)) result += v;
|
|
25606
|
-
else if (isRuntimeChar(v)) result += v.value;
|
|
25607
|
-
else if (isRuntimeNumber(v)) result += String(v);
|
|
25608
|
-
else throw new RuntimeError(`Cannot concatenate ${v} into string`);
|
|
25609
|
-
}
|
|
25610
|
-
return RTV.string(result);
|
|
25611
|
-
}
|
|
25612
25824
|
if (values.some((v) => isRuntimeStruct(v) || isRuntimeStructArray(v))) {
|
|
25613
25825
|
return structCat(values);
|
|
25614
25826
|
}
|
|
@@ -25623,6 +25835,9 @@ function vertcat(...values) {
|
|
|
25623
25835
|
if (values.some((v) => isRuntimeCell(v))) {
|
|
25624
25836
|
return cellCatAlongDim(values, 0);
|
|
25625
25837
|
}
|
|
25838
|
+
if (values.some((v) => isRuntimeString(v) || isRuntimeStringArray(v))) {
|
|
25839
|
+
return stringCat(values, 0);
|
|
25840
|
+
}
|
|
25626
25841
|
if (values.some((v) => isRuntimeChar(v))) {
|
|
25627
25842
|
return vertcatChars(values);
|
|
25628
25843
|
}
|
|
@@ -25631,6 +25846,86 @@ function vertcat(...values) {
|
|
|
25631
25846
|
}
|
|
25632
25847
|
return catAlongDim(values, 0);
|
|
25633
25848
|
}
|
|
25849
|
+
function toStringBlock(v) {
|
|
25850
|
+
if (isRuntimeString(v)) return { data: [v], rows: 1, cols: 1 };
|
|
25851
|
+
if (isRuntimeStringArray(v)) {
|
|
25852
|
+
if (v.data.length === 0) return null;
|
|
25853
|
+
return { data: v.data.slice(), rows: v.shape[0], cols: v.shape[1] };
|
|
25854
|
+
}
|
|
25855
|
+
if (isRuntimeChar(v)) {
|
|
25856
|
+
const rows = v.shape ? v.shape[0] : 1;
|
|
25857
|
+
const width = v.shape ? v.shape[1] : v.value.length;
|
|
25858
|
+
if (rows <= 1) return { data: [v.value], rows: 1, cols: 1 };
|
|
25859
|
+
const out = [];
|
|
25860
|
+
for (let r = 0; r < rows; r++) {
|
|
25861
|
+
out.push(v.value.slice(r * width, (r + 1) * width));
|
|
25862
|
+
}
|
|
25863
|
+
return { data: out, rows, cols: 1 };
|
|
25864
|
+
}
|
|
25865
|
+
if (isRuntimeNumber(v)) {
|
|
25866
|
+
return { data: [matlabNumToString(v)], rows: 1, cols: 1 };
|
|
25867
|
+
}
|
|
25868
|
+
if (isRuntimeLogical(v)) {
|
|
25869
|
+
return { data: [v ? "true" : "false"], rows: 1, cols: 1 };
|
|
25870
|
+
}
|
|
25871
|
+
if (isRuntimeTensor(v)) {
|
|
25872
|
+
if (v.data.length === 0) return null;
|
|
25873
|
+
const rows = v.shape.length >= 2 ? v.shape[0] : 1;
|
|
25874
|
+
const cols = v.data.length / (rows || 1);
|
|
25875
|
+
const out = [];
|
|
25876
|
+
for (let i = 0; i < v.data.length; i++) {
|
|
25877
|
+
out.push(
|
|
25878
|
+
v._isLogical ? v.data[i] ? "true" : "false" : matlabNumToString(v.data[i])
|
|
25879
|
+
);
|
|
25880
|
+
}
|
|
25881
|
+
return { data: out, rows, cols };
|
|
25882
|
+
}
|
|
25883
|
+
throw new RuntimeError(`Cannot concatenate ${kstr(v)} into string array`);
|
|
25884
|
+
}
|
|
25885
|
+
function stringCat(values, dim) {
|
|
25886
|
+
const blocks = [];
|
|
25887
|
+
for (const v of values) {
|
|
25888
|
+
const b = toStringBlock(v);
|
|
25889
|
+
if (b) blocks.push(b);
|
|
25890
|
+
}
|
|
25891
|
+
if (blocks.length === 0) return RTV.stringArray([], [0, 0]);
|
|
25892
|
+
if (dim === 1) {
|
|
25893
|
+
const rows2 = blocks[0].rows;
|
|
25894
|
+
let cols2 = 0;
|
|
25895
|
+
for (const b of blocks) {
|
|
25896
|
+
if (b.rows !== rows2) {
|
|
25897
|
+
throw new RuntimeError(
|
|
25898
|
+
"Dimensions of arrays being concatenated are not consistent"
|
|
25899
|
+
);
|
|
25900
|
+
}
|
|
25901
|
+
cols2 += b.cols;
|
|
25902
|
+
}
|
|
25903
|
+
const data2 = [];
|
|
25904
|
+
for (const b of blocks) data2.push(...b.data);
|
|
25905
|
+
return stringArrayValue(data2, [rows2, cols2]);
|
|
25906
|
+
}
|
|
25907
|
+
const cols = blocks[0].cols;
|
|
25908
|
+
let rows = 0;
|
|
25909
|
+
for (const b of blocks) {
|
|
25910
|
+
if (b.cols !== cols) {
|
|
25911
|
+
throw new RuntimeError(
|
|
25912
|
+
"Dimensions of arrays being concatenated are not consistent"
|
|
25913
|
+
);
|
|
25914
|
+
}
|
|
25915
|
+
rows += b.rows;
|
|
25916
|
+
}
|
|
25917
|
+
const data = new Array(rows * cols);
|
|
25918
|
+
let rOff = 0;
|
|
25919
|
+
for (const b of blocks) {
|
|
25920
|
+
for (let c = 0; c < cols; c++) {
|
|
25921
|
+
for (let r = 0; r < b.rows; r++) {
|
|
25922
|
+
data[c * rows + rOff + r] = b.data[c * b.rows + r];
|
|
25923
|
+
}
|
|
25924
|
+
}
|
|
25925
|
+
rOff += b.rows;
|
|
25926
|
+
}
|
|
25927
|
+
return stringArrayValue(data, [rows, cols]);
|
|
25928
|
+
}
|
|
25634
25929
|
function vertcatChars(values) {
|
|
25635
25930
|
let cols = null;
|
|
25636
25931
|
let totalRows = 0;
|
|
@@ -29860,9 +30155,9 @@ var ExpressionParser = class extends ParserBase {
|
|
|
29860
30155
|
if (this.consume(50 /* LParen */)) {
|
|
29861
30156
|
const args = [];
|
|
29862
30157
|
if (!this.consume(51 /* RParen */)) {
|
|
29863
|
-
|
|
30158
|
+
this.parseFuncArg(args);
|
|
29864
30159
|
while (this.consume(47 /* Comma */)) {
|
|
29865
|
-
|
|
30160
|
+
this.parseFuncArg(args);
|
|
29866
30161
|
}
|
|
29867
30162
|
if (!this.consume(51 /* RParen */)) {
|
|
29868
30163
|
throw this.error("expected ')' after method arguments");
|
|
@@ -29891,9 +30186,9 @@ var ExpressionParser = class extends ParserBase {
|
|
|
29891
30186
|
}
|
|
29892
30187
|
const args = [];
|
|
29893
30188
|
if (!this.consume(51 /* RParen */)) {
|
|
29894
|
-
|
|
30189
|
+
this.parseFuncArg(args);
|
|
29895
30190
|
while (this.consume(47 /* Comma */)) {
|
|
29896
|
-
|
|
30191
|
+
this.parseFuncArg(args);
|
|
29897
30192
|
}
|
|
29898
30193
|
if (!this.consume(51 /* RParen */)) {
|
|
29899
30194
|
throw this.error("expected ')' after super call arguments");
|
|
@@ -30740,13 +31035,8 @@ var FunctionParser = class extends ArgumentsParser {
|
|
|
30740
31035
|
}
|
|
30741
31036
|
}
|
|
30742
31037
|
const vararginIdx = params.indexOf("varargin");
|
|
30743
|
-
if (vararginIdx !== -1) {
|
|
30744
|
-
|
|
30745
|
-
throw this.error("'varargin' must be the last input parameter");
|
|
30746
|
-
}
|
|
30747
|
-
if (params.filter((p2) => p2 === "varargin").length > 1) {
|
|
30748
|
-
throw this.error("'varargin' cannot appear more than once");
|
|
30749
|
-
}
|
|
31038
|
+
if (vararginIdx !== -1 && params.filter((p2) => p2 === "varargin").length > 1) {
|
|
31039
|
+
throw this.error("'varargin' cannot appear more than once");
|
|
30750
31040
|
}
|
|
30751
31041
|
const varargoutIdx = outputs.indexOf("varargout");
|
|
30752
31042
|
if (varargoutIdx !== -1) {
|
|
@@ -30758,6 +31048,22 @@ var FunctionParser = class extends ArgumentsParser {
|
|
|
30758
31048
|
}
|
|
30759
31049
|
}
|
|
30760
31050
|
const argumentsBlocks = this.parseArgumentsBlocks();
|
|
31051
|
+
if (vararginIdx !== -1 && vararginIdx !== params.length - 1) {
|
|
31052
|
+
const nvBases = /* @__PURE__ */ new Set();
|
|
31053
|
+
for (const block of argumentsBlocks) {
|
|
31054
|
+
if (block.kind === "Output" || block.kind === "OutputRepeating")
|
|
31055
|
+
continue;
|
|
31056
|
+
for (const e of block.entries) {
|
|
31057
|
+
const dot2 = e.name.indexOf(".");
|
|
31058
|
+
if (dot2 >= 0) nvBases.add(e.name.slice(0, dot2));
|
|
31059
|
+
}
|
|
31060
|
+
}
|
|
31061
|
+
for (const p2 of params.slice(vararginIdx + 1)) {
|
|
31062
|
+
if (!nvBases.has(p2)) {
|
|
31063
|
+
throw this.error("'varargin' must be the last input parameter");
|
|
31064
|
+
}
|
|
31065
|
+
}
|
|
31066
|
+
}
|
|
30761
31067
|
const body = this.parseBlock((t) => t === 15 /* End */);
|
|
30762
31068
|
if (!this.consume(15 /* End */)) {
|
|
30763
31069
|
throw this.error("expected 'end'");
|
|
@@ -32170,6 +32476,16 @@ function forIter(v) {
|
|
|
32170
32476
|
if (isRuntimeChar(mv)) {
|
|
32171
32477
|
return Array.from(mv.value).map((c) => RTV.char(c));
|
|
32172
32478
|
}
|
|
32479
|
+
if (isRuntimeStringArray(mv)) {
|
|
32480
|
+
const [rows, cols] = mv.shape;
|
|
32481
|
+
const out = [];
|
|
32482
|
+
for (let c = 0; c < cols; c++) {
|
|
32483
|
+
out.push(
|
|
32484
|
+
stringArrayValue(mv.data.slice(c * rows, (c + 1) * rows), [rows, 1])
|
|
32485
|
+
);
|
|
32486
|
+
}
|
|
32487
|
+
return out;
|
|
32488
|
+
}
|
|
32173
32489
|
return [v];
|
|
32174
32490
|
}
|
|
32175
32491
|
function emptyTensor() {
|
|
@@ -34601,6 +34917,13 @@ function valuesEqualSimple(a, b) {
|
|
|
34601
34917
|
}
|
|
34602
34918
|
return true;
|
|
34603
34919
|
}
|
|
34920
|
+
if (isRuntimeStringArray(a) && isRuntimeStringArray(b)) {
|
|
34921
|
+
if (a.shape[0] !== b.shape[0] || a.shape[1] !== b.shape[1]) return false;
|
|
34922
|
+
for (let i = 0; i < a.data.length; i++) {
|
|
34923
|
+
if (a.data[i] !== b.data[i]) return false;
|
|
34924
|
+
}
|
|
34925
|
+
return true;
|
|
34926
|
+
}
|
|
34604
34927
|
return false;
|
|
34605
34928
|
}
|
|
34606
34929
|
function textValue(v) {
|
|
@@ -34873,6 +35196,7 @@ function getShape(v) {
|
|
|
34873
35196
|
if (isRuntimeCell(v)) return v.shape;
|
|
34874
35197
|
if (isRuntimeStructArray(v)) return [1, v.elements.length];
|
|
34875
35198
|
if (isRuntimeClassInstanceArray(v)) return [...v.shape];
|
|
35199
|
+
if (isRuntimeStringArray(v)) return [...v.shape];
|
|
34876
35200
|
return [1, 1];
|
|
34877
35201
|
}
|
|
34878
35202
|
defineBuiltin({
|
|
@@ -34928,7 +35252,11 @@ defineBuiltin({
|
|
|
34928
35252
|
});
|
|
34929
35253
|
defineBuiltin({
|
|
34930
35254
|
name: "isstring",
|
|
34931
|
-
cases: [
|
|
35255
|
+
cases: [
|
|
35256
|
+
anyToLogicalCase(
|
|
35257
|
+
(args) => isRuntimeString(args[0]) || isRuntimeStringArray(args[0])
|
|
35258
|
+
)
|
|
35259
|
+
]
|
|
34932
35260
|
});
|
|
34933
35261
|
var MATLAB_KEYWORDS = /* @__PURE__ */ new Set([
|
|
34934
35262
|
"break",
|
|
@@ -35111,6 +35439,7 @@ defineBuiltin({
|
|
|
35111
35439
|
if (isRuntimeString(v)) return false;
|
|
35112
35440
|
if (isRuntimeStructArray(v)) return v.elements.length === 0;
|
|
35113
35441
|
if (isRuntimeClassInstanceArray(v)) return v.elements.length === 0;
|
|
35442
|
+
if (isRuntimeStringArray(v)) return v.data.length === 0;
|
|
35114
35443
|
return false;
|
|
35115
35444
|
})
|
|
35116
35445
|
]
|
|
@@ -35165,6 +35494,7 @@ defineBuiltin({
|
|
|
35165
35494
|
if (isRuntimeString(v)) return 1;
|
|
35166
35495
|
if (isRuntimeStructArray(v)) return v.elements.length;
|
|
35167
35496
|
if (isRuntimeClassInstanceArray(v)) return v.elements.length;
|
|
35497
|
+
if (isRuntimeStringArray(v)) return v.data.length;
|
|
35168
35498
|
return 1;
|
|
35169
35499
|
}
|
|
35170
35500
|
}
|
|
@@ -35195,6 +35525,8 @@ defineBuiltin({
|
|
|
35195
35525
|
if (isRuntimeStructArray(v)) return v.elements.length;
|
|
35196
35526
|
if (isRuntimeClassInstanceArray(v))
|
|
35197
35527
|
return v.elements.length === 0 ? 0 : Math.max(...v.shape);
|
|
35528
|
+
if (isRuntimeStringArray(v))
|
|
35529
|
+
return v.data.length === 0 ? 0 : Math.max(...v.shape);
|
|
35198
35530
|
return 1;
|
|
35199
35531
|
}
|
|
35200
35532
|
}
|
|
@@ -35322,6 +35654,7 @@ defineBuiltin({
|
|
|
35322
35654
|
return mkChar(v._isLogical ? "logical" : "double");
|
|
35323
35655
|
if (isRuntimeSparseMatrix(v)) return mkChar("double");
|
|
35324
35656
|
if (isRuntimeString(v)) return mkChar("string");
|
|
35657
|
+
if (isRuntimeStringArray(v)) return mkChar("string");
|
|
35325
35658
|
if (isRuntimeChar(v)) return mkChar("char");
|
|
35326
35659
|
if (isRuntimeStruct(v) || isRuntimeStructArray(v))
|
|
35327
35660
|
return mkChar("struct");
|
|
@@ -35372,7 +35705,7 @@ function fieldnamesApply(args) {
|
|
|
35372
35705
|
if (isRuntimeStructArray(v)) {
|
|
35373
35706
|
const names2 = v.fieldNames;
|
|
35374
35707
|
return RTV.cell(
|
|
35375
|
-
names2.map((n) => RTV.
|
|
35708
|
+
names2.map((n) => RTV.char(n)),
|
|
35376
35709
|
[names2.length, 1]
|
|
35377
35710
|
);
|
|
35378
35711
|
}
|
|
@@ -35380,7 +35713,7 @@ function fieldnamesApply(args) {
|
|
|
35380
35713
|
throw new RuntimeError("fieldnames: argument must be a struct");
|
|
35381
35714
|
const names = [...v.fields.keys()];
|
|
35382
35715
|
return RTV.cell(
|
|
35383
|
-
names.map((n) => RTV.
|
|
35716
|
+
names.map((n) => RTV.char(n)),
|
|
35384
35717
|
[names.length, 1]
|
|
35385
35718
|
);
|
|
35386
35719
|
}
|
|
@@ -36457,6 +36790,87 @@ defineBuiltin({
|
|
|
36457
36790
|
]
|
|
36458
36791
|
});
|
|
36459
36792
|
|
|
36793
|
+
// src/numbl-core/helpers/scanFormat.ts
|
|
36794
|
+
function scanFormat(str, fmt, maxCount) {
|
|
36795
|
+
const results = [];
|
|
36796
|
+
let strPos = 0;
|
|
36797
|
+
let fmtPos = 0;
|
|
36798
|
+
let matchFailure = false;
|
|
36799
|
+
while (fmtPos < fmt.length && strPos < str.length && results.length < maxCount) {
|
|
36800
|
+
if (fmt[fmtPos] === "%") {
|
|
36801
|
+
fmtPos++;
|
|
36802
|
+
if (fmtPos >= fmt.length) break;
|
|
36803
|
+
while (fmtPos < fmt.length && /[\d.]/.test(fmt[fmtPos])) fmtPos++;
|
|
36804
|
+
if (fmtPos >= fmt.length) break;
|
|
36805
|
+
const spec = fmt[fmtPos];
|
|
36806
|
+
fmtPos++;
|
|
36807
|
+
if (spec !== "c" && spec !== "s") {
|
|
36808
|
+
while (strPos < str.length && /\s/.test(str[strPos])) strPos++;
|
|
36809
|
+
}
|
|
36810
|
+
if (spec === "d" || spec === "i" || spec === "u") {
|
|
36811
|
+
const m = str.slice(strPos).match(/^[+-]?\d+/);
|
|
36812
|
+
if (!m) {
|
|
36813
|
+
matchFailure = true;
|
|
36814
|
+
break;
|
|
36815
|
+
}
|
|
36816
|
+
results.push(parseInt(m[0], 10));
|
|
36817
|
+
strPos += m[0].length;
|
|
36818
|
+
} else if (spec === "f" || spec === "e" || spec === "g") {
|
|
36819
|
+
const m = str.slice(strPos).match(/^[+-]?(\d+\.?\d*|\.\d+)([eE][+-]?\d+)?/);
|
|
36820
|
+
if (!m) {
|
|
36821
|
+
matchFailure = true;
|
|
36822
|
+
break;
|
|
36823
|
+
}
|
|
36824
|
+
results.push(parseFloat(m[0]));
|
|
36825
|
+
strPos += m[0].length;
|
|
36826
|
+
} else if (spec === "x") {
|
|
36827
|
+
const m = str.slice(strPos).match(/^[+-]?[0-9a-fA-F]+/);
|
|
36828
|
+
if (!m) {
|
|
36829
|
+
matchFailure = true;
|
|
36830
|
+
break;
|
|
36831
|
+
}
|
|
36832
|
+
results.push(parseInt(m[0], 16));
|
|
36833
|
+
strPos += m[0].length;
|
|
36834
|
+
} else if (spec === "o") {
|
|
36835
|
+
const m = str.slice(strPos).match(/^[+-]?[0-7]+/);
|
|
36836
|
+
if (!m) {
|
|
36837
|
+
matchFailure = true;
|
|
36838
|
+
break;
|
|
36839
|
+
}
|
|
36840
|
+
results.push(parseInt(m[0], 8));
|
|
36841
|
+
strPos += m[0].length;
|
|
36842
|
+
} else if (spec === "c") {
|
|
36843
|
+
results.push(str.charCodeAt(strPos));
|
|
36844
|
+
strPos++;
|
|
36845
|
+
} else if (spec === "s") {
|
|
36846
|
+
const m = str.slice(strPos).match(/^\S+/);
|
|
36847
|
+
if (!m) {
|
|
36848
|
+
matchFailure = true;
|
|
36849
|
+
break;
|
|
36850
|
+
}
|
|
36851
|
+
for (let ci = 0; ci < m[0].length && results.length < maxCount; ci++) {
|
|
36852
|
+
results.push(m[0].charCodeAt(ci));
|
|
36853
|
+
}
|
|
36854
|
+
strPos += m[0].length;
|
|
36855
|
+
}
|
|
36856
|
+
} else if (/\s/.test(fmt[fmtPos])) {
|
|
36857
|
+
fmtPos++;
|
|
36858
|
+
while (strPos < str.length && /\s/.test(str[strPos])) strPos++;
|
|
36859
|
+
} else {
|
|
36860
|
+
if (str[strPos] !== fmt[fmtPos]) {
|
|
36861
|
+
matchFailure = true;
|
|
36862
|
+
break;
|
|
36863
|
+
}
|
|
36864
|
+
strPos++;
|
|
36865
|
+
fmtPos++;
|
|
36866
|
+
}
|
|
36867
|
+
if (fmtPos >= fmt.length && results.length < maxCount && strPos < str.length) {
|
|
36868
|
+
fmtPos = 0;
|
|
36869
|
+
}
|
|
36870
|
+
}
|
|
36871
|
+
return { results, consumed: strPos, matchFailure };
|
|
36872
|
+
}
|
|
36873
|
+
|
|
36460
36874
|
// src/numbl-core/interpreter/builtins/strings.ts
|
|
36461
36875
|
function isTextType(t) {
|
|
36462
36876
|
return t.kind === "char" || t.kind === "string";
|
|
@@ -36481,6 +36895,9 @@ function applyTextFn(v, fn) {
|
|
|
36481
36895
|
return RTV.char(fn(v.value));
|
|
36482
36896
|
}
|
|
36483
36897
|
if (isRuntimeString(v)) return RTV.string(fn(toString(v)));
|
|
36898
|
+
if (isRuntimeStringArray(v)) {
|
|
36899
|
+
return RTV.stringArray(v.data.map(fn), [v.shape[0], v.shape[1]]);
|
|
36900
|
+
}
|
|
36484
36901
|
return v;
|
|
36485
36902
|
}
|
|
36486
36903
|
function textPreserveResolve(fn) {
|
|
@@ -36493,6 +36910,16 @@ function textPreserveResolve(fn) {
|
|
|
36493
36910
|
apply: (args) => applyTextFn(args[0], fn)
|
|
36494
36911
|
};
|
|
36495
36912
|
}
|
|
36913
|
+
if (t.kind === "unknown") {
|
|
36914
|
+
return {
|
|
36915
|
+
outputTypes: [{ kind: "unknown" }],
|
|
36916
|
+
apply: (args) => {
|
|
36917
|
+
if (!isRuntimeStringArray(args[0]))
|
|
36918
|
+
throw new RuntimeError("Expected a text input");
|
|
36919
|
+
return applyTextFn(args[0], fn);
|
|
36920
|
+
}
|
|
36921
|
+
};
|
|
36922
|
+
}
|
|
36496
36923
|
const out = preserveTextType(t);
|
|
36497
36924
|
if (!out) return null;
|
|
36498
36925
|
return {
|
|
@@ -36582,17 +37009,14 @@ registerIBuiltin({
|
|
|
36582
37009
|
name: "erase",
|
|
36583
37010
|
resolve: (argTypes) => {
|
|
36584
37011
|
if (argTypes.length !== 2) return null;
|
|
36585
|
-
const out = preserveTextType(argTypes[0]);
|
|
37012
|
+
const out = argTypes[0].kind === "unknown" ? { kind: "unknown" } : preserveTextType(argTypes[0]);
|
|
36586
37013
|
if (!out) return null;
|
|
36587
37014
|
if (!isTextType(argTypes[1])) return null;
|
|
36588
37015
|
return {
|
|
36589
37016
|
outputTypes: [out],
|
|
36590
37017
|
apply: (args) => {
|
|
36591
|
-
const v = args[0];
|
|
36592
|
-
const s = toString(v);
|
|
36593
37018
|
const pat = toString(args[1]);
|
|
36594
|
-
|
|
36595
|
-
return isRuntimeChar(v) ? RTV.char(result) : RTV.string(result);
|
|
37019
|
+
return applyTextFn(args[0], (s) => s.split(pat).join(""));
|
|
36596
37020
|
}
|
|
36597
37021
|
};
|
|
36598
37022
|
}
|
|
@@ -36600,18 +37024,15 @@ registerIBuiltin({
|
|
|
36600
37024
|
function strreplaceResolve() {
|
|
36601
37025
|
return (argTypes) => {
|
|
36602
37026
|
if (argTypes.length !== 3) return null;
|
|
36603
|
-
const out = preserveTextType(argTypes[0]);
|
|
37027
|
+
const out = argTypes[0].kind === "unknown" || argTypes[0].kind === "cell" ? { kind: argTypes[0].kind } : preserveTextType(argTypes[0]);
|
|
36604
37028
|
if (!out) return null;
|
|
36605
37029
|
if (!isTextType(argTypes[1]) || !isTextType(argTypes[2])) return null;
|
|
36606
37030
|
return {
|
|
36607
37031
|
outputTypes: [out],
|
|
36608
37032
|
apply: (args) => {
|
|
36609
|
-
const v = args[0];
|
|
36610
|
-
const s = toString(v);
|
|
36611
37033
|
const old = toString(args[1]);
|
|
36612
37034
|
const rep = toString(args[2]);
|
|
36613
|
-
|
|
36614
|
-
return isRuntimeChar(v) ? RTV.char(result) : RTV.string(result);
|
|
37035
|
+
return applyTextFn(args[0], (s) => s.split(old).join(rep));
|
|
36615
37036
|
}
|
|
36616
37037
|
};
|
|
36617
37038
|
};
|
|
@@ -36779,9 +37200,16 @@ registerIBuiltin({
|
|
|
36779
37200
|
function isText(v) {
|
|
36780
37201
|
return isRuntimeChar(v) || isRuntimeString(v);
|
|
36781
37202
|
}
|
|
37203
|
+
function stringArrayToCell(v) {
|
|
37204
|
+
if (!isRuntimeStringArray(v)) return v;
|
|
37205
|
+
return RTV.cell(
|
|
37206
|
+
v.data.map((s) => RTV.string(s)),
|
|
37207
|
+
[v.shape[0], v.shape[1]]
|
|
37208
|
+
);
|
|
37209
|
+
}
|
|
36782
37210
|
function strcmpApply(args, cmp) {
|
|
36783
|
-
const a = args[0];
|
|
36784
|
-
const b = args[1];
|
|
37211
|
+
const a = stringArrayToCell(args[0]);
|
|
37212
|
+
const b = stringArrayToCell(args[1]);
|
|
36785
37213
|
const aIsCell = isRuntimeCell(a);
|
|
36786
37214
|
const bIsCell = isRuntimeCell(b);
|
|
36787
37215
|
if (!aIsCell && !bIsCell) {
|
|
@@ -37027,24 +37455,43 @@ registerIBuiltin({
|
|
|
37027
37455
|
};
|
|
37028
37456
|
}
|
|
37029
37457
|
});
|
|
37458
|
+
function patternList(pat) {
|
|
37459
|
+
if (isRuntimeCell(pat)) return pat.data.map((e) => toString(e));
|
|
37460
|
+
if (isRuntimeStringArray(pat)) return pat.data.slice();
|
|
37461
|
+
return [toString(pat)];
|
|
37462
|
+
}
|
|
37463
|
+
function textSubjectApply(subject, perElem) {
|
|
37464
|
+
if (isRuntimeStringArray(subject)) {
|
|
37465
|
+
return new RuntimeTensor(
|
|
37466
|
+
allocFloat64Array(subject.data.map((s) => perElem(s) ? 1 : 0)),
|
|
37467
|
+
[subject.shape[0], subject.shape[1]],
|
|
37468
|
+
void 0,
|
|
37469
|
+
true
|
|
37470
|
+
);
|
|
37471
|
+
}
|
|
37472
|
+
if (isRuntimeCell(subject)) {
|
|
37473
|
+
return new RuntimeTensor(
|
|
37474
|
+
allocFloat64Array(subject.data.map((e) => perElem(toString(e)) ? 1 : 0)),
|
|
37475
|
+
subject.shape.slice(),
|
|
37476
|
+
void 0,
|
|
37477
|
+
true
|
|
37478
|
+
);
|
|
37479
|
+
}
|
|
37480
|
+
return RTV.logical(perElem(toString(subject)));
|
|
37481
|
+
}
|
|
37482
|
+
function subjectTypeOk(t) {
|
|
37483
|
+
return isTextType(t) || t.kind === "cell" || t.kind === "unknown";
|
|
37484
|
+
}
|
|
37030
37485
|
registerIBuiltin({
|
|
37031
37486
|
name: "contains",
|
|
37032
37487
|
resolve: (argTypes) => {
|
|
37033
37488
|
if (argTypes.length < 2) return null;
|
|
37034
|
-
if (!
|
|
37035
|
-
if (argTypes[1].kind === "unknown") return null;
|
|
37489
|
+
if (!subjectTypeOk(argTypes[0])) return null;
|
|
37036
37490
|
return {
|
|
37037
37491
|
outputTypes: [{ kind: "boolean" }],
|
|
37038
37492
|
apply: (args) => {
|
|
37039
|
-
const
|
|
37040
|
-
|
|
37041
|
-
if (isRuntimeCell(pat)) {
|
|
37042
|
-
for (let i = 0; i < pat.data.length; i++) {
|
|
37043
|
-
if (s.includes(toString(pat.data[i]))) return RTV.logical(true);
|
|
37044
|
-
}
|
|
37045
|
-
return RTV.logical(false);
|
|
37046
|
-
}
|
|
37047
|
-
return RTV.logical(s.includes(toString(pat)));
|
|
37493
|
+
const pats = patternList(args[1]);
|
|
37494
|
+
return textSubjectApply(args[0], (s) => pats.some((p2) => s.includes(p2)));
|
|
37048
37495
|
}
|
|
37049
37496
|
};
|
|
37050
37497
|
}
|
|
@@ -37054,7 +37501,7 @@ function resolveStartsEndsWith(name, testFn) {
|
|
|
37054
37501
|
name,
|
|
37055
37502
|
resolve: (argTypes) => {
|
|
37056
37503
|
if (argTypes.length < 2) return null;
|
|
37057
|
-
if (!
|
|
37504
|
+
if (!subjectTypeOk(argTypes[0])) return null;
|
|
37058
37505
|
return {
|
|
37059
37506
|
outputTypes: [{ kind: "boolean" }],
|
|
37060
37507
|
apply: (args) => {
|
|
@@ -37064,20 +37511,12 @@ function resolveStartsEndsWith(name, testFn) {
|
|
|
37064
37511
|
ic = !!toNumber(args[i + 1]);
|
|
37065
37512
|
}
|
|
37066
37513
|
}
|
|
37067
|
-
let
|
|
37068
|
-
if (ic)
|
|
37069
|
-
|
|
37070
|
-
|
|
37071
|
-
|
|
37072
|
-
|
|
37073
|
-
if (ic) p3 = p3.toLowerCase();
|
|
37074
|
-
if (testFn(s, p3)) return RTV.logical(true);
|
|
37075
|
-
}
|
|
37076
|
-
return RTV.logical(false);
|
|
37077
|
-
}
|
|
37078
|
-
let p2 = toString(pat);
|
|
37079
|
-
if (ic) p2 = p2.toLowerCase();
|
|
37080
|
-
return RTV.logical(testFn(s, p2));
|
|
37514
|
+
let pats = patternList(args[1]);
|
|
37515
|
+
if (ic) pats = pats.map((p2) => p2.toLowerCase());
|
|
37516
|
+
return textSubjectApply(args[0], (s0) => {
|
|
37517
|
+
const s = ic ? s0.toLowerCase() : s0;
|
|
37518
|
+
return pats.some((p2) => testFn(s, p2));
|
|
37519
|
+
});
|
|
37081
37520
|
}
|
|
37082
37521
|
};
|
|
37083
37522
|
}
|
|
@@ -37089,13 +37528,19 @@ registerIBuiltin({
|
|
|
37089
37528
|
name: "strlength",
|
|
37090
37529
|
resolve: (argTypes) => {
|
|
37091
37530
|
if (argTypes.length !== 1) return null;
|
|
37092
|
-
if (!isTextType(argTypes[0])) return null;
|
|
37531
|
+
if (!isTextType(argTypes[0]) && argTypes[0].kind !== "unknown") return null;
|
|
37093
37532
|
return {
|
|
37094
37533
|
outputTypes: [{ kind: "number", sign: "nonneg" }],
|
|
37095
37534
|
apply: (args) => {
|
|
37096
37535
|
const v = args[0];
|
|
37097
37536
|
if (isRuntimeString(v)) return RTV.num(v.length);
|
|
37098
37537
|
if (isRuntimeChar(v)) return RTV.num(v.value.length);
|
|
37538
|
+
if (isRuntimeStringArray(v)) {
|
|
37539
|
+
return RTV.tensor(allocFloat64Array(v.data.map((s) => s.length)), [
|
|
37540
|
+
v.shape[0],
|
|
37541
|
+
v.shape[1]
|
|
37542
|
+
]);
|
|
37543
|
+
}
|
|
37099
37544
|
throw new RuntimeError("strlength: argument must be a string or char");
|
|
37100
37545
|
}
|
|
37101
37546
|
};
|
|
@@ -37151,6 +37596,20 @@ registerIBuiltin({
|
|
|
37151
37596
|
}
|
|
37152
37597
|
};
|
|
37153
37598
|
}
|
|
37599
|
+
if (t.kind === "unknown") {
|
|
37600
|
+
return {
|
|
37601
|
+
outputTypes: [{ kind: "tensor", isComplex: false }],
|
|
37602
|
+
apply: (args) => {
|
|
37603
|
+
const v = args[0];
|
|
37604
|
+
if (!isRuntimeStringArray(v))
|
|
37605
|
+
throw new RuntimeError("str2double: expected text input");
|
|
37606
|
+
return RTV.tensor(
|
|
37607
|
+
allocFloat64Array(v.data.map((s) => str2doubleScalar(s))),
|
|
37608
|
+
[v.shape[0], v.shape[1]]
|
|
37609
|
+
);
|
|
37610
|
+
}
|
|
37611
|
+
};
|
|
37612
|
+
}
|
|
37154
37613
|
return null;
|
|
37155
37614
|
}
|
|
37156
37615
|
});
|
|
@@ -37336,29 +37795,7 @@ registerIBuiltin({
|
|
|
37336
37795
|
};
|
|
37337
37796
|
}
|
|
37338
37797
|
});
|
|
37339
|
-
|
|
37340
|
-
if (n === Infinity) return "Inf";
|
|
37341
|
-
if (n === -Infinity) return "-Inf";
|
|
37342
|
-
if (isNaN(n)) return "NaN";
|
|
37343
|
-
if (n === 0) return "0";
|
|
37344
|
-
if (Number.isInteger(n)) return String(n);
|
|
37345
|
-
const prec = 5;
|
|
37346
|
-
const exp2 = Math.floor(Math.log10(Math.abs(n)));
|
|
37347
|
-
let s;
|
|
37348
|
-
if (exp2 < -4 || exp2 >= prec) {
|
|
37349
|
-
s = n.toExponential(prec - 1);
|
|
37350
|
-
const ePos = s.indexOf("e");
|
|
37351
|
-
let mantissa = s.slice(0, ePos);
|
|
37352
|
-
const expPart0 = s.slice(ePos);
|
|
37353
|
-
if (mantissa.includes(".")) mantissa = mantissa.replace(/\.?0+$/, "");
|
|
37354
|
-
const expPart = expPart0.replace(/([eE][+-])(\d)$/, "$10$2");
|
|
37355
|
-
s = mantissa + expPart;
|
|
37356
|
-
} else {
|
|
37357
|
-
s = n.toPrecision(prec);
|
|
37358
|
-
if (s.includes(".")) s = s.replace(/\.?0+$/, "");
|
|
37359
|
-
}
|
|
37360
|
-
return s;
|
|
37361
|
-
}
|
|
37798
|
+
var numStr2 = matlabNumToString;
|
|
37362
37799
|
registerIBuiltin({
|
|
37363
37800
|
name: "num2str",
|
|
37364
37801
|
resolve: (argTypes) => {
|
|
@@ -37569,7 +38006,7 @@ registerIBuiltin({
|
|
|
37569
38006
|
resolve: (argTypes) => {
|
|
37570
38007
|
if (argTypes.length !== 1) return null;
|
|
37571
38008
|
const a = argTypes[0];
|
|
37572
|
-
if (a.kind !== "char" && a.kind !== "string" && a.kind !== "number" && a.kind !== "tensor" && a.kind !== "cell")
|
|
38009
|
+
if (a.kind !== "char" && a.kind !== "string" && a.kind !== "number" && a.kind !== "tensor" && a.kind !== "cell" && a.kind !== "unknown")
|
|
37573
38010
|
return null;
|
|
37574
38011
|
return {
|
|
37575
38012
|
outputTypes: [{ kind: "char" }],
|
|
@@ -37591,6 +38028,9 @@ registerIBuiltin({
|
|
|
37591
38028
|
for (const el of v.data) rows.push(...valueToCharRows(el));
|
|
37592
38029
|
return charRowsToMatrix(rows);
|
|
37593
38030
|
}
|
|
38031
|
+
if (isRuntimeStringArray(v)) {
|
|
38032
|
+
return charRowsToMatrix(v.data.slice());
|
|
38033
|
+
}
|
|
37594
38034
|
throw new RuntimeError("char: unsupported arguments");
|
|
37595
38035
|
}
|
|
37596
38036
|
};
|
|
@@ -37601,14 +38041,260 @@ registerIBuiltin({
|
|
|
37601
38041
|
resolve: (argTypes) => {
|
|
37602
38042
|
if (argTypes.length !== 1) return null;
|
|
37603
38043
|
const a = argTypes[0];
|
|
37604
|
-
|
|
38044
|
+
const scalarText = a.kind === "char" || a.kind === "string" || a.kind === "number" || a.kind === "boolean";
|
|
37605
38045
|
return {
|
|
37606
|
-
outputTypes: [{ kind: "string" }],
|
|
38046
|
+
outputTypes: [scalarText ? { kind: "string" } : { kind: "unknown" }],
|
|
38047
|
+
apply: (args) => {
|
|
38048
|
+
const v = args[0];
|
|
38049
|
+
if (isRuntimeString(v) || isRuntimeStringArray(v)) return v;
|
|
38050
|
+
if (isRuntimeChar(v)) {
|
|
38051
|
+
const rows = v.shape ? v.shape[0] : 1;
|
|
38052
|
+
if (rows <= 1) return RTV.string(v.value);
|
|
38053
|
+
const width = v.shape[1];
|
|
38054
|
+
const out = [];
|
|
38055
|
+
for (let r = 0; r < rows; r++) {
|
|
38056
|
+
out.push(v.value.slice(r * width, (r + 1) * width));
|
|
38057
|
+
}
|
|
38058
|
+
return RTV.stringArray(out, [rows, 1]);
|
|
38059
|
+
}
|
|
38060
|
+
if (isRuntimeNumber(v)) return RTV.string(numStr2(v));
|
|
38061
|
+
if (isRuntimeLogical(v)) return RTV.string(v ? "true" : "false");
|
|
38062
|
+
if (isRuntimeTensor(v)) {
|
|
38063
|
+
const rows = v.shape.length >= 2 ? v.shape[0] : 1;
|
|
38064
|
+
const cols = v.data.length === 0 ? v.shape[1] ?? 0 : v.data.length / (rows || 1);
|
|
38065
|
+
const out = [];
|
|
38066
|
+
for (let i = 0; i < v.data.length; i++) {
|
|
38067
|
+
out.push(
|
|
38068
|
+
v._isLogical ? v.data[i] ? "true" : "false" : numStr2(v.data[i])
|
|
38069
|
+
);
|
|
38070
|
+
}
|
|
38071
|
+
return stringArrayValue(out, [rows, cols]);
|
|
38072
|
+
}
|
|
38073
|
+
if (isRuntimeCell(v)) {
|
|
38074
|
+
const rows = v.shape.length >= 2 ? v.shape[0] : 1;
|
|
38075
|
+
const cols = v.data.length / (rows || 1);
|
|
38076
|
+
const out = v.data.map((el) => {
|
|
38077
|
+
const rv = ensureRuntimeValue(el);
|
|
38078
|
+
if (isRuntimeChar(rv)) return rv.value;
|
|
38079
|
+
if (isRuntimeString(rv)) return rv;
|
|
38080
|
+
if (isRuntimeNumber(rv)) return numStr2(rv);
|
|
38081
|
+
if (isRuntimeLogical(rv)) return rv ? "true" : "false";
|
|
38082
|
+
throw new RuntimeError(
|
|
38083
|
+
"string: cell elements must be text or numbers"
|
|
38084
|
+
);
|
|
38085
|
+
});
|
|
38086
|
+
return stringArrayValue(out, [rows, cols]);
|
|
38087
|
+
}
|
|
38088
|
+
return RTV.string(displayValue(v));
|
|
38089
|
+
}
|
|
38090
|
+
};
|
|
38091
|
+
}
|
|
38092
|
+
});
|
|
38093
|
+
registerIBuiltin({
|
|
38094
|
+
name: "strings",
|
|
38095
|
+
help: {
|
|
38096
|
+
signatures: ["strings", "strings(n)", "strings(m,n)", "strings([m n])"],
|
|
38097
|
+
description: 'Create a string array with every element set to "" (empty string).'
|
|
38098
|
+
},
|
|
38099
|
+
resolve: (argTypes) => {
|
|
38100
|
+
if (argTypes.some((t) => t.kind !== "number" && t.kind !== "tensor"))
|
|
38101
|
+
return null;
|
|
38102
|
+
return {
|
|
38103
|
+
outputTypes: [{ kind: "unknown" }],
|
|
38104
|
+
apply: (args) => {
|
|
38105
|
+
const dims = [];
|
|
38106
|
+
for (const a of args) {
|
|
38107
|
+
const rv = ensureRuntimeValue(a);
|
|
38108
|
+
if (isRuntimeTensor(rv)) {
|
|
38109
|
+
for (const d of rv.data) dims.push(Math.max(0, Math.round(d)));
|
|
38110
|
+
} else {
|
|
38111
|
+
dims.push(Math.max(0, Math.round(toNumber(rv))));
|
|
38112
|
+
}
|
|
38113
|
+
}
|
|
38114
|
+
if (dims.length === 0) dims.push(1, 1);
|
|
38115
|
+
if (dims.length === 1) dims.push(dims[0]);
|
|
38116
|
+
const m = dims[0];
|
|
38117
|
+
const n = dims.slice(1).reduce((a, b) => a * b, 1);
|
|
38118
|
+
return stringArrayValue(new Array(m * n).fill(""), [m, n]);
|
|
38119
|
+
}
|
|
38120
|
+
};
|
|
38121
|
+
}
|
|
38122
|
+
});
|
|
38123
|
+
registerIBuiltin({
|
|
38124
|
+
name: "newline",
|
|
38125
|
+
help: {
|
|
38126
|
+
signatures: ["newline"],
|
|
38127
|
+
description: "Newline character, char(10)."
|
|
38128
|
+
},
|
|
38129
|
+
resolve: (argTypes) => {
|
|
38130
|
+
if (argTypes.length !== 0) return null;
|
|
38131
|
+
return {
|
|
38132
|
+
outputTypes: [{ kind: "char" }],
|
|
38133
|
+
apply: () => RTV.char("\n")
|
|
38134
|
+
};
|
|
38135
|
+
}
|
|
38136
|
+
});
|
|
38137
|
+
registerIBuiltin({
|
|
38138
|
+
name: "split",
|
|
38139
|
+
help: {
|
|
38140
|
+
signatures: ["split(str)", "split(str, delimiter)"],
|
|
38141
|
+
description: "Split text at whitespace (or the given delimiter(s)) into a string array. A scalar input yields a column of parts."
|
|
38142
|
+
},
|
|
38143
|
+
resolve: (argTypes) => {
|
|
38144
|
+
if (argTypes.length < 1 || argTypes.length > 2) return null;
|
|
38145
|
+
const a = argTypes[0];
|
|
38146
|
+
if (!isTextType(a) && a.kind !== "cell" && a.kind !== "unknown")
|
|
38147
|
+
return null;
|
|
38148
|
+
return {
|
|
38149
|
+
outputTypes: [{ kind: "unknown" }],
|
|
38150
|
+
apply: (args) => {
|
|
38151
|
+
const delims = args.length >= 2 ? patternList(args[1]) : null;
|
|
38152
|
+
const splitOne = (s) => {
|
|
38153
|
+
if (delims === null) {
|
|
38154
|
+
const trimmed = s.trim();
|
|
38155
|
+
return trimmed.length === 0 ? [""] : trimmed.split(/\s+/);
|
|
38156
|
+
}
|
|
38157
|
+
const escaped = delims.map((d) => d.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("|");
|
|
38158
|
+
return s.split(new RegExp(escaped));
|
|
38159
|
+
};
|
|
38160
|
+
const v = args[0];
|
|
38161
|
+
const subjects = isRuntimeStringArray(v) ? v.data.slice() : isRuntimeCell(v) ? v.data.map((e) => toString(e)) : [toString(v)];
|
|
38162
|
+
const partsPer = subjects.map(splitOne);
|
|
38163
|
+
const nParts = partsPer[0].length;
|
|
38164
|
+
if (partsPer.some((p2) => p2.length !== nParts)) {
|
|
38165
|
+
throw new RuntimeError(
|
|
38166
|
+
"split: all elements must split into the same number of parts"
|
|
38167
|
+
);
|
|
38168
|
+
}
|
|
38169
|
+
if (subjects.length === 1) {
|
|
38170
|
+
return stringArrayValue(partsPer[0], [nParts, 1]);
|
|
38171
|
+
}
|
|
38172
|
+
const m = subjects.length;
|
|
38173
|
+
const out = new Array(m * nParts);
|
|
38174
|
+
for (let i = 0; i < m; i++) {
|
|
38175
|
+
for (let j = 0; j < nParts; j++) {
|
|
38176
|
+
out[j * m + i] = partsPer[i][j];
|
|
38177
|
+
}
|
|
38178
|
+
}
|
|
38179
|
+
return stringArrayValue(out, [m, nParts]);
|
|
38180
|
+
}
|
|
38181
|
+
};
|
|
38182
|
+
}
|
|
38183
|
+
});
|
|
38184
|
+
registerIBuiltin({
|
|
38185
|
+
name: "join",
|
|
38186
|
+
help: {
|
|
38187
|
+
signatures: ["join(str)", "join(str, delimiter)"],
|
|
38188
|
+
description: "Combine the elements of a string array into single strings, separated by a space (or the given delimiter)."
|
|
38189
|
+
},
|
|
38190
|
+
resolve: (argTypes) => {
|
|
38191
|
+
if (argTypes.length < 1 || argTypes.length > 2) return null;
|
|
38192
|
+
const a = argTypes[0];
|
|
38193
|
+
if (!isTextType(a) && a.kind !== "cell" && a.kind !== "unknown")
|
|
38194
|
+
return null;
|
|
38195
|
+
return {
|
|
38196
|
+
outputTypes: [{ kind: "unknown" }],
|
|
37607
38197
|
apply: (args) => {
|
|
38198
|
+
const delim = args.length >= 2 ? toString(args[1]) : " ";
|
|
37608
38199
|
const v = args[0];
|
|
37609
38200
|
if (isRuntimeString(v)) return v;
|
|
37610
38201
|
if (isRuntimeChar(v)) return RTV.string(v.value);
|
|
37611
|
-
|
|
38202
|
+
const elems = isRuntimeStringArray(v) ? v.data : isRuntimeCell(v) ? v.data.map((e) => toString(e)) : [toString(v)];
|
|
38203
|
+
const shape = isRuntimeStringArray(v) ? v.shape : [1, elems.length];
|
|
38204
|
+
const [m, n] = shape;
|
|
38205
|
+
if (m === 1 || n === 1) {
|
|
38206
|
+
return RTV.string(elems.join(delim));
|
|
38207
|
+
}
|
|
38208
|
+
const out = [];
|
|
38209
|
+
for (let r = 0; r < m; r++) {
|
|
38210
|
+
const parts = [];
|
|
38211
|
+
for (let c = 0; c < n; c++) parts.push(elems[c * m + r]);
|
|
38212
|
+
out.push(parts.join(delim));
|
|
38213
|
+
}
|
|
38214
|
+
return stringArrayValue(out, [m, 1]);
|
|
38215
|
+
}
|
|
38216
|
+
};
|
|
38217
|
+
}
|
|
38218
|
+
});
|
|
38219
|
+
registerIBuiltin({
|
|
38220
|
+
name: "cellstr",
|
|
38221
|
+
help: {
|
|
38222
|
+
signatures: ["cellstr(A)"],
|
|
38223
|
+
description: "Convert a string array, char array, or cell array of text to a cell array of character vectors."
|
|
38224
|
+
},
|
|
38225
|
+
resolve: (argTypes) => {
|
|
38226
|
+
if (argTypes.length !== 1) return null;
|
|
38227
|
+
const a = argTypes[0];
|
|
38228
|
+
if (!isTextType(a) && a.kind !== "cell" && a.kind !== "unknown")
|
|
38229
|
+
return null;
|
|
38230
|
+
return {
|
|
38231
|
+
outputTypes: [{ kind: "cell" }],
|
|
38232
|
+
apply: (args) => {
|
|
38233
|
+
const v = args[0];
|
|
38234
|
+
if (isRuntimeCell(v)) {
|
|
38235
|
+
return RTV.cell(
|
|
38236
|
+
v.data.map((e) => RTV.char(toString(e))),
|
|
38237
|
+
[...v.shape]
|
|
38238
|
+
);
|
|
38239
|
+
}
|
|
38240
|
+
if (isRuntimeStringArray(v)) {
|
|
38241
|
+
return RTV.cell(
|
|
38242
|
+
v.data.map((s) => RTV.char(s)),
|
|
38243
|
+
[v.shape[0], v.shape[1]]
|
|
38244
|
+
);
|
|
38245
|
+
}
|
|
38246
|
+
if (isRuntimeString(v)) return RTV.cell([RTV.char(v)], [1, 1]);
|
|
38247
|
+
if (isRuntimeChar(v)) {
|
|
38248
|
+
const rows = v.shape ? v.shape[0] : 1;
|
|
38249
|
+
if (rows <= 1) {
|
|
38250
|
+
return RTV.cell([RTV.char(v.value.replace(/\s+$/, ""))], [1, 1]);
|
|
38251
|
+
}
|
|
38252
|
+
const width = v.shape[1];
|
|
38253
|
+
const out = [];
|
|
38254
|
+
for (let r = 0; r < rows; r++) {
|
|
38255
|
+
out.push(
|
|
38256
|
+
RTV.char(
|
|
38257
|
+
v.value.slice(r * width, (r + 1) * width).replace(/\s+$/, "")
|
|
38258
|
+
)
|
|
38259
|
+
);
|
|
38260
|
+
}
|
|
38261
|
+
return RTV.cell(out, [rows, 1]);
|
|
38262
|
+
}
|
|
38263
|
+
throw new RuntimeError("cellstr: unsupported argument");
|
|
38264
|
+
}
|
|
38265
|
+
};
|
|
38266
|
+
}
|
|
38267
|
+
});
|
|
38268
|
+
registerIBuiltin({
|
|
38269
|
+
name: "ismissing",
|
|
38270
|
+
help: {
|
|
38271
|
+
signatures: ["ismissing(A)"],
|
|
38272
|
+
description: "Logical array marking missing elements. numbl has no <missing> value, so string inputs return all-false."
|
|
38273
|
+
},
|
|
38274
|
+
resolve: (argTypes) => {
|
|
38275
|
+
if (argTypes.length !== 1) return null;
|
|
38276
|
+
return {
|
|
38277
|
+
outputTypes: [{ kind: "boolean" }],
|
|
38278
|
+
apply: (args) => {
|
|
38279
|
+
const v = args[0];
|
|
38280
|
+
if (isRuntimeStringArray(v)) {
|
|
38281
|
+
const t = RTV.tensor(allocFloat64Array(v.data.length), [
|
|
38282
|
+
v.shape[0],
|
|
38283
|
+
v.shape[1]
|
|
38284
|
+
]);
|
|
38285
|
+
t._isLogical = true;
|
|
38286
|
+
return t;
|
|
38287
|
+
}
|
|
38288
|
+
if (isRuntimeTensor(v)) {
|
|
38289
|
+
const t = RTV.tensor(
|
|
38290
|
+
allocFloat64Array(v.data.map((x) => isNaN(x) ? 1 : 0)),
|
|
38291
|
+
[...v.shape]
|
|
38292
|
+
);
|
|
38293
|
+
t._isLogical = true;
|
|
38294
|
+
return t;
|
|
38295
|
+
}
|
|
38296
|
+
if (isRuntimeNumber(v)) return RTV.logical(isNaN(v));
|
|
38297
|
+
return RTV.logical(false);
|
|
37612
38298
|
}
|
|
37613
38299
|
};
|
|
37614
38300
|
}
|
|
@@ -37645,7 +38331,10 @@ registerIBuiltin({
|
|
|
37645
38331
|
outputTypes: [outType],
|
|
37646
38332
|
apply: (args) => {
|
|
37647
38333
|
const fmt = toString(args[0]);
|
|
37648
|
-
const
|
|
38334
|
+
const rest = args.slice(1).flatMap(
|
|
38335
|
+
(a) => isRuntimeStringArray(a) ? a.data.map((s) => RTV.string(s)) : [a]
|
|
38336
|
+
);
|
|
38337
|
+
const result = sprintfFormat(fmt, rest);
|
|
37649
38338
|
return isChar5 ? RTV.char(result) : RTV.string(result);
|
|
37650
38339
|
}
|
|
37651
38340
|
};
|
|
@@ -37666,80 +38355,11 @@ registerIBuiltin({
|
|
|
37666
38355
|
const str = toString(args[0]);
|
|
37667
38356
|
const fmt = toString(args[1]);
|
|
37668
38357
|
const maxCount = args.length >= 3 ? toNumber(args[2]) : Infinity;
|
|
37669
|
-
const
|
|
37670
|
-
|
|
37671
|
-
|
|
37672
|
-
|
|
37673
|
-
|
|
37674
|
-
if (fmt[fmtPos] === "%") {
|
|
37675
|
-
fmtPos++;
|
|
37676
|
-
if (fmtPos >= fmt.length) break;
|
|
37677
|
-
const spec = fmt[fmtPos];
|
|
37678
|
-
fmtPos++;
|
|
37679
|
-
if (spec !== "c" && spec !== "s") {
|
|
37680
|
-
while (strPos < str.length && /\s/.test(str[strPos])) strPos++;
|
|
37681
|
-
}
|
|
37682
|
-
if (spec === "d" || spec === "i") {
|
|
37683
|
-
const m = str.slice(strPos).match(/^[+-]?\d+/);
|
|
37684
|
-
if (!m) {
|
|
37685
|
-
matchFailure = true;
|
|
37686
|
-
break;
|
|
37687
|
-
}
|
|
37688
|
-
results.push(parseInt(m[0], 10));
|
|
37689
|
-
strPos += m[0].length;
|
|
37690
|
-
} else if (spec === "f" || spec === "e" || spec === "g") {
|
|
37691
|
-
const m = str.slice(strPos).match(/^[+-]?(\d+\.?\d*|\.\d+)([eE][+-]?\d+)?/);
|
|
37692
|
-
if (!m) {
|
|
37693
|
-
matchFailure = true;
|
|
37694
|
-
break;
|
|
37695
|
-
}
|
|
37696
|
-
results.push(parseFloat(m[0]));
|
|
37697
|
-
strPos += m[0].length;
|
|
37698
|
-
} else if (spec === "x") {
|
|
37699
|
-
const m = str.slice(strPos).match(/^[+-]?[0-9a-fA-F]+/);
|
|
37700
|
-
if (!m) {
|
|
37701
|
-
matchFailure = true;
|
|
37702
|
-
break;
|
|
37703
|
-
}
|
|
37704
|
-
results.push(parseInt(m[0], 16));
|
|
37705
|
-
strPos += m[0].length;
|
|
37706
|
-
} else if (spec === "o") {
|
|
37707
|
-
const m = str.slice(strPos).match(/^[+-]?[0-7]+/);
|
|
37708
|
-
if (!m) {
|
|
37709
|
-
matchFailure = true;
|
|
37710
|
-
break;
|
|
37711
|
-
}
|
|
37712
|
-
results.push(parseInt(m[0], 8));
|
|
37713
|
-
strPos += m[0].length;
|
|
37714
|
-
} else if (spec === "c") {
|
|
37715
|
-
results.push(str.charCodeAt(strPos));
|
|
37716
|
-
strPos++;
|
|
37717
|
-
} else if (spec === "s") {
|
|
37718
|
-
const m = str.slice(strPos).match(/^\S+/);
|
|
37719
|
-
if (!m) {
|
|
37720
|
-
matchFailure = true;
|
|
37721
|
-
break;
|
|
37722
|
-
}
|
|
37723
|
-
for (let ci = 0; ci < m[0].length && results.length < maxCount; ci++) {
|
|
37724
|
-
results.push(m[0].charCodeAt(ci));
|
|
37725
|
-
}
|
|
37726
|
-
strPos += m[0].length;
|
|
37727
|
-
}
|
|
37728
|
-
} else if (/\s/.test(fmt[fmtPos])) {
|
|
37729
|
-
fmtPos++;
|
|
37730
|
-
while (strPos < str.length && /\s/.test(str[strPos])) strPos++;
|
|
37731
|
-
} else {
|
|
37732
|
-
if (str[strPos] !== fmt[fmtPos]) {
|
|
37733
|
-
matchFailure = true;
|
|
37734
|
-
break;
|
|
37735
|
-
}
|
|
37736
|
-
strPos++;
|
|
37737
|
-
fmtPos++;
|
|
37738
|
-
}
|
|
37739
|
-
if (fmtPos >= fmt.length && results.length < maxCount && strPos < str.length) {
|
|
37740
|
-
fmtPos = 0;
|
|
37741
|
-
}
|
|
37742
|
-
}
|
|
38358
|
+
const {
|
|
38359
|
+
results,
|
|
38360
|
+
consumed: strPos,
|
|
38361
|
+
matchFailure
|
|
38362
|
+
} = scanFormat(str, fmt, maxCount);
|
|
37743
38363
|
const vals = results.length === 1 ? RTV.num(results[0]) : RTV.tensor(allocFloat64Array(results), [results.length, 1]);
|
|
37744
38364
|
if (nout >= 2) {
|
|
37745
38365
|
const out = [vals, RTV.num(results.length)];
|
|
@@ -38018,6 +38638,10 @@ defineBuiltin({
|
|
|
38018
38638
|
};
|
|
38019
38639
|
return nargout > 1 ? [out, idx] : [out];
|
|
38020
38640
|
}
|
|
38641
|
+
if (a.kind === "string" || a.kind === "unknown") {
|
|
38642
|
+
const out = { kind: "unknown" };
|
|
38643
|
+
return nargout > 1 ? [out, { kind: "unknown" }] : [out];
|
|
38644
|
+
}
|
|
38021
38645
|
return null;
|
|
38022
38646
|
},
|
|
38023
38647
|
apply: (args, nargout) => {
|
|
@@ -38036,6 +38660,33 @@ defineBuiltin({
|
|
|
38036
38660
|
if (args.length >= 3 && (isRuntimeString(args[2]) || isRuntimeChar(args[2]))) {
|
|
38037
38661
|
descend = rstr(args[2]).toLowerCase() === "descend";
|
|
38038
38662
|
}
|
|
38663
|
+
if (isRuntimeStringArray(v)) {
|
|
38664
|
+
const order = v.data.map((_, i) => i);
|
|
38665
|
+
order.sort((i, j) => {
|
|
38666
|
+
const x = v.data[i];
|
|
38667
|
+
const y = v.data[j];
|
|
38668
|
+
const c = x < y ? -1 : x > y ? 1 : 0;
|
|
38669
|
+
return descend ? -c : c;
|
|
38670
|
+
});
|
|
38671
|
+
const sorted = order.map((i) => v.data[i]);
|
|
38672
|
+
const isRow = v.shape[0] === 1;
|
|
38673
|
+
const shape = isRow ? [1, sorted.length] : [sorted.length, 1];
|
|
38674
|
+
const result = stringArrayValue(sorted, shape);
|
|
38675
|
+
if (nargout > 1) {
|
|
38676
|
+
return [
|
|
38677
|
+
result,
|
|
38678
|
+
RTV.tensor(allocFloat64Array(order.map((i) => i + 1)), [
|
|
38679
|
+
shape[0],
|
|
38680
|
+
shape[1]
|
|
38681
|
+
])
|
|
38682
|
+
];
|
|
38683
|
+
}
|
|
38684
|
+
return result;
|
|
38685
|
+
}
|
|
38686
|
+
if (isRuntimeString(v)) {
|
|
38687
|
+
if (nargout > 1) return [v, RTV.num(1)];
|
|
38688
|
+
return v;
|
|
38689
|
+
}
|
|
38039
38690
|
if (isRuntimeNumber(v)) {
|
|
38040
38691
|
if (nargout > 1) return [v, RTV.num(1)];
|
|
38041
38692
|
return v;
|
|
@@ -38351,8 +39002,12 @@ var ismemberCases = [
|
|
|
38351
39002
|
apply: (args, nargout) => {
|
|
38352
39003
|
if (args.length < 2)
|
|
38353
39004
|
throw new RuntimeError("ismember requires 2 arguments");
|
|
38354
|
-
const
|
|
38355
|
-
|
|
39005
|
+
const asCellstr = (x) => isRuntimeStringArray(x) ? RTV.cell(
|
|
39006
|
+
x.data.map((s) => RTV.string(s)),
|
|
39007
|
+
[x.shape[0], x.shape[1]]
|
|
39008
|
+
) : x;
|
|
39009
|
+
const v = asCellstr(args[0]);
|
|
39010
|
+
const b = asCellstr(args[1]);
|
|
38356
39011
|
const isStringLike = (x) => isRuntimeString(x) || isRuntimeChar(x);
|
|
38357
39012
|
const isCellOfStrings = (x) => isRuntimeCell(x) && x.data.every(
|
|
38358
39013
|
(e) => isRuntimeString(e) || isRuntimeChar(e)
|
|
@@ -38655,6 +39310,30 @@ defineBuiltin({
|
|
|
38655
39310
|
)) {
|
|
38656
39311
|
return uniqueCellOfStrings(v, nargout, stable);
|
|
38657
39312
|
}
|
|
39313
|
+
if (isRuntimeStringArray(v)) {
|
|
39314
|
+
const elems = v.data;
|
|
39315
|
+
const seen = /* @__PURE__ */ new Map();
|
|
39316
|
+
for (let i = 0; i < elems.length; i++) {
|
|
39317
|
+
if (!seen.has(elems[i])) seen.set(elems[i], i);
|
|
39318
|
+
}
|
|
39319
|
+
let vals = [...seen.keys()];
|
|
39320
|
+
if (!stable) vals = vals.sort();
|
|
39321
|
+
const isRow = v.shape[0] === 1;
|
|
39322
|
+
const shape = isRow ? [1, vals.length] : [vals.length, 1];
|
|
39323
|
+
const result = stringArrayValue(vals, shape);
|
|
39324
|
+
if (nargout <= 1) return result;
|
|
39325
|
+
const ia = RTV.tensor(
|
|
39326
|
+
allocFloat64Array(vals.map((s) => seen.get(s) + 1)),
|
|
39327
|
+
[vals.length, 1]
|
|
39328
|
+
);
|
|
39329
|
+
if (nargout === 2) return [result, ia];
|
|
39330
|
+
const pos = new Map(vals.map((s, i) => [s, i + 1]));
|
|
39331
|
+
const ic = RTV.tensor(
|
|
39332
|
+
allocFloat64Array(elems.map((s) => pos.get(s))),
|
|
39333
|
+
[elems.length, 1]
|
|
39334
|
+
);
|
|
39335
|
+
return [result, ia, ic];
|
|
39336
|
+
}
|
|
38658
39337
|
if (!isRuntimeTensor(v))
|
|
38659
39338
|
throw new RuntimeError("unique: argument must be numeric");
|
|
38660
39339
|
if (byRows) return uniqueByRows(v, nargout, stable);
|
|
@@ -41858,6 +42537,27 @@ function flipAlongDim(v, dimIdx) {
|
|
|
41858
42537
|
}
|
|
41859
42538
|
return RTV.tensor(result, [...shape], resultImag);
|
|
41860
42539
|
}
|
|
42540
|
+
function flipCellAlongDim(v, dimIdx) {
|
|
42541
|
+
const shape = v.shape.length >= 2 ? v.shape : [1, v.shape[0] ?? v.data.length];
|
|
42542
|
+
const totalElems = v.data.length;
|
|
42543
|
+
const dimSize = dimIdx < shape.length ? shape[dimIdx] : 1;
|
|
42544
|
+
let strideDim = 1;
|
|
42545
|
+
for (let d = 0; d < dimIdx; d++) strideDim *= shape[d];
|
|
42546
|
+
const slabSize = strideDim * dimSize;
|
|
42547
|
+
const numOuter = totalElems / slabSize;
|
|
42548
|
+
const result = new Array(totalElems);
|
|
42549
|
+
for (let outer = 0; outer < numOuter; outer++) {
|
|
42550
|
+
const base = outer * slabSize;
|
|
42551
|
+
for (let k = 0; k < dimSize; k++) {
|
|
42552
|
+
const srcOff = base + k * strideDim;
|
|
42553
|
+
const dstOff = base + (dimSize - 1 - k) * strideDim;
|
|
42554
|
+
for (let i = 0; i < strideDim; i++) {
|
|
42555
|
+
result[dstOff + i] = v.data[srcOff + i];
|
|
42556
|
+
}
|
|
42557
|
+
}
|
|
42558
|
+
}
|
|
42559
|
+
return RTV.cell(result, [...shape]);
|
|
42560
|
+
}
|
|
41861
42561
|
function flipSparse(v, dimIdx) {
|
|
41862
42562
|
const isComplex = v.pi !== void 0;
|
|
41863
42563
|
const nnz = v.jc[v.n];
|
|
@@ -42034,6 +42734,41 @@ defineBuiltin({
|
|
|
42034
42734
|
chars[i2 * nc + j2] = linear[j2 * nr + i2];
|
|
42035
42735
|
return new RuntimeChar(chars.join(""), [nr, nc]);
|
|
42036
42736
|
}
|
|
42737
|
+
if (isRuntimeStringArray(v)) {
|
|
42738
|
+
const s = parseReshapeDims(args, v.data.length);
|
|
42739
|
+
while (s.length > 2 && s[s.length - 1] === 1) s.pop();
|
|
42740
|
+
if (s.length > 2)
|
|
42741
|
+
throw new RuntimeError("reshape: string arrays must be 2-D");
|
|
42742
|
+
const nr = s[0];
|
|
42743
|
+
const nc = s.length >= 2 ? s[1] : 1;
|
|
42744
|
+
return stringArrayValue(v.data.slice(), [nr, nc]);
|
|
42745
|
+
}
|
|
42746
|
+
if (isRuntimeString(v)) {
|
|
42747
|
+
parseReshapeDims(args, 1);
|
|
42748
|
+
return v;
|
|
42749
|
+
}
|
|
42750
|
+
if (isRuntimeClassInstanceArray(v)) {
|
|
42751
|
+
const total = v.elements.length;
|
|
42752
|
+
const s = parseReshapeDims(args, total);
|
|
42753
|
+
while (s.length > 2 && s[s.length - 1] === 1) s.pop();
|
|
42754
|
+
if (s.length > 2)
|
|
42755
|
+
throw new RuntimeError("reshape: object arrays must be 2-D");
|
|
42756
|
+
const nr = s[0];
|
|
42757
|
+
const nc = s.length >= 2 ? s[1] : 1;
|
|
42758
|
+
if (nr * nc !== total)
|
|
42759
|
+
throw new RuntimeError(
|
|
42760
|
+
"reshape: number of elements must not change"
|
|
42761
|
+
);
|
|
42762
|
+
return RTV.classInstanceArray(v.className, v.elements, [nr, nc]);
|
|
42763
|
+
}
|
|
42764
|
+
if (isRuntimeClassInstance(v)) {
|
|
42765
|
+
const s = parseReshapeDims(args, 1);
|
|
42766
|
+
if (s.reduce((a, b) => a * b, 1) !== 1)
|
|
42767
|
+
throw new RuntimeError(
|
|
42768
|
+
"reshape: number of elements must not change"
|
|
42769
|
+
);
|
|
42770
|
+
return v;
|
|
42771
|
+
}
|
|
42037
42772
|
if (!isRuntimeTensor(v) && !isRuntimeNumber(v) && !isRuntimeComplexNumber(v))
|
|
42038
42773
|
throw new RuntimeError("reshape: first argument must be numeric");
|
|
42039
42774
|
const data = isRuntimeTensor(v) ? v.data : isRuntimeComplexNumber(v) ? allocFloat64Array([v.re]) : allocFloat64Array([v]);
|
|
@@ -42345,6 +43080,7 @@ defineBuiltin({
|
|
|
42345
43080
|
if (isRuntimeChar(v))
|
|
42346
43081
|
return RTV.char(v.value.split("").reverse().join(""));
|
|
42347
43082
|
if (isRuntimeSparseMatrix(v)) return flipSparse(v, 1);
|
|
43083
|
+
if (isRuntimeCell(v)) return flipCellAlongDim(v, 1);
|
|
42348
43084
|
if (!isRuntimeTensor(v))
|
|
42349
43085
|
throw new RuntimeError("fliplr: argument must be numeric or char");
|
|
42350
43086
|
return flipAlongDim(v, 1);
|
|
@@ -42365,6 +43101,7 @@ defineBuiltin({
|
|
|
42365
43101
|
if (isRuntimeNumber(v)) return v;
|
|
42366
43102
|
if (isRuntimeChar(v)) return v;
|
|
42367
43103
|
if (isRuntimeSparseMatrix(v)) return flipSparse(v, 0);
|
|
43104
|
+
if (isRuntimeCell(v)) return flipCellAlongDim(v, 0);
|
|
42368
43105
|
if (!isRuntimeTensor(v))
|
|
42369
43106
|
throw new RuntimeError("flipud: argument must be numeric or char");
|
|
42370
43107
|
return flipAlongDim(v, 0);
|
|
@@ -42383,8 +43120,8 @@ defineBuiltin({
|
|
|
42383
43120
|
apply: (args) => {
|
|
42384
43121
|
const v = args[0];
|
|
42385
43122
|
if (isRuntimeNumber(v)) return v;
|
|
42386
|
-
if (!isRuntimeTensor(v))
|
|
42387
|
-
throw new RuntimeError("flip: argument must be numeric");
|
|
43123
|
+
if (!isRuntimeTensor(v) && !isRuntimeCell(v))
|
|
43124
|
+
throw new RuntimeError("flip: argument must be numeric or cell");
|
|
42388
43125
|
let dimIdx = 0;
|
|
42389
43126
|
if (args.length >= 2) {
|
|
42390
43127
|
dimIdx = Math.round(toNumber(args[1])) - 1;
|
|
@@ -42393,7 +43130,7 @@ defineBuiltin({
|
|
|
42393
43130
|
dimIdx = shape.findIndex((d) => d > 1);
|
|
42394
43131
|
if (dimIdx === -1) dimIdx = 0;
|
|
42395
43132
|
}
|
|
42396
|
-
return flipAlongDim(v, dimIdx);
|
|
43133
|
+
return isRuntimeCell(v) ? flipCellAlongDim(v, dimIdx) : flipAlongDim(v, dimIdx);
|
|
42397
43134
|
}
|
|
42398
43135
|
}
|
|
42399
43136
|
]
|
|
@@ -44063,6 +44800,8 @@ function getValClassName(v) {
|
|
|
44063
44800
|
return "double";
|
|
44064
44801
|
case "dictionary":
|
|
44065
44802
|
return "dictionary";
|
|
44803
|
+
case "string_array":
|
|
44804
|
+
return "string";
|
|
44066
44805
|
default:
|
|
44067
44806
|
return "unknown";
|
|
44068
44807
|
}
|
|
@@ -44092,6 +44831,8 @@ function getShapeOf(v) {
|
|
|
44092
44831
|
return [1, 1];
|
|
44093
44832
|
case "struct_array":
|
|
44094
44833
|
return [1, obj.elements.length];
|
|
44834
|
+
case "string_array":
|
|
44835
|
+
return [...obj.shape];
|
|
44095
44836
|
default:
|
|
44096
44837
|
return [1, 1];
|
|
44097
44838
|
}
|
|
@@ -45759,6 +46500,12 @@ defineBuiltin({
|
|
|
45759
46500
|
});
|
|
45760
46501
|
|
|
45761
46502
|
// src/numbl-core/interpreter/builtins/type-constructors.ts
|
|
46503
|
+
function parseDoubleText(s) {
|
|
46504
|
+
const t = s.trim();
|
|
46505
|
+
if (t === "") return NaN;
|
|
46506
|
+
if (/^[+-]?inf(inity)?$/i.test(t)) return t[0] === "-" ? -Infinity : Infinity;
|
|
46507
|
+
return Number(t);
|
|
46508
|
+
}
|
|
45762
46509
|
defineBuiltin({
|
|
45763
46510
|
name: "double",
|
|
45764
46511
|
cases: [
|
|
@@ -45766,7 +46513,7 @@ defineBuiltin({
|
|
|
45766
46513
|
match: (argTypes) => {
|
|
45767
46514
|
if (argTypes.length !== 1) return null;
|
|
45768
46515
|
const a = argTypes[0];
|
|
45769
|
-
if (a.kind === "number" || a.kind === "boolean" || a.kind === "char" || a.kind === "complex_or_number" || a.kind === "class_instance")
|
|
46516
|
+
if (a.kind === "number" || a.kind === "boolean" || a.kind === "char" || a.kind === "string" || a.kind === "unknown" || a.kind === "complex_or_number" || a.kind === "class_instance")
|
|
45770
46517
|
return [{ kind: "number" }];
|
|
45771
46518
|
if (a.kind === "tensor")
|
|
45772
46519
|
return [
|
|
@@ -45788,6 +46535,13 @@ defineBuiltin({
|
|
|
45788
46535
|
const codes = Array.from(v.value).map((c) => c.charCodeAt(0));
|
|
45789
46536
|
return RTV.row(codes);
|
|
45790
46537
|
}
|
|
46538
|
+
if (isRuntimeString(v)) return RTV.num(parseDoubleText(v));
|
|
46539
|
+
if (isRuntimeStringArray(v)) {
|
|
46540
|
+
return RTV.tensor(allocFloat64Array(v.data.map(parseDoubleText)), [
|
|
46541
|
+
v.shape[0],
|
|
46542
|
+
v.shape[1]
|
|
46543
|
+
]);
|
|
46544
|
+
}
|
|
45791
46545
|
if (isRuntimeLogical(v)) return RTV.num(v ? 1 : 0);
|
|
45792
46546
|
if (isRuntimeNumber(v)) return v;
|
|
45793
46547
|
if (isRuntimeComplexNumber(v)) return v.re;
|
|
@@ -46491,14 +47245,19 @@ registerIBuiltin({
|
|
|
46491
47245
|
let delims;
|
|
46492
47246
|
if (isRuntimeCell(args[1])) {
|
|
46493
47247
|
delims = args[1].data.map((d) => toString(d));
|
|
47248
|
+
} else if (isRuntimeStringArray(args[1])) {
|
|
47249
|
+
delims = args[1].data.slice();
|
|
46494
47250
|
} else {
|
|
46495
47251
|
delims = [toString(args[1])];
|
|
46496
47252
|
}
|
|
46497
47253
|
const escaped = delims.map((d) => d.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("|");
|
|
46498
47254
|
parts = s.split(new RegExp("(?:" + escaped + ")+"));
|
|
46499
47255
|
}
|
|
47256
|
+
if (isRuntimeString(args[0]) || isRuntimeStringArray(args[0])) {
|
|
47257
|
+
return stringArrayValue(parts, [1, parts.length]);
|
|
47258
|
+
}
|
|
46500
47259
|
return RTV.cell(
|
|
46501
|
-
parts.map((p2) => RTV.
|
|
47260
|
+
parts.map((p2) => RTV.char(p2)),
|
|
46502
47261
|
[1, parts.length]
|
|
46503
47262
|
);
|
|
46504
47263
|
}
|
|
@@ -46512,11 +47271,18 @@ registerIBuiltin({
|
|
|
46512
47271
|
return {
|
|
46513
47272
|
outputTypes: [{ kind: "string" }],
|
|
46514
47273
|
apply: (args) => {
|
|
46515
|
-
|
|
47274
|
+
let elements;
|
|
47275
|
+
if (isRuntimeCell(args[0])) {
|
|
47276
|
+
elements = args[0].data.map((v) => toString(v));
|
|
47277
|
+
} else if (isRuntimeStringArray(args[0])) {
|
|
47278
|
+
elements = args[0].data.slice();
|
|
47279
|
+
} else if (isRuntimeString(args[0])) {
|
|
47280
|
+
elements = [args[0]];
|
|
47281
|
+
} else {
|
|
46516
47282
|
throw new RuntimeError(
|
|
46517
|
-
"strjoin: first argument must be a cell array"
|
|
47283
|
+
"strjoin: first argument must be a cell array or string array"
|
|
46518
47284
|
);
|
|
46519
|
-
|
|
47285
|
+
}
|
|
46520
47286
|
const delim = args.length >= 2 ? toString(args[1]) : " ";
|
|
46521
47287
|
return RTV.string(elements.join(delim));
|
|
46522
47288
|
}
|
|
@@ -46593,6 +47359,19 @@ function regexpImpl(caseSensitive, name, args, nargout) {
|
|
|
46593
47359
|
[1, tokensList.length]
|
|
46594
47360
|
);
|
|
46595
47361
|
}
|
|
47362
|
+
if (mode === "split") {
|
|
47363
|
+
const splits = [];
|
|
47364
|
+
let prev = 0;
|
|
47365
|
+
for (let i = 0; i < starts.length; i++) {
|
|
47366
|
+
splits.push(str.slice(prev, starts[i] - 1));
|
|
47367
|
+
prev = ends[i];
|
|
47368
|
+
}
|
|
47369
|
+
splits.push(str.slice(prev));
|
|
47370
|
+
return RTV.cell(
|
|
47371
|
+
splits.map((s) => RTV.char(s)),
|
|
47372
|
+
[1, splits.length]
|
|
47373
|
+
);
|
|
47374
|
+
}
|
|
46596
47375
|
if (mode === "names") {
|
|
46597
47376
|
if (starts.length === 0) return RTV.tensor(allocFloat64Array(0), [0, 0]);
|
|
46598
47377
|
const namedRe = new RegExp(pat, flags);
|
|
@@ -55036,6 +55815,7 @@ var SPECIAL_BUILTIN_NAMES = [
|
|
|
55036
55815
|
"fclose",
|
|
55037
55816
|
"fgetl",
|
|
55038
55817
|
"fgets",
|
|
55818
|
+
"fscanf",
|
|
55039
55819
|
"fileread",
|
|
55040
55820
|
"feof",
|
|
55041
55821
|
"ferror",
|
|
@@ -55303,7 +56083,10 @@ function registerSpecialBuiltins(rt) {
|
|
|
55303
56083
|
fmtIdx = 1;
|
|
55304
56084
|
}
|
|
55305
56085
|
const fmt = toString(margs[fmtIdx]);
|
|
55306
|
-
|
|
56086
|
+
const rest = margs.slice(fmtIdx + 1).flatMap(
|
|
56087
|
+
(a) => isRuntimeStringArray(a) ? a.data.map((s) => RTV.string(s)) : [a]
|
|
56088
|
+
);
|
|
56089
|
+
output = sprintfFormat(fmt, rest);
|
|
55307
56090
|
if (fid === 1 || fid === 2) {
|
|
55308
56091
|
rt.output(output);
|
|
55309
56092
|
} else {
|
|
@@ -55457,6 +56240,53 @@ function registerSpecialBuiltins(rt) {
|
|
|
55457
56240
|
const result = io.fgets(toNumber(margs[0]));
|
|
55458
56241
|
return typeof result === "number" ? RTV.num(result) : RTV.char(result);
|
|
55459
56242
|
});
|
|
56243
|
+
registerSpecial("fscanf", (nargout, args) => {
|
|
56244
|
+
const io = requireFileIO();
|
|
56245
|
+
const margs = args.map((a) => ensureRuntimeValue(a));
|
|
56246
|
+
if (margs.length < 2)
|
|
56247
|
+
throw new RuntimeError("fscanf requires at least 2 arguments");
|
|
56248
|
+
if (!io.ftell || !io.fseek || !io.freadBytes)
|
|
56249
|
+
throw new RuntimeError("fscanf is not supported in this environment");
|
|
56250
|
+
const fid = toNumber(margs[0]);
|
|
56251
|
+
const fmt = toString(margs[1]);
|
|
56252
|
+
let maxCount = Infinity;
|
|
56253
|
+
let rows = null;
|
|
56254
|
+
if (margs.length >= 3) {
|
|
56255
|
+
const sz = margs[2];
|
|
56256
|
+
if (isRuntimeTensor(sz) && sz.data.length >= 2) {
|
|
56257
|
+
rows = sz.data[0];
|
|
56258
|
+
maxCount = sz.data[0] * sz.data[1];
|
|
56259
|
+
} else {
|
|
56260
|
+
maxCount = toNumber(sz);
|
|
56261
|
+
}
|
|
56262
|
+
}
|
|
56263
|
+
const pos = io.ftell(fid);
|
|
56264
|
+
const CHUNK = 1 << 16;
|
|
56265
|
+
const chunks = [];
|
|
56266
|
+
for (; ; ) {
|
|
56267
|
+
const bytes = io.freadBytes(fid, CHUNK);
|
|
56268
|
+
let s = "";
|
|
56269
|
+
for (let i = 0; i < bytes.length; i++) s += String.fromCharCode(bytes[i]);
|
|
56270
|
+
chunks.push(s);
|
|
56271
|
+
if (bytes.length < CHUNK) break;
|
|
56272
|
+
}
|
|
56273
|
+
const { results, consumed } = scanFormat(chunks.join(""), fmt, maxCount);
|
|
56274
|
+
io.fseek(fid, pos + consumed, -1);
|
|
56275
|
+
const n = results.length;
|
|
56276
|
+
let out;
|
|
56277
|
+
if (rows !== null && Number.isFinite(rows) && rows > 0) {
|
|
56278
|
+
const cols = Math.ceil(n / rows);
|
|
56279
|
+
const data = allocFloat64Array(rows * cols);
|
|
56280
|
+
for (let i = 0; i < n; i++) data[i] = results[i];
|
|
56281
|
+
out = RTV.tensor(data, [rows, cols]);
|
|
56282
|
+
} else if (n === 1) {
|
|
56283
|
+
out = RTV.num(results[0]);
|
|
56284
|
+
} else {
|
|
56285
|
+
out = RTV.tensor(allocFloat64Array(results), [n, 1]);
|
|
56286
|
+
}
|
|
56287
|
+
if (nargout >= 2) return [out, RTV.num(n)];
|
|
56288
|
+
return out;
|
|
56289
|
+
});
|
|
55460
56290
|
registerSpecial("fileread", (_nargout, args) => {
|
|
55461
56291
|
const io = requireFileIO();
|
|
55462
56292
|
const margs = args.map((a) => ensureRuntimeValue(a));
|
|
@@ -57884,6 +58714,9 @@ function isa(rt, value, classNameArg) {
|
|
|
57884
58714
|
case "class_instance_array":
|
|
57885
58715
|
valueClass = mv.className;
|
|
57886
58716
|
break;
|
|
58717
|
+
case "string_array":
|
|
58718
|
+
valueClass = "string";
|
|
58719
|
+
break;
|
|
57887
58720
|
default:
|
|
57888
58721
|
valueClass = "unknown";
|
|
57889
58722
|
break;
|
|
@@ -58457,6 +59290,8 @@ function numblClass(v) {
|
|
|
58457
59290
|
return "double";
|
|
58458
59291
|
case "class_instance":
|
|
58459
59292
|
return v.className;
|
|
59293
|
+
case "string_array":
|
|
59294
|
+
return "string";
|
|
58460
59295
|
default:
|
|
58461
59296
|
return "unknown";
|
|
58462
59297
|
}
|
|
@@ -58626,6 +59461,10 @@ function endResolver(mv, numIndices) {
|
|
|
58626
59461
|
}
|
|
58627
59462
|
if (isRuntimeStructArray(mv)) return mv.elements.length;
|
|
58628
59463
|
if (isRuntimeClassInstanceArray(mv)) return mv.elements.length;
|
|
59464
|
+
if (isRuntimeStringArray(mv)) {
|
|
59465
|
+
if (numIndices === 1) return mv.data.length;
|
|
59466
|
+
return dim < 2 ? mv.shape[dim] : 1;
|
|
59467
|
+
}
|
|
58629
59468
|
if (isRuntimeSparseMatrix(mv)) {
|
|
58630
59469
|
if (numIndices === 1) return mv.m * mv.n;
|
|
58631
59470
|
return dim === 0 ? mv.m : dim === 1 ? mv.n : 1;
|
|
@@ -58912,6 +59751,28 @@ function indexCell(rt, base, indices) {
|
|
|
58912
59751
|
if (isRuntimeCell(val) && val.data.length === 1) return val.data[0];
|
|
58913
59752
|
return val;
|
|
58914
59753
|
}
|
|
59754
|
+
if (isRuntimeString(mv) || isRuntimeStringArray(mv)) {
|
|
59755
|
+
const idxMvals2 = resolveIndices(indices, endResolver(mv, indices.length));
|
|
59756
|
+
const elems = isRuntimeString(mv) ? [mv] : mv.data;
|
|
59757
|
+
const shape = isRuntimeString(mv) ? [1, 1] : mv.shape;
|
|
59758
|
+
let lin;
|
|
59759
|
+
if (idxMvals2.length === 1) {
|
|
59760
|
+
lin = Math.round(toNumber(idxMvals2[0])) - 1;
|
|
59761
|
+
} else if (idxMvals2.length === 2) {
|
|
59762
|
+
const r = Math.round(toNumber(idxMvals2[0])) - 1;
|
|
59763
|
+
const c = Math.round(toNumber(idxMvals2[1])) - 1;
|
|
59764
|
+
if (r < 0 || r >= shape[0] || c < 0 || c >= shape[1])
|
|
59765
|
+
throw new RuntimeError("Index exceeds array bounds");
|
|
59766
|
+
lin = c * shape[0] + r;
|
|
59767
|
+
} else {
|
|
59768
|
+
throw new RuntimeError(
|
|
59769
|
+
"String brace indexing supports 1 or 2 subscripts"
|
|
59770
|
+
);
|
|
59771
|
+
}
|
|
59772
|
+
if (lin < 0 || lin >= elems.length)
|
|
59773
|
+
throw new RuntimeError("Index exceeds array bounds");
|
|
59774
|
+
return RTV.char(elems[lin]);
|
|
59775
|
+
}
|
|
58915
59776
|
if (!isRuntimeCell(mv)) throw new RuntimeError("Cell indexing on non-cell");
|
|
58916
59777
|
const idxMvals = resolveIndices(indices, endResolver(mv, indices.length));
|
|
58917
59778
|
if (idxMvals.length === 1) {
|
|
@@ -59105,6 +59966,15 @@ function indexStore(rt, base, indices, rhs, skipSubsasgn = false) {
|
|
|
59105
59966
|
return rhsMv2;
|
|
59106
59967
|
}
|
|
59107
59968
|
}
|
|
59969
|
+
{
|
|
59970
|
+
const rhsMv0 = ensureRuntimeValue(rhs);
|
|
59971
|
+
const baseIsStr = isRuntimeString(mv) || isRuntimeStringArray(mv);
|
|
59972
|
+
const baseEmpty = isRuntimeTensor(mv) && mv.data.length === 0;
|
|
59973
|
+
const rhsIsStr = isRuntimeString(rhsMv0) || isRuntimeStringArray(rhsMv0);
|
|
59974
|
+
if (baseIsStr || baseEmpty && rhsIsStr) {
|
|
59975
|
+
return stringArrayIndexStore(mv, indices, rhsMv0);
|
|
59976
|
+
}
|
|
59977
|
+
}
|
|
59108
59978
|
let wasScalar = false;
|
|
59109
59979
|
let wasChar = false;
|
|
59110
59980
|
if (!isRuntimeTensor(mv)) {
|
|
@@ -59148,6 +60018,109 @@ function indexStore(rt, base, indices, rhs, skipSubsasgn = false) {
|
|
|
59148
60018
|
}
|
|
59149
60019
|
return result;
|
|
59150
60020
|
}
|
|
60021
|
+
function rhsToStringElems(rhsMv) {
|
|
60022
|
+
if (isRuntimeString(rhsMv)) return [rhsMv];
|
|
60023
|
+
if (isRuntimeStringArray(rhsMv)) return rhsMv.data.slice();
|
|
60024
|
+
if (isRuntimeChar(rhsMv)) {
|
|
60025
|
+
const rows = rhsMv.shape ? rhsMv.shape[0] : 1;
|
|
60026
|
+
if (rows <= 1) return [rhsMv.value];
|
|
60027
|
+
const width = rhsMv.shape[1];
|
|
60028
|
+
const out = [];
|
|
60029
|
+
for (let r = 0; r < rows; r++)
|
|
60030
|
+
out.push(rhsMv.value.slice(r * width, (r + 1) * width));
|
|
60031
|
+
return out;
|
|
60032
|
+
}
|
|
60033
|
+
if (isRuntimeNumber(rhsMv)) return [matlabNumToString(rhsMv)];
|
|
60034
|
+
if (isRuntimeLogical(rhsMv)) return [rhsMv ? "true" : "false"];
|
|
60035
|
+
if (isRuntimeTensor(rhsMv))
|
|
60036
|
+
return Array.from(rhsMv.data, (d) => matlabNumToString(d));
|
|
60037
|
+
return null;
|
|
60038
|
+
}
|
|
60039
|
+
function stringArrayIndexStore(mv, indices, rhsMv) {
|
|
60040
|
+
let data;
|
|
60041
|
+
let rows;
|
|
60042
|
+
let cols;
|
|
60043
|
+
if (isRuntimeStringArray(mv)) {
|
|
60044
|
+
data = mv.data.slice();
|
|
60045
|
+
[rows, cols] = mv.shape;
|
|
60046
|
+
} else if (isRuntimeString(mv)) {
|
|
60047
|
+
data = [mv];
|
|
60048
|
+
rows = 1;
|
|
60049
|
+
cols = 1;
|
|
60050
|
+
} else {
|
|
60051
|
+
data = [];
|
|
60052
|
+
rows = 0;
|
|
60053
|
+
cols = 0;
|
|
60054
|
+
}
|
|
60055
|
+
const idxMvals = resolveIndices(indices, endResolver(mv, indices.length));
|
|
60056
|
+
if (isRuntimeTensor(rhsMv) && rhsMv.data.length === 0 && idxMvals.length === 1) {
|
|
60057
|
+
const del = new Set(stringArraySubscript(idxMvals[0], data.length));
|
|
60058
|
+
const kept = data.filter((_, i) => !del.has(i));
|
|
60059
|
+
if (cols === 1 && rows > 1) return stringArrayValue(kept, [kept.length, 1]);
|
|
60060
|
+
return stringArrayValue(kept, [1, kept.length]);
|
|
60061
|
+
}
|
|
60062
|
+
const rhsElems = rhsToStringElems(rhsMv);
|
|
60063
|
+
if (rhsElems === null) {
|
|
60064
|
+
throw new RuntimeError("Cannot assign this value into a string array");
|
|
60065
|
+
}
|
|
60066
|
+
if (idxMvals.length === 1) {
|
|
60067
|
+
const positions = stringArraySubscript(idxMvals[0], data.length);
|
|
60068
|
+
const maxPos = positions.length ? Math.max(...positions) : -1;
|
|
60069
|
+
if (positions.some((p2) => p2 < 0)) {
|
|
60070
|
+
throw new RuntimeError("Index must be a positive integer");
|
|
60071
|
+
}
|
|
60072
|
+
if (maxPos >= data.length) {
|
|
60073
|
+
if (rows > 1 && cols > 1) {
|
|
60074
|
+
throw new RuntimeError("Index exceeds array bounds");
|
|
60075
|
+
}
|
|
60076
|
+
while (data.length <= maxPos) data.push("");
|
|
60077
|
+
}
|
|
60078
|
+
if (rhsElems.length !== 1 && rhsElems.length !== positions.length) {
|
|
60079
|
+
throw new RuntimeError(
|
|
60080
|
+
"Unable to perform assignment because the left and right sides have a different number of elements"
|
|
60081
|
+
);
|
|
60082
|
+
}
|
|
60083
|
+
positions.forEach((p2, k) => {
|
|
60084
|
+
data[p2] = rhsElems.length === 1 ? rhsElems[0] : rhsElems[k];
|
|
60085
|
+
});
|
|
60086
|
+
if (rows > 1 && cols > 1) return stringArrayValue(data, [rows, cols]);
|
|
60087
|
+
if (cols === 1 && rows > 1) return stringArrayValue(data, [data.length, 1]);
|
|
60088
|
+
return stringArrayValue(data, [1, data.length]);
|
|
60089
|
+
}
|
|
60090
|
+
if (idxMvals.length === 2) {
|
|
60091
|
+
const ri = stringArraySubscript(idxMvals[0], rows);
|
|
60092
|
+
const ci = stringArraySubscript(idxMvals[1], cols);
|
|
60093
|
+
if (ri.some((p2) => p2 < 0) || ci.some((p2) => p2 < 0)) {
|
|
60094
|
+
throw new RuntimeError("Index must be a positive integer");
|
|
60095
|
+
}
|
|
60096
|
+
const newRows = Math.max(rows, ri.length ? Math.max(...ri) + 1 : 0);
|
|
60097
|
+
const newCols = Math.max(cols, ci.length ? Math.max(...ci) + 1 : 0);
|
|
60098
|
+
let grid = data;
|
|
60099
|
+
if (newRows !== rows || newCols !== cols) {
|
|
60100
|
+
grid = new Array(newRows * newCols).fill("");
|
|
60101
|
+
for (let c = 0; c < cols; c++) {
|
|
60102
|
+
for (let r = 0; r < rows; r++) {
|
|
60103
|
+
grid[c * newRows + r] = data[c * rows + r];
|
|
60104
|
+
}
|
|
60105
|
+
}
|
|
60106
|
+
}
|
|
60107
|
+
const count = ri.length * ci.length;
|
|
60108
|
+
if (rhsElems.length !== 1 && rhsElems.length !== count) {
|
|
60109
|
+
throw new RuntimeError(
|
|
60110
|
+
"Unable to perform assignment because the left and right sides have a different number of elements"
|
|
60111
|
+
);
|
|
60112
|
+
}
|
|
60113
|
+
let k = 0;
|
|
60114
|
+
for (const c of ci) {
|
|
60115
|
+
for (const r of ri) {
|
|
60116
|
+
grid[c * newRows + r] = rhsElems.length === 1 ? rhsElems[0] : rhsElems[k];
|
|
60117
|
+
k++;
|
|
60118
|
+
}
|
|
60119
|
+
}
|
|
60120
|
+
return stringArrayValue(grid, [newRows, newCols]);
|
|
60121
|
+
}
|
|
60122
|
+
throw new RuntimeError("String array assignment supports 1 or 2 subscripts");
|
|
60123
|
+
}
|
|
59151
60124
|
function indexCellStore(base, indices, rhs, rt) {
|
|
59152
60125
|
if (base === void 0 || base === null) base = RTV.cell([], [0, 0]);
|
|
59153
60126
|
let mv = ensureRuntimeValue(base);
|
|
@@ -61361,6 +62334,7 @@ var Runtime = class _Runtime {
|
|
|
61361
62334
|
if (isRuntimeChar(rv))
|
|
61362
62335
|
return rv.shape ?? (rv.value.length === 0 ? [0, 0] : [1, rv.value.length]);
|
|
61363
62336
|
if (isRuntimeString(rv)) return [1, 1];
|
|
62337
|
+
if (isRuntimeStringArray(rv)) return [...rv.shape];
|
|
61364
62338
|
if (isRuntimeClassInstance(rv)) return [1, 1];
|
|
61365
62339
|
return [1, 1];
|
|
61366
62340
|
}
|
|
@@ -64372,13 +65346,16 @@ function evalExprNargout(expr, nargout) {
|
|
|
64372
65346
|
return ctx.dimIndex < rv.shape.length ? rv.shape[ctx.dimIndex] : 1;
|
|
64373
65347
|
}
|
|
64374
65348
|
if (isRuntimeChar(rv)) return rv.value.length;
|
|
64375
|
-
if (isRuntimeString(rv)) return
|
|
65349
|
+
if (isRuntimeString(rv)) return 1;
|
|
64376
65350
|
if (isRuntimeClassInstance(rv)) {
|
|
64377
|
-
|
|
64378
|
-
|
|
64379
|
-
|
|
64380
|
-
|
|
64381
|
-
|
|
65351
|
+
if (this.rt.resolveClassMethod?.(rv.className, "end")) {
|
|
65352
|
+
return this.rt.dispatch("end", 1, [
|
|
65353
|
+
rv,
|
|
65354
|
+
ctx.dimIndex + 1,
|
|
65355
|
+
ctx.numIndices
|
|
65356
|
+
]);
|
|
65357
|
+
}
|
|
65358
|
+
return 1;
|
|
64382
65359
|
}
|
|
64383
65360
|
if (isRuntimeStructArray(rv)) {
|
|
64384
65361
|
return rv.elements.length;
|
|
@@ -64387,6 +65364,10 @@ function evalExprNargout(expr, nargout) {
|
|
|
64387
65364
|
if (ctx.numIndices === 1) return rv.elements.length;
|
|
64388
65365
|
return ctx.dimIndex < rv.shape.length ? rv.shape[ctx.dimIndex] : 1;
|
|
64389
65366
|
}
|
|
65367
|
+
if (isRuntimeStringArray(rv)) {
|
|
65368
|
+
if (ctx.numIndices === 1) return rv.data.length;
|
|
65369
|
+
return ctx.dimIndex < 2 ? rv.shape[ctx.dimIndex] : 1;
|
|
65370
|
+
}
|
|
64390
65371
|
if (isRuntimeSparseMatrix(rv)) {
|
|
64391
65372
|
if (ctx.numIndices === 1) return rv.m * rv.n;
|
|
64392
65373
|
return ctx.dimIndex === 0 ? rv.m : ctx.dimIndex === 1 ? rv.n : 1;
|
|
@@ -64711,7 +65692,8 @@ function evalMember(expr, nargout) {
|
|
|
64711
65692
|
if (lastDot > 0) {
|
|
64712
65693
|
const prefix = dottedName.slice(0, lastDot);
|
|
64713
65694
|
const methodName = dottedName.slice(lastDot + 1);
|
|
64714
|
-
if (this.functionIndex.classStaticMethods.get(prefix)?.has(methodName))
|
|
65695
|
+
if (this.functionIndex.classStaticMethods.get(prefix)?.has(methodName) || // Implicit static `ClassName.empty` (handled by interpretClassMethod)
|
|
65696
|
+
methodName === "empty" && this.functionIndex.workspaceClasses.has(prefix)) {
|
|
64715
65697
|
const target = {
|
|
64716
65698
|
kind: "classMethod",
|
|
64717
65699
|
className: prefix,
|
|
@@ -65963,6 +66945,22 @@ function interpretClassMethod(target, args, nargout) {
|
|
|
65963
66945
|
() => this.callUserFunction(extFn, actualArgs2, nargout)
|
|
65964
66946
|
);
|
|
65965
66947
|
}
|
|
66948
|
+
if (methodName === "empty") {
|
|
66949
|
+
const dims = [];
|
|
66950
|
+
for (const a of args) {
|
|
66951
|
+
const rv = ensureRuntimeValue(a);
|
|
66952
|
+
if (isRuntimeTensor(rv)) for (const d of rv.data) dims.push(d);
|
|
66953
|
+
else dims.push(toNumber(rv));
|
|
66954
|
+
}
|
|
66955
|
+
if (dims.length === 1) dims.push(dims[0]);
|
|
66956
|
+
if (dims.length === 0) dims.push(0, 0);
|
|
66957
|
+
if (!dims.some((d) => d === 0)) {
|
|
66958
|
+
throw new RuntimeError(
|
|
66959
|
+
`${className}.empty: at least one dimension must be zero`
|
|
66960
|
+
);
|
|
66961
|
+
}
|
|
66962
|
+
return RTV.classInstanceArray(className, [], [dims[0], dims[1]]);
|
|
66963
|
+
}
|
|
65966
66964
|
throw new RuntimeError(
|
|
65967
66965
|
`No method '${methodName}' for class '${className}'`
|
|
65968
66966
|
);
|
|
@@ -66088,8 +67086,9 @@ function callUserFunction(fn, args, nargout, narginOverride) {
|
|
|
66088
67086
|
const fnEnv = new Environment();
|
|
66089
67087
|
fnEnv.rt = this.rt;
|
|
66090
67088
|
fnEnv.persistentFuncId = `${this.currentFile}:${fn.name}`;
|
|
66091
|
-
const
|
|
66092
|
-
const
|
|
67089
|
+
const vararginIdx = fn.params.indexOf("varargin");
|
|
67090
|
+
const hasVarargin = vararginIdx !== -1;
|
|
67091
|
+
const regularParams = hasVarargin ? fn.params.slice(0, vararginIdx) : fn.params;
|
|
66093
67092
|
let numPositional = regularParams.length;
|
|
66094
67093
|
const inputBlocks = (fn.argumentsBlocks ?? []).filter(
|
|
66095
67094
|
(b) => b.kind !== "Output"
|
|
@@ -66108,7 +67107,14 @@ function callUserFunction(fn, args, nargout, narginOverride) {
|
|
|
66108
67107
|
}
|
|
66109
67108
|
}
|
|
66110
67109
|
if (hasVarargin) {
|
|
66111
|
-
|
|
67110
|
+
let extras = sharedArgs.slice(regularParams.length);
|
|
67111
|
+
if (vararginIdx !== fn.params.length - 1) {
|
|
67112
|
+
extras = extras.slice(
|
|
67113
|
+
0,
|
|
67114
|
+
nameValueTailStart(extras, nameValueFieldNames(fn))
|
|
67115
|
+
);
|
|
67116
|
+
}
|
|
67117
|
+
const extraArgs = extras.map((a) => ensureRuntimeValue(a));
|
|
66112
67118
|
fnEnv.set("varargin", RTV.cell(extraArgs, [1, extraArgs.length]));
|
|
66113
67119
|
}
|
|
66114
67120
|
fnEnv.set("$nargin", narginOverride ?? args.length);
|
|
@@ -66493,6 +67499,28 @@ function evalInLocalScope(codeArg, fileName) {
|
|
|
66493
67499
|
}
|
|
66494
67500
|
throw new RuntimeError("eval not available in this context");
|
|
66495
67501
|
}
|
|
67502
|
+
function nameValueFieldNames(fn) {
|
|
67503
|
+
const names = /* @__PURE__ */ new Set();
|
|
67504
|
+
for (const block of fn.argumentsBlocks ?? []) {
|
|
67505
|
+
if (block.kind === "Output" || block.kind === "OutputRepeating") continue;
|
|
67506
|
+
for (const e of block.entries) {
|
|
67507
|
+
const dot2 = e.name.indexOf(".");
|
|
67508
|
+
if (dot2 >= 0) names.add(e.name.slice(dot2 + 1));
|
|
67509
|
+
}
|
|
67510
|
+
}
|
|
67511
|
+
return names;
|
|
67512
|
+
}
|
|
67513
|
+
function nameValueTailStart(extras, fieldNames) {
|
|
67514
|
+
if (fieldNames.size === 0) return extras.length;
|
|
67515
|
+
for (let i = 0; i < extras.length; i++) {
|
|
67516
|
+
if (extras[i] === void 0) continue;
|
|
67517
|
+
const rv = ensureRuntimeValue(extras[i]);
|
|
67518
|
+
if ((isRuntimeChar(rv) || isRuntimeString(rv)) && fieldNames.has(toString(rv))) {
|
|
67519
|
+
return i;
|
|
67520
|
+
}
|
|
67521
|
+
}
|
|
67522
|
+
return extras.length;
|
|
67523
|
+
}
|
|
66496
67524
|
function processArgumentsBlocks(fn, args) {
|
|
66497
67525
|
const argBlocks = fn.argumentsBlocks;
|
|
66498
67526
|
if (!argBlocks || argBlocks.length === 0) return;
|
|
@@ -66527,9 +67555,18 @@ function processArgumentsBlocks(fn, args) {
|
|
|
66527
67555
|
);
|
|
66528
67556
|
}
|
|
66529
67557
|
}
|
|
67558
|
+
const vararginIdx = fn.params.indexOf("varargin");
|
|
66530
67559
|
for (const [paramName, fields] of nvGroups) {
|
|
66531
67560
|
const pIdx = fn.params.indexOf(paramName);
|
|
66532
|
-
|
|
67561
|
+
let nvArgs;
|
|
67562
|
+
if (pIdx >= 0 && vararginIdx >= 0 && vararginIdx < pIdx) {
|
|
67563
|
+
const extras = args.slice(vararginIdx);
|
|
67564
|
+
nvArgs = extras.slice(
|
|
67565
|
+
nameValueTailStart(extras, nameValueFieldNames(fn))
|
|
67566
|
+
);
|
|
67567
|
+
} else {
|
|
67568
|
+
nvArgs = args.slice(pIdx >= 0 ? pIdx : args.length);
|
|
67569
|
+
}
|
|
66533
67570
|
const defaults = {};
|
|
66534
67571
|
for (const { field, defaultExpr } of fields) {
|
|
66535
67572
|
if (defaultExpr) defaults[field] = this.evalExpr(defaultExpr);
|
|
@@ -67815,6 +68852,11 @@ var shimFiles = [
|
|
|
67815
68852
|
else
|
|
67816
68853
|
result = val;
|
|
67817
68854
|
end
|
|
68855
|
+
% The backing dictionary stores char values as strings;
|
|
68856
|
+
% MATLAB's containers.Map hands back char.
|
|
68857
|
+
if strcmp(obj.ValueType, 'char') && isstring(result)
|
|
68858
|
+
result = char(result);
|
|
68859
|
+
end
|
|
67818
68860
|
elseif strcmp(S(1).type, '.')
|
|
67819
68861
|
result = builtin('subsref', obj, S);
|
|
67820
68862
|
elseif strcmp(S(1).type, '{}')
|
|
@@ -67848,11 +68890,14 @@ var shimFiles = [
|
|
|
67848
68890
|
end
|
|
67849
68891
|
k = keys(obj.data_);
|
|
67850
68892
|
if strcmp(obj.KeyType, 'char')
|
|
67851
|
-
% Return
|
|
67852
|
-
|
|
67853
|
-
|
|
67854
|
-
|
|
67855
|
-
|
|
68893
|
+
% Return a cellstr: the backing dictionary stores keys as
|
|
68894
|
+
% strings, but MATLAB's containers.Map returns char vectors.
|
|
68895
|
+
if ~iscell(k)
|
|
68896
|
+
k = {k};
|
|
68897
|
+
end
|
|
68898
|
+
result = cell(size(k));
|
|
68899
|
+
for i = 1:numel(k)
|
|
68900
|
+
result{i} = char(k{i});
|
|
67856
68901
|
end
|
|
67857
68902
|
else
|
|
67858
68903
|
% Numeric keys: parse back from string
|
|
@@ -67885,6 +68930,14 @@ var shimFiles = [
|
|
|
67885
68930
|
result{i} = v(i);
|
|
67886
68931
|
end
|
|
67887
68932
|
end
|
|
68933
|
+
if strcmp(obj.ValueType, 'char')
|
|
68934
|
+
% Stored as strings in the dictionary; MATLAB returns char.
|
|
68935
|
+
for i = 1:numel(result)
|
|
68936
|
+
if isstring(result{i})
|
|
68937
|
+
result{i} = char(result{i});
|
|
68938
|
+
end
|
|
68939
|
+
end
|
|
68940
|
+
end
|
|
67888
68941
|
end
|
|
67889
68942
|
end
|
|
67890
68943
|
|
|
@@ -91025,6 +92078,31 @@ function executeCode(source, options = {}, workspaceFiles, mainFileName = "scrip
|
|
|
91025
92078
|
implicitCwdPath = null;
|
|
91026
92079
|
}
|
|
91027
92080
|
}
|
|
92081
|
+
if (searchPaths && options.fileIO?.scanDirectory) {
|
|
92082
|
+
const haveM = new Set(mWorkspaceFiles.map((f) => f.name));
|
|
92083
|
+
for (const dir of searchPaths) {
|
|
92084
|
+
try {
|
|
92085
|
+
const absDir = options.fileIO.resolvePath?.(dir) ?? dir;
|
|
92086
|
+
for (const f of options.fileIO.scanDirectory(absDir)) {
|
|
92087
|
+
if (f.name.endsWith(".m")) {
|
|
92088
|
+
if (!haveM.has(f.name)) {
|
|
92089
|
+
mWorkspaceFiles.push(f);
|
|
92090
|
+
haveM.add(f.name);
|
|
92091
|
+
}
|
|
92092
|
+
} else if (isNumblJsFile(f.name)) {
|
|
92093
|
+
if (!jsWorkspaceFiles.some((e) => e.name === f.name)) {
|
|
92094
|
+
jsWorkspaceFiles.push(f);
|
|
92095
|
+
}
|
|
92096
|
+
} else if (f.name.endsWith(".wasm")) {
|
|
92097
|
+
if (!wasmWorkspaceFiles.some((e) => e.name === f.name)) {
|
|
92098
|
+
wasmWorkspaceFiles.push(f);
|
|
92099
|
+
}
|
|
92100
|
+
}
|
|
92101
|
+
}
|
|
92102
|
+
} catch {
|
|
92103
|
+
}
|
|
92104
|
+
}
|
|
92105
|
+
}
|
|
91028
92106
|
const jsUserFunctions = loadJsUserFunctions(
|
|
91029
92107
|
jsWorkspaceFiles,
|
|
91030
92108
|
wasmWorkspaceFiles,
|
|
@@ -92139,18 +93217,24 @@ var BrowserFileIOAdapter = class {
|
|
|
92139
93217
|
}
|
|
92140
93218
|
entry.dirty = true;
|
|
92141
93219
|
}
|
|
93220
|
+
/**
|
|
93221
|
+
* `entry.pos` stays the logical (consumed) byte position: the text buffer
|
|
93222
|
+
* holds the bytes starting at `entry.pos`, and consuming a line advances
|
|
93223
|
+
* `entry.pos` by its byte length. This keeps fgetl/fgets coherent with
|
|
93224
|
+
* freadBytes/fseek/ftell (and fscanf, which mixes the two).
|
|
93225
|
+
*/
|
|
92142
93226
|
readLine(entry, keepNewline) {
|
|
92143
93227
|
while (!entry.eof) {
|
|
92144
93228
|
const nlIdx2 = entry.buffer.indexOf("\n");
|
|
92145
93229
|
if (nlIdx2 !== -1) break;
|
|
92146
|
-
const
|
|
93230
|
+
const bufStart = entry.pos + TEXT_ENCODER.encode(entry.buffer).length;
|
|
93231
|
+
const available = entry.dataLen - bufStart;
|
|
92147
93232
|
if (available <= 0) {
|
|
92148
93233
|
entry.eof = true;
|
|
92149
93234
|
break;
|
|
92150
93235
|
}
|
|
92151
93236
|
const toRead = Math.min(READ_CHUNK_SIZE, available);
|
|
92152
|
-
const chunk = entry.data.subarray(
|
|
92153
|
-
entry.pos += toRead;
|
|
93237
|
+
const chunk = entry.data.subarray(bufStart, bufStart + toRead);
|
|
92154
93238
|
entry.buffer += TEXT_DECODER.decode(chunk, { stream: true });
|
|
92155
93239
|
}
|
|
92156
93240
|
if (entry.buffer.length === 0) {
|
|
@@ -92158,12 +93242,15 @@ var BrowserFileIOAdapter = class {
|
|
|
92158
93242
|
}
|
|
92159
93243
|
const nlIdx = entry.buffer.indexOf("\n");
|
|
92160
93244
|
if (nlIdx !== -1) {
|
|
92161
|
-
const
|
|
93245
|
+
const consumed = entry.buffer.slice(0, nlIdx + 1);
|
|
93246
|
+
const line2 = keepNewline ? consumed : entry.buffer.slice(0, nlIdx);
|
|
92162
93247
|
entry.buffer = entry.buffer.slice(nlIdx + 1);
|
|
93248
|
+
entry.pos += TEXT_ENCODER.encode(consumed).length;
|
|
92163
93249
|
return line2;
|
|
92164
93250
|
}
|
|
92165
93251
|
const line = entry.buffer;
|
|
92166
93252
|
entry.buffer = "";
|
|
93253
|
+
entry.pos += TEXT_ENCODER.encode(line).length;
|
|
92167
93254
|
return line;
|
|
92168
93255
|
}
|
|
92169
93256
|
listDirGlob(pattern) {
|