Mova0.5 pre-release⌕
☰
home / docs / mlab — a computing language in the spirit of MATLAB/Octave

mlab — a computing language in the spirit of MATLAB/Octave

mlab follows the logic of Octave as a small alternative to MATLAB. It is an interpreter for a subset of the language in Rust: matrices, 1-based indexing, colon, end, element-wise operations, functions, control flow, linear algebra, polynomials, FFT, numerical methods. Every linear algebra result passes a verification gate: a wrong answer produces a warning, not silence.

This is the natural plan language for the LLM (Opus writes such code fluently), while the SLM executes it (Smart annotator — layers, context, memory, "Mini-lab"). Our difference from Octave is the gates; an exact mode and steps are planned ("What next").

How it works

modulewhat it does
lexer.rstokens with position and a "space before" flag; an apostrophe is a transpose or a string depending on context; %/#, %{ … %}, ...
parser.rsrecursive descent with the language's precedences; a space inside [...] separates elements ([1 -2] — two, [1 - 2] — one); end in an index; command syntax (format long)
ast.rstree: expressions, statements, functions
value.rsValue: Mat (f64 column-major + class double/logical/char + optional imaginary part), Func (named/anonymous with capture), Table (v2: named columns of different types), Exact (v2: exact mode; an empty enum — the slot already exists in every match)
interp.rsworkspace and call frames, execution, end context, calls (variable → script function → builtin), output
ops.rsoperators with implicit expansion (broadcasting), complex numbers, matrix multiplication (faer for large ones), division, power, ranges, concatenation
index.rsreading A(I), A(I,J); assignment with growth; deletion A(I) = []
display.rsOctave-style x = … and disp output; printing of anonymous functions
builtins/an extensible registry (Registry::register): core, elem, reduce, io, linalg, poly, fft, numeric; v2 — table, stats
table.rs, fileio.rs, mcgate.rsv2: tables (columns, output, keys, dates), CSV/TSV/JSON, a Monte Carlo gate for p-values
rng.rsxoshiro256** + splitmix64, normals by Marsaglia's polar method; deterministic with a seed
suite.rs, main.rsscenario suite; CLI
vm.rsVM: a compiler from the tree to register bytecode and an executor; fallback to the tree is transparent (section "VM v1")
builtins/files.rsvfs: files and folders via the vfs::FileSystem trait; all file builtins go through Interp::fs (section "File system: vfs")

The v1 language

Builtins (229 in v1; 292 with v2; 300 with vfs)

mlab builtins prints the list. Groups:

Output format (our specification in the style of Octave format short)

Result verification gates

Checking is easier than generating, so the check is a gate. The threshold is 1000 · n · eps; stable algorithms lie orders of magnitude below, so the gate is silent on correct answers and shouts on wrong ones.

operationgate
A \ b (square)backward error ‖A·x − b‖ / (‖A‖‖x‖ + ‖b‖)
A \ b (least squares, singular)normal equations ‖Aᵀ(A·x − b)‖ / (‖A‖₁(‖A‖‖x‖ + ‖b‖))
inv(A)‖A·inv(A) − I‖ / (‖A‖‖inv(A)‖)
[V, D] = eig(A)‖A·V − V·D‖ / (‖A‖‖V‖); eigenvalues only — Σλ versus the trace
[U, S, V] = svd(A)‖U·S·Vᵀ − A‖ / ‖A‖; singular values only — Σσ² versus ‖A‖²_F
lu, qr, chol‖P·A − L·U‖, ‖Q·R − A‖, ‖RᵀR − A‖ relative to ‖A‖

On failure — warning: gate mldivide: |A*x - b| / (|A|*|x| + |b|) = 2.3e-01 exceeds 4.4e-13. A gate warning is not suppressed by warning off. Separately, as in Octave, — warning: matrix singular to machine precision for a singular matrix (rcond estimate by the Hager–Higham method < eps): then \ gives the minimum-norm solution (SVD), and inv of an exactly singular matrix gives Inf.

