From 33c34621a898b6c9d1d11ad4ddae3ad29ccf1855 Mon Sep 17 00:00:00 2001 From: Bregy Malpartida Date: Fri, 2 Oct 2026 23:49:42 -0500 Subject: [PATCH 1/9] feat: add HIF interoperability and typed Python package --- .github/workflows/python.yml | 80 ++ .gitignore | 9 + Cargo.lock | 682 ++++++++++++++++++ Cargo.toml | 4 +- README.md | 4 + crates/hyper-viz-bevy/src/graph.rs | 40 +- crates/hyper-viz-bevy/src/lib.rs | 29 +- crates/hyper-viz-python/Cargo.toml | 21 + crates/hyper-viz-python/README.md | 3 + .../hyper-viz-python/examples/xgi_interop.py | 27 + crates/hyper-viz-python/pyproject.toml | 18 + .../python/hyper_viz/HIF-LICENSE | 21 + .../python/hyper_viz/LICENSE-APACHE | 201 ++++++ .../python/hyper_viz/LICENSE-MIT | 21 + .../python/hyper_viz/__init__.py | 8 + .../python/hyper_viz/_core.pyi | 38 + .../python/hyper_viz/_errors.py | 11 + .../python/hyper_viz/_viewer.py | 101 +++ .../python/hyper_viz/py.typed | 0 crates/hyper-viz-python/requirements-test.txt | 3 + crates/hyper-viz-python/src/bin/stub_gen.rs | 16 + crates/hyper-viz-python/src/lib.rs | 93 +++ crates/hyper-viz-python/tests/check_wheel.py | 19 + crates/hyper-viz-python/tests/test_api.py | 143 ++++ crates/hyper-viz/Cargo.toml | 3 + crates/hyper-viz/examples/hif_roundtrip.rs | 20 + crates/hyper-viz/schemas/HIF-LICENSE | 21 + crates/hyper-viz/schemas/README.md | 8 + crates/hyper-viz/schemas/hif.schema.json | 112 +++ crates/hyper-viz/src/error.rs | 4 + crates/hyper-viz/src/hif.rs | 421 +++++++++++ crates/hyper-viz/src/io/mod.rs | 43 +- crates/hyper-viz/src/lib.rs | 10 +- crates/hyper-viz/tests/hif.rs | 172 +++++ docs/HIF.md | 86 +++ examples/hif_interop.jl | 14 + src/main.rs | 18 +- 37 files changed, 2508 insertions(+), 16 deletions(-) create mode 100644 .github/workflows/python.yml create mode 100644 crates/hyper-viz-python/Cargo.toml create mode 100644 crates/hyper-viz-python/README.md create mode 100644 crates/hyper-viz-python/examples/xgi_interop.py create mode 100644 crates/hyper-viz-python/pyproject.toml create mode 100644 crates/hyper-viz-python/python/hyper_viz/HIF-LICENSE create mode 100644 crates/hyper-viz-python/python/hyper_viz/LICENSE-APACHE create mode 100644 crates/hyper-viz-python/python/hyper_viz/LICENSE-MIT create mode 100644 crates/hyper-viz-python/python/hyper_viz/__init__.py create mode 100644 crates/hyper-viz-python/python/hyper_viz/_core.pyi create mode 100644 crates/hyper-viz-python/python/hyper_viz/_errors.py create mode 100644 crates/hyper-viz-python/python/hyper_viz/_viewer.py create mode 100644 crates/hyper-viz-python/python/hyper_viz/py.typed create mode 100644 crates/hyper-viz-python/requirements-test.txt create mode 100644 crates/hyper-viz-python/src/bin/stub_gen.rs create mode 100644 crates/hyper-viz-python/src/lib.rs create mode 100644 crates/hyper-viz-python/tests/check_wheel.py create mode 100644 crates/hyper-viz-python/tests/test_api.py create mode 100644 crates/hyper-viz/examples/hif_roundtrip.rs create mode 100644 crates/hyper-viz/schemas/HIF-LICENSE create mode 100644 crates/hyper-viz/schemas/README.md create mode 100644 crates/hyper-viz/schemas/hif.schema.json create mode 100644 crates/hyper-viz/src/hif.rs create mode 100644 crates/hyper-viz/tests/hif.rs create mode 100644 docs/HIF.md create mode 100644 examples/hif_interop.jl diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml new file mode 100644 index 0000000..792e06d --- /dev/null +++ b/.github/workflows/python.yml @@ -0,0 +1,80 @@ +name: python wheels + +on: + push: + branches: [main] + pull_request: + workflow_dispatch: + +permissions: + contents: read + +jobs: + wheels: + name: ${{ matrix.target }} / CPython abi3 + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-latest + target: x86_64-unknown-linux-gnu + - os: macos-14 + target: aarch64-apple-darwin + - os: macos-15-intel + target: x86_64-apple-darwin + - os: windows-latest + target: x86_64-pc-windows-msvc + runs-on: ${{ matrix.os }} + env: + CARGO_TERM_COLOR: always + MACOSX_DEPLOYMENT_TARGET: '11.0' + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: '3.10' + - uses: dtolnay/rust-toolchain@1.89.0 + with: + targets: ${{ matrix.target }} + components: rustfmt, clippy + - uses: Swatinem/rust-cache@v2 + - name: Install test tools + run: python -m pip install -r crates/hyper-viz-python/requirements-test.txt + - name: Generate stubs and check drift + run: | + cargo run --locked -p hyper-viz-python --bin stub_gen + git diff --exit-code -- crates/hyper-viz-python/python/hyper_viz/_core.pyi + - name: Rust checks (no Bevy dependency) + run: | + cargo fmt --all -- --check + cargo clippy --locked -p hyper-viz -p hyper-viz-python --all-targets -- -D warnings + cargo test --locked --offline -p hyper-viz + - name: Build platform wheel + uses: PyO3/maturin-action@v1 + with: + maturin-version: '1.9.6' + target: ${{ matrix.target }} + manylinux: auto + args: --release --locked --manifest-path crates/hyper-viz-python/Cargo.toml --out dist + - name: Install built wheel + shell: bash + run: python -m pip install --no-deps dist/*.whl + - name: Test installed package + run: | + python -m pytest crates/hyper-viz-python/tests -q + python -m mypy --strict crates/hyper-viz-python/python/hyper_viz + python crates/hyper-viz-python/examples/xgi_interop.py + - name: Check wheel contents + run: python crates/hyper-viz-python/tests/check_wheel.py dist + - uses: actions/upload-artifact@v4 + with: + name: hyper-viz-${{ matrix.target }} + path: dist/*.whl + - uses: actions/setup-python@v5 + with: + python-version: '3.14' + - name: Clean-install ABI compatibility smoke test + shell: bash + run: | + python -m pip install --no-deps dist/*.whl + python -c 'from hyper_viz import HifDocument; assert "s:a" in HifDocument.from_json("{\"incidences\":[{\"node\":\"a\",\"edge\":\"e\"}]}").to_hypergraph_json()' diff --git a/.gitignore b/.gitignore index 3d62c7b..2aba2c2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,12 @@ /target .env +.venv/ +__pycache__/ +.pytest_cache/ +.mypy_cache/ +*.egg-info/ + +# Editable maturin builds place the extension in the Python source package. +/crates/hyper-viz-python/python/hyper_viz/*.so +/crates/hyper-viz-python/python/hyper_viz/*.pyd diff --git a/Cargo.lock b/Cargo.lock index 08bef2d..1752d1c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -90,6 +90,7 @@ dependencies = [ "cfg-if", "getrandom 0.3.4", "once_cell", + "serde", "version_check", "zerocopy", ] @@ -216,6 +217,12 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + [[package]] name = "approx" version = "0.5.1" @@ -1860,12 +1867,24 @@ dependencies = [ "piper", ] +[[package]] +name = "borrow-or-share" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc0b364ead1874514c8c2855ab558056ebfeb775653e7ae45ff72f28f8f3166c" + [[package]] name = "bumpalo" version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" +[[package]] +name = "bytecount" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" + [[package]] name = "bytemuck" version = "1.25.2" @@ -1969,6 +1988,19 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" +[[package]] +name = "chrono" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-link 0.2.1", +] + [[package]] name = "clang-sys" version = "1.8.1" @@ -2341,6 +2373,12 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4583a4551df46e2792f82ceeac45e850d2e2d5debba0b91f102385cda5b11f06" +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" + [[package]] name = "derive_more" version = "2.1.1" @@ -2468,6 +2506,15 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" +[[package]] +name = "email_address" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e079f19b08ca6239f47f8ba8509c11cf3ea30095831f7fed61441475edd8c449" +dependencies = [ + "serde", +] + [[package]] name = "emath" version = "0.33.3" @@ -2594,6 +2641,17 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "fancy-regex" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "998b056554fbe42e03ae0e152895cd1a7e1002aec800fdc6635d20270260c46f" +dependencies = [ + "bit-set", + "regex-automata", + "regex-syntax", +] + [[package]] name = "fastrand" version = "2.5.0" @@ -2637,6 +2695,17 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "fluent-uri" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1918b65d96df47d3591bed19c5cca17e3fa5d0707318e4b5ef2eae01764df7e5" +dependencies = [ + "borrow-or-share", + "ref-cast", + "serde", +] + [[package]] name = "fnv" version = "1.0.7" @@ -2732,6 +2801,16 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "fraction" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e076045bb43dac435333ed5f04caf35c7463631d0dae2deb2638d94dd0a5b872" +dependencies = [ + "lazy_static", + "num", +] + [[package]] name = "futures-channel" version = "0.3.34" @@ -2806,6 +2885,15 @@ dependencies = [ "windows-link 0.2.1", ] +[[package]] +name = "getopts" +version = "0.2.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe4fbac503b8d1f88e6676011885f34b7174f46e59956bba534ba83abded4df" +dependencies = [ + "unicode-width", +] + [[package]] name = "getrandom" version = "0.2.17" @@ -3146,6 +3234,8 @@ dependencies = [ name = "hyper-viz" version = "0.1.0" dependencies = [ + "jsonschema", + "num-bigint", "rand 0.8.7", "serde", "serde_json", @@ -3169,6 +3259,40 @@ dependencies = [ "winit", ] +[[package]] +name = "hyper-viz-python" +version = "0.1.0" +dependencies = [ + "hyper-viz", + "pyo3", + "pyo3-stub-gen", + "serde_json", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.62.2", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "icu_collections" version = "2.3.0" @@ -3299,6 +3423,15 @@ dependencies = [ "serde_core", ] +[[package]] +name = "indoc" +version = "2.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" +dependencies = [ + "rustversion", +] + [[package]] name = "inflections" version = "1.1.1" @@ -3334,12 +3467,33 @@ dependencies = [ "rustversion", ] +[[package]] +name = "is-macro" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8267aa6001e25494f3015f9663bbd88a18240c74483afa5f0934a1b3e4c388e9" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.119", +] + [[package]] name = "is_terminal_polyfill" version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.13.0" @@ -3459,6 +3613,32 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "jsonschema" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d46662859bc5f60a145b75f4632fbadc84e829e45df6c5de74cfc8e05acb96b5" +dependencies = [ + "ahash", + "base64", + "bytecount", + "email_address", + "fancy-regex", + "fraction", + "idna", + "itoa", + "num-cmp", + "num-traits", + "once_cell", + "percent-encoding", + "referencing", + "regex", + "regex-syntax", + "serde", + "serde_json", + "uuid-simd", +] + [[package]] name = "khronos-egl" version = "6.0.0" @@ -3485,6 +3665,12 @@ dependencies = [ "bitflags 2.13.1", ] +[[package]] +name = "lalrpop-util" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553" + [[package]] name = "lazy_static" version = "1.5.0" @@ -3609,6 +3795,12 @@ dependencies = [ "libc", ] +[[package]] +name = "maplit" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" + [[package]] name = "matchers" version = "0.2.0" @@ -3633,6 +3825,15 @@ dependencies = [ "libc", ] +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + [[package]] name = "metal" version = "0.32.0" @@ -3823,6 +4024,51 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-cmp" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63335b2e2c34fae2fb0aa2cecfd9f0832a1e24b3b32ecec612c3426d46dc8aaa" + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + [[package]] name = "num-derive" version = "0.4.2" @@ -3834,6 +4080,36 @@ dependencies = [ "syn 2.0.119", ] +[[package]] +name = "num-integer" +version = "0.1.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ce2d95d4b3734dc35aa2f45e1aa22cd416814592a4f9d9205e11affd5b8e10b" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -4229,6 +4505,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "outref" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" + [[package]] name = "owned_ttf_parser" version = "0.25.1" @@ -4292,6 +4574,44 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_shared", +] + +[[package]] +name = "phf_codegen" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared", + "rand 0.8.7", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", +] + [[package]] name = "pin-project" version = "1.1.13" @@ -4392,6 +4712,12 @@ dependencies = [ "zerovec", ] +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "pp-rs" version = "0.2.1" @@ -4446,6 +4772,104 @@ version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d55d956fa96f5ec02be2e13af0e20391a5aa83d6a074e3ad368959d0fab299ea" +[[package]] +name = "pyo3" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab53c047fcd1a1d2a8820fe84f05d6be69e9526be40cb03b73f86b6b03e6d87d" +dependencies = [ + "indoc", + "libc", + "memoffset", + "once_cell", + "portable-atomic", + "pyo3-build-config", + "pyo3-ffi", + "pyo3-macros", + "unindent", +] + +[[package]] +name = "pyo3-build-config" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b455933107de8642b4487ed26d912c2d899dec6114884214a0b3bb3be9261ea6" +dependencies = [ + "target-lexicon", +] + +[[package]] +name = "pyo3-ffi" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c85c9cbfaddf651b1221594209aed57e9e5cff63c4d11d1feead529b872a089" +dependencies = [ + "libc", + "pyo3-build-config", +] + +[[package]] +name = "pyo3-macros" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a5b10c9bf9888125d917fb4d2ca2d25c8df94c7ab5a52e13313a07e050a3b02" +dependencies = [ + "proc-macro2", + "pyo3-macros-backend", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "pyo3-macros-backend" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03b51720d314836e53327f5871d4c0cfb4fb37cc2c4a11cc71907a86342c40f9" +dependencies = [ + "heck", + "proc-macro2", + "pyo3-build-config", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "pyo3-stub-gen" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b159f7704044f57d058f528a6f1f22a0a0a327dcb595c5fb38beae658e0338d6" +dependencies = [ + "anyhow", + "chrono", + "indexmap", + "inventory", + "itertools 0.14.0", + "log", + "maplit", + "num-complex", + "pyo3", + "pyo3-stub-gen-derive", + "rustpython-parser", + "serde", + "serde_json", + "time", + "toml", +] + +[[package]] +name = "pyo3-stub-gen-derive" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c79e7c5b1fcec7c39ab186594658a971c59911eb6fbab5a5932cf2318534be" +dependencies = [ + "heck", + "indexmap", + "proc-macro2", + "quote", + "rustpython-parser", + "syn 2.0.119", +] + [[package]] name = "quick-error" version = "2.0.1" @@ -4629,6 +5053,40 @@ dependencies = [ "bitflags 2.13.1", ] +[[package]] +name = "ref-cast" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e440fb4e4b4147295338efb76001ab9e4efc0e5839df2c47fc5ac2381d365c3" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecd8964f8453721699a1ed72037b0db49ce2f5a5138486ee89bed6f67cdf3a" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.4", +] + +[[package]] +name = "referencing" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e9c261f7ce75418b3beadfb3f0eb1299fe8eb9640deba45ffa2cb783098697d" +dependencies = [ + "ahash", + "fluent-uri", + "once_cell", + "parking_lot", + "percent-encoding", + "serde_json", +] + [[package]] name = "regex" version = "1.13.1" @@ -4741,6 +5199,63 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "rustpython-ast" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cdaf8ee5c1473b993b398c174641d3aa9da847af36e8d5eb8291930b72f31a5" +dependencies = [ + "is-macro", + "num-bigint", + "rustpython-parser-core", + "static_assertions", +] + +[[package]] +name = "rustpython-parser" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "868f724daac0caf9bd36d38caf45819905193a901e8f1c983345a68e18fb2abb" +dependencies = [ + "anyhow", + "is-macro", + "itertools 0.11.0", + "lalrpop-util", + "log", + "num-bigint", + "num-traits", + "phf", + "phf_codegen", + "rustc-hash 1.1.0", + "rustpython-ast", + "rustpython-parser-core", + "tiny-keccak", + "unic-emoji-char", + "unic-ucd-ident", + "unicode_names2", +] + +[[package]] +name = "rustpython-parser-core" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4b6c12fa273825edc7bccd9a734f0ad5ba4b8a2f4da5ff7efe946f066d0f4ad" +dependencies = [ + "is-macro", + "memchr", + "rustpython-parser-vendored", +] + +[[package]] +name = "rustpython-parser-vendored" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04fcea49a4630a3a5d940f4d514dc4f575ed63c14c3e3ed07146634aed7f67a6" +dependencies = [ + "memchr", + "once_cell", +] + [[package]] name = "rustversion" version = "1.0.23" @@ -4851,6 +5366,15 @@ dependencies = [ "zmij", ] +[[package]] +name = "serde_spanned" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +dependencies = [ + "serde_core", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -4894,6 +5418,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" +[[package]] +name = "siphasher" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33f4fe9184a62d842c9ef383018f3306d8ba224fd9d836f56d7288308847c256" + [[package]] name = "skrifa" version = "0.39.0" @@ -5105,6 +5635,12 @@ dependencies = [ "slotmap", ] +[[package]] +name = "target-lexicon" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" + [[package]] name = "tempfile" version = "3.27.0" @@ -5190,6 +5726,34 @@ dependencies = [ "zune-jpeg", ] +[[package]] +name = "time" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde_core", + "time-core", +] + +[[package]] +name = "time-core" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + [[package]] name = "tiny-skia" version = "0.11.4" @@ -5240,6 +5804,21 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +[[package]] +name = "toml" +version = "1.1.6+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "920602543f0911ab71da12c50d59701da54c196d1a2bf5cb4b75667f137a406a" +dependencies = [ + "indexmap", + "serde_core", + "serde_spanned", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 1.0.4", +] + [[package]] name = "toml_datetime" version = "0.7.5+spec-1.1.0" @@ -5291,6 +5870,12 @@ dependencies = [ "winnow 1.0.4", ] +[[package]] +name = "toml_writer" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" + [[package]] name = "tracing" version = "0.1.44" @@ -5402,6 +5987,58 @@ version = "1.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "214ca0b2191785cbc06209b9ca1861e048e39b5ba33574b3cedd58363d5bb5f6" +[[package]] +name = "unic-char-property" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" +dependencies = [ + "unic-char-range", +] + +[[package]] +name = "unic-char-range" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" + +[[package]] +name = "unic-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" + +[[package]] +name = "unic-emoji-char" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b07221e68897210270a38bde4babb655869637af0f69407f96053a34f76494d" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-ident" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-version" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +dependencies = [ + "unic-common", +] + [[package]] name = "unicode-bidi" version = "0.3.18" @@ -5444,6 +6081,34 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +[[package]] +name = "unicode_names2" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1673eca9782c84de5f81b82e4109dcfb3611c8ba0d52930ec4a9478f547b2dd" +dependencies = [ + "phf", + "unicode_names2_generator", +] + +[[package]] +name = "unicode_names2_generator" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b91e5b84611016120197efd7dc93ef76774f4e084cd73c9fb3ea4a86c570c56e" +dependencies = [ + "getopts", + "log", + "phf_codegen", + "rand 0.8.7", +] + +[[package]] +name = "unindent" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3" + [[package]] name = "url" version = "2.5.8" @@ -5480,6 +6145,17 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "uuid-simd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b082222b4f6619906941c17eb2297fff4c2fb96cb60164170522942a200bd8" +dependencies = [ + "outref", + "uuid", + "vsimd", +] + [[package]] name = "valuable" version = "0.1.1" @@ -5509,6 +6185,12 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "vsimd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" + [[package]] name = "walkdir" version = "2.5.0" diff --git a/Cargo.toml b/Cargo.toml index bb59301..66f1bb3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [workspace] resolver = "2" -members = ["crates/hyper-viz", "crates/hyper-viz-bevy"] +members = ["crates/hyper-viz", "crates/hyper-viz-bevy", "crates/hyper-viz-python"] [workspace.package] version = "0.1.0" @@ -15,7 +15,7 @@ homepage = "https://github.com/atomicstrata/hyper" hyper-viz = { path = "crates/hyper-viz" } hyper-viz-bevy = { path = "crates/hyper-viz-bevy" } serde = { version = "1", features = ["derive"] } -serde_json = "1" +serde_json = { version = "1", features = ["arbitrary_precision"] } thiserror = "2" tracing = "0.1" diff --git a/README.md b/README.md index 40f5a88..9c9a5cc 100644 --- a/README.md +++ b/README.md @@ -301,3 +301,7 @@ src/main.rs # CLI - WASM / browser serve (session JSON is ready for `localStorage`) - Euler-style set diagrams (convex-hull member shells only) - Bundling any proprietary memory engine + +## HIF and Python + +Hyper reads scientific HIF datasets with offline validation and explicit viewer compatibility checks. The optional typed Python package provides HIF interchange and launches a separately installed viewer. See [HIF and Python integration](docs/HIF.md) for supported semantics, build instructions, and XGI/Julia examples. diff --git a/crates/hyper-viz-bevy/src/graph.rs b/crates/hyper-viz-bevy/src/graph.rs index af14b1d..f224e17 100644 --- a/crates/hyper-viz-bevy/src/graph.rs +++ b/crates/hyper-viz-bevy/src/graph.rs @@ -3,7 +3,8 @@ use std::time::SystemTime; use bevy::prelude::*; use hyper_viz::{ - ForceLayout3D, HypergraphScene, LayoutConfig, Projection, load_json, project, scenes_equivalent, + ForceLayout3D, HypergraphScene, InputFormat, LayoutConfig, Projection, load_json_with_format, + project, scenes_equivalent, }; #[derive(Resource)] @@ -47,6 +48,7 @@ pub struct LayoutSettings { pub graph_path: Option, pub watch: bool, pub projection: Projection, + pub input_format: InputFormat, } /// Published with each replacement scene so renderers cannot consume a stale layout. @@ -72,6 +74,7 @@ impl Default for LayoutSettings { graph_path: None, watch: false, projection: Projection::Bipartite, + input_format: InputFormat::Auto, } } } @@ -80,7 +83,7 @@ fn layout_from_path( path: &str, settings: &LayoutSettings, ) -> Result { - let graph = load_json(path)?; + let graph = load_json_with_format(path, settings.input_format)?; let scene = project(&graph, settings.projection); Ok(GraphLayout::from_scene(scene, settings)) } @@ -205,8 +208,12 @@ pub fn poll_graph_watch( return; } - let Ok(graph) = load_json(&watch.path) else { - return; + let graph = match load_json_with_format(&watch.path, settings.input_format) { + Ok(graph) => graph, + Err(error) => { + tracing::warn!(path = %watch.path, %error, "retaining scene after failed reload"); + return; + } }; let scene = project(&graph, settings.projection); @@ -336,6 +343,31 @@ mod watch_tests { (tmp, app) } + #[test] + fn hif_watch_obeys_explicit_format_and_keeps_scene_on_incompatible_update() { + let (tmp, mut app) = fixture(); + let path = tmp.path().join("graph.json"); + std::fs::write(&path, r#"{"incidences":[{"node":"n","edge":"e"}]}"#).unwrap(); + app.world_mut() + .resource_mut::() + .input_format = hyper_viz::InputFormat::Hif; + app.world_mut().resource_mut::().last_mtime = None; + app.update(); + assert_eq!( + app.world().resource::().scene.vertices_count(), + 1 + ); + assert_eq!(app.world().resource::().0, 1); + std::fs::write(&path, r#"{"network-type":"directed","incidences":[]}"#).unwrap(); + app.world_mut().resource_mut::().last_mtime = None; + app.update(); + assert_eq!(app.world().resource::().0, 1); + assert_eq!( + app.world().resource::().scene.vertices_count(), + 1 + ); + } + #[test] fn unchanged_file_stamp_does_not_replace_the_live_scene() { let (_tmp, mut app) = fixture(); diff --git a/crates/hyper-viz-bevy/src/lib.rs b/crates/hyper-viz-bevy/src/lib.rs index 1f5e6c3..e6d1c61 100644 --- a/crates/hyper-viz-bevy/src/lib.rs +++ b/crates/hyper-viz-bevy/src/lib.rs @@ -130,7 +130,7 @@ impl HyperVisualizerPlugin { } } - /// Load `hypergraph.v1` JSON from `path`. Set `watch` to reload on file change. + /// Load native or HIF JSON from `path`. Set `watch` to reload on file change. pub fn from_path(path: impl Into, watch: bool) -> Self { let path = path.into(); Self { @@ -147,6 +147,12 @@ impl HyperVisualizerPlugin { } } + /// Select the format for initial loading and every watched reload. + pub fn with_input_format(mut self, format: hyper_viz::InputFormat) -> Self { + self.settings.input_format = format; + self + } + pub fn with_projection(mut self, projection: Projection) -> Self { self.settings.projection = projection; self @@ -251,9 +257,28 @@ pub fn run_visualizer_from_path_with( watch: bool, projection: Projection, config: VisualizerConfig, +) { + run_visualizer_from_path_with_format( + path, + watch, + projection, + config, + hyper_viz::InputFormat::Auto, + ); +} + +/// File viewer with an explicit interchange format, including watched updates. +pub fn run_visualizer_from_path_with_format( + path: String, + watch: bool, + projection: Projection, + config: VisualizerConfig, + format: hyper_viz::InputFormat, ) { visualizer_app_with( - HyperVisualizerPlugin::from_path(path, watch).with_projection(projection), + HyperVisualizerPlugin::from_path(path, watch) + .with_projection(projection) + .with_input_format(format), config, false, ) diff --git a/crates/hyper-viz-python/Cargo.toml b/crates/hyper-viz-python/Cargo.toml new file mode 100644 index 0000000..da9fa6e --- /dev/null +++ b/crates/hyper-viz-python/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "hyper-viz-python" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +license.workspace = true +publish = false + +[lib] +name = "hyper_viz_python" +crate-type = ["cdylib", "rlib"] + +[dependencies] +hyper-viz.workspace = true +serde_json.workspace = true +pyo3 = { version = "=0.27.2", features = ["abi3-py310"] } +pyo3-stub-gen = { version = "=0.19.0", default-features = false } + +[[bin]] +name = "stub_gen" +path = "src/bin/stub_gen.rs" diff --git a/crates/hyper-viz-python/README.md b/crates/hyper-viz-python/README.md new file mode 100644 index 0000000..d36001e --- /dev/null +++ b/crates/hyper-viz-python/README.md @@ -0,0 +1,3 @@ +# Hyper Python + +Rust-backed HIF interchange; optional native viewer launch. See [HIF and Python guide](../../docs/HIF.md) for examples, supported semantics, and installation. diff --git a/crates/hyper-viz-python/examples/xgi_interop.py b/crates/hyper-viz-python/examples/xgi_interop.py new file mode 100644 index 0000000..647cf62 --- /dev/null +++ b/crates/hyper-viz-python/examples/xgi_interop.py @@ -0,0 +1,27 @@ +"""Run with XGI 0.10.2 and the built hyper_viz package.""" +import argparse +import tempfile +from pathlib import Path + +import xgi +import hyper_viz + +parser = argparse.ArgumentParser() +parser.add_argument('--viewer', help='Optional path to the installed native Hyper viewer') +args = parser.parse_args() +graph = xgi.Hypergraph() +graph.add_nodes_from(['a', 'b', 'isolated']) +graph.add_edge(['a', 'b'], idx='research') +graph.nodes['a']['source'] = 'experiment' +with tempfile.TemporaryDirectory() as directory: + incoming = Path(directory) / 'xgi.json' + outgoing = Path(directory) / 'roundtrip.json' + xgi.write_hif(graph, str(incoming)) + document = hyper_viz.HifDocument.load(str(incoming)) + document.save(str(outgoing)) + restored = xgi.read_hif(str(outgoing)) + print(f'Preserved {len(restored.nodes)} nodes and {len(restored.edges)} edges') + if args.viewer: + # Some exporters include incidence properties; conversion then raises + # a compatibility error instead of silently dropping scientific data. + hyper_viz.show(document, executable=args.viewer).wait() diff --git a/crates/hyper-viz-python/pyproject.toml b/crates/hyper-viz-python/pyproject.toml new file mode 100644 index 0000000..8a53b72 --- /dev/null +++ b/crates/hyper-viz-python/pyproject.toml @@ -0,0 +1,18 @@ +[build-system] +requires = ["maturin==1.9.6"] +build-backend = "maturin" + +[project] +name = "hyper-viz" +version = "0.1.0" +requires-python = ">=3.10" +description = "Rust-backed HIF interchange and native Hyper viewer launcher" +readme = "README.md" +license = "MIT OR Apache-2.0" + +[tool.maturin] +module-name = "hyper_viz._core" +python-source = "python" +features = ["pyo3/extension-module"] +include = ["python/hyper_viz/HIF-LICENSE"] +exclude = ["**/__pycache__/**", "**/*.pyc"] diff --git a/crates/hyper-viz-python/python/hyper_viz/HIF-LICENSE b/crates/hyper-viz-python/python/hyper_viz/HIF-LICENSE new file mode 100644 index 0000000..5997fb9 --- /dev/null +++ b/crates/hyper-viz-python/python/hyper_viz/HIF-LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024-2025 HIF development team + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/crates/hyper-viz-python/python/hyper_viz/LICENSE-APACHE b/crates/hyper-viz-python/python/hyper_viz/LICENSE-APACHE new file mode 100644 index 0000000..a066530 --- /dev/null +++ b/crates/hyper-viz-python/python/hyper_viz/LICENSE-APACHE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2026 Bregy Malpartida / AtomicStrata + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/crates/hyper-viz-python/python/hyper_viz/LICENSE-MIT b/crates/hyper-viz-python/python/hyper_viz/LICENSE-MIT new file mode 100644 index 0000000..305152e --- /dev/null +++ b/crates/hyper-viz-python/python/hyper_viz/LICENSE-MIT @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Bregy Malpartida / AtomicStrata + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/crates/hyper-viz-python/python/hyper_viz/__init__.py b/crates/hyper-viz-python/python/hyper_viz/__init__.py new file mode 100644 index 0000000..5355627 --- /dev/null +++ b/crates/hyper-viz-python/python/hyper_viz/__init__.py @@ -0,0 +1,8 @@ +"""HIF interchange in Rust and an optional native Hyper viewer.""" +from ._core import HifDocument as HifDocument +from ._errors import HifCompatibilityError as HifCompatibilityError +from ._errors import HifValidationError as HifValidationError +from ._viewer import ViewerHandle as ViewerHandle +from ._viewer import show as show + +__all__ = ["HifDocument", "HifValidationError", "HifCompatibilityError", "ViewerHandle", "show"] diff --git a/crates/hyper-viz-python/python/hyper_viz/_core.pyi b/crates/hyper-viz-python/python/hyper_viz/_core.pyi new file mode 100644 index 0000000..528d02f --- /dev/null +++ b/crates/hyper-viz-python/python/hyper_viz/_core.pyi @@ -0,0 +1,38 @@ +# This file is automatically generated by pyo3_stub_gen +# ruff: noqa: E501, F401, F403, F405 + +import builtins +import typing +__all__ = [ + "HifDocument", +] + +@typing.final +class HifDocument: + @staticmethod + def from_json(raw: builtins.str) -> HifDocument: + r""" + Parse and validate HIF without requiring viewer compatibility. + """ + @staticmethod + def load(path: builtins.str) -> HifDocument: + r""" + Load HIF offline from a UTF-8 JSON file. + """ + @staticmethod + def from_hypergraph_json(raw: builtins.str) -> HifDocument: + r""" + Export native hypergraph.v1 JSON to a new HIF document. + """ + def to_json(self) -> builtins.str: + r""" + Serialize all HIF properties, including unsupported viewer semantics. + """ + def save(self, path: builtins.str) -> None: + r""" + Save all HIF properties as UTF-8 JSON. + """ + def to_hypergraph_json(self) -> builtins.str: + r""" + Convert to viewer JSON, rejecting unsupported semantics and weight overflow. + """ diff --git a/crates/hyper-viz-python/python/hyper_viz/_errors.py b/crates/hyper-viz-python/python/hyper_viz/_errors.py new file mode 100644 index 0000000..97d6976 --- /dev/null +++ b/crates/hyper-viz-python/python/hyper_viz/_errors.py @@ -0,0 +1,11 @@ +"""Native exceptions expose JSON Pointer locations and a reason.""" +from . import _core + + +class _LocatedError(Exception): + location: str + reason: str + + +HifValidationError: type[_LocatedError] = getattr(_core, "HifValidationError") +HifCompatibilityError: type[_LocatedError] = getattr(_core, "HifCompatibilityError") diff --git a/crates/hyper-viz-python/python/hyper_viz/_viewer.py b/crates/hyper-viz-python/python/hyper_viz/_viewer.py new file mode 100644 index 0000000..2a28076 --- /dev/null +++ b/crates/hyper-viz-python/python/hyper_viz/_viewer.py @@ -0,0 +1,101 @@ +"""A separately installed viewer owns its window and event loop.""" +from __future__ import annotations + +import os +from pathlib import Path +import shutil +import subprocess +import tempfile +import threading +from typing import Literal + +from ._core import HifDocument + +Projection = Literal["bipartite", "clique", "star"] + + +class ViewerHandle: + """Own a viewer process and snapshot; dropping the handle leaves the viewer open. + + A background waiter removes the snapshot after process exit. Use close() or + a context manager to explicitly terminate the viewer. + """ + + def __init__(self, process: subprocess.Popen[bytes], snapshot: tempfile.TemporaryDirectory[str]) -> None: + self._process = process + self._snapshot = snapshot + self._lock = threading.Lock() + self._waiter = threading.Thread(target=self._reap, daemon=True) + self._waiter.start() + + def _cleanup(self) -> None: + with self._lock: + self._snapshot.cleanup() + + def _reap(self) -> None: + self._process.wait() + self._cleanup() + + def poll(self) -> int | None: + result = self._process.poll() + if result is not None: + self._cleanup() + return result + + def wait(self, timeout: float | None = None) -> int: + """Return the exit code; timeout leaves the viewer and its snapshot intact.""" + result = self._process.wait(timeout=timeout) + self._cleanup() + return result + + def close(self) -> None: + """Terminate, then kill after five seconds if necessary; safe to repeat.""" + if self._process.poll() is None: + try: + self._process.terminate() + except ProcessLookupError: + pass + try: + self.wait(timeout=5) + except subprocess.TimeoutExpired: + self._process.kill() + self.wait() + + def __enter__(self) -> ViewerHandle: + return self + + def __exit__(self, *_: object) -> None: + self.close() + + +def show( + document: HifDocument, + *, + executable: str | os.PathLike[str] | None = None, + projection: Projection = "bipartite", +) -> ViewerHandle: + """Validate, snapshot, and launch Hyper asynchronously without shell execution. + + Install the native Hyper binary separately, put it on PATH, or pass its path. + No executable is downloaded automatically. Nonzero exit codes are returned + by wait(); inherited stdout/stderr retain the viewer's diagnostics. + """ + if projection not in ("bipartite", "clique", "star"): + raise ValueError("projection must be bipartite, clique, or star") + raw = document.to_hypergraph_json() + candidate = os.fspath(executable) if executable is not None else "hyper" + resolved = shutil.which(candidate) + if resolved is None: + raise FileNotFoundError( + f"Cannot find executable {candidate!r}; install the native Hyper viewer " + "separately and pass executable='/path/to/hyper' or put it on PATH." + ) + snapshot = tempfile.TemporaryDirectory(prefix="hyper-viz-") + try: + path = Path(snapshot.name) / "graph.json" + path.write_text(raw, encoding="utf-8") + process = subprocess.Popen([resolved, str(path), "--projection", projection]) + return ViewerHandle(process, snapshot) + except BaseException: + snapshot.cleanup() + raise diff --git a/crates/hyper-viz-python/python/hyper_viz/py.typed b/crates/hyper-viz-python/python/hyper_viz/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/crates/hyper-viz-python/requirements-test.txt b/crates/hyper-viz-python/requirements-test.txt new file mode 100644 index 0000000..2bcf9c9 --- /dev/null +++ b/crates/hyper-viz-python/requirements-test.txt @@ -0,0 +1,3 @@ +pytest==8.4.2 +xgi==0.10.2 +mypy==1.18.2 diff --git a/crates/hyper-viz-python/src/bin/stub_gen.rs b/crates/hyper-viz-python/src/bin/stub_gen.rs new file mode 100644 index 0000000..129c4d8 --- /dev/null +++ b/crates/hyper-viz-python/src/bin/stub_gen.rs @@ -0,0 +1,16 @@ +fn main() -> pyo3_stub_gen::Result<()> { + let mut stubs = hyper_viz_python::stub_info()?; + // The parent is handwritten Python: a generated parent stub would hide + // show(), ViewerHandle, and exception aliases from type checkers. + stubs + .modules + .retain(|name, _| name.starts_with("hyper_viz._core")); + stubs.generate()?; + let root = stubs.python_root.join("hyper_viz"); + std::fs::rename(root.join("_core/__init__.pyi"), root.join("_core.pyi"))?; + let stub = root.join("_core.pyi"); + let content = std::fs::read_to_string(&stub)?; + std::fs::write(stub, format!("{}\n", content.trim_end()))?; + std::fs::remove_dir(root.join("_core"))?; + Ok(()) +} diff --git a/crates/hyper-viz-python/src/lib.rs b/crates/hyper-viz-python/src/lib.rs new file mode 100644 index 0000000..5316bd2 --- /dev/null +++ b/crates/hyper-viz-python/src/lib.rs @@ -0,0 +1,93 @@ +//! Small Python binding boundary; all interchange logic stays in hyper-viz. +use hyper_viz::{HifError, HifErrorKind, InputFormat}; +use pyo3::{ + create_exception, + exceptions::{PyException, PyOSError}, + prelude::*, +}; +use pyo3_stub_gen::{define_stub_info_gatherer, derive::*}; + +create_exception!(_core, HifValidationError, PyException); +create_exception!(_core, HifCompatibilityError, PyException); + +fn error(py: Python<'_>, err: HifError) -> PyErr { + let result = match err.kind { + HifErrorKind::Compatibility => HifCompatibilityError::new_err(err.to_string()), + HifErrorKind::Io => PyOSError::new_err(err.to_string()), + _ => HifValidationError::new_err(err.to_string()), + }; + let value = result.value(py); + let _ = value.setattr("location", err.location); + let _ = value.setattr("reason", err.reason); + result +} + +#[gen_stub_pyclass] +#[pyclass(module = "hyper_viz._core", name = "HifDocument", frozen)] +pub struct Document { + document: hyper_viz::HifDocument, +} + +#[gen_stub_pymethods] +#[pymethods] +impl Document { + /// Parse and validate HIF without requiring viewer compatibility. + #[staticmethod] + fn from_json(py: Python<'_>, raw: &str) -> PyResult { + hyper_viz::parse_hif(raw) + .map(|document| Self { document }) + .map_err(|e| error(py, e)) + } + /// Load HIF offline from a UTF-8 JSON file. + #[staticmethod] + fn load(py: Python<'_>, path: &str) -> PyResult { + hyper_viz::load_hif(path) + .map(|document| Self { document }) + .map_err(|e| error(py, e)) + } + /// Export native hypergraph.v1 JSON to a new HIF document. + #[staticmethod] + fn from_hypergraph_json(py: Python<'_>, raw: &str) -> PyResult { + let graph = + hyper_viz::from_json_str_with_format(raw, InputFormat::Hypergraph).map_err(|e| { + error( + py, + HifError { + kind: HifErrorKind::Validation, + location: "/".into(), + reason: e.to_string(), + }, + ) + })?; + hyper_viz::HifDocument::from_hypergraph(&graph) + .map(|document| Self { document }) + .map_err(|e| error(py, e)) + } + /// Serialize all HIF properties, including unsupported viewer semantics. + fn to_json(&self, py: Python<'_>) -> PyResult { + hyper_viz::serialize_hif(&self.document).map_err(|e| error(py, e)) + } + /// Save all HIF properties as UTF-8 JSON. + fn save(&self, py: Python<'_>, path: &str) -> PyResult<()> { + hyper_viz::save_hif(path, &self.document).map_err(|e| error(py, e)) + } + /// Convert to viewer JSON, rejecting unsupported semantics and weight overflow. + fn to_hypergraph_json(&self, py: Python<'_>) -> PyResult { + let graph = self.document.to_hypergraph().map_err(|e| error(py, e))?; + serde_json::to_string(&graph).map_err(|e| HifValidationError::new_err(e.to_string())) + } +} +#[pymodule] +fn _core(m: &Bound<'_, PyModule>) -> PyResult<()> { + m.add_class::()?; + m.add( + "HifValidationError", + m.py().get_type::(), + )?; + m.add( + "HifCompatibilityError", + m.py().get_type::(), + )?; + Ok(()) +} +define_stub_info_gatherer!(stub_info); diff --git a/crates/hyper-viz-python/tests/check_wheel.py b/crates/hyper-viz-python/tests/check_wheel.py new file mode 100644 index 0000000..b47f7be --- /dev/null +++ b/crates/hyper-viz-python/tests/check_wheel.py @@ -0,0 +1,19 @@ +"""Validate distributable contents without relying on an editable installation.""" +from pathlib import Path +import sys +import zipfile + +wheels = list(Path(sys.argv[1]).glob('*.whl')) +assert wheels, 'No wheels built' +for wheel in wheels: + assert '-cp310-abi3-' in wheel.name, wheel.name + with zipfile.ZipFile(wheel) as archive: + names = set(archive.namelist()) + for required in ['hyper_viz/__init__.py', 'hyper_viz/_core.pyi', 'hyper_viz/_viewer.py', 'hyper_viz/_errors.py', 'hyper_viz/py.typed', 'hyper_viz/HIF-LICENSE', 'hyper_viz/LICENSE-MIT', 'hyper_viz/LICENSE-APACHE']: + assert required in names, f'{wheel.name}: missing {required}' + assert 'hyper_viz/__init__.pyi' not in names, 'Parent stub hides handwritten API' + native = [name for name in names if name.startswith('hyper_viz/_core') and name.endswith(('.so','.pyd'))] + assert len(native) == 1, f'Expected one native extension: {native}' + assert archive.read('hyper_viz/HIF-LICENSE').startswith(b'MIT License') + assert not any('__pycache__' in name for name in names), 'Wheel includes bytecode caches' + print(f'Checked {wheel.name}') diff --git a/crates/hyper-viz-python/tests/test_api.py b/crates/hyper-viz-python/tests/test_api.py new file mode 100644 index 0000000..608d29b --- /dev/null +++ b/crates/hyper-viz-python/tests/test_api.py @@ -0,0 +1,143 @@ +import json +import os +import sys +from pathlib import Path + +import pytest +import hyper_viz as hv + + +def test_rich_hif_is_preserved_but_not_viewed(tmp_path): + raw = {"network-type":"directed", "incidences":[{"node":1,"edge":"e","direction":"head","attrs":{"role":None}}]} + doc = hv.HifDocument.from_json(json.dumps(raw)) + path = tmp_path / 'roundtrip.json' + doc.save(str(path)) + assert json.loads(hv.HifDocument.load(str(path)).to_json()) == raw + with pytest.raises(hv.HifCompatibilityError) as error: + doc.to_hypergraph_json() + assert error.value.location == '/network-type' + assert error.value.reason + + +def test_validation_and_native_constructor(): + with pytest.raises(hv.HifValidationError) as error: + hv.HifDocument.from_json('{"incidences":[{"node":false,"edge":1}]}') + assert '/incidences/0/node' in error.value.location + native = {"version":"hypergraph.v1","vertices":[{"id":"a","attrs":{"source":[None,1]}}],"hyperedges":[{"id":"e","vertices":["a"]}]} + doc = hv.HifDocument.from_hypergraph_json(json.dumps(native)) + assert json.loads(doc.to_json())['nodes'][0]['attrs']['source'] == [None,1] + assert json.loads(doc.to_hypergraph_json())['hyperedges'][0]['vertices'] == ['s:a'] + with pytest.raises(hv.HifValidationError): + hv.HifDocument.from_hypergraph_json('{"incidences":[]}') + with pytest.raises(OSError): + hv.HifDocument.load('/nonexistent/hyper-hif-test') + + +@pytest.mark.skipif(sys.platform == 'win32', reason='POSIX executable fixture; cross-platform missing-executable test still runs') +def test_launcher_owns_snapshot_and_cleans_after_exit(tmp_path): + exe = tmp_path / 'viewer with spaces' + output = tmp_path / 'observed.json' + exe.write_text(f'#!{sys.executable}\nimport sys,json,time\nfrom pathlib import Path\nPath({str(output)!r}).write_text(json.dumps({{"args":sys.argv[1:],"graph":json.loads(Path(sys.argv[1]).read_text())}}))\ntime.sleep(0.1)\nsys.exit(7)\n') + exe.chmod(0o755) + doc = hv.HifDocument.from_json('{"incidences":[{"node":"a","edge":"e"}]}') + handle = hv.show(doc, executable=exe, projection='star') + assert handle.wait(timeout=10) == 7 + observed = json.loads(output.read_text()) + assert observed['args'][1:] == ['--projection','star'] + assert observed['graph']['vertices'][0]['id'] == 's:a' + assert not Path(observed['args'][0]).exists() + handle.close() + + +@pytest.mark.skipif(sys.platform == 'win32', reason='POSIX executable fixture') +def test_close_terminates_and_cleanup_is_automatic(tmp_path): + exe = tmp_path / 'sleeper' + output = tmp_path / 'path.txt' + exe.write_text(f'#!{sys.executable}\nimport sys,time\nfrom pathlib import Path\nPath({str(output)!r}).write_text(sys.argv[1])\ntime.sleep(60)\n') + exe.chmod(0o755) + handle = hv.show(hv.HifDocument.from_json('{"incidences":[]}'), executable=exe) + import time + deadline = time.monotonic() + 10 + while not output.exists() and time.monotonic() < deadline: + time.sleep(0.01) + snapshot = Path(output.read_text()) + assert snapshot.exists() + handle.close() + assert handle.poll() is not None + assert not snapshot.exists() + + +def test_launcher_failure_cleans_and_validates(monkeypatch, tmp_path): + doc = hv.HifDocument.from_json('{"incidences":[]}') + monkeypatch.setenv('PATH', str(tmp_path)) + with pytest.raises(FileNotFoundError, match='install'): + hv.show(doc) + with pytest.raises(FileNotFoundError): + hv.show(doc, executable=tmp_path/'absent') + with pytest.raises(ValueError): + hv.show(doc, projection='wrong') + with pytest.raises(hv.HifCompatibilityError): + hv.show(hv.HifDocument.from_json('{"network-type":"directed","incidences":[]}')) + + +def test_xgi_roundtrip(tmp_path): + import xgi + graph = xgi.Hypergraph() + graph.add_nodes_from(['isolated','a','b']) + graph.add_edge(['a','b'],idx='edge') + graph.nodes['a']['nested'] = {'evidence':[None,3]} + incoming, outgoing = tmp_path/'xgi.json', tmp_path/'hyper.json' + xgi.write_hif(graph, str(incoming)) + doc = hv.HifDocument.load(str(incoming)) + doc.save(str(outgoing)) + restored = xgi.read_hif(str(outgoing)) + assert set(restored.nodes) == {'isolated','a','b'} + assert restored.edges.members('edge') == {'a','b'} + assert restored.nodes['a']['nested'] == {'evidence':[None,3]} + # XGI may export incidence weights; full interchange must still succeed. + + +def test_big_integer_ids_and_exact_decimal_metadata(): + raw = '{"incidences":[],"nodes":[{"node":184467440737095516160,"attrs":{"precise":0.12345678901234567890123456789}}]}' + doc = hv.HifDocument.from_json(raw) + assert '184467440737095516160' in doc.to_json() + assert '0.12345678901234567890123456789' in doc.to_json() + assert json.loads(doc.to_hypergraph_json())['vertices'][0]['id'] == 'i:184467440737095516160' + + +def test_cross_platform_process_exit_cleanup(): + # Empty native graph JSON is also a valid Python dictionary expression. + # A real Python child consumes the snapshot and exits on every platform. + handle = hv.show(hv.HifDocument.from_json('{"incidences":[]}'), executable=sys.executable) + assert handle.wait(timeout=10) == 0 + handle.close() + + +@pytest.mark.skipif(sys.platform == 'win32', reason='POSIX executable fixture') +def test_automatic_exit_cleanup_without_wait(tmp_path): + exe = tmp_path / 'quick-viewer' + output = tmp_path / 'snapshot.txt' + exe.write_text(f'#!{sys.executable}\nimport sys,time\nfrom pathlib import Path\nPath({str(output)!r}).write_text(sys.argv[1])\ntime.sleep(0.1)\n') + exe.chmod(0o755) + handle = hv.show(hv.HifDocument.from_json('{"incidences":[]}'), executable=exe) + import time + deadline = time.monotonic() + 10 + while not output.exists() and time.monotonic() < deadline: + time.sleep(0.01) + path = Path(output.read_text()) + while path.exists() and time.monotonic() < deadline: + time.sleep(0.01) + assert not path.exists() + assert handle.poll() == 0 + + +@pytest.mark.skipif(sys.platform == 'win32', reason='POSIX invalid interpreter fixture') +def test_spawn_failure_removes_created_snapshot(monkeypatch, tmp_path): + import tempfile + monkeypatch.setattr(tempfile, 'tempdir', str(tmp_path)) + exe = tmp_path / 'broken-viewer' + exe.write_text('#!/nonexistent/hyper-test-interpreter\n') + exe.chmod(0o755) + with pytest.raises(FileNotFoundError): + hv.show(hv.HifDocument.from_json('{"incidences":[]}'), executable=exe) + assert list(tmp_path.glob('hyper-viz-*')) == [] diff --git a/crates/hyper-viz/Cargo.toml b/crates/hyper-viz/Cargo.toml index 9a64b4d..441eea5 100644 --- a/crates/hyper-viz/Cargo.toml +++ b/crates/hyper-viz/Cargo.toml @@ -28,5 +28,8 @@ serde_json = { workspace = true } thiserror = { workspace = true } tracing = { workspace = true } +num-bigint = "=0.4.8" +jsonschema = { version = "=0.33.0", default-features = false } + [dev-dependencies] tempfile = "3" diff --git a/crates/hyper-viz/examples/hif_roundtrip.rs b/crates/hyper-viz/examples/hif_roundtrip.rs new file mode 100644 index 0000000..0135be2 --- /dev/null +++ b/crates/hyper-viz/examples/hif_roundtrip.rs @@ -0,0 +1,20 @@ +//! `cargo run -p hyper-viz --example hif_roundtrip -- input.json output.json` +use hyper_viz::{load_hif, save_hif}; +fn main() -> Result<(), Box> { + let args: Vec = std::env::args().collect(); + if args.len() != 3 { + return Err("usage: hif_roundtrip INPUT OUTPUT".into()); + } + let document = load_hif(&args[1])?; + save_hif(&args[2], &document)?; + println!("Preserved {} incidences", document.incidences().len()); + match document.to_hypergraph() { + Ok(graph) => println!( + "Viewer compatible: {} nodes / {} edges", + graph.vertices.len(), + graph.hyperedges.len() + ), + Err(error) => println!("Document preserved; viewer conversion unavailable: {error}"), + } + Ok(()) +} diff --git a/crates/hyper-viz/schemas/HIF-LICENSE b/crates/hyper-viz/schemas/HIF-LICENSE new file mode 100644 index 0000000..5997fb9 --- /dev/null +++ b/crates/hyper-viz/schemas/HIF-LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024-2025 HIF development team + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/crates/hyper-viz/schemas/README.md b/crates/hyper-viz/schemas/README.md new file mode 100644 index 0000000..663993c --- /dev/null +++ b/crates/hyper-viz/schemas/README.md @@ -0,0 +1,8 @@ +# Vendored HIF schema + +Source: https://github.com/HIF-org/HIF-standard +Commit: b691a3d2ec32100c0229ebe1151e9afad015c356 +Path: schemas/hif_schema.json +License: HIF-LICENSE (upstream MIT) + +The unmodified schema declares Draft 7. Its `unevaluatedProperties` keywords are not part of that draft; `additionalProperties: false` supplies the closed-object checks. The validator is compiled from embedded bytes, with network retrieval features disabled. No schema is fetched at runtime. diff --git a/crates/hyper-viz/schemas/hif.schema.json b/crates/hyper-viz/schemas/hif.schema.json new file mode 100644 index 0000000..5651f07 --- /dev/null +++ b/crates/hyper-viz/schemas/hif.schema.json @@ -0,0 +1,112 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://raw.githubusercontent.com/pszufe/HIF_validators/main/schemas/schema.json", + "title": "Hypergraph Interchange Format", + "version": "latest", + "type": "object", + "properties": { + "network-type": { + "enum": [ + "undirected", + "directed", + "asc" + ] + }, + "metadata": { + "type": "object" + }, + "incidences": { + "type": "array", + "items": { + "type": "object", + "properties": { + "edge": { + "type": [ + "string", + "integer" + ] + }, + "node": { + "type": [ + "string", + "integer" + ] + }, + "weight": { + "type": "number" + }, + "direction": { + "enum": [ + "head", + "tail" + ] + }, + "attrs": { + "type": "object" + } + }, + "unevaluatedProperties": false, + "additionalProperties": false, + "required": [ + "edge", + "node" + ] + } + }, + "nodes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "node": { + "type": [ + "string", + "integer" + ] + }, + "weight": { + "type": "number" + }, + "attrs": { + "type": "object" + } + }, + "unevaluatedProperties": false, + "additionalProperties": false, + "required": [ + "node" + ] + } + }, + "edges": { + "type": "array", + "items": { + "type": "object", + "properties": { + "edge": { + "type": [ + "string", + "integer" + ] + }, + "weight": { + "type": "number" + }, + "attrs": { + "type": "object" + } + }, + "unevaluatedProperties": false, + "additionalProperties": false, + "required": [ + "edge" + ] + } + } + }, + "unevaluatedProperties": false, + "additionalProperties": false, + "required": [ + "incidences" + ] +} \ No newline at end of file diff --git a/crates/hyper-viz/src/error.rs b/crates/hyper-viz/src/error.rs index f693b54..2b99387 100644 --- a/crates/hyper-viz/src/error.rs +++ b/crates/hyper-viz/src/error.rs @@ -4,6 +4,10 @@ use thiserror::Error; #[derive(Debug, Error)] pub enum VizError { + #[error(transparent)] + Hif(#[from] crate::hif::HifError), + #[error("input format: {0}")] + InputFormat(String), #[error("io error at {path}: {source}")] Io { path: PathBuf, diff --git a/crates/hyper-viz/src/hif.rs b/crates/hyper-viz/src/hif.rs new file mode 100644 index 0000000..482631c --- /dev/null +++ b/crates/hyper-viz/src/hif.rs @@ -0,0 +1,421 @@ +//! Offline HIF interchange. A document is not necessarily safe to visualize. +use crate::{Hyperedge, Hypergraph, Vertex}; +use serde::{Deserialize, Serialize}; +use serde_json::{Map, Number, Value}; +use std::{ + collections::{HashMap, HashSet}, + path::Path, + sync::OnceLock, +}; + +/// Location-aware format or viewer compatibility failure (JSON Pointer locations). +#[derive(Debug, Clone, thiserror::Error)] +#[error("HIF {kind:?} at {location}: {reason}")] +pub struct HifError { + pub kind: HifErrorKind, + pub location: String, + pub reason: String, +} +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum HifErrorKind { + Json, + Validation, + Compatibility, + Io, +} +impl HifError { + fn new(kind: HifErrorKind, location: impl Into, reason: impl Into) -> Self { + Self { + kind, + location: location.into(), + reason: reason.into(), + } + } + fn incompatible(location: impl Into, reason: impl Into) -> Self { + Self::new(HifErrorKind::Compatibility, location, reason) + } +} + +/// Integer and string IDs inhabit separate namespaces. +#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize)] +#[serde(untagged)] +pub enum HifId { + String(String), + Integer(Number), +} +impl<'de> Deserialize<'de> for HifId { + fn deserialize>(deserializer: D) -> Result { + match Value::deserialize(deserializer)? { + Value::String(s) => Ok(Self::String(s)), + Value::Number(n) if is_integral(&n) => Ok(Self::Integer(n)), + _ => Err(serde::de::Error::custom( + "HIF IDs must be strings or integers", + )), + } + } +} +impl HifId { + fn viewer_id(&self) -> String { + match self { + Self::String(s) => format!("s:{s}"), + Self::Integer(n) => format!("i:{}", canonical_integer(n)), + } + } + fn label(&self) -> String { + match self { + Self::String(s) => s.clone(), + Self::Integer(n) => n.to_string(), + } + } +} +// A normalized significand and arbitrary-size decimal exponent avoid both +// float rounding and overflow when IDs use JSON's exponent notation. +fn integer_parts(n: &Number) -> Option<(bool, String, num_bigint::BigInt)> { + let raw = n.to_string(); + let (mantissa, exponent) = raw.split_once(['e', 'E']).unwrap_or((&raw, "0")); + let exp = exponent.parse::().ok()?; + let negative = mantissa.starts_with('-'); + let (_, fraction) = mantissa.split_once('.').unwrap_or((mantissa, "")); + let digits = mantissa.trim_start_matches('-').replace('.', ""); + let digits = digits.trim_start_matches('0'); + if digits.is_empty() { + return Some((false, "0".into(), 0.into())); + } + let trailing = digits.len() - digits.trim_end_matches('0').len(); + let shift = exp - num_bigint::BigInt::from(fraction.len()) + num_bigint::BigInt::from(trailing); + Some((negative, digits[..digits.len() - trailing].into(), shift)) +} +fn is_integral(n: &Number) -> bool { + integer_parts(n).is_some_and(|(_, _, shift)| shift.sign() != num_bigint::Sign::Minus) +} +fn canonical_integer(n: &Number) -> String { + let (negative, mut digits, shift) = integer_parts(n).expect("validated integer ID"); + let sign = if negative { "-" } else { "" }; + // Avoid allocating huge expanded strings while preserving exact identity. + if &shift + num_bigint::BigInt::from(digits.len()) > num_bigint::BigInt::from(10000) { + return format!("{sign}{digits}e{shift}"); + } + let zeros = usize::try_from(shift).expect("validated bounded nonnegative exponent"); + digits.extend(std::iter::repeat_n('0', zeros)); + format!("{sign}{digits}") +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] +pub struct HifNode { + pub node: HifId, + #[serde(skip_serializing_if = "Option::is_none")] + pub weight: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub attrs: Option>, +} +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] +pub struct HifEdge { + pub edge: HifId, + #[serde(skip_serializing_if = "Option::is_none")] + pub weight: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub attrs: Option>, +} +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] +pub struct HifIncidence { + pub node: HifId, + pub edge: HifId, + #[serde(skip_serializing_if = "Option::is_none")] + pub weight: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub direction: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub attrs: Option>, +} +/// Validated HIF document; use the interchange functions rather than raw deserialization. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] +pub struct HifDocument { + #[serde(rename = "network-type", skip_serializing_if = "Option::is_none")] + network_type: Option, + #[serde(skip_serializing_if = "Option::is_none")] + metadata: Option>, + incidences: Vec, + #[serde(skip_serializing_if = "Option::is_none")] + nodes: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + edges: Option>, +} +fn validator() -> &'static jsonschema::Validator { + static VALIDATOR: OnceLock = OnceLock::new(); + VALIDATOR.get_or_init(|| { + let schema: Value = serde_json::from_str(include_str!("../schemas/hif.schema.json")) + .expect("bundled HIF schema"); + jsonschema::options() + .with_draft(jsonschema::Draft::Draft7) + .build(&schema) + .expect("valid bundled HIF schema") + }) +} +pub fn parse_hif(raw: &str) -> Result { + let value: Value = serde_json::from_str(raw) + .map_err(|e| HifError::new(HifErrorKind::Json, "/", e.to_string()))?; + // jsonschema 0.33's union type validator recognizes only i64/u64 as + // integers. Validate a shadow copy with mathematically integral IDs + // normalized to zero; deserialize the untouched arbitrary-precision input. + let mut validation_value = value.clone(); + for (collection, keys) in [ + ("nodes", &["node"][..]), + ("edges", &["edge"][..]), + ("incidences", &["node", "edge"][..]), + ] { + if let Some(records) = validation_value + .get_mut(collection) + .and_then(Value::as_array_mut) + { + for record in records { + for key in keys { + if record + .get(*key) + .and_then(Value::as_number) + .is_some_and(is_integral) + { + record[*key] = Value::Number(0.into()); + } + } + } + } + } + if let Some(e) = validator().iter_errors(&validation_value).next() { + return Err(HifError::new( + HifErrorKind::Validation, + format!("/{}", e.instance_path.to_string().trim_start_matches('/')), + e.to_string(), + )); + } + serde_json::from_str(raw) + .map_err(|e| HifError::new(HifErrorKind::Validation, "/", e.to_string())) +} +pub fn load_hif(path: impl AsRef) -> Result { + let path = path.as_ref(); + let raw = std::fs::read_to_string(path) + .map_err(|e| HifError::new(HifErrorKind::Io, path.display().to_string(), e.to_string()))?; + parse_hif(&raw) +} +pub fn serialize_hif(doc: &HifDocument) -> Result { + let raw = serde_json::to_string_pretty(doc) + .map_err(|e| HifError::new(HifErrorKind::Json, "/", e.to_string()))?; + parse_hif(&raw)?; + Ok(raw) +} +pub fn save_hif(path: impl AsRef, doc: &HifDocument) -> Result<(), HifError> { + let raw = serialize_hif(doc)?; + let path = path.as_ref(); + std::fs::write(path, raw) + .map_err(|e| HifError::new(HifErrorKind::Io, path.display().to_string(), e.to_string())) +} +fn weight(value: &Option, location: &str) -> Result, HifError> { + value + .as_ref() + .map(|n| { + let w = n.as_f64().unwrap_or(f64::INFINITY) as f32; + if w.is_finite() { + Ok(w) + } else { + Err(HifError::incompatible( + location, + "weight overflows viewer f32; original is retained in HIF", + )) + } + }) + .transpose() +} +impl HifDocument { + pub fn incidences(&self) -> &[HifIncidence] { + &self.incidences + } + pub fn nodes(&self) -> Option<&[HifNode]> { + self.nodes.as_deref() + } + pub fn edges(&self) -> Option<&[HifEdge]> { + self.edges.as_deref() + } + pub fn to_hypergraph(&self) -> Result { + // Revalidate even documents constructed via serde by Rust callers. + serialize_hif(self)?; + if self + .network_type + .as_deref() + .is_some_and(|v| v != "undirected") + { + return Err(HifError::incompatible( + "/network-type", + "viewer supports only undirected hypergraphs", + )); + } + let mut graph = Hypergraph::new(); + graph.meta.attrs = self.metadata.clone().unwrap_or_default(); + let mut nodes = HashSet::new(); + let mut edges = HashMap::new(); + for (i, n) in self.nodes.iter().flatten().enumerate() { + let id = n.node.viewer_id(); + if !nodes.insert(id.clone()) { + return Err(HifError::incompatible( + format!("/nodes/{i}/node"), + "duplicate node declaration", + )); + } + let mut v = Vertex::new(id, n.node.label()); + v.attrs = n.attrs.clone().unwrap_or_default(); + v.weight = weight(&n.weight, &format!("/nodes/{i}/weight"))?; + graph.vertices.push(v); + } + for (i, e) in self.edges.iter().flatten().enumerate() { + let id = e.edge.viewer_id(); + if edges.insert(id.clone(), graph.hyperedges.len()).is_some() { + return Err(HifError::incompatible( + format!("/edges/{i}/edge"), + "duplicate edge declaration", + )); + } + let mut edge = Hyperedge::new(id, Vec::::new()).with_label(e.edge.label()); + edge.attrs = e.attrs.clone().unwrap_or_default(); + edge.weight = weight(&e.weight, &format!("/edges/{i}/weight"))?; + graph.hyperedges.push(edge); + } + let mut pairs = HashSet::new(); + for (i, incidence) in self.incidences.iter().enumerate() { + for (field, present) in [ + ("direction", incidence.direction.is_some()), + ("weight", incidence.weight.is_some()), + ("attrs", incidence.attrs.is_some()), + ] { + if present { + return Err(HifError::incompatible( + format!("/incidences/{i}/{field}"), + format!( + "incidence {field} cannot be represented by the viewer; retained in HIF" + ), + )); + } + } + let node = incidence.node.viewer_id(); + let edge = incidence.edge.viewer_id(); + if !pairs.insert((node.clone(), edge.clone())) { + return Err(HifError::incompatible( + format!("/incidences/{i}"), + "duplicate incidence pair", + )); + } + if nodes.insert(node.clone()) { + graph + .vertices + .push(Vertex::new(&node, incidence.node.label())); + } + let index = *edges.entry(edge.clone()).or_insert_with(|| { + graph.hyperedges.push( + Hyperedge::new(edge, Vec::::new()).with_label(incidence.edge.label()), + ); + graph.hyperedges.len() - 1 + }); + graph.hyperedges[index].vertices.push(node); + } + Ok(graph) + } + pub fn from_hypergraph(graph: &Hypergraph) -> Result { + fn attrs( + base: &Map, + display: Value, + location: &str, + ) -> Result>, HifError> { + let mut result = base.clone(); + if result.contains_key("_hyper_viz") { + return Err(HifError::incompatible( + location, + "reserved _hyper_viz attribute already exists", + )); + } + result.insert("_hyper_viz".into(), display); + Ok(Some(result)) + } + fn number(w: Option, location: &str) -> Result, HifError> { + w.map(|w| { + Number::from_f64(w as f64) + .ok_or_else(|| HifError::incompatible(location, "non-finite native weight")) + }) + .transpose() + } + if graph.version != crate::GRAPH_VERSION { + return Err(HifError::incompatible( + "/version", + "unsupported native graph version", + )); + } + let mut nodes = Vec::new(); + let mut edges = Vec::new(); + let mut incidences = Vec::new(); + let mut node_ids = HashSet::new(); + let mut edge_ids = HashSet::new(); + for (i, v) in graph.vertices.iter().enumerate() { + if !node_ids.insert(v.id.clone()) { + return Err(HifError::incompatible( + format!("/vertices/{i}/id"), + "duplicate native vertex ID", + )); + } + nodes.push(HifNode { + node: HifId::String(v.id.clone()), + weight: number(v.weight, &format!("/vertices/{i}/weight"))?, + attrs: attrs( + &v.attrs, + serde_json::json!({"label":v.label,"kind":v.kind,"status":v.status}), + &format!("/vertices/{i}/attrs"), + )?, + }); + } + for (i, e) in graph.hyperedges.iter().enumerate() { + if !edge_ids.insert(e.id.clone()) { + return Err(HifError::incompatible( + format!("/hyperedges/{i}/id"), + "duplicate native edge ID", + )); + } + let mut members = HashSet::new(); + for (j, v) in e.vertices.iter().enumerate() { + if !node_ids.contains(v) || !members.insert(v) { + return Err(HifError::incompatible( + format!("/hyperedges/{i}/vertices/{j}"), + "missing native vertex or duplicate membership", + )); + } + incidences.push(HifIncidence { + node: HifId::String(v.clone()), + edge: HifId::String(e.id.clone()), + weight: None, + direction: None, + attrs: None, + }); + } + edges.push(HifEdge { + edge: HifId::String(e.id.clone()), + weight: number(e.weight, &format!("/hyperedges/{i}/weight"))?, + attrs: attrs( + &e.attrs, + serde_json::json!({"label":e.label,"kind":e.kind,"status":e.status}), + &format!("/hyperedges/{i}/attrs"), + )?, + }); + } + let doc = Self { + network_type: Some("undirected".into()), + metadata: attrs( + &graph.meta.attrs, + serde_json::json!({"id":graph.meta.id,"title":graph.meta.title}), + "/meta/attrs", + )?, + nodes: Some(nodes), + edges: Some(edges), + incidences, + }; + serialize_hif(&doc)?; + Ok(doc) + } +} diff --git a/crates/hyper-viz/src/io/mod.rs b/crates/hyper-viz/src/io/mod.rs index b1bc0c3..6373244 100644 --- a/crates/hyper-viz/src/io/mod.rs +++ b/crates/hyper-viz/src/io/mod.rs @@ -10,13 +10,37 @@ use std::path::Path; use crate::error::VizError; use crate::schema::{GRAPH_VERSION, Hypergraph}; +/// Select an interchange format. Auto rejects mixed HIF/native envelopes. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] +pub enum InputFormat { + #[default] + Auto, + Hypergraph, + Hif, +} +impl InputFormat { + pub fn parse(value: &str) -> Option { + match value { + "auto" => Some(Self::Auto), + "hypergraph" => Some(Self::Hypergraph), + "hif" => Some(Self::Hif), + _ => None, + } + } +} pub fn load_json(path: impl AsRef) -> Result { + load_json_with_format(path, InputFormat::Auto) +} +pub fn load_json_with_format( + path: impl AsRef, + format: InputFormat, +) -> Result { let path = path.as_ref(); let raw = std::fs::read_to_string(path).map_err(|source| VizError::Io { path: path.to_path_buf(), source, })?; - from_json_str(&raw) + from_json_str_with_format(&raw, format) } pub fn save_json(path: impl AsRef, graph: &Hypergraph) -> Result<(), VizError> { @@ -29,7 +53,24 @@ pub fn save_json(path: impl AsRef, graph: &Hypergraph) -> Result<(), VizEr } pub fn from_json_str(raw: &str) -> Result { + from_json_str_with_format(raw, InputFormat::Auto) +} +pub fn from_json_str_with_format(raw: &str, format: InputFormat) -> Result { let value: serde_json::Value = serde_json::from_str(raw)?; + let hif = ["incidences", "nodes", "edges", "network-type", "metadata"] + .iter() + .any(|key| value.get(key).is_some()); + let native = ["version", "vertices", "hyperedges", "meta"] + .iter() + .any(|key| value.get(key).is_some()); + if format == InputFormat::Hif || (format == InputFormat::Auto && hif && !native) { + return Ok(crate::parse_hif(raw)?.to_hypergraph()?); + } + if hif || !native || !value.is_object() { + return Err(VizError::InputFormat( + "unrecognized or ambiguous envelope; select a format and supply its fields".into(), + )); + } let version = value .get("version") .and_then(|v| v.as_str()) diff --git a/crates/hyper-viz/src/lib.rs b/crates/hyper-viz/src/lib.rs index 651257d..b7db2bb 100644 --- a/crates/hyper-viz/src/lib.rs +++ b/crates/hyper-viz/src/lib.rs @@ -28,6 +28,7 @@ //! ``` pub mod error; +pub mod hif; pub mod hull; pub mod io; pub mod layout; @@ -40,8 +41,15 @@ pub mod semantics; pub mod session; pub use error::VizError; +pub use hif::{ + HifDocument, HifEdge, HifError, HifErrorKind, HifId, HifIncidence, HifNode, load_hif, + parse_hif, save_hif, serialize_hif, +}; pub use hull::{HullMesh, MAX_HULL_VERTICES, hull_from_points, select_hull_vertices}; -pub use io::{from_json_str, load_json, save_json}; +pub use io::{ + InputFormat, from_json_str, from_json_str_with_format, load_json, load_json_with_format, + save_json, +}; pub use layout::{ForceLayout3D, LayoutConfig, Vec3, layout_edges_from_scene}; pub use motion::{ ONE_SHOT_CAP, ONE_SHOT_SECS, StatusMotion, apply_motion_rgba, hyperedge_status_key, id_phase, diff --git a/crates/hyper-viz/tests/hif.rs b/crates/hyper-viz/tests/hif.rs new file mode 100644 index 0000000..5d6ba5b --- /dev/null +++ b/crates/hyper-viz/tests/hif.rs @@ -0,0 +1,172 @@ +use hyper_viz::{ + HifDocument, InputFormat, from_json_str, from_json_str_with_format, parse_hif, serialize_hif, +}; +use serde_json::{Value, json}; + +#[test] +fn faithful_roundtrip_and_viewer_identity() { + let value = json!({"metadata":{"nested":{"list":[null,true,7]}},"nodes":[{"node":1,"attrs":{"label":"integer"}},{"node":"1","weight":2.5},{"node":"isolated"}],"edges":[{"edge":"empty"}],"incidences":[{"node":1,"edge":4},{"node":"1","edge":4}]}); + let doc = parse_hif(&value.to_string()).unwrap(); + assert_eq!( + serde_json::from_str::(&serialize_hif(&doc).unwrap()).unwrap(), + value + ); + let graph = doc.to_hypergraph().unwrap(); + assert_eq!( + graph + .vertices + .iter() + .map(|v| v.id.as_str()) + .collect::>(), + ["i:1", "s:1", "s:isolated"] + ); + assert_eq!(graph.hyperedges[0].vertices.len(), 0); + assert_eq!(graph.hyperedges[1].vertices, ["i:1", "s:1"]); + assert_eq!(graph.vertices[1].weight, Some(2.5)); + assert_eq!(graph.meta.attrs["nested"]["list"][0], Value::Null); +} + +#[test] +fn preserves_properties_that_viewer_rejects() { + for value in [ + json!({"network-type":"directed","incidences":[{"node":"a","edge":"e","direction":"head","weight":0.123456789,"attrs":{"role":null}}]}), + json!({"network-type":"asc","incidences":[]}), + json!({"incidences":[{"node":1,"edge":2,"attrs":{}}]}), + json!({"incidences":[{"node":1,"edge":2,"weight":0}]}), + json!({"incidences":[{"node":1,"edge":2,"direction":"tail"}]}), + ] { + let doc = parse_hif(&value.to_string()).unwrap(); + assert_eq!( + serde_json::from_str::(&serialize_hif(&doc).unwrap()).unwrap(), + value + ); + let error = doc.to_hypergraph().unwrap_err(); + assert!(!error.location.is_empty()); + } +} + +#[test] +fn schema_errors_and_duplicates_are_actionable() { + for raw in [ + r#"{}"#, + r#"{"incidences":[{"node":true,"edge":1}]}"#, + r#"{"incidences":[],"unexpected":1}"#, + ] { + assert!(parse_hif(raw).is_err()); + } + for value in [ + json!({"incidences":[],"nodes":[{"node":1},{"node":1}]}), + json!({"incidences":[],"edges":[{"edge":"x"},{"edge":"x"}]}), + json!({"incidences":[{"node":1,"edge":2},{"node":1,"edge":2}]}), + ] { + let doc = parse_hif(&value.to_string()).unwrap(); + assert!( + doc.to_hypergraph() + .unwrap_err() + .reason + .contains("duplicate") + ); + } + let doc = parse_hif(r#"{"incidences":[],"nodes":[{"node":1,"weight":1e100}]}"#).unwrap(); + assert!(doc.to_hypergraph().is_err()); +} + +#[test] +fn loading_detects_hif_and_rejects_ambiguity() { + assert_eq!( + from_json_str(r#"{"incidences":[{"node":"a","edge":"e"}]}"#) + .unwrap() + .vertices + .len(), + 1 + ); + assert!(from_json_str(r#"{"incidences":[],"vertices":[]}"#).is_err()); + assert!(from_json_str(r#"{}"#).is_err()); + assert!(from_json_str_with_format(r#"{"incidences":[]}"#, InputFormat::Hypergraph).is_err()); + assert!( + from_json_str_with_format( + r#"{"version":"hypergraph.v1","vertices":[]}"#, + InputFormat::Hif + ) + .is_err() + ); +} + +#[test] +fn native_export_keeps_attributes_and_weights() { + let mut graph = hyper_viz::sample_coauthorship(); + graph.vertices[0] + .attrs + .insert("evidence".into(), json!([null, 3])); + graph.vertices[0].weight = Some(1.25); + let doc = HifDocument::from_hypergraph(&graph).unwrap(); + let value: Value = serde_json::from_str(&serialize_hif(&doc).unwrap()).unwrap(); + assert_eq!(value["nodes"][0]["node"], "alice"); + assert_eq!(value["nodes"][0]["weight"], 1.25); + assert_eq!(value["nodes"][0]["attrs"]["evidence"], json!([null, 3])); +} + +#[test] +fn numerical_id_spellings_share_identity_but_big_ids_stay_exact() { + let doc = parse_hif(r#"{"nodes":[{"node":1.0},{"node":1e0}],"incidences":[]}"#).unwrap(); + assert!( + doc.to_hypergraph() + .unwrap_err() + .reason + .contains("duplicate") + ); + let raw = r#"{"nodes":[{"node":184467440737095516160,"attrs":{"precise":0.12345678901234567890123456789}}],"incidences":[]}"#; + let doc = parse_hif(raw).unwrap(); + let output = serialize_hif(&doc).unwrap(); + assert!(output.contains("184467440737095516160")); + assert!(output.contains("0.12345678901234567890123456789")); + assert_eq!( + doc.to_hypergraph().unwrap().vertices[0].id, + "i:184467440737095516160" + ); +} + +#[test] +fn explicit_native_format_requires_native_envelope() { + assert!(from_json_str_with_format("{}", InputFormat::Hypergraph).is_err()); +} + +#[test] +fn file_roundtrip_and_reserved_export_keys() { + let dir = tempfile::tempdir().unwrap(); + let path = dir.path().join("hif.json"); + let doc = parse_hif(r#"{"incidences":[],"nodes":[],"metadata":{}}"#).unwrap(); + hyper_viz::save_hif(&path, &doc).unwrap(); + assert_eq!(hyper_viz::load_hif(&path).unwrap(), doc); + let mut graph = hyper_viz::sample_coauthorship(); + graph.vertices[0] + .attrs + .insert("_hyper_viz".into(), json!({"original":true})); + assert!(HifDocument::from_hypergraph(&graph).is_err()); + graph.vertices[0].attrs.clear(); + graph.vertices[0].weight = Some(f32::NAN); + assert!(HifDocument::from_hypergraph(&graph).is_err()); + graph.vertices[0].weight = None; + graph.hyperedges[0].vertices.push("missing".into()); + assert!(HifDocument::from_hypergraph(&graph).is_err()); +} + +#[test] +fn extreme_integer_exponents_do_not_panic_or_split_identity() { + let doc = parse_hif(r#"{"nodes":[{"node":10e9223372036854775807}],"incidences":[]}"#).unwrap(); + assert_eq!( + doc.to_hypergraph().unwrap().vertices[0].id, + "i:1e9223372036854775808" + ); + let doc = + parse_hif(r#"{"nodes":[{"node":0.1e10003},{"node":1e10002}],"incidences":[]}"#).unwrap(); + assert!( + doc.to_hypergraph() + .unwrap_err() + .reason + .contains("duplicate") + ); + assert!( + parse_hif(r#"{"nodes":[{"node":1e-999999999999999999999999}],"incidences":[]}"#).is_err() + ); +} diff --git a/docs/HIF.md b/docs/HIF.md new file mode 100644 index 0000000..bc8753d --- /dev/null +++ b/docs/HIF.md @@ -0,0 +1,86 @@ +# HIF interchange and Python integration + +Hyper can read [HIF](https://github.com/HIF-org/HIF-standard), the Hypergraph Interchange Format used by scientific hypergraph tools. Full-document interchange and viewer conversion are separate operations: a valid directed HIF document can be saved unchanged, but cannot currently be visualized faithfully. + +## Rust + +```rust +use hyper_viz::{load_hif, save_hif, HifDocument}; + +let document = load_hif("dataset.hif.json")?; +save_hif("roundtrip.hif.json", &document)?; +let graph = document.to_hypergraph()?; // checks viewer compatibility +let exported = HifDocument::from_hypergraph(&graph)?; +# Ok::<(), Box>(()) +``` + +`parse_hif` and `serialize_hif` operate on strings. `load_json` and `from_json_str` automatically detect HIF, native `hypergraph.v1`, and supported legacy exports. `load_json_with_format` and `from_json_str_with_format` accept `InputFormat::{Auto,Hif,Hypergraph}`. Mixed or unidentified envelopes are rejected. Native documents without a version remain accepted when native fields identify them. + +```sh +cargo run -- dataset.hif.json --format hif +cargo run -- dataset.hif.json --format hif --watch +``` + +Both initial loading and watched reloads use the selected format. An invalid watched update leaves the previous scene visible and logs its error. + +## Supported semantics + +HIF serialization preserves JSON values, record order, optional field presence, metadata, typed string/integer IDs, node/edge weights, and incidence direction, weights, and attributes. Whitespace and object-key ordering are not retained. The pinned upstream schema is bundled and validated offline; network retrieval features are disabled. Upstream provenance and license live in `crates/hyper-viz/schemas`. + +Viewer conversion supports undirected documents, including an omitted `network-type` when incidences have no direction. It rejects `directed`, `asc`, and any incidence direction, weight, or attributes (including an explicitly empty attributes object). Errors identify the offending JSON Pointer. Duplicate declarations and incidence pairs are rejected at conversion; they can still be preserved by document interchange. + +Nodes/edges referenced only by incidences are inferred. Explicit isolated nodes and empty edges are retained in the graph, although empty edges have no drawable geometry. Integer `1` becomes viewer ID `i:1`; string `"1"` becomes `s:1`. Labels show original IDs. Integral numeric spellings denote the same identity. Scientific attribute keys are not interpreted as viewer coloring or status. + +Node/edge weights are rounded to finite `f32` during viewer conversion; overflow is an error. Their original numbers remain in the HIF document. Keep that document for scientific export—exporting a converted native graph does not reconstruct the original IDs or precision. + +Native-to-HIF export keeps native string IDs, memberships, weights, and attributes. Native display fields are preserved under the reserved `_hyper_viz` attribute on metadata/nodes/edges. A collision with that key, non-finite weights, duplicate IDs/memberships, or missing member references is an error. HIF-to-viewer conversion treats this reserved content as opaque metadata too. + +## Python installation + +The Python extension depends on the Rust core, not Bevy. Requires standard CPython 3.10 or newer. Until public wheels are released, build locally with Rust 1.89 and maturin: + +```sh +python -m venv .venv +. .venv/bin/activate # Windows: .venv\Scripts\activate +python -m pip install maturin==1.9.6 +cd crates/hyper-viz-python +cargo run --bin stub_gen +maturin develop --locked +``` + +For wheel installation, run `maturin build --release --locked` in the same directory and install the resulting platform wheel from `target/wheels`. CI prepares Linux x86_64, macOS arm64/x86_64, and Windows x86_64 wheels; it does not publish them. Wheels use the CPython stable ABI starting at 3.10, not the free-threaded ABI. + +```python +import hyper_viz + +document = hyper_viz.HifDocument.load("dataset.hif.json") +document.save("roundtrip.hif.json") +print(document.to_json()) + +# Install/build the native viewer separately, then: +viewer = hyper_viz.show(document, executable="/path/to/hyper", projection="bipartite") +code = viewer.wait() # or viewer.close() to terminate +``` + +`HifDocument.from_json(raw)` accepts HIF JSON; `from_hypergraph_json(raw)` accepts native JSON. `to_hypergraph_json()` explicitly checks viewer compatibility. File arguments on document methods are strings; the launcher also accepts `pathlib.Path`. + +`HifValidationError` and `HifCompatibilityError` expose `location` and `reason`. I/O failures raise `OSError`. The launcher validates before launching, resolves an explicit executable or `hyper` on PATH, never invokes a shell, and inherits stdout/stderr. It creates an owned temporary snapshot, returns immediately, and cleans up automatically when the viewer exits. `wait()` returns nonzero exit codes without hiding diagnostics. A timeout preserves the running process and snapshot. `close()` terminates, waits five seconds, then kills if necessary. A context manager closes on exit. Dropping the handle keeps the viewer open; a background waiter retains ownership until exit. + +Viewer binaries are separate optional installations; nothing is downloaded on first launch. Live Python updates, notebook embedding, analysis/layout bindings, and direct scientific-library object adapters are outside this release. + +## XGI and Julia + +The runnable [XGI example](../crates/hyper-viz-python/examples/xgi_interop.py) demonstrates scientific export, HIF round-trip, and optional viewer launch. Tests pin XGI 0.10.2. No XGI import is required to use `hyper_viz`. + +The [Julia example](../examples/hif_interop.jl) uses SimpleHypergraphs.jl and its HIF export. Run it in a Julia environment containing SimpleHypergraphs, then preserve its output with the Rust `hif_roundtrip` example or Python package. SimpleHypergraphs exports incidence weights, so viewer conversion rejects that output explicitly. Julia integration is an example; Julia is not a Python runtime dependency. + +## Development checks + +```sh +cargo test -p hyper-viz +cargo run -p hyper-viz-python --bin stub_gen +python -m pytest crates/hyper-viz-python/tests +python -m mypy --strict crates/hyper-viz-python/python/hyper_viz +``` + +The generated `_core.pyi` declares the native API. A CI regeneration diff catches drift; `py.typed` and annotated Python wrappers provide IDE and type-checker support. The wrappers are handwritten; stubs are generated from Rust binding declarations. diff --git a/examples/hif_interop.jl b/examples/hif_interop.jl new file mode 100644 index 0000000..5f390c5 --- /dev/null +++ b/examples/hif_interop.jl @@ -0,0 +1,14 @@ +# Run in a Julia environment with SimpleHypergraphs.jl installed. +# API: https://github.com/pszufe/SimpleHypergraphs.jl/blob/master/src/io_hif.jl +using SimpleHypergraphs + +h = Hypergraph{Int}(3, 2) # vertex 3 is isolated; edge 2 is empty +h[1, 1] = 1 +h[2, 1] = 1 +hg_save("julia.hif.json", h; format=HIF_Format(), pretty=true) +restored = hg_load("julia.hif.json"; format=HIF_Format(), T=Int) +@assert nhv(restored) == 3 +@assert nhe(restored) == 2 +println("Exported julia.hif.json; load with hyper_viz.HifDocument.load from Python.") +# This exporter includes incidence weights, even for weight 1. Hyper preserves +# them in full-document interchange and rejects viewer conversion explicitly. diff --git a/src/main.rs b/src/main.rs index 5ab493f..7f5db82 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,7 @@ use clap::Parser; -use hyper_viz::{Projection, load_json, project, sample_coauthorship}; +use hyper_viz::{InputFormat, Projection, load_json_with_format, project, sample_coauthorship}; use hyper_viz_bevy::{ - VisualizerConfig, run_from_graph, run_visualizer, run_visualizer_from_path_with, + VisualizerConfig, run_from_graph, run_visualizer, run_visualizer_from_path_with_format, }; use tracing_subscriber::EnvFilter; @@ -12,9 +12,13 @@ use tracing_subscriber::EnvFilter; after_help = "Omit FILE to open the built-in coauthorship demo." )] struct Args { - /// Path to hypergraph JSON (`hypergraph.v1`; legacy host exports also accepted). + /// Path to native hypergraph or HIF JSON (legacy host exports also accepted). file: Option, + /// Input format (also applies to watched reloads). + #[arg(long, default_value = "auto", value_parser = ["auto", "hypergraph", "hif"])] + format: String, + /// Reload when the file changes. #[arg(short, long)] watch: bool, @@ -62,6 +66,7 @@ fn main() { .init(); let args = Args::parse(); + let format = InputFormat::parse(&args.format).expect("validated input format"); let projection = Projection::parse(&args.projection).unwrap_or_else(|| { tracing::warn!( projection = %args.projection, @@ -74,7 +79,7 @@ fn main() { let graph = args .file .as_deref() - .map(|p| load_json(p).expect("load hypergraph JSON")) + .map(|p| load_json_with_format(p, format).expect("load hypergraph JSON")) .unwrap_or_else(sample_coauthorship); hyper_viz_bevy::showcase::run_showcase( project(&graph, projection), @@ -96,15 +101,16 @@ fn main() { run_visualizer(scene); } (Some(path), true) => { - run_visualizer_from_path_with( + run_visualizer_from_path_with_format( path.to_string(), true, projection, VisualizerConfig::default(), + format, ); } (Some(path), false) => { - let graph = load_json(path).expect("load hypergraph JSON"); + let graph = load_json_with_format(path, format).expect("load hypergraph JSON"); if projection == Projection::Bipartite { run_from_graph(graph); } else { From f94f38d72efe1cfdfa8164d6a3b25eba30964186 Mon Sep 17 00:00:00 2001 From: Bregy Malpartida Date: Sun, 4 Oct 2026 00:35:31 -0500 Subject: [PATCH 2/9] Add reproducible ecosystem benchmarks and measured comparison --- .gitignore | 1 + Cargo.lock | 1 + crates/hyper-viz-bevy/Cargo.toml | 9 + crates/hyper-viz-bevy/src/benchmark.rs | 295 + .../src/bin/ecosystem_benchmark.rs | 3 + crates/hyper-viz-bevy/src/lib.rs | 2 + crates/hyper-viz/examples/ecosystem_core.rs | 154 + docs/benchmark-protocol.md | 93 + .../benchmarks/ecosystem-2026-10-03/README.md | 145 + .../ecosystem-2026-10-03/checksums.json | 261 + .../ecosystem-2026-10-03/environment.json | 30 + .../evidence/browser-final-results.json.gz | Bin 0 -> 188391 bytes ...rowser-original-refresh-diagnostic.json.gz | Bin 0 -> 208781 bytes .../browser-sigma-final-results.json.gz | Bin 0 -> 67512 bytes .../evidence/commands.json | 70 + .../evidence/core-metadata.json | 272 + .../evidence/core-raw.json | 2228 +++ .../evidence/datasets-manifest.json | 207 + .../evidence/driver-notes.json | 7 + .../evidence/graphia-metadata.json | 11 + .../evidence/graphia-raw.json | 416 + ...ot-clamped-window-diagnostic-metadata.json | 11 + ...pergodot-clamped-window-diagnostic.json.gz | Bin 0 -> 5717 bytes ...godot-fullscreen-unmatched-diagnostic.json | 67 + .../hypergodot-hidpi-untimed-smoke.json | 71 + .../evidence/hypergodot-metadata.json | 11 + .../evidence/hypergodot-raw.json | 1602 ++ .../evidence/native-interactive-metadata.json | 141 + .../evidence/native-interactive-raw.json.gz | Bin 0 -> 50481 bytes .../evidence/native-metadata.json | 500 + .../evidence/native-raw.json.gz | Bin 0 -> 118689 bytes .../evidence/native-star-metadata.json | 140 + .../evidence/native-star-raw.json.gz | Bin 0 -> 46501 bytes .../native-untimed-render-validation.png | Bin 0 -> 510563 bytes .../evidence/native-untimed-smoke.json | 70 + .../evidence/scientific-consolidation.json | 12 + .../scientific-hnx-repeat-metadata.json | 338 + .../scientific-independent-validation.json | 750 + .../evidence/scientific-metadata.json | 1472 ++ .../evidence/scientific-raw.json | 12740 ++++++++++++++++ .../evidence/scientific-requirements.txt | 40 + .../ecosystem-2026-10-03/methodology.md | 56 + .../ecosystem-2026-10-03/summary.csv | 90 + .../ecosystem-2026-10-03/summary.json | 1843 +++ .../ecosystem-2026-10-03/verification.json | 40 + docs/ecosystem-comparison.md | 172 + .../plans/2026-10-02-hif-python.md | 19 + scripts/benchmarks/README.md | 135 + scripts/benchmarks/archive.py | 53 + scripts/benchmarks/browser/.gitignore | 1 + scripts/benchmarks/browser/README.md | 34 + scripts/benchmarks/browser/client.js | 102 + scripts/benchmarks/browser/package-lock.json | 964 ++ scripts/benchmarks/browser/package.json | 19 + scripts/benchmarks/browser/run.mjs | 105 + scripts/benchmarks/consolidate_browser.py | 45 + scripts/benchmarks/datasets.py | 100 + scripts/benchmarks/desktop/README.md | 110 + .../benchmarks/desktop/hypergodot_runner.gd | 6 + .../benchmarks/desktop/hypergodot_scene.gd | 128 + scripts/benchmarks/desktop/prepare_graphia.py | 44 + .../benchmarks/desktop/prepare_hypergodot.py | 49 + scripts/benchmarks/desktop/run.py | 132 + scripts/benchmarks/report.py | 124 + scripts/benchmarks/restore_evidence.py | 38 + scripts/benchmarks/run_local.py | 73 + scripts/benchmarks/scientific.py | 297 + scripts/benchmarks/summarize.py | 103 + scripts/benchmarks/test_datasets.py | 24 + scripts/benchmarks/test_scientific.py | 27 + scripts/benchmarks/test_summarize.py | 35 + scripts/benchmarks/verify_scientific.py | 22 + 72 files changed, 27160 insertions(+) create mode 100644 crates/hyper-viz-bevy/src/benchmark.rs create mode 100644 crates/hyper-viz-bevy/src/bin/ecosystem_benchmark.rs create mode 100644 crates/hyper-viz/examples/ecosystem_core.rs create mode 100644 docs/benchmark-protocol.md create mode 100644 docs/benchmarks/ecosystem-2026-10-03/README.md create mode 100644 docs/benchmarks/ecosystem-2026-10-03/checksums.json create mode 100644 docs/benchmarks/ecosystem-2026-10-03/environment.json create mode 100644 docs/benchmarks/ecosystem-2026-10-03/evidence/browser-final-results.json.gz create mode 100644 docs/benchmarks/ecosystem-2026-10-03/evidence/browser-original-refresh-diagnostic.json.gz create mode 100644 docs/benchmarks/ecosystem-2026-10-03/evidence/browser-sigma-final-results.json.gz create mode 100644 docs/benchmarks/ecosystem-2026-10-03/evidence/commands.json create mode 100644 docs/benchmarks/ecosystem-2026-10-03/evidence/core-metadata.json create mode 100644 docs/benchmarks/ecosystem-2026-10-03/evidence/core-raw.json create mode 100644 docs/benchmarks/ecosystem-2026-10-03/evidence/datasets-manifest.json create mode 100644 docs/benchmarks/ecosystem-2026-10-03/evidence/driver-notes.json create mode 100644 docs/benchmarks/ecosystem-2026-10-03/evidence/graphia-metadata.json create mode 100644 docs/benchmarks/ecosystem-2026-10-03/evidence/graphia-raw.json create mode 100644 docs/benchmarks/ecosystem-2026-10-03/evidence/hypergodot-clamped-window-diagnostic-metadata.json create mode 100644 docs/benchmarks/ecosystem-2026-10-03/evidence/hypergodot-clamped-window-diagnostic.json.gz create mode 100644 docs/benchmarks/ecosystem-2026-10-03/evidence/hypergodot-fullscreen-unmatched-diagnostic.json create mode 100644 docs/benchmarks/ecosystem-2026-10-03/evidence/hypergodot-hidpi-untimed-smoke.json create mode 100644 docs/benchmarks/ecosystem-2026-10-03/evidence/hypergodot-metadata.json create mode 100644 docs/benchmarks/ecosystem-2026-10-03/evidence/hypergodot-raw.json create mode 100644 docs/benchmarks/ecosystem-2026-10-03/evidence/native-interactive-metadata.json create mode 100644 docs/benchmarks/ecosystem-2026-10-03/evidence/native-interactive-raw.json.gz create mode 100644 docs/benchmarks/ecosystem-2026-10-03/evidence/native-metadata.json create mode 100644 docs/benchmarks/ecosystem-2026-10-03/evidence/native-raw.json.gz create mode 100644 docs/benchmarks/ecosystem-2026-10-03/evidence/native-star-metadata.json create mode 100644 docs/benchmarks/ecosystem-2026-10-03/evidence/native-star-raw.json.gz create mode 100644 docs/benchmarks/ecosystem-2026-10-03/evidence/native-untimed-render-validation.png create mode 100644 docs/benchmarks/ecosystem-2026-10-03/evidence/native-untimed-smoke.json create mode 100644 docs/benchmarks/ecosystem-2026-10-03/evidence/scientific-consolidation.json create mode 100644 docs/benchmarks/ecosystem-2026-10-03/evidence/scientific-hnx-repeat-metadata.json create mode 100644 docs/benchmarks/ecosystem-2026-10-03/evidence/scientific-independent-validation.json create mode 100644 docs/benchmarks/ecosystem-2026-10-03/evidence/scientific-metadata.json create mode 100644 docs/benchmarks/ecosystem-2026-10-03/evidence/scientific-raw.json create mode 100644 docs/benchmarks/ecosystem-2026-10-03/evidence/scientific-requirements.txt create mode 100644 docs/benchmarks/ecosystem-2026-10-03/methodology.md create mode 100644 docs/benchmarks/ecosystem-2026-10-03/summary.csv create mode 100644 docs/benchmarks/ecosystem-2026-10-03/summary.json create mode 100644 docs/benchmarks/ecosystem-2026-10-03/verification.json create mode 100644 docs/ecosystem-comparison.md create mode 100644 docs/superpowers/plans/2026-10-02-hif-python.md create mode 100644 scripts/benchmarks/README.md create mode 100644 scripts/benchmarks/archive.py create mode 100644 scripts/benchmarks/browser/.gitignore create mode 100644 scripts/benchmarks/browser/README.md create mode 100644 scripts/benchmarks/browser/client.js create mode 100644 scripts/benchmarks/browser/package-lock.json create mode 100644 scripts/benchmarks/browser/package.json create mode 100644 scripts/benchmarks/browser/run.mjs create mode 100644 scripts/benchmarks/consolidate_browser.py create mode 100644 scripts/benchmarks/datasets.py create mode 100644 scripts/benchmarks/desktop/README.md create mode 100644 scripts/benchmarks/desktop/hypergodot_runner.gd create mode 100644 scripts/benchmarks/desktop/hypergodot_scene.gd create mode 100644 scripts/benchmarks/desktop/prepare_graphia.py create mode 100644 scripts/benchmarks/desktop/prepare_hypergodot.py create mode 100644 scripts/benchmarks/desktop/run.py create mode 100644 scripts/benchmarks/report.py create mode 100644 scripts/benchmarks/restore_evidence.py create mode 100644 scripts/benchmarks/run_local.py create mode 100644 scripts/benchmarks/scientific.py create mode 100644 scripts/benchmarks/summarize.py create mode 100644 scripts/benchmarks/test_datasets.py create mode 100644 scripts/benchmarks/test_scientific.py create mode 100644 scripts/benchmarks/test_summarize.py create mode 100644 scripts/benchmarks/verify_scientific.py diff --git a/.gitignore b/.gitignore index 2aba2c2..7c8e207 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ __pycache__/ .pytest_cache/ .mypy_cache/ *.egg-info/ +scripts/benchmarks/browser/node_modules/ # Editable maturin builds place the extension in the Python source package. /crates/hyper-viz-python/python/hyper_viz/*.so diff --git a/Cargo.lock b/Cargo.lock index 1752d1c..7fa34dc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3252,6 +3252,7 @@ dependencies = [ "bevy_egui", "bevy_panorbit_camera", "hyper-viz", + "serde_json", "tempfile", "tracing", "tracing-subscriber", diff --git a/crates/hyper-viz-bevy/Cargo.toml b/crates/hyper-viz-bevy/Cargo.toml index 970cf25..15c6b98 100644 --- a/crates/hyper-viz-bevy/Cargo.toml +++ b/crates/hyper-viz-bevy/Cargo.toml @@ -22,6 +22,7 @@ all-features = true rustdoc-args = ["--cfg", "docsrs"] [dependencies] +serde_json = { workspace = true, optional = true } hyper-viz = { workspace = true } bevy = { version = "0.18", default-features = true, features = ["wayland"] } bevy_egui = "0.39" @@ -29,6 +30,14 @@ bevy_panorbit_camera = { version = "0.34", features = ["bevy_egui"] } winit = "0.30" tracing = { workspace = true } +[features] +benchmark = ["dep:serde_json"] + +[[bin]] +name = "ecosystem-benchmark" +path = "src/bin/ecosystem_benchmark.rs" +required-features = ["benchmark"] + [target.'cfg(target_arch = "wasm32")'.dependencies] web-sys = { version = "0.3", features = ["Window", "Storage"] } diff --git a/crates/hyper-viz-bevy/src/benchmark.rs b/crates/hyper-viz-bevy/src/benchmark.rs new file mode 100644 index 0000000..f4d62f3 --- /dev/null +++ b/crates/hyper-viz-bevy/src/benchmark.rs @@ -0,0 +1,295 @@ +//! Opt-in finite benchmark of the production renderer, with picking and HUD. +use crate::{ + graph::{GraphLayout, GraphSceneEpoch, LayoutSettings}, + hyperedge_hull::HyperedgeHullSettings, + node_visual::NodeRenderSettings, + session::{SessionStore, SkipAutoFit}, +}; +use bevy::prelude::*; +use bevy_panorbit_camera::PanOrbitCamera; +use hyper_viz::{Hypergraph, HypergraphScene, NodeRole, Projection}; +use serde_json::{Value, json}; +use std::{collections::HashMap, path::PathBuf, time::Instant}; + +#[derive(Resource)] +struct Run { + graph: Hypergraph, + updated: HypergraphScene, + frame: usize, + warmup: usize, + frames: usize, + hulls: bool, + live: bool, + report: PathBuf, + last: Instant, + intervals: Vec, + updates: Vec, + layout_ms: Vec, + parse_ms: f64, + projection_ms: f64, + completed: bool, + capture: Option, + capture_pending: bool, + projection: String, + labels: bool, + expected_iterations: u64, +} + +/// Arguments: native JSON, output JSON, hulls, live, frames, capture, projection, labels. +pub fn run() { + let args: Vec = std::env::args().collect(); + assert!( + args.len() >= 5, + "usage: ecosystem-benchmark INPUT OUTPUT HULLS LIVE [FRAMES] [CAPTURE|-] [PROJECTION] [LABELS]" + ); + let raw = std::fs::read_to_string(&args[1]).expect("read dataset"); + let start = Instant::now(); + let graph = hyper_viz::from_json_str(&raw).expect("load canonical native dataset"); + let parse_ms = start.elapsed().as_secs_f64() * 1000.; + let start = Instant::now(); + let projection_name = args.get(7).map(String::as_str).unwrap_or("bipartite"); + let projection = Projection::parse(projection_name).expect("supported projection"); + let scene = graph.project(projection); + let projection_ms = start.elapsed().as_secs_f64() * 1000.; + let updated_path = args[1].strip_suffix(".json").unwrap().to_string() + ".updated.json"; + let updated = hyper_viz::load_json(updated_path) + .expect("shared update fixture") + .project(projection); + let mut app = crate::visualizer_app_with( + crate::HyperVisualizerPlugin::from_scene(scene).with_projection(projection), + crate::VisualizerConfig::new("Hyper ecosystem benchmark").with_size(1920, 1080), + false, + ); + app.world_mut().resource_mut::().enabled = false; + app.world_mut().resource_mut::().0 = true; + for mut window in app + .world_mut() + .query::<&mut Window>() + .iter_mut(app.world_mut()) + { + window.resolution = + bevy::window::WindowResolution::new(1920, 1080).with_scale_factor_override(1.0); + window.present_mode = bevy::window::PresentMode::AutoVsync; + } + app.insert_resource(bevy::winit::WinitSettings::continuous()) + .insert_resource(crate::LinkRenderSettings { + max_lines: 0, + opacity: 0.10, + }) + .insert_resource(Run { + graph, + updated, + frame: 0, + warmup: 120, + frames: args.get(5).map(|v| v.parse().unwrap()).unwrap_or(300), + hulls: args[3] == "1", + live: args[4] == "1", + report: (&args[2]).into(), + last: Instant::now(), + intervals: vec![], + updates: vec![], + layout_ms: vec![], + parse_ms, + projection_ms, + completed: false, + capture: args.get(6).filter(|p| p.as_str() != "-").map(PathBuf::from), + capture_pending: false, + projection: projection_name.into(), + labels: args.get(8).is_some_and(|v| v == "1"), + expected_iterations: 0, + }) + .add_systems(PostStartup, prepare) + .add_systems(PreUpdate, tick) + .add_systems( + Update, + disable_builtin_steps.before(crate::graph::step_layout), + ) + .add_systems(Last, finish) + .run(); +} + +fn prepare( + mut state: ResMut, + mut layout: ResMut, + mut settings: ResMut, + mut hulls: ResMut, + mut nodes: ResMut, + mut cameras: Query<&mut PanOrbitCamera>, +) { + let positions: HashMap<_, _> = state + .graph + .vertices + .iter() + .map(|v| { + let p = v.attrs["position"].as_array().unwrap(); + ( + v.id.as_str(), + hyper_viz::Vec3::new( + p[0].as_f64().unwrap() as f32, + p[1].as_f64().unwrap() as f32, + p[2].as_f64().unwrap() as f32, + ), + ) + }) + .collect(); + let edges: HashMap<_, _> = state + .graph + .hyperedges + .iter() + .map(|e| (e.id.as_str(), e)) + .collect(); + for node in layout.scene.nodes.clone() { + let p = if node.role == NodeRole::Vertex { + positions[node.id.as_str()] + } else { + let e = edges[node.hyperedge_id.as_deref().unwrap()]; + let mut p = hyper_viz::Vec3::ZERO; + for v in &e.vertices { + p += positions[v.as_str()]; + } + if !e.vertices.is_empty() { + p = p / e.vertices.len() as f32; + } + p + }; + layout.layout.positions[node.index] = p; + } + // Keep production live hull skinning/topology refresh enabled, while the + // timed step replaces the built-in solver calls. + layout.running = state.live; + layout.iterations_per_frame = 0; + settings.iterations_per_frame = 0; + settings.node_size = 2.; + hulls.enabled = state.hulls; + hulls.wireframe = false; + hulls.hide_hubs = state.projection == "star"; + nodes.labels_enabled = state.labels; + nodes.hyperedge_labels = state.labels; + for mut camera in &mut cameras { + camera.enabled = false; + } + state.last = Instant::now(); +} + +fn disable_builtin_steps( + state: Res, + mut layout: ResMut, + mut settings: ResMut, +) { + // The HUD slider clamps its displayed zero to one. Reset before the stock + // stepping system, without disabling the HUD or live geometry systems. + layout.iterations_per_frame = 0; + layout.running = state.live; + settings.iterations_per_frame = 0; +} + +fn tick( + mut state: ResMut, + mut layout: ResMut, + settings: Res, + mut epoch: ResMut, + mut cameras: Query<&mut Transform, With>, +) { + if state.completed { + return; + } + assert_eq!( + layout.layout.iterations, state.expected_iterations, + "unexpected untimed solver step" + ); + let now = Instant::now(); + let elapsed = now.duration_since(state.last).as_secs_f64() * 1000.; + state.last = now; + if state.frame > state.warmup { + state.intervals.push(elapsed); + } + if state.live { + let start = Instant::now(); + layout.layout.step(); + state.expected_iterations += 1; + if state.frame >= state.warmup { + state.layout_ms.push(start.elapsed().as_secs_f64() * 1000.); + } + } + // Scripted orbit keeps every frame dirty. This is not hardware input latency. + let angle = state.frame as f32 * 0.003; + for mut camera in &mut cameras { + *camera = Transform::from_xyz(angle.sin() * 1500., 350., angle.cos() * 1500.) + .looking_at(Vec3::ZERO, Vec3::Y); + } + if state.frame == state.warmup + state.frames { + let start = Instant::now(); + *layout = GraphLayout::from_scene_preserve(&layout, state.updated.clone(), &settings); + state.expected_iterations = 0; + // Match the shared updated hub centroids; stable vertex positions survive. + let hubs: Vec<_> = layout + .scene + .hyperedges + .iter() + .filter(|e| layout.scene.nodes[e.hub_index].role == NodeRole::HyperedgeHub) + .map(|e| { + let mut p = hyper_viz::Vec3::ZERO; + for &i in &e.member_indices { + p += layout.layout.positions[i]; + } + if !e.member_indices.is_empty() { + p = p / e.member_indices.len() as f32; + } + (e.hub_index, p) + }) + .collect(); + for (index, position) in hubs { + layout.layout.positions[index] = position; + } + epoch.0 += 1; + state.updates.push(start.elapsed().as_secs_f64() * 1000.); + } + state.frame += 1; +} + +fn finish( + mut commands: Commands, + mut state: ResMut, + layout: Res, + mut exit: MessageWriter, +) { + if state.completed || state.frame <= state.warmup + state.frames + 3 { + return; + } + if state.capture_pending { + return; + } + if let Some(path) = state.capture.take() { + state.capture_pending = true; + commands + .spawn(bevy::render::view::screenshot::Screenshot::primary_window()) + .observe( + move |event: On, + mut run: ResMut| { + event + .image + .clone() + .try_into_dynamic() + .unwrap() + .to_rgb8() + .save(&path) + .unwrap(); + run.capture_pending = false; + }, + ); + return; + } + state.completed = true; + assert_eq!( + layout.layout.iterations, state.expected_iterations, + "unexpected untimed solver step" + ); + let intervals: Vec<_> = state.intervals.iter().copied().take(state.frames).collect(); + let result: Value = json!({"tool":"hyper", "dataset":state.graph.meta.id, "profile":"release", "projection":state.projection, "window":[1920,1080], "dpr":1, "present_mode":"AutoVsync", "hulls":state.hulls,"live_layout":state.live,"hud":true,"picking":true,"labels":state.labels,"label_policy":"default Capped; count threshold250; hovered/selected exemptions","line_opacity":0.10,"node_size":2,"hull_opacity":0.28,"hull_wireframe":false,"hull_vertex_cap":hyper_viz::MAX_HULL_VERTICES,"hull_topology_interval":8,"live_solver_steps_per_frame":if state.live {1} else {0},"line_budget":0,"warmup_frames":state.warmup,"frames":state.frames,"frame_interval_ms":intervals,"layout_step_ms":state.layout_ms,"update_commit_ms":state.updates,"update_next_frame_ms":state.intervals.get(state.frames),"native_parse_ms":state.parse_ms,"projection_ms":state.projection_ms,"nodes":layout.node_count,"scene_links":layout.link_count,"rendered_lines":if state.projection == "star" { state.graph.hyperedges.iter().filter(|e| e.vertices.len()==2).count() } else { layout.link_count },"measurement":"CPU wall intervals; no GPU timer, hardware input or presentation timestamp"}); + if let Some(parent) = state.report.parent() { + std::fs::create_dir_all(parent).unwrap(); + } + std::fs::write(&state.report, serde_json::to_vec_pretty(&result).unwrap()) + .expect("write measurements"); + exit.write(AppExit::Success); +} diff --git a/crates/hyper-viz-bevy/src/bin/ecosystem_benchmark.rs b/crates/hyper-viz-bevy/src/bin/ecosystem_benchmark.rs new file mode 100644 index 0000000..7c810de --- /dev/null +++ b/crates/hyper-viz-bevy/src/bin/ecosystem_benchmark.rs @@ -0,0 +1,3 @@ +fn main() { + hyper_viz_bevy::benchmark::run(); +} diff --git a/crates/hyper-viz-bevy/src/lib.rs b/crates/hyper-viz-bevy/src/lib.rs index e6d1c61..bf48237 100644 --- a/crates/hyper-viz-bevy/src/lib.rs +++ b/crates/hyper-viz-bevy/src/lib.rs @@ -46,6 +46,8 @@ mod render; mod search; mod session; pub use search::{SearchPage, SearchProvider, SearchRow}; +#[cfg(feature = "benchmark")] +pub mod benchmark; pub mod showcase; mod ui; diff --git a/crates/hyper-viz/examples/ecosystem_core.rs b/crates/hyper-viz/examples/ecosystem_core.rs new file mode 100644 index 0000000..6b93cd0 --- /dev/null +++ b/crates/hyper-viz/examples/ecosystem_core.rs @@ -0,0 +1,154 @@ +//! Isolated conversion, projection, layout, and hull CPU timings. +use hyper_viz::{ForceLayout3D, LayoutConfig, NodeRole, Projection}; +use serde_json::json; +use std::{ + collections::{BTreeSet, HashMap}, + hint::black_box, + time::Instant, +}; +fn main() { + let args: Vec = std::env::args().collect(); + let raw = std::fs::read_to_string(&args[1]).unwrap(); + let hif_raw = + std::fs::read_to_string(args[1].trim_end_matches(".json").to_string() + ".hif.json") + .unwrap(); + let start = Instant::now(); + let graph = hyper_viz::from_json_str(&raw).unwrap(); + let native_ms = start.elapsed().as_secs_f64() * 1000.; + let start = Instant::now(); + let document = hyper_viz::parse_hif(&hif_raw).unwrap(); + let hif_ms = start.elapsed().as_secs_f64() * 1000.; + let start = Instant::now(); + let converted = document.to_hypergraph().unwrap(); + let convert_ms = start.elapsed().as_secs_f64() * 1000.; + assert_eq!(converted.vertices.len(), graph.vertices.len()); + assert_eq!(converted.hyperedges.len(), graph.hyperedges.len()); + // These fixtures intentionally use string IDs. Verify every record, not just counts. + for (node, native) in document.nodes().unwrap().iter().zip(&converted.vertices) { + let hyper_viz::HifId::String(id) = &node.node else { + panic!("fixture ID must be a string") + }; + assert_eq!(native.id, format!("s:{id}")); + assert_eq!(native.attrs, node.attrs.clone().unwrap_or_default()); + } + for (edge, native) in graph.hyperedges.iter().zip(&converted.hyperedges) { + assert_eq!(native.id, format!("s:{}", edge.id)); + assert_eq!( + native.vertices, + edge.vertices + .iter() + .map(|id| format!("s:{id}")) + .collect::>() + ); + } + for (edge, native) in document.edges().unwrap().iter().zip(&converted.hyperedges) { + assert_eq!(native.attrs, edge.attrs.clone().unwrap_or_default()); + } + assert_eq!( + converted.meta.attrs, + serde_json::from_value::>( + serde_json::to_value(&document).unwrap()["metadata"].clone() + ) + .unwrap() + ); + let roundtrip = hyper_viz::parse_hif(&hyper_viz::serialize_hif(&document).unwrap()).unwrap(); + assert_eq!(document, roundtrip); + let start = Instant::now(); + let scene = graph.project(Projection::Bipartite); + let projection_ms = start.elapsed().as_secs_f64() * 1000.; + assert!(scene.warnings.is_empty(), "invalid canonical projection"); + assert_eq!( + scene.links.len(), + graph + .hyperedges + .iter() + .map(|e| e.vertices.len()) + .sum::() + ); + let expected: BTreeSet<_> = graph + .hyperedges + .iter() + .flat_map(|e| e.vertices.iter().map(|v| (e.id.clone(), v.clone()))) + .collect(); + let actual: BTreeSet<_> = scene + .links + .iter() + .map(|link| { + assert_eq!(scene.nodes[link.source].role, NodeRole::HyperedgeHub); + assert_eq!(scene.nodes[link.target].role, NodeRole::Vertex); + ( + link.hyperedge_id.clone().unwrap(), + scene.nodes[link.target].id.clone(), + ) + }) + .collect(); + assert_eq!( + actual, expected, + "every incidence must connect its original group/member" + ); + let positions: HashMap<_, _> = graph + .vertices + .iter() + .map(|v| { + let p = v.attrs["position"].as_array().unwrap(); + ( + v.id.as_str(), + hyper_viz::Vec3::new( + p[0].as_f64().unwrap() as f32, + p[1].as_f64().unwrap() as f32, + p[2].as_f64().unwrap() as f32, + ), + ) + }) + .collect(); + let mut layout = ForceLayout3D::from_scene(&scene, LayoutConfig::default()); + let edges: HashMap<_, _> = graph + .hyperedges + .iter() + .map(|e| (e.id.as_str(), e)) + .collect(); + for node in &scene.nodes { + layout.positions[node.index] = if node.role == NodeRole::Vertex { + positions[node.id.as_str()] + } else { + let e = edges[node.hyperedge_id.as_deref().unwrap()]; + let mut p = hyper_viz::Vec3::ZERO; + for v in &e.vertices { + p += positions[v.as_str()]; + } + if e.vertices.is_empty() { + p + } else { + p / e.vertices.len() as f32 + } + }; + } + // Warm the same solver, then record consecutive steps; not layout convergence. + for _ in 0..5 { + layout.step(); + } + let mut steps = Vec::new(); + for _ in 0..20 { + let start = Instant::now(); + layout.step(); + steps.push(start.elapsed().as_secs_f64() * 1000.); + } + let start = Instant::now(); + let mut hulls = 0; + for e in &graph.hyperedges { + let points: Vec<_> = e + .vertices + .iter() + .map(|v| { + let p = positions[v.as_str()]; + [p.x, p.y, p.z] + }) + .collect(); + if black_box(hyper_viz::hull_from_points(&points)).is_some() { + hulls += 1; + } + } + let hull_ms = start.elapsed().as_secs_f64() * 1000.; + let result = json!({"tool":"hyper-core","dataset":graph.meta.id,"native_parse_ms":native_ms,"hif_parse_validate_ms":hif_ms,"hif_viewer_conversion_ms":convert_ms,"bipartite_projection_ms":projection_ms,"layout_step_ms":steps,"all_hulls_cpu_ms":hull_ms,"hulls":hulls,"hull_vertex_cap":hyper_viz::MAX_HULL_VERTICES,"correctness":"passed document roundtrip, every converted string ID and member, node metadata and exact projected incidences","vertices":graph.vertices.len(),"hyperedges":graph.hyperedges.len(),"links":scene.links.len(),"layout_settings":"LayoutConfig::default,5warmup20steps,seeded common XYZ"}); + std::fs::write(&args[2], serde_json::to_vec_pretty(&result).unwrap()).unwrap(); +} diff --git a/docs/benchmark-protocol.md b/docs/benchmark-protocol.md new file mode 100644 index 0000000..5c97df3 --- /dev/null +++ b/docs/benchmark-protocol.md @@ -0,0 +1,93 @@ +# Hyper comparative benchmark protocol + +Proposed experiment, October 2, 2026. The executed October 3 subset, its measurements and remaining coverage gaps are recorded in the [measured comparison](benchmarks/ecosystem-2026-10-03/README.md). This document defines future measurements; it does not report an executed comparison. Existing evidence and the ecosystem table are in [Hyper ecosystem comparison and roadmap](ecosystem-comparison.md). + +The objective is to determine which users and workloads Hyper serves well enough to justify adoption, and which roadmap changes improve that outcome. Compare responsiveness, exact membership interpretation, and integration effort alongside raw rendering throughput. + +## Baselines and comparison tracks + +| Track | Baselines | Controlled question | +|---|---|---| +| Native/group exploration | Hyper, HyperGodot, HGPolyVis, HNX Widget | Can users identify memberships and overlapping groups accurately, and inspect their data? | +| Spatial node-link rendering | Hyper with explicit incidence view, 3d-force-graph, Graphia | How responsive is navigation with the same projected nodes and links? | +| Scientific figure generation | HNX, XGI; optionally HGX/Julia workflows | How quickly can the same small/medium hypergraph become an interpretable export? | +| 2D web exploration | Cytoscape.js and Sigma.js with incidence adapters | What does the simpler browser alternative provide at the same membership workload? | + +Comparisons across 2D and 3D should evaluate task accuracy, time, and usability. They should not imply identical GPU rendering work. Similarly, static Matplotlib figure generation is not the same metric as continuously rendering a native window. + +Use Windows for a baseline involving the current HGPolyVis binary, or mark it unavailable on the tested OS. Keep that separate from a performance failure. Record native vs browser runtime and exact versions. + +## Datasets + +Keep a canonical membership list, stable IDs, metadata, dataset license, and SHA-256 for every input. Verify each adapter against those records before timing. HIF files and Hyper JSON are different schemas; renaming keys or accepting an empty deserialization is not valid conversion. + +| Workload | Proposed size or source | What it tests | +|---|---|---| +| Correctness fixture | 30 vertices / 15 groups, arity 1–8; overlapping, duplicate-member, isolated and empty cases where allowed | Membership, ID stability, unsupported-input behavior, and dual/incidence interpretation | +| Moderate synthetic | 1k vertices / 2k groups; fixed seed; several arity and overlap distributions | Everyday exploration and layout cost | +| Larger synthetic | 10k vertices / 10k groups; control total memberships separately | Rendering/layout growth without changing graph semantics implicitly | +| High arity | Hold vertex count fixed; sweep maximum arity through 10, 100, 1k and near-total membership | Hull accuracy and projection expansion | +| Real scientific data | Pin suitable [XGI-DATA](https://github.com/xgi-org/xgi-data) or [HGX datasets](https://hgx-team.github.io/hypergraphx-data/) with metadata and license | Evidence beyond generated graphs; preserve documented dataset semantics | +| Mathlib atlas | Existing pinned export: 9,384 vertices; 44,906 total hyperedges; 118,066 memberships | Reproduce the current real-world stress case and investigate large-group hull overhead | +| Incremental updates | Add/remove/change 1% of records with stable IDs and fixed timing | Scene replacement latency, position stability, selection and focus preservation | + +For size comparisons, report `(vertices, hyperedges, memberships, maximum arity)` and actual scene nodes, rendered segments, hulls, and triangles. Do not use node count alone. Keep scientific simplices and hyperedges distinct when loading datasets. + +The Mathlib atlas includes both import pairs and source-plus-import groups. Preserve both across adapters, and report their counts separately. A comparison using only the pairwise import graph is a different workload. In a bipartite projection the existing atlas has 54,290 scene nodes and 118,066 incidence links; the star-centroid tour has 9,384 scene nodes. + +Do not run unrestricted clique expansion on the full atlas: its 8,532-member umbrella group alone yields 36,393,246 pairs before accounting for other groups. Test clique projection on bounded fixtures and label that limit. This pair count is `k*(k-1)/2`, not an observed renderer capacity. + +## Measurement modes + +Separate these modes rather than combining them into one FPS score: + +1. Parse and validate input, then project it; record time and peak memory. +2. Compute layout with a fixed seed, positions and parameter record; report iteration time and time to an explicit convergence criterion. +3. Render frozen common coordinates with basic nodes/segments and identical camera framing, resolution and pixel ratio where possible. +4. Add equivalent group geometry where each tool supports it; record sampling/approximation settings. +5. Run live layout with a stated number of steps per frame. +6. Enable picking, labels, UI panels and metadata inspection; exercise orbit/pan, zoom, click and search. +7. Apply incremental updates and record visual continuity and latency. + +For representation-specific layouts, also run a separate “best documented settings” comparison. A common-coordinate render test isolates rendering but does not evaluate layout quality. Fix camera views when comparing hulls on/off; the historical tour changes the view between phases. + +Run at least five repetitions after a documented warmup. Randomize tool/mode order, record power/thermal conditions, background load and vsync, and report every run as well as the aggregate. Pin commits, builds, OS, CPU, GPU, RAM, graphics backend, browser, device pixel ratio, window size, labels, line budgets, opacity and hull settings. Keep screenshot readback and video capture outside live timing. + +Wall-clock frame intervals, GPU timestamps, layout-step duration, and input-to-feedback latency measure different stages. Name each precisely. Report both percentile frame intervals and average throughput; `1000 / median frame ms` is not average FPS. Include startup stalls, memory, failed loads and omitted objects rather than hiding them in a success score. + +## Task evaluation + +Use identical target records and ground truth across tools. Counterbalance tool order and provide comparable practice. Proposed pilot: 5–8 participants; use findings to refine the study rather than treating that sample as population-level proof. + +| Task | Ground truth and measure | Roadmap decision | +|---|---|---| +| Find a named or attribute-matched vertex | Correct record; elapsed time; query/result latency | Search and metadata support | +| Explain one hyperedge | Exact member set; completeness and false-member count | Hull interpretation and inspector accuracy | +| Identify overlap between groups | Exact intersection; accuracy and elapsed time | Focus, linked tables, complementary 2D view | +| Explain provenance or quantitative attributes | Correct attribute values and source records | Preservation of opaque metadata and attribute styling | +| Track a selected record through updates | Correct identity; selection retention; displacement of unchanged vertices | Stable-ID reload behavior and saved positions | +| Export a selected neighborhood | Correct records, IDs, metadata and memberships after reload | Interoperability and sharing | + +Approximate surfaces can exclude genuine members or geometrically enclose nonmembers. Evaluate the membership list and selection highlight as authoritative; record visual ambiguity separately. A plausible-looking screenshot is not correctness evidence. + +## Results table to populate + +The following is a template, not measured data. `Pending` must remain until a compatible run exists; use `Unsupported` or `Unavailable on tested OS` for those conditions. + +| Tool and pinned version | Dataset and representation | Load time | Frozen p50 / p95 | Live p50 / p95 | Input latency p95 | Peak memory | Membership task accuracy | Evidence | +|---|---|---|---|---|---|---|---|---| +| Hyper current HEAD | Mathlib star-centroid, interactive controls enabled | Pending | Pending | Pending | Pending | Pending | Pending | Fresh runs required; historical tour differs | +| Hyper | Canonical moderate fixture, incidence | Pending | Pending | Pending | Pending | Pending | Pending | Pin commit and settings | +| 3d-force-graph | Same projected fixture, same coordinates | Pending | Pending | Pending | Pending | Pending | Pending | Pin browser and rendering settings | +| Graphia | Same projected fixture | Pending | Pending | Pending | Pending | Pending | Pending | Record data adapter and runtime | +| HNX Widget | Canonical moderate hypergraph | Pending | Pending | Pending | Pending | Pending | Pending | Verify documented notebook environment | +| HyperGodot | Canonical moderate hypergraph | Pending | Pending | Pending | Pending | Pending | Pending | Representation differs; evaluate tasks | +| HGPolyVis | Canonical moderate hypergraph | Pending | Pending | Pending | Pending | Pending | Pending | Requires compatible OS; evaluate tasks | + +For HNX/XGI plotting, add a separate figure-generation table with parse/layout/draw/export time, peak memory, and task accuracy. Fill PAOHVis temporal rows only after choosing a genuine temporal dataset and shared comparison task. + +## Initial acceptance criteria + +Proposed targets for a representative moderate workload: p95 interactive frame interval at or below 33.3 ms and p95 input-to-visible-feedback below 100 ms, with correct member inspection and preserved metadata. These are project goals, not guarantees, industry standards, or current results. Agree on hardware and scene settings before using them as release gates. + +For the Mathlib stress case, publish its envelope rather than forcing every visual mode into the same target. If hulls must be sampled, selectively updated or hidden, display that limitation and benchmark the resulting mode explicitly. Optimize the measured bottleneck and then repeat the same controlled workload. diff --git a/docs/benchmarks/ecosystem-2026-10-03/README.md b/docs/benchmarks/ecosystem-2026-10-03/README.md new file mode 100644 index 0000000..4a1d56f --- /dev/null +++ b/docs/benchmarks/ecosystem-2026-10-03/README.md @@ -0,0 +1,145 @@ +# Measured ecosystem comparison — October 3, 2026 + +Exploratory results on an Apple M5 Pro / 24 GiB Mac: 445 measured attempts across 89 configurations. Five attempts per case unless noted. The same graph records and seeded coordinates are used through explicit adapters. Scientific figures, 2D browser views and 3D native rendering have different work and are separate tracks. + +Read the [method and limitations](methodology.md), [environment](environment.json), [complete CSV](summary.csv), [structured summary](summary.json) and [raw evidence](evidence/). The [harness guide](../../../scripts/benchmarks/README.md) provides pinned dependencies and rerun commands. + +## Findings to use for roadmap decisions + +Model fidelity is the clearest differentiator in this run: exact group identity, isolated nodes and empty groups need explicit checks at adapter boundaries. Rendering results are conditional on completion. Hyper had intermittent whole-job stalls, including one on a small fixture; their cause remains unresolved. The source audit found a quadratic hub-status lookup worth profiling, but it has not isolated the cause of those stalls. + +Sigma camera measurements use its public cached redraw path. Earlier full-refresh camera measurements were discarded and replaced; the diagnostic evidence is retained separately. Comparisons below keep representations and timing boundaries explicit. + +## Scientific figure workflows + +Times exclude the separately measured top-level tool import, file I/O and JSON parsing. Setup creates the artists and includes any lazy drawing-module initialization; raster draws the Agg canvas. PNG compression is a separate stage. A 120-second timeout covers the whole worker. HGX uses its stock 12-round smoothing, HNX rubber-band outlines, XGI convex hulls. + +| Dataset | Tool | Completed / attempts | Exact model records | Construct ms | Artist setup ms | Raster ms | PNG ms | Worker peak MiB | +|---|---|---|---|---|---|---|---|---| +| moderate | hypergraphx | 0/5 | no / unavailable | — | — | — | — | — | +| moderate | hypernetx | 5/5 | yes | 159.92 | 2,717.87 | 1,089.55 | 28.12 | 242.42 | +| moderate | xgi | 5/5 | yes | 4.71 | 214.57 | 452.82 | 37.70 | 144.00 | +| scientific | hypergraphx | 5/5 | no / unavailable | 1.09 | 13,764.90 | 396.79 | 40.78 | 181.56 | +| scientific | hypernetx | 5/5 | yes | 27.49 | 500.68 | 154.87 | 35.97 | 228.19 | +| scientific | xgi | 5/5 | yes | 1.37 | 23.96 | 28.11 | 33.24 | 132.25 | + +XGI preserves all model records in every tested input. HNX omits isolated vertices and empty groups. HGX identifies groups by member tuple and merges parallel groups: Diseasome becomes 481 groups instead of 903, and the arity-1,000 fixture becomes one group instead of 200. Its lossy timings cannot rank equivalent work. Original records stored in opaque metadata do not repair those native identities. + +## Browser incidence rendering + +All incidences are rendered, forces and labels are off, and the camera moves. Values describe rAF callback cadence; they are not GPU durations or verified presented frames. Average callbacks/s uses total elapsed intervals. The p95 range spans per-run p95 values. “Completed” requires sampling and the shared update to finish within the 90-second job budget. + +| Dataset | Tool | Completed / attempts | p50 ms | p95 ms | p95 run range ms | Avg callbacks/s | Update command ms | Failed stage | +|---|---|---|---|---|---|---|---|---| +| high-arity-10 | 3d-force-graph | 5/5 | 8.30 | 8.50 | 8.40–8.70 | 120.00 | 0.80 | — | +| high-arity-10 | cytoscape | 5/5 | 8.30 | 9.10 | 9.00–16.70 | 120.00 | 45.70 | — | +| high-arity-10 | sigma | 5/5 | 16.70 | 17.50 | 17.50–17.50 | 60.00 | 4.10 | — | +| high-arity-100 | 3d-force-graph | 5/5 | 41.70 | 50.00 | 41.80–50.40 | 24.71 | 5.80 | — | +| high-arity-100 | cytoscape | 5/5 | 8.30 | 9.20 | 9.10–9.20 | 120.00 | 2,450.00 | — | +| high-arity-100 | sigma | 5/5 | 16.70 | 17.50 | 17.40–17.50 | 60.00 | 13.90 | — | +| high-arity-1000 | 3d-force-graph | 0/5 | — | — | —–— | — | — | incremental update, timed sampling | +| high-arity-1000 | cytoscape | 0/5 | — | — | —–— | — | — | timed sampling | +| high-arity-1000 | sigma | 5/5 | 16.70 | 50.00 | 50.00–50.10 | 43.16 | 167.80 | — | +| large | 3d-force-graph | 2/5 | 191.65 | 203.62 | 201.33–205.91 | 5.22 | 48.35 | incremental update | +| large | cytoscape | 4/5 | 8.30 | 9.30 | 9.21–9.30 | 120.02 | 51,638.90 | incremental update | +| large | sigma | 5/5 | 16.70 | 17.50 | 17.40–17.50 | 60.00 | 1,079.80 | — | +| mathlib | 3d-force-graph | 5/5 | 133.30 | 150.00 | 134.00–191.32 | 7.37 | 73.30 | — | +| mathlib | cytoscape | 0/5 | — | — | —–— | — | — | incremental update, timed sampling | +| mathlib | sigma | 5/5 | 16.70 | 17.50 | 17.40–17.60 | 60.00 | 13,242.90 | — | +| moderate | 3d-force-graph | 5/5 | 25.10 | 33.40 | 33.40–34.11 | 35.40 | 4.20 | — | +| moderate | cytoscape | 5/5 | 8.30 | 9.21 | 9.20–10.00 | 120.00 | 1,342.60 | — | +| moderate | sigma | 5/5 | 16.70 | 17.50 | 17.40–17.60 | 60.00 | 42.20 | — | +| scientific | 3d-force-graph | 5/5 | 8.30 | 8.40 | 8.40–8.70 | 120.00 | 0.80 | — | +| scientific | cytoscape | 5/5 | 8.30 | 9.20 | 9.10–10.00 | 120.00 | 37.50 | — | +| scientific | sigma | 5/5 | 16.70 | 17.50 | 17.40–17.50 | 60.00 | 7.50 | — | + +Sigma uses WebGL 2D, Cytoscape uses Canvas2D, and 3d-force-graph uses perspective spheres and WebGL. The corrected Sigma block and original Cytoscape block recorded different small-case callback cadences (roughly 60 versus 120 callbacks/s); display refresh was not locked, so their rate ratio cannot rank rendering efficiency. No link sampling is applied. Update command timings include different adapter commit strategies and sometimes unchanged-record work; see the method. A failed batch has no completed rendering score; its timeout is not a single-frame measurement. + +## Hyper native renderer + +Physical 1920 × 1080, AutoVsync, 120 warmup and 300 recorded application frames. HUD and picking remain installed. Basic modes disable labels; `native-interactive` enables the default Capped policy (count threshold 250, with selected/hovered exemptions). Frozen modes use fixed coordinates; live modes perform one layout step per frame. All lines are enabled. Hulls cap input at 24 vertices and therefore approximate large groups. + +| Track / dataset | Mode | Completed / attempts | p50 app interval ms | p95 app interval ms | p95 run range ms | Avg app frames/s | Update commit ms | Next app interval ms | Peak MiB | +|---|---|---|---|---|---|---|---|---|---| +| native / high-arity-10 | frozen | 4/5 | 8.34 | 8.99 | 8.61–17.45 | 119.83 | 0.24 | 8.40 | 235.17 | +| native / high-arity-10 | frozen+hulls | 5/5 | 8.67 | 17.07 | 16.94–26.34 | 64.62 | 0.28 | 16.41 | 260.62 | +| native / high-arity-100 | frozen | 5/5 | 8.32 | 9.53 | 8.70–17.02 | 117.86 | 0.87 | 8.28 | 255.80 | +| native / high-arity-100 | frozen+hulls | 5/5 | 16.72 | 33.51 | 25.30–33.73 | 49.45 | 0.58 | 42.72 | 271.91 | +| native / high-arity-1000 | frozen | 5/5 | 12.68 | 17.11 | 11.72–20.55 | 72.00 | 6.16 | 18.40 | 411.09 | +| native / high-arity-1000 | frozen+hulls | 5/5 | 33.35 | 41.78 | 34.80–53.86 | 29.78 | 8.97 | 56.79 | 427.14 | +| native / large | frozen | 4/5 | 61.37 | 68.10 | 66.62–82.65 | 16.35 | 5.77 | 62.77 | 700.15 | +| native / large | frozen+hulls | 4/5 | 270.73 | 375.32 | 347.01–455.02 | 3.52 | 6.91 | 302.92 | 1,006.70 | +| native / mathlib | frozen | 0/5 | — | — | —–— | — | — | — | — | +| native / mathlib | frozen+hulls | 0/5 | — | — | —–— | — | — | — | — | +| native / moderate | frozen | 5/5 | 8.31 | 9.68 | 8.73–17.10 | 117.15 | 0.92 | 8.48 | 281.80 | +| native / moderate | frozen+hulls | 5/5 | 49.98 | 62.08 | 51.96–74.23 | 19.57 | 0.79 | 58.94 | 358.38 | +| native / moderate | live | 5/5 | 16.66 | 17.01 | 9.09–17.23 | 60.00 | 0.91 | 16.76 | 287.14 | +| native / moderate | live+hulls | 3/5 | 21.91 | 37.07 | 34.94–43.49 | 41.35 | 0.87 | 25.38 | 384.80 | +| native / scientific | frozen | 5/5 | 8.41 | 9.08 | 8.66–17.76 | 119.37 | 0.36 | 8.50 | 237.25 | +| native / scientific | frozen+hulls | 5/5 | 8.33 | 9.16 | 8.70–17.22 | 119.60 | 0.39 | 8.54 | 257.50 | +| native-interactive / mathlib | frozen+hulls | 5/5 | 162.18 | 219.91 | 191.63–257.63 | 5.93 | 10.35 | 195.36 | 880.30 | +| native-interactive / mathlib | live+hulls | 5/5 | 97.19 | 171.71 | 166.70–176.77 | 9.08 | 9.24 | 97.10 | 935.11 | +| native-interactive / moderate | frozen+hulls | 5/5 | 50.04 | 64.93 | 53.90–95.84 | 19.05 | 0.37 | 50.90 | 298.53 | +| native-interactive / moderate | live+hulls | 5/5 | 18.00 | 30.84 | 30.10–37.94 | 50.06 | 0.33 | 20.60 | 321.88 | +| native-star / mathlib | frozen | 5/5 | 18.16 | 25.95 | 25.78–33.88 | 47.75 | 9.55 | 31.53 | 674.31 | +| native-star / mathlib | frozen+hulls | 5/5 | 187.35 | 216.60 | 174.74–253.40 | 5.39 | 12.26 | 205.94 | 746.03 | +| native-star / mathlib | live | 5/5 | 21.78 | 24.80 | 22.54–27.75 | 45.10 | 7.62 | 42.01 | 666.34 | +| native-star / mathlib | live+hulls | 4/5 | 100.76 | 179.87 | 173.58–220.51 | 8.85 | 9.59 | 101.56 | 1,057.62 | + +`native` is bipartite incidence rendering; `native-star` and `native-interactive` use group/star rendering. Star draws pair lines for dyadic groups and hulls for larger groups; its scene has no spring links. Star without hulls is an ablation that hides larger groups, not a full-group rendering score. Update commit and the next application interval exclude file-watch polling and parse/I/O; they are not input-to-visible latency. Native and browser settings, geometry and vsync differ, so these tables do not establish a native-versus-browser speed ratio. + +## Hyper parsing, conversion and geometry + +Fresh release processes, one discarded warmup and five measured runs. HIF schema validation is offline. Solver timings use the bipartite scene; hull timings use the production 24-vertex cap. Worker RSS includes multiple retained documents for correctness checks. + +| Dataset | Native parse ms | HIF parse / validate ms | HIF conversion ms | Projection ms | All hulls CPU ms | Layout step p50 ms | Peak MiB | +|---|---|---|---|---|---|---|---| +| high-arity-10 | 1.13 | 3.87 | 3.36 | 0.15 | 1.28 | 0.90 | 34.56 | +| high-arity-100 | 1.48 | 13.00 | 16.00 | 0.61 | 37.93 | 1.17 | 91.78 | +| high-arity-1000 | 4.78 | 104.58 | 147.10 | 4.32 | 44.92 | 1.76 | 677.53 | +| large | 14.19 | 60.41 | 85.06 | 4.09 | 78.29 | 31.90 | 423.45 | +| mathlib | 36.26 | 141.10 | 228.00 | 15.37 | 10.77 | 97.66 | 1,020.78 | +| moderate | 2.12 | 11.52 | 12.63 | 0.63 | 15.59 | 3.53 | 80.77 | +| scientific | 0.77 | 3.08 | 2.42 | 0.19 | 0.11 | 2.06 | 30.08 | + +## Desktop alternatives + +Graphia measures stock headless import/save including process startup, then independently checks saved memberships and node attributes. The adapter retains incidence topology and arbitrary `attrs`, but omits document metadata and top-level native label/kind/status/weight fields; XYZ are attributes, and Graphia saves this graph as directed. These are import workflow timings, not rendering FPS. + +| Dataset | Tool | Completed / attempts | Import + save ms | Exact incidence records | Peak MiB | +|---|---|---|---|---|---| +| mathlib | Graphia | 5/5 | 1,490.57 | yes | 656.16 | +| moderate | Graphia | 5/5 | 390.86 | yes | 130.73 | +| scientific | Graphia | 5/5 | 332.84 | yes | 106.38 | + +HyperGodot measures its production 2D group drawing with camera motion, fixed XY coordinates and stock labels/UI. It disables vsync and uses different node/hull geometry. Its five repetitions share one process, with a new warmup each. A disposable source copy removes a missing unused autoload. Original IDs are mapped to safe tokens/line-order group IDs; weights and group categories are normalized for this fixture. Stock HiDPI is enabled and the physical render texture is verified at 1920 × 1080; earlier clamped-window timings are excluded. + +| Dataset | Tool | Completed / attempts | p50 ms | p95 ms | Avg frames/s | Whole-session peak MiB | Render target pixels | +|---|---|---|---|---|---|---|---| +| moderate | HyperGodot | 5/5 | 8.33 | 10.37 | 118.82 | 336.55 | [1920.0, 1080.0] | + +## Coverage and remaining experiments + +| Alternative | Measured scope / reason for no comparable score | +|---|---| +| HyperNetX, XGI, Hypergraphx | Model construction and scientific figure workflow; no GUI FPS claim | +| 3d-force-graph, Cytoscape.js, Sigma | Frozen full-incidence camera motion and scripted update | +| HyperGodot | Native 2D group drawing on the moderate dataset | +| Graphia | Headless incidence import/save; common render coordinates not established | +| HNX Widget | Installation and dictionary-input smoke test; public position API does not freeze all hubs; isolated vertices omitted | +| HGPolyVis | Supplied Windows-only executable; requires a Windows run | +| SimpleHypergraphs.jl | Julia runtime verified; package timings not collected | +| PAOHVis | Needs a temporal dataset and temporal exploration task | +| Gephi | Outside this automated render harness; requires a separate plugin/task comparison | +| egui_graphs | Embedding framework reference; no matched application benchmark | + +Human task accuracy, dense-diagram readability, layout convergence, GPU completion, input-to-visible latency and other machines remain unmeasured. Metadata retention does not establish that a viewer exposes or filters it. + +## Roadmap implications + +1. **Interoperability:** keep original HIF documents and stable group identities through scientific workflows. The identity-loss cases demonstrate why an incidence adapter needs correctness gates before timing. +2. **Inspection and filtering:** expose provenance, arbitrary attributes and membership before expanding visual effects. Rendering every relation does not establish readability or a successful scientific task. +3. **Responsiveness:** profile the confirmed quadratic hub-status scan in `animation::node_motion` first; the existing `GraphLayout::hub_status` cache offers a direct replacement. Then use the frozen/live split and update traces to separate solver, hull rebuild/upload and redraw costs. Add a controlled input-to-visible study before advertising latency; keep hull approximation and line budgets explicit. +4. **Installation:** ship verified wheels and a clear separately installed viewer path. The widget and desktop packaging probes show that dependency/version friction can block evaluation before performance matters. + +These priorities are interpretations of this exploratory run, not proof of adoption or a universal winner. diff --git a/docs/benchmarks/ecosystem-2026-10-03/checksums.json b/docs/benchmarks/ecosystem-2026-10-03/checksums.json new file mode 100644 index 0000000..68a0f4b --- /dev/null +++ b/docs/benchmarks/ecosystem-2026-10-03/checksums.json @@ -0,0 +1,261 @@ +{ + "scope": "Archived evidence/report and current harness sources. Post-run orchestration/checker changes are described in driver-notes; source hashes are not executable hashes.", + "files": { + "docs/benchmarks/ecosystem-2026-10-03/README.md": { + "bytes": 14591, + "sha256": "dcceb0f7da5088c8a87ac6f4afc486853b50d7bf9f42ad284cf047c151157833" + }, + "docs/benchmarks/ecosystem-2026-10-03/environment.json": { + "bytes": 1212, + "sha256": "cb90d952d05e2ae99dad25ea957787aac004cbb7a607937e67136859f5368dc9" + }, + "docs/benchmarks/ecosystem-2026-10-03/evidence/browser-final-results.json.gz": { + "bytes": 188391, + "sha256": "52608622447d584b4d209abb68413619ece87035028459352c89b725441d735b" + }, + "docs/benchmarks/ecosystem-2026-10-03/evidence/browser-original-refresh-diagnostic.json.gz": { + "bytes": 208781, + "sha256": "67534c8a1095aea38368684e71af600ef5f335ef1fe7d15b627da903af06821c" + }, + "docs/benchmarks/ecosystem-2026-10-03/evidence/browser-sigma-final-results.json.gz": { + "bytes": 67512, + "sha256": "d50457c4652e484dcf5d7061c24ef5799072c9bc87ae08cad73275d2fa46f704" + }, + "docs/benchmarks/ecosystem-2026-10-03/evidence/commands.json": { + "bytes": 2325, + "sha256": "366a6304abcf156491b4e383f9d459f26b8786fe7eb6ef738e1d61ec7f657788" + }, + "docs/benchmarks/ecosystem-2026-10-03/evidence/core-metadata.json": { + "bytes": 3571, + "sha256": "8c19e0b6d42a12c0745dd1c20fbdb569f14b533625e60a7c74fab706cf68d29b" + }, + "docs/benchmarks/ecosystem-2026-10-03/evidence/core-raw.json": { + "bytes": 96253, + "sha256": "5d8b8484b0af09751cffa57754108ac2e65b3f4e55727006a480c9d22cf2526d" + }, + "docs/benchmarks/ecosystem-2026-10-03/evidence/datasets-manifest.json": { + "bytes": 7835, + "sha256": "2e744417247ca069826892d521ce52873d53c05b643e632471eb32974ca74676" + }, + "docs/benchmarks/ecosystem-2026-10-03/evidence/driver-notes.json": { + "bytes": 1058, + "sha256": "c3aca996c8ddcec6857459b0ad56f1e648821f775c63b627bad1ec009902f895" + }, + "docs/benchmarks/ecosystem-2026-10-03/evidence/graphia-metadata.json": { + "bytes": 616, + "sha256": "b0935fa38bdc9177febe12cc5045036a6346c63de840f7052b6d12f798d2f4fc" + }, + "docs/benchmarks/ecosystem-2026-10-03/evidence/graphia-raw.json": { + "bytes": 36247, + "sha256": "20da52eb93962539fe34c63e2b8c59bbe194a93058394d030e9381cd3c5c48fa" + }, + "docs/benchmarks/ecosystem-2026-10-03/evidence/hypergodot-clamped-window-diagnostic-metadata.json": { + "bytes": 616, + "sha256": "a21fa48b29d78345badf98fab334c78784076616bbed101c9aee1663e75a7afc" + }, + "docs/benchmarks/ecosystem-2026-10-03/evidence/hypergodot-clamped-window-diagnostic.json.gz": { + "bytes": 5717, + "sha256": "6fc788366f150f425b32c1f84d7e3381751a020448130fabfb77a526719fa566" + }, + "docs/benchmarks/ecosystem-2026-10-03/evidence/hypergodot-fullscreen-unmatched-diagnostic.json": { + "bytes": 1732, + "sha256": "64b4359dd433e036ae0d617bd089d6f57d1cacebe97ef9f6750f8ac30d4c9c0d" + }, + "docs/benchmarks/ecosystem-2026-10-03/evidence/hypergodot-hidpi-untimed-smoke.json": { + "bytes": 1777, + "sha256": "dc1b358cd28c3c362505a65f9a7eeb50db7ab63b1eaa389624642b8af4c365b0" + }, + "docs/benchmarks/ecosystem-2026-10-03/evidence/hypergodot-metadata.json": { + "bytes": 629, + "sha256": "a97a68c25f14f59ca7314b453b8f83095ff971481d5810d6537073f4dc262315" + }, + "docs/benchmarks/ecosystem-2026-10-03/evidence/hypergodot-raw.json": { + "bytes": 32699, + "sha256": "f6b2b5bd649fe0fb2b954cc81d4ba064cb5bb4b1e7bd645390c75f7f694f7840" + }, + "docs/benchmarks/ecosystem-2026-10-03/evidence/native-interactive-metadata.json": { + "bytes": 2032, + "sha256": "e02f50894d1b5137f01ae4f7b75be3b79c06462c30cc824d11817eb852a2890d" + }, + "docs/benchmarks/ecosystem-2026-10-03/evidence/native-interactive-raw.json.gz": { + "bytes": 50481, + "sha256": "88f053f2d6623e709922e6b17356cc4ed556514a3f0f1adda1fda780fdc882ed" + }, + "docs/benchmarks/ecosystem-2026-10-03/evidence/native-metadata.json": { + "bytes": 6029, + "sha256": "6b01fc8119aa4959e6293ac0f5afb0c942f20fa95bd1fd0fb68068c2611bcc93" + }, + "docs/benchmarks/ecosystem-2026-10-03/evidence/native-raw.json.gz": { + "bytes": 118689, + "sha256": "0a0c76018be4cfe9298c1bad82e2c7f871c850286d4989cb8b42ec34a90aaa72" + }, + "docs/benchmarks/ecosystem-2026-10-03/evidence/native-star-metadata.json": { + "bytes": 2019, + "sha256": "e8f75577be230de47b95c3c218460167f1f56161f8561b7d833244778cdd65c2" + }, + "docs/benchmarks/ecosystem-2026-10-03/evidence/native-star-raw.json.gz": { + "bytes": 46501, + "sha256": "cd092e726250b6992dbcb4dcd2c0ef258646ecc295908d3598d5402396004c0c" + }, + "docs/benchmarks/ecosystem-2026-10-03/evidence/native-untimed-render-validation.png": { + "bytes": 510563, + "sha256": "61a985c99d2a21eba481ccae8edfd52040227201d5e507720d302abeb1bda764" + }, + "docs/benchmarks/ecosystem-2026-10-03/evidence/native-untimed-smoke.json": { + "bytes": 1400, + "sha256": "94ec1199fef9e1206534a6a8defb9a6e8d82f472029fa9a4cbff86b0916f9734" + }, + "docs/benchmarks/ecosystem-2026-10-03/evidence/scientific-consolidation.json": { + "bytes": 526, + "sha256": "2ed07a3dd0ccd539ae2ae733e315f2bf8e4a12282c0e50348937444b4fcf25b5" + }, + "docs/benchmarks/ecosystem-2026-10-03/evidence/scientific-hnx-repeat-metadata.json": { + "bytes": 7338, + "sha256": "038a22118eb9dd36d8184ff3550647b6317cacf5354349f344425a3ea7d84e2d" + }, + "docs/benchmarks/ecosystem-2026-10-03/evidence/scientific-independent-validation.json": { + "bytes": 23168, + "sha256": "23d18fccb05b2092dd0f661f70a19732a206779885b5dba1cdf43257bab4b921" + }, + "docs/benchmarks/ecosystem-2026-10-03/evidence/scientific-metadata.json": { + "bytes": 29585, + "sha256": "54b0f7e8a232ce09c760f85db30113837caaf2c40f8d0ed992e30a135c4e9664" + }, + "docs/benchmarks/ecosystem-2026-10-03/evidence/scientific-raw.json": { + "bytes": 376790, + "sha256": "fb6767860a5a73c3c10b9b2f179cc3ca8544b56b67ac626f95c748f57f271af9" + }, + "docs/benchmarks/ecosystem-2026-10-03/evidence/scientific-requirements.txt": { + "bytes": 667, + "sha256": "aeacc7048d9ecb01c1ede17a3241333f461979e552a1f08bb03a71d9e91671c3" + }, + "docs/benchmarks/ecosystem-2026-10-03/methodology.md": { + "bytes": 11797, + "sha256": "3abe052f5b76b9e8878b67fab68ae391c49882f79b82f17a79bf3d702744bd28" + }, + "docs/benchmarks/ecosystem-2026-10-03/summary.csv": { + "bytes": 16427, + "sha256": "ce10068d3fcd4133cace912edf4f3781e0bd64d8b41da27470997f179065aff6" + }, + "docs/benchmarks/ecosystem-2026-10-03/summary.json": { + "bytes": 47789, + "sha256": "9ab9a22d0dc0c0b6a1a6bcdf66c262e594f0fa7b18bf023da4dfcf45569867fe" + }, + "docs/benchmarks/ecosystem-2026-10-03/verification.json": { + "bytes": 1322, + "sha256": "c70a02602278dcc1bf626892ea298fd17f6d3e607b6ba6fc9b6528aa40ec1fb3" + }, + "scripts/benchmarks/README.md": { + "bytes": 7072, + "sha256": "aece56aec8795346f04d7f45ef0eb27e28503181af402e16cbfc00a00715b01f" + }, + "scripts/benchmarks/archive.py": { + "bytes": 4066, + "sha256": "27221b5432ed9f3d4fc3b5c0c1937f4e2c95085a39618005e3b3a099577d94c7" + }, + "scripts/benchmarks/browser/.gitignore": { + "bytes": 14, + "sha256": "4d56952b0fb13bf8f9b6c13a6d4c34a075bac3af447636a1df4335d7576e2f97" + }, + "scripts/benchmarks/browser/README.md": { + "bytes": 6733, + "sha256": "a504e2aa0be2be9bc0a908f71b1926f22cc9fb64b85756d55d2c0b388740261d" + }, + "scripts/benchmarks/browser/client.js": { + "bytes": 9135, + "sha256": "ff4e3750718e56846859b9e30bfd47e32f895b15bdb4401c4697efbebf3046f2" + }, + "scripts/benchmarks/browser/package-lock.json": { + "bytes": 31634, + "sha256": "fccc8a26441c4df9db48cb0aebd9fa626c15640314db6a8cb0c8fb5376ce1323" + }, + "scripts/benchmarks/browser/package.json": { + "bytes": 392, + "sha256": "99e72eaa73793ac1d80088228aa70a6d3dbd9b82a07325b9312c9e4ba9fea199" + }, + "scripts/benchmarks/browser/run.mjs": { + "bytes": 12546, + "sha256": "e7187bc9a1f40b25b89d5c7bae89b0441d2364d19f39eed3a95cbfbe25df3ee1" + }, + "scripts/benchmarks/consolidate_browser.py": { + "bytes": 2750, + "sha256": "e628f5c229ab12aaa2deb820182edc1734055a2b3fc7c5225cf9f2b5eea175cf" + }, + "scripts/benchmarks/datasets.py": { + "bytes": 6228, + "sha256": "7f9c04608bb704888d48d3f129c4d72870d5828b48dd15d4daada44f50b3b6ec" + }, + "scripts/benchmarks/desktop/README.md": { + "bytes": 6673, + "sha256": "a1069f2666b0062d19f3ae824175ec8eaf5c74a4837fd3321fa93b7336530fc7" + }, + "scripts/benchmarks/desktop/hypergodot_runner.gd": { + "bytes": 165, + "sha256": "3bd7106031f836f9edfb2948a682aa56d51d63711ba941a2d8dff36de4f4a1ee" + }, + "scripts/benchmarks/desktop/hypergodot_scene.gd": { + "bytes": 5256, + "sha256": "b892a729cc5b6d39d2cf9e4126cb5db2b613d4f53fb423139934eb0a2ab06d33" + }, + "scripts/benchmarks/desktop/prepare_graphia.py": { + "bytes": 2737, + "sha256": "7f9a526435f4027aa91dd65c8de2259ecefbb11d037f30d08a252d933fc51f2d" + }, + "scripts/benchmarks/desktop/prepare_hypergodot.py": { + "bytes": 3570, + "sha256": "164369cfa58434ef17b86cb6f48d18f8ab703ec737493e46cf79b7fd6092b080" + }, + "scripts/benchmarks/desktop/run.py": { + "bytes": 6657, + "sha256": "ba17ec4678b542869ba7adde26781ac20f32d54567665f436d3cb10bb01214c1" + }, + "scripts/benchmarks/report.py": { + "bytes": 13149, + "sha256": "12b8e7d51b0b608f9405e53edb81431f206f405fdea7ee15c4d4e610edb940f9" + }, + "scripts/benchmarks/restore_evidence.py": { + "bytes": 1559, + "sha256": "de6100a70c979e856d2cf1aaf19531761732074937bb2a2195d084e619c7d23b" + }, + "scripts/benchmarks/run_local.py": { + "bytes": 4579, + "sha256": "4f9ffc76228eefeeb0cde294e6c211ea2d78921ad437beb92a1926c91704412d" + }, + "scripts/benchmarks/scientific.py": { + "bytes": 16774, + "sha256": "ea1cfaaa0e18cbef578d2bf8b8eae89e8e895fe30216e058f3fb0111579d861c" + }, + "scripts/benchmarks/summarize.py": { + "bytes": 8399, + "sha256": "7ba803999b8c52e5c0c96bdf3073048829981d1692b346f3be098c4eff44caa1" + }, + "scripts/benchmarks/test_datasets.py": { + "bytes": 1315, + "sha256": "03356d021a8e658a855e21df636ec71ecac43619539cf0a54d752aa0eec01e6f" + }, + "scripts/benchmarks/test_scientific.py": { + "bytes": 1395, + "sha256": "286aa2cbac32b015d51acbe720d7885be24eaa7de1941bc89a111a0540f4818a" + }, + "scripts/benchmarks/test_summarize.py": { + "bytes": 1691, + "sha256": "9142eb967812697705f49b7635089606dfa4d915b62a8a81d52d49f9efa46327" + }, + "scripts/benchmarks/verify_scientific.py": { + "bytes": 1081, + "sha256": "51e3159287a8c286cea7bef1567e63b35704564b19afe928cb7c01dba9063ae6" + }, + "crates/hyper-viz/examples/ecosystem_core.rs": { + "bytes": 6133, + "sha256": "ff7a5e844af2bedc4e4b2a3bf8dfde12881c4f1514e14a4d79f863cca33a3f49" + }, + "crates/hyper-viz-bevy/src/benchmark.rs": { + "bytes": 11281, + "sha256": "e5cd1317753101e6455d4ab96090670a1dc6b4ee0ab76e48b6a349c62720b057" + }, + "crates/hyper-viz-bevy/src/bin/ecosystem_benchmark.rs": { + "bytes": 52, + "sha256": "844bb550a9bc51c534686b2a402f4ab80b6aa4eaf2d271650ab0b5ac33f1d8b6" + } + } +} diff --git a/docs/benchmarks/ecosystem-2026-10-03/environment.json b/docs/benchmarks/ecosystem-2026-10-03/environment.json new file mode 100644 index 0000000..82031f9 --- /dev/null +++ b/docs/benchmarks/ecosystem-2026-10-03/environment.json @@ -0,0 +1,30 @@ +{ + "recorded_unix": 1791051214.3176162, + "platform": "macOS-27.0-arm64-arm-64bit", + "cpu": "Apple M5 Pro", + "cpu_cores": 15, + "gpu": "Apple M5 Pro,16 cores,Metal", + "ram_bytes": 25769803776, + "load_average": [ + 3.15576171875, + 4.658203125, + 4.48046875 + ], + "power": "Now drawing from 'AC Power'", + "thermal": "pmset telemetry unavailable", + "background": "no parallel benchmark/build; ordinary desktop applications uncontrolled", + "display": "variable refresh; actual intervals recorded; no forced60Hz", + "commit": "33c34621a898b6c9d1d11ad4ddae3ad29ccf1855", + "rust": "rustc 1.89.0 (29483883e 2025-08-04)", + "power_checkpoint": { + "recorded_unix": 1791060411.970849, + "lowpowermode": 0, + "display_sleep_minutes": 0, + "prevent_user_idle_display_sleep": 1, + "prevent_user_idle_system_sleep": 1, + "user_is_active": 1, + "note": "pmset checkpoint after a small native batch timeout; display/system idle sleep is prevented. Native timeout causes remain unresolved." + }, + "finished_utc": "2026-10-03T21:37:05.987003+00:00", + "final_hypergodot": "Stock HiDPI enabled; actual Metal render texture1920x1080; display scale2; clamped-window and fullscreen probes excluded." +} diff --git a/docs/benchmarks/ecosystem-2026-10-03/evidence/browser-final-results.json.gz b/docs/benchmarks/ecosystem-2026-10-03/evidence/browser-final-results.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..527cfd3e457340f52eac1f712ba7a118e1e13468 GIT binary patch literal 188391 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

0hU)v|H#3=1#{`{dbM4 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 literal 0 HcmV?d00001 diff --git a/docs/benchmarks/ecosystem-2026-10-03/evidence/browser-original-refresh-diagnostic.json.gz b/docs/benchmarks/ecosystem-2026-10-03/evidence/browser-original-refresh-diagnostic.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..35953975cd8cfffe75f12395070ed536fad69064 GIT binary patch literal 208781 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

FZ~b>LO}3?r@%cS>-9Q)dVu3D`cW_9#=Oy1* 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
^c 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
^bMg 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

;S5(2mbS* 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 z &0aeY~glZTgwaU}-`YR@)?Lw(ZS2^bJCa9F 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ϝ-X>f-@4h| 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 z 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

'; +const server=http.createServer((req,res)=>{res.setHeader('Content-Type',req.url==='/bundle.js'?'text/javascript':'text/html');res.end(req.url==='/bundle.js'?bundle.outputFiles[0].contents:html);}); +await new Promise(r=>server.listen(0,'127.0.0.1',r)); +const url='http://127.0.0.1:'+server.address().port; +const launchArgs=['--disable-background-timer-throttling','--disable-renderer-backgrounding','--disable-backgrounding-occluded-windows','--window-size=1920,1080']; +if(args.includes('--swiftshader'))launchArgs.push('--use-angle=swiftshader','--enable-unsafe-swiftshader'); +const browser=await chromium.launch({headless:!headed,...(executable?{executablePath:executable}:{}),args:launchArgs}); +const context=await browser.newContext({viewport:{width:1920,height:1080},deviceScaleFactor:1}); +await context.addInitScript(()=>{window.__glContexts=[];const original=HTMLCanvasElement.prototype.getContext;HTMLCanvasElement.prototype.getContext=function(type,...rest){const result=original.call(this,type,...rest);if(result&&/^(webgl2?|experimental-webgl)$/.test(type)&&!window.__glContexts.includes(result))window.__glContexts.push(result);return result;};}); +const packageJSON=JSON.parse(await fs.readFile(path.join(here,'package.json'))); +const session=await browser.newBrowserCDPSession(); +const [browserInfo,systemInfo]=await Promise.all([session.send('Browser.getVersion'),session.send('SystemInfo.getInfo')]); +const lock=await fs.readFile(path.join(here,'package-lock.json')); +const report={kind:validateOnly?'untimed-adapter-validation':'browser-frozen-incidence-benchmark',startedUTC:new Date().toISOString(),environment:{os:os.type(),release:os.release(),arch:os.arch(),cpus:os.cpus().map(c=>c.model),ramBytes:os.totalmem(),node:process.version,browser:browserInfo,gpu:systemInfo.gpu,headed,executable:executable||chromium.executablePath(),launchArgs,viewport:{width:1920,height:1080,dpr:1},packageVersions:{...packageJSON.dependencies,...packageJSON.devDependencies},lockfileSha256:sha(lock),powerThermalAndBackgroundLoad:process.env.BENCHMARK_CONDITIONS||'unrecorded; set BENCHMARK_CONDITIONS before publishing',vsync:'browser default; rAF cadence recorded, presentation unverified'},protocol:{seed,warmup,samples,repetitions,modes,jobTimeoutMs,order:'seeded Fisher-Yates over tool/dataset/mode for each repetition',gpuDuration:'not measured',memory:'Peak browser/GPU memory not measured; host total RAM is environment capacity only',inputLatency:'two-rAF scripted update surrogate, not human input or presentation latency',twoDvsThreeD:'Cytoscape and Sigma XY projection differs from 3D sphere and perspective rendering'},datasets:{},runs:[],unavailable:[{tool:'HNX Widget',reason:'Unsupported matched frozen incidence track: official 58e795d6a362dcd3bbd9ccff462052956a40f4f8 src/HypernetxWidgetView.js pos input fixes vertex parent nodes, not hyperedge hubs; public renderer runs charge/link/center/collide/bound simulation. Notebook wrapper also omits isolated vertices. See README capability probe. Native group-exploration remains a separate track'}]}; +function distribution(a){const sorted=[...a].sort((x,y)=>x-y);const p=q=>sorted[Math.min(sorted.length-1,Math.floor(q*(sorted.length-1)))];return {p50Ms:p(.5),p95Ms:p(.95),p99Ms:p(.99),meanMs:a.reduce((x,y)=>x+y,0)/a.length,maxMs:sorted.at(-1)};} +const scenes=new Map(); +try{ + for(const name of datasets){ + const graphPath=path.join(root,'target/benchmark/datasets',name+'.json'),scenePath=graphPath.replace(/\.json$/,'.incidence.json'); + const [graphBytes,sceneBytes]=await Promise.all([fs.readFile(graphPath),fs.readFile(scenePath)]); + const graph=JSON.parse(graphBytes),scene=JSON.parse(sceneBytes); + const changedPath=path.join(root,'target/benchmark/datasets',name+'.updated.incidence.json'); + let changed=null,changedSha=null,changedGraphSha=null,changedCounts=null;try{const bytes=await fs.readFile(changedPath);changed=JSON.parse(bytes);changedSha=sha(bytes);const updatedBytes=await fs.readFile(graphPath.replace(/\.json$/,'.updated.json'));changedGraphSha=sha(updatedBytes);changedCounts=assertions(JSON.parse(updatedBytes),changed);}catch(e){if(e.code!=='ENOENT')throw e;} + report.datasets[name]={graphSha256:sha(graphBytes),incidenceSha256:sha(sceneBytes),...assertions(graph,scene),updatedIncidenceSha256:changedSha,updatedGraphSha256:changedGraphSha,updatedCounts:changedCounts,update:changed?'canonical shared updated incidence fixture':'Unavailable: canonical shared update fixture absent'}; + scenes.set(name,{scene,changed}); + } + const order=[];for(let repetition=0;repetition<(validateOnly?1:repetitions);repetition++){ + const batch=[];for(const dataset of datasets)for(const tool of tools)for(const mode of (validateOnly?['static']:modes))batch.push({dataset,tool,mode,repetition}); + order.push(...shuffle(batch)); + } + report.order=order; + for(const job of order){ + const page=await context.newPage();let watchdog;let stage='load'; + try { const execute=async()=>{const errors=[];page.on('pageerror',e=>errors.push(String(e)));await page.goto(url);await page.waitForFunction(()=>window.benchmark); + const {scene,changed}=scenes.get(job.dataset);const start=performance.now(); + stage='setup';const initialized=await page.evaluate(({tool,scene})=>window.benchmark.setup(tool,scene),{tool:job.tool,scene});const loadWallMs=performance.now()-start; + stage='adapter validation';const topology=validateSnapshot(initialized.topology,scene); + const graphics=await page.evaluate(()=>window.benchmark.graphics()); + const run={...job,status:'completed',framing:initialized.framing,validation:topology,settings:initialized.settings,kind:initialized.kind,graphics,errors}; + if(!validateOnly){stage='timed sampling';run.loadWallMs=loadWallMs;run.trace=await page.evaluate(config=>window.benchmark.sample(config),{mode:job.mode,warmup,samples});run.summary={javascriptCommand:distribution(run.trace.commandMs),rafWallInterval:distribution(run.trace.rafIntervalMs),averageThroughputFPS:run.trace.averageThroughputFPS};} + if(changed){stage='incremental update';const updated=await page.evaluate(({scene,measure})=>window.benchmark.update(scene,measure),{scene:changed,measure:!validateOnly}); + run.incremental={...updated,topology:validateSnapshot(updated.topology,changed),unchangedNodeIDs:canonical(scene.nodes.map(n=>n.id).sort())===canonical(changed.nodes.map(n=>n.id).sort()),nodeCountDelta:changed.nodes.length-scene.nodes.length,linkCountDelta:changed.links.length-scene.links.length};} + // Pixel readback outside timed sampling, once per tool/dataset only. + stage='screenshot outside timing';if(job.repetition===0&&(job.mode==='static'||!modes.includes('static'))){const screenshot=path.join(output,`${job.dataset}-${job.tool}.png`);await page.screenshot({path:screenshot});run.screenshot=path.relative(root,screenshot);} + if(errors.length)throw Error('Page errors '+errors.join('\n')); + report.runs.push(run); + await page.evaluate(()=>window.benchmark.dispose()); + console.log(`${validateOnly?'Validated':'Measured'} ${job.tool} ${job.dataset} ${job.mode} repetition ${job.repetition+1}`); + }; + await Promise.race([execute(),new Promise((_,reject)=>{watchdog=setTimeout(()=>reject(Error('Job watchdog exceeded '+jobTimeoutMs+' ms')),jobTimeoutMs);})]); + } catch(error){report.runs.push({...job,status:'failed',stage,error:String(error)});console.error(`Failed ${job.tool} ${job.dataset} ${stage}: ${error}`);process.exitCode=1;} + finally{clearTimeout(watchdog);await page.close().catch(()=>{});await fs.writeFile(path.join(output,validateOnly?'validation.json':'results.json'),JSON.stringify(report,null,2));} + } + console.log('Evidence: '+path.join(output,validateOnly?'validation.json':'results.json')); +} finally{await browser.close();server.closeAllConnections();server.close();stop();} diff --git a/scripts/benchmarks/consolidate_browser.py b/scripts/benchmarks/consolidate_browser.py new file mode 100644 index 0000000..8b5b30e --- /dev/null +++ b/scripts/benchmarks/consolidate_browser.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python3 +"""Replace the discarded Sigma refresh track with its corrected redraw runs.""" +import argparse +import hashlib +import json +from pathlib import Path + + +def key(row): + return tuple(row[k] for k in ('dataset', 'tool', 'mode', 'repetition')) + + +def consolidate(original, replacement): + old = json.loads(original.read_text()) + new = json.loads(replacement.read_text()) + for field in ('os', 'release', 'arch', 'ramBytes', 'node', 'browser', 'headed', 'viewport', 'packageVersions', 'lockfileSha256'): + assert old['environment'][field] == new['environment'][field], f'Environment changed: {field}' + for field in ('seed', 'warmup', 'samples', 'repetitions', 'modes', 'jobTimeoutMs'): + assert old['protocol'][field] == new['protocol'][field], f'Protocol changed: {field}' + assert old['datasets'] == new['datasets'], 'Input hashes/provenance changed' + expected = {key(r) for r in old['runs'] if r['tool'] == 'sigma'} + actual = {key(r) for r in new['runs']} + assert len(new['runs']) == len(actual) == len(expected) == 35 + assert expected == actual + assert all(r['tool'] == 'sigma' for r in new['runs']) + old['runs'] = [r for r in old['runs'] if r['tool'] != 'sigma'] + new['runs'] + assert len(old['runs']) == len({key(r) for r in old['runs']}) == 105 + old['consolidation'] = {'reason': 'Sigma full refresh reprocessed unchanged graph data during camera motion. Replaced with public scheduleRender cached redraw; original Sigma timings excluded.', + 'original_report_sha256': hashlib.sha256(original.read_bytes()).hexdigest(), + 'replacement_report_sha256': hashlib.sha256(replacement.read_bytes()).hexdigest(), + 'replacement_started_utc': new['startedUTC'], + 'replacement_environment': new['environment'], + 'replacement_order': new['order'], + 'order_limit': 'Corrected Sigma ran in a separate block after native work; original mixed-tool order applies only to retained Cytoscape/3D cases.'} + return old + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--original', type=Path, default=Path('target/benchmark/browser-original/results.json')) + parser.add_argument('--replacement', type=Path, default=Path('target/benchmark/browser-sigma-final/results.json')) + parser.add_argument('--output', type=Path, default=Path('target/benchmark/browser-final/results.json')) + args = parser.parse_args() + args.output.parent.mkdir(parents=True, exist_ok=True) + args.output.write_text(json.dumps(consolidate(args.original, args.replacement), indent=2) + '\n') diff --git a/scripts/benchmarks/datasets.py b/scripts/benchmarks/datasets.py new file mode 100644 index 0000000..ebcbeed --- /dev/null +++ b/scripts/benchmarks/datasets.py @@ -0,0 +1,100 @@ +#!/usr/bin/env python3 +"""Seeded canonical fixtures and lossless incidence projections (stdlib only).""" +import copy +import hashlib +import json +import math +from pathlib import Path +import random + +SEED = 20261003 + +def positions(graph): + rng = random.Random(SEED) + for node in graph['vertices']: + node.setdefault('attrs', {})['position'] = [round(rng.uniform(-500, 500), 6) for _ in range(3)] + graph.setdefault('meta', {}).setdefault('attrs', {})['benchmark_seed'] = SEED + return graph + +def synthetic(name, n, m, arity, fixed=False): + rng = random.Random(SEED) + vertices = [{'id': f'n{i}', 'label': f'Node {i}', 'attrs': {'category': i % 5, 'nested': {'source': name}}} for i in range(n)] + edges = [] + for i in range(m): + k = min(n, arity if fixed else [2, 3, 4, arity, arity * 2][i % 5]) + members = rng.sample(range(n), k) + edges.append({'id': f'g{i}', 'vertices': [f'n{j}' for j in members], 'attrs': {'category': i % 5}}) + return positions({'version': 'hypergraph.v1', 'meta': {'id': name, 'title': name, 'attrs': {'license': 'CC0-1.0'}}, 'vertices': vertices, 'hyperedges': edges}) + +def hif(graph): + def attributes(record): + # Retain all native display metadata as explicit attributes. + return {**record.get('attrs', {}), **{k: record[k] for k in ('label', 'kind', 'status') if k in record}} + return {'network-type': 'undirected', 'metadata': graph.get('meta', {}), + 'nodes': [{'node': v['id'], 'attrs': attributes(v), **({'weight': v['weight']} if 'weight' in v else {})} for v in graph['vertices']], + 'edges': [{'edge': e['id'], 'attrs': attributes(e), **({'weight': e['weight']} if 'weight' in e else {})} for e in graph['hyperedges']], + 'incidences': [{'node': v, 'edge': e['id']} for e in graph['hyperedges'] for v in e['vertices']]} + +def incidence(graph): + points = {v['id']: v['attrs']['position'] for v in graph['vertices']} + nodes = [{'id': 'v:' + v['id'], 'role': 'vertex', 'original_id': v['id'], 'x': points[v['id']][0], 'y': points[v['id']][1], 'z': points[v['id']][2], 'attrs': v.get('attrs', {})} for v in graph['vertices']] + links = [] + for e in graph['hyperedges']: + members = e['vertices'] + p = [sum(points[v][axis] for v in members) / len(members) if members else 0 for axis in range(3)] + nodes.append({'id': 'e:' + e['id'], 'role': 'hyperedge', 'original_id': e['id'], 'x': p[0], 'y': p[1], 'z': p[2], 'attrs': e.get('attrs', {})}) + links.extend({'id': e['id'] + ':' + str(i), 'source': 'e:' + e['id'], 'target': 'v:' + v, 'edge': e['id'], 'node': v} for i, v in enumerate(members)) + return {'nodes': nodes, 'links': links, 'meta': graph.get('meta', {})} + +def changed(graph): + result = copy.deepcopy(graph) + all_ids = [v['id'] for v in result['vertices']] + for e in result['hyperedges'][:math.ceil(len(result['hyperedges']) * .01)]: + members = e['vertices'] + replacement = next((v for v in all_ids if v not in members), None) + if replacement is not None: + if members: + members[0] = replacement + else: + members.append(replacement) + else: + members.pop() + return result + +def from_hif(doc): + edges = {e['edge']: {'id': 'g:' + str(e['edge']), 'vertices': [], 'attrs': e.get('attrs', {})} for e in doc['edges']} + for i in doc['incidences']: + edges[i['edge']]['vertices'].append('n:' + str(i['node'])) + return positions({'version': 'hypergraph.v1', 'meta': {'id': 'diseasome', 'title': 'Diseasome', 'attrs': {'license': 'CC-BY-4.0', 'source': 'https://doi.org/10.5281/zenodo.21909416', 'source_metadata': doc.get('metadata', {})}}, 'vertices': [{'id': 'n:' + str(v['node']), 'attrs': v.get('attrs', {})} for v in doc['nodes']], 'hyperedges': list(edges.values())}) + +def write_suite(directory, source): + directory.mkdir(parents=True, exist_ok=True) + graphs = {name: synthetic(name, n, m, a, fixed) for name, n, m, a, fixed in [('correctness', 30, 15, 4, False), ('moderate', 1000, 2000, 8, False), ('large', 10000, 10000, 8, False), ('high-arity-10', 1000, 200, 10, True), ('high-arity-100', 1000, 200, 100, True), ('high-arity-1000', 1000, 200, 1000, True)]} + fixture = graphs['correctness'] + fixture['hyperedges'][0]['vertices'] = [] + fixture['hyperedges'][1]['vertices'] = ['n0'] + for e in fixture['hyperedges']: + e['vertices'] = [v for v in e['vertices'] if v != 'n29'] + if (source / 'diseasome.json').exists(): + graphs['scientific'] = from_hif(json.loads((source / 'diseasome.json').read_text())) + if (source / 'mathlib.json').exists(): + graphs['mathlib'] = positions(json.loads((source / 'mathlib.json').read_text())) + manifest = [] + for name, graph in graphs.items(): + artifacts = {'': graph, '.hif': hif(graph), '.incidence': incidence(graph), '.updated': changed(graph), '.updated.incidence': incidence(changed(graph))} + hashes = {} + for suffix, data in artifacts.items(): + raw = (json.dumps(data, separators=(',', ':'), ensure_ascii=False) + '\n').encode() + filename = name + suffix + '.json' + (directory / filename).write_bytes(raw) + hashes[filename] = hashlib.sha256(raw).hexdigest() + manifest.append({'dataset': name, 'vertices': len(graph['vertices']), 'hyperedges': len(graph['hyperedges']), 'memberships': sum(len(e['vertices']) for e in graph['hyperedges']), 'maximum_arity': max(map(lambda e: len(e['vertices']), graph['hyperedges'])), 'empty_edges': sum(not e['vertices'] for e in graph['hyperedges']), 'isolated_nodes': len(set(v['id'] for v in graph['vertices']) - set(v for e in graph['hyperedges'] for v in e['vertices'])), 'provenance': graph.get('meta'), 'sha256': hashes}) + (directory / 'manifest.json').write_text(json.dumps(manifest, indent=2) + '\n') + +if __name__ == '__main__': + import argparse + parser = argparse.ArgumentParser() + parser.add_argument('--output', type=Path, default=Path('target/benchmark/datasets')) + parser.add_argument('--source', type=Path, default=Path('target/benchmark/source')) + args = parser.parse_args() + write_suite(args.output, args.source) diff --git a/scripts/benchmarks/desktop/README.md b/scripts/benchmarks/desktop/README.md new file mode 100644 index 0000000..2123246 --- /dev/null +++ b/scripts/benchmarks/desktop/README.md @@ -0,0 +1,110 @@ +# Desktop benchmark preparation + +These adapters prepare inputs and instrumentation; preparation does not start timed workloads. + +## HyperGodot + +Source: https://github.com/ElsevierSoftwareX/SOFTX-D-25-00370 at +`49d03cd7540d2900cc8624048973ef430ff4e009`. Runtime prepared from Godot +4.7.2 stable universal macOS release. The upstream project requests Godot 4.4 +Forward Plus and disables vsync. This comparison is a 2D group viewer using +native hull drawing, distinct from the 3D incidence render track. +The downloaded runtime SHA-256 was verified as +`c58a24e31d720be9d62f60cb5627c4e695fb72f21b0cfe1bc9ccaa9a3b3ba63e`; +`--version` returns `4.7.2.stable.official.ed1daf0bf`. Headless source import and +two untimed initialization frames of the moderate dataset succeeded. No rendered +frame timings were collected during preparation. Direct `--check-only` on the +scene script omits project autoload globals; the actual project initialization +loads those globals and compiles successfully. + +```sh +git clone https://github.com/ElsevierSoftwareX/SOFTX-D-25-00370 /tmp/hyper-benchmark-competitors/hypergodot +git -C /tmp/hyper-benchmark-competitors/hypergodot checkout 49d03cd7540d2900cc8624048973ef430ff4e009 +python3 scripts/benchmarks/desktop/prepare_hypergodot.py --dataset target/benchmark/datasets/moderate.json --destination /tmp/hyper-benchmark-competitors/hypergodot-moderate +/path/to/Godot --headless --editor --path /tmp/hyper-benchmark-competitors/hypergodot-moderate --import --quit +``` + +Preparation copies upstream source, removes its missing and unused +`MaterialIconsDB` autoload, exports exact parser-compatible tagged text, and adds +the instrumentation scripts. The format is `n0 n1 #WEIGHT: 1 #GROUP baseline`; +the actual parser requires no colon after GROUP. Safe token IDs have a reversible +map; hyperedge IDs are line numbers in upstream. Isolated vertices, empty edges, +and duplicate memberships are rejected explicitly. Weights/groups are normalized +for this matched unweighted fixture and recorded as adaptations. + +After source import and harness validation, the root coordinator can execute: + +```sh +/tmp/hyper-benchmark-competitors/Godot.app/Contents/MacOS/Godot --path /tmp/hyper-benchmark-competitors/hypergodot-moderate --script res://benchmark_runner.gd -- --output /tmp/hyper-benchmark-competitors/hypergodot-moderate-results.json --warmup 120 --frames 300 --repetitions 5 +``` + +The harness overrides upstream startup layout while invoking production +`read_file`, `create_nodes`, `populate_edge_data`, sizing and drawing. It sets +canonical XY coordinates, pans/zooms a Camera2D, requests a 1920x1080 window +with stock HiDPI enabled, and records intervals between `_process` callbacks with the monotonic +clock. These include engine scheduling/render/presentation from the previous +frame and are not GPU duration. Upstream nodes, hulls, UI, labels and picking +remain; node radius 30, hull point count 4, edge width 1. Repetitions share one +process and receive a new warmup each. Window and viewport size, screen scale/DPI, +and the HiDPI setting are recorded. The final run verifies the actual render texture as 1920×1080; an earlier HiDPI-disabled run was clamped to 1920×917 and is excluded. reject matched-render comparison if actual +pixel dimensions differ from the requested size. + +## Graphia + +Source: https://github.com/graphia-app/graphia at version 5.5 commit +`b8ad51e820192a6f22ab310ebd84282384327c10`. Stock headless interface: +https://graphia.app/guide/section5/2_headless.html . +The public macOS release is universal arm64/x86_64, passes deep/strict code +signature verification, and its SHA-256 is +`ed77be142e34f209b6d95e959bb2b3937eca4d9621239a5f0dcc7a892a98ea85`. +Native CLI help and an untimed correctness GraphML import/save succeeded with +exit code 0. This bundle only supplies the Cocoa Qt platform plugin; setting +`QT_QPA_PLATFORM=offscreen` fails. Use its supported stock headless mode with the +native Cocoa platform instead. + +```sh +python3 scripts/benchmarks/desktop/prepare_graphia.py --dataset target/benchmark/datasets/moderate.json --output /tmp/hyper-benchmark-competitors/graphia-inputs +/tmp/hyper-benchmark-competitors/Graphia.app/Contents/MacOS/Graphia --parameters /tmp/hyper-benchmark-competitors/graphia-inputs/moderate.parameters.json /tmp/hyper-benchmark-competitors/graphia-inputs/moderate.graphml +``` + +GraphML retains every canonical vertex and group as explicit incidence nodes. +XYZ values are attributes; the stock parser does not establish a common fixed +layout. Headless import/save time can be measured independently of interactive +rendering. Do not report it as rendering FPS. + +## HNX Widget + +Source https://github.com/pnnl/hypernetx-widget at +`58e795d6a362dcd3bbd9ccff462052956a40f4f8`; PyPI package `hnxwidget==0.1.1b3`. +Isolated environment is `/tmp/hyper-benchmark-competitors/widget-venv` with +`notebook==6.5.7`, `traitlets<5.10`, and `hypernetx==2.4.0`. Notebook 6.5.x is the +documented compatibility path. Construct `HypernetxWidget(incidence_mapping, +pos={vertex_id: [x, y]}, collapseNodes=False)` in a notebook cell. The wrapper +was smoke tested successfully with three vertices and two groups; installed +`ipywidgets==7.8.5` provides the compatible classic widget frontend. +The separate HNX 2.4.0 constructor fails with the resolved pandas 3.0.6 +dependency; direct membership dictionary input avoids that constructor and is +supported by the widget's production API. +The wrapper +derives nodes from memberships, so isolated vertices are not preserved. Source +inspection shows supplied `pos` does not fix all bipartite hyperedge hubs and +forces continue; this belongs in the group exploration track, not the fully +controlled common-coordinate incidence track without further adaptation. + +## HGPolyVis + +https://github.com/peterdanieloliver/HGPolyVis at +`ba8868b1b002be5c32fb1e83548778fd7feed186` contains Windows 11 executable/Qt5 +DLLs, datasets and README, without buildable application source. Upstream states +no other supported OS. It requires Windows for a valid native benchmark, and is +unavailable on the tested macOS. CSV import rows are +`hyperedge_id,member_id,member_id,...`; `.er` supports saved positions/colors. + +## Julia + +Optional Julia 1.13.1 macOS arm64 runtime was extracted and `--version` verified from official +https://julialang-s3.julialang.org/bin/mac/aarch64/1.13/julia-1.13.1-macaarch64.tar.gz +(expected SHA-256 `a3e0259d4777c2b776c2cba134d5b6c6c124048dcb913f8881517892c49a0f7f`). +The downloaded SHA-256 matched the expected value. The executable is +`/tmp/hyper-benchmark-competitors/julia-1.13.1/bin/julia`. +SimpleHypergraphs.jl dependency installation and measurements remain pending. diff --git a/scripts/benchmarks/desktop/hypergodot_runner.gd b/scripts/benchmarks/desktop/hypergodot_runner.gd new file mode 100644 index 0000000..47d464c --- /dev/null +++ b/scripts/benchmarks/desktop/hypergodot_runner.gd @@ -0,0 +1,6 @@ +extends SceneTree + +func _initialize(): + var scene = load("res://main.tscn").instantiate() + scene.set_script(load("res://benchmark_scene.gd")) + root.add_child(scene) diff --git a/scripts/benchmarks/desktop/hypergodot_scene.gd b/scripts/benchmarks/desktop/hypergodot_scene.gd new file mode 100644 index 0000000..737713e --- /dev/null +++ b/scripts/benchmarks/desktop/hypergodot_scene.gd @@ -0,0 +1,128 @@ +# External benchmark instrumentation; upstream production drawing is inherited. +extends "res://main.gd" + +var samples: Array = [] +var repetitions: Array = [] +var frame_index = 0 +var repetition = 0 +var previous_usec = 0 +var benchmark_camera: Camera2D +var center = Vector2.ZERO +var base_zoom = 1.0 +var output_path = "res://benchmark_results.json" +var warmup_frames = 120 +var measured_frames = 300 +var repeat_count = 5 +var startup_ms = 0.0 +var exact_memberships = false + +func _ready(): + seed(20261003) + var started = Time.get_ticks_usec() + var args = OS.get_cmdline_user_args() + for index in range(args.size() - 1): + match args[index]: + "--output": output_path = args[index + 1] + "--warmup": warmup_frames = int(args[index + 1]) + "--frames": measured_frames = int(args[index + 1]) + "--repetitions": repeat_count = int(args[index + 1]) + var graph = JSON.parse_string(FileAccess.get_file_as_string("res://benchmark_input.json")) + var ids = JSON.parse_string(FileAccess.get_file_as_string("res://benchmark_idmap.json")) + var data = read_file("res://patterns.txt") + if data["nodes"].size() != graph["vertices"].size() or data["edges"].size() != graph["hyperedges"].size(): + push_error("Parser changed canonical node/group counts") + get_tree().quit(3) + return + for i in range(graph["hyperedges"].size()): + var expected: Array = [] + for member in graph["hyperedges"][i]["vertices"]: + expected.append(ids[member]) + expected.sort() + var actual: Array = Array(data["edges"][i]["nodes"]) + actual.sort() + if actual != expected: + push_error("Parser changed memberships for group " + str(i)) + get_tree().quit(3) + return + create_nodes(data["nodes"]) + populate_edge_data(data) + if get_tree().get_nodes_in_group("edges").size() != graph["hyperedges"].size(): + push_error("Renderer omitted hyperedges") + get_tree().quit(3) + return + exact_memberships = true + var low = Vector2(INF, INF) + var high = Vector2(-INF, -INF) + for vertex in graph["vertices"]: + var p = vertex["attrs"]["position"] + var point = Vector2(float(p[0]), float(p[1])) + get_node(ids[vertex["id"]]).position = point + low = low.min(point) + high = high.max(point) + calculate_centrality_and_resize_nodes(data) + for item in get_children(): + if item.has_method("mark_dirty"): + item.mark_dirty() + center = (low + high) * 0.5 + base_zoom = min(1920.0 / (high.x - low.x + 200.0), 1080.0 / (high.y - low.y + 200.0)) * 0.8 + benchmark_camera = Camera2D.new() + add_child(benchmark_camera) + benchmark_camera.position = center + benchmark_camera.zoom = Vector2.ONE * base_zoom + benchmark_camera.make_current() + DisplayServer.window_set_size(Vector2i(1920, 1080)) + DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED) + startup_ms = float(Time.get_ticks_usec() - started) / 1000.0 + previous_usec = Time.get_ticks_usec() + +func _process(_delta): + var now = Time.get_ticks_usec() + if frame_index >= warmup_frames: + samples.append(float(now - previous_usec) / 1000.0) + previous_usec = now + # Camera animation changes presentation without recomputing membership hulls. + var t = float(frame_index) * 0.015 + benchmark_camera.position = center + Vector2(sin(t) * 30.0, cos(t) * 20.0) + benchmark_camera.zoom = Vector2.ONE * base_zoom * (1.0 + sin(t * 0.4) * 0.08) + frame_index += 1 + if samples.size() >= measured_frames: + repetitions.append({"repetition": repetition, "frame_ms": samples.duplicate()}) + repetition += 1 + samples.clear() + frame_index = 0 + if repetition >= repeat_count: + finish_benchmark() + +func finish_benchmark(): + var manifest = JSON.parse_string(FileAccess.get_file_as_string("res://benchmark_manifest.json")) + manifest["godot_version"] = Engine.get_version_info() + manifest["renderer"] = RenderingServer.get_current_rendering_method() + manifest["renderer_driver"] = RenderingServer.get_current_rendering_driver_name() + var window_size = DisplayServer.window_get_size() + var screen_size = DisplayServer.screen_get_size() + manifest["window_size"] = [window_size.x, window_size.y] + manifest["screen_size"] = [screen_size.x, screen_size.y] + manifest["window_mode"] = DisplayServer.window_get_mode() + var viewport_size = get_viewport_rect().size + manifest["viewport_size"] = [viewport_size.x, viewport_size.y] + var render_size = get_viewport().get_texture().get_size() + manifest["render_target_size"] = [render_size.x, render_size.y] + manifest["matched_requested_viewport"] = render_size == Vector2(1920, 1080) + manifest["adaptations"].append("stock HiDPI enabled; physical viewport verified") + manifest["screen_scale"] = DisplayServer.screen_get_scale() + manifest["screen_dpi"] = DisplayServer.screen_get_dpi() + manifest["allow_hidpi"] = ProjectSettings.get_setting("display/window/dpi/allow_hidpi", true) + manifest["warmup_frames"] = warmup_frames + manifest["measured_frames"] = measured_frames + manifest["startup_construction_ms"] = startup_ms + manifest["exact_parser_memberships_and_rendered_group_count"] = exact_memberships + manifest["color_seed"] = 20261003 + manifest["repetitions"] = repetitions + var output = FileAccess.open(output_path, FileAccess.WRITE) + if output == null: + push_error("Cannot write benchmark output: " + output_path) + get_tree().quit(2) + return + output.store_string(JSON.stringify(manifest, "\t")) + output.close() + get_tree().quit() diff --git a/scripts/benchmarks/desktop/prepare_graphia.py b/scripts/benchmarks/desktop/prepare_graphia.py new file mode 100644 index 0000000..662aecd --- /dev/null +++ b/scripts/benchmarks/desktop/prepare_graphia.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python3 +"""Export a lossless incidence GraphML and stock Graphia headless parameters.""" +import argparse +import hashlib +import json +from pathlib import Path +import sys +import xml.etree.ElementTree as ET + +sys.path.insert(0, str(Path(__file__).resolve().parents[1])) +from datasets import incidence + +def prepare(dataset, directory): + graph = json.loads(dataset.read_text()) + projected = incidence(graph) + ns = 'http://graphml.graphdrawing.org/xmlns' + ET.register_namespace('', ns) + root = ET.Element(f'{{{ns}}}graphml') + for key in ['role', 'original_id', 'attrs', 'x', 'y', 'z']: + ET.SubElement(root, f'{{{ns}}}key', {'id': key, 'for': 'node', 'attr.name': key, 'attr.type': 'string'}) + g = ET.SubElement(root, f'{{{ns}}}graph', {'id': 'incidence', 'edgedefault': 'undirected'}) + for item in projected['nodes']: + node = ET.SubElement(g, f'{{{ns}}}node', {'id': item['id']}) + ET.SubElement(node, f'{{{ns}}}desc').text = item['id'] + for key in ['role', 'original_id', 'attrs', 'x', 'y', 'z']: + ET.SubElement(node, f'{{{ns}}}data', {'key': key}).text = json.dumps(item[key], ensure_ascii=False) + for link in projected['links']: + ET.SubElement(g, f'{{{ns}}}edge', {'id': link['id'], 'source': link['source'], 'target': link['target']}) + directory.mkdir(parents=True, exist_ok=True) + name = dataset.stem + target = directory / f'{name}.graphml' + ET.ElementTree(root).write(target, encoding='utf-8', xml_declaration=True) + params = directory / f'{name}.parameters.json' + params.write_text(json.dumps({'type': 'GraphML', 'destination': str((directory / f'{name}.graphia').resolve()), 'plugin': {'name': 'Generic', 'parameters': {}}}, indent=2)) + manifest = {'tool': 'Graphia', 'version': '5.5', 'commit': 'b8ad51e820192a6f22ab310ebd84282384327c10', 'dataset_sha256': hashlib.sha256(dataset.read_bytes()).hexdigest(), 'nodes': len(projected['nodes']), 'links': len(projected['links']), 'adaptation': 'incidence projection; isolated vertices and empty hyperedges retained as standalone nodes', 'coordinate_limit': 'XYZ stored as attributes; stock GraphML parser does not establish common-coordinate layout', 'metric': 'headless load/save wall time includes startup and processing, not render frame time'} + (directory / f'{name}.manifest.json').write_text(json.dumps(manifest, indent=2)) + print(json.dumps({'graphml': str(target.resolve()), 'parameters': str(params.resolve()), 'manifest': manifest})) + +if __name__ == '__main__': + p = argparse.ArgumentParser() + p.add_argument('--dataset', type=Path, required=True) + p.add_argument('--output', type=Path, required=True) + a = p.parse_args() + prepare(a.dataset, a.output) diff --git a/scripts/benchmarks/desktop/prepare_hypergodot.py b/scripts/benchmarks/desktop/prepare_hypergodot.py new file mode 100644 index 0000000..11019c6 --- /dev/null +++ b/scripts/benchmarks/desktop/prepare_hypergodot.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python3 +"""Prepare a disposable copy of pinned HyperGodot, without running it.""" +import argparse +import hashlib +import json +from pathlib import Path +import shutil +import subprocess + +HERE = Path(__file__).resolve().parent + +def prepare(source, dataset, destination): + graph = json.loads(dataset.read_text()) + ids = {v['id'] for v in graph['vertices']} + members = {v for e in graph['hyperedges'] for v in e['vertices']} + if ids != members or any(not e['vertices'] for e in graph['hyperedges']): + raise ValueError('Stock HyperGodot cannot represent isolated vertices or empty hyperedges; use a compatible dataset, not silent omission.') + if any(len(e['vertices']) != len(set(e['vertices'])) for e in graph['hyperedges']): + raise ValueError('Duplicate memberships require an explicit normalization policy.') + if any(set(e['vertices']) - ids for e in graph['hyperedges']): + raise ValueError('Unknown member ID') + if destination.exists(): + raise ValueError('Destination already exists; choose a fresh disposable copy.') + shutil.copytree(source, destination, ignore=shutil.ignore_patterns('.git', '.godot', 'Export', '.import')) + project = destination / 'project.godot' + project.write_text(project.read_text().replace('MaterialIconsDB="*res://addons/material-design-icons/icons/icons.gd"\n', '').replace('[display]\n', '[display]\n\nwindow/dpi/allow_hidpi=true\n')) + mapping = {v['id']: f'n{i}' for i, v in enumerate(graph['vertices'])} + # Safe token IDs preserve a reversible mapping even for IDs with spaces. + text = ''.join(' '.join(mapping[v] for v in e['vertices']) + ' #WEIGHT: 1 #GROUP baseline\n' for e in graph['hyperedges']) + (destination / 'patterns.txt').write_text(text) + (destination / 'benchmark_input.json').write_text(json.dumps(graph)) + (destination / 'benchmark_idmap.json').write_text(json.dumps(mapping)) + shutil.copy2(HERE / 'hypergodot_scene.gd', destination / 'benchmark_scene.gd') + shutil.copy2(HERE / 'hypergodot_runner.gd', destination / 'benchmark_runner.gd') + manifest = {'tool': 'HyperGodot', 'source_commit': subprocess.check_output(['git', '-C', str(source), 'rev-parse', 'HEAD'], text=True).strip(), + 'dataset': str(dataset.resolve()), 'sha256': hashlib.sha256(dataset.read_bytes()).hexdigest(), + 'vertices': len(ids), 'hyperedges': len(graph['hyperedges']), 'memberships': sum(len(e['vertices']) for e in graph['hyperedges']), + 'adaptations': ['remove missing unused MaterialIconsDB autoload', 'reversible safe token IDs and line-order hyperedge IDs', 'unit weights and one baseline group', 'fixed XY projection of canonical 3D positions', 'override startup layout; production read_file/create_nodes/populate_edge_data/drawing', 'scripted camera and wall-clock process-boundary frame intervals'], + 'node_radius': 30, 'edge_width': 1, 'point_count': 4, 'vsync': 'disabled by upstream project', 'metric': 'wall-clock frame intervals, not GPU timestamps'} + (destination / 'benchmark_manifest.json').write_text(json.dumps(manifest, indent=2)) + print(json.dumps({'project': str(destination.resolve()), 'manifest': manifest})) + +if __name__ == '__main__': + p = argparse.ArgumentParser() + p.add_argument('--source', type=Path, default=Path('/tmp/hyper-benchmark-competitors/hypergodot')) + p.add_argument('--dataset', type=Path, required=True) + p.add_argument('--destination', type=Path, required=True) + a = p.parse_args() + prepare(a.source, a.dataset, a.destination) diff --git a/scripts/benchmarks/desktop/run.py b/scripts/benchmarks/desktop/run.py new file mode 100644 index 0000000..cd797be --- /dev/null +++ b/scripts/benchmarks/desktop/run.py @@ -0,0 +1,132 @@ +#!/usr/bin/env python3 +"""Run installed desktop competitors sequentially, with bounded subprocesses.""" +import argparse +from collections import Counter +import gzip +import hashlib +import json +import math +import os +from pathlib import Path +import random +import re +import signal +import subprocess +import sys +import time + +sys.path.insert(0, str(Path(__file__).resolve().parents[1])) +from datasets import incidence +from prepare_graphia import prepare + + +def execute(command, timeout): + started = time.perf_counter() + process = subprocess.Popen(['/usr/bin/time', '-l', *command], stdout=subprocess.PIPE, + stderr=subprocess.PIPE, text=True, start_new_session=True) + try: + stdout, stderr = process.communicate(timeout=timeout) + status = 'ok' if process.returncode == 0 else 'failed' + except subprocess.TimeoutExpired: + os.killpg(process.pid, signal.SIGKILL) + stdout, stderr = process.communicate() + status = 'watchdog_timeout' + rss = re.search(r'(\d+)\s+maximum resident set size', stderr) + return {'status': status, 'returncode': process.returncode, + 'process_wall_seconds': time.perf_counter() - started, + 'process_peak_rss_bytes': int(rss.group(1)) if rss else None, + 'stdout': stdout[-3000:], 'stderr': stderr[-12000:]} + + +def validate_graphia(path, graph): + saved = json.loads(gzip.open(path, 'rb').read()) + assert saved[0]['appVersion'] == '5.5', 'Graphia version differs from pinned run' + document = saved[1] + names = {str(n['id']): n['value'] for n in document['nodeNames']} + expected = incidence(graph) + assert len(names) == len(expected['nodes']) + assert len(set(names.values())) == len(names) + assert set(names.values()) == {n['id'] for n in expected['nodes']} + pairs = Counter((names[e['source']], names[e['target']]) for e in document['graph']['edges']) + assert pairs == Counter((e['source'], e['target']) for e in expected['links']) + data = document['userNodeData'] + columns = {key: value['values'] for vector in data['vectors'] for key, value in vector.items()} + decoded = {names[str(native_id)]: {key: json.loads(columns[key][i]) for key in ('role', 'original_id', 'attrs')} + for i, native_id in enumerate(data['ids'])} + assert decoded == {n['id']: {key: n[key] for key in ('role', 'original_id', 'attrs')} for n in expected['nodes']} + by_id = {n['id']: n for n in expected['nodes']} + for i, native_id in enumerate(data['ids']): + for axis in ('x', 'y', 'z'): + assert math.isclose(float(columns[axis][i]), by_id[names[str(native_id)]][axis], rel_tol=1e-9, abs_tol=1e-6) + return {'exact_incidence_and_node_attributes': True, + 'document_metadata_retained': False, + 'typed_native_display_fields_retained': False, + 'saved_as_directed': document['graph']['directed'], + 'coordinates_are_attributes_not_layout': True, + 'coordinate_attributes_retained': True, + 'vertices_and_hubs': len(names), 'memberships': sum(pairs.values())} + + +def main(args): + output = args.output.resolve() + output.mkdir(parents=True, exist_ok=True) + rows = [] + if args.tool == 'graphia': + sources = {} + for dataset in args.datasets.split(','): + source = Path('target/benchmark/datasets') / (dataset + '.json') + prepare(source, output / 'inputs') + sources[dataset] = (source, json.loads(source.read_text())) + schedule = [] + rng = random.Random(20261003) + for repetition in range(-1, 5): + batch = list(sources) + rng.shuffle(batch) + schedule.extend((repetition, dataset) for dataset in batch) + for repetition, dataset in schedule: + source, graph = sources[dataset] + saved = output / 'inputs' / (dataset + '.graphia') + saved.unlink(missing_ok=True) + row = execute([args.executable, '--parameters', str(output / 'inputs' / (dataset + '.parameters.json')), + str(output / 'inputs' / (dataset + '.graphml'))], args.timeout) + row.update(tool='Graphia', dataset=dataset, repetition=repetition, warmup=repetition == -1, + dataset_sha256=hashlib.sha256(source.read_bytes()).hexdigest()) + if row['status'] == 'ok': + try: + row['correctness'] = validate_graphia(saved, graph) + except Exception as error: + row.update(status='validation_failed', validation_error=repr(error)) + rows.append(row) + (output / 'raw.json').write_text(json.dumps(rows, indent=2) + '\n') + print('Graphia', dataset, repetition, row['status'], flush=True) + else: + saved = output / 'moderate.json' + saved.unlink(missing_ok=True) + row = execute([args.executable, '--path', str(args.project.resolve()), '--script', 'res://benchmark_runner.gd', + '--', '--output', str(saved), '--warmup', '120', '--frames', '300', '--repetitions', '5'], args.timeout) + row.update(tool='HyperGodot', dataset='moderate', warmup=False) + if row['status'] == 'ok' and saved.exists(): + row['measurements'] = json.loads(saved.read_text()) + elif row['status'] == 'ok': + row.update(status='failed', reason='Process exited without evidence JSON') + rows.append(row) + (output / 'raw.json').write_text(json.dumps(rows, indent=2) + '\n') + print('HyperGodot', row['status'], flush=True) + metadata = {'tool': args.tool, 'executable': args.executable, 'timeout_seconds': args.timeout, + 'executable_sha256': hashlib.sha256(Path(args.executable).read_bytes()).hexdigest(), + 'conditions': os.environ.get('BENCHMARK_CONDITIONS', 'unrecorded'), + 'peak_memory': 'macOS /usr/bin/time -l whole-process RSS high-water in bytes', + 'fresh_process_per_repetition': args.tool == 'graphia', + 'repetitions': 5, 'seed': 20261003} + (output / 'metadata.json').write_text(json.dumps(metadata, indent=2) + '\n') + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('tool', choices=['graphia', 'hypergodot']) + parser.add_argument('--executable', required=True) + parser.add_argument('--project', type=Path) + parser.add_argument('--datasets', default='moderate,scientific,mathlib') + parser.add_argument('--output', type=Path, required=True) + parser.add_argument('--timeout', type=int, default=180) + main(parser.parse_args()) diff --git a/scripts/benchmarks/report.py b/scripts/benchmarks/report.py new file mode 100644 index 0000000..bcb6eee --- /dev/null +++ b/scripts/benchmarks/report.py @@ -0,0 +1,124 @@ +#!/usr/bin/env python3 +"""Render comparison tables from measured summaries, retaining failure counts.""" +import argparse +import json +from pathlib import Path + + +def number(value, digits=2): + return '—' if value is None else f'{value:,.{digits}f}' + + +def table(lines, headings, rows): + lines += ['| ' + ' | '.join(headings) + ' |', '|' + '|'.join(['---'] * len(headings)) + '|'] + lines += ['| ' + ' | '.join(str(value) for value in row) + ' |' for row in rows] + lines.append('') + + +def render(rows): + lines = ['# Measured ecosystem comparison — October 3, 2026', '', + f'Exploratory results on an Apple M5 Pro / 24 GiB Mac: {sum(r["attempts"] for r in rows)} measured attempts across {len(rows)} configurations. Five attempts per case unless noted. ' + 'The same graph records and seeded coordinates are used through explicit adapters. ' + 'Scientific figures, 2D browser views and 3D native rendering have different work and are separate tracks.', '', + 'Read the [method and limitations](methodology.md), [environment](environment.json), ' + '[complete CSV](summary.csv), [structured summary](summary.json) and [raw evidence](evidence/). ' + 'The [harness guide](../../../scripts/benchmarks/README.md) provides pinned dependencies and rerun commands.', '', + '## Findings to use for roadmap decisions', '', + 'Model fidelity is the clearest differentiator in this run: exact group identity, isolated nodes and empty groups need explicit checks at adapter boundaries. ' + 'Rendering results are conditional on completion. Hyper had intermittent whole-job stalls, including one on a small fixture; their cause remains unresolved. ' + 'The source audit found a quadratic hub-status lookup worth profiling, but it has not isolated the cause of those stalls.', '', + 'Sigma camera measurements use its public cached redraw path. Earlier full-refresh camera measurements were discarded and replaced; ' + 'the diagnostic evidence is retained separately. Comparisons below keep representations and timing boundaries explicit.', '', + '## Scientific figure workflows', '', + 'Times exclude the separately measured top-level tool import, file I/O and JSON parsing. Setup creates the artists and includes any lazy drawing-module initialization; raster draws the Agg canvas. ' + 'PNG compression is a separate stage. A 120-second timeout covers the whole worker. ' + 'HGX uses its stock 12-round smoothing, HNX rubber-band outlines, XGI convex hulls.', ''] + scientific = [r for r in rows if r['track'] == 'scientific' and r['mode'] == 'plot' and r['dataset'] != 'correctness'] + table(lines, ['Dataset', 'Tool', 'Completed / attempts', 'Exact model records', 'Construct ms', 'Artist setup ms', 'Raster ms', 'PNG ms', 'Worker peak MiB'], + [[r['dataset'], r['tool'], f"{r['successful_runs']}/{r['attempts']}", 'yes' if r['exact_model_records'] else 'no / unavailable', + *[number(r.get(k)) for k in ['adapter_construct_ms','artist_setup_ms','agg_raster_draw_ms','png_export_ms','peak_rss_mib_median']]] for r in scientific]) + lines += ['XGI preserves all model records in every tested input. HNX omits isolated vertices and empty groups. ' + 'HGX identifies groups by member tuple and merges parallel groups: Diseasome becomes 481 groups instead of 903, ' + 'and the arity-1,000 fixture becomes one group instead of 200. Its lossy timings cannot rank equivalent work. ' + 'Original records stored in opaque metadata do not repair those native identities.', '', + '## Browser incidence rendering', '', + 'All incidences are rendered, forces and labels are off, and the camera moves. Values describe rAF callback cadence; ' + 'they are not GPU durations or verified presented frames. Average callbacks/s uses total elapsed intervals. ' + 'The p95 range spans per-run p95 values. “Completed” requires sampling and the shared update to finish within the 90-second job budget.', ''] + browser = [r for r in rows if r['track'] == 'browser'] + table(lines, ['Dataset', 'Tool', 'Completed / attempts', 'p50 ms', 'p95 ms', 'p95 run range ms', 'Avg callbacks/s', 'Update command ms', 'Failed stage'], + [[r['dataset'], r['tool'], f"{r['successful_runs']}/{r['attempts']}", number(r.get('frame_p50_ms')), number(r.get('frame_p95_ms')), + f"{number(r.get('frame_p95_run_min_ms'))}–{number(r.get('frame_p95_run_max_ms'))}", number(r.get('average_fps')), + number(r.get('update_commit_ms')), ', '.join(r.get('failure_stages',[])) or '—'] for r in browser]) + lines += ['Sigma uses WebGL 2D, Cytoscape uses Canvas2D, and 3d-force-graph uses perspective spheres and WebGL. ' + 'The corrected Sigma block and original Cytoscape block recorded different small-case callback cadences (roughly 60 versus 120 callbacks/s); display refresh was not locked, so their rate ratio cannot rank rendering efficiency. No link sampling is applied. Update command timings include different adapter commit strategies and sometimes unchanged-record work; see the method. A failed batch has no completed rendering score; its timeout is not a single-frame measurement.', '', + '## Hyper native renderer', '', + 'Physical 1920 × 1080, AutoVsync, 120 warmup and 300 recorded application frames. ' + 'HUD and picking remain installed. Basic modes disable labels; `native-interactive` enables the default Capped policy (count threshold 250, with selected/hovered exemptions). ' + 'Frozen modes use fixed coordinates; live modes perform one layout step per frame. ' + 'All lines are enabled. Hulls cap input at 24 vertices and therefore approximate large groups.', ''] + native = [r for r in rows if r['track'].startswith('native')] + table(lines, ['Track / dataset', 'Mode', 'Completed / attempts', 'p50 app interval ms', 'p95 app interval ms', 'p95 run range ms', 'Avg app frames/s', 'Update commit ms', 'Next app interval ms', 'Peak MiB'], + [[r['track'] + ' / ' + r['dataset'], r['mode'], f"{r['successful_runs']}/{r['attempts']}", + number(r.get('frame_p50_ms')), number(r.get('frame_p95_ms')), + f"{number(r.get('frame_p95_run_min_ms'))}–{number(r.get('frame_p95_run_max_ms'))}", + *[number(r.get(k)) for k in ['average_fps','update_commit_ms','update_next_frame_ms','peak_rss_mib_median']]] for r in native]) + lines += ['`native` is bipartite incidence rendering; `native-star` and `native-interactive` use group/star rendering. ' + 'Star draws pair lines for dyadic groups and hulls for larger groups; its scene has no spring links. Star without hulls is an ablation that hides larger groups, not a full-group rendering score. ' + 'Update commit and the next application interval exclude file-watch polling and parse/I/O; they are not input-to-visible latency. ' + 'Native and browser settings, geometry and vsync differ, so these tables do not establish a native-versus-browser speed ratio.', '', + '## Hyper parsing, conversion and geometry', '', + 'Fresh release processes, one discarded warmup and five measured runs. HIF schema validation is offline. ' + 'Solver timings use the bipartite scene; hull timings use the production 24-vertex cap. ' + 'Worker RSS includes multiple retained documents for correctness checks.', ''] + core = [r for r in rows if r['track'] == 'core'] + table(lines, ['Dataset', 'Native parse ms', 'HIF parse / validate ms', 'HIF conversion ms', 'Projection ms', 'All hulls CPU ms', 'Layout step p50 ms', 'Peak MiB'], + [[r['dataset'], *[number(r.get(k)) for k in ['native_parse_ms','hif_parse_validate_ms','hif_viewer_conversion_ms','bipartite_projection_ms','all_hulls_cpu_ms','layout_step_p50_ms','peak_rss_mib_median']]] for r in core]) + lines += ['## Desktop alternatives', '', + 'Graphia measures stock headless import/save including process startup, then independently checks saved memberships and node attributes. ' + 'The adapter retains incidence topology and arbitrary `attrs`, but omits document metadata and top-level native label/kind/status/weight fields; XYZ are attributes, and Graphia saves this graph as directed. ' + 'These are import workflow timings, not rendering FPS.', ''] + table(lines, ['Dataset', 'Tool', 'Completed / attempts', 'Import + save ms', 'Exact incidence records', 'Peak MiB'], + [[r['dataset'],r['tool'],f"{r['successful_runs']}/{r['attempts']}",number(r.get('import_save_wall_ms')), + 'yes' if r['exact_incidence_records'] else 'no / unavailable',number(r.get('peak_rss_mib_median'))] + for r in rows if r['track']=='desktop-import']) + lines += ['HyperGodot measures its production 2D group drawing with camera motion, fixed XY coordinates and stock labels/UI. ' + 'It disables vsync and uses different node/hull geometry. Its five repetitions share one process, with a new warmup each. ' + 'A disposable source copy removes a missing unused autoload. Original IDs are mapped to safe tokens/line-order group IDs; ' + 'weights and group categories are normalized for this fixture. Stock HiDPI is enabled and the physical render texture is verified at 1920 × 1080; earlier clamped-window timings are excluded.', ''] + table(lines, ['Dataset', 'Tool', 'Completed / attempts', 'p50 ms', 'p95 ms', 'Avg frames/s', 'Whole-session peak MiB', 'Render target pixels'], + [[r['dataset'],r['tool'],f"{r['successful_runs']}/{r['attempts']}",number(r.get('frame_p50_ms')),number(r.get('frame_p95_ms')), + number(r.get('average_fps')),number(r.get('whole_session_peak_rss_mib')),r.get('render_target_size')] + for r in rows if r['track']=='desktop-group']) + lines += ['## Coverage and remaining experiments', ''] + table(lines, ['Alternative', 'Measured scope / reason for no comparable score'], [ + ['HyperNetX, XGI, Hypergraphx','Model construction and scientific figure workflow; no GUI FPS claim'], + ['3d-force-graph, Cytoscape.js, Sigma','Frozen full-incidence camera motion and scripted update'], + ['HyperGodot','Native 2D group drawing on the moderate dataset'], + ['Graphia','Headless incidence import/save; common render coordinates not established'], + ['HNX Widget','Installation and dictionary-input smoke test; public position API does not freeze all hubs; isolated vertices omitted'], + ['HGPolyVis','Supplied Windows-only executable; requires a Windows run'], + ['SimpleHypergraphs.jl','Julia runtime verified; package timings not collected'], + ['PAOHVis','Needs a temporal dataset and temporal exploration task'], + ['Gephi','Outside this automated render harness; requires a separate plugin/task comparison'], + ['egui_graphs','Embedding framework reference; no matched application benchmark']]) + lines += ['Human task accuracy, dense-diagram readability, layout convergence, GPU completion, input-to-visible latency and ' + 'other machines remain unmeasured. Metadata retention does not establish that a viewer exposes or filters it.', '', + '## Roadmap implications', '', + '1. **Interoperability:** keep original HIF documents and stable group identities through scientific workflows. ' + 'The identity-loss cases demonstrate why an incidence adapter needs correctness gates before timing.', + '2. **Inspection and filtering:** expose provenance, arbitrary attributes and membership before expanding visual effects. ' + 'Rendering every relation does not establish readability or a successful scientific task.', + '3. **Responsiveness:** profile the confirmed quadratic hub-status scan in `animation::node_motion` first; the existing `GraphLayout::hub_status` cache offers a direct replacement. Then use the frozen/live split and update traces to separate solver, hull rebuild/upload and redraw costs. ' + 'Add a controlled input-to-visible study before advertising latency; keep hull approximation and line budgets explicit.', + '4. **Installation:** ship verified wheels and a clear separately installed viewer path. The widget and desktop packaging probes ' + 'show that dependency/version friction can block evaluation before performance matters.', '', + 'These priorities are interpretations of this exploratory run, not proof of adoption or a universal winner.', ''] + return '\n'.join(lines) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--directory', type=Path, default=Path('docs/benchmarks/ecosystem-2026-10-03')) + args = parser.parse_args() + (args.directory / 'README.md').write_text(render(json.loads((args.directory / 'summary.json').read_text()))) diff --git a/scripts/benchmarks/restore_evidence.py b/scripts/benchmarks/restore_evidence.py new file mode 100644 index 0000000..b78ed13 --- /dev/null +++ b/scripts/benchmarks/restore_evidence.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python3 +"""Restore archived observations for aggregation, without running benchmarks.""" +import argparse +import gzip +from pathlib import Path + +FILES = { + 'core/raw.json': 'core-raw.json', + 'native/raw.json': 'native-raw.json.gz', + 'native-star/raw.json': 'native-star-raw.json.gz', + 'native-interactive/raw.json': 'native-interactive-raw.json.gz', + 'science/final-raw.json': 'scientific-raw.json', + 'browser-final/results.json': 'browser-final-results.json.gz', + 'graphia/raw.json': 'graphia-raw.json', + 'hypergodot/raw.json': 'hypergodot-raw.json', +} + + +def restore(source, destination): + if destination.exists() and any(destination.iterdir()): + raise ValueError('Choose an empty destination to avoid replacing local runs.') + payloads = {} + for target, name in FILES.items(): + raw = (source / name).read_bytes() + payloads[target] = gzip.decompress(raw) if name.endswith('.gz') else raw + for target, payload in payloads.items(): + path = destination / target + path.parent.mkdir(parents=True,exist_ok=True) + path.write_bytes(payload) + print('Restored',len(payloads),'observation files to',destination) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--evidence',type=Path,default=Path('docs/benchmarks/ecosystem-2026-10-03/evidence')) + parser.add_argument('--output',type=Path,default=Path('target/benchmark/restored-evidence')) + args = parser.parse_args() + restore(args.evidence,args.output) diff --git a/scripts/benchmarks/run_local.py b/scripts/benchmarks/run_local.py new file mode 100644 index 0000000..a5f0b5a --- /dev/null +++ b/scripts/benchmarks/run_local.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python3 +"""Sequential fresh-process Hyper benchmarks; never overlap with other tracks.""" +import argparse +import hashlib +import json +import os +from pathlib import Path +import random +import re +import signal +import subprocess +import time + +def run(args): + output = Path(args.output) + output.mkdir(parents=True, exist_ok=True) + datasets = args.datasets.split(',') + rng = random.Random(20261003) + if args.track == 'core': + specs = [(name, False, False) for name in datasets] + else: + specs = [(name, hulls, False) for name in datasets for hulls in (False, True)] + specs += [(name, hulls, True) for name in args.live_datasets.split(',') if name in datasets for hulls in (False, True)] + if args.only_hulls: specs = [spec for spec in specs if spec[1]] + schedule = [] + for repetition in range(-1 if args.track == 'core' else 0, 5): + batch = list(specs) + rng.shuffle(batch) + schedule += [(repetition, *item) for item in batch] + rows = [] + for order, (repetition, dataset, hulls, live) in enumerate(schedule): + raw = output / f'{dataset}-hulls{int(hulls)}-live{int(live)}-{repetition}.json' + source = Path('target/benchmark/datasets') / (dataset + '.json') + executable = 'target/release/examples/ecosystem_core' if args.track == 'core' else 'target/release/ecosystem-benchmark' + command = ['/usr/bin/time', '-l', executable, str(source), str(raw)] + if args.track == 'native': + command += [str(int(hulls)), str(int(live)), '300', '-', args.projection, str(int(args.labels))] + started = time.time() + row = {'dataset': dataset, 'hulls': hulls, 'live': live, 'repetition': repetition, 'warmup': repetition == -1, 'order': order, 'started_unix': started, 'sha256': hashlib.sha256(source.read_bytes()).hexdigest()} + raw.unlink(missing_ok=True) + process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, start_new_session=True, env={**os.environ, 'HYPER_VIZ_SESSION': 'off'}) + try: + stdout, stderr = process.communicate(timeout=180) + row.update(status='ok' if process.returncode == 0 and raw.exists() else 'failed', returncode=process.returncode) + row['stderr'] = stderr[-12000:] + rss = re.search(r'(\d+)\s+maximum resident set size', stderr) + row['process_peak_rss_bytes'] = int(rss.group(1)) if rss else None + if raw.exists(): + row['measurements'] = json.loads(raw.read_text()) + except subprocess.TimeoutExpired: + os.killpg(process.pid, signal.SIGKILL) + stdout, stderr = process.communicate() + row.update(status='watchdog_timeout', timeout_seconds=180) + row['stderr'] = stderr[-12000:] + row['process_wall_seconds'] = time.time() - started + rows.append(row) + (output / 'raw.json').write_text(json.dumps(rows, indent=2) + '\n') + print(args.track, order + 1, '/', len(schedule), dataset, 'hulls', int(hulls), 'live', int(live), repetition, row['status'], flush=True) + metadata = {'track': args.track, 'seed': 20261003, 'repetitions': 5, 'fresh_process_per_run': True, 'warmup': '5 solver steps plus1 discarded run per dataset' if args.track == 'core' else '120 render frames per run', 'schedule': schedule, 'commit': subprocess.check_output(['git', 'rev-parse', 'HEAD'], text=True).strip(), 'binary_sha256': hashlib.sha256(Path(executable).read_bytes()).hexdigest(), 'conditions': os.environ.get('BENCHMARK_CONDITIONS', 'unrecorded'), 'peak_memory': '/usr/bin/time -l process RSS high-water; bytes on macOS; includes startup', 'build_profile': 'release'} + metadata.update(projection=args.projection, labels=args.labels, only_hulls=args.only_hulls, + live_datasets=args.live_datasets.split(',')) + (output / 'metadata.json').write_text(json.dumps(metadata, indent=2) + '\n') + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('track', choices=['core', 'native']) + parser.add_argument('--datasets', default='moderate,large,high-arity-10,high-arity-100,high-arity-1000,scientific,mathlib') + parser.add_argument('--output', required=True) + parser.add_argument('--projection', choices=['bipartite','star'], default='bipartite') + parser.add_argument('--live-datasets', default='moderate') + parser.add_argument('--labels', action='store_true') + parser.add_argument('--only-hulls', action='store_true') + run(parser.parse_args()) diff --git a/scripts/benchmarks/scientific.py b/scripts/benchmarks/scientific.py new file mode 100644 index 0000000..05250d0 --- /dev/null +++ b/scripts/benchmarks/scientific.py @@ -0,0 +1,297 @@ +#!/usr/bin/env python3 +"""Isolated scientific figure benchmark; canonical native JSON, never layout/FPS. + +Install PINNED in a dedicated Python 3.12 environment. --validate performs one +untimed fixture per tool. Batch mode requires --run; parent controls contention. +Each observation is a new process; imports/startup and correctness are excluded +from named stage timings, but included in process high-water RSS. PNG compression +uses an already rasterized RGBA buffer, so export does not redraw the figure. +""" +import argparse +import csv +import hashlib +import importlib.metadata +import json +import os +from pathlib import Path +import platform +import random +import resource +import subprocess +import sys +import time +import traceback + +PINNED = {'hypernetx': '2.4.3', 'xgi': '0.10.2', 'hypergraphx': '1.8.0', + 'matplotlib': '3.11.2', 'pillow': '12.3.0'} +TOOLS = ['hypernetx', 'xgi', 'hypergraphx'] +SOURCES = { + 'hypernetx': 'https://hypernetx.readthedocs.io/en/latest/classes/classes.html', + 'xgi': 'https://xgi.readthedocs.io/en/stable/api/core/xgi.core.hypergraph.Hypergraph.html', + 'hypergraphx': 'https://hypergraphx.readthedocs.io/en/latest/api/hypergraphx.core.html', +} + +def canonical(data): + nodes = {v['id']: v for v in data['vertices']} + edges = {e['id']: e for e in data['hyperedges']} + if len(nodes) != len(data['vertices']) or len(edges) != len(data['hyperedges']): + raise ValueError('Duplicate record IDs') + node_ids = set(nodes) + for e in edges.values(): + if len(set(e['vertices'])) != len(e['vertices']): + raise ValueError('Duplicate incidence in ' + e['id']) + if set(e['vertices']) - node_ids: + raise ValueError('Unknown member ID in ' + e['id']) + return nodes, edges + + +def construct(tool, data, records=None): + nodes, edges = records if records is not None else canonical(data) + if tool == 'hypernetx': + import hypernetx as hnx + graph = hnx.Hypergraph({k: e['vertices'] for k, e in edges.items()}, + node_properties={k: {'canonical': v} for k, v in nodes.items()}, + edge_properties={k: {'canonical': e} for k, e in edges.items()}) + graph.benchmark_meta = data.get('meta', {}) + elif tool == 'xgi': + import xgi + graph = xgi.Hypergraph() + graph['canonical_meta'] = data.get('meta', {}) + for k, v in nodes.items(): + graph.add_node(k, canonical=v) + for k, e in edges.items(): + # Use the public bulk API; actual empty-edge support is checked below. + graph.add_edges_from([(e['vertices'], k, {'canonical': e})]) + else: + from hypergraphx import Hypergraph + graph = Hypergraph(weighted=False, hypergraph_metadata={'canonical_meta': data.get('meta', {})}) + for k, v in nodes.items(): + graph.add_node(k, metadata={'canonical': v}) + for e in edges.values(): + graph.add_edge(tuple(set(e['vertices'])), metadata={'canonical': e}) + return graph + + +def check(tool, graph, data): + nodes, edges = canonical(data) + actual_nodes, actual_edges, node_meta, edge_meta = set(), {}, {}, {} + if tool == 'hypernetx': + actual_nodes = set(graph.nodes) + actual_edges = {k: set(v) for k, v in graph.incidence_dict.items()} + # Element .properties recursively flattens nested dictionaries; the + # public DataFrame view retains the original opaque JSON shape. + node_props, edge_props = graph.nodes.to_dataframe, graph.edges.to_dataframe + node_meta = {k: node_props.loc[k, 'misc_properties'].get('canonical') for k in actual_nodes} + edge_meta = {k: edge_props.loc[k, 'misc_properties'].get('canonical') for k in actual_edges} + meta = graph.benchmark_meta + elif tool == 'xgi': + actual_nodes = set(graph.nodes) + actual_edges = {k: set(graph.edges.members(k)) for k in graph.edges} + node_meta = {k: graph.nodes[k].get('canonical') for k in actual_nodes} + edge_meta = {k: graph.edges[k].get('canonical') for k in actual_edges} + meta = graph['canonical_meta'] + else: + actual_nodes = set(graph.get_nodes()) + node_meta = {k: graph.get_node_metadata(k).get('canonical') for k in actual_nodes} + for members in graph.get_edges(): + record = graph.get_edge_metadata(members).get('canonical', {}) + # HGX merges duplicate-edge metadata into lists. Recover opaque + # records while separately reporting the loss of native multiplicity. + for item in record if isinstance(record, list) else [record]: + key = item.get('id', repr(members)) + actual_edges[key] = set(members) + edge_meta[key] = item + meta = graph.get_hypergraph_metadata().get('canonical_meta') + missing_nodes = sorted(nodes.keys() - actual_nodes) + missing_edges = sorted(edges.keys() - actual_edges.keys()) + wrong_members = [k for k in edges.keys() & actual_edges.keys() + if set(edges[k]['vertices']) != actual_edges[k]] + bad_metadata = [k for k in nodes.keys() & actual_nodes if nodes[k] != node_meta[k]] + bad_metadata += [k for k in edges.keys() & actual_edges.keys() if edges[k] != edge_meta[k]] + extra_nodes = sorted(actual_nodes - nodes.keys()) + extra_edges = sorted(actual_edges.keys() - edges.keys()) + opaque_exact = not (missing_nodes or missing_edges or wrong_members or bad_metadata or extra_nodes or extra_edges) and meta == data.get('meta', {}) + native_edge_count = len(graph.get_edges()) if tool == 'hypergraphx' else len(actual_edges) + exact = opaque_exact and native_edge_count == len(edges) + return {'exact_canonical_roundtrip': exact, 'missing_nodes': missing_nodes, + 'opaque_record_values_preserved': opaque_exact, + 'native_hyperedge_count': native_edge_count, + 'native_multiplicity_preserved': native_edge_count == len(edges), + 'missing_edges': missing_edges, 'extra_nodes': extra_nodes, 'extra_edges': extra_edges, + 'wrong_memberships': wrong_members, 'wrong_metadata': bad_metadata, + 'graph_metadata_equal': meta == data.get('meta', {}), + 'native_edge_ids': tool != 'hypergraphx', + 'edge_id_storage': 'native IDs' if tool != 'hypergraphx' else 'canonical metadata; HGX uses member tuples', + 'empty_edges_expected': sum(not e['vertices'] for e in edges.values()), + 'isolated_nodes_expected': len(nodes.keys() - {m for e in edges.values() for m in e['vertices']}), + 'duplicate_member_occurrences': sum(len(e['vertices']) - len(set(e['vertices'])) for e in edges.values()), + 'membership_semantics': 'unordered unique-member sets; original record retained as opaque metadata'} + + +def figure(tool, graph, data): + import matplotlib + matplotlib.use('Agg') + import matplotlib.pyplot as plt + pos = {v['id']: v['attrs']['position'][:2] for v in data['vertices']} + fig, ax = plt.subplots(figsize=(19.2, 10.8), dpi=100) + if tool == 'hypernetx': + import hypernetx as hnx + hnx.draw(graph, pos=pos, ax=ax, with_node_labels=False, with_edge_labels=False, + fill_edges=True, fill_edge_alpha=-0.85) + elif tool == 'xgi': + import xgi + xgi.draw(graph, pos=pos, ax=ax, node_labels=False, hyperedge_labels=False, + hull=True, alpha=0.15) + else: + from hypergraphx.viz.draw_hypergraph import draw_hypergraph + draw_hypergraph(graph, pos=pos, ax=ax, with_node_labels=False, hyperedge_alpha=0.15) + xs, ys = zip(*pos.values()) + xpad = max(max(xs) - min(xs), 1) * 0.05 + ypad = max(max(ys) - min(ys), 1) * 0.05 + ax.set_xlim(min(xs)-xpad, max(xs)+xpad) + ax.set_ylim(min(ys)-ypad, max(ys)+ypad) + ax.set_aspect('equal', adjustable='box') + ax.axis('off') + return fig + + +def worker(args): + import faulthandler + faulthandler.dump_traceback_later(max(1, args.timeout - 10)) + result = {'tool': args.tool, 'dataset': Path(args.dataset).stem, + 'timed': not args.validate, 'status': 'failed', 'stages_ms': {}, + 'versions': {p: importlib.metadata.version(p) for p in PINNED}} + def stage(name, fn): + start = time.perf_counter_ns() + value = fn() + if not args.validate: + result['stages_ms'][name] = (time.perf_counter_ns() - start) / 1e6 + return value + try: + # Dependency imports are a separate cold-process stage, not construction. + stage('tool_import', lambda: __import__(args.tool)) + import matplotlib + matplotlib.use('Agg') + import matplotlib.pyplot + from PIL import Image + raw = stage('file_read', lambda: Path(args.dataset).read_bytes()) + result['sha256'] = hashlib.sha256(raw).hexdigest() + data = stage('json_parse', lambda: json.loads(raw)) + nodes, edges = stage('canonical_validate', lambda: canonical(data)) + result['seed'] = data.get('meta', {}).get('attrs', {}).get('benchmark_seed') + result['counts'] = {'vertices': len(nodes), 'hyperedges': len(edges), + 'memberships': sum(len(set(e['vertices'])) for e in edges.values()), + 'maximum_arity': max((len(set(e['vertices'])) for e in edges.values()), default=0)} + graph = stage('adapter_construct', lambda: construct(args.tool, data, (nodes, edges))) + result['correctness'] = check(args.tool, graph, data) + result['status'] = 'ok' if result['correctness']['exact_canonical_roundtrip'] else 'unsupported_records' + result['plot_semantics'] = {'empty_edges_have_no_geometry': True, + 'hypergraphx_singleton_groups_have_no_group_geometry': args.tool == 'hypergraphx', + 'common_coordinates': 'canonical XY; Z discarded for this 2D track'} + if args.plot: + fig = stage('artist_setup', lambda: figure(args.tool, graph, data)) + stage('agg_raster_draw', fig.canvas.draw) + png = Path(args.output).with_suffix('.png') + # Pixel buffer retrieval is recorded independently; save has no draw. + image = stage('pixel_buffer_copy', lambda: Image.frombytes('RGBA', fig.canvas.get_width_height(), fig.canvas.buffer_rgba().tobytes())) + stage('png_export', lambda: image.save(png, dpi=(100, 100))) + result['png'] = str(png) + result['png_dimensions'] = list(image.size) + except Exception as exc: + result['status'] = 'failed' + result['failure'] = {'type': type(exc).__name__, 'message': str(exc), 'traceback': traceback.format_exc()} + finally: + rss = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss + result['process_peak_rss_bytes'] = rss if sys.platform == 'darwin' else rss * 1024 + result['rss_scope'] = 'whole isolated worker, includes imports and validation' + faulthandler.cancel_dump_traceback_later() + Path(args.output).write_text(json.dumps(result, indent=2)) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--dataset', action='append') + parser.add_argument('--datasets-dir', default='target/benchmark/datasets') + parser.add_argument('--output', default='target/benchmark/science/results') + parser.add_argument('--tool', choices=TOOLS) + parser.add_argument('--worker', action='store_true') + parser.add_argument('--plot', action='store_true') + parser.add_argument('--validate', action='store_true') + parser.add_argument('--run', action='store_true') + parser.add_argument('--seed', type=int, default=20261003) + parser.add_argument('--repetitions', type=int, default=5) + parser.add_argument('--timeout', type=int, default=120) + args = parser.parse_args() + installed = {p: importlib.metadata.version(p) for p in PINNED} + if installed != PINNED: + parser.error(f'Pinned environment mismatch: {installed}') + if args.worker: + args.dataset = args.dataset[0] + worker(args) + return + if not args.validate and not args.run: + parser.error('Choose --validate (untimed) or --run (coordinated batch)') + if args.run and args.repetitions < 5: + parser.error('Protocol requires at least five repetitions') + out = Path(args.output) + out.mkdir(parents=True, exist_ok=True) + datasets = [Path(p) for p in args.dataset] if args.dataset else sorted(Path(args.datasets_dir).glob('*.json')) + datasets = [p for p in datasets if p.stem in ['correctness', 'moderate', 'large', 'high-arity-10', 'high-arity-100', 'high-arity-1000', 'scientific', 'mathlib']] + if not datasets: + parser.error('No canonical datasets found') + rng = random.Random(args.seed) + jobs = [(p, tool, mode) for p in datasets for tool in ([args.tool] if args.tool else TOOLS) + for mode in (['construct', 'plot'] if p.stem in ['correctness', 'moderate', 'scientific'] else ['construct'])] + rows = [] + schedule = [] + for repetition in range(-1, 1 if args.validate else args.repetitions): + if args.validate and repetition == -1: + continue + rng.shuffle(jobs) + for path, tool, mode in jobs: + name = f'{path.stem}-{tool}-{mode}-{repetition}' + destination = out / (name + '.json') + command = [sys.executable, str(Path(__file__).resolve()), '--worker', '--tool', tool, + '--dataset', str(path), '--output', str(destination), '--timeout', str(args.timeout)] + if mode == 'plot': command += ['--plot'] + if args.validate: command += ['--validate'] + env = dict(os.environ, MPLCONFIGDIR=str(out.resolve() / 'mpl-cache'), + OPENBLAS_NUM_THREADS='1', OMP_NUM_THREADS='1', MKL_NUM_THREADS='1', + XDG_CACHE_HOME=str(out.resolve() / 'xdg-cache')) + schedule.append({'order': len(schedule), 'repetition': repetition, 'dataset': path.stem, 'tool': tool, 'mode': mode}) + destination.unlink(missing_ok=True) + try: + completed = subprocess.run(command, env=env, capture_output=True, text=True, timeout=args.timeout) + row = json.loads(destination.read_text()) if destination.exists() else {'status': 'process_failed', 'returncode': completed.returncode} + if completed.returncode != 0: + row.update(status='process_failed', returncode=completed.returncode) + row['stderr'] = completed.stderr[-8000:] + except subprocess.TimeoutExpired: + row = {'status': 'watchdog_timeout', 'timeout_seconds': args.timeout} + row.update(schedule[-1], warmup=repetition == -1) + rows.append(row) + (out / 'raw.json').write_text(json.dumps(rows, indent=2)) + print(name, row['status'], flush=True) + metadata = {'seed': args.seed, 'warmup_per_combination': 0 if args.validate else 1, + 'repetitions': 1 if args.validate else args.repetitions, 'untimed_validation': args.validate, + 'platform': platform.platform(), 'python': sys.version, 'pins': PINNED, + 'installed_packages': {d.metadata['Name']: d.version for d in importlib.metadata.distributions()}, + 'documentation': SOURCES, 'schedule': schedule, + 'settings': {'resolution': [1920,1080], 'dpi': 100, 'backend': 'Agg', 'labels': False, + 'layout': 'none; canonical XYZ projected to XY', 'thread_limit': 1, 'hyperedge_alpha': 0.15, + 'hypergraphx_smoothing_refinements': 12, + 'hypergraphx_polygon_expansion_triangle': 2.5, + 'hypergraphx_polygon_expansion_other': 1.8}, + 'limitations': ['Different documented polygon/hull artists; no identical raster workload claim', + 'No static figure vs interactive FPS ranking', 'Peak RSS includes imports', + 'power/thermal/background conditions recorded by coordinator', + 'HGX canonical edge IDs stored as metadata; native IDs differ']} + (out / 'metadata.json').write_text(json.dumps(metadata, indent=2)) + with (out / 'raw.csv').open('w', newline='') as f: + writer = csv.DictWriter(f, fieldnames=['dataset','tool','mode','repetition','warmup','status','process_peak_rss_bytes','stages_ms','correctness','failure']) + writer.writeheader() + for row in rows: + writer.writerow({k: json.dumps(row.get(k)) if isinstance(row.get(k),(dict,list)) else row.get(k) for k in writer.fieldnames}) + +if __name__ == '__main__': + main() diff --git a/scripts/benchmarks/summarize.py b/scripts/benchmarks/summarize.py new file mode 100644 index 0000000..0e1bb7c --- /dev/null +++ b/scripts/benchmarks/summarize.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python3 +"""Summarize raw observations; median of per-run quantiles, never inverse median FPS.""" +import argparse +import csv +import json +from pathlib import Path +import statistics +from collections import defaultdict + +def quantile(values, q): + values = sorted(values) + if not values: return None + position = (len(values) - 1) * q + left = int(position) + right = min(left + 1, len(values) - 1) + return values[left] + (values[right] - values[left]) * (position - left) + +def median(values): + values = [v for v in values if v is not None] + return statistics.median(values) if values else None + +def load(path): + return json.loads(path.read_text()) if path.exists() else [] + +def summarize(root): + rows = [] + for track in ['native', 'native-star', 'native-interactive', 'core']: + groups = defaultdict(list) + for row in load(root / track / 'raw.json'): + if not row.get('warmup'): groups[(row['dataset'], row['hulls'], row['live'])].append(row) + for (dataset, hulls, live), group in groups.items(): + ok = [r for r in group if r['status'] == 'ok'] + row = {'track': track, 'tool': 'Hyper', 'dataset': dataset, 'mode': ('live' if live else 'frozen') + ('+hulls' if hulls else ''), 'attempts': len(group), 'successful_runs': len(ok), 'statuses': sorted({r['status'] for r in group}), 'peak_rss_mib_median': median([r['process_peak_rss_bytes'] / 2**20 for r in ok if r.get('process_peak_rss_bytes') is not None])} + if track != 'core': + traces = [r['measurements']['frame_interval_ms'] for r in ok] + row.update(frame_p50_ms=median([quantile(t, .5) for t in traces]), frame_p95_ms=median([quantile(t, .95) for t in traces]), frame_p95_run_min_ms=min([quantile(t,.95) for t in traces], default=None), frame_p95_run_max_ms=max([quantile(t,.95) for t in traces], default=None), average_fps=median([1000 * len(t) / sum(t) for t in traces if sum(t)]), update_commit_ms=median([r['measurements']['update_commit_ms'][0] for r in ok]), update_next_frame_ms=median([r['measurements'].get('update_next_frame_ms') for r in ok]), layout_step_p50_ms=median([quantile(r['measurements']['layout_step_ms'][:r['measurements']['frames']],.5) for r in ok])) + else: + for key in ['native_parse_ms', 'hif_parse_validate_ms', 'hif_viewer_conversion_ms', 'bipartite_projection_ms', 'all_hulls_cpu_ms']: + row[key] = median([r['measurements'][key] for r in ok]) + row['layout_step_p50_ms'] = median([quantile(r['measurements']['layout_step_ms'], .5) for r in ok]) + rows.append(row) + browser_path = root / 'browser-final/results.json' + browser = load(browser_path if browser_path.exists() else root / 'browser/results.json') + if browser: + groups = defaultdict(list) + for r in browser['runs']: groups[(r['dataset'],r['tool'],r['mode'])].append(r) + for (dataset,tool,mode), group in groups.items(): + ok = [r for r in group if 'trace' in r and r.get('status','ok') in ['ok','completed']] + traces = [r['trace']['rafIntervalMs'] for r in ok] + rows.append({'track': 'browser', 'tool': tool, 'dataset': dataset, 'mode': mode, 'attempts': len(group), 'successful_runs': len(ok), 'statuses': sorted({r.get('status','ok') for r in group}), 'frame_p50_ms': median([quantile(t,.5) for t in traces]), 'frame_p95_ms': median([quantile(t,.95) for t in traces]), 'average_fps': median([1000 * len(t) / sum(t) for t in traces if sum(t)]), 'frame_p95_run_min_ms': min([quantile(t,.95) for t in traces],default=None), 'frame_p95_run_max_ms': max([quantile(t,.95) for t in traces],default=None), 'load_wall_ms': median([r.get('loadWallMs') for r in ok]), 'update_commit_ms': median([r.get('incremental',{}).get('commandMs') for r in ok]), 'update_two_raf_ms': median([r.get('incremental',{}).get('twoRafFeedbackSurrogateMs') for r in ok]), 'failure_stages': sorted({r.get('stage','unknown') for r in group if r.get('status')=='failed'})}) + groups = defaultdict(list) + science_path = root / 'science/final-raw.json' + for r in load(science_path if science_path.exists() else root / 'science/results/raw.json'): + if not r.get('warmup'): groups[(r['dataset'],r['tool'],r['mode'])].append(r) + for (dataset,tool,mode), group in groups.items(): + measured = [r for r in group if r['status'] in ['ok','unsupported_records'] and not r.get('failure')] + row = {'track': 'scientific', 'tool': tool, 'dataset': dataset, 'mode': mode, 'attempts': len(group), 'successful_runs': len(measured), 'statuses': sorted({r['status'] for r in group}), 'exact_model_records': all(r.get('correctness',{}).get('exact_canonical_roundtrip',False) for r in measured) if measured else False, 'peak_rss_mib_median': median([r['process_peak_rss_bytes'] / 2**20 for r in measured])} + for key in ['tool_import','file_read','json_parse','canonical_validate','adapter_construct','artist_setup','agg_raster_draw','pixel_buffer_copy','png_export']: + row[key + '_ms'] = median([r.get('stages_ms',{}).get(key) for r in measured]) + rows.append(row) + groups = defaultdict(list) + for row in load(root / 'graphia/raw.json'): + if not row.get('warmup'): groups[row['dataset']].append(row) + for dataset, group in groups.items(): + ok = [r for r in group if r['status'] == 'ok'] + rows.append({'track':'desktop-import', 'tool':'Graphia', 'dataset':dataset, + 'mode':'headless-import-save', 'attempts':len(group), 'successful_runs':len(ok), + 'statuses':sorted({r['status'] for r in group}), + 'import_save_wall_ms':median([r['process_wall_seconds'] * 1000 for r in ok]), + 'peak_rss_mib_median':median([r['process_peak_rss_bytes'] / 2**20 for r in ok if r.get('process_peak_rss_bytes') is not None]), + 'exact_incidence_records':all(r['correctness']['exact_incidence_and_node_attributes'] for r in ok) if ok else False}) + for run in load(root / 'hypergodot/raw.json'): + measurements = run.get('measurements',{}) + repetitions = measurements.get('repetitions',[]) + traces = [r['frame_ms'] for r in repetitions] + rows.append({'track':'desktop-group', 'tool':'HyperGodot', 'dataset':run['dataset'], + 'mode':'frozen-camera-motion', 'attempts':5, 'successful_runs':len(repetitions), + 'statuses':[run['status']], 'frame_p50_ms':median([quantile(t,.5) for t in traces]), + 'frame_p95_ms':median([quantile(t,.95) for t in traces]), + 'frame_p95_run_min_ms':min([quantile(t,.95) for t in traces],default=None), + 'frame_p95_run_max_ms':max([quantile(t,.95) for t in traces],default=None), + 'average_fps':median([1000*len(t)/sum(t) for t in traces if sum(t)]), + 'whole_session_peak_rss_mib':run.get('process_peak_rss_bytes',0)/2**20 if run.get('process_peak_rss_bytes') else None, + 'exact_parser_memberships':measurements.get('exact_parser_memberships_and_rendered_group_count',False), + 'viewport_size':measurements.get('viewport_size'), + 'render_target_size':measurements.get('render_target_size'), + 'matched_requested_viewport':measurements.get('matched_requested_viewport',False), + 'startup_construction_ms':measurements.get('startup_construction_ms')}) + return sorted(rows, key=lambda r: (r['track'],r['dataset'],r['tool'],r['mode'])) + +if __name__ == '__main__': + p = argparse.ArgumentParser() + p.add_argument('--input', type=Path, default=Path('target/benchmark')) + p.add_argument('--output', type=Path, default=Path('docs/benchmarks/ecosystem-2026-10-03')) + args = p.parse_args() + args.output.mkdir(parents=True, exist_ok=True) + rows = summarize(args.input) + (args.output / 'summary.json').write_text(json.dumps(rows, indent=2) + '\n') + keys = sorted({key for r in rows for key in r}) + with (args.output / 'summary.csv').open('w', newline='') as f: + writer = csv.DictWriter(f, fieldnames=keys, lineterminator="\n") + writer.writeheader() + for row in rows: writer.writerow({k: json.dumps(v) if isinstance(v,list) else v for k,v in row.items()}) diff --git a/scripts/benchmarks/test_datasets.py b/scripts/benchmarks/test_datasets.py new file mode 100644 index 0000000..ac5e646 --- /dev/null +++ b/scripts/benchmarks/test_datasets.py @@ -0,0 +1,24 @@ +import unittest +from datasets import synthetic, incidence, hif, changed + +class Datasets(unittest.TestCase): + def test_seed_and_membership_counts_are_stable(self): + a=synthetic('moderate',1000,2000,8) + self.assertEqual(a,synthetic('moderate',1000,2000,8)) + self.assertEqual(len(a['vertices']),1000) + self.assertEqual(len(a['hyperedges']),2000) + self.assertTrue(all(len(e['vertices'])==len(set(e['vertices'])) for e in a['hyperedges'])) + def test_incidence_keeps_empty_edges_and_isolates(self): + graph=synthetic('correctness',30,15,8) + graph['hyperedges'][0]['vertices']=[] + scene=incidence(graph) + self.assertEqual(len(scene['nodes']),45) + self.assertEqual(len(scene['links']),sum(len(e['vertices']) for e in graph['hyperedges'])) + self.assertEqual(len(hif(graph)['nodes']),30) + self.assertEqual(hif(graph)['edges'][0]['edge'],'g0') + def test_updates_change_one_percent_without_renaming_vertices(self): + graph=synthetic('moderate',1000,2000,8) + updated=changed(graph) + self.assertEqual([v['id'] for v in graph['vertices']], [v['id'] for v in updated['vertices']]) + self.assertEqual(sum(a!=b for a,b in zip(graph['hyperedges'],updated['hyperedges'])),20) +if __name__=='__main__': unittest.main() diff --git a/scripts/benchmarks/test_scientific.py b/scripts/benchmarks/test_scientific.py new file mode 100644 index 0000000..ea42e95 --- /dev/null +++ b/scripts/benchmarks/test_scientific.py @@ -0,0 +1,27 @@ +import unittest +from datasets import synthetic +from scientific import canonical, construct, check + +class ScientificAdapters(unittest.TestCase): + def test_duplicate_incidence_is_rejected_before_library_normalization(self): + graph = synthetic('invalid', 3, 1, 2, fixed=True) + graph['hyperedges'][0]['vertices'].append(graph['hyperedges'][0]['vertices'][0]) + with self.assertRaisesRegex(ValueError, 'Duplicate incidence'): + canonical(graph) + + def test_hnx_nested_properties_use_unflattened_public_dataframe(self): + graph = synthetic('metadata', 3, 2, 3, fixed=True) + result = check('hypernetx', construct('hypernetx', graph), graph) + self.assertTrue(result['exact_canonical_roundtrip']) + self.assertEqual(result['wrong_metadata'], []) + + def test_hgx_parallel_edges_are_reported_without_checker_failure(self): + graph = synthetic('parallel', 3, 2, 2, fixed=True) + graph['hyperedges'][1]['vertices'] = graph['hyperedges'][0]['vertices'][:] + result = check('hypergraphx', construct('hypergraphx', graph), graph) + self.assertTrue(result['opaque_record_values_preserved']) + self.assertFalse(result['native_multiplicity_preserved']) + self.assertFalse(result['exact_canonical_roundtrip']) + self.assertEqual(result['native_hyperedge_count'], 1) + +if __name__ == '__main__': unittest.main() diff --git a/scripts/benchmarks/test_summarize.py b/scripts/benchmarks/test_summarize.py new file mode 100644 index 0000000..a090312 --- /dev/null +++ b/scripts/benchmarks/test_summarize.py @@ -0,0 +1,35 @@ +import json +from pathlib import Path +import tempfile +import unittest +from summarize import summarize + +class Summaries(unittest.TestCase): + def test_completed_browser_rows_and_average_throughput(self): + with tempfile.TemporaryDirectory() as temp: + root = Path(temp) + (root / 'browser').mkdir() + (root / 'browser/results.json').write_text(json.dumps({'runs': [{'dataset':'tiny','tool':'sigma','mode':'camera-motion','status':'completed','trace':{'rafIntervalMs':[10,10,40]}}]})) + row = summarize(root)[0] + self.assertEqual(row['successful_runs'], 1) + self.assertEqual(row['frame_p50_ms'], 10) + self.assertEqual(row['average_fps'], 50) + + def test_native_layout_excludes_post_update_steps_and_failed_runs(self): + with tempfile.TemporaryDirectory() as temp: + root = Path(temp) + (root / 'native').mkdir() + common = {'dataset':'tiny','hulls':True,'live':True,'warmup':False} + measured = {**common,'status':'ok','measurements':{ + 'frames':300,'frame_interval_ms':[20]*300, + 'layout_step_ms':list(range(1,301))+[10000]*4, + 'update_commit_ms':[5], 'update_next_frame_ms':25}} + failed = {**common,'status':'watchdog_timeout'} + (root / 'native/raw.json').write_text(json.dumps([measured,failed])) + row = summarize(root)[0] + self.assertEqual(row['attempts'],2) + self.assertEqual(row['successful_runs'],1) + self.assertEqual(row['layout_step_p50_ms'],150.5) + self.assertEqual(row['average_fps'],50) + +if __name__ == '__main__': unittest.main() diff --git a/scripts/benchmarks/verify_scientific.py b/scripts/benchmarks/verify_scientific.py new file mode 100644 index 0000000..abe150b --- /dev/null +++ b/scripts/benchmarks/verify_scientific.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python3 +"""Untimed semantic checks against independently parsed immutable input bytes.""" +import hashlib +import json +from pathlib import Path +from scientific import construct, check, TOOLS + +rows = [] +for path in sorted(Path('target/benchmark/datasets').glob('*.json')): + if path.stem not in ['correctness','moderate','large','high-arity-10','high-arity-100','high-arity-1000','scientific','mathlib']: + continue + raw = path.read_bytes() + for tool in TOOLS: + data = json.loads(raw) + graph = construct(tool, data) + expected = json.loads(raw) + unmutated = data == expected + assert unmutated, f'{tool} mutated source data in {path}' + result = check(tool, graph, expected) + rows.append({'dataset': path.stem, 'tool': tool, 'sha256': hashlib.sha256(raw).hexdigest(), 'input_unmutated': unmutated, 'correctness': result}) + print(path.stem, tool, result['exact_canonical_roundtrip'], flush=True) +Path('target/benchmark/science/independent-validation.json').write_text(json.dumps(rows, indent=2) + '\n') From 800e3803857e6f61a71b007b2ab83679530e7f67 Mon Sep 17 00:00:00 2001 From: Bregy Malpartida Date: Sun, 4 Oct 2026 13:23:35 -0500 Subject: [PATCH 3/9] docs: explain Python interoperability and ecosystem benchmark findings --- README.md | 165 +++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 137 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 9c9a5cc..dcfbbee 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,13 @@ # hyper -**hyper** is a general-purpose **hypergraph visualization** stack for Rust: -scene IR, force-directed 3D layout, and an optional native Bevy viewer. +**hyper** provides native 3D hypergraph exploration for **Python scientific +workflows** and **embedded Rust applications**. Explore explicit group memberships +with picking, search, lasso selection, and neighborhood isolation. -It is domain-agnostic — vertices and hyperedges only. +The Rust core provides HIF interchange, projections, and force-directed layout +without Bevy. The typed Python package exposes HIF interchange and can launch +the separately installed native viewer. Use scientific libraries for analysis +and Hyper to explore their exported datasets. [![Animated Mathlib source dependency atlas: 9,384 nodes, 37,356 imports, and 7,550 dependency groups](docs/media/mathlib.gif)](docs/media/mathlib.mp4) @@ -13,21 +17,110 @@ and 272 external-module placeholders. The video uses a settled layout; [reproduction instructions and live benchmarks](docs/mathlib-demo.md) explain the workload and rendering limits. -## What this is +## Choose a workflow -- A reusable library (`hyper-viz`) any app can feed with a hypergraph -- Optional native 3D window (`hyper-viz-bevy`) -- A small CLI (`hyper`) for demos and JSON file viewing -- Interchange format: **`hypergraph.v1`** JSON +| Workflow | Entry point | +|---|---| +| Exchange scientific datasets from Python | `hyper_viz.HifDocument`: load, validate, retain metadata, and export HIF | +| Explore a dataset in a native 3D window | `hyper` CLI or Python `hyper_viz.show()` | +| Embed projections and layout in a Rust application | Bevy-free `hyper-viz` library and render-independent scene | +| Embed the native viewer in a Rust host | `hyper-viz-bevy` plugin and live scene channel | + +Inputs include scientific **HIF**, native **`hypergraph.v1`** JSON, and supported +legacy exports. The model is domain-agnostic: vertices, hyperedges, and memberships. + +## Python and scientific interoperability + +Requires **CPython 3.10+** and **Rust 1.89+** for a local build. Public PyPI wheels +and crates.io packages have not been released; install from this checkout: -## What this is not +```bash +python -m venv .venv +. .venv/bin/activate # Windows: .venv\Scripts\activate +python -m pip install maturin==1.9.6 +cd crates/hyper-viz-python +maturin develop --locked +cd ../.. + +# Optional: install the native viewer as `hyper` on PATH +cargo install --path . --locked +``` -- **Not** Atomic Memory Core or any proprietary memory engine -- **Not** a claim / conversation / fact pipeline -- **Not** a packaged browser/WASM product (session JSON is portable; no web serve here) -- **Not** published to crates.io until an explicit public-release decision +```python +import hyper_viz -See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for the hard boundary. +document = hyper_viz.HifDocument.load("dataset.hif.json") +document.save("roundtrip.hif.json") +print(document.to_json()) + +# Requires the separately installed native viewer. +viewer = hyper_viz.show(document, projection="bipartite") +exit_code = viewer.wait() # or viewer.close() to terminate +``` + +Pass `executable="/path/to/hyper"` to select a viewer explicitly. The launcher +validates compatibility, starts the process asynchronously without a shell, and +owns a temporary native snapshot that is cleaned up after exit. The Python +extension itself does not depend on Bevy or download a viewer. + +Keep the `HifDocument` for scientific export: it preserves JSON values, record +order, metadata, integer/string ID identity, isolated nodes, empty edges, and +incidence properties. Whitespace and object-key order are not preserved. +Validation uses a bundled, pinned schema and works offline. + +**Document interchange supports more semantics than the viewer.** Viewer +conversion accepts undirected memberships and rejects directed or simplicial +semantics, incidence direction, weights, or attributes, and duplicate identities +or memberships. Node/edge weights round to finite `f32` for viewing; original +numbers remain in the document. Validation and compatibility exceptions expose +`location` and `reason`. Retained attributes are not automatically mapped to +viewer colors or exposed by the stock inspector. + +See [HIF and Python integration](docs/HIF.md) for API details, generated typing, +wheel builds, and runnable [XGI](crates/hyper-viz-python/examples/xgi_interop.py) +and [Julia](examples/hif_interop.jl) interchange examples. Direct scientific +object adapters, notebook embedding, layout bindings, and live updates from +Python are deferred. + +## Ecosystem fit and measured findings + +Hyper complements scientific analysis libraries and offers a Rust/native route +to exploring groups. The ecosystem comparison suggests this positioning; user +preference and adoption have not been measured. + +| Tool family | Fit alongside Hyper | +|---|---| +| XGI, HyperNetX, Hypergraphx | Scientific analysis and figures; exchange datasets through HIF where semantics are compatible | +| HyperGodot | Dedicated interactive 2D hypergraph exploration; an alternative when a 2D workflow fits | +| Sigma.js, Cytoscape.js, 3d-force-graph | Browser graph components; represent groups through incidence adapters and custom drawing | +| Graphia, Gephi | General graph analysis and attribute-driven exploration; useful references for richer inspection and filtering | + +The [October 3, 2026 benchmark](docs/benchmarks/ecosystem-2026-10-03/README.md) +records **445 measured attempts across 89 configurations** on one Apple M5 Pro +Mac. Scientific figures, browser rendering, native rendering, and import/save +workflows are separate tracks; these results do not establish an overall speed +ranking or native-versus-browser speed advantage. + +| Finding | Evidence and implication | +|---|---| +| Dense hulls are expensive | For 1,000 nodes / 2,000 groups in frozen bipartite mode, median per-run p95 application interval rose from **9.68 ms** without hulls to **62.08 ms** with hulls; both completed 5/5 attempts. Profile geometry and update costs before adding visual effects. | +| A successful demo is not a capacity guarantee | Full Mathlib bipartite runs completed 0/5 attempts within the 180-second budget in each frozen mode. Star mode with hulls and the default label policy completed 5/5, but frozen p95 was **219.91 ms**. Projection and settings change both work and responsiveness. | +| Failures need investigation | **16/120 native attempts** did not complete, including a small fixture. Completed-run timings exclude those failures; their cause remains unresolved. | +| Model fidelity must be checked | XGI preserved every tested model record. Our HNX adapter omitted isolated nodes and empty groups; HGX merged parallel groups by membership. Keep the original HIF document and validate adapter boundaries. | +| Smooth navigation does not guarantee fast updates | Sigma completed all 35 browser attempts, but its Mathlib update command took **13.24 s**. Update strategies differed across tools; evaluate updates separately from camera motion. | + +Application intervals and browser callback cadence are not GPU timings or +input-to-visible latency. Hulls approximate large groups, representations differ, +and display refresh was not locked across browser batches. Read the +[method and limitations](docs/benchmarks/ecosystem-2026-10-03/methodology.md), +[raw results](docs/benchmarks/ecosystem-2026-10-03/summary.csv), and +[rerun instructions](scripts/benchmarks/README.md) before interpreting timings. + +The next priorities are **attribute inspection and filtering**, **measured +responsiveness during dense geometry updates**, and **easier installation with +accurate documentation**. The [community and ecosystem research](docs/ecosystem-comparison.md) +explains the evidence behind those priorities. Browser distribution, directed +rendering, and timeline views remain outside the current viewer scope. ## Docs for external readers @@ -36,6 +129,9 @@ See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for the hard boundary. | [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) | Package boundary, host coupling policy | | [docs/API.md](docs/API.md) | Library API overview | | [docs/VIEWER.md](docs/VIEWER.md) | How to run the viewer + example scene | +| [docs/HIF.md](docs/HIF.md) | Scientific interchange, Python API, supported semantics, and packaging | +| [Measured ecosystem comparison](docs/benchmarks/ecosystem-2026-10-03/README.md) | Results, completion counts, raw evidence, and limitations | +| [Community and ecosystem research](docs/ecosystem-comparison.md) | Positioning and roadmap evidence | | [docs/PUBLIC_RELEASE_CHECKLIST.md](docs/PUBLIC_RELEASE_CHECKLIST.md) | Maintainer release-decision checklist | | [CONTRIBUTING.md](CONTRIBUTING.md) | Dev setup and PR norms | @@ -75,7 +171,7 @@ let mut layout = ForceLayout3D::from_scene(&scene, LayoutConfig::default()); layout.step(); ``` -Load JSON (`hypergraph.v1`): +Load JSON (automatic HIF, native, or supported legacy format detection): ```rust use hyper_viz::{from_json_str, load_json}; @@ -97,8 +193,9 @@ run_visualizer(scene); // already projected run_visualizer_live(scene, rx, None); // host thread pushes scenes ``` -A new scene on the live channel (or a file-watch reload) rebuilds the layout -and **clears selection**. +A new scene on the live channel (or a file-watch reload) rebuilds the scene +while retaining positions by stable ID and remapping surviving selection and +focus. Invalid watched input leaves the previous scene visible. ### Embed in a Bevy app @@ -119,7 +216,9 @@ the Bevy app. ## Crate map ```text -Hypergraph JSON (or builder API) +HIF JSON → HifDocument → compatibility check +Native JSON / Rust builder API + → Hypergraph → project(Bipartite | Clique | Star) → HypergraphScene # render-agnostic IR → ForceLayout3D # Barnes-Hut octree, CPU @@ -128,8 +227,9 @@ Hypergraph JSON (or builder API) | Crate | Role | Depend on this? | |---|---|---| -| [`crates/hyper-viz`](crates/hyper-viz) | Scene IR, projections, layout, hulls, JSON I/O | **Yes** — library | +| [`crates/hyper-viz`](crates/hyper-viz) | HIF, scene IR, projections, layout, hulls, JSON I/O | **Yes** — library | | [`crates/hyper-viz-bevy`](crates/hyper-viz-bevy) | Bevy 0.18 + egui native viewer | Only if you want the window | +| [`crates/hyper-viz-python`](crates/hyper-viz-python) | Typed Python HIF bindings and viewer launcher; no Bevy | For Python workflows | | `hyper` (this binary) | CLI: load JSON or open the built-in demo | No — not a library | ## Quick start (CLI) @@ -141,6 +241,9 @@ cargo run # Example scene cargo run -- fixtures/sample.json +# Scientific HIF dataset (also auto-detected without --format) +cargo run -- dataset.hif.json --format hif + # Hot-reload while you edit the file cargo run -- --watch fixtures/sample.json @@ -151,8 +254,10 @@ cargo run -- --projection clique fixtures/sample.json cargo run -p hyper-viz --example project_scene ``` -First Bevy compile is slow (~40s cold). Subsequent runs are fast. Native window -only — this is not a web app. More detail: [docs/VIEWER.md](docs/VIEWER.md). +Requires Rust 1.89+. The first Bevy build can take several minutes, depending +on the machine. For regular use, build with `cargo build --release --bin hyper` +or install with `cargo install --path . --locked`. See [docs/VIEWER.md](docs/VIEWER.md) +for native viewer setup. ## JSON schema (`hypergraph.v1`) @@ -161,7 +266,9 @@ only — this is not a web app. More detail: [docs/VIEWER.md](docs/VIEWER.md). "version": "hypergraph.v1", "meta": { "id": "g1", "title": "Coauthorship" }, "vertices": [ - { "id": "alice", "label": "Alice", "kind": "person" } + { "id": "alice", "label": "Alice", "kind": "person" }, + { "id": "bob", "label": "Bob", "kind": "person" }, + { "id": "carol", "label": "Carol", "kind": "person" } ], "hyperedges": [ { "id": "paper-a", "label": "Paper A", "vertices": ["alice", "bob", "carol"] } @@ -189,7 +296,11 @@ viewer hides those hubs by default so the hyperedge is read as a **set**: | 2 | Colored line between the two members | | 3 | Triangle hull | | 4 | Tetrahedron hull | -| 5+ | Convex hull of members | +| 5+ | Convex hull, using at most 24 sampled members | + +Large-group hulls are approximate: the geometry cap does not remove memberships +from the graph, and a hull is not an exact membership boundary. Empty edges have +no drawable geometry. Each hyperedge keeps a **stable hue** from its id (hash), so nested sets stay distinguishable. Nested hulls are inflated slightly to avoid z-fighting. @@ -290,7 +401,9 @@ Dual-licensed under **MIT OR Apache-2.0**. See [LICENSE](LICENSE), ```text crates/hyper-viz/ # library other projects depend on crates/hyper-viz-bevy/ # optional Bevy renderer -docs/ # architecture, API, viewer, release checklist +crates/hyper-viz-python/ # Python extension, typed package, and launcher +scripts/benchmarks/ # opt-in ecosystem benchmark harness +docs/ # API, interoperability, ecosystem research, benchmark evidence fixtures/sample.json # coauthorship demo src/main.rs # CLI ``` @@ -301,7 +414,3 @@ src/main.rs # CLI - WASM / browser serve (session JSON is ready for `localStorage`) - Euler-style set diagrams (convex-hull member shells only) - Bundling any proprietary memory engine - -## HIF and Python - -Hyper reads scientific HIF datasets with offline validation and explicit viewer compatibility checks. The optional typed Python package provides HIF interchange and launches a separately installed viewer. See [HIF and Python integration](docs/HIF.md) for supported semantics, build instructions, and XGI/Julia examples. From 422995c55cc21bef7a10b6a233caaf7ff7a47aa6 Mon Sep 17 00:00:00 2001 From: Bregy Malpartida Date: Sun, 4 Oct 2026 14:02:52 -0500 Subject: [PATCH 4/9] release: prepare hypergraph-viz for PyPI Trusted Publishing --- .github/workflows/python.yml | 80 +++++++++++++++++++++- README.md | 23 +++++-- crates/hyper-viz-python/README.md | 79 +++++++++++++++++++++- crates/hyper-viz-python/pyproject.toml | 18 ++++- docs/HIF.md | 4 +- docs/PYTHON_RELEASE.md | 94 ++++++++++++++++++++++++++ scripts/releases/build_python_sdist.py | 54 +++++++++++++++ 7 files changed, 341 insertions(+), 11 deletions(-) create mode 100644 docs/PYTHON_RELEASE.md create mode 100644 scripts/releases/build_python_sdist.py diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index 792e06d..fc2da86 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -1,8 +1,9 @@ -name: python wheels +name: python wheels and release on: push: branches: [main] + tags: ["python-v*"] pull_request: workflow_dispatch: @@ -10,8 +11,33 @@ permissions: contents: read jobs: + metadata: + name: Package and release version + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: '3.12' + - name: Check package versions and release tag + run: | + python - <<'PYTHON' + import os + import tomllib + from pathlib import Path + + package = tomllib.loads(Path('crates/hyper-viz-python/pyproject.toml').read_text()) + workspace = tomllib.loads(Path('Cargo.toml').read_text()) + version = package['project']['version'] + assert version == workspace['workspace']['package']['version'], 'Python and Rust versions differ' + if os.environ['GITHUB_REF_TYPE'] == 'tag': + assert os.environ['GITHUB_REF_NAME'] == f'python-v{version}', 'Tag must match package version' + print(f"{package['project']['name']} {version}: metadata matches") + PYTHON + wheels: name: ${{ matrix.target }} / CPython abi3 + needs: metadata strategy: fail-fast: false matrix: @@ -78,3 +104,55 @@ jobs: run: | python -m pip install --no-deps dist/*.whl python -c 'from hyper_viz import HifDocument; assert "s:a" in HifDocument.from_json("{\"incidences\":[{\"node\":\"a\",\"edge\":\"e\"}]}").to_hypergraph_json()' + + sdist: + name: Source distribution + needs: metadata + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: '3.12' + - uses: dtolnay/rust-toolchain@1.89.0 + - uses: Swatinem/rust-cache@v2 + - name: Build and unpack source distribution + shell: bash + run: | + python -m pip install maturin==1.9.6 + python scripts/releases/build_python_sdist.py --out dist + mkdir packaged-source + tar -xzf dist/*.tar.gz -C packaged-source --strip-components=1 + - name: Build wheel from packaged source + working-directory: packaged-source + run: maturin build --release --locked --out ../sdist-wheel + - name: Verify wheel built from packaged source + shell: bash + run: | + python crates/hyper-viz-python/tests/check_wheel.py sdist-wheel + python -m pip install --no-deps sdist-wheel/*.whl + python -c 'from hyper_viz import HifDocument; HifDocument.from_json("{\"incidences\":[]}").to_hypergraph_json()' + - uses: actions/upload-artifact@v4 + with: + name: hyper-viz-sdist + path: dist/*.tar.gz + if-no-files-found: error + + publish: + name: Publish to PyPI + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/python-v') + needs: [wheels, sdist] + runs-on: ubuntu-latest + environment: + name: pypi + url: https://pypi.org/project/hypergraph-viz/ + permissions: + id-token: write + steps: + - uses: actions/download-artifact@v4 + with: + pattern: hyper-viz-* + merge-multiple: true + path: dist + - name: Publish tested distributions with Trusted Publishing + uses: pypa/gh-action-pypi-publish@release/v1 diff --git a/README.md b/README.md index dcfbbee..11c789b 100644 --- a/README.md +++ b/README.md @@ -31,8 +31,23 @@ legacy exports. The model is domain-agnostic: vertices, hyperedges, and membersh ## Python and scientific interoperability -Requires **CPython 3.10+** and **Rust 1.89+** for a local build. Public PyPI wheels -and crates.io packages have not been released; install from this checkout: +Install the **`hypergraph-viz`** Python distribution with **CPython 3.10+**: + +```bash +python -m pip install hypergraph-viz +``` + +The import name is `hyper_viz`. Wheels cover Linux x86_64, macOS arm64/x86_64, +and Windows x86_64; a compatible wheel requires no Rust compiler. The native +viewer remains a separate installation. From a repository checkout with +**Rust 1.89+**: + +```bash +# Optional: install the native viewer as `hyper` on PATH +cargo install --path . --locked +``` + +For a Python development build from this checkout: ```bash python -m venv .venv @@ -41,9 +56,6 @@ python -m pip install maturin==1.9.6 cd crates/hyper-viz-python maturin develop --locked cd ../.. - -# Optional: install the native viewer as `hyper` on PATH -cargo install --path . --locked ``` ```python @@ -132,6 +144,7 @@ rendering, and timeline views remain outside the current viewer scope. | [docs/HIF.md](docs/HIF.md) | Scientific interchange, Python API, supported semantics, and packaging | | [Measured ecosystem comparison](docs/benchmarks/ecosystem-2026-10-03/README.md) | Results, completion counts, raw evidence, and limitations | | [Community and ecosystem research](docs/ecosystem-comparison.md) | Positioning and roadmap evidence | +| [Python release guide](docs/PYTHON_RELEASE.md) | PyPI Trusted Publisher setup and tag-based releases | | [docs/PUBLIC_RELEASE_CHECKLIST.md](docs/PUBLIC_RELEASE_CHECKLIST.md) | Maintainer release-decision checklist | | [CONTRIBUTING.md](CONTRIBUTING.md) | Dev setup and PR norms | diff --git a/crates/hyper-viz-python/README.md b/crates/hyper-viz-python/README.md index d36001e..b52b15f 100644 --- a/crates/hyper-viz-python/README.md +++ b/crates/hyper-viz-python/README.md @@ -1,3 +1,78 @@ -# Hyper Python +# Hyper for Python -Rust-backed HIF interchange; optional native viewer launch. See [HIF and Python guide](../../docs/HIF.md) for examples, supported semantics, and installation. +`hypergraph-viz` provides Rust-backed [Hypergraph Interchange Format (HIF)](https://github.com/HIF-org/HIF-standard) +validation and interchange, plus a launcher for Hyper's native 3D viewer. Use it +to exchange scientific datasets while retaining metadata and explicit group identities. +The package includes generated extension type stubs, typed Python wrappers, and `py.typed`. + +## Installation + +```sh +python -m pip install hypergraph-viz +``` + +Requires standard CPython 3.10 or newer. Platform wheels cover Linux x86_64, +macOS arm64/x86_64, and Windows x86_64; installing a compatible wheel requires +no Rust compiler. Building from source requires Rust 1.89 or newer and maturin. +The Python extension has no Bevy dependency. + +## Exchange datasets + +```python +import hyper_viz + +document = hyper_viz.HifDocument.load("dataset.hif.json") +document.save("roundtrip.hif.json") +print(document.to_json()) + +# Explicitly check compatibility and convert to Hyper's native JSON. +native_json = document.to_hypergraph_json() +``` + +`HifDocument.from_json(raw)` accepts HIF JSON; `from_hypergraph_json(raw)` accepts +native Hyper JSON. Validation uses a pinned schema bundled with the package and +never fetches resources at runtime. + +Keep the original document for scientific export. It preserves JSON values, +record order, optional field presence, integer/string IDs, isolated nodes, empty +edges, metadata, and incidence properties. Whitespace and object-key order are +not preserved. + +## Launch the native viewer + +Install Hyper's viewer separately from the +[Hyper repository](https://github.com/atomicstrata/hyper). From its checkout: + +```sh +cargo install --path . --locked +``` + +Then launch it from Python: + +```python +viewer = hyper_viz.show(document, projection="bipartite") +exit_code = viewer.wait() +# Or viewer.close() to terminate and clean up. +``` + +Pass `executable="/path/to/hyper"` to select a binary explicitly; otherwise the +launcher finds `hyper` on PATH. It launches asynchronously without a shell, +retains an owned temporary snapshot, and cleans up after exit. It does not +download a viewer. + +## Compatibility and errors + +Full-document interchange supports more semantics than viewer conversion. +The viewer supports undirected memberships. Directed and simplicial semantics, +incidence direction/weights/attributes, and duplicate declarations or incidence +pairs produce `HifCompatibilityError`. Node/edge weights round to finite `f32` +for viewing; original values remain in the document. Arbitrary attributes are +retained but not exposed by the stock viewer inspector. + +Malformed HIF raises `HifValidationError`. Both exceptions carry `location` +and `reason`; file failures raise `OSError`. Direct scientific object adapters, +notebook embedding, headless layout bindings, and live Python updates are deferred. + +See the [integration guide](https://github.com/atomicstrata/hyper/blob/python-v0.1.0/docs/HIF.md) +and [XGI example](https://github.com/atomicstrata/hyper/blob/python-v0.1.0/crates/hyper-viz-python/examples/xgi_interop.py). +Hyper is licensed under MIT OR Apache-2.0; the bundled HIF schema is MIT-licensed. diff --git a/crates/hyper-viz-python/pyproject.toml b/crates/hyper-viz-python/pyproject.toml index 8a53b72..618996b 100644 --- a/crates/hyper-viz-python/pyproject.toml +++ b/crates/hyper-viz-python/pyproject.toml @@ -3,12 +3,28 @@ requires = ["maturin==1.9.6"] build-backend = "maturin" [project] -name = "hyper-viz" +name = "hypergraph-viz" version = "0.1.0" requires-python = ">=3.10" description = "Rust-backed HIF interchange and native Hyper viewer launcher" readme = "README.md" license = "MIT OR Apache-2.0" +keywords = ["hypergraph", "hif", "visualization", "scientific-computing", "rust"] +classifiers = [ + "Development Status :: 3 - Alpha", + "Intended Audience :: Science/Research", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Rust", + "Topic :: Scientific/Engineering :: Visualization", + "Typing :: Typed", +] + +[project.urls] +Homepage = "https://github.com/atomicstrata/hyper" +Documentation = "https://github.com/atomicstrata/hyper/blob/python-v0.1.0/docs/HIF.md" +Repository = "https://github.com/atomicstrata/hyper" +Issues = "https://github.com/atomicstrata/hyper/issues" [tool.maturin] module-name = "hyper_viz._core" diff --git a/docs/HIF.md b/docs/HIF.md index bc8753d..7eabf93 100644 --- a/docs/HIF.md +++ b/docs/HIF.md @@ -37,7 +37,7 @@ Native-to-HIF export keeps native string IDs, memberships, weights, and attribut ## Python installation -The Python extension depends on the Rust core, not Bevy. Requires standard CPython 3.10 or newer. Until public wheels are released, build locally with Rust 1.89 and maturin: +The distribution is named `hypergraph-viz`; import it as `hyper_viz`. The Python extension depends on the Rust core, not Bevy. Requires standard CPython 3.10 or newer. Install a platform wheel with `python -m pip install hypergraph-viz`; a compatible wheel needs no Rust compiler. For local development, build with Rust 1.89 and maturin: ```sh python -m venv .venv @@ -48,7 +48,7 @@ cargo run --bin stub_gen maturin develop --locked ``` -For wheel installation, run `maturin build --release --locked` in the same directory and install the resulting platform wheel from `target/wheels`. CI prepares Linux x86_64, macOS arm64/x86_64, and Windows x86_64 wheels; it does not publish them. Wheels use the CPython stable ABI starting at 3.10, not the free-threaded ABI. +For wheel installation, run `maturin build --release --locked` in the same directory and install the resulting platform wheel from `target/wheels`. CI prepares Linux x86_64, macOS arm64/x86_64, and Windows x86_64 wheels. Version tags (`python-v`) publish tested wheels and a verified source archive through PyPI Trusted Publishing; ordinary CI runs do not publish. See the [Python release guide](PYTHON_RELEASE.md) for the one-time publisher setup and release procedure. Wheels use the CPython stable ABI starting at 3.10, not the free-threaded ABI. To build a standalone source archive (maintainer Python 3.11+), run `python scripts/releases/build_python_sdist.py --out dist` from the repository root with maturin on PATH; the helper excludes the root viewer package so the archive can build independently. ```python import hyper_viz diff --git a/docs/PYTHON_RELEASE.md b/docs/PYTHON_RELEASE.md new file mode 100644 index 0000000..2dd8c6a --- /dev/null +++ b/docs/PYTHON_RELEASE.md @@ -0,0 +1,94 @@ +# Publishing the Python package + +Distribution name: `hypergraph-viz`. Import name: `hyper_viz`. Initial version: `0.1.0`. +The native viewer is installed separately; the Python wheels contain interchange +bindings and the launcher, not Bevy or a viewer executable. + +PyPI treats hyphens and underscores as equivalent in project names. The original +`hyper-viz` / `hyper_viz` distribution name was rejected as too similar to an +existing project. Changing the distribution does not change the import. + +## One-time PyPI setup + +Use a PyPI account with two-factor authentication. For the first release, add a +pending GitHub Trusted Publisher at : + +| Field | Value | +|---|---| +| PyPI project name | `hypergraph-viz` | +| GitHub owner | `atomicstrata` | +| Repository | `hyper` | +| Workflow filename | `python.yml` | +| Environment name | `pypi` | + +If the project already exists under your account, add the same publisher under +its project publishing settings instead. Pending publishers do not reserve a +name: PyPI creates the project on the first successful upload. + +Create the `pypi` GitHub environment in the repository settings. The workflow +uses that exact environment and requests `id-token: write` only in the publish +job. No long-lived PyPI API token or password is stored in GitHub. Any configured +environment reviewers must approve the publication job before it runs. + +See PyPI's official [pending publisher instructions](https://docs.pypi.org/trusted-publishers/creating-a-project-through-oidc/) +and [publishing instructions](https://docs.pypi.org/trusted-publishers/using-a-publisher/). + +## Release a version + +1. Prefer a merged release commit and verify the `python wheels and release` workflow + passes on the commit being released. It checks generated stubs, Rust/Python + tests, clean wheel installs, and source-distribution completeness. + A release may also tag an explicitly chosen validated commit while its PR + remains open; the tag workflow builds and tests that exact source again. +2. Keep `[workspace.package].version` in the root `Cargo.toml` and + `[project].version` in `crates/hyper-viz-python/pyproject.toml` identical. + Update the package documentation links to the new release tag too. +3. Tag that commit with `python-v` followed by the exact version. For `0.1.0`: + + ```sh + git switch main + git pull --ff-only + git tag python-v0.1.0 + git push origin python-v0.1.0 + ``` + +The tag triggers `.github/workflows/python.yml`. The version check rejects tags +that disagree with the package version. All four platform wheel jobs and the +source-distribution job must pass before the publishing job downloads their +artifacts and uploads them through PyPI Trusted Publishing. Pull requests, +branch pushes, and manual workflow runs never publish. + +Wheels target standard CPython 3.10+ using `abi3`: Linux x86_64, macOS arm64 and +x86_64, and Windows x86_64. A source archive provides a fallback for users with +a Rust toolchain. The source-packaging helper (`scripts/releases/build_python_sdist.py`) creates a +virtual workspace containing only the core and bindings, retaining the locked +dependency versions. CI builds a wheel from that archive to check it contains the +Rust core, pinned HIF schema, Python sources, typing, and licenses. + +## Verify the published package + +Use a fresh CPython 3.10+ virtual environment and the normal PyPI index: + +```sh +python -m venv /tmp/hyper-release-check +. /tmp/hyper-release-check/bin/activate +python -m pip install --only-binary=:all: hypergraph-viz==0.1.0 +python - <<'PY' +from hyper_viz import HifDocument + +document = HifDocument.from_json('{"incidences":[{"node":"a","edge":"e"}]}') +assert 's:a' in document.to_hypergraph_json() +assert document.to_json() +PY +``` + +Adapt the virtual-environment path/activation for Windows. Confirm the PyPI +page renders the package README, lists all platform wheels and the source +archive, and shows the correct version. Install the viewer separately to check +`show()`; importing or exchanging HIF requires no viewer. + +PyPI releases cannot be overwritten. If an uploaded release is unusable, yank +it through PyPI and publish a corrected higher version; do not reuse the tag or +version. If an upload partially succeeds, inspect the published files before +retrying and upload only missing files. The workflow does not silently skip +existing distributions. diff --git a/scripts/releases/build_python_sdist.py b/scripts/releases/build_python_sdist.py new file mode 100644 index 0000000..64503d9 --- /dev/null +++ b/scripts/releases/build_python_sdist.py @@ -0,0 +1,54 @@ +"""Build a standalone core/Python workspace before creating the PyPI sdist.""" +from pathlib import Path +import argparse +import shutil +import subprocess +import tempfile +import tomllib + + +def build(output: Path) -> None: + root = Path(__file__).resolve().parents[2] + output.mkdir(parents=True, exist_ok=True) + original_lock = tomllib.loads((root / "Cargo.lock").read_text()) + original_versions = { + (p["name"], p["version"], p.get("source", "")) + for p in original_lock["package"] + } + with tempfile.TemporaryDirectory(prefix="hyper-python-sdist-") as folder: + staged = Path(folder) + for name in ("hyper-viz", "hyper-viz-python"): + shutil.copytree( + root / "crates" / name, + staged / "crates" / name, + ignore=shutil.ignore_patterns("__pycache__", "*.pyc", "target"), + ) + for name in ("Cargo.lock", "LICENSE", "LICENSE-MIT", "LICENSE-APACHE", "NOTICE"): + shutil.copy2(root / name, staged / name) + # This root is a virtual workspace: no CLI or Bevy source is needed. + workspace = (root / "Cargo.toml").read_text().split("[package]", 1)[0] + workspace = workspace.replace( + 'members = ["crates/hyper-viz", "crates/hyper-viz-bevy", "crates/hyper-viz-python"]', + 'members = ["crates/hyper-viz", "crates/hyper-viz-python"]', + ) + workspace = workspace.replace('hyper-viz-bevy = { path = "crates/hyper-viz-bevy" }\n', "") + (staged / "Cargo.toml").write_text(workspace) + # Prune unused viewer packages while retaining the existing locked versions. + subprocess.run(["cargo", "metadata", "--format-version", "1"], + cwd=staged, check=True, stdout=subprocess.DEVNULL) + lock = tomllib.loads((staged / "Cargo.lock").read_text()) + for package in lock["package"]: + identity = (package["name"], package["version"], package.get("source", "")) + if identity not in original_versions: + raise RuntimeError(f"Source packaging changed a dependency: {identity}") + subprocess.run([ + "maturin", "sdist", "--manifest-path", + str(staged / "crates/hyper-viz-python/Cargo.toml"), + "--out", str(output.resolve()), + ], cwd=staged, check=True) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--out", type=Path, default=Path("dist")) + build(parser.parse_args().out) From 09b03d4c03ef6bcede2461b8504e97b63ed8f77f Mon Sep 17 00:00:00 2001 From: Bregy Malpartida Date: Sun, 4 Oct 2026 14:36:53 -0500 Subject: [PATCH 5/9] Ship optional desktop viewer wheels and document notebook prototype --- .github/workflows/python.yml | 126 +++++++++++- Cargo.lock | 182 +----------------- Cargo.toml | 2 +- README.md | 20 +- crates/hyper-viz-bevy/Cargo.toml | 7 +- crates/hyper-viz-python/README.md | 20 +- crates/hyper-viz-python/pyproject.toml | 7 +- .../python/hyper_viz/_viewer.py | 53 ++++- crates/hyper-viz-python/tests/test_api.py | 9 + .../tests/test_viewer_installation.py | 80 ++++++++ docs/DESKTOP_PACKAGE.md | 37 ++++ docs/HIF.md | 8 +- docs/NOTEBOOK_ROADMAP.md | 133 +++++++++++++ docs/PYTHON_RELEASE.md | 129 +++++++------ .../plans/2026-10-04-desktop-wheels.md | 41 ++++ fixtures/notebook-small.hif.json | 21 ++ pyproject.toml | 29 +++ .../releases/check_desktop_dependencies.py | 9 + scripts/releases/check_desktop_wheel.py | 28 +++ scripts/releases/smoke_desktop.py | 62 ++++++ 20 files changed, 739 insertions(+), 264 deletions(-) create mode 100644 crates/hyper-viz-python/tests/test_viewer_installation.py create mode 100644 docs/DESKTOP_PACKAGE.md create mode 100644 docs/NOTEBOOK_ROADMAP.md create mode 100644 docs/superpowers/plans/2026-10-04-desktop-wheels.md create mode 100644 fixtures/notebook-small.hif.json create mode 100644 pyproject.toml create mode 100644 scripts/releases/check_desktop_dependencies.py create mode 100644 scripts/releases/check_desktop_wheel.py create mode 100644 scripts/releases/smoke_desktop.py diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index fc2da86..3a5aea1 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -28,7 +28,10 @@ jobs: package = tomllib.loads(Path('crates/hyper-viz-python/pyproject.toml').read_text()) workspace = tomllib.loads(Path('Cargo.toml').read_text()) + desktop = tomllib.loads(Path('pyproject.toml').read_text()) version = package['project']['version'] + assert desktop['project']['version'] == version, 'Desktop and core versions differ' + assert package['project']['optional-dependencies']['viewer'] == [f'hypergraph-viz-viewer=={version}'] assert version == workspace['workspace']['package']['version'], 'Python and Rust versions differ' if os.environ['GITHUB_REF_TYPE'] == 'tag': assert os.environ['GITHUB_REF_NAME'] == f'python-v{version}', 'Tag must match package version' @@ -138,10 +141,118 @@ jobs: path: dist/*.tar.gz if-no-files-found: error + + desktop: + name: ${{ matrix.target }} / desktop viewer + needs: metadata + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-latest + target: x86_64-unknown-linux-gnu + - os: macos-14 + target: aarch64-apple-darwin + - os: macos-15-intel + target: x86_64-apple-darwin + - os: windows-latest + target: x86_64-pc-windows-msvc + runs-on: ${{ matrix.os }} + env: + CARGO_TERM_COLOR: always + MACOSX_DEPLOYMENT_TARGET: '11.0' + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: '3.10' + - uses: dtolnay/rust-toolchain@1.89.0 + with: + targets: ${{ matrix.target }} + - uses: Swatinem/rust-cache@v2 + - name: Check desktop native dependencies + run: python scripts/releases/check_desktop_dependencies.py + - name: Build desktop wheel + uses: PyO3/maturin-action@v1 + with: + maturin-version: '1.9.6' + rust-toolchain: '1.89.0' + target: ${{ matrix.target }} + manylinux: '2_28' + before-script-linux: yum install -y wayland-devel libxkbcommon-devel + args: --release --locked --auditwheel check --out desktop-dist + - name: Check desktop wheel contents + run: python scripts/releases/check_desktop_wheel.py desktop-dist + - name: Install and verify standalone desktop binary + shell: bash + run: | + python -m pip install --no-index --only-binary=:all: desktop-dist/*.whl + python scripts/releases/smoke_desktop.py --viewer-only + - uses: actions/upload-artifact@v4 + with: + name: hyper-viz-desktop-${{ matrix.target }} + path: desktop-dist/*.whl + if-no-files-found: error + + + desktop-integration: + name: ${{ matrix.target }} / installed viewer extra + needs: [wheels, desktop] + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-latest + target: x86_64-unknown-linux-gnu + - os: macos-14 + target: aarch64-apple-darwin + - os: macos-15-intel + target: x86_64-apple-darwin + - os: windows-latest + target: x86_64-pc-windows-msvc + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: '3.10' + - uses: actions/download-artifact@v4 + with: + name: hyper-viz-desktop-${{ matrix.target }} + path: desktop-dist + - uses: actions/download-artifact@v4 + with: + name: hyper-viz-${{ matrix.target }} + path: core-dist + - name: Install core and viewer together without source builds + shell: bash + run: | + python -m pip install --no-index --only-binary=:all: --find-links core-dist --find-links desktop-dist 'hypergraph-viz[viewer]' + - name: Verify executable discovery and CLI startup + run: python scripts/releases/smoke_desktop.py + - name: Install Linux graphics test runtime + if: runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install -y xvfb libvulkan1 mesa-vulkan-drivers libegl1 libxkbcommon-x11-0 libwayland-client0 libx11-6 libxrandr2 libxi6 libxcursor1 + - name: Verify native window on software Vulkan + if: runner.os == 'Linux' + env: + WGPU_BACKEND: vulkan + WINIT_UNIX_BACKEND: x11 + HYPER_VIZ_SESSION: 'off' + run: xvfb-run -a python scripts/releases/smoke_desktop.py --render + - uses: actions/upload-artifact@v4 + if: runner.os == 'Linux' && always() + with: + name: desktop-render-smoke + path: target/desktop-smoke/render.png + if-no-files-found: ignore + publish: name: Publish to PyPI if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/python-v') - needs: [wheels, sdist] + needs: [wheels, sdist, desktop-integration] runs-on: ubuntu-latest environment: name: pypi @@ -154,5 +265,16 @@ jobs: pattern: hyper-viz-* merge-multiple: true path: dist - - name: Publish tested distributions with Trusted Publishing + - name: Separate companion and core distributions + run: | + mkdir desktop-release core-release + mv dist/hypergraph_viz_viewer-*.whl desktop-release/ + mv dist/* core-release/ + - name: Publish desktop companion with Trusted Publishing + uses: pypa/gh-action-pypi-publish@release/v1 + with: + packages-dir: desktop-release/ + - name: Publish core after companion is available uses: pypa/gh-action-pypi-publish@release/v1 + with: + packages-dir: core-release/ diff --git a/Cargo.lock b/Cargo.lock index 7fa34dc..8000d15 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -858,22 +858,6 @@ dependencies = [ "smol_str", ] -[[package]] -name = "bevy_gilrs" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "611827ab0ce43b88c0a695e6603901b5f34687efecaf526c861456c9d8e6fedb" -dependencies = [ - "bevy_app", - "bevy_ecs", - "bevy_input", - "bevy_platform", - "bevy_time", - "gilrs", - "thiserror 2.0.20", - "tracing", -] - [[package]] name = "bevy_gizmos" version = "0.18.1" @@ -1050,7 +1034,6 @@ dependencies = [ "bevy_diagnostic", "bevy_ecs", "bevy_feathers", - "bevy_gilrs", "bevy_gizmos", "bevy_gizmos_render", "bevy_gltf", @@ -2706,12 +2689,6 @@ dependencies = [ "serde", ] -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - [[package]] name = "foldhash" version = "0.1.5" @@ -2930,40 +2907,6 @@ dependencies = [ "r-efi 6.0.0", ] -[[package]] -name = "gilrs" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "902fb00d3f6398e635be22e5c837b303c501835cca7ac11a47bba138f7aafdd8" -dependencies = [ - "fnv", - "gilrs-core", - "log", - "uuid", - "vec_map", -] - -[[package]] -name = "gilrs-core" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc7f0ce6237abcc0523f2a5502b1e3fe5802daaae47ac14e166fe49551301ea9" -dependencies = [ - "inotify", - "js-sys", - "libc", - "libudev-sys", - "log", - "nix", - "objc2-core-foundation", - "objc2-io-kit", - "uuid", - "vec_map", - "wasm-bindgen", - "web-sys", - "windows 0.62.2", -] - [[package]] name = "gl_generator" version = "0.14.0" @@ -3221,7 +3164,7 @@ checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" [[package]] name = "hyper" -version = "0.1.0" +version = "0.1.1" dependencies = [ "clap", "hyper-viz", @@ -3232,7 +3175,7 @@ dependencies = [ [[package]] name = "hyper-viz" -version = "0.1.0" +version = "0.1.1" dependencies = [ "jsonschema", "num-bigint", @@ -3246,7 +3189,7 @@ dependencies = [ [[package]] name = "hyper-viz-bevy" -version = "0.1.0" +version = "0.1.1" dependencies = [ "bevy", "bevy_egui", @@ -3262,7 +3205,7 @@ dependencies = [ [[package]] name = "hyper-viz-python" -version = "0.1.0" +version = "0.1.1" dependencies = [ "hyper-viz", "pyo3", @@ -3439,26 +3382,6 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a257582fdcde896fd96463bf2d40eefea0580021c0712a0e2b028b60b47a837a" -[[package]] -name = "inotify" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cc00ea907cab49550b7da656f80ebb97be1b997d931fbcd28d39734e17ce592" -dependencies = [ - "bitflags 2.13.1", - "inotify-sys", - "libc", -] - -[[package]] -name = "inotify-sys" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c033f80b2c113cdf91ab7a33faa9cbc014726dcad99880c8609af2a370edf37d" -dependencies = [ - "libc", -] - [[package]] name = "inventory" version = "0.3.24" @@ -3678,17 +3601,6 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -[[package]] -name = "lewton" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "777b48df9aaab155475a83a7df3070395ea1ac6902f5cd062b8f2b028075c030" -dependencies = [ - "byteorder", - "ogg", - "tinyvec", -] - [[package]] name = "libc" version = "0.2.189" @@ -3723,16 +3635,6 @@ dependencies = [ "redox_syscall 0.9.4", ] -[[package]] -name = "libudev-sys" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c8469b4a23b962c1396b9b451dda50ef5b283e8dd309d69033475fa9b334324" -dependencies = [ - "libc", - "pkg-config", -] - [[package]] name = "linebender_resource_handle" version = "0.1.1" @@ -4325,7 +4227,6 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33fafba39597d6dc1fb709123dfa8289d39406734be322956a69f0931c73bb15" dependencies = [ - "bitflags 2.13.1", "libc", "objc2-core-foundation", ] @@ -4466,15 +4367,6 @@ dependencies = [ "nonmax", ] -[[package]] -name = "ogg" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6951b4e8bf21c8193da321bcce9c9dd2e13c858fe078bf9054a288b419ae5d6e" -dependencies = [ - "byteorder", -] - [[package]] name = "once_cell" version = "1.21.4" @@ -5130,7 +5022,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7ceb6607dd738c99bc8cb28eff249b7cd5c8ec88b9db96c0608c1480d140fb1" dependencies = [ "cpal", - "lewton", ] [[package]] @@ -6174,12 +6065,6 @@ dependencies = [ "syn 2.0.119", ] -[[package]] -name = "vec_map" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" - [[package]] name = "version_check" version = "0.9.5" @@ -6630,23 +6515,11 @@ version = "0.61.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" dependencies = [ - "windows-collections 0.2.0", + "windows-collections", "windows-core 0.61.2", - "windows-future 0.2.1", + "windows-future", "windows-link 0.1.3", - "windows-numerics 0.2.0", -] - -[[package]] -name = "windows" -version = "0.62.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" -dependencies = [ - "windows-collections 0.3.2", - "windows-core 0.62.2", - "windows-future 0.3.2", - "windows-numerics 0.3.1", + "windows-numerics", ] [[package]] @@ -6658,15 +6531,6 @@ dependencies = [ "windows-core 0.61.2", ] -[[package]] -name = "windows-collections" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" -dependencies = [ - "windows-core 0.62.2", -] - [[package]] name = "windows-core" version = "0.54.0" @@ -6724,18 +6588,7 @@ checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" dependencies = [ "windows-core 0.61.2", "windows-link 0.1.3", - "windows-threading 0.1.0", -] - -[[package]] -name = "windows-future" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" -dependencies = [ - "windows-core 0.62.2", - "windows-link 0.2.1", - "windows-threading 0.2.1", + "windows-threading", ] [[package]] @@ -6804,16 +6657,6 @@ dependencies = [ "windows-link 0.1.3", ] -[[package]] -name = "windows-numerics" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" -dependencies = [ - "windows-core 0.62.2", - "windows-link 0.2.1", -] - [[package]] name = "windows-result" version = "0.1.2" @@ -6980,15 +6823,6 @@ dependencies = [ "windows-link 0.1.3", ] -[[package]] -name = "windows-threading" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" -dependencies = [ - "windows-link 0.2.1", -] - [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" diff --git a/Cargo.toml b/Cargo.toml index 66f1bb3..0d5cc41 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ resolver = "2" members = ["crates/hyper-viz", "crates/hyper-viz-bevy", "crates/hyper-viz-python"] [workspace.package] -version = "0.1.0" +version = "0.1.1" edition = "2024" license = "MIT OR Apache-2.0" authors = ["Bregy Malpartida "] diff --git a/README.md b/README.md index 11c789b..f88f966 100644 --- a/README.md +++ b/README.md @@ -38,16 +38,15 @@ python -m pip install hypergraph-viz ``` The import name is `hyper_viz`. Wheels cover Linux x86_64, macOS arm64/x86_64, -and Windows x86_64; a compatible wheel requires no Rust compiler. The native -viewer remains a separate installation. From a repository checkout with -**Rust 1.89+**: +and Windows x86_64; a compatible wheel requires no Rust compiler. Install the native desktop viewer through the optional extra: ```bash -# Optional: install the native viewer as `hyper` on PATH -cargo install --path . --locked +python -m pip install "hypergraph-viz[viewer]" ``` -For a Python development build from this checkout: +The viewer needs a desktop session and graphics driver. Linux desktop wheels +require glibc 2.28+; macOS targets 11.0+. Rust is needed only for source builds. +For a Python development build from this checkout with **Rust 1.89+**: ```bash python -m venv .venv @@ -65,12 +64,13 @@ document = hyper_viz.HifDocument.load("dataset.hif.json") document.save("roundtrip.hif.json") print(document.to_json()) -# Requires the separately installed native viewer. +# Install hypergraph-viz[viewer] first. viewer = hyper_viz.show(document, projection="bipartite") exit_code = viewer.wait() # or viewer.close() to terminate ``` -Pass `executable="/path/to/hyper"` to select a viewer explicitly. The launcher +Pass `executable="/path/to/hyper"` to select a viewer explicitly. Otherwise the +launcher finds the matching companion package, then `hyper` on PATH. The launcher validates compatibility, starts the process asynchronously without a shell, and owns a temporary native snapshot that is cleaned up after exit. The Python extension itself does not depend on Bevy or download a viewer. @@ -92,7 +92,8 @@ See [HIF and Python integration](docs/HIF.md) for API details, generated typing, wheel builds, and runnable [XGI](crates/hyper-viz-python/examples/xgi_interop.py) and [Julia](examples/hif_interop.jl) interchange examples. Direct scientific object adapters, notebook embedding, layout bindings, and live updates from -Python are deferred. +Python are deferred. The [notebook prototype roadmap](docs/NOTEBOOK_ROADMAP.md) +sets out an anywidget canvas probe and Bevy/WASM feasibility checks. ## Ecosystem fit and measured findings @@ -144,6 +145,7 @@ rendering, and timeline views remain outside the current viewer scope. | [docs/HIF.md](docs/HIF.md) | Scientific interchange, Python API, supported semantics, and packaging | | [Measured ecosystem comparison](docs/benchmarks/ecosystem-2026-10-03/README.md) | Results, completion counts, raw evidence, and limitations | | [Community and ecosystem research](docs/ecosystem-comparison.md) | Positioning and roadmap evidence | +| [Notebook prototype roadmap](docs/NOTEBOOK_ROADMAP.md) | Small-dataset anywidget plan and WASM feasibility checks | | [Python release guide](docs/PYTHON_RELEASE.md) | PyPI Trusted Publisher setup and tag-based releases | | [docs/PUBLIC_RELEASE_CHECKLIST.md](docs/PUBLIC_RELEASE_CHECKLIST.md) | Maintainer release-decision checklist | | [CONTRIBUTING.md](CONTRIBUTING.md) | Dev setup and PR norms | diff --git a/crates/hyper-viz-bevy/Cargo.toml b/crates/hyper-viz-bevy/Cargo.toml index 15c6b98..c88cc41 100644 --- a/crates/hyper-viz-bevy/Cargo.toml +++ b/crates/hyper-viz-bevy/Cargo.toml @@ -24,7 +24,12 @@ rustdoc-args = ["--cfg", "docsrs"] [dependencies] serde_json = { workspace = true, optional = true } hyper-viz = { workspace = true } -bevy = { version = "0.18", default-features = true, features = ["wayland"] } +# Preserve Bevy's visual defaults without unused audio/gamepad native libraries. +bevy = { version = "0.18", default-features = false, features = [ + "default_app", "2d_bevy_render", "3d_bevy_render", "ui_bevy_render", "scene", "picking", + "std", "android-game-activity", "android_shared_stdcxx", "bevy_winit", + "default_font", "multi_threaded", "webgl2", "x11", "wayland", "sysinfo_plugin", +] } bevy_egui = "0.39" bevy_panorbit_camera = { version = "0.34", features = ["bevy_egui"] } winit = "0.30" diff --git a/crates/hyper-viz-python/README.md b/crates/hyper-viz-python/README.md index b52b15f..1aeecd6 100644 --- a/crates/hyper-viz-python/README.md +++ b/crates/hyper-viz-python/README.md @@ -40,13 +40,19 @@ not preserved. ## Launch the native viewer -Install Hyper's viewer separately from the -[Hyper repository](https://github.com/atomicstrata/hyper). From its checkout: +Install the matching prebuilt desktop viewer with the optional extra: ```sh -cargo install --path . --locked +python -m pip install "hypergraph-viz[viewer]" ``` +Wheels cover Linux x86_64, macOS arm64/x86_64, and Windows x86_64. No Rust +compiler or repository checkout is needed on these platforms. A desktop session +and graphics driver are required. Linux viewer wheels require glibc 2.28+; +macOS wheels target 11.0+. Notebook kernels on remote machines cannot open a +window on your laptop; see the +[notebook prototype roadmap](https://github.com/atomicstrata/hyper/blob/python-v0.1.1/docs/NOTEBOOK_ROADMAP.md). + Then launch it from Python: ```python @@ -56,7 +62,9 @@ exit_code = viewer.wait() ``` Pass `executable="/path/to/hyper"` to select a binary explicitly; otherwise the -launcher finds `hyper` on PATH. It launches asynchronously without a shell, +launcher finds the version-matched installed companion, then falls back to +`hyper` on PATH. It locates the companion through installed-package metadata, +so activating a virtual environment is not required. It launches asynchronously without a shell, retains an owned temporary snapshot, and cleans up after exit. It does not download a viewer. @@ -73,6 +81,6 @@ Malformed HIF raises `HifValidationError`. Both exceptions carry `location` and `reason`; file failures raise `OSError`. Direct scientific object adapters, notebook embedding, headless layout bindings, and live Python updates are deferred. -See the [integration guide](https://github.com/atomicstrata/hyper/blob/python-v0.1.0/docs/HIF.md) -and [XGI example](https://github.com/atomicstrata/hyper/blob/python-v0.1.0/crates/hyper-viz-python/examples/xgi_interop.py). +See the [integration guide](https://github.com/atomicstrata/hyper/blob/python-v0.1.1/docs/HIF.md) +and [XGI example](https://github.com/atomicstrata/hyper/blob/python-v0.1.1/crates/hyper-viz-python/examples/xgi_interop.py). Hyper is licensed under MIT OR Apache-2.0; the bundled HIF schema is MIT-licensed. diff --git a/crates/hyper-viz-python/pyproject.toml b/crates/hyper-viz-python/pyproject.toml index 618996b..bfb3ed0 100644 --- a/crates/hyper-viz-python/pyproject.toml +++ b/crates/hyper-viz-python/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "maturin" [project] name = "hypergraph-viz" -version = "0.1.0" +version = "0.1.1" requires-python = ">=3.10" description = "Rust-backed HIF interchange and native Hyper viewer launcher" readme = "README.md" @@ -20,9 +20,12 @@ classifiers = [ "Typing :: Typed", ] +[project.optional-dependencies] +viewer = ["hypergraph-viz-viewer==0.1.1"] + [project.urls] Homepage = "https://github.com/atomicstrata/hyper" -Documentation = "https://github.com/atomicstrata/hyper/blob/python-v0.1.0/docs/HIF.md" +Documentation = "https://github.com/atomicstrata/hyper/blob/python-v0.1.1/docs/HIF.md" Repository = "https://github.com/atomicstrata/hyper" Issues = "https://github.com/atomicstrata/hyper/issues" diff --git a/crates/hyper-viz-python/python/hyper_viz/_viewer.py b/crates/hyper-viz-python/python/hyper_viz/_viewer.py index 2a28076..8f56977 100644 --- a/crates/hyper-viz-python/python/hyper_viz/_viewer.py +++ b/crates/hyper-viz-python/python/hyper_viz/_viewer.py @@ -2,6 +2,7 @@ from __future__ import annotations import os +from importlib.metadata import PackageNotFoundError, distribution, version from pathlib import Path import shutil import subprocess @@ -68,6 +69,48 @@ def __exit__(self, *_: object) -> None: self.close() +def _resolve_executable(executable: str | os.PathLike[str] | None) -> str: + guidance = 'python -m pip install --upgrade "hypergraph-viz[viewer]"' + if executable is not None: + candidate = os.fspath(executable) + resolved = shutil.which(candidate) + if resolved is None: + raise FileNotFoundError(f"Cannot find executable {candidate!r}; install it or select an existing path") + return resolved + + try: + companion = distribution("hypergraph-viz-viewer") + except PackageNotFoundError: + companion = None + if companion is not None: + core_version = version("hypergraph-viz") + if companion.version != core_version: + raise RuntimeError( + f"Installed viewer {companion.version} does not match hypergraph-viz " + f"{core_version}; install matching packages with {guidance}" + ) + # pip rewrites the wheel's script RECORD to its actual installed path. + # Using it avoids assuming that the environment's Scripts/bin is on PATH. + binaries = [ + Path(str(companion.locate_file(record))).resolve() + for record in companion.files or [] + if record.name in ("hyper", "hyper.exe") + ] + if len(binaries) > 1: + raise RuntimeError(f"Installed viewer contains multiple executables; reinstall with {guidance}") + if not binaries or not binaries[0].is_file() or not os.access(binaries[0], os.X_OK): + raise FileNotFoundError(f"Installed viewer executable is missing or unusable; reinstall with {guidance}") + return str(binaries[0]) + + resolved = shutil.which("hyper") + if resolved is None: + raise FileNotFoundError( + f"Cannot find the native viewer; install it with {guidance}, " + "pass executable='/path/to/hyper', or put hyper on PATH" + ) + return resolved + + def show( document: HifDocument, *, @@ -76,20 +119,14 @@ def show( ) -> ViewerHandle: """Validate, snapshot, and launch Hyper asynchronously without shell execution. - Install the native Hyper binary separately, put it on PATH, or pass its path. + Install hypergraph-viz[viewer], put a native binary on PATH, or pass its path. No executable is downloaded automatically. Nonzero exit codes are returned by wait(); inherited stdout/stderr retain the viewer's diagnostics. """ if projection not in ("bipartite", "clique", "star"): raise ValueError("projection must be bipartite, clique, or star") raw = document.to_hypergraph_json() - candidate = os.fspath(executable) if executable is not None else "hyper" - resolved = shutil.which(candidate) - if resolved is None: - raise FileNotFoundError( - f"Cannot find executable {candidate!r}; install the native Hyper viewer " - "separately and pass executable='/path/to/hyper' or put it on PATH." - ) + resolved = _resolve_executable(executable) snapshot = tempfile.TemporaryDirectory(prefix="hyper-viz-") try: path = Path(snapshot.name) / "graph.json" diff --git a/crates/hyper-viz-python/tests/test_api.py b/crates/hyper-viz-python/tests/test_api.py index 608d29b..b7949e7 100644 --- a/crates/hyper-viz-python/tests/test_api.py +++ b/crates/hyper-viz-python/tests/test_api.py @@ -70,6 +70,15 @@ def test_close_terminates_and_cleanup_is_automatic(tmp_path): def test_launcher_failure_cleans_and_validates(monkeypatch, tmp_path): doc = hv.HifDocument.from_json('{"incidences":[]}') monkeypatch.setenv('PATH', str(tmp_path)) + # Exercise a missing installation even when the test environment has the extra. + import hyper_viz._viewer as launcher + from importlib.metadata import PackageNotFoundError + real_distribution = launcher.distribution + def without_companion(name): + if name == 'hypergraph-viz-viewer': + raise PackageNotFoundError(name) + return real_distribution(name) + monkeypatch.setattr(launcher, 'distribution', without_companion) with pytest.raises(FileNotFoundError, match='install'): hv.show(doc) with pytest.raises(FileNotFoundError): diff --git a/crates/hyper-viz-python/tests/test_viewer_installation.py b/crates/hyper-viz-python/tests/test_viewer_installation.py new file mode 100644 index 0000000..fde33f6 --- /dev/null +++ b/crates/hyper-viz-python/tests/test_viewer_installation.py @@ -0,0 +1,80 @@ +"""Installed-package discovery: no activation, downloads, or fake package API.""" +import csv +from importlib.metadata import version +import os +from pathlib import Path +import sys + +import pytest +from hyper_viz._viewer import _resolve_executable + + +def companion(tmp_path, monkeypatch, package_version=None, filenames=None): + site = tmp_path / 'site packages' + metadata = site / 'hypergraph_viz_viewer.dist-info' + metadata.mkdir(parents=True) + metadata.joinpath('METADATA').write_text( + 'Metadata-Version: 2.1\nName: hypergraph-viz-viewer\n' + f'Version: {package_version or version("hypergraph-viz")}\n' + ) + binaries = [] + for filename in filenames or ['hyper.exe' if sys.platform == 'win32' else 'hyper']: + binary = site.parent / 'bin with spaces' / filename + binary.parent.mkdir(exist_ok=True) + binary.write_text('#!/bin/sh\nexit 0\n') + binary.chmod(0o755) + binaries.append(binary) + with metadata.joinpath('RECORD').open('w', newline='') as stream: + writer = csv.writer(stream) + for binary in binaries: + writer.writerow([os.path.relpath(binary, site), '', '']) + writer.writerow(['hypergraph_viz_viewer.dist-info/METADATA', '', '']) + monkeypatch.syspath_prepend(str(site)) + monkeypatch.setenv('PATH', '') + return binaries + + +def test_companion_is_found_without_activating_environment(tmp_path, monkeypatch): + binaries = companion(tmp_path, monkeypatch) + assert Path(_resolve_executable(None)) == binaries[0] + + +def test_explicit_executable_overrides_mismatched_companion(tmp_path, monkeypatch): + companion(tmp_path, monkeypatch, '0.0.0') + assert Path(_resolve_executable(sys.executable)) == Path(sys.executable) + with pytest.raises(FileNotFoundError): + _resolve_executable(tmp_path / 'missing') + + +def test_companion_version_mismatch_has_install_guidance(tmp_path, monkeypatch): + companion(tmp_path, monkeypatch, '0.0.0') + with pytest.raises(RuntimeError, match=r'hypergraph-viz\[viewer\]'): + _resolve_executable(None) + + +def test_damaged_companion_is_reported(tmp_path, monkeypatch): + binaries = companion(tmp_path, monkeypatch) + binaries[0].unlink() + with pytest.raises(FileNotFoundError, match='reinstall'): + _resolve_executable(None) + + +def test_ambiguous_companion_is_rejected(tmp_path, monkeypatch): + companion(tmp_path, monkeypatch, filenames=['hyper', 'hyper.exe']) + with pytest.raises(RuntimeError, match='multiple'): + _resolve_executable(None) + + +@pytest.mark.skipif(sys.platform == 'win32', reason='Windows does not use POSIX executable bits') +def test_non_executable_companion_is_reported(tmp_path, monkeypatch): + binaries = companion(tmp_path, monkeypatch) + binaries[0].chmod(0o644) + with pytest.raises(FileNotFoundError, match='unusable'): + _resolve_executable(None) + + +def test_missing_record_is_reported(tmp_path, monkeypatch): + companion(tmp_path, monkeypatch) + (tmp_path / 'site packages' / 'hypergraph_viz_viewer.dist-info' / 'RECORD').unlink() + with pytest.raises(FileNotFoundError, match='reinstall'): + _resolve_executable(None) diff --git a/docs/DESKTOP_PACKAGE.md b/docs/DESKTOP_PACKAGE.md new file mode 100644 index 0000000..97144f8 --- /dev/null +++ b/docs/DESKTOP_PACKAGE.md @@ -0,0 +1,37 @@ +# Hyper desktop viewer + +Prebuilt native viewer for [hypergraph-viz](https://pypi.org/project/hypergraph-viz/). +Install the Python API and matching viewer together: + +```sh +python -m pip install "hypergraph-viz[viewer]" +``` + +```python +import hyper_viz + +document = hyper_viz.HifDocument.load("dataset.hif.json") +viewer = hyper_viz.show(document, projection="bipartite") +viewer.wait() # Or viewer.close() to terminate. +``` + +No repository checkout or Rust compiler is needed on supported platforms. +The viewer executable is also available as `hyper` in your Python environment. +The launcher locates it through installed-package metadata, so activating the +virtual environment is optional when running that environment's Python. + +Wheels cover Linux x86_64, macOS arm64/x86_64, and Windows x86_64. A desktop +session and working graphics driver are required. The viewer runs on the +machine executing Python; it does not embed into a notebook or send a window +from a remote kernel to your browser. Use the +[notebook prototype roadmap](https://github.com/atomicstrata/hyper/blob/python-v0.1.1/docs/NOTEBOOK_ROADMAP.md) +for the planned browser frontend. + +This package contains a native binary, not a Python extension. It does not +include HIF Python bindings by itself; use the `[viewer]` extra shown above. +An explicit `executable="/path/to/hyper"` still overrides the packaged binary. +There are no downloads during `show()`. + +MIT OR Apache-2.0. The bundled HIF schema is MIT-licensed. Graphics drivers +remain system dependencies. Linux binary dependencies are audited without bundling external libraries. +Unused audio and gamepad backends are excluded from the desktop build. diff --git a/docs/HIF.md b/docs/HIF.md index 7eabf93..1485701 100644 --- a/docs/HIF.md +++ b/docs/HIF.md @@ -57,16 +57,16 @@ document = hyper_viz.HifDocument.load("dataset.hif.json") document.save("roundtrip.hif.json") print(document.to_json()) -# Install/build the native viewer separately, then: -viewer = hyper_viz.show(document, executable="/path/to/hyper", projection="bipartite") +# Install hypergraph-viz[viewer], then: +viewer = hyper_viz.show(document, projection="bipartite") code = viewer.wait() # or viewer.close() to terminate ``` `HifDocument.from_json(raw)` accepts HIF JSON; `from_hypergraph_json(raw)` accepts native JSON. `to_hypergraph_json()` explicitly checks viewer compatibility. File arguments on document methods are strings; the launcher also accepts `pathlib.Path`. -`HifValidationError` and `HifCompatibilityError` expose `location` and `reason`. I/O failures raise `OSError`. The launcher validates before launching, resolves an explicit executable or `hyper` on PATH, never invokes a shell, and inherits stdout/stderr. It creates an owned temporary snapshot, returns immediately, and cleans up automatically when the viewer exits. `wait()` returns nonzero exit codes without hiding diagnostics. A timeout preserves the running process and snapshot. `close()` terminates, waits five seconds, then kills if necessary. A context manager closes on exit. Dropping the handle keeps the viewer open; a background waiter retains ownership until exit. +`HifValidationError` and `HifCompatibilityError` expose `location` and `reason`. I/O failures raise `OSError`. The launcher validates before launching and resolves an explicit executable, a version-matched installed `hypergraph-viz-viewer` binary, or `hyper` on PATH, in that order. Companion discovery uses installed RECORD metadata and works without virtual-environment activation. Missing/damaged installations raise `FileNotFoundError` with reinstall guidance; companion/core version mismatches raise `RuntimeError`. It never invokes a shell and inherits stdout/stderr. It creates an owned temporary snapshot, returns immediately, and cleans up automatically when the viewer exits. `wait()` returns nonzero exit codes without hiding diagnostics. A timeout preserves the running process and snapshot. `close()` terminates, waits five seconds, then kills if necessary. A context manager closes on exit. Dropping the handle keeps the viewer open; a background waiter retains ownership until exit. -Viewer binaries are separate optional installations; nothing is downloaded on first launch. Live Python updates, notebook embedding, analysis/layout bindings, and direct scientific-library object adapters are outside this release. +Install the desktop wheel with `python -m pip install "hypergraph-viz[viewer]"`; no Rust compiler or checkout is needed. The companion is pinned to the core version. Linux desktop wheels require glibc 2.28+, macOS wheels target 11.0+, and Windows wheels target x86_64. A desktop session and a working graphics driver are required; graphics drivers remain system dependencies. For source installation, use `cargo install --path . --locked`. Nothing is downloaded on first launch. Live Python updates, notebook embedding, analysis/layout bindings, and direct scientific-library object adapters are outside this release. See the [notebook prototype roadmap](NOTEBOOK_ROADMAP.md) for the next anywidget canvas and WASM probes. ## XGI and Julia diff --git a/docs/NOTEBOOK_ROADMAP.md b/docs/NOTEBOOK_ROADMAP.md new file mode 100644 index 0000000..0da63c8 --- /dev/null +++ b/docs/NOTEBOOK_ROADMAP.md @@ -0,0 +1,133 @@ +# Notebook prototype: anywidget canvas and a small dataset + +Status: planned follow-up after desktop wheels. There is no `[notebook]` extra +or `hyper_viz.widget()` API in the current release. Desktop `show()` opens a +window on the kernel machine; it does not display inside a remote notebook. + +## Goal and first dataset + +Prove that a pip-installed widget can render a small compatible HIF document in +a notebook cell and exchange selections with Python. Use +[`fixtures/notebook-small.hif.json`](../fixtures/notebook-small.hif.json): + +- 7 nodes, including distinct integer `1` and string `"1"`, plus an isolated node. +- 4 edges: a pair, a triple, an overlapping triple, and an empty edge. +- 8 incidences; nested metadata, arbitrary attributes, and a node/edge weight. + +This fixture is also used for desktop graphics startup tests. It is synthetic; +it is not a performance benchmark or evidence of notebook compatibility. + +## Proposed user experience + +The following API is a design target, not runnable today: + +```sh +python -m pip install "hypergraph-viz[notebook]" +``` + +```python +import hyper_viz + +document = hyper_viz.HifDocument.load("notebook-small.hif.json") +view = hyper_viz.widget(document) +view # Inline notebook output; no desktop process or viewer wheel. +``` + +Keep `show()` explicitly desktop and `widget()` explicitly inline. The Python +kernel retains the original HIF document for export. An anywidget frontend +receives a compatible display snapshot and owns its canvas and interaction. + +## Step 1: establish widget transport and lifecycle + +Create a disposable prototype using anywidget and traitlets. Pin their actual +versions in the prototype environment and record Python, notebook, and browser +versions. Package the frontend ESM/CSS locally; consumers should need neither +Node.js nor external CDN access. + +1. Validate the fixture with `HifDocument` and obtain `to_hypergraph_json()`. + The existing Python package exposes native JSON, not headless scene/layout + bindings. Do not assume a projection or layout Python API already exists. +2. Draw a simple Canvas2D diagnostic with fixed, seeded coordinates. Show all + seven nodes, group membership, and an explicit list for the empty edge. + This is a transport/identity test, not the final 3D renderer. +3. Click a node or group and synchronize selected IDs back to Python. Highlight + a Python-driven selection in the frontend. Keep camera and pointer movement + local; do not send every animation frame through the kernel. +4. Display arbitrary attributes for the selection without interpreting attribute + names as status or coloring. Fetch original metadata from the retained + document when needed rather than treating display JSON as a lossless export. +5. Re-render the same widget and create two independent widgets. Dispose event + listeners, observers, animation loops, and graphics resources when a view is + removed. Closing one view must not corrupt another view of the same model. + +Use the type-prefixed native IDs as browser keys and map selections back to +original HIF identities in Python. Do not use row indexes or plain object keys +that collapse integer/string identities. For future large integer IDs, transmit +integer identity as a tagged decimal string rather than a JavaScript Number. + +## Step 2: test Bevy/WASM reuse before choosing the 3D frontend + +Run a separate feasibility probe; do not assume the desktop dependency graph +compiles for the browser. The current `hyper-viz-bevy` manifest enables desktop +Bevy defaults and Wayland. The core's dependency features also need inspection. + +```sh +rustup target add wasm32-unknown-unknown +cargo check -p hyper-viz --target wasm32-unknown-unknown +``` + +Record failures, including random-number generation and schema-validation +features. Keep HIF validation in the Python kernel for the first widget; a +browser build need not include the complete schema validator. If required, +separate portable scene/layout code from platform-specific dependencies through +explicit features rather than hiding incompatibility. + +Build a small browser entry point with a dedicated feature set and a canvas +owned by the widget. Test WebGL2 first for broad compatibility; assess WebGPU +separately. Verify shader/asset delivery, pointer and keyboard focus, resizing, +multiple canvases, and teardown. Confirm a second view can start after the first +is removed without retaining an old event loop or GPU context. + +Compare two concrete probes: + +| Probe | Evidence required | +|---|---| +| Bevy renderer compiled to WASM | Successfully render the fixture in the widget; demonstrate picking, resize, and clean disposal; measure cold/warm load and bundle size | +| Browser renderer with selected Rust algorithms in WASM | Same fixture and interaction checks; establish the work required for hulls, picking, and UI parity; identify algorithms that can run in a worker | + +Choose based on measured integration cost and behavior, not the assumption that +WASM is automatically faster or that a successful compile proves notebook DX. +WASM runs inside the frontend; it does not replace anywidget's kernel connection. + +## Step 3: verify environments and decide whether to productize + +Start with JupyterLab and VS Code notebooks, then test Colab and a remote Jupyter +kernel explicitly. Anywidget supports those hosts; Hyper compatibility still +has to be demonstrated in each one. Also test a fresh kernel, rerunning a cell, +multiple views, a kernel restart, and a document rejected by viewer compatibility. + +Acceptance criteria for this small prototype: + +- All nodes/edges are represented, including isolates and the empty edge list. +- Integer/string identity remains distinct in display and selection round-trips. +- Selecting an object exposes its metadata; scientific export remains unchanged. +- Python-to-browser and browser-to-Python selection updates work independently + for two widgets, without duplicate events or stale state after reruns. +- Bundled assets load with external networking disabled in the local Jupyter + test. Document any host-specific asset-delivery or content-security restrictions. +- Capture a screenshot and record cold/warm startup, bundle size, selection + response, and retained resources after repeated creation/disposal. These are + prototype observations, not a comparison with native benchmarks. + +Only after these checks define and publish the `[notebook]` extra, the widget API, +and supported host versions. Add binary buffers and workers when measured costs +justify them; preserve a bounded state/update protocol with sequence numbers. +Notebook support, standalone browser hosting, browser-side HIF validation, and +full desktop feature parity are separate delivery decisions. + +## References + +- [anywidget getting started](https://anywidget.dev/en/getting-started/) +- [Widget state, messages, and binary buffers](https://anywidget.dev/en/jupyter-widgets-the-good-parts/) +- [anywidget bundling](https://anywidget.dev/en/bundling/) +- [Bevy browser examples](https://bevy.org/examples/) diff --git a/docs/PYTHON_RELEASE.md b/docs/PYTHON_RELEASE.md index 2dd8c6a..cfa6afb 100644 --- a/docs/PYTHON_RELEASE.md +++ b/docs/PYTHON_RELEASE.md @@ -1,94 +1,109 @@ -# Publishing the Python package +# Publishing the Python packages -Distribution name: `hypergraph-viz`. Import name: `hyper_viz`. Initial version: `0.1.0`. -The native viewer is installed separately; the Python wheels contain interchange -bindings and the launcher, not Bevy or a viewer executable. +`hypergraph-viz` provides the `hyper_viz` import, HIF bindings, typing, and a +launcher. `hypergraph-viz-viewer` provides the native desktop executable. +Release both at `0.1.1`; `hypergraph-viz[viewer]` pins the companion to the core +version. Installing the core alone does not install Bevy or a viewer. -PyPI treats hyphens and underscores as equivalent in project names. The original -`hyper-viz` / `hyper_viz` distribution name was rejected as too similar to an -existing project. Changing the distribution does not change the import. +PyPI treats hyphens and underscores as equivalent. The original `hyper-viz` / +`hyper_viz` distribution name was rejected as too similar to an existing project. +The distribution name does not change the Python import. ## One-time PyPI setup -Use a PyPI account with two-factor authentication. For the first release, add a -pending GitHub Trusted Publisher at : +Configure a GitHub Trusted Publisher for **each** project. For a new project, +add a pending publisher at . For an +existing project, use its publishing settings. | Field | Value | |---|---| -| PyPI project name | `hypergraph-viz` | +| PyPI project names | `hypergraph-viz` and `hypergraph-viz-viewer` (separate entries) | | GitHub owner | `atomicstrata` | | Repository | `hyper` | | Workflow filename | `python.yml` | | Environment name | `pypi` | -If the project already exists under your account, add the same publisher under -its project publishing settings instead. Pending publishers do not reserve a -name: PyPI creates the project on the first successful upload. +Pending publishers do not reserve names; the first successful upload creates the +project. Both publishers have been configured for this release. Create the +`pypi` GitHub environment too. The workflow requests `id-token: write` only in +the publish job; no long-lived API token is needed. Any configured environment +reviewers must approve that job before it runs. -Create the `pypi` GitHub environment in the repository settings. The workflow -uses that exact environment and requests `id-token: write` only in the publish -job. No long-lived PyPI API token or password is stored in GitHub. Any configured -environment reviewers must approve the publication job before it runs. - -See PyPI's official [pending publisher instructions](https://docs.pypi.org/trusted-publishers/creating-a-project-through-oidc/) +See PyPI's [pending publisher instructions](https://docs.pypi.org/trusted-publishers/creating-a-project-through-oidc/) and [publishing instructions](https://docs.pypi.org/trusted-publishers/using-a-publisher/). ## Release a version -1. Prefer a merged release commit and verify the `python wheels and release` workflow - passes on the commit being released. It checks generated stubs, Rust/Python - tests, clean wheel installs, and source-distribution completeness. - A release may also tag an explicitly chosen validated commit while its PR - remains open; the tag workflow builds and tests that exact source again. -2. Keep `[workspace.package].version` in the root `Cargo.toml` and - `[project].version` in `crates/hyper-viz-python/pyproject.toml` identical. - Update the package documentation links to the new release tag too. -3. Tag that commit with `python-v` followed by the exact version. For `0.1.0`: +1. Validate the release commit with `python wheels and release`. It checks stubs, + Rust/Python tests, clean installs, standalone core source builds, four desktop + binary wheels, and installation through the viewer extra. Linux also captures + a real window using software Vulkan and Xvfb. macOS arm64 graphics startup was + checked locally; Windows and macOS Intel CI verify CLI startup and discovery, + without claiming graphics coverage on those systems. +2. Keep versions identical in `[workspace.package]` of `Cargo.toml`, `[project]` + of the root `pyproject.toml`, and `[project]` of + `crates/hyper-viz-python/pyproject.toml`. Regenerate `Cargo.lock`, update the + exact `[viewer]` dependency, and update release-tag documentation URLs. +3. Tag the validated commit. Prefer a merged release commit; an explicitly + selected validated PR commit can also be released. For `0.1.1`: ```sh - git switch main - git pull --ff-only - git tag python-v0.1.0 - git push origin python-v0.1.0 + git tag python-v0.1.1 + git push origin python-v0.1.1 ``` -The tag triggers `.github/workflows/python.yml`. The version check rejects tags -that disagree with the package version. All four platform wheel jobs and the -source-distribution job must pass before the publishing job downloads their -artifacts and uploads them through PyPI Trusted Publishing. Pull requests, -branch pushes, and manual workflow runs never publish. +The tag workflow builds and tests that exact source again. Versions must match +`python-v`. All build and integration jobs gate publication. The +publisher uploads the companion first, then the core, so the extra's exact +viewer dependency is available when the core is released. Pull requests, branch +pushes, and manual runs never publish. + +The core ships CPython 3.10+ `abi3` wheels for Linux x86_64, macOS arm64/x86_64, +and Windows x86_64, plus a source archive. The source helper +(`scripts/releases/build_python_sdist.py`) stages only the core and bindings, +excluding the root desktop project and retaining locked dependencies. CI builds +and installs a wheel from this archive. -Wheels target standard CPython 3.10+ using `abi3`: Linux x86_64, macOS arm64 and -x86_64, and Windows x86_64. A source archive provides a fallback for users with -a Rust toolchain. The source-packaging helper (`scripts/releases/build_python_sdist.py`) creates a -virtual workspace containing only the core and bindings, retaining the locked -dependency versions. CI builds a wheel from that archive to check it contains the -Rust core, pinned HIF schema, Python sources, typing, and licenses. +The companion ships `py3-none` platform wheels containing a native executable; +there is no desktop source archive. Maturin installs it in the environment's +scripts directory and records its installed location. Linux desktop wheels +require glibc 2.28+, macOS requires 11.0+, and Windows targets x86_64. A desktop +session and working graphics driver remain required. Build from source with +`cargo install --path . --locked` on other supported Rust targets. Wheel checks +verify executable format/permissions, package identity, bundled licenses, and +the default 100 MiB PyPI file limit. -## Verify the published package +## Verify the published packages -Use a fresh CPython 3.10+ virtual environment and the normal PyPI index: +Use a fresh standard CPython 3.10+ environment and the normal PyPI index: ```sh python -m venv /tmp/hyper-release-check -. /tmp/hyper-release-check/bin/activate -python -m pip install --only-binary=:all: hypergraph-viz==0.1.0 -python - <<'PY' +/tmp/hyper-release-check/bin/python -m pip install --only-binary=:all: "hypergraph-viz[viewer]==0.1.1" +/tmp/hyper-release-check/bin/python - <<'PY' +import os +import subprocess +from importlib.metadata import version from hyper_viz import HifDocument +from hyper_viz._viewer import _resolve_executable +assert version("hypergraph-viz") == version("hypergraph-viz-viewer") == "0.1.1" document = HifDocument.from_json('{"incidences":[{"node":"a","edge":"e"}]}') assert 's:a' in document.to_hypergraph_json() -assert document.to_json() +os.environ["PATH"] = "" # Discovery works without activation. +subprocess.run([_resolve_executable(None), "--version"], check=True) PY ``` -Adapt the virtual-environment path/activation for Windows. Confirm the PyPI -page renders the package README, lists all platform wheels and the source -archive, and shows the correct version. Install the viewer separately to check -`show()`; importing or exchanging HIF requires no viewer. +Adapt the environment path for Windows. Confirm both PyPI pages render their +README and list all four wheels; the core also lists its source archive. On a +local desktop, launch `hyper_viz.show(document)` and close its window to check +actual graphics. A remote notebook kernel does not display this window in the +browser; see the [notebook prototype roadmap](NOTEBOOK_ROADMAP.md). PyPI releases cannot be overwritten. If an uploaded release is unusable, yank -it through PyPI and publish a corrected higher version; do not reuse the tag or -version. If an upload partially succeeds, inspect the published files before -retrying and upload only missing files. The workflow does not silently skip -existing distributions. +it and publish a higher version. Do not reuse or move its tag. If an upload +partially succeeds, inspect the published files and retry only missing files; +the workflow does not silently skip existing distributions. If only the +companion upload succeeds, finish the matching core upload from the tested +artifacts before announcing the extra. diff --git a/docs/superpowers/plans/2026-10-04-desktop-wheels.md b/docs/superpowers/plans/2026-10-04-desktop-wheels.md new file mode 100644 index 0000000..11e2c55 --- /dev/null +++ b/docs/superpowers/plans/2026-10-04-desktop-wheels.md @@ -0,0 +1,41 @@ +# Desktop wheels and notebook prototype follow-up + +User-authorized scope: ship the desktop companion wheels and document the next +anywidget prototype. Continue in the existing PR #8 worktree. + +## Delivery contract + +- `hypergraph-viz[viewer]` installs a version-matched `hypergraph-viz-viewer` wheel. +- Resolution: explicit executable, installed companion's RECORD, then PATH. + It must work without activating the Python environment. No runtime downloads. +- Keep core wheels and source archives free of Bevy; companion wheels contain + the existing native CLI, MIT/Apache licenses, and the bundled HIF schema license. +- Release 0.1.1 for both distributions on Linux x86_64, macOS arm64/Intel, and + Windows x86_64. PyPI's companion publisher requires user account setup. +- Validate executable identity, installation, real process startup, temporary + snapshot cleanup, and Linux software-rendered window creation. +- Document the notebook prototype; do not add a notebook API in this release. + +## Tasks + +1. Add failing executable-discovery tests using real temporary distribution + metadata. Implement installed-binary resolution, compatibility errors, + explicit override, and missing-install guidance. Run the full Python suite. +2. Package the root CLI through maturin's binary bindings. Version all packages + 0.1.1, pin the optional dependency, check wheel contents, and clean-install + the locally built companion. Preserve the independently built core sdist. +3. Extend the existing release matrix with desktop build/install/startup checks + and gate publishing on core and desktop jobs. Verify actual graphics startup + on local macOS and Linux software Vulkan/Xvfb in CI. Obtain an independent + final review and fix important findings before tagging. +4. Update installation and release docs and add a small-dataset anywidget plan. + Push PR #8, tag after verification and publisher setup, monitor all jobs, + then clean-install the extra from public PyPI and launch its binary. + +## Review focus + +- Missing executable despite an installed companion; damaged or ambiguous RECORD. +- Core/companion mismatch and override priority. +- Inactive virtual environment and paths containing spaces. +- Native platform tags, binary permissions, libraries, licenses, and wheel size. +- No claim that a CLI help check proves graphics startup or notebook support. diff --git a/fixtures/notebook-small.hif.json b/fixtures/notebook-small.hif.json new file mode 100644 index 0000000..e1a8417 --- /dev/null +++ b/fixtures/notebook-small.hif.json @@ -0,0 +1,21 @@ +{ + "network-type": "undirected", + "metadata": {"name": "Notebook prototype", "source": {"kind": "synthetic", "seed": 20261004}}, + "nodes": [ + {"node": 0, "attrs": {"label": "Zero", "category": "A"}}, + {"node": 1, "attrs": {"label": "Integer one", "score": 1.25}}, + {"node": "1", "attrs": {"label": "String one", "category": "B"}}, + {"node": "b"}, {"node": "c"}, {"node": "d"}, + {"node": "isolated", "attrs": {"note": "No memberships"}} + ], + "edges": [ + {"edge": "pair"}, {"edge": "triple", "weight": 1.5}, + {"edge": "overlap", "attrs": {"evidence": ["synthetic", null]}}, + {"edge": "empty"} + ], + "incidences": [ + {"node": 0, "edge": "pair"}, {"node": 1, "edge": "pair"}, + {"node": 1, "edge": "triple"}, {"node": "1", "edge": "triple"}, {"node": "b", "edge": "triple"}, + {"node": "b", "edge": "overlap"}, {"node": "c", "edge": "overlap"}, {"node": "d", "edge": "overlap"} + ] +} diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..ff6764a --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,29 @@ +[build-system] +requires = ["maturin==1.9.6"] +build-backend = "maturin" + +[project] +name = "hypergraph-viz-viewer" +version = "0.1.1" +requires-python = ">=3.10" +description = "Prebuilt Hyper native desktop viewer for hypergraph-viz" +readme = "docs/DESKTOP_PACKAGE.md" +license = "MIT OR Apache-2.0" +classifiers = [ + "Development Status :: 3 - Alpha", + "Topic :: Scientific/Engineering :: Visualization", + "Programming Language :: Rust", +] + +[project.urls] +Homepage = "https://github.com/atomicstrata/hyper" +Documentation = "https://github.com/atomicstrata/hyper/blob/python-v0.1.1/docs/HIF.md" +Issues = "https://github.com/atomicstrata/hyper/issues" + +[tool.maturin] +bindings = "bin" +strip = true +include = [ + {path = "NOTICE", format = "wheel"}, + {path = "crates/hyper-viz/schemas/HIF-LICENSE", format = "wheel"}, +] diff --git a/scripts/releases/check_desktop_dependencies.py b/scripts/releases/check_desktop_dependencies.py new file mode 100644 index 0000000..c08db4c --- /dev/null +++ b/scripts/releases/check_desktop_dependencies.py @@ -0,0 +1,9 @@ +"""Reject unused native audio/gamepad dependencies in the desktop executable.""" +import subprocess + +packages = subprocess.check_output([ + 'cargo', 'tree', '--locked', '-p', 'hyper', '--prefix', 'none', +], text=True) +for package in ('bevy_audio', 'bevy_gilrs', 'alsa-sys', 'libudev-sys'): + assert not any(line.startswith(package + ' ') for line in packages.splitlines()), f'Unexpected desktop dependency: {package}' +print('Desktop dependency graph excludes native audio/gamepad libraries') diff --git a/scripts/releases/check_desktop_wheel.py b/scripts/releases/check_desktop_wheel.py new file mode 100644 index 0000000..c966077 --- /dev/null +++ b/scripts/releases/check_desktop_wheel.py @@ -0,0 +1,28 @@ +"""Check the portable desktop wheel before installing or publishing it.""" +from email.parser import Parser +from pathlib import Path +import sys +import zipfile + +wheels = list(Path(sys.argv[1]).glob('*.whl')) +assert wheels, 'No desktop wheels built' +for wheel in wheels: + with zipfile.ZipFile(wheel) as archive: + names = archive.namelist() + assert not any('.libs/' in n or '.so' in n for n in names), 'Unexpected bundled shared libraries: audit without repair' + metadata = Parser().parsestr(archive.read(next(n for n in names if n.endswith('/METADATA'))).decode()) + assert metadata['Name'] == 'hypergraph-viz-viewer', metadata['Name'] + assert metadata['Requires-Python'] == '>=3.10' + binary = [n for n in names if '.data/scripts/' in n and n.rsplit('/', 1)[-1] in ('hyper', 'hyper.exe')] + assert len(binary) == 1, binary + data = archive.read(binary[0]) + assert data[:4] in (b'\x7fELF', b'\xcf\xfa\xed\xfe', b'\xfe\xed\xfa\xcf', b'\xca\xfe\xba\xbe') or data[:2] == b'MZ' + if not wheel.name.endswith('win_amd64.whl'): + assert (archive.getinfo(binary[0]).external_attr >> 16) & 0o111, 'Executable permission missing' + assert any('LICENSE-MIT' in n for n in names) + assert any('LICENSE-APACHE' in n for n in names) + assert any(n.endswith('/schemas/HIF-LICENSE') for n in names), 'Missing HIF schema license' + assert any(n.endswith('NOTICE') for n in names) + assert '-py3-none-' in wheel.name and not wheel.name.endswith('-any.whl'), wheel.name + assert wheel.stat().st_size < 100 * 1024 * 1024, 'Wheel exceeds default PyPI file limit' + print(f'Checked desktop wheel {wheel.name} ({wheel.stat().st_size // 1024 // 1024} MiB)') diff --git a/scripts/releases/smoke_desktop.py b/scripts/releases/smoke_desktop.py new file mode 100644 index 0000000..3422e07 --- /dev/null +++ b/scripts/releases/smoke_desktop.py @@ -0,0 +1,62 @@ +"""Verify installed desktop identity; optionally render a finite real window.""" +import argparse +from importlib.metadata import distribution, version +import os +from pathlib import Path +import subprocess +import tempfile +import time + +parser = argparse.ArgumentParser(description=__doc__) +parser.add_argument('--render', action='store_true') +parser.add_argument('--viewer-only', action='store_true') +parser.add_argument('--output', type=Path, default=Path('target/desktop-smoke')) +args = parser.parse_args() + +companion = distribution('hypergraph-viz-viewer') +if args.viewer_only: + assert not args.render, '--render requires the core package' + core = companion.version +else: + import hyper_viz + from hyper_viz._viewer import _resolve_executable + core = version('hypergraph-viz') + assert companion.version == core +# Empty PATH deliberately proves that activation is unnecessary. +os.environ['PATH'] = '' +os.environ['HYPER_VIZ_SESSION'] = 'off' +if args.viewer_only: + binaries = [Path(str(companion.locate_file(f))).resolve() for f in companion.files or [] if f.name in ('hyper', 'hyper.exe')] + assert len(binaries) == 1, binaries + executable = str(binaries[0]) +else: + executable = _resolve_executable(None) +result = subprocess.run([executable, '--version'], check=True, capture_output=True, text=True, timeout=30) +assert result.stdout.strip() == f'hyper {core}', result.stdout +subprocess.run([executable, '--help'], check=True, stdout=subprocess.DEVNULL, timeout=30) +print(f'Installed desktop executable found without PATH: {executable}') + +if args.render: + args.output.mkdir(parents=True, exist_ok=True) + fixture = Path(__file__).resolve().parents[2] / 'fixtures/notebook-small.hif.json' + doc = hyper_viz.HifDocument.load(str(fixture)) + doc.to_hypergraph_json() + with tempfile.TemporaryDirectory(dir=args.output, prefix='render-') as directory: + folder = Path(directory) + subprocess.run([ + executable, str(fixture), '--format', 'hif', '--tour', '--frames', '3', + '--warmup', '0', '--capture', str(folder / 'frames'), '--report', str(folder / 'frames.csv'), + ], check=True, timeout=180) + frames = list((folder / 'frames').glob('*.png')) + assert len(frames) == 3, frames + assert all(frame.read_bytes().startswith(b'\x89PNG\r\n\x1a\n') for frame in frames) + assert (folder / 'frames.csv').is_file() + # Preserve the final frame for CI/manual visual inspection. + (args.output / 'render.png').write_bytes(sorted(frames)[-1].read_bytes()) + with hyper_viz.show(doc) as viewer: + snapshot = Path(viewer._snapshot.name) + time.sleep(2) + assert viewer.poll() is None, 'Viewer exited before explicit close' + assert viewer.poll() is not None + assert not snapshot.exists(), 'Temporary snapshot was not cleaned up' + print('Native graphics capture and Python launch/close/cleanup passed.') From 90f4adc073da07515684c4ecdda638c0ce7b07f7 Mon Sep 17 00:00:00 2001 From: Bregy Malpartida Date: Sun, 4 Oct 2026 14:37:34 -0500 Subject: [PATCH 6/9] Expose native viewer version for installation checks --- src/main.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main.rs b/src/main.rs index 7f5db82..0ad502b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,6 +8,7 @@ use tracing_subscriber::EnvFilter; #[derive(Parser, Debug)] #[command( name = "hyper", + version, about = "General-purpose 3D hypergraph viewer", after_help = "Omit FILE to open the built-in coauthorship demo." )] From a353626084d32da61e70e4dd6f24e9f498513d76 Mon Sep 17 00:00:00 2001 From: Bregy Malpartida Date: Sun, 4 Oct 2026 15:02:03 -0500 Subject: [PATCH 7/9] Clarify desktop platform requirements and WASM feature probe --- docs/DESKTOP_PACKAGE.md | 4 ++-- docs/NOTEBOOK_ROADMAP.md | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/DESKTOP_PACKAGE.md b/docs/DESKTOP_PACKAGE.md index 97144f8..d22ce3b 100644 --- a/docs/DESKTOP_PACKAGE.md +++ b/docs/DESKTOP_PACKAGE.md @@ -20,8 +20,8 @@ The viewer executable is also available as `hyper` in your Python environment. The launcher locates it through installed-package metadata, so activating the virtual environment is optional when running that environment's Python. -Wheels cover Linux x86_64, macOS arm64/x86_64, and Windows x86_64. A desktop -session and working graphics driver are required. The viewer runs on the +Wheels cover Linux x86_64 (glibc 2.28+), macOS arm64/x86_64 (11.0+), and +Windows x86_64. A desktop session and working graphics driver are required. The viewer runs on the machine executing Python; it does not embed into a notebook or send a window from a remote kernel to your browser. Use the [notebook prototype roadmap](https://github.com/atomicstrata/hyper/blob/python-v0.1.1/docs/NOTEBOOK_ROADMAP.md) diff --git a/docs/NOTEBOOK_ROADMAP.md b/docs/NOTEBOOK_ROADMAP.md index 0da63c8..a811c94 100644 --- a/docs/NOTEBOOK_ROADMAP.md +++ b/docs/NOTEBOOK_ROADMAP.md @@ -68,8 +68,9 @@ integer identity as a tagged decimal string rather than a JavaScript Number. ## Step 2: test Bevy/WASM reuse before choosing the 3D frontend Run a separate feasibility probe; do not assume the desktop dependency graph -compiles for the browser. The current `hyper-viz-bevy` manifest enables desktop -Bevy defaults and Wayland. The core's dependency features also need inspection. +compiles for the browser. The current `hyper-viz-bevy` manifest selects visual +Bevy features and desktop window backends, including Wayland, while excluding +audio and gamepads. The core's dependency features also need inspection. ```sh rustup target add wasm32-unknown-unknown From 5d7ecece97025466d2c3fe5b5d4a044f8671fcc9 Mon Sep 17 00:00:00 2001 From: Bregy Malpartida Date: Sun, 4 Oct 2026 15:29:26 -0500 Subject: [PATCH 8/9] Link Windows desktop runtime statically for portable 0.1.2 wheels --- .github/workflows/python.yml | 5 +++++ Cargo.lock | 8 ++++---- Cargo.toml | 2 +- crates/hyper-viz-python/README.md | 6 +++--- crates/hyper-viz-python/pyproject.toml | 6 +++--- docs/DESKTOP_PACKAGE.md | 5 +++-- docs/PYTHON_RELEASE.md | 17 ++++++++++------- .../plans/2026-10-04-desktop-wheels.md | 4 ++-- pyproject.toml | 4 ++-- scripts/releases/check_desktop_wheel.py | 8 +++++++- 10 files changed, 40 insertions(+), 25 deletions(-) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index 3a5aea1..99705f5 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -172,8 +172,13 @@ jobs: - uses: Swatinem/rust-cache@v2 - name: Check desktop native dependencies run: python scripts/releases/check_desktop_dependencies.py + - name: Install Windows binary inspection tool + if: runner.os == 'Windows' + run: python -m pip install pefile==2024.8.26 - name: Build desktop wheel uses: PyO3/maturin-action@v1 + env: + RUSTFLAGS: ${{ runner.os == 'Windows' && '-C target-feature=+crt-static' || '' }} with: maturin-version: '1.9.6' rust-toolchain: '1.89.0' diff --git a/Cargo.lock b/Cargo.lock index 8000d15..b75b36b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3164,7 +3164,7 @@ checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" [[package]] name = "hyper" -version = "0.1.1" +version = "0.1.2" dependencies = [ "clap", "hyper-viz", @@ -3175,7 +3175,7 @@ dependencies = [ [[package]] name = "hyper-viz" -version = "0.1.1" +version = "0.1.2" dependencies = [ "jsonschema", "num-bigint", @@ -3189,7 +3189,7 @@ dependencies = [ [[package]] name = "hyper-viz-bevy" -version = "0.1.1" +version = "0.1.2" dependencies = [ "bevy", "bevy_egui", @@ -3205,7 +3205,7 @@ dependencies = [ [[package]] name = "hyper-viz-python" -version = "0.1.1" +version = "0.1.2" dependencies = [ "hyper-viz", "pyo3", diff --git a/Cargo.toml b/Cargo.toml index 0d5cc41..89dd14a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ resolver = "2" members = ["crates/hyper-viz", "crates/hyper-viz-bevy", "crates/hyper-viz-python"] [workspace.package] -version = "0.1.1" +version = "0.1.2" edition = "2024" license = "MIT OR Apache-2.0" authors = ["Bregy Malpartida "] diff --git a/crates/hyper-viz-python/README.md b/crates/hyper-viz-python/README.md index 1aeecd6..508de91 100644 --- a/crates/hyper-viz-python/README.md +++ b/crates/hyper-viz-python/README.md @@ -51,7 +51,7 @@ compiler or repository checkout is needed on these platforms. A desktop session and graphics driver are required. Linux viewer wheels require glibc 2.28+; macOS wheels target 11.0+. Notebook kernels on remote machines cannot open a window on your laptop; see the -[notebook prototype roadmap](https://github.com/atomicstrata/hyper/blob/python-v0.1.1/docs/NOTEBOOK_ROADMAP.md). +[notebook prototype roadmap](https://github.com/atomicstrata/hyper/blob/python-v0.1.2/docs/NOTEBOOK_ROADMAP.md). Then launch it from Python: @@ -81,6 +81,6 @@ Malformed HIF raises `HifValidationError`. Both exceptions carry `location` and `reason`; file failures raise `OSError`. Direct scientific object adapters, notebook embedding, headless layout bindings, and live Python updates are deferred. -See the [integration guide](https://github.com/atomicstrata/hyper/blob/python-v0.1.1/docs/HIF.md) -and [XGI example](https://github.com/atomicstrata/hyper/blob/python-v0.1.1/crates/hyper-viz-python/examples/xgi_interop.py). +See the [integration guide](https://github.com/atomicstrata/hyper/blob/python-v0.1.2/docs/HIF.md) +and [XGI example](https://github.com/atomicstrata/hyper/blob/python-v0.1.2/crates/hyper-viz-python/examples/xgi_interop.py). Hyper is licensed under MIT OR Apache-2.0; the bundled HIF schema is MIT-licensed. diff --git a/crates/hyper-viz-python/pyproject.toml b/crates/hyper-viz-python/pyproject.toml index bfb3ed0..d013ce0 100644 --- a/crates/hyper-viz-python/pyproject.toml +++ b/crates/hyper-viz-python/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "maturin" [project] name = "hypergraph-viz" -version = "0.1.1" +version = "0.1.2" requires-python = ">=3.10" description = "Rust-backed HIF interchange and native Hyper viewer launcher" readme = "README.md" @@ -21,11 +21,11 @@ classifiers = [ ] [project.optional-dependencies] -viewer = ["hypergraph-viz-viewer==0.1.1"] +viewer = ["hypergraph-viz-viewer==0.1.2"] [project.urls] Homepage = "https://github.com/atomicstrata/hyper" -Documentation = "https://github.com/atomicstrata/hyper/blob/python-v0.1.1/docs/HIF.md" +Documentation = "https://github.com/atomicstrata/hyper/blob/python-v0.1.2/docs/HIF.md" Repository = "https://github.com/atomicstrata/hyper" Issues = "https://github.com/atomicstrata/hyper/issues" diff --git a/docs/DESKTOP_PACKAGE.md b/docs/DESKTOP_PACKAGE.md index d22ce3b..ed69b7d 100644 --- a/docs/DESKTOP_PACKAGE.md +++ b/docs/DESKTOP_PACKAGE.md @@ -24,12 +24,13 @@ Wheels cover Linux x86_64 (glibc 2.28+), macOS arm64/x86_64 (11.0+), and Windows x86_64. A desktop session and working graphics driver are required. The viewer runs on the machine executing Python; it does not embed into a notebook or send a window from a remote kernel to your browser. Use the -[notebook prototype roadmap](https://github.com/atomicstrata/hyper/blob/python-v0.1.1/docs/NOTEBOOK_ROADMAP.md) +[notebook prototype roadmap](https://github.com/atomicstrata/hyper/blob/python-v0.1.2/docs/NOTEBOOK_ROADMAP.md) for the planned browser frontend. This package contains a native binary, not a Python extension. It does not include HIF Python bindings by itself; use the `[viewer]` extra shown above. -An explicit `executable="/path/to/hyper"` still overrides the packaged binary. +Windows wheels link the C runtime statically, avoiding a separate Visual C++ +Redistributable installation. An explicit `executable="/path/to/hyper"` still overrides the packaged binary. There are no downloads during `show()`. MIT OR Apache-2.0. The bundled HIF schema is MIT-licensed. Graphics drivers diff --git a/docs/PYTHON_RELEASE.md b/docs/PYTHON_RELEASE.md index cfa6afb..9d4fcf7 100644 --- a/docs/PYTHON_RELEASE.md +++ b/docs/PYTHON_RELEASE.md @@ -2,7 +2,7 @@ `hypergraph-viz` provides the `hyper_viz` import, HIF bindings, typing, and a launcher. `hypergraph-viz-viewer` provides the native desktop executable. -Release both at `0.1.1`; `hypergraph-viz[viewer]` pins the companion to the core +Release both at `0.1.2`; `hypergraph-viz[viewer]` pins the companion to the core version. Installing the core alone does not install Bevy or a viewer. PyPI treats hyphens and underscores as equivalent. The original `hyper-viz` / @@ -45,11 +45,11 @@ and [publishing instructions](https://docs.pypi.org/trusted-publishers/using-a-p `crates/hyper-viz-python/pyproject.toml`. Regenerate `Cargo.lock`, update the exact `[viewer]` dependency, and update release-tag documentation URLs. 3. Tag the validated commit. Prefer a merged release commit; an explicitly - selected validated PR commit can also be released. For `0.1.1`: + selected validated PR commit can also be released. For `0.1.2`: ```sh - git tag python-v0.1.1 - git push origin python-v0.1.1 + git tag python-v0.1.2 + git push origin python-v0.1.2 ``` The tag workflow builds and tests that exact source again. Versions must match @@ -71,7 +71,10 @@ require glibc 2.28+, macOS requires 11.0+, and Windows targets x86_64. A desktop session and working graphics driver remain required. Build from source with `cargo install --path . --locked` on other supported Rust targets. Wheel checks verify executable format/permissions, package identity, bundled licenses, and -the default 100 MiB PyPI file limit. +the default 100 MiB PyPI file limit. Windows desktop builds link the C runtime +statically and verify that the executable imports no external Visual C++ runtime +DLL. The unpublished `python-v0.1.1` tag was stopped after this dependency was +found; it remains unchanged, and the corrected release uses `0.1.2`. ## Verify the published packages @@ -79,7 +82,7 @@ Use a fresh standard CPython 3.10+ environment and the normal PyPI index: ```sh python -m venv /tmp/hyper-release-check -/tmp/hyper-release-check/bin/python -m pip install --only-binary=:all: "hypergraph-viz[viewer]==0.1.1" +/tmp/hyper-release-check/bin/python -m pip install --only-binary=:all: "hypergraph-viz[viewer]==0.1.2" /tmp/hyper-release-check/bin/python - <<'PY' import os import subprocess @@ -87,7 +90,7 @@ from importlib.metadata import version from hyper_viz import HifDocument from hyper_viz._viewer import _resolve_executable -assert version("hypergraph-viz") == version("hypergraph-viz-viewer") == "0.1.1" +assert version("hypergraph-viz") == version("hypergraph-viz-viewer") == "0.1.2" document = HifDocument.from_json('{"incidences":[{"node":"a","edge":"e"}]}') assert 's:a' in document.to_hypergraph_json() os.environ["PATH"] = "" # Discovery works without activation. diff --git a/docs/superpowers/plans/2026-10-04-desktop-wheels.md b/docs/superpowers/plans/2026-10-04-desktop-wheels.md index 11e2c55..f7a94dd 100644 --- a/docs/superpowers/plans/2026-10-04-desktop-wheels.md +++ b/docs/superpowers/plans/2026-10-04-desktop-wheels.md @@ -10,7 +10,7 @@ anywidget prototype. Continue in the existing PR #8 worktree. It must work without activating the Python environment. No runtime downloads. - Keep core wheels and source archives free of Bevy; companion wheels contain the existing native CLI, MIT/Apache licenses, and the bundled HIF schema license. -- Release 0.1.1 for both distributions on Linux x86_64, macOS arm64/Intel, and +- Release 0.1.2 for both distributions on Linux x86_64, macOS arm64/Intel, and Windows x86_64. PyPI's companion publisher requires user account setup. - Validate executable identity, installation, real process startup, temporary snapshot cleanup, and Linux software-rendered window creation. @@ -22,7 +22,7 @@ anywidget prototype. Continue in the existing PR #8 worktree. metadata. Implement installed-binary resolution, compatibility errors, explicit override, and missing-install guidance. Run the full Python suite. 2. Package the root CLI through maturin's binary bindings. Version all packages - 0.1.1, pin the optional dependency, check wheel contents, and clean-install + 0.1.2, pin the optional dependency, check wheel contents, and clean-install the locally built companion. Preserve the independently built core sdist. 3. Extend the existing release matrix with desktop build/install/startup checks and gate publishing on core and desktop jobs. Verify actual graphics startup diff --git a/pyproject.toml b/pyproject.toml index ff6764a..c411599 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "maturin" [project] name = "hypergraph-viz-viewer" -version = "0.1.1" +version = "0.1.2" requires-python = ">=3.10" description = "Prebuilt Hyper native desktop viewer for hypergraph-viz" readme = "docs/DESKTOP_PACKAGE.md" @@ -17,7 +17,7 @@ classifiers = [ [project.urls] Homepage = "https://github.com/atomicstrata/hyper" -Documentation = "https://github.com/atomicstrata/hyper/blob/python-v0.1.1/docs/HIF.md" +Documentation = "https://github.com/atomicstrata/hyper/blob/python-v0.1.2/docs/HIF.md" Issues = "https://github.com/atomicstrata/hyper/issues" [tool.maturin] diff --git a/scripts/releases/check_desktop_wheel.py b/scripts/releases/check_desktop_wheel.py index c966077..bc4fddf 100644 --- a/scripts/releases/check_desktop_wheel.py +++ b/scripts/releases/check_desktop_wheel.py @@ -17,7 +17,13 @@ assert len(binary) == 1, binary data = archive.read(binary[0]) assert data[:4] in (b'\x7fELF', b'\xcf\xfa\xed\xfe', b'\xfe\xed\xfa\xcf', b'\xca\xfe\xba\xbe') or data[:2] == b'MZ' - if not wheel.name.endswith('win_amd64.whl'): + if wheel.name.endswith('win_amd64.whl'): + import pefile + pe = pefile.PE(data=data, fast_load=True) + pe.parse_data_directories(directories=[pefile.DIRECTORY_ENTRY['IMAGE_DIRECTORY_ENTRY_IMPORT']]) + imports = [entry.dll.decode().lower() for entry in pe.DIRECTORY_ENTRY_IMPORT] + assert not any(name.startswith(('vcruntime', 'msvcp')) for name in imports), f'External Visual C++ runtime required: {imports}' + else: assert (archive.getinfo(binary[0]).external_attr >> 16) & 0o111, 'Executable permission missing' assert any('LICENSE-MIT' in n for n in names) assert any('LICENSE-APACHE' in n for n in names) From 4057b7a81cae80ab17ecd815e3bfb9979381b11a Mon Sep 17 00:00:00 2001 From: Bregy Malpartida Date: Sun, 4 Oct 2026 16:20:05 -0500 Subject: [PATCH 9/9] Document published desktop packages and upgrade existing installs --- README.md | 6 ++++-- crates/hyper-viz-python/README.md | 2 +- docs/DESKTOP_PACKAGE.md | 2 +- docs/HIF.md | 2 +- docs/PYTHON_RELEASE.md | 2 +- 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index f88f966..6bb1900 100644 --- a/README.md +++ b/README.md @@ -41,10 +41,12 @@ The import name is `hyper_viz`. Wheels cover Linux x86_64, macOS arm64/x86_64, and Windows x86_64; a compatible wheel requires no Rust compiler. Install the native desktop viewer through the optional extra: ```bash -python -m pip install "hypergraph-viz[viewer]" +python -m pip install --upgrade "hypergraph-viz[viewer]" ``` -The viewer needs a desktop session and graphics driver. Linux desktop wheels +Use `--upgrade` when the core package is already installed so pip selects the +release that provides the viewer extra. The viewer needs a desktop session and +graphics driver. Linux desktop wheels require glibc 2.28+; macOS targets 11.0+. Rust is needed only for source builds. For a Python development build from this checkout with **Rust 1.89+**: diff --git a/crates/hyper-viz-python/README.md b/crates/hyper-viz-python/README.md index 508de91..fab45ad 100644 --- a/crates/hyper-viz-python/README.md +++ b/crates/hyper-viz-python/README.md @@ -43,7 +43,7 @@ not preserved. Install the matching prebuilt desktop viewer with the optional extra: ```sh -python -m pip install "hypergraph-viz[viewer]" +python -m pip install --upgrade "hypergraph-viz[viewer]" ``` Wheels cover Linux x86_64, macOS arm64/x86_64, and Windows x86_64. No Rust diff --git a/docs/DESKTOP_PACKAGE.md b/docs/DESKTOP_PACKAGE.md index ed69b7d..15bad5b 100644 --- a/docs/DESKTOP_PACKAGE.md +++ b/docs/DESKTOP_PACKAGE.md @@ -4,7 +4,7 @@ Prebuilt native viewer for [hypergraph-viz](https://pypi.org/project/hypergraph- Install the Python API and matching viewer together: ```sh -python -m pip install "hypergraph-viz[viewer]" +python -m pip install --upgrade "hypergraph-viz[viewer]" ``` ```python diff --git a/docs/HIF.md b/docs/HIF.md index 1485701..67d779b 100644 --- a/docs/HIF.md +++ b/docs/HIF.md @@ -66,7 +66,7 @@ code = viewer.wait() # or viewer.close() to terminate `HifValidationError` and `HifCompatibilityError` expose `location` and `reason`. I/O failures raise `OSError`. The launcher validates before launching and resolves an explicit executable, a version-matched installed `hypergraph-viz-viewer` binary, or `hyper` on PATH, in that order. Companion discovery uses installed RECORD metadata and works without virtual-environment activation. Missing/damaged installations raise `FileNotFoundError` with reinstall guidance; companion/core version mismatches raise `RuntimeError`. It never invokes a shell and inherits stdout/stderr. It creates an owned temporary snapshot, returns immediately, and cleans up automatically when the viewer exits. `wait()` returns nonzero exit codes without hiding diagnostics. A timeout preserves the running process and snapshot. `close()` terminates, waits five seconds, then kills if necessary. A context manager closes on exit. Dropping the handle keeps the viewer open; a background waiter retains ownership until exit. -Install the desktop wheel with `python -m pip install "hypergraph-viz[viewer]"`; no Rust compiler or checkout is needed. The companion is pinned to the core version. Linux desktop wheels require glibc 2.28+, macOS wheels target 11.0+, and Windows wheels target x86_64. A desktop session and a working graphics driver are required; graphics drivers remain system dependencies. For source installation, use `cargo install --path . --locked`. Nothing is downloaded on first launch. Live Python updates, notebook embedding, analysis/layout bindings, and direct scientific-library object adapters are outside this release. See the [notebook prototype roadmap](NOTEBOOK_ROADMAP.md) for the next anywidget canvas and WASM probes. +Install the desktop wheel with `python -m pip install --upgrade "hypergraph-viz[viewer]"`; no Rust compiler or checkout is needed. The companion is pinned to the core version. Linux desktop wheels require glibc 2.28+, macOS wheels target 11.0+, and Windows wheels target x86_64. A desktop session and a working graphics driver are required; graphics drivers remain system dependencies. For source installation, use `cargo install --path . --locked`. Nothing is downloaded on first launch. Live Python updates, notebook embedding, analysis/layout bindings, and direct scientific-library object adapters are outside this release. See the [notebook prototype roadmap](NOTEBOOK_ROADMAP.md) for the next anywidget canvas and WASM probes. ## XGI and Julia diff --git a/docs/PYTHON_RELEASE.md b/docs/PYTHON_RELEASE.md index 9d4fcf7..7758a5f 100644 --- a/docs/PYTHON_RELEASE.md +++ b/docs/PYTHON_RELEASE.md @@ -2,7 +2,7 @@ `hypergraph-viz` provides the `hyper_viz` import, HIF bindings, typing, and a launcher. `hypergraph-viz-viewer` provides the native desktop executable. -Release both at `0.1.2`; `hypergraph-viz[viewer]` pins the companion to the core +Both packages are published at `0.1.2`; `hypergraph-viz[viewer]` pins the companion to the core version. Installing the core alone does not install Bevy or a viewer. PyPI treats hyphens and underscores as equivalent. The original `hyper-viz` /

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 M#JVCpiI?jC0MJu!YXATM literal 0 HcmV?d00001 diff --git a/docs/benchmarks/ecosystem-2026-10-03/evidence/browser-sigma-final-results.json.gz b/docs/benchmarks/ecosystem-2026-10-03/evidence/browser-sigma-final-results.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..50b14d90769855ceb965aced344b308a9c7b8d49 GIT binary patch literal 67512 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 i)_9zNRnjVL>Q2@Qz`rBt-u>=2 imports. Direction is retained in attrs. External dependencies are stubs.", + "benchmark_seed": 20261003 + } + }, + "sha256": { + "mathlib.json": "696929b325b7297107f85eb811adb95460bc8bd298126f265d9f746cdce3b2e1", + "mathlib.hif.json": "8d272f9de87de2a94e4107b35730175f02bc7f71bc284a5992c73cdb9cdb3005", + "mathlib.incidence.json": "867d398d4f44b522670f6e1700e922125aed10e029322690218e0adc7700df57", + "mathlib.updated.json": "d02a87fa099f99218371847f7a168ba9a21986ae0faf942b9e083e7f9467370a", + "mathlib.updated.incidence.json": "73def033e50da3da4d42a949232bdc6ea6511e0a84caad94818febdadaa6f9b9" + } + } +] diff --git a/docs/benchmarks/ecosystem-2026-10-03/evidence/driver-notes.json b/docs/benchmarks/ecosystem-2026-10-03/evidence/driver-notes.json new file mode 100644 index 0000000..ed973f2 --- /dev/null +++ b/docs/benchmarks/ecosystem-2026-10-03/evidence/driver-notes.json @@ -0,0 +1,7 @@ +{ + "browser": "Final105 unique jobs: original70 Cytoscape/3D cases plus35 corrected Sigma cases. Original browser closed after evidence was saved; its lingering Node/esbuild worker was then terminated. Explicit esbuild shutdown was added before the corrected run.", + "core": "Final rows use exact ID/member/metadata and projected-incidence assertions. Count-only diagnostics are excluded.", + "scientific": "After timing, only orchestration stale-file/error handling and duplicate-incidence validation were hardened. Named construct and figure operations are unchanged.", + "sigma": "Original full-refresh camera timings are retained only as excluded diagnostics. All35 were replaced by public scheduleRender cached-redraw observations in a separate block. Consolidation verifies input hashes, protocol, browser and package versions.", + "hypergodot": "HiDPI-disabled window was clamped to1920x917 and excluded. Fullscreen smoke did not match. Final five repetitions restore stock HiDPI and verify actual render texture1920x1080 with exact memberships." +} diff --git a/docs/benchmarks/ecosystem-2026-10-03/evidence/graphia-metadata.json b/docs/benchmarks/ecosystem-2026-10-03/evidence/graphia-metadata.json new file mode 100644 index 0000000..d298e36 --- /dev/null +++ b/docs/benchmarks/ecosystem-2026-10-03/evidence/graphia-metadata.json @@ -0,0 +1,11 @@ +{ + "tool": "graphia", + "executable": "/tmp/hyper-benchmark-competitors/Graphia.app/Contents/MacOS/Graphia", + "timeout_seconds": 180, + "executable_sha256": "93094f94b6b4093bc35705b6aeea8037a7d65ba75dd6c008e30a7d42d8d8fa82", + "conditions": "M5Pro24GiB macOS27; lowpowermode0; no parallel benchmark/build; ordinary desktop background uncontrolled; display sleep disabled; idle sleep prevented; thermal telemetry unavailable; variable display cadence", + "peak_memory": "macOS /usr/bin/time -l whole-process RSS high-water in bytes", + "fresh_process_per_repetition": true, + "repetitions": 5, + "seed": 20261003 +} diff --git a/docs/benchmarks/ecosystem-2026-10-03/evidence/graphia-raw.json b/docs/benchmarks/ecosystem-2026-10-03/evidence/graphia-raw.json new file mode 100644 index 0000000..5e9a915 --- /dev/null +++ b/docs/benchmarks/ecosystem-2026-10-03/evidence/graphia-raw.json @@ -0,0 +1,416 @@ +[ + { + "status": "ok", + "returncode": 0, + "process_wall_seconds": 4.231719375000001, + "process_peak_rss_bytes": 111558656, + "stdout": "Wrote /Users/bregy/.codex/worktrees/ef9d/hyper/target/benchmark/graphia/inputs/scientific.graphia successfully.\n", + "stderr": "sandbox_extension_issue_file_to_process failed for /tmp/hyper-benchmark-competitors/Graphia.app: 1 (Operation not permitted)\nLoading dynamic plugins from /private/tmp/hyper-benchmark-competitors/Graphia.app/Contents/PlugIns...\n ...Correlation (libcorrelation.dylib)\n ...Generic (libgeneric.dylib)\n ...WebSearch (libwebsearch.dylib)\nLoading static plugins...\n ...none found\n 4.22 real 0.29 user 0.08 sys\n 111558656 maximum resident set size\n 0 average shared memory size\n 0 average unshared data size\n 0 average unshared stack size\n 9448 page reclaims\n 839 page faults\n 0 swaps\n 0 block input operations\n 0 block output operations\n 8 messages sent\n 4 messages received\n 0 signals received\n 156 voluntary context switches\n 1588 involuntary context switches\n 5028989177 instructions retired\n 1412710350 cycles elapsed\n 45138952 peak memory footprint\n", + "tool": "Graphia", + "dataset": "scientific", + "repetition": -1, + "warmup": true, + "dataset_sha256": "1e721ab444d6b769b2c27f6d23818eb0a847a5ad14dd039c7ff0818450e5baec", + "correctness": { + "exact_incidence_and_node_attributes": true, + "document_metadata_retained": false, + "typed_native_display_fields_retained": false, + "saved_as_directed": true, + "coordinates_are_attributes_not_layout": true, + "coordinate_attributes_retained": true, + "vertices_and_hubs": 1419, + "memberships": 1550 + } + }, + { + "status": "ok", + "returncode": 0, + "process_wall_seconds": 1.5332331670000006, + "process_peak_rss_bytes": 674185216, + "stdout": "Wrote /Users/bregy/.codex/worktrees/ef9d/hyper/target/benchmark/graphia/inputs/mathlib.graphia successfully.\n", + "stderr": "sandbox_extension_issue_file_to_process failed for /tmp/hyper-benchmark-competitors/Graphia.app: 1 (Operation not permitted)\nLoading dynamic plugins from /private/tmp/hyper-benchmark-competitors/Graphia.app/Contents/PlugIns...\n ...Correlation (libcorrelation.dylib)\n ...Generic (libgeneric.dylib)\n ...WebSearch (libwebsearch.dylib)\nLoading static plugins...\n ...none found\n 1.52 real 1.34 user 0.12 sys\n 674185216 maximum resident set size\n 0 average shared memory size\n 0 average unshared data size\n 0 average unshared stack size\n 45570 page reclaims\n 1 page faults\n 0 swaps\n 0 block input operations\n 0 block output operations\n 8 messages sent\n 4 messages received\n 0 signals received\n 62 voluntary context switches\n 1259 involuntary context switches\n 25889175831 instructions retired\n 6304757463 cycles elapsed\n 550438328 peak memory footprint\n", + "tool": "Graphia", + "dataset": "mathlib", + "repetition": -1, + "warmup": true, + "dataset_sha256": "696929b325b7297107f85eb811adb95460bc8bd298126f265d9f746cdce3b2e1", + "correctness": { + "exact_incidence_and_node_attributes": true, + "document_metadata_retained": false, + "typed_native_display_fields_retained": false, + "saved_as_directed": true, + "coordinates_are_attributes_not_layout": true, + "coordinate_attributes_retained": true, + "vertices_and_hubs": 54290, + "memberships": 118066 + } + }, + { + "status": "ok", + "returncode": 0, + "process_wall_seconds": 0.37782641599999955, + "process_peak_rss_bytes": 136658944, + "stdout": "Wrote /Users/bregy/.codex/worktrees/ef9d/hyper/target/benchmark/graphia/inputs/moderate.graphia successfully.\n", + "stderr": "sandbox_extension_issue_file_to_process failed for /tmp/hyper-benchmark-competitors/Graphia.app: 1 (Operation not permitted)\nLoading dynamic plugins from /private/tmp/hyper-benchmark-competitors/Graphia.app/Contents/PlugIns...\n ...Correlation (libcorrelation.dylib)\n ...Generic (libgeneric.dylib)\n ...WebSearch (libwebsearch.dylib)\nLoading static plugins...\n ...none found\n 0.37 real 0.29 user 0.03 sys\n 136658944 maximum resident set size\n 0 average shared memory size\n 0 average unshared data size\n 0 average unshared stack size\n 11706 page reclaims\n 8 page faults\n 0 swaps\n 0 block input operations\n 0 block output operations\n 8 messages sent\n 4 messages received\n 0 signals received\n 8 voluntary context switches\n 1004 involuntary context switches\n 5719288876 instructions retired\n 1420784451 cycles elapsed\n 70124552 peak memory footprint\n", + "tool": "Graphia", + "dataset": "moderate", + "repetition": -1, + "warmup": true, + "dataset_sha256": "7581070d4ca0672f5a0e44d2190d14e5c30a03ab424893bedf2622bcc9b86bca", + "correctness": { + "exact_incidence_and_node_attributes": true, + "document_metadata_retained": false, + "typed_native_display_fields_retained": false, + "saved_as_directed": true, + "coordinates_are_attributes_not_layout": true, + "coordinate_attributes_retained": true, + "vertices_and_hubs": 3000, + "memberships": 13200 + } + }, + { + "status": "ok", + "returncode": 0, + "process_wall_seconds": 1.4874919999999996, + "process_peak_rss_bytes": 689225728, + "stdout": "Wrote /Users/bregy/.codex/worktrees/ef9d/hyper/target/benchmark/graphia/inputs/mathlib.graphia successfully.\n", + "stderr": "sandbox_extension_issue_file_to_process failed for /tmp/hyper-benchmark-competitors/Graphia.app: 1 (Operation not permitted)\nLoading dynamic plugins from /private/tmp/hyper-benchmark-competitors/Graphia.app/Contents/PlugIns...\n ...Correlation (libcorrelation.dylib)\n ...Generic (libgeneric.dylib)\n ...WebSearch (libwebsearch.dylib)\nLoading static plugins...\n ...none found\n 1.48 real 1.32 user 0.09 sys\n 689225728 maximum resident set size\n 0 average shared memory size\n 0 average unshared data size\n 0 average unshared stack size\n 46488 page reclaims\n 0 page faults\n 0 swaps\n 0 block input operations\n 0 block output operations\n 8 messages sent\n 4 messages received\n 0 signals received\n 126 voluntary context switches\n 1096 involuntary context switches\n 25863171296 instructions retired\n 6151915355 cycles elapsed\n 566265272 peak memory footprint\n", + "tool": "Graphia", + "dataset": "mathlib", + "repetition": 0, + "warmup": false, + "dataset_sha256": "696929b325b7297107f85eb811adb95460bc8bd298126f265d9f746cdce3b2e1", + "correctness": { + "exact_incidence_and_node_attributes": true, + "document_metadata_retained": false, + "typed_native_display_fields_retained": false, + "saved_as_directed": true, + "coordinates_are_attributes_not_layout": true, + "coordinate_attributes_retained": true, + "vertices_and_hubs": 54290, + "memberships": 118066 + } + }, + { + "status": "ok", + "returncode": 0, + "process_wall_seconds": 0.3713696249999998, + "process_peak_rss_bytes": 137068544, + "stdout": "Wrote /Users/bregy/.codex/worktrees/ef9d/hyper/target/benchmark/graphia/inputs/moderate.graphia successfully.\n", + "stderr": "sandbox_extension_issue_file_to_process failed for /tmp/hyper-benchmark-competitors/Graphia.app: 1 (Operation not permitted)\nLoading dynamic plugins from /private/tmp/hyper-benchmark-competitors/Graphia.app/Contents/PlugIns...\n ...Correlation (libcorrelation.dylib)\n ...Generic (libgeneric.dylib)\n ...WebSearch (libwebsearch.dylib)\nLoading static plugins...\n ...none found\n 0.36 real 0.29 user 0.03 sys\n 137068544 maximum resident set size\n 0 average shared memory size\n 0 average unshared data size\n 0 average unshared stack size\n 11741 page reclaims\n 0 page faults\n 0 swaps\n 0 block input operations\n 0 block output operations\n 8 messages sent\n 4 messages received\n 0 signals received\n 11 voluntary context switches\n 1001 involuntary context switches\n 5738724275 instructions retired\n 1422303405 cycles elapsed\n 70534152 peak memory footprint\n", + "tool": "Graphia", + "dataset": "moderate", + "repetition": 0, + "warmup": false, + "dataset_sha256": "7581070d4ca0672f5a0e44d2190d14e5c30a03ab424893bedf2622bcc9b86bca", + "correctness": { + "exact_incidence_and_node_attributes": true, + "document_metadata_retained": false, + "typed_native_display_fields_retained": false, + "saved_as_directed": true, + "coordinates_are_attributes_not_layout": true, + "coordinate_attributes_retained": true, + "vertices_and_hubs": 3000, + "memberships": 13200 + } + }, + { + "status": "ok", + "returncode": 0, + "process_wall_seconds": 0.324835457999999, + "process_peak_rss_bytes": 111542272, + "stdout": "Wrote /Users/bregy/.codex/worktrees/ef9d/hyper/target/benchmark/graphia/inputs/scientific.graphia successfully.\n", + "stderr": "sandbox_extension_issue_file_to_process failed for /tmp/hyper-benchmark-competitors/Graphia.app: 1 (Operation not permitted)\nLoading dynamic plugins from /private/tmp/hyper-benchmark-competitors/Graphia.app/Contents/PlugIns...\n ...Correlation (libcorrelation.dylib)\n ...Generic (libgeneric.dylib)\n ...WebSearch (libwebsearch.dylib)\nLoading static plugins...\n ...none found\n 0.32 real 0.24 user 0.03 sys\n 111542272 maximum resident set size\n 0 average shared memory size\n 0 average unshared data size\n 0 average unshared stack size\n 10182 page reclaims\n 0 page faults\n 0 swaps\n 0 block input operations\n 0 block output operations\n 8 messages sent\n 4 messages received\n 0 signals received\n 3 voluntary context switches\n 922 involuntary context switches\n 4801344125 instructions retired\n 1212986636 cycles elapsed\n 45073416 peak memory footprint\n", + "tool": "Graphia", + "dataset": "scientific", + "repetition": 0, + "warmup": false, + "dataset_sha256": "1e721ab444d6b769b2c27f6d23818eb0a847a5ad14dd039c7ff0818450e5baec", + "correctness": { + "exact_incidence_and_node_attributes": true, + "document_metadata_retained": false, + "typed_native_display_fields_retained": false, + "saved_as_directed": true, + "coordinates_are_attributes_not_layout": true, + "coordinate_attributes_retained": true, + "vertices_and_hubs": 1419, + "memberships": 1550 + } + }, + { + "status": "ok", + "returncode": 0, + "process_wall_seconds": 0.3671234590000001, + "process_peak_rss_bytes": 136495104, + "stdout": "Wrote /Users/bregy/.codex/worktrees/ef9d/hyper/target/benchmark/graphia/inputs/moderate.graphia successfully.\n", + "stderr": "sandbox_extension_issue_file_to_process failed for /tmp/hyper-benchmark-competitors/Graphia.app: 1 (Operation not permitted)\nLoading dynamic plugins from /private/tmp/hyper-benchmark-competitors/Graphia.app/Contents/PlugIns...\n ...Correlation (libcorrelation.dylib)\n ...Generic (libgeneric.dylib)\n ...WebSearch (libwebsearch.dylib)\nLoading static plugins...\n ...none found\n 0.36 real 0.29 user 0.03 sys\n 136495104 maximum resident set size\n 0 average shared memory size\n 0 average unshared data size\n 0 average unshared stack size\n 11710 page reclaims\n 0 page faults\n 0 swaps\n 0 block input operations\n 0 block output operations\n 8 messages sent\n 4 messages received\n 0 signals received\n 8 voluntary context switches\n 979 involuntary context switches\n 5723731564 instructions retired\n 1416241488 cycles elapsed\n 69927920 peak memory footprint\n", + "tool": "Graphia", + "dataset": "moderate", + "repetition": 1, + "warmup": false, + "dataset_sha256": "7581070d4ca0672f5a0e44d2190d14e5c30a03ab424893bedf2622bcc9b86bca", + "correctness": { + "exact_incidence_and_node_attributes": true, + "document_metadata_retained": false, + "typed_native_display_fields_retained": false, + "saved_as_directed": true, + "coordinates_are_attributes_not_layout": true, + "coordinate_attributes_retained": true, + "vertices_and_hubs": 3000, + "memberships": 13200 + } + }, + { + "status": "ok", + "returncode": 0, + "process_wall_seconds": 1.489542083, + "process_peak_rss_bytes": 690012160, + "stdout": "Wrote /Users/bregy/.codex/worktrees/ef9d/hyper/target/benchmark/graphia/inputs/mathlib.graphia successfully.\n", + "stderr": "sandbox_extension_issue_file_to_process failed for /tmp/hyper-benchmark-competitors/Graphia.app: 1 (Operation not permitted)\nLoading dynamic plugins from /private/tmp/hyper-benchmark-competitors/Graphia.app/Contents/PlugIns...\n ...Correlation (libcorrelation.dylib)\n ...Generic (libgeneric.dylib)\n ...WebSearch (libwebsearch.dylib)\nLoading static plugins...\n ...none found\n 1.48 real 1.32 user 0.09 sys\n 690012160 maximum resident set size\n 0 average shared memory size\n 0 average unshared data size\n 0 average unshared stack size\n 46545 page reclaims\n 0 page faults\n 0 swaps\n 0 block input operations\n 0 block output operations\n 8 messages sent\n 4 messages received\n 0 signals received\n 123 voluntary context switches\n 1079 involuntary context switches\n 25872743177 instructions retired\n 6178549402 cycles elapsed\n 567854496 peak memory footprint\n", + "tool": "Graphia", + "dataset": "mathlib", + "repetition": 1, + "warmup": false, + "dataset_sha256": "696929b325b7297107f85eb811adb95460bc8bd298126f265d9f746cdce3b2e1", + "correctness": { + "exact_incidence_and_node_attributes": true, + "document_metadata_retained": false, + "typed_native_display_fields_retained": false, + "saved_as_directed": true, + "coordinates_are_attributes_not_layout": true, + "coordinate_attributes_retained": true, + "vertices_and_hubs": 54290, + "memberships": 118066 + } + }, + { + "status": "ok", + "returncode": 0, + "process_wall_seconds": 0.3328365420000008, + "process_peak_rss_bytes": 111362048, + "stdout": "Wrote /Users/bregy/.codex/worktrees/ef9d/hyper/target/benchmark/graphia/inputs/scientific.graphia successfully.\n", + "stderr": "sandbox_extension_issue_file_to_process failed for /tmp/hyper-benchmark-competitors/Graphia.app: 1 (Operation not permitted)\nLoading dynamic plugins from /private/tmp/hyper-benchmark-competitors/Graphia.app/Contents/PlugIns...\n ...Correlation (libcorrelation.dylib)\n ...Generic (libgeneric.dylib)\n ...WebSearch (libwebsearch.dylib)\nLoading static plugins...\n ...none found\n 0.32 real 0.24 user 0.03 sys\n 111362048 maximum resident set size\n 0 average shared memory size\n 0 average unshared data size\n 0 average unshared stack size\n 10173 page reclaims\n 0 page faults\n 0 swaps\n 0 block input operations\n 0 block output operations\n 8 messages sent\n 4 messages received\n 0 signals received\n 6 voluntary context switches\n 934 involuntary context switches\n 4792869435 instructions retired\n 1217109778 cycles elapsed\n 44925936 peak memory footprint\n", + "tool": "Graphia", + "dataset": "scientific", + "repetition": 1, + "warmup": false, + "dataset_sha256": "1e721ab444d6b769b2c27f6d23818eb0a847a5ad14dd039c7ff0818450e5baec", + "correctness": { + "exact_incidence_and_node_attributes": true, + "document_metadata_retained": false, + "typed_native_display_fields_retained": false, + "saved_as_directed": true, + "coordinates_are_attributes_not_layout": true, + "coordinate_attributes_retained": true, + "vertices_and_hubs": 1419, + "memberships": 1550 + } + }, + { + "status": "ok", + "returncode": 0, + "process_wall_seconds": 0.34016204199999933, + "process_peak_rss_bytes": 111689728, + "stdout": "Wrote /Users/bregy/.codex/worktrees/ef9d/hyper/target/benchmark/graphia/inputs/scientific.graphia successfully.\n", + "stderr": "sandbox_extension_issue_file_to_process failed for /tmp/hyper-benchmark-competitors/Graphia.app: 1 (Operation not permitted)\nLoading dynamic plugins from /private/tmp/hyper-benchmark-competitors/Graphia.app/Contents/PlugIns...\n ...Correlation (libcorrelation.dylib)\n ...Generic (libgeneric.dylib)\n ...WebSearch (libwebsearch.dylib)\nLoading static plugins...\n ...none found\n 0.33 real 0.24 user 0.03 sys\n 111689728 maximum resident set size\n 0 average shared memory size\n 0 average unshared data size\n 0 average unshared stack size\n 10192 page reclaims\n 0 page faults\n 0 swaps\n 0 block input operations\n 0 block output operations\n 8 messages sent\n 4 messages received\n 0 signals received\n 8 voluntary context switches\n 933 involuntary context switches\n 4801672135 instructions retired\n 1213583205 cycles elapsed\n 45270000 peak memory footprint\n", + "tool": "Graphia", + "dataset": "scientific", + "repetition": 2, + "warmup": false, + "dataset_sha256": "1e721ab444d6b769b2c27f6d23818eb0a847a5ad14dd039c7ff0818450e5baec", + "correctness": { + "exact_incidence_and_node_attributes": true, + "document_metadata_retained": false, + "typed_native_display_fields_retained": false, + "saved_as_directed": true, + "coordinates_are_attributes_not_layout": true, + "coordinate_attributes_retained": true, + "vertices_and_hubs": 1419, + "memberships": 1550 + } + }, + { + "status": "ok", + "returncode": 0, + "process_wall_seconds": 0.3908611670000006, + "process_peak_rss_bytes": 137265152, + "stdout": "Wrote /Users/bregy/.codex/worktrees/ef9d/hyper/target/benchmark/graphia/inputs/moderate.graphia successfully.\n", + "stderr": "sandbox_extension_issue_file_to_process failed for /tmp/hyper-benchmark-competitors/Graphia.app: 1 (Operation not permitted)\nLoading dynamic plugins from /private/tmp/hyper-benchmark-competitors/Graphia.app/Contents/PlugIns...\n ...Correlation (libcorrelation.dylib)\n ...Generic (libgeneric.dylib)\n ...WebSearch (libwebsearch.dylib)\nLoading static plugins...\n ...none found\n 0.38 real 0.29 user 0.03 sys\n 137265152 maximum resident set size\n 0 average shared memory size\n 0 average unshared data size\n 0 average unshared stack size\n 11753 page reclaims\n 0 page faults\n 0 swaps\n 0 block input operations\n 0 block output operations\n 8 messages sent\n 4 messages received\n 0 signals received\n 4 voluntary context switches\n 1007 involuntary context switches\n 5718855464 instructions retired\n 1420333906 cycles elapsed\n 70747168 peak memory footprint\n", + "tool": "Graphia", + "dataset": "moderate", + "repetition": 2, + "warmup": false, + "dataset_sha256": "7581070d4ca0672f5a0e44d2190d14e5c30a03ab424893bedf2622bcc9b86bca", + "correctness": { + "exact_incidence_and_node_attributes": true, + "document_metadata_retained": false, + "typed_native_display_fields_retained": false, + "saved_as_directed": true, + "coordinates_are_attributes_not_layout": true, + "coordinate_attributes_retained": true, + "vertices_and_hubs": 3000, + "memberships": 13200 + } + }, + { + "status": "ok", + "returncode": 0, + "process_wall_seconds": 1.4905674999999992, + "process_peak_rss_bytes": 677036032, + "stdout": "Wrote /Users/bregy/.codex/worktrees/ef9d/hyper/target/benchmark/graphia/inputs/mathlib.graphia successfully.\n", + "stderr": "sandbox_extension_issue_file_to_process failed for /tmp/hyper-benchmark-competitors/Graphia.app: 1 (Operation not permitted)\nLoading dynamic plugins from /private/tmp/hyper-benchmark-competitors/Graphia.app/Contents/PlugIns...\n ...Correlation (libcorrelation.dylib)\n ...Generic (libgeneric.dylib)\n ...WebSearch (libwebsearch.dylib)\nLoading static plugins...\n ...none found\n 1.48 real 1.32 user 0.10 sys\n 677036032 maximum resident set size\n 0 average shared memory size\n 0 average unshared data size\n 0 average unshared stack size\n 45780 page reclaims\n 0 page faults\n 0 swaps\n 0 block input operations\n 0 block output operations\n 8 messages sent\n 4 messages received\n 0 signals received\n 43 voluntary context switches\n 1111 involuntary context switches\n 25832163286 instructions retired\n 6183039697 cycles elapsed\n 553993680 peak memory footprint\n", + "tool": "Graphia", + "dataset": "mathlib", + "repetition": 2, + "warmup": false, + "dataset_sha256": "696929b325b7297107f85eb811adb95460bc8bd298126f265d9f746cdce3b2e1", + "correctness": { + "exact_incidence_and_node_attributes": true, + "document_metadata_retained": false, + "typed_native_display_fields_retained": false, + "saved_as_directed": true, + "coordinates_are_attributes_not_layout": true, + "coordinate_attributes_retained": true, + "vertices_and_hubs": 54290, + "memberships": 118066 + } + }, + { + "status": "ok", + "returncode": 0, + "process_wall_seconds": 0.3983062920000009, + "process_peak_rss_bytes": 137084928, + "stdout": "Wrote /Users/bregy/.codex/worktrees/ef9d/hyper/target/benchmark/graphia/inputs/moderate.graphia successfully.\n", + "stderr": "sandbox_extension_issue_file_to_process failed for /tmp/hyper-benchmark-competitors/Graphia.app: 1 (Operation not permitted)\nLoading dynamic plugins from /private/tmp/hyper-benchmark-competitors/Graphia.app/Contents/PlugIns...\n ...Correlation (libcorrelation.dylib)\n ...Generic (libgeneric.dylib)\n ...WebSearch (libwebsearch.dylib)\nLoading static plugins...\n ...none found\n 0.39 real 0.29 user 0.03 sys\n 137084928 maximum resident set size\n 0 average shared memory size\n 0 average unshared data size\n 0 average unshared stack size\n 11694 page reclaims\n 48 page faults\n 0 swaps\n 0 block input operations\n 0 block output operations\n 8 messages sent\n 4 messages received\n 0 signals received\n 4 voluntary context switches\n 996 involuntary context switches\n 5752121152 instructions retired\n 1432673259 cycles elapsed\n 70566944 peak memory footprint\n", + "tool": "Graphia", + "dataset": "moderate", + "repetition": 3, + "warmup": false, + "dataset_sha256": "7581070d4ca0672f5a0e44d2190d14e5c30a03ab424893bedf2622bcc9b86bca", + "correctness": { + "exact_incidence_and_node_attributes": true, + "document_metadata_retained": false, + "typed_native_display_fields_retained": false, + "saved_as_directed": true, + "coordinates_are_attributes_not_layout": true, + "coordinate_attributes_retained": true, + "vertices_and_hubs": 3000, + "memberships": 13200 + } + }, + { + "status": "ok", + "returncode": 0, + "process_wall_seconds": 0.3323542909999979, + "process_peak_rss_bytes": 111509504, + "stdout": "Wrote /Users/bregy/.codex/worktrees/ef9d/hyper/target/benchmark/graphia/inputs/scientific.graphia successfully.\n", + "stderr": "sandbox_extension_issue_file_to_process failed for /tmp/hyper-benchmark-competitors/Graphia.app: 1 (Operation not permitted)\nLoading dynamic plugins from /private/tmp/hyper-benchmark-competitors/Graphia.app/Contents/PlugIns...\n ...Correlation (libcorrelation.dylib)\n ...Generic (libgeneric.dylib)\n ...WebSearch (libwebsearch.dylib)\nLoading static plugins...\n ...none found\n 0.32 real 0.24 user 0.03 sys\n 111509504 maximum resident set size\n 0 average shared memory size\n 0 average unshared data size\n 0 average unshared stack size\n 10181 page reclaims\n 0 page faults\n 0 swaps\n 0 block input operations\n 0 block output operations\n 8 messages sent\n 4 messages received\n 0 signals received\n 5 voluntary context switches\n 922 involuntary context switches\n 4794643842 instructions retired\n 1213015426 cycles elapsed\n 44991472 peak memory footprint\n", + "tool": "Graphia", + "dataset": "scientific", + "repetition": 3, + "warmup": false, + "dataset_sha256": "1e721ab444d6b769b2c27f6d23818eb0a847a5ad14dd039c7ff0818450e5baec", + "correctness": { + "exact_incidence_and_node_attributes": true, + "document_metadata_retained": false, + "typed_native_display_fields_retained": false, + "saved_as_directed": true, + "coordinates_are_attributes_not_layout": true, + "coordinate_attributes_retained": true, + "vertices_and_hubs": 1419, + "memberships": 1550 + } + }, + { + "status": "ok", + "returncode": 0, + "process_wall_seconds": 1.5047855420000005, + "process_peak_rss_bytes": 688029696, + "stdout": "Wrote /Users/bregy/.codex/worktrees/ef9d/hyper/target/benchmark/graphia/inputs/mathlib.graphia successfully.\n", + "stderr": "sandbox_extension_issue_file_to_process failed for /tmp/hyper-benchmark-competitors/Graphia.app: 1 (Operation not permitted)\nLoading dynamic plugins from /private/tmp/hyper-benchmark-competitors/Graphia.app/Contents/PlugIns...\n ...Correlation (libcorrelation.dylib)\n ...Generic (libgeneric.dylib)\n ...WebSearch (libwebsearch.dylib)\nLoading static plugins...\n ...none found\n 1.50 real 1.33 user 0.11 sys\n 688029696 maximum resident set size\n 0 average shared memory size\n 0 average unshared data size\n 0 average unshared stack size\n 46452 page reclaims\n 0 page faults\n 0 swaps\n 0 block input operations\n 0 block output operations\n 8 messages sent\n 4 messages received\n 0 signals received\n 47 voluntary context switches\n 1142 involuntary context switches\n 25891464222 instructions retired\n 6244619084 cycles elapsed\n 564954528 peak memory footprint\n", + "tool": "Graphia", + "dataset": "mathlib", + "repetition": 3, + "warmup": false, + "dataset_sha256": "696929b325b7297107f85eb811adb95460bc8bd298126f265d9f746cdce3b2e1", + "correctness": { + "exact_incidence_and_node_attributes": true, + "document_metadata_retained": false, + "typed_native_display_fields_retained": false, + "saved_as_directed": true, + "coordinates_are_attributes_not_layout": true, + "coordinate_attributes_retained": true, + "vertices_and_hubs": 54290, + "memberships": 118066 + } + }, + { + "status": "ok", + "returncode": 0, + "process_wall_seconds": 0.461615124999998, + "process_peak_rss_bytes": 137166848, + "stdout": "Wrote /Users/bregy/.codex/worktrees/ef9d/hyper/target/benchmark/graphia/inputs/moderate.graphia successfully.\n", + "stderr": "sandbox_extension_issue_file_to_process failed for /tmp/hyper-benchmark-competitors/Graphia.app: 1 (Operation not permitted)\nLoading dynamic plugins from /private/tmp/hyper-benchmark-competitors/Graphia.app/Contents/PlugIns...\n ...Correlation (libcorrelation.dylib)\n ...Generic (libgeneric.dylib)\n ...WebSearch (libwebsearch.dylib)\nLoading static plugins...\n ...none found\n 0.45 real 0.31 user 0.05 sys\n 137166848 maximum resident set size\n 0 average shared memory size\n 0 average unshared data size\n 0 average unshared stack size\n 11748 page reclaims\n 0 page faults\n 0 swaps\n 0 block input operations\n 0 block output operations\n 8 messages sent\n 4 messages received\n 0 signals received\n 5 voluntary context switches\n 2065 involuntary context switches\n 5721510773 instructions retired\n 1533775018 cycles elapsed\n 70599712 peak memory footprint\n", + "tool": "Graphia", + "dataset": "moderate", + "repetition": 4, + "warmup": false, + "dataset_sha256": "7581070d4ca0672f5a0e44d2190d14e5c30a03ab424893bedf2622bcc9b86bca", + "correctness": { + "exact_incidence_and_node_attributes": true, + "document_metadata_retained": false, + "typed_native_display_fields_retained": false, + "saved_as_directed": true, + "coordinates_are_attributes_not_layout": true, + "coordinate_attributes_retained": true, + "vertices_and_hubs": 3000, + "memberships": 13200 + } + }, + { + "status": "ok", + "returncode": 0, + "process_wall_seconds": 0.3922522910000019, + "process_peak_rss_bytes": 111607808, + "stdout": "Wrote /Users/bregy/.codex/worktrees/ef9d/hyper/target/benchmark/graphia/inputs/scientific.graphia successfully.\n", + "stderr": "sandbox_extension_issue_file_to_process failed for /tmp/hyper-benchmark-competitors/Graphia.app: 1 (Operation not permitted)\nLoading dynamic plugins from /private/tmp/hyper-benchmark-competitors/Graphia.app/Contents/PlugIns...\n ...Correlation (libcorrelation.dylib)\n ...Generic (libgeneric.dylib)\n ...WebSearch (libwebsearch.dylib)\nLoading static plugins...\n ...none found\n 0.38 real 0.26 user 0.04 sys\n 111607808 maximum resident set size\n 0 average shared memory size\n 0 average unshared data size\n 0 average unshared stack size\n 10191 page reclaims\n 0 page faults\n 0 swaps\n 0 block input operations\n 0 block output operations\n 8 messages sent\n 4 messages received\n 0 signals received\n 5 voluntary context switches\n 1609 involuntary context switches\n 4779904758 instructions retired\n 1295059093 cycles elapsed\n 45204488 peak memory footprint\n", + "tool": "Graphia", + "dataset": "scientific", + "repetition": 4, + "warmup": false, + "dataset_sha256": "1e721ab444d6b769b2c27f6d23818eb0a847a5ad14dd039c7ff0818450e5baec", + "correctness": { + "exact_incidence_and_node_attributes": true, + "document_metadata_retained": false, + "typed_native_display_fields_retained": false, + "saved_as_directed": true, + "coordinates_are_attributes_not_layout": true, + "coordinate_attributes_retained": true, + "vertices_and_hubs": 1419, + "memberships": 1550 + } + }, + { + "status": "ok", + "returncode": 0, + "process_wall_seconds": 1.6109835419999996, + "process_peak_rss_bytes": 681738240, + "stdout": "Wrote /Users/bregy/.codex/worktrees/ef9d/hyper/target/benchmark/graphia/inputs/mathlib.graphia successfully.\n", + "stderr": "sandbox_extension_issue_file_to_process failed for /tmp/hyper-benchmark-competitors/Graphia.app: 1 (Operation not permitted)\nLoading dynamic plugins from /private/tmp/hyper-benchmark-competitors/Graphia.app/Contents/PlugIns...\n ...Correlation (libcorrelation.dylib)\n ...Generic (libgeneric.dylib)\n ...WebSearch (libwebsearch.dylib)\nLoading static plugins...\n ...none found\n 1.60 real 1.38 user 0.12 sys\n 681738240 maximum resident set size\n 0 average shared memory size\n 0 average unshared data size\n 0 average unshared stack size\n 46035 page reclaims\n 0 page faults\n 0 swaps\n 0 block input operations\n 0 block output operations\n 8 messages sent\n 4 messages received\n 0 signals received\n 50 voluntary context switches\n 3165 involuntary context switches\n 25882362662 instructions retired\n 6449255999 cycles elapsed\n 556041632 peak memory footprint\n", + "tool": "Graphia", + "dataset": "mathlib", + "repetition": 4, + "warmup": false, + "dataset_sha256": "696929b325b7297107f85eb811adb95460bc8bd298126f265d9f746cdce3b2e1", + "correctness": { + "exact_incidence_and_node_attributes": true, + "document_metadata_retained": false, + "typed_native_display_fields_retained": false, + "saved_as_directed": true, + "coordinates_are_attributes_not_layout": true, + "coordinate_attributes_retained": true, + "vertices_and_hubs": 54290, + "memberships": 118066 + } + } +] diff --git a/docs/benchmarks/ecosystem-2026-10-03/evidence/hypergodot-clamped-window-diagnostic-metadata.json b/docs/benchmarks/ecosystem-2026-10-03/evidence/hypergodot-clamped-window-diagnostic-metadata.json new file mode 100644 index 0000000..389bed4 --- /dev/null +++ b/docs/benchmarks/ecosystem-2026-10-03/evidence/hypergodot-clamped-window-diagnostic-metadata.json @@ -0,0 +1,11 @@ +{ + "tool": "hypergodot", + "executable": "/tmp/hyper-benchmark-competitors/Godot.app/Contents/MacOS/Godot", + "timeout_seconds": 180, + "executable_sha256": "c7cccbf8fb143e34e02fd6521e09be2c2b974f0d5db080b19071c9c570718ccf", + "conditions": "M5Pro24GiB macOS27; lowpowermode0; no parallel benchmark/build; ordinary desktop background uncontrolled; display sleep disabled; idle sleep prevented; thermal telemetry unavailable; variable display cadence", + "peak_memory": "macOS /usr/bin/time -l whole-process RSS high-water in bytes", + "fresh_process_per_repetition": false, + "repetitions": 5, + "seed": 20261003 +} diff --git a/docs/benchmarks/ecosystem-2026-10-03/evidence/hypergodot-clamped-window-diagnostic.json.gz b/docs/benchmarks/ecosystem-2026-10-03/evidence/hypergodot-clamped-window-diagnostic.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..fa0c2b19a8712bda3845feb1889e77df0633d2d1 GIT binary patch literal 5717 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 Hxqbiuw~^QJ literal 0 HcmV?d00001 diff --git a/docs/benchmarks/ecosystem-2026-10-03/evidence/hypergodot-fullscreen-unmatched-diagnostic.json b/docs/benchmarks/ecosystem-2026-10-03/evidence/hypergodot-fullscreen-unmatched-diagnostic.json new file mode 100644 index 0000000..e66b0fd --- /dev/null +++ b/docs/benchmarks/ecosystem-2026-10-03/evidence/hypergodot-fullscreen-unmatched-diagnostic.json @@ -0,0 +1,67 @@ +{ + "adaptations": [ + "remove missing unused MaterialIconsDB autoload", + "reversible safe token IDs and line-order hyperedge IDs", + "unit weights and one baseline group", + "fixed XY projection of canonical 3D positions", + "override startup layout; production read_file/create_nodes/populate_edge_data/drawing", + "scripted camera and wall-clock process-boundary frame intervals", + "fullscreen to avoid macOS working-area window clamp" + ], + "allow_hidpi": false, + "color_seed": 20261003, + "dataset": "/Users/bregy/.codex/worktrees/ef9d/hyper/target/benchmark/datasets/moderate.json", + "edge_width": 1.0, + "exact_parser_memberships_and_rendered_group_count": true, + "godot_version": { + "build": "official", + "hash": "ed1daf0bf001b61586d9930840f2f1394092c079", + "hex": 263938, + "major": 4, + "minor": 7, + "patch": 2, + "status": "stable", + "string": "4.7.2-stable (official)", + "timestamp": 0 + }, + "hyperedges": 2000.0, + "matched_requested_viewport": false, + "measured_frames": 2, + "memberships": 13200.0, + "metric": "wall-clock frame intervals, not GPU timestamps", + "node_radius": 30.0, + "point_count": 4.0, + "renderer": "forward_plus", + "renderer_driver": "metal", + "repetitions": [ + { + "frame_ms": [ + 8.428, + 8.336 + ], + "repetition": 0 + } + ], + "screen_dpi": 256, + "screen_scale": 1.0, + "screen_size": [ + 1512, + 982 + ], + "sha256": "7581070d4ca0672f5a0e44d2190d14e5c30a03ab424893bedf2622bcc9b86bca", + "source_commit": "49d03cd7540d2900cc8624048973ef430ff4e009", + "startup_construction_ms": 318.639, + "tool": "HyperGodot", + "vertices": 1000.0, + "viewport_size": [ + 1512.0, + 949.0 + ], + "vsync": "disabled by upstream project", + "warmup_frames": 120, + "window_mode": 3, + "window_size": [ + 1512, + 949 + ] +} \ No newline at end of file diff --git a/docs/benchmarks/ecosystem-2026-10-03/evidence/hypergodot-hidpi-untimed-smoke.json b/docs/benchmarks/ecosystem-2026-10-03/evidence/hypergodot-hidpi-untimed-smoke.json new file mode 100644 index 0000000..d4747dc --- /dev/null +++ b/docs/benchmarks/ecosystem-2026-10-03/evidence/hypergodot-hidpi-untimed-smoke.json @@ -0,0 +1,71 @@ +{ + "adaptations": [ + "remove missing unused MaterialIconsDB autoload", + "reversible safe token IDs and line-order hyperedge IDs", + "unit weights and one baseline group", + "fixed XY projection of canonical 3D positions", + "override startup layout; production read_file/create_nodes/populate_edge_data/drawing", + "scripted camera and wall-clock process-boundary frame intervals", + "stock HiDPI enabled; physical viewport verified" + ], + "allow_hidpi": true, + "color_seed": 20261003, + "dataset": "/Users/bregy/.codex/worktrees/ef9d/hyper/target/benchmark/datasets/moderate.json", + "edge_width": 1.0, + "exact_parser_memberships_and_rendered_group_count": true, + "godot_version": { + "build": "official", + "hash": "ed1daf0bf001b61586d9930840f2f1394092c079", + "hex": 263938, + "major": 4, + "minor": 7, + "patch": 2, + "status": "stable", + "string": "4.7.2-stable (official)", + "timestamp": 0 + }, + "hyperedges": 2000.0, + "matched_requested_viewport": true, + "measured_frames": 2, + "memberships": 13200.0, + "metric": "wall-clock frame intervals, not GPU timestamps", + "node_radius": 30.0, + "point_count": 4.0, + "render_target_size": [ + 1920.0, + 1080.0 + ], + "renderer": "forward_plus", + "renderer_driver": "metal", + "repetitions": [ + { + "frame_ms": [ + 6.772, + 3.957 + ], + "repetition": 0 + } + ], + "screen_dpi": 256, + "screen_scale": 2.0, + "screen_size": [ + 3024, + 1964 + ], + "sha256": "7581070d4ca0672f5a0e44d2190d14e5c30a03ab424893bedf2622bcc9b86bca", + "source_commit": "49d03cd7540d2900cc8624048973ef430ff4e009", + "startup_construction_ms": 190.184, + "tool": "HyperGodot", + "vertices": 1000.0, + "viewport_size": [ + 1920.0, + 1080.0 + ], + "vsync": "disabled by upstream project", + "warmup_frames": 120, + "window_mode": 0, + "window_size": [ + 1920, + 1080 + ] +} \ No newline at end of file diff --git a/docs/benchmarks/ecosystem-2026-10-03/evidence/hypergodot-metadata.json b/docs/benchmarks/ecosystem-2026-10-03/evidence/hypergodot-metadata.json new file mode 100644 index 0000000..dffad42 --- /dev/null +++ b/docs/benchmarks/ecosystem-2026-10-03/evidence/hypergodot-metadata.json @@ -0,0 +1,11 @@ +{ + "tool": "hypergodot", + "executable": "/tmp/hyper-benchmark-competitors/Godot.app/Contents/MacOS/Godot", + "timeout_seconds": 180, + "executable_sha256": "c7cccbf8fb143e34e02fd6521e09be2c2b974f0d5db080b19071c9c570718ccf", + "conditions": "M5Pro24GiB macOS27; lowpowermode0; no parallel benchmark/build; ordinary desktop background uncontrolled; idle sleep prevented; thermal telemetry unavailable; stock HiDPI enabled; physical render target verified1920x1080", + "peak_memory": "macOS /usr/bin/time -l whole-process RSS high-water in bytes", + "fresh_process_per_repetition": false, + "repetitions": 5, + "seed": 20261003 +} diff --git a/docs/benchmarks/ecosystem-2026-10-03/evidence/hypergodot-raw.json b/docs/benchmarks/ecosystem-2026-10-03/evidence/hypergodot-raw.json new file mode 100644 index 0000000..002855a --- /dev/null +++ b/docs/benchmarks/ecosystem-2026-10-03/evidence/hypergodot-raw.json @@ -0,0 +1,1602 @@ +[ + { + "status": "ok", + "returncode": 0, + "process_wall_seconds": 19.184621915999998, + "process_peak_rss_bytes": 352894976, + "stdout": "Godot Engine v4.7.2.stable.official.ed1daf0bf - https://godotengine.org\nMetal 4.0 - Forward+ - Using Device #0: Apple - Apple M5 Pro (Apple9)\nRequested V-Sync mode: Disabled\n\nProject FPS: 119 (8.40 mspf)\nProject FPS: 120 (8.33 mspf)\nProject FPS: 120 (8.33 mspf)\nProject FPS: 119 (8.40 mspf)\nProject FPS: 119 (8.40 mspf)\nProject FPS: 118 (8.47 mspf)\nProject FPS: 119 (8.40 mspf)\nProject FPS: 119 (8.40 mspf)\nProject FPS: 118 (8.47 mspf)\nProject FPS: 119 (8.40 mspf)\nProject FPS: 196 (5.10 mspf)\nProject FPS: 120 (8.33 mspf)\nProject FPS: 119 (8.40 mspf)\nProject FPS: 120 (8.33 mspf)\nProject FPS: 117 (8.54 mspf)\n", + "stderr": "sandbox_extension_issue_file_to_process failed for /tmp/hyper-benchmark-competitors/Godot.app: 1 (Operation not permitted)\n 19.18 real 7.95 user 1.39 sys\n 352894976 maximum resident set size\n 0 average shared memory size\n 0 average unshared data size\n 0 average unshared stack size\n 23634 page reclaims\n 4689 page faults\n 0 swaps\n 0 block input operations\n 0 block output operations\n 3 messages sent\n 0 messages received\n 0 signals received\n 138 voluntary context switches\n 53759 involuntary context switches\n 142703056176 instructions retired\n 30290869492 cycles elapsed\n 517375176 peak memory footprint\n", + "tool": "HyperGodot", + "dataset": "moderate", + "warmup": false, + "measurements": { + "adaptations": [ + "remove missing unused MaterialIconsDB autoload", + "reversible safe token IDs and line-order hyperedge IDs", + "unit weights and one baseline group", + "fixed XY projection of canonical 3D positions", + "override startup layout; production read_file/create_nodes/populate_edge_data/drawing", + "scripted camera and wall-clock process-boundary frame intervals", + "stock HiDPI enabled; physical viewport verified" + ], + "allow_hidpi": true, + "color_seed": 20261003, + "dataset": "/Users/bregy/.codex/worktrees/ef9d/hyper/target/benchmark/datasets/moderate.json", + "edge_width": 1.0, + "exact_parser_memberships_and_rendered_group_count": true, + "godot_version": { + "build": "official", + "hash": "ed1daf0bf001b61586d9930840f2f1394092c079", + "hex": 263938, + "major": 4, + "minor": 7, + "patch": 2, + "status": "stable", + "string": "4.7.2-stable (official)", + "timestamp": 0 + }, + "hyperedges": 2000.0, + "matched_requested_viewport": true, + "measured_frames": 300, + "memberships": 13200.0, + "metric": "wall-clock frame intervals, not GPU timestamps", + "node_radius": 30.0, + "point_count": 4.0, + "render_target_size": [ + 1920.0, + 1080.0 + ], + "renderer": "forward_plus", + "renderer_driver": "metal", + "repetitions": [ + { + "frame_ms": [ + 8.144, + 8.373, + 8.382, + 8.344, + 8.249, + 8.586, + 8.056, + 8.489, + 8.257, + 8.341, + 8.281, + 8.562, + 8.304, + 8.306, + 8.845, + 7.756, + 8.294, + 8.356, + 8.284, + 8.354, + 8.433, + 8.329, + 8.207, + 8.461, + 11.656, + 5.554, + 7.799, + 8.322, + 8.464, + 8.324, + 8.243, + 8.424, + 8.247, + 8.383, + 8.271, + 8.441, + 8.261, + 8.341, + 8.269, + 8.413, + 8.286, + 8.302, + 8.507, + 23.287, + 6.516, + 5.596, + 6.23, + 7.959, + 8.395, + 8.252, + 8.397, + 8.654, + 8.354, + 8.216, + 8.361, + 8.328, + 8.387, + 8.216, + 8.476, + 8.151, + 8.417, + 8.317, + 8.409, + 8.215, + 8.301, + 8.243, + 8.489, + 8.253, + 8.404, + 8.243, + 8.308, + 8.313, + 8.411, + 8.406, + 8.294, + 8.36, + 8.363, + 11.825, + 5.255, + 7.786, + 8.302, + 8.521, + 8.203, + 8.353, + 8.603, + 8.147, + 8.277, + 8.384, + 8.384, + 8.27, + 8.251, + 8.486, + 8.324, + 8.207, + 8.391, + 8.196, + 8.732, + 8.025, + 8.506, + 8.115, + 20.222, + 5.362, + 4.639, + 10.364, + 4.025, + 5.326, + 8.249, + 8.294, + 8.362, + 8.284, + 8.379, + 8.591, + 8.404, + 8.186, + 8.452, + 8.176, + 8.506, + 8.214, + 8.477, + 8.261, + 8.39, + 8.235, + 8.443, + 8.23, + 8.444, + 8.239, + 8.314, + 8.234, + 8.442, + 8.222, + 8.412, + 8.45, + 8.348, + 8.759, + 7.623, + 8.452, + 8.343, + 8.348, + 8.349, + 8.313, + 8.395, + 8.2, + 8.494, + 11.976, + 5.693, + 10.469, + 7.131, + 9.552, + 6.108, + 9.566, + 8.351, + 9.504, + 6.936, + 8.333, + 8.53, + 8.208, + 5.997, + 8.718, + 8.439, + 8.162, + 8.417, + 8.269, + 21.304, + 4.618, + 3.967, + 10.517, + 3.531, + 5.831, + 8.321, + 8.334, + 8.345, + 8.508, + 8.313, + 8.168, + 8.462, + 8.423, + 8.227, + 8.398, + 8.405, + 8.304, + 8.341, + 8.329, + 8.227, + 8.565, + 8.14, + 8.31, + 8.436, + 8.241, + 8.177, + 8.608, + 8.399, + 8.38, + 8.051, + 8.352, + 8.224, + 8.437, + 8.417, + 8.263, + 8.348, + 8.266, + 8.404, + 8.156, + 8.301, + 8.377, + 8.343, + 8.292, + 8.478, + 8.275, + 8.369, + 8.223, + 8.422, + 8.34, + 8.375, + 8.298, + 8.35, + 8.308, + 8.543, + 8.111, + 8.563, + 8.334, + 18.888, + 5.569, + 4.973, + 10.862, + 4.221, + 5.212, + 8.312, + 8.293, + 8.368, + 8.179, + 13.804, + 4.001, + 7.085, + 8.426, + 8.38, + 8.401, + 8.44, + 8.097, + 8.808, + 8.325, + 8.441, + 11.75, + 4.895, + 8.329, + 8.225, + 8.313, + 8.401, + 8.133, + 8.669, + 8.201, + 8.395, + 8.3, + 8.422, + 8.382, + 7.709, + 8.529, + 8.407, + 8.382, + 8.322, + 8.222, + 8.475, + 8.152, + 8.569, + 8.139, + 8.43, + 8.416, + 8.278, + 8.236, + 8.386, + 8.297, + 8.445, + 8.267, + 8.425, + 8.283, + 8.357, + 8.215, + 8.444, + 17.647, + 7.205, + 6.729, + 9.028, + 5.906, + 14.409, + 5.573, + 5.166, + 10.476, + 3.876, + 5.48, + 8.396, + 8.149, + 8.423, + 8.226, + 8.373, + 8.269, + 8.761, + 8.215, + 8.438, + 8.129, + 8.462, + 8.256 + ], + "repetition": 0 + }, + { + "frame_ms": [ + 8.396, + 8.262, + 8.392, + 8.334, + 8.118, + 8.723, + 7.973, + 8.414, + 8.233, + 8.462, + 8.211, + 8.497, + 8.246, + 8.48, + 8.149, + 8.437, + 8.214, + 8.415, + 8.269, + 8.349, + 8.401, + 8.44, + 8.128, + 8.401, + 8.518, + 17.588, + 6.641, + 5.411, + 10.735, + 4.905, + 4.561, + 8.394, + 8.188, + 8.49, + 8.231, + 8.456, + 8.3, + 8.287, + 8.452, + 19.105, + 5.203, + 4.063, + 11.913, + 3.782, + 5.551, + 8.388, + 8.262, + 8.372, + 8.336, + 8.957, + 13.418, + 4.784, + 6.12, + 8.393, + 8.372, + 8.323, + 8.268, + 8.376, + 8.265, + 8.475, + 8.267, + 8.347, + 8.223, + 8.598, + 8.118, + 8.509, + 8.211, + 8.539, + 8.169, + 8.496, + 8.358, + 8.316, + 9.042, + 15.6, + 6.697, + 6.115, + 5.492, + 6.851, + 8.402, + 8.502, + 8.261, + 8.394, + 8.324, + 8.403, + 8.201, + 8.318, + 8.245, + 8.535, + 8.121, + 8.626, + 8.224, + 8.352, + 8.404, + 8.308, + 8.288, + 8.385, + 8.343, + 8.37, + 8.21, + 8.436, + 8.375, + 22.453, + 6.574, + 5.313, + 7.031, + 8.278, + 8.308, + 8.316, + 8.367, + 8.662, + 8.344, + 8.114, + 8.548, + 8.042, + 8.523, + 11.911, + 4.819, + 8.276, + 8.433, + 8.239, + 13.45, + 5.8, + 5.728, + 8.39, + 8.331, + 8.199, + 8.389, + 8.196, + 8.475, + 8.194, + 8.386, + 8.247, + 8.402, + 8.256, + 8.361, + 8.453, + 8.246, + 8.297, + 8.324, + 8.276, + 8.457, + 8.244, + 8.409, + 8.323, + 13.648, + 6.688, + 5.373, + 7.473, + 8.449, + 8.397, + 8.503, + 8.158, + 8.542, + 8.321, + 8.303, + 8.182, + 8.457, + 8.275, + 18.956, + 5.457, + 3.916, + 12.118, + 3.505, + 5.773, + 8.386, + 8.296, + 8.365, + 8.364, + 18.617, + 5.877, + 4.266, + 11.88, + 3.552, + 5.674, + 8.442, + 8.214, + 8.352, + 8.329, + 8.384, + 8.4, + 8.697, + 8.253, + 8.273, + 8.141, + 8.376, + 8.252, + 8.493, + 8.282, + 8.406, + 8.344, + 8.271, + 9.659, + 7.146, + 8.151, + 8.37, + 8.388, + 8.361, + 8.265, + 8.449, + 8.117, + 8.522, + 8.308, + 8.362, + 8.22, + 8.462, + 8.152, + 8.613, + 8.287, + 8.352, + 8.233, + 8.548, + 8.169, + 8.555, + 7.975, + 8.657, + 8.231, + 8.553, + 7.887, + 8.534, + 8.416, + 21.8, + 5.204, + 5.899, + 8.462, + 8.336, + 8.267, + 8.263, + 8.361, + 8.494, + 8.55, + 8.119, + 8.347, + 8.297, + 8.265, + 8.278, + 8.62, + 8.067, + 8.367, + 8.343, + 8.4, + 8.207, + 8.361, + 8.118, + 8.404, + 8.304, + 8.331, + 8.211, + 8.838, + 8.133, + 8.506, + 8.269, + 8.192, + 8.317, + 8.37, + 8.193, + 8.37, + 15.944, + 11.367, + 6.054, + 8.127, + 8.401, + 8.288, + 8.694, + 8.094, + 8.279, + 8.149, + 8.458, + 8.419, + 7.91, + 8.62, + 8.589, + 8.139, + 8.456, + 8.272, + 8.375, + 9.229, + 16.425, + 7.371, + 5.277, + 10.777, + 4.827, + 4.611, + 8.267, + 8.343, + 8.359, + 8.407, + 8.07, + 8.538, + 8.641, + 7.962, + 8.619, + 8.274, + 8.465, + 8.119, + 8.547, + 8.045, + 8.397, + 8.243, + 8.4, + 8.314 + ], + "repetition": 1 + }, + { + "frame_ms": [ + 8.486, + 8.312, + 8.34, + 8.28, + 8.347, + 8.474, + 8.226, + 8.307, + 9.244, + 7.378, + 8.307, + 8.313, + 8.382, + 8.435, + 8.279, + 8.247, + 8.199, + 8.594, + 8.088, + 8.503, + 8.129, + 8.536, + 8.099, + 8.415, + 8.265, + 8.466, + 8.367, + 16.129, + 6.907, + 9.198, + 5.749, + 5.758, + 6.386, + 8.382, + 8.253, + 8.335, + 8.408, + 16.525, + 7.69, + 6.507, + 9.556, + 3.544, + 5.698, + 8.41, + 8.389, + 8.391, + 8.241, + 8.394, + 8.536, + 8.35, + 8.197, + 8.493, + 8.16, + 8.508, + 8.182, + 8.503, + 8.238, + 8.425, + 8.139, + 8.371, + 8.211, + 8.427, + 8.418, + 8.309, + 8.29, + 8.511, + 8.151, + 8.452, + 8.191, + 8.628, + 8.238, + 8.281, + 8.162, + 8.628, + 8.19, + 8.44, + 8.178, + 8.476, + 8.399, + 8.288, + 8.263, + 8.283, + 8.274, + 8.433, + 8.19, + 8.526, + 8.222, + 16.231, + 5.397, + 10.711, + 4.685, + 4.806, + 8.09, + 8.604, + 8.27, + 22.902, + 4.486, + 5.646, + 8.345, + 8.277, + 8.338, + 8.309, + 8.722, + 8.252, + 15.116, + 4.032, + 5.838, + 8.183, + 8.274, + 8.645, + 8.408, + 8.194, + 8.438, + 8.115, + 8.529, + 8.154, + 8.364, + 8.229, + 8.352, + 8.236, + 8.376, + 8.344, + 8.448, + 8.178, + 8.448, + 8.857, + 7.549, + 8.438, + 8.454, + 8.126, + 8.489, + 8.275, + 8.428, + 8.316, + 8.457, + 8.16, + 8.448, + 8.234, + 8.443, + 8.219, + 8.415, + 8.538, + 7.971, + 8.498, + 8.329, + 8.28, + 8.394, + 8.273, + 8.404, + 8.295, + 8.383, + 8.257, + 8.49, + 8.411, + 8.386, + 8.209, + 22.378, + 5.705, + 5.552, + 8.155, + 8.094, + 8.345, + 8.192, + 8.393, + 8.33, + 8.557, + 8.26, + 8.421, + 8.279, + 8.394, + 8.25, + 8.422, + 8.177, + 8.527, + 8.224, + 8.422, + 8.201, + 8.438, + 8.129, + 8.455, + 8.296, + 8.296, + 8.275, + 8.405, + 8.373, + 8.278, + 8.34, + 8.346, + 8.364, + 8.316, + 8.238, + 8.397, + 8.256, + 8.575, + 8.288, + 8.199, + 8.284, + 8.404, + 8.334, + 8.291, + 8.342, + 8.627, + 8.058, + 8.672, + 8.052, + 8.226, + 8.476, + 8.318, + 8.341, + 8.373, + 8.077, + 8.721, + 8.007, + 24.363, + 5.218, + 4.718, + 7.44, + 10.989, + 5.719, + 8.157, + 8.397, + 8.347, + 8.578, + 13.953, + 4.991, + 5.833, + 8.238, + 8.279, + 8.365, + 8.471, + 8.47, + 8.471, + 8.207, + 8.272, + 8.353, + 8.246, + 8.443, + 8.454, + 8.265, + 8.367, + 8.151, + 8.346, + 8.448, + 8.259, + 8.029, + 10.215, + 6.758, + 9.319, + 7.434, + 8.309, + 8.241, + 8.36, + 8.379, + 8.36, + 8.353, + 8.292, + 8.388, + 8.295, + 8.343, + 8.239, + 8.35, + 8.268, + 8.633, + 8.315, + 8.322, + 8.192, + 8.443, + 8.233, + 8.291, + 8.428, + 8.447, + 8.166, + 8.32, + 8.391, + 23.915, + 7.187, + 5.82, + 5.36, + 7.534, + 8.395, + 8.487, + 8.134, + 8.267, + 8.425, + 8.275, + 8.368, + 8.368, + 8.248, + 8.312, + 8.346, + 8.417, + 8.34, + 8.49, + 8.147, + 8.428, + 8.272, + 8.331, + 8.425, + 8.229, + 8.481 + ], + "repetition": 2 + }, + { + "frame_ms": [ + 3.342, + 3.407, + 4.252, + 3.742, + 3.337, + 3.33, + 3.379, + 4.229, + 3.723, + 3.393, + 3.337, + 4.155, + 3.783, + 3.327, + 3.358, + 3.312, + 3.356, + 3.356, + 3.431, + 3.361, + 3.385, + 3.338, + 4.661, + 3.738, + 3.387, + 3.391, + 3.362, + 3.384, + 3.334, + 3.398, + 3.356, + 3.398, + 3.376, + 3.36, + 3.406, + 3.359, + 3.363, + 3.447, + 3.374, + 3.335, + 3.435, + 3.341, + 3.447, + 3.389, + 3.414, + 3.382, + 4.25, + 3.735, + 3.368, + 3.398, + 3.363, + 3.467, + 3.394, + 4.203, + 3.719, + 3.39, + 3.436, + 3.372, + 3.459, + 3.399, + 3.395, + 3.432, + 3.351, + 3.449, + 3.421, + 3.354, + 3.408, + 3.412, + 3.414, + 3.414, + 3.475, + 3.396, + 3.384, + 3.446, + 3.409, + 3.407, + 3.412, + 3.46, + 3.432, + 3.357, + 3.495, + 3.391, + 3.437, + 3.429, + 3.436, + 3.379, + 4.21, + 3.767, + 3.456, + 3.435, + 3.385, + 3.921, + 3.815, + 3.466, + 3.43, + 3.413, + 4.107, + 3.776, + 7.2, + 7.936, + 7.846, + 7.526, + 3.774, + 3.393, + 4.383, + 3.732, + 3.481, + 3.402, + 4.511, + 3.719, + 3.446, + 3.486, + 3.458, + 4.201, + 3.733, + 3.474, + 3.473, + 4.542, + 3.769, + 7.211, + 4.057, + 3.48, + 3.45, + 4.466, + 13.49, + 8.508, + 8.513, + 8.349, + 8.307, + 8.355, + 8.266, + 8.463, + 8.333, + 8.37, + 8.234, + 8.475, + 8.317, + 8.93, + 7.833, + 8.334, + 8.344, + 8.203, + 8.377, + 8.316, + 8.388, + 8.319, + 8.352, + 8.389, + 8.3, + 8.269, + 8.412, + 8.452, + 8.161, + 8.435, + 8.234, + 8.456, + 8.193, + 8.384, + 8.252, + 8.424, + 8.31, + 8.427, + 8.211, + 8.39, + 8.291, + 8.392, + 8.373, + 8.337, + 8.232, + 19.668, + 4.611, + 4.228, + 11.782, + 3.444, + 5.803, + 8.562, + 8.507, + 8.393, + 8.334, + 7.944, + 8.699, + 10.687, + 5.681, + 8.414, + 8.159, + 8.35, + 8.31, + 8.539, + 8.069, + 8.288, + 8.539, + 8.141, + 8.527, + 8.161, + 8.459, + 8.181, + 8.455, + 8.228, + 8.471, + 8.314, + 8.281, + 8.264, + 8.362, + 8.307, + 8.34, + 8.271, + 8.317, + 8.689, + 8.0, + 8.622, + 7.991, + 8.404, + 8.309, + 8.598, + 8.053, + 8.641, + 8.026, + 8.567, + 8.071, + 8.638, + 7.976, + 8.636, + 8.069, + 8.367, + 8.256, + 8.306, + 8.418, + 14.033, + 7.188, + 4.0, + 8.125, + 8.604, + 8.07, + 8.553, + 8.098, + 8.29, + 8.338, + 8.347, + 8.374, + 8.596, + 8.071, + 8.505, + 8.156, + 8.501, + 8.127, + 8.729, + 7.936, + 8.332, + 8.344, + 8.28, + 8.383, + 8.621, + 8.009, + 8.378, + 8.329, + 11.358, + 6.984, + 6.758, + 8.233, + 8.54, + 8.885, + 10.222, + 6.716, + 7.22, + 8.351, + 8.425, + 8.228, + 8.371, + 8.411, + 8.547, + 8.072, + 8.531, + 8.203, + 8.984, + 8.083, + 7.984, + 8.502, + 8.259, + 8.423, + 8.353, + 8.305, + 8.282, + 8.492, + 8.328, + 8.463, + 9.439, + 7.496, + 8.15, + 8.32, + 17.136, + 7.177, + 6.708, + 9.324, + 6.236, + 5.366, + 6.349, + 8.175, + 8.315, + 8.418, + 8.557 + ], + "repetition": 3 + }, + { + "frame_ms": [ + 8.034, + 8.495, + 8.193, + 8.515, + 8.286, + 8.411, + 8.079, + 8.407, + 8.396, + 8.22, + 11.506, + 5.8, + 7.735, + 8.457, + 8.35, + 8.326, + 8.46, + 8.157, + 8.348, + 8.338, + 8.288, + 8.471, + 8.227, + 8.322, + 8.351, + 8.359, + 9.363, + 7.379, + 8.291, + 8.355, + 8.214, + 8.49, + 8.21, + 8.322, + 8.433, + 8.384, + 8.309, + 8.315, + 8.436, + 8.263, + 8.295, + 8.237, + 8.419, + 8.358, + 9.025, + 7.735, + 18.674, + 5.693, + 5.771, + 10.274, + 4.867, + 4.744, + 8.288, + 8.275, + 8.246, + 8.676, + 8.234, + 8.336, + 12.66, + 4.336, + 7.73, + 8.387, + 9.412, + 7.22, + 8.718, + 8.345, + 8.245, + 8.326, + 8.3, + 8.376, + 8.257, + 8.344, + 8.186, + 8.402, + 8.379, + 8.228, + 8.43, + 8.377, + 8.257, + 8.338, + 8.43, + 8.18, + 9.505, + 7.218, + 8.369, + 8.269, + 8.306, + 8.407, + 8.36, + 8.311, + 8.263, + 8.371, + 8.495, + 8.175, + 8.265, + 8.44, + 8.304, + 8.324, + 8.283, + 8.32, + 8.4, + 8.279, + 8.327, + 8.385, + 10.345, + 6.359, + 8.427, + 8.134, + 17.401, + 26.671, + 4.314, + 5.048, + 4.946, + 8.118, + 8.522, + 8.181, + 8.26, + 8.418, + 8.357, + 16.284, + 6.951, + 15.72, + 3.818, + 7.086, + 8.291, + 8.214, + 8.402, + 8.313, + 8.367, + 8.457, + 8.38, + 8.302, + 8.284, + 8.392, + 8.404, + 8.3, + 8.443, + 8.185, + 8.334, + 8.253, + 8.48, + 8.206, + 8.377, + 8.277, + 8.444, + 8.235, + 8.364, + 8.264, + 8.36, + 8.439, + 8.221, + 8.29, + 8.616, + 8.205, + 8.429, + 8.281, + 8.457, + 8.304, + 8.423, + 8.268, + 8.418, + 8.263, + 8.43, + 16.965, + 7.384, + 6.892, + 9.15, + 6.405, + 5.56, + 5.906, + 8.107, + 8.277, + 8.335, + 8.336, + 8.413, + 11.562, + 5.052, + 8.275, + 8.362, + 8.424, + 8.599, + 8.199, + 8.41, + 8.399, + 8.304, + 8.393, + 8.453, + 9.542, + 7.006, + 8.465, + 8.184, + 8.467, + 8.351, + 8.299, + 8.288, + 8.18, + 8.361, + 8.266, + 8.334, + 8.309, + 8.3, + 8.282, + 8.478, + 8.515, + 8.173, + 8.38, + 8.242, + 8.387, + 8.358, + 8.168, + 8.394, + 8.339, + 8.414, + 8.284, + 8.334, + 8.358, + 8.284, + 8.282, + 8.334, + 8.36, + 8.368, + 8.351, + 8.278, + 8.382, + 8.283, + 19.108, + 6.419, + 6.167, + 8.859, + 4.996, + 4.541, + 8.203, + 8.241, + 8.37, + 8.779, + 14.348, + 9.777, + 3.858, + 12.12, + 3.544, + 12.283, + 5.399, + 4.962, + 8.384, + 8.411, + 8.239, + 8.508, + 8.286, + 8.374, + 8.199, + 8.449, + 8.395, + 8.402, + 8.256, + 8.341, + 8.373, + 8.245, + 8.216, + 8.404, + 8.226, + 8.322, + 8.425, + 8.291, + 8.434, + 8.239, + 8.351, + 8.478, + 8.288, + 8.23, + 8.493, + 8.277, + 8.388, + 8.255, + 8.395, + 8.317, + 8.339, + 8.296, + 8.325, + 8.241, + 8.475, + 8.371, + 8.246, + 8.379, + 12.586, + 22.231, + 6.512, + 5.981, + 4.936, + 6.045, + 8.345, + 8.259, + 8.355, + 8.33, + 9.192, + 13.543, + 5.021, + 5.522, + 8.019, + 8.315, + 8.442 + ], + "repetition": 4 + } + ], + "screen_dpi": 256, + "screen_scale": 2.0, + "screen_size": [ + 3024, + 1964 + ], + "sha256": "7581070d4ca0672f5a0e44d2190d14e5c30a03ab424893bedf2622bcc9b86bca", + "source_commit": "49d03cd7540d2900cc8624048973ef430ff4e009", + "startup_construction_ms": 188.342, + "tool": "HyperGodot", + "vertices": 1000.0, + "viewport_size": [ + 1920.0, + 1080.0 + ], + "vsync": "disabled by upstream project", + "warmup_frames": 120, + "window_mode": 0, + "window_size": [ + 1920, + 1080 + ] + } + } +] diff --git a/docs/benchmarks/ecosystem-2026-10-03/evidence/native-interactive-metadata.json b/docs/benchmarks/ecosystem-2026-10-03/evidence/native-interactive-metadata.json new file mode 100644 index 0000000..68a1480 --- /dev/null +++ b/docs/benchmarks/ecosystem-2026-10-03/evidence/native-interactive-metadata.json @@ -0,0 +1,141 @@ +{ + "track": "native", + "seed": 20261003, + "repetitions": 5, + "fresh_process_per_run": true, + "warmup": "120 render frames per run", + "schedule": [ + [ + 0, + "mathlib", + true, + false + ], + [ + 0, + "mathlib", + true, + true + ], + [ + 0, + "moderate", + true, + true + ], + [ + 0, + "moderate", + true, + false + ], + [ + 1, + "mathlib", + true, + true + ], + [ + 1, + "mathlib", + true, + false + ], + [ + 1, + "moderate", + true, + false + ], + [ + 1, + "moderate", + true, + true + ], + [ + 2, + "mathlib", + true, + false + ], + [ + 2, + "moderate", + true, + false + ], + [ + 2, + "mathlib", + true, + true + ], + [ + 2, + "moderate", + true, + true + ], + [ + 3, + "moderate", + true, + false + ], + [ + 3, + "mathlib", + true, + false + ], + [ + 3, + "moderate", + true, + true + ], + [ + 3, + "mathlib", + true, + true + ], + [ + 4, + "moderate", + true, + true + ], + [ + 4, + "mathlib", + true, + false + ], + [ + 4, + "mathlib", + true, + true + ], + [ + 4, + "moderate", + true, + false + ] + ], + "commit": "33c34621a898b6c9d1d11ad4ddae3ad29ccf1855", + "binary_sha256": "19fcc7d83c98a0bf5669d47cc6883cf51d0e45d6341e6d0656000d20a3b39cee", + "conditions": "M5Pro24GiB macOS27; lowpowermode0; no parallel benchmark/build; ordinary desktop background uncontrolled; display sleep disabled; idle sleep prevented; thermal telemetry unavailable; variable display cadence", + "peak_memory": "/usr/bin/time -l process RSS high-water; bytes on macOS; includes startup", + "build_profile": "release", + "projection": "star", + "labels": true, + "only_hulls": true, + "live_datasets": [ + "moderate", + "mathlib" + ] +} diff --git a/docs/benchmarks/ecosystem-2026-10-03/evidence/native-interactive-raw.json.gz b/docs/benchmarks/ecosystem-2026-10-03/evidence/native-interactive-raw.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..db6710dfca8aab50ef174e62849d51bdae9b125a GIT binary patch literal 50481 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 OfBk>3%M>!A3j_e)E{OC1 literal 0 HcmV?d00001 diff --git a/docs/benchmarks/ecosystem-2026-10-03/evidence/native-metadata.json b/docs/benchmarks/ecosystem-2026-10-03/evidence/native-metadata.json new file mode 100644 index 0000000..1b767ea --- /dev/null +++ b/docs/benchmarks/ecosystem-2026-10-03/evidence/native-metadata.json @@ -0,0 +1,500 @@ +{ + "track": "native", + "seed": 20261003, + "repetitions": 5, + "fresh_process_per_run": true, + "warmup": "120 render frames per run", + "schedule": [ + [ + 0, + "scientific", + false, + false + ], + [ + 0, + "mathlib", + false, + false + ], + [ + 0, + "mathlib", + true, + false + ], + [ + 0, + "scientific", + true, + false + ], + [ + 0, + "high-arity-100", + false, + false + ], + [ + 0, + "large", + true, + false + ], + [ + 0, + "moderate", + false, + true + ], + [ + 0, + "moderate", + true, + false + ], + [ + 0, + "high-arity-1000", + false, + false + ], + [ + 0, + "high-arity-10", + false, + false + ], + [ + 0, + "high-arity-100", + true, + false + ], + [ + 0, + "large", + false, + false + ], + [ + 0, + "high-arity-10", + true, + false + ], + [ + 0, + "moderate", + true, + true + ], + [ + 0, + "high-arity-1000", + true, + false + ], + [ + 0, + "moderate", + false, + false + ], + [ + 1, + "moderate", + false, + true + ], + [ + 1, + "scientific", + true, + false + ], + [ + 1, + "high-arity-100", + true, + false + ], + [ + 1, + "large", + true, + false + ], + [ + 1, + "high-arity-10", + false, + false + ], + [ + 1, + "mathlib", + true, + false + ], + [ + 1, + "high-arity-10", + true, + false + ], + [ + 1, + "moderate", + false, + false + ], + [ + 1, + "high-arity-1000", + false, + false + ], + [ + 1, + "high-arity-1000", + true, + false + ], + [ + 1, + "large", + false, + false + ], + [ + 1, + "scientific", + false, + false + ], + [ + 1, + "moderate", + true, + false + ], + [ + 1, + "mathlib", + false, + false + ], + [ + 1, + "high-arity-100", + false, + false + ], + [ + 1, + "moderate", + true, + true + ], + [ + 2, + "moderate", + true, + false + ], + [ + 2, + "mathlib", + true, + false + ], + [ + 2, + "mathlib", + false, + false + ], + [ + 2, + "high-arity-100", + true, + false + ], + [ + 2, + "high-arity-100", + false, + false + ], + [ + 2, + "large", + true, + false + ], + [ + 2, + "moderate", + true, + true + ], + [ + 2, + "scientific", + true, + false + ], + [ + 2, + "high-arity-1000", + false, + false + ], + [ + 2, + "large", + false, + false + ], + [ + 2, + "high-arity-10", + false, + false + ], + [ + 2, + "moderate", + false, + false + ], + [ + 2, + "moderate", + false, + true + ], + [ + 2, + "scientific", + false, + false + ], + [ + 2, + "high-arity-10", + true, + false + ], + [ + 2, + "high-arity-1000", + true, + false + ], + [ + 3, + "high-arity-10", + true, + false + ], + [ + 3, + "moderate", + false, + false + ], + [ + 3, + "high-arity-100", + false, + false + ], + [ + 3, + "moderate", + true, + false + ], + [ + 3, + "high-arity-1000", + false, + false + ], + [ + 3, + "moderate", + false, + true + ], + [ + 3, + "moderate", + true, + true + ], + [ + 3, + "large", + false, + false + ], + [ + 3, + "large", + true, + false + ], + [ + 3, + "high-arity-100", + true, + false + ], + [ + 3, + "mathlib", + true, + false + ], + [ + 3, + "high-arity-10", + false, + false + ], + [ + 3, + "mathlib", + false, + false + ], + [ + 3, + "scientific", + true, + false + ], + [ + 3, + "high-arity-1000", + true, + false + ], + [ + 3, + "scientific", + false, + false + ], + [ + 4, + "mathlib", + true, + false + ], + [ + 4, + "high-arity-100", + false, + false + ], + [ + 4, + "moderate", + true, + true + ], + [ + 4, + "moderate", + false, + true + ], + [ + 4, + "high-arity-100", + true, + false + ], + [ + 4, + "high-arity-10", + true, + false + ], + [ + 4, + "high-arity-10", + false, + false + ], + [ + 4, + "mathlib", + false, + false + ], + [ + 4, + "scientific", + false, + false + ], + [ + 4, + "moderate", + false, + false + ], + [ + 4, + "scientific", + true, + false + ], + [ + 4, + "high-arity-1000", + false, + false + ], + [ + 4, + "moderate", + true, + false + ], + [ + 4, + "large", + false, + false + ], + [ + 4, + "large", + true, + false + ], + [ + 4, + "high-arity-1000", + true, + false + ] + ], + "commit": "33c34621a898b6c9d1d11ad4ddae3ad29ccf1855", + "binary_sha256": "19fcc7d83c98a0bf5669d47cc6883cf51d0e45d6341e6d0656000d20a3b39cee", + "conditions": "M5Pro 24GiB macOS27; lowpowermode0; no parallel benchmark/build; ordinary desktop background uncontrolled; thermal telemetry unavailable; variable display cadence", + "peak_memory": "/usr/bin/time -l process RSS high-water; bytes on macOS; includes startup", + "build_profile": "release", + "projection": "bipartite", + "labels": false, + "only_hulls": false, + "live_datasets": [ + "moderate" + ] +} diff --git a/docs/benchmarks/ecosystem-2026-10-03/evidence/native-raw.json.gz b/docs/benchmarks/ecosystem-2026-10-03/evidence/native-raw.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..dba55cb94645ffafa72106ef9429d154240a6c4c GIT binary patch literal 118689 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