Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,10 @@ uvx marimo edit --sandbox <notebook>
| RPSLS Math | Explore balanced tournament graphs for Rock-Paper-Scissors variants. | [![Open in molab](https://marimo.io/molab-shield.svg)](https://molab.marimo.io/github/marimo-team/gallery-examples/blob/main/notebooks/math/rpsls-math/notebook.py) |
| ChartPuck Circle | Explore how complex functions transform circles interactively. | [![Open in molab](https://marimo.io/molab-shield.svg)](https://molab.marimo.io/github/marimo-team/gallery-examples/blob/main/notebooks/math/chartpuck-circle.py) |
| Droste Zoom | Simulate the Droste zoom effect with log-polar transforms. | [![Open in molab](https://marimo.io/molab-shield.svg)](https://molab.marimo.io/github/marimo-team/gallery-examples/blob/main/notebooks/math/zooming.py) |
| Graph Laplacian | Spectral clustering with graph Laplacian eigenvectors. | [![Open in molab](https://marimo.io/molab-shield.svg)](https://molab.marimo.io/github/marimo-team/gallery-examples/blob/main/notebooks/math/graph_laplacian.py/wasm) |
| Spectral Graph Drawing | Draw graphs using Laplacian eigenvectors as node coordinates. | [![Open in molab](https://marimo.io/molab-shield.svg)](https://molab.marimo.io/github/marimo-team/gallery-examples/blob/main/notebooks/math/spectral_graph_drawing.py/wasm) |
| Graph Signal Denoising | Denoise graph signals by projecting onto Laplacian eigenvectors. | [![Open in molab](https://marimo.io/molab-shield.svg)](https://molab.marimo.io/github/marimo-team/gallery-examples/blob/main/notebooks/math/graph_signal_denoising.py/wasm) |
| Low-Rank Approximation | Interactive image compression with low-rank SVD. | [![Open in molab](https://marimo.io/molab-shield.svg)](https://molab.marimo.io/github/marimo-team/gallery-examples/blob/main/notebooks/math/low_rank_approximation.py) |

## Custom UI elements with Anywidget

Expand Down
295 changes: 295 additions & 0 deletions notebooks/math/__marimo__/session/graph_laplacian.py.json

Large diffs are not rendered by default.

178 changes: 178 additions & 0 deletions notebooks/math/__marimo__/session/graph_signal_denoising.py.json

Large diffs are not rendered by default.

100 changes: 100 additions & 0 deletions notebooks/math/__marimo__/session/low_rank_approximation.py.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
{
"version": "1",
"metadata": {
"marimo_version": "0.21.1",
"script_metadata_hash": null
},
"cells": [
{
"id": "Hbol",
"code_hash": "d9494b49949dae3c2fbd40b46f722650",
"outputs": [
{
"type": "data",
"data": {
"text/plain": ""
}
}
],
"console": []
},
{
"id": "MJUe",
"code_hash": "0db750110ba73f956c50187987940e12",
"outputs": [
{
"type": "data",
"data": {
"text/plain": ""
}
}
],
"console": []
},
{
"id": "vblA",
"code_hash": "774e27b23927ed4a54ea34dbae7bda7e",
"outputs": [
{
"type": "data",
"data": {
"text/html": "<marimo-ui-element object-id='vblA-0' random-id='f00a9ffc-b09c-9d77-cf18-b188becb571b'><marimo-anywidget data-initial-value='{&quot;model_id&quot;:&quot;0d875226bf4a4a9e8f6e5e342161ed76&quot;}' data-label='null' data-js-url='&quot;data:text/javascript;base64,ZnVuY3Rpb24gcmVuZGVyKHsgbW9kZWwsIGVsIH0pIHsKICBjb25zdCByb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgcm9vdC5jbGFzc05hbWUgPSAid2ViY2FtLWNhcHR1cmUiOwoKICBjb25zdCBoZWFkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICBoZWFkZXIuY2xhc3NOYW1lID0gIndlYmNhbS1jYXB0dXJlX19oZWFkZXIiOwoKICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogIHRpdGxlLmNsYXNzTmFtZSA9ICJ3ZWJjYW0tY2FwdHVyZV9fdGl0bGUiOwogIHRpdGxlLnRleHRDb250ZW50ID0gIldlYmNhbSI7CgogIGNvbnN0IHN0YXR1cyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogIHN0YXR1cy5jbGFzc05hbWUgPSAid2ViY2FtLWNhcHR1cmVfX3N0YXR1cyI7CgogIGhlYWRlci5hcHBlbmRDaGlsZCh0aXRsZSk7CiAgaGVhZGVyLmFwcGVuZENoaWxkKHN0YXR1cyk7CgogIGNvbnN0IHZpZGVvV3JhcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogIHZpZGVvV3JhcC5jbGFzc05hbWUgPSAid2ViY2FtLWNhcHR1cmVfX3ZpZGVvIjsKCiAgY29uc3QgdmlkZW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpOwogIHZpZGVvLmF1dG9wbGF5ID0gdHJ1ZTsKICB2aWRlby5wbGF5c0lubGluZSA9IHRydWU7CiAgdmlkZW8ubXV0ZWQgPSB0cnVlOwogIHZpZGVvV3JhcC5hcHBlbmRDaGlsZCh2aWRlbyk7CgogIGNvbnN0IGNvbnRyb2xzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgY29udHJvbHMuY2xhc3NOYW1lID0gIndlYmNhbS1jYXB0dXJlX19jb250cm9scyI7CgogIGNvbnN0IGNhcHR1cmVCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTsKICBjYXB0dXJlQnV0dG9uLnR5cGUgPSAiYnV0dG9uIjsKICBjYXB0dXJlQnV0dG9uLmNsYXNzTmFtZSA9ICJ3ZWJjYW0tY2FwdHVyZV9fYnV0dG9uIjsKICBjYXB0dXJlQnV0dG9uLnRleHRDb250ZW50ID0gIkNhcHR1cmUiOwoKICBjb25zdCB0b2dnbGVXcmFwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGFiZWwiKTsKICB0b2dnbGVXcmFwLmNsYXNzTmFtZSA9ICJ3ZWJjYW0tY2FwdHVyZV9fdG9nZ2xlIjsKCiAgY29uc3QgdG9nZ2xlSW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwogIHRvZ2dsZUlucHV0LnR5cGUgPSAiY2hlY2tib3giOwoKICBjb25zdCB0b2dnbGVMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsKICB0b2dnbGVMYWJlbC50ZXh0Q29udGVudCA9ICJBdXRvLWNhcHR1cmUiOwoKICB0b2dnbGVXcmFwLmFwcGVuZENoaWxkKHRvZ2dsZUlucHV0KTsKICB0b2dnbGVXcmFwLmFwcGVuZENoaWxkKHRvZ2dsZUxhYmVsKTsKCiAgY29udHJvbHMuYXBwZW5kQ2hpbGQoY2FwdHVyZUJ1dHRvbik7CiAgY29udHJvbHMuYXBwZW5kQ2hpbGQodG9nZ2xlV3JhcCk7CgogIHJvb3QuYXBwZW5kQ2hpbGQoaGVhZGVyKTsKICByb290LmFwcGVuZENoaWxkKHZpZGVvV3JhcCk7CiAgcm9vdC5hcHBlbmRDaGlsZChjb250cm9scyk7CiAgZWwuYXBwZW5kQ2hpbGQocm9vdCk7CgogIGxldCBzdHJlYW0gPSBudWxsOwogIGxldCBpbnRlcnZhbElkID0gbnVsbDsKICBsZXQgc3RyZWFtUmVxdWVzdElkID0gMDsKCiAgY29uc3Qgc2V0U3RhdHVzID0gKHRleHQsIHRvbmUpID0+IHsKICAgIHN0YXR1cy50ZXh0Q29udGVudCA9IHRleHQ7CiAgICBzdGF0dXMuZGF0YXNldC50b25lID0gdG9uZSB8fCAibmV1dHJhbCI7CiAgfTsKCiAgY29uc3Qgc3RvcEludGVydmFsID0gKCkgPT4gewogICAgaWYgKGludGVydmFsSWQpIHsKICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTsKICAgICAgaW50ZXJ2YWxJZCA9IG51bGw7CiAgICB9CiAgfTsKCiAgY29uc3QgYXBwbHlDYXB0dXJpbmdTdGF0ZSA9ICgpID0+IHsKICAgIGNvbnN0IGlzQ2FwdHVyaW5nID0gbW9kZWwuZ2V0KCJjYXB0dXJpbmciKTsKICAgIHRvZ2dsZUlucHV0LmNoZWNrZWQgPSBCb29sZWFuKGlzQ2FwdHVyaW5nKTsKICAgIHN0b3BJbnRlcnZhbCgpOwogICAgaWYgKGlzQ2FwdHVyaW5nKSB7CiAgICAgIGNvbnN0IGludGVydmFsTXMgPSBNYXRoLm1heCgwLCBtb2RlbC5nZXQoImludGVydmFsX21zIikgfHwgMTAwMCk7CiAgICAgIGludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgICAgY2FwdHVyZUZyYW1lKGZhbHNlKTsKICAgICAgfSwgaW50ZXJ2YWxNcyk7CiAgICAgIHNldFN0YXR1cyhgQXV0by1jYXB0dXJlIG9uYCwgImFjdGl2ZSIpOwogICAgfSBlbHNlIGlmIChtb2RlbC5nZXQoImVycm9yIikpIHsKICAgICAgc2V0U3RhdHVzKG1vZGVsLmdldCgiZXJyb3IiKSwgImVycm9yIik7CiAgICB9IGVsc2UgaWYgKG1vZGVsLmdldCgicmVhZHkiKSkgewogICAgICBzZXRTdGF0dXMoIlByZXZpZXcgcmVhZHkiLCAicmVhZHkiKTsKICAgIH0KICB9OwoKICBjb25zdCBjYXB0dXJlRnJhbWUgPSAobWFudWFsKSA9PiB7CiAgICBpZiAoIXN0cmVhbSB8fCB2aWRlby52aWRlb1dpZHRoID09PSAwIHx8IHZpZGVvLnZpZGVvSGVpZ2h0ID09PSAwKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOwogICAgY2FudmFzLndpZHRoID0gdmlkZW8udmlkZW9XaWR0aDsKICAgIGNhbnZhcy5oZWlnaHQgPSB2aWRlby52aWRlb0hlaWdodDsKICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogICAgaWYgKCFjdHgpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY3R4LmRyYXdJbWFnZSh2aWRlbywgMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTsKICAgIGNvbnN0IGRhdGFVcmwgPSBjYW52YXMudG9EYXRhVVJMKCJpbWFnZS9wbmciKTsKICAgIG1vZGVsLnNldCgiaW1hZ2VfYmFzZTY0IiwgZGF0YVVybCk7CiAgICBtb2RlbC5zYXZlX2NoYW5nZXMoKTsKICAgIGlmIChtYW51YWwgJiYgbW9kZWwuZ2V0KCJjYXB0dXJpbmciKSkgewogICAgICBtb2RlbC5zZXQoImNhcHR1cmluZyIsIGZhbHNlKTsKICAgICAgbW9kZWwuc2F2ZV9jaGFuZ2VzKCk7CiAgICAgIHN0b3BJbnRlcnZhbCgpOwogICAgfQogIH07CgogIGNvbnN0IHN0b3BTdHJlYW0gPSAoKSA9PiB7CiAgICBpZiAoc3RyZWFtKSB7CiAgICAgIHN0cmVhbS5nZXRUcmFja3MoKS5mb3JFYWNoKCh0cmFjaykgPT4gdHJhY2suc3RvcCgpKTsKICAgICAgc3RyZWFtID0gbnVsbDsKICAgIH0KICB9OwoKICBjb25zdCBpbnZhbGlkYXRlU3RyZWFtUmVxdWVzdCA9ICgpID0+IHsKICAgIHN0cmVhbVJlcXVlc3RJZCArPSAxOwogICAgcmV0dXJuIHN0cmVhbVJlcXVlc3RJZDsKICB9OwoKICBjb25zdCBzdGFydFN0cmVhbSA9IGFzeW5jICgpID0+IHsKICAgIGNvbnN0IHJlcXVlc3RJZCA9IGludmFsaWRhdGVTdHJlYW1SZXF1ZXN0KCk7CiAgICBzdG9wU3RyZWFtKCk7CiAgICBzZXRTdGF0dXMoIlJlcXVlc3RpbmcgYWNjZXNzLi4uIiwgInBlbmRpbmciKTsKICAgIHRyeSB7CiAgICAgIGlmICghbmF2aWdhdG9yLm1lZGlhRGV2aWNlcyB8fCAhbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIldlYmNhbSBhY2Nlc3MgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGlzIGVudmlyb25tZW50LiIpOwogICAgICB9CiAgICAgIGNvbnN0IGZhY2luZ01vZGUgPSBtb2RlbC5nZXQoImZhY2luZ19tb2RlIikgfHwgInVzZXIiOwogICAgICBjb25zdCBjb25zdHJhaW50cyA9IHsKICAgICAgICB2aWRlbzogeyBmYWNpbmdNb2RlOiB7IGlkZWFsOiBmYWNpbmdNb2RlIH0gfSwKICAgICAgICBhdWRpbzogZmFsc2UsCiAgICAgIH07CiAgICAgIGNvbnN0IG5leHRTdHJlYW0gPSBhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYShjb25zdHJhaW50cyk7CiAgICAgIGlmIChyZXF1ZXN0SWQgIT09IHN0cmVhbVJlcXVlc3RJZCkgewogICAgICAgIG5leHRTdHJlYW0uZ2V0VHJhY2tzKCkuZm9yRWFjaCgodHJhY2spID0+IHRyYWNrLnN0b3AoKSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHN0cmVhbSA9IG5leHRTdHJlYW07CiAgICAgIHZpZGVvLnNyY09iamVjdCA9IHN0cmVhbTsKICAgICAgbW9kZWwuc2V0KCJyZWFkeSIsIHRydWUpOwogICAgICBtb2RlbC5zZXQoImVycm9yIiwgIiIpOwogICAgICBtb2RlbC5zYXZlX2NoYW5nZXMoKTsKICAgICAgc2V0U3RhdHVzKCJQcmV2aWV3IHJlYWR5IiwgInJlYWR5Iik7CiAgICAgIGFwcGx5Q2FwdHVyaW5nU3RhdGUoKTsKICAgIH0gY2F0Y2ggKGVycikgewogICAgICBpZiAocmVxdWVzdElkICE9PSBzdHJlYW1SZXF1ZXN0SWQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgbWVzc2FnZSA9IGVyciAmJiBlcnIubWVzc2FnZSA/IGVyci5tZXNzYWdlIDogIlVuYWJsZSB0byBhY2Nlc3Mgd2ViY2FtLiI7CiAgICAgIG1vZGVsLnNldCgicmVhZHkiLCBmYWxzZSk7CiAgICAgIG1vZGVsLnNldCgiZXJyb3IiLCBtZXNzYWdlKTsKICAgICAgbW9kZWwuc2F2ZV9jaGFuZ2VzKCk7CiAgICAgIHNldFN0YXR1cyhtZXNzYWdlLCAiZXJyb3IiKTsKICAgIH0KICB9OwoKICBjYXB0dXJlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gY2FwdHVyZUZyYW1lKHRydWUpKTsKCiAgdG9nZ2xlSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgKCkgPT4gewogICAgbW9kZWwuc2V0KCJjYXB0dXJpbmciLCB0b2dnbGVJbnB1dC5jaGVja2VkKTsKICAgIG1vZGVsLnNhdmVfY2hhbmdlcygpOwogICAgYXBwbHlDYXB0dXJpbmdTdGF0ZSgpOwogIH0pOwoKICBjb25zdCBvbkNhcHR1cmluZ0NoYW5nZSA9ICgpID0+IGFwcGx5Q2FwdHVyaW5nU3RhdGUoKTsKICBjb25zdCBvbkludGVydmFsQ2hhbmdlID0gKCkgPT4gewogICAgaWYgKG1vZGVsLmdldCgiY2FwdHVyaW5nIikpIHsKICAgICAgYXBwbHlDYXB0dXJpbmdTdGF0ZSgpOwogICAgfQogIH07CiAgY29uc3Qgb25GYWNpbmdDaGFuZ2UgPSAoKSA9PiB7CiAgICBzdGFydFN0cmVhbSgpOwogIH07CiAgY29uc3Qgb25FcnJvckNoYW5nZSA9ICgpID0+IHsKICAgIGlmICghbW9kZWwuZ2V0KCJjYXB0dXJpbmciKSAmJiBtb2RlbC5nZXQoImVycm9yIikpIHsKICAgICAgc2V0U3RhdHVzKG1vZGVsLmdldCgiZXJyb3IiKSwgImVycm9yIik7CiAgICB9CiAgfTsKCiAgbW9kZWwub24oImNoYW5nZTpjYXB0dXJpbmciLCBvbkNhcHR1cmluZ0NoYW5nZSk7CiAgbW9kZWwub24oImNoYW5nZTppbnRlcnZhbF9tcyIsIG9uSW50ZXJ2YWxDaGFuZ2UpOwogIG1vZGVsLm9uKCJjaGFuZ2U6ZmFjaW5nX21vZGUiLCBvbkZhY2luZ0NoYW5nZSk7CiAgbW9kZWwub24oImNoYW5nZTplcnJvciIsIG9uRXJyb3JDaGFuZ2UpOwoKICBzZXRTdGF0dXMoIlN0YXJ0aW5nIHByZXZpZXcuLi4iLCAicGVuZGluZyIpOwogIHN0YXJ0U3RyZWFtKCk7CgogIHJldHVybiAoKSA9PiB7CiAgICBzdG9wSW50ZXJ2YWwoKTsKICAgIGludmFsaWRhdGVTdHJlYW1SZXF1ZXN0KCk7CiAgICBzdG9wU3RyZWFtKCk7CiAgICBtb2RlbC5vZmYoImNoYW5nZTpjYXB0dXJpbmciLCBvbkNhcHR1cmluZ0NoYW5nZSk7CiAgICBtb2RlbC5vZmYoImNoYW5nZTppbnRlcnZhbF9tcyIsIG9uSW50ZXJ2YWxDaGFuZ2UpOwogICAgbW9kZWwub2ZmKCJjaGFuZ2U6ZmFjaW5nX21vZGUiLCBvbkZhY2luZ0NoYW5nZSk7CiAgICBtb2RlbC5vZmYoImNoYW5nZTplcnJvciIsIG9uRXJyb3JDaGFuZ2UpOwogIH07Cn0KCmV4cG9ydCBkZWZhdWx0IHsgcmVuZGVyIH07Cg==&quot;' data-js-hash='&quot;2b6d4405cdff71df448e09ab33a28b8b&quot;'></marimo-anywidget></marimo-ui-element>"
}
}
],
"console": []
},
{
"id": "bkHC",
"code_hash": "f1b5f8bccfa57c6d40e7661f5221f64d",
"outputs": [
{
"type": "data",
"data": {
"text/markdown": "<span class=\"markdown prose dark:prose-invert contents\"><span class=\"paragraph\"><strong>Take a photo to get started.</strong></span></span>"
}
}
],
"console": []
},
{
"id": "lEQa",
"code_hash": "ebf42973c9588235f74b16b905036c9b",
"outputs": [
{
"type": "error",
"ename": "ancestor-stopped",
"evalue": "This cell wasn't run because an ancestor was stopped with `mo.stop`: ",
"traceback": []
}
],
"console": []
},
{
"id": "PKri",
"code_hash": "c1dbc288b32d7aec24fe4be140694f56",
"outputs": [
{
"type": "data",
"data": {
"text/html": "<marimo-ui-element object-id='PKri-0' random-id='39d07368-2516-e23b-d14e-fc7fcc1432f7'><marimo-slider data-initial-value='20' data-label='&quot;&lt;span class=&#92;&quot;markdown prose dark:prose-invert contents&#92;&quot;&gt;&lt;span class=&#92;&quot;paragraph&#92;&quot;&gt;Rank of approximation&lt;/span&gt;&lt;/span&gt;&quot;' data-start='1' data-stop='128' data-steps='[]' data-debounce='false' data-disabled='false' data-orientation='&quot;horizontal&quot;' data-show-value='false' data-include-input='false' data-full-width='false'></marimo-slider></marimo-ui-element>"
}
}
],
"console": []
},
{
"id": "Xref",
"code_hash": "43af141a7cb70f893f2dac8d5c8ef897",
"outputs": [
{
"type": "error",
"ename": "ancestor-stopped",
"evalue": "This cell wasn't run because an ancestor was stopped with `mo.stop`: ",
"traceback": []
}
],
"console": []
}
]
}
Loading
Loading