Negative control of the gate: Interp::fault = Some("gate:mldivide") (gate:inv, gate:eig, gate:svd) plants a wrong answer before the check; the test gates_silent_on_good_answers_and_loud_on_wrong_ones requires silence on correct answers and a warning on planted ones.

CLI

cargo build --release
../target/release/mlab run file.m            # script; output to stdout, warning/error to stderr; exit code 1 on error
../target/release/mlab -e "A = magic(4); rank(A)"
../target/release/mlab test data/suite-v1.txt [--fault sum] [-v]   # scenario suite, summary by category
../target/release/mlab builtins              # list of builtins
../target/release/mlab run examples/demo.m --fault gate:mldivide   # see how the gate catches a planted error
../target/release/mlab run file.m --vm       # the same on the register VM v1 (--vm also works with -e and test)
../target/release/mlab vmgate data/suite-v1.txt data/suite-v2.txt [--fault vm:add]   # VM equivalence gate
../target/release/mlab vmbench examples/vmbench   # tree versus VM, 3 runs, best
../target/release/mlab vmdump file.m         # bytecode listing
../target/release/mlab run file.m --fs mem   # (default) files only in memory; see "File system: vfs"
../target/release/mlab run file.m --fs-import data:/in --fs-export out:/out [--fs-limits file=64M] [--fs-journal j.tsv]
../target/release/mlab run file.m --fs dir:./data   # a real folder, the root is the boundary
../target/release/mlab run file.m --fs real  # the real FS without restrictions — only explicitly

examples/demo.m is a short demo: indexing, \ with the gate, eig, roots, integral to ∞, user functions, ode45. --fault NAME for run/-e/test is a negative control (a broken builtin or a wrong answer before the gate).

v1 measurements (26.09)

Scenario suite

data/suite-v1.txt — 206 scenarios with expected output (syntax 15, output 20, matrices 15, indexing 19, operators 19, control 13, functions 14, reductions 20, element-wise 9, output functions 10, linear algebra 20, gates 3, polynomials 7, spectrum 6, numerical methods 9, errors 7). Written from the language documentation (clean room), values come from identities and exact answers (A·inv(A) = I, A·V = V·D, U·S·Vᵀ = A, Fibonacci via A^10, exact roots, Parseval); where a number depends on rounding, the scenario prints a "< tolerance" check. Octave is not on the box and cannot be installed. Frozen by hash before the interpreter code: sha256 2c37701df94db6328546388cc21145c4c8fde48ea4f18aeb00e2e2333ca0b0e6 (test suite_is_frozen).

runscenarioscorrectred
first, before any fixes2062051 — la-18, an error in the suite
after the probe and fixes206205the same la-18

Suite errata. la-18 takes A = [2 0 1; 1 3 2; 1 1 1], but it is singular (det = 0) — an error in the suite. The interpreter is right: it warns "matrix singular to machine precision", and the identity inv(A)·A = I does not hold. The suite is frozen and not edited; the corrected scenario (det = 6) is the test errata_la18_corrected_passes.

Caveat. The suite and the interpreter were written by the same author, so 205/206 is conformance to our specification, not an independent yardstick of Octave compatibility. An independent check is in "What next".

