| .github | |
| app | |
| helpers | |
| .gitignore | |
| .numblignore | |
| CLAUDE.md | |
| hitandrun_demo.m | |
| hitandrun_sampler.m | |
| numbl-project.json | |
| README.md |
Interactive hit-and-run sampling#
Runs in the browser via numbl — no install.
▶ Open hitandrun_demo.m and click Run#
A random 2D convex region is generated and N points are drawn uniformly from
it by hit-and-run: from the current point, pick a random direction, take the
chord where that line crosses the region, and jump to a uniform point on it.
Repeat. The figure shows the region and the samples.
Controls:
- Samples — set
N(re-runs the sampler). - Resample — new samples, same region.
- New region — a fresh region.
- Play movie — step through the algorithm: each step draws the chord and the point that landed on it.
How it works#
hitandrun_demo.m— driver:addpath('helpers'), seed, call the sampler.hitandrun_sampler.m— opens the figure, sends data, handles resample requests.helpers/—make_region.mandhit_and_run.m.app/— a single-file React app that draws the region and samples on a canvas.
The script and figure talk both ways: the script sends the region + samples via
uihtml(..., 'Data', ...), and the controls call back with
sendToMATLAB('resample' | 'newRegion', ...), which re-runs the sampler and
returns new points via sendEventToHTMLSource. The script is stateless — the
figure owns the region and passes it back with each request.
JIT-compiled kernel#
The loop in hit_and_run.m runs once per sample, so
numbl JS-JIT-compiles it to JavaScript — about 30× faster than its interpreter,
which is what keeps large N instant. The %!numbl:assert_jit directive
asserts this happens (it errors rather than silently falling back). It relies on
numbl's scalar-rand() JIT support; rng(seed) still controls the shared PRNG.
Deploy#
Pushing to main builds the app and publishes the project to GitHub Pages via
the deploy workflow.