Symulab comes to Windows. Plus an engine correctness pass and a smoother canvas.
The first Windows build ships — a 396 MB installer with the full Julia engine and precompiled sysimage inside. Under it, a correctness audit of the equation pipeline fixed seven real bugs (two of which silently produced wrong numbers), backed by a new analytic verification suite and full pipeline documentation. And the canvas got a feel overhaul: groups carry their contents, valves travel with their stocks, marquee multi-select, double-click rename, and drags that stay smooth on big models.
- Windows installer (x64) — bundled Julia runtime + precompiled sysimage, no separate install; built and published from CI
- Stella import fix: 1-arg RAMP and 1/2-arg PULSE translated with the time argument in the wrong slot — silently constant or zero. Omitted arguments are now padded correctly
- Stella import: LN, LOGN, INT, and uppercase math functions now fold to their engine equivalents instead of failing at run time
- Multi-dimension arrays fixed — pop[North,Old] subscripts now compile (element keys previously produced unparseable identifiers)
- A flow whose dimensions don't match its stock is now a clear error in both the editor and the engine — previously it silently moved nothing
- Stock init expressions are validated with did-you-mean suggestions instead of surfacing raw engine errors
- Groups carry their contents when dragged; stocks carry their source/sink valves; pipes render straight with an arrowhead into the receiving stock
- Marquee multi-select (Shift+drag), Cmd+G groups the whole selection, double-click renames, zoom out to 10%
- Dragging is committed on drop instead of every mouse move — large models stay smooth, and one drag is one undo step
- New engine verification suite checks results against closed-form analytic solutions across all three integrators; docs/equations.md documents the full equation pipeline
The headline: Symulab now runs on Windows. The installer carries the complete Julia compute engine — runtime, packages, and a precompiled system image — so simulation works offline out of the box, exactly like the Mac build. No Julia install, no downloads on first launch. Behind the scenes this took a full rework of the build pipeline; the practical result is a 396 MB installer produced automatically from CI for every release.
The equations had an audit. Because a modeling tool is only as good
as its numbers, we traced every step from the expression you type to the
value in the chart — and fixed seven real bugs. The two that mattered
most produced silently wrong results: Stella-imported RAMP(slope)
and short-form PULSE(...) calls put the simulation time into the wrong
argument slot (a 1-arg RAMP was permanently zero), and a scalar flow
connected to an arrayed stock moved nothing at all, with no warning.
Both now behave correctly — and the mismatch case is a clear error in
the editor and the engine, so it can never fail quietly again. The
rest of the pass: LN/INT/uppercase math functions from Stella files
now translate instead of erroring, the constant e works in
expressions, two-dimensional array subscripts like pop[North,Old]
compile correctly, SUM/MIN of a non-arrayed variable behave as
identity instead of erroring, and init expressions are validated up
front with did-you-mean suggestions.
Trust, but verify. The engine now ships with a verification suite
that runs the real worker process against models with known closed-form
solutions — exponential decay and logistic growth across Euler, RK4 and
Tsit5, integrator convergence-order checks, converter dependency
chains, array aggregation, bounds clamping, and every helper function.
The full pipeline — how groups, dimensions, expressions, validation,
and integration actually work — is documented in docs/equations.md.
The canvas feels right now. A drag-and-drop overhaul fixed the things you’d notice within a minute of modeling: dragging a group now carries its members with it; dragging a stock carries the source and sink valves wired to it; the flow-to-stock magnetic snap no longer fights the alignment grid, so butt-joints stay flush; and pipes render as straight, rigid lines with an arrowhead into the receiving stock, so flow direction is always readable. Interaction got richer too — Shift+drag draws a selection marquee, Cmd+G groups everything selected, double-clicking a node jumps straight to renaming it, and the canvas zooms out to 10% for big models. Under the hood, node positions are now committed once on drop rather than on every mouse move, which keeps large diagrams smooth and makes one drag equal one undo step. Smaller touches: a live size readout while resizing, connection handles that appear on hover instead of dotting every node, and consistent array badges across node types.
Known follow-ups queued for the next releases: a direct Windows download link on this site (the build currently ships via GitHub Releases), Windows code signing to quiet SmartScreen, Stella SMOOTH/DELAY import support, and graphical (lookup-table) functions.