Probe after the code (5 scripts, ~150 lines, probe): found and fixed — an extra blank line after column blocks; x++ was not parsed; s.a = 1 caused a parse error for the whole script (now a runtime error "structs are not supported"); integral on singularities (1/√x on [0, 1]: 1.9999988 → 1.9999999999998 after Shampine's substitution); x = f() for a function without an output; [1 2] && 1 (now an error, as in MATLAB).

Negative controls

Linear algebra backend: faer versus nalgebra

bench/ is a separate crate, single thread (faer — Par::Seq), best of 3 runs, nice; raw numbers — bench/result-2026-09-26.tsv.

taskfaer 0.24, snalgebra 0.35, sfaer / nalgebra
multiplication 1000×10000.0340.0370.90
solve 1000×1000 (LU)0.0170.1030.17
eig 500×500 non-symmetric, eigenvalues only0.0800.2130.38
eig 500×500 non-symmetric, values and vectors0.130—nalgebra cannot
eig 500×500 symmetric, values and vectors0.0320.1050.30

Residuals of the same order (‖Ax − b‖ 1.8e-11 / 1.6e-11; max|AV − VD| 1.9e-14 / 4.1e-14). faer was chosen: faster everywhere, and only it gives eigenvectors of non-symmetric matrices ([V, D] = eig(A)).

Interpreter speed (release, single thread)

tasktime
loop of 10⁶ scalar additions0.28 s
10⁵ assignments v(k) = k^20.03 s
A * B, 1000×10000.07 s
A \ b, 1000×1000, with rcond estimate and gate0.04 s
eig, 500×500, values only / with vectors, with gates0.11 / 0.21 s
the whole suite (206 scenarios)0.01 s

v2: tables, files, statistics

Statistics and Excel-like work with tables, export and import; table computations in RAM.

Tables — columnar, in memory

Import and export

Statistics

ttest2: two-sample t-test for independent samples (Welch)
  H0: μx = μy; H1: μx ≠ μy (two-sided), α = 0.05
  assumptions:
    independence of observations within and between samples — not checked from the data
    normality of both populations (or large n) — nx = 5, ny = 6
    equal variances not required (Welch); max s²/min s² = 1.80556
  steps:
    x̄ = 5.6, ȳ = 4.4, s²x = 0.325, s²y = 0.18
    SE = √(s²x/nx + s²y/ny) = 0.308221
    t = (x̄ − ȳ)/SE = 3.89331, df (Welch — Satterthwaite) = 7.3003
    p = 2·P(T ≥ |t|) = 0.00548141
  conclusion: p < α → reject H0 (h = 1); 95% CI for μx − μy: [0.477208, 1.92279]

v2 gates

v2 suite and controls

data/suite-v2.txt — 44 scenarios (tables 12, files 7, descriptive 6, distributions 5, tests 9, regression 3, errors 2), written and frozen before the code (commit adce85c1): sha256 012d330d0a428cf4242bc90a45f4978f222549fdd64c943030adf1a1bd1508c1 (test suite_v2_is_frozen). Expected values come from exact formulas and identities (t² = F, correlation p = slope p, χ² 2×2 = n(ad − bc)²/(r1·r2·c1·c2), F(1, ν) = t(ν)², binomial and Poisson fractions) and from textbook and R documentation examples: sleep (Student 1908), PlantGrowth, Agresti (2007), Anscombe's quartet.

runcorrectred
first, before any fixes43/44dist-01: normcdf(1.96) at the 12th digit — the erfc error in statrs
after our own erfc44/44—
v1 regression205/206the same la-18 (errata)

Negative controls (--fault NAME: +1 to the first result): mean, median, tinv, ttest, datenum, histcounts → 43/44; quantile, skewness, normcdf, chi2cdf, binopdf → 42/44 (test negative_control_v2_broken_builtins_turn_red). A CSV file with an error gives a clear error with line and column (scenarios io-04, io-05 and test csv_and_json_errors_name_line_and_column). CSV round trip with tricky text (comma, quotes, leading space, "007", empty string versus missing, a leap-year date) — test csv_round_trip_keeps_types_and_tricky_text. cargo test — 21 tests, green.

Benchmark: 1M rows in memory

examples/bench_table.m, release, single thread, nice:

operation (1,000,000 rows)time
table from three columns0.011 s
groupsummary sum by key (1000 groups) + sortrows of the result0.120 s (target < 1 s)
sortrows of the whole table by a numeric column0.140 s
groupsummary sum + mean by two keys (12,000 groups)0.250 s
two computed columns (T.y = T.x .* 2 + T.g, T.big = T.x > 0.5)0.010 s
grouptransform @cumsum by key (1000 handle calls)0.128 s
mask filter T(T.big & T.r == 3, :)0.022 s

Grouping is a (stable) sort of indices by keys and a pass over runs; joins use a hash index of the right table. Assigning a column does not copy the table (Rc::make_mut).

v2 differences from MATLAB

VM v1: register bytecode

A register VM, as in Lua 5 (Smart annotator — layers, context, memory, "Execution sandbox"). mlab run file.m --vm compiles the program to bytecode and executes it; whatever the compiler does not handle is executed by the tree walker, transparently for the user. Code — src/vm.rs, gate — tests/vm.rs.

How it works

Equivalence gate

mlab vmgate and the test vm_gate_frozen_suites_byte_identical: every scenario runs through the tree walker and the VM; all output, including warnings and errors, must match byte for byte; the first discrepancy is red and stops.

suitescenariossame outputentirely in VMstatements in VMfallback (statements / hits)DynEval
suite-v12062061995749 / 110
suite-v244442219547 / 475

Speed (release, single thread, nice, best of 3; including parsing and compilation)

mlab vmbench examples/vmbench (the output of both modes is compared):

tasktree, sVM, sspeedup
fib(27) recursively (≈ 630K calls)0.4170.0537.9×
loop of 10⁷ scalar additions1.8770.12914.5×
nested loops over a 1000×1000 matrix, B(i,j) = x*x + 2*x + 10.8370.06712.6×
mixed: \, *, norm, sum in a loop + 2·10⁵ scalar mod/sqrt/abs0.1630.0802.0×

WASM

rustup target add wasm32-wasip1 → cargo build --release --target wasm32-wasip1 builds without changes: mlab.wasm is 2,543,685 bytes (with vfs, without wasm-opt; 26.09), and it runs in our WASI host (section "File system: vfs"). Under WASI in Node 24 (V8): fib(27) — 0.630 s tree versus 0.069 s VM (9.1×), the 10⁷ loop — 2.747 versus 0.219 s (12.5×); 1.3–1.7 times slower than the native build.

v1 limitations

Independent tests (tests3, 26.09)

The v1/v2 suites were written by the same author as the code, so they measure conformance to the specification. Here there are independent sources: scenarios written by Opus and external test data. Worklog — tests3.md, runs — tests3-2026-09-26.

LLM scenarios (tests/data/vmm/, tests/vmm_suites.rs)

classcountwhat
defect, fixed10det(zeros(3)) = NaN (faer divides 0/0) → 0; complex(1, 0) was narrowed to real; linspace(a, b, 0) gave 1×1; printf('%g', -0) without the minus; upper/lower flattened a char matrix into a row; polyder(a, b) ignored the second argument; mode(A, 2) ignored the dimension; cov(x, 1) took 1 as Y; dot of complex numbers — an error; nchoosek(v, k) — "not supported"
defect, in "What next"4A.^2' (must be (A.^2)'), the loop variable after for k = 1:0 (must be 1×0), T.x(2) = 10 is not parsed, command syntax disp hello
test error2trace(A*B) = 28, not 29 (checked by hand with both products); anova1(…, 'Display', 'off') — the mistake was suggested by the prompt (in MATLAB the third argument is 'off')
difference (documented)2strrep with overlap — we behave like Octave ('ba'), MATLAB gives 'bb'; fitlm returns a table, not a LinearModel object

NIST StRD (tests/data/ext/nist/, tests/ext_nist.rs)

NIST Statistical Reference Datasets (public domain, .dat files as is): 11 regressions, 11 ANOVA, 9 descriptive. The yardstick is LRE, the number of correct significant digits (McCullough 1998), capped at 15. Minimum per dataset:

datasetdifficultyfitlm\ before → afteranova1 before → after
Norris, NoInt1/2lower13.3; 14.7; 15.013.0; 14.7; 15.0
Pontiuslower12.24.9 → 13.5
Longleyhigher12.89.1 → 11.4
Wampler1–5lower–higher9.6; 12.9; 9.0; 7.7; 5.79.4 → 9.6; 10.3 → 12.5; 9.5 → 9.6; 8.1; 6.1
Filip (degree-10 polynomial)higher7.30 silently → warning "rank deficient" (as in MATLAB)
SiRstv, SmLs01–03lower12.4–14.4 → 13.1–15.0
AtmWtAg, SmLs04–06average6.5–8.5 → 9.9–10.2
SmLs07–09 (10¹² + 0.x)higher2.7 / 2.0 / 0.0 → 4.0 / 3.9 / 3.9
PiDigits … NumAcc2lowermean/std/r(1): 13.0–15.0
NumAcc3, NumAcc4average, higher9.5; 8.3

Boost.Math (tests/data/ext/boost/, tests/ext_boost.rs)

Boost 1.92.0 test data (BSL-1.0, LICENSE_1_0.txt alongside): values with 35–40 digits. Largest relative error:

function, Boost samplepointsbefore, epsafter, eps
erf, erf_small_data1494.5·10¹⁵ (erf(1.4·10⁻⁴⁵) = 0)1.0
erf, erf_data50015.30.7
erfc, erf_data500410.7 (near x = 2)1.3
erf / erfc, erf_large_data300 / 680.0 / 3.30.0 / 1.1
gamma, factorials198296 (x ≈ 100)2.1
gamma, near_0 / near_1 / near_240 / 41 / 413.4 / 2.8 / 6.02.0 / 2.2 / 1.6
gamma, near_m10 / near_m5540 / 406.3·10⁵ / 6.4·10⁶2.2 / 2.0

Causes: erf = 1 − erfc (cancellation near zero), erfc = 1 − series up to x = 2, terms cancelling each other in the Lanczos sum with g = 7, the sin(πx) reflection without argument reduction. Now — libm 0.2.16 (MIT, a port of musl/fdlibm; it was already in the tree via statrs): erf, erfc, tgamma. mlab has no beta function yet — in "What next".

Octave tests — an external measurement (tests/octave_ext.rs, #[ignore])

%!assert, %!test, %!error blocks from the GNU Octave 11.3.0 source files (GPL: only in tests-octave, they do not enter the repo; the tool takes only %! lines, the implementation code is not read). Each block is a separate mlab run process, limit 10 s. The measurement includes blocks all of whose calls are mlab builtins.

blocksmeasuredpassassertother errorinfinite loopcrash
before fixes15 2352 7981 4092471 132010
after15 2352 7981 4192421 13700

Crashes (a panic instead of an error) — trapz(h, Y) with a scalar step, polyfit(x, y, Inf), primes(Inf), corr of constant data (a panic inside statrs), corrcoef([]) — fixed. "Other error" is mostly N-dimensional arrays, cells, structs; the 242 red asserts have not been analysed yet — "What next".

File system: vfs

The vfs crate (vfs — file system for the execution sandbox) is an in-memory file system with snapshots. mlab accesses files only through it.

vfs gates (tests/fs.rs, tests/suite.rs)

mlab.wasm in our WASI host

wasi-host (vfs — file system for the execution sandbox, section "WASI host") runs mlab.wasm on wasmi. WASI calls go to the same vfs::Vfs. The guest is started with --fs real: the guest's std::fs → WASI → the host's Vfs.

suiterunssame output as native mlab with --fs mem
suite-fs (tree and VM)5050
suite-v1 + suite-v2250249; la-18 (errata, a singular matrix) — the faer build for wasm32 gives "svd: failed to converge", V8 too

The file suite in the guest — 0.03 s, the 206 v1 scenarios — 0.12 s (native — 0.01 s).

Known differences from Octave/MATLAB

Licenses

Dependencies (the cargo tree tree; each crate's license was checked against the crates.io API /api/v1/crates/<name>/<version> on 26.09; the check — deps-cratesio.tsv):

crateversionlicense (crates.io)role
autocfg1.5.1Apache-2.0 OR MITbuild only (proc-macro / build.rs)
bitflags2.13.2MIT OR Apache-2.0in the binary
bytemuck1.25.2Zlib OR Apache-2.0 OR MITin the binary
cfg-if1.0.5MIT OR Apache-2.0in the binary
defer0.2.1MIT OR Apache-2.0build only (proc-macro / build.rs)
dyn-stack-macros0.1.3MITbuild only (proc-macro / build.rs)
dyn-stack0.13.2MITin the binary
equator-macro0.2.1MITbuild only (proc-macro / build.rs)
equator-macro0.6.0MITbuild only (proc-macro / build.rs)
equator0.2.2MITin the binary
equator0.6.0MITin the binary
faer-traits0.24.0MITin the binary
faer0.24.4MITdirect; in the binary
gemm-c320.19.0MITin the binary
gemm-c640.19.0MITin the binary
gemm-common0.19.0MITin the binary
gemm-f320.19.0MITin the binary
gemm-f640.19.0MITin the binary
gemm0.19.0MITin the binary
generativity1.2.1MIT OR Apache-2.0in the binary
interpol0.2.1MITbuild only (proc-macro / build.rs)
libc0.2.189MIT OR Apache-2.0in the binary
libm0.2.16MITtests3: direct (erf, erfc, tgamma); in the binary
nano-gemm-c320.2.1MITin the binary
nano-gemm-c640.2.1MITin the binary
nano-gemm-codegen0.2.1MITbuild only (proc-macro / build.rs)
nano-gemm-core0.2.1MITin the binary
nano-gemm-f320.2.1MITin the binary
nano-gemm-f640.2.1MITin the binary
nano-gemm0.2.2MITin the binary
num-complex0.4.6MIT OR Apache-2.0in the binary
num_cpus1.17.0MIT OR Apache-2.0in the binary
num-integer0.1.47MIT OR Apache-2.0in the binary
num-traits0.2.19MIT OR Apache-2.0in the binary
once_cell1.21.4MIT OR Apache-2.0in the binary
paste1.0.15MIT OR Apache-2.0build only (proc-macro / build.rs)
primal-check0.3.4MIT OR Apache-2.0in the binary
private-gemm-x860.1.20MITin the binary
proc-macro21.0.107MIT OR Apache-2.0build only (proc-macro / build.rs)
pulp0.22.3MITin the binary
pulp-wasm-simd-flag0.1.1MITin the binary
qd0.8.0MITin the binary
quote1.0.47MIT OR Apache-2.0build only (proc-macro / build.rs)
raw-cpuid11.6.0MITin the binary
reborrow0.5.5MITin the binary
rustfft6.4.1MIT OR Apache-2.0direct; in the binary
seq-macro0.3.6MIT OR Apache-2.0build only (proc-macro / build.rs)
strength_reduce0.2.4MIT OR Apache-2.0in the binary
syn1.0.109MIT OR Apache-2.0build only (proc-macro / build.rs)
syn2.0.119MIT OR Apache-2.0build only (proc-macro / build.rs)
transpose0.2.3MIT OR Apache-2.0in the binary
unicode-ident1.0.26(MIT OR Apache-2.0) AND Unicode-3.0build only (proc-macro / build.rs)
version_check0.9.5MIT OR Apache-2.0build only (proc-macro / build.rs)
statrs0.19.1MITv2, direct; in the binary (without default features: no nalgebra or rand)
approx0.5.1Apache-2.0v2; in the binary
thiserror2.0.21MIT OR Apache-2.0v2; in the binary
thiserror-impl2.0.21MIT OR Apache-2.0v2; build only (proc-macro)

In total v1 has 53 crates (38 in the binary, 15 build-only), all matching crates.io; v2 added 4 (checked against the crates.io API on 26.09: statrs — MIT, approx — Apache-2.0, thiserror and thiserror-impl — MIT OR Apache-2.0). CSV and JSON are our own code, without crates. Summary: MIT — 29, MIT OR Apache-2.0 — 22, bytemuck — Zlib OR Apache-2.0 OR MIT (we take MIT), unicode-ident — (MIT OR Apache-2.0) AND Unicode-3.0. Unicode-3.0 is the permissive Unicode data license (OSI), and this crate is used only at build time (the proc-macro2 → syn chain), it does not end up in the binary. GPL/LGPL — none. The benchmark (bench/) additionally pulls in nalgebra (Apache-2.0) and its dependencies — only for measurement, not in mlab.

What next

  1. Exact mode — after merging math v2: the Value::Exact variant is already in the value type. Rational matrices and big integers from math; det, inv, \, rank, rref over the rationals without rounding; a format rat/exact switch; steps and proofs as in math.
  2. Cell arrays and structs — unlock odeset, err.message, [p, S] = polyfit, cellfun, strsplit, UniformOutput=false, varargin/varargout.
  3. Plots — plot/bar/hist to SVG (a permissive crate, e.g. plotters — MIT) for the website; data — KaTeX/LaTeX alongside.
  4. Built-in LaTeX (Smart annotator — layers, context, memory): printing results and steps in LaTeX, parsing formulas into an expression tree.
  5. More on v2:
    • XLSX/ODS: reading with calamine (MIT), writing with rust_xlsxwriter (MIT/Apache) — check the licenses of their trees (zip, quick-xml…) against crates.io before adding; DuckDB — through our CLI;
    • a "table mathematics" pilot: 50–60 of our own problems over tables with exact answers (revenue by region, monthly average, share within a group, growth in %, moving and weighted averages, trend forecast), frozen by hash; the LLM (claude -p, API, api_env() as in math/src, effort high via --settings env, with a cap) writes a solution in the mlab language → the SLM executes it in memory → independent check → solution memory (JSONL in runs and mathsolve.duckdb, as in math v2) → how many plans the perceptron already guesses;
    • datetime, cell arrays (real {}), T{…}, outerjoin, 'omitnan', Fisher's exact test and non-parametric tests (Mann–Whitney, Wilcoxon — port from HypothesisTests.jl, MIT), p-value corrections (MultipleTesting.jl).
  6. An independent compatibility check — scenarios from another author (a human or a model) based on the documentation, blind to the code; today's suite measures only conformance to our specification.
  7. Speed: switch/try in bytecode, scalar builtins without wrapping. N-dimensional arrays; integer types.
  8. From the independent tests (tests3, 26.09):
    • 4 defects found by the LLM: A.^2' (transpose and power — one precedence level, left to right), the loop variable after an empty for (1×0; tree and VM together), T.x(k) = v, command syntax for any function;
    • analyse the 242 red asserts of the Octave tests (blocks.tsv): defect, MATLAB/Octave difference or out of scope;
    • beta, gammaln, betainc and a check against Boost's beta_*_data.ipp; Matrix Market (5 matrices already in raw: bcsstk01/02, nos4 — SPD: chol, λ > 0, trace = Σλ; west0067, gre__115 — non-symmetric: \, det, eig); a sample of numpy/SciPy tests (BSD) from PyPI archives;
    • a second, small LLM wave: table problems, formatted disp output of matrices, format long.

Licence

Elamur Cosmic License (Elamur Cosmic License). Third-party data keeps its own terms, as noted where it is used.

This page in Markdown → https://md.mova.elamur.ai/free/en/docs/mlab/