graphed 0.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- graphed-0.0.1/.github/workflows/ci.yml +223 -0
- graphed-0.0.1/.github/workflows/release.yml +78 -0
- graphed-0.0.1/.github/workflows/wheels.yml +70 -0
- graphed-0.0.1/.gitignore +26 -0
- graphed-0.0.1/.pre-commit-config.yaml +47 -0
- graphed-0.0.1/CLAUDE.md +43 -0
- graphed-0.0.1/CONTRIBUTING.md +57 -0
- graphed-0.0.1/Cargo.lock +520 -0
- graphed-0.0.1/Cargo.toml +32 -0
- graphed-0.0.1/MIGRATION.md +36 -0
- graphed-0.0.1/PKG-INFO +141 -0
- graphed-0.0.1/README.md +59 -0
- graphed-0.0.1/docs/_templates/autosummary/module.rst +45 -0
- graphed-0.0.1/docs/api.rst +18 -0
- graphed-0.0.1/docs/awkward/design.rst +163 -0
- graphed-0.0.1/docs/awkward/improvements.rst +20 -0
- graphed-0.0.1/docs/awkward/index.rst +25 -0
- graphed-0.0.1/docs/checkpoint/design.rst +127 -0
- graphed-0.0.1/docs/checkpoint/improvements.rst +40 -0
- graphed-0.0.1/docs/checkpoint/index.rst +31 -0
- graphed-0.0.1/docs/conf.py +68 -0
- graphed-0.0.1/docs/core/design.rst +396 -0
- graphed-0.0.1/docs/core/improvements.rst +33 -0
- graphed-0.0.1/docs/core/index.rst +29 -0
- graphed-0.0.1/docs/corpus/design.rst +97 -0
- graphed-0.0.1/docs/corpus/graph_bloat_note.md +52 -0
- graphed-0.0.1/docs/corpus/improvements.rst +25 -0
- graphed-0.0.1/docs/corpus/index.rst +24 -0
- graphed-0.0.1/docs/corpus/requirements/ops_catalog.md +76 -0
- graphed-0.0.1/docs/debug/design.rst +204 -0
- graphed-0.0.1/docs/debug/improvements.rst +24 -0
- graphed-0.0.1/docs/debug/index.rst +22 -0
- graphed-0.0.1/docs/frontend/design.rst +198 -0
- graphed-0.0.1/docs/frontend/improvements.rst +21 -0
- graphed-0.0.1/docs/frontend/index.rst +25 -0
- graphed-0.0.1/docs/index.rst +37 -0
- graphed-0.0.1/docs/numpy/design.rst +138 -0
- graphed-0.0.1/docs/numpy/improvements.rst +17 -0
- graphed-0.0.1/docs/numpy/index.rst +24 -0
- graphed-0.0.1/docs/preserve/design.rst +187 -0
- graphed-0.0.1/docs/preserve/improvements.rst +92 -0
- graphed-0.0.1/docs/preserve/index.rst +34 -0
- graphed-0.0.1/pyproject.toml +122 -0
- graphed-0.0.1/python/graphed/__init__.py +57 -0
- graphed-0.0.1/python/graphed/aggregate.py +108 -0
- graphed-0.0.1/python/graphed/array.py +410 -0
- graphed-0.0.1/python/graphed/awkward/__init__.py +33 -0
- graphed-0.0.1/python/graphed/awkward/_ops.py +391 -0
- graphed-0.0.1/python/graphed/awkward/backend.py +132 -0
- graphed-0.0.1/python/graphed/awkward/functions.py +715 -0
- graphed-0.0.1/python/graphed/awkward/io.py +278 -0
- graphed-0.0.1/python/graphed/awkward/payloads.py +156 -0
- graphed-0.0.1/python/graphed/awkward/projection.py +149 -0
- graphed-0.0.1/python/graphed/awkward/shuffle.py +75 -0
- graphed-0.0.1/python/graphed/backend.py +52 -0
- graphed-0.0.1/python/graphed/checkpoint/__init__.py +38 -0
- graphed-0.0.1/python/graphed/checkpoint/codec.py +48 -0
- graphed-0.0.1/python/graphed/checkpoint/errors.py +41 -0
- graphed-0.0.1/python/graphed/checkpoint/py.typed +0 -0
- graphed-0.0.1/python/graphed/checkpoint/retry.py +164 -0
- graphed-0.0.1/python/graphed/checkpoint/runner.py +230 -0
- graphed-0.0.1/python/graphed/checkpoint/store.py +159 -0
- graphed-0.0.1/python/graphed/core/__init__.py +70 -0
- graphed-0.0.1/python/graphed/core/__init__.pyi +102 -0
- graphed-0.0.1/python/graphed/core/execution.py +395 -0
- graphed-0.0.1/python/graphed/core/graphed_core.pyi +85 -0
- graphed-0.0.1/python/graphed/core/plan.py +388 -0
- graphed-0.0.1/python/graphed/core/py.typed +0 -0
- graphed-0.0.1/python/graphed/debug/__init__.py +31 -0
- graphed-0.0.1/python/graphed/debug/_sampler.py +157 -0
- graphed-0.0.1/python/graphed/debug/dashboard/__init__.py +19 -0
- graphed-0.0.1/python/graphed/debug/dashboard/_client.py +105 -0
- graphed-0.0.1/python/graphed/debug/dashboard/_dashboard.py +85 -0
- graphed-0.0.1/python/graphed/debug/dashboard/_server.py +281 -0
- graphed-0.0.1/python/graphed/debug/dashboard/_wire.py +62 -0
- graphed-0.0.1/python/graphed/debug/dashboard/static/index.html +220 -0
- graphed-0.0.1/python/graphed/debug/dashboard/static/vendor/README.md +40 -0
- graphed-0.0.1/python/graphed/debug/dashboard/static/vendor/d3-flamegraph.css +46 -0
- graphed-0.0.1/python/graphed/debug/dashboard/static/vendor/d3-flamegraph.min.js +1 -0
- graphed-0.0.1/python/graphed/debug/dashboard/static/vendor/d3.min.js +2 -0
- graphed-0.0.1/python/graphed/debug/dashboard/static/vendor/perspective-dashboard.js +17 -0
- graphed-0.0.1/python/graphed/debug/dashboard/static/vendor/themes.css +1 -0
- graphed-0.0.1/python/graphed/debug/errors.py +81 -0
- graphed-0.0.1/python/graphed/debug/lowering.py +156 -0
- graphed-0.0.1/python/graphed/debug/runner.py +90 -0
- graphed-0.0.1/python/graphed/debug/tracebacks.py +31 -0
- graphed-0.0.1/python/graphed/debug/viz.py +66 -0
- graphed-0.0.1/python/graphed/errors.py +22 -0
- graphed-0.0.1/python/graphed/execute.py +126 -0
- graphed-0.0.1/python/graphed/numpy/__init__.py +520 -0
- graphed-0.0.1/python/graphed/numpy/array.py +566 -0
- graphed-0.0.1/python/graphed/numpy/creation.py +91 -0
- graphed-0.0.1/python/graphed/numpy/forms.py +56 -0
- graphed-0.0.1/python/graphed/numpy/gufunc.py +90 -0
- graphed-0.0.1/python/graphed/numpy/io.py +238 -0
- graphed-0.0.1/python/graphed/numpy/projection.py +77 -0
- graphed-0.0.1/python/graphed/numpy/random.py +53 -0
- graphed-0.0.1/python/graphed/numpy/reductions.py +179 -0
- graphed-0.0.1/python/graphed/numpy/shuffle.py +77 -0
- graphed-0.0.1/python/graphed/parquet.py +162 -0
- graphed-0.0.1/python/graphed/preserve/__init__.py +66 -0
- graphed-0.0.1/python/graphed/preserve/bundle.py +307 -0
- graphed-0.0.1/python/graphed/preserve/errors.py +17 -0
- graphed-0.0.1/python/graphed/preserve/externals/__init__.py +67 -0
- graphed-0.0.1/python/graphed/preserve/externals/_base.py +255 -0
- graphed-0.0.1/python/graphed/preserve/externals/_helpers.py +150 -0
- graphed-0.0.1/python/graphed/preserve/externals/correctionlib_external.py +78 -0
- graphed-0.0.1/python/graphed/preserve/externals/histogram_external.py +66 -0
- graphed-0.0.1/python/graphed/preserve/externals/jax_external.py +75 -0
- graphed-0.0.1/python/graphed/preserve/externals/onnx_external.py +84 -0
- graphed-0.0.1/python/graphed/preserve/externals/pytorch_external.py +88 -0
- graphed-0.0.1/python/graphed/preserve/externals/tensorflow_external.py +92 -0
- graphed-0.0.1/python/graphed/preserve/externals/triton_external.py +103 -0
- graphed-0.0.1/python/graphed/preserve/externals/xgboost_external.py +64 -0
- graphed-0.0.1/python/graphed/preserve/interpreter.py +48 -0
- graphed-0.0.1/python/graphed/preserve/manifest.py +27 -0
- graphed-0.0.1/python/graphed/preserve/py.typed +0 -0
- graphed-0.0.1/python/graphed/projection.py +147 -0
- graphed-0.0.1/python/graphed/provenance.py +79 -0
- graphed-0.0.1/python/graphed/py.typed +0 -0
- graphed-0.0.1/python/graphed/session.py +280 -0
- graphed-0.0.1/python/graphed/shuffle.py +138 -0
- graphed-0.0.1/python/graphed/write.py +97 -0
- graphed-0.0.1/scripts/run-tests.sh +48 -0
- graphed-0.0.1/src/lib.rs +541 -0
- graphed-0.0.1/src/node.rs +239 -0
- graphed-0.0.1/src/optimizer/engine.rs +143 -0
- graphed-0.0.1/src/optimizer/incremental.rs +211 -0
- graphed-0.0.1/src/optimizer/mod.rs +677 -0
- graphed-0.0.1/src/param.rs +177 -0
- graphed-0.0.1/src/serialize.rs +461 -0
- graphed-0.0.1/src/store.rs +477 -0
- graphed-0.0.1/tests/_corpus/graphed_corpus/__init__.py +28 -0
- graphed-0.0.1/tests/_corpus/graphed_corpus/analyses/__init__.py +8 -0
- graphed-0.0.1/tests/_corpus/graphed_corpus/analyses/adl.py +154 -0
- graphed-0.0.1/tests/_corpus/graphed_corpus/analyses/systematics.py +112 -0
- graphed-0.0.1/tests/_corpus/graphed_corpus/dataset.py +67 -0
- graphed-0.0.1/tests/_corpus/graphed_corpus/histograms.py +56 -0
- graphed-0.0.1/tests/_corpus/references/adl_q1.json +55 -0
- graphed-0.0.1/tests/_corpus/references/adl_q2.json +55 -0
- graphed-0.0.1/tests/_corpus/references/adl_q3.json +55 -0
- graphed-0.0.1/tests/_corpus/references/adl_q4.json +55 -0
- graphed-0.0.1/tests/_corpus/references/adl_q5.json +55 -0
- graphed-0.0.1/tests/_corpus/references/adl_q6.json +55 -0
- graphed-0.0.1/tests/_corpus/references/adl_q7.json +55 -0
- graphed-0.0.1/tests/_corpus/references/adl_q8.json +55 -0
- graphed-0.0.1/tests/_corpus/references/ttbar_4j1b_btag_down.json +45 -0
- graphed-0.0.1/tests/_corpus/references/ttbar_4j1b_btag_up.json +45 -0
- graphed-0.0.1/tests/_corpus/references/ttbar_4j1b_jes_down.json +45 -0
- graphed-0.0.1/tests/_corpus/references/ttbar_4j1b_jes_up.json +45 -0
- graphed-0.0.1/tests/_corpus/references/ttbar_4j1b_nominal.json +45 -0
- graphed-0.0.1/tests/_corpus/references/ttbar_4j2b_btag_down.json +45 -0
- graphed-0.0.1/tests/_corpus/references/ttbar_4j2b_btag_up.json +45 -0
- graphed-0.0.1/tests/_corpus/references/ttbar_4j2b_jes_down.json +45 -0
- graphed-0.0.1/tests/_corpus/references/ttbar_4j2b_jes_up.json +45 -0
- graphed-0.0.1/tests/_corpus/references/ttbar_4j2b_nominal.json +45 -0
- graphed-0.0.1/tests/_corpus/references/ttgamma_jes_down.json +35 -0
- graphed-0.0.1/tests/_corpus/references/ttgamma_jes_up.json +35 -0
- graphed-0.0.1/tests/_corpus/references/ttgamma_nominal.json +35 -0
- graphed-0.0.1/tests/_corpus/references/ttgamma_pho_down.json +35 -0
- graphed-0.0.1/tests/_corpus/references/ttgamma_pho_up.json +35 -0
- graphed-0.0.1/tests/extra/checkpoint/m8/test_kill_after_guard.py +50 -0
- graphed-0.0.1/tests/extra/frontend/m13/test_not_iterable.py +31 -0
- graphed-0.0.1/tests/extra/numpy/m13/test_handler_argument_errors.py +124 -0
- graphed-0.0.1/tests/extra/numpy/m15/test_pandas_free.py +51 -0
- graphed-0.0.1/tests/frozen/awkward/m10/README.md +14 -0
- graphed-0.0.1/tests/frozen/awkward/m10/test_buffer_projection.py +117 -0
- graphed-0.0.1/tests/frozen/awkward/m11/test_functions_only_idiom.py +36 -0
- graphed-0.0.1/tests/frozen/awkward/m15/README.md +11 -0
- graphed-0.0.1/tests/frozen/awkward/m15/test_parquet_io.py +180 -0
- graphed-0.0.1/tests/frozen/awkward/m16/README.md +9 -0
- graphed-0.0.1/tests/frozen/awkward/m16/m16_helpers.py +33 -0
- graphed-0.0.1/tests/frozen/awkward/m16/test_reducers.py +71 -0
- graphed-0.0.1/tests/frozen/awkward/m16/test_structural_rule.py +71 -0
- graphed-0.0.1/tests/frozen/awkward/m16/test_ufunc_tier.py +115 -0
- graphed-0.0.1/tests/frozen/awkward/m17/README.md +9 -0
- graphed-0.0.1/tests/frozen/awkward/m17/test_structure_ops.py +127 -0
- graphed-0.0.1/tests/frozen/awkward/m18/README.md +10 -0
- graphed-0.0.1/tests/frozen/awkward/m18/test_behaviors.py +92 -0
- graphed-0.0.1/tests/frozen/awkward/m19/README.md +6 -0
- graphed-0.0.1/tests/frozen/awkward/m19/test_conveniences.py +48 -0
- graphed-0.0.1/tests/frozen/awkward/m21/README.md +12 -0
- graphed-0.0.1/tests/frozen/awkward/m21/test_partitioned_writer.py +124 -0
- graphed-0.0.1/tests/frozen/awkward/m24/README.md +13 -0
- graphed-0.0.1/tests/frozen/awkward/m24/test_interface_parity.py +243 -0
- graphed-0.0.1/tests/frozen/awkward/m28/test_preservable_externals.py +192 -0
- graphed-0.0.1/tests/frozen/awkward/m3/analyses.py +130 -0
- graphed-0.0.1/tests/frozen/awkward/m3/conftest.py +12 -0
- graphed-0.0.1/tests/frozen/awkward/m3/test_dispatch.py +74 -0
- graphed-0.0.1/tests/frozen/awkward/m3/test_eval.py +46 -0
- graphed-0.0.1/tests/frozen/awkward/m3/test_integration_adl.py +53 -0
- graphed-0.0.1/tests/frozen/awkward/m3/test_metadata_only.py +42 -0
- graphed-0.0.1/tests/frozen/awkward/m3/test_payloads.py +96 -0
- graphed-0.0.1/tests/frozen/awkward/m3/test_provenance.py +39 -0
- graphed-0.0.1/tests/frozen/awkward/m3/test_recording.py +49 -0
- graphed-0.0.1/tests/frozen/awkward/m39/README.md +24 -0
- graphed-0.0.1/tests/frozen/awkward/m39/golden_route.py +133 -0
- graphed-0.0.1/tests/frozen/awkward/m39/test_exchange_primitives.py +102 -0
- graphed-0.0.1/tests/frozen/awkward/m5/test_no_overtouch.py +87 -0
- graphed-0.0.1/tests/frozen/awkward/m5/test_projection.py +73 -0
- graphed-0.0.1/tests/frozen/awkward/m5/test_topologies.py +66 -0
- graphed-0.0.1/tests/frozen/awkward/m9/test_generic_external.py +52 -0
- graphed-0.0.1/tests/frozen/checkpoint/m39/README.md +34 -0
- graphed-0.0.1/tests/frozen/checkpoint/m39/shuffle_analyses.py +64 -0
- graphed-0.0.1/tests/frozen/checkpoint/m39/test_multistage_journal.py +60 -0
- graphed-0.0.1/tests/frozen/checkpoint/m39/test_shuffle_resume.py +70 -0
- graphed-0.0.1/tests/frozen/checkpoint/m8/README.md +28 -0
- graphed-0.0.1/tests/frozen/checkpoint/m8/analyses.py +183 -0
- graphed-0.0.1/tests/frozen/checkpoint/m8/deployment.py +163 -0
- graphed-0.0.1/tests/frozen/checkpoint/m8/test_codec.py +32 -0
- graphed-0.0.1/tests/frozen/checkpoint/m8/test_deployment.py +116 -0
- graphed-0.0.1/tests/frozen/checkpoint/m8/test_errors.py +104 -0
- graphed-0.0.1/tests/frozen/checkpoint/m8/test_no_source.py +97 -0
- graphed-0.0.1/tests/frozen/checkpoint/m8/test_realistic.py +34 -0
- graphed-0.0.1/tests/frozen/checkpoint/m8/test_resume.py +69 -0
- graphed-0.0.1/tests/frozen/checkpoint/m8/test_store.py +53 -0
- graphed-0.0.1/tests/frozen/core/m1/README.md +18 -0
- graphed-0.0.1/tests/frozen/core/m1/test_determinism_and_guardrails.py +66 -0
- graphed-0.0.1/tests/frozen/core/m1/test_external.py +61 -0
- graphed-0.0.1/tests/frozen/core/m1/test_interning.py +85 -0
- graphed-0.0.1/tests/frozen/core/m1/test_property.py +49 -0
- graphed-0.0.1/tests/frozen/core/m1/test_threadsafe.py +67 -0
- graphed-0.0.1/tests/frozen/core/m10/README.md +14 -0
- graphed-0.0.1/tests/frozen/core/m10/test_blind_partition.py +68 -0
- graphed-0.0.1/tests/frozen/core/m10/test_incremental_reducer.py +110 -0
- graphed-0.0.1/tests/frozen/core/m10/test_maximal_fusion.py +94 -0
- graphed-0.0.1/tests/frozen/core/m10/test_sound_rules.py +64 -0
- graphed-0.0.1/tests/frozen/core/m10/test_stage_members.py +121 -0
- graphed-0.0.1/tests/frozen/core/m22/README.md +9 -0
- graphed-0.0.1/tests/frozen/core/m22/test_output_scoped_reduction.py +114 -0
- graphed-0.0.1/tests/frozen/core/m32/test_sequential_runner.py +92 -0
- graphed-0.0.1/tests/frozen/core/m33/test_bounded_resources.py +80 -0
- graphed-0.0.1/tests/frozen/core/m37/test_monitor_seam.py +134 -0
- graphed-0.0.1/tests/frozen/core/m39/README.md +34 -0
- graphed-0.0.1/tests/frozen/core/m39/test_durable_plan_v2.py +125 -0
- graphed-0.0.1/tests/frozen/core/m39/test_exchange_ir.py +83 -0
- graphed-0.0.1/tests/frozen/core/m39/test_exchange_serialize.py +69 -0
- graphed-0.0.1/tests/frozen/core/m39/test_shuffle_backend_protocol.py +91 -0
- graphed-0.0.1/tests/frozen/core/m4/test_benchmark.py +53 -0
- graphed-0.0.1/tests/frozen/core/m4/test_reduce.py +118 -0
- graphed-0.0.1/tests/frozen/core/m4/test_systematics.py +53 -0
- graphed-0.0.1/tests/frozen/core/m4/test_topologies.py +132 -0
- graphed-0.0.1/tests/frozen/core/m7/test_execution_contract.py +61 -0
- graphed-0.0.1/tests/frozen/core/m8/README.md +25 -0
- graphed-0.0.1/tests/frozen/core/m8/test_deployment.py +119 -0
- graphed-0.0.1/tests/frozen/core/m8/test_durable_plan.py +198 -0
- graphed-0.0.1/tests/frozen/core/m8/test_ir_serialization.py +90 -0
- graphed-0.0.1/tests/frozen/core/m9/test_introspection.py +74 -0
- graphed-0.0.1/tests/frozen/corpus/m05/conftest.py +42 -0
- graphed-0.0.1/tests/frozen/corpus/m05/test_catalog.py +52 -0
- graphed-0.0.1/tests/frozen/corpus/m05/test_determinism.py +26 -0
- graphed-0.0.1/tests/frozen/corpus/m05/test_fixtures_reproduce.py +35 -0
- graphed-0.0.1/tests/frozen/corpus/m05/test_systematics.py +53 -0
- graphed-0.0.1/tests/frozen/debug/m37/test_dashboard.py +301 -0
- graphed-0.0.1/tests/frozen/debug/m37/test_dashboard_browser.py +93 -0
- graphed-0.0.1/tests/frozen/debug/m6/analyses.py +56 -0
- graphed-0.0.1/tests/frozen/debug/m6/test_awkward_mass.py +34 -0
- graphed-0.0.1/tests/frozen/debug/m6/test_lowering.py +58 -0
- graphed-0.0.1/tests/frozen/debug/m6/test_process_boundary.py +31 -0
- graphed-0.0.1/tests/frozen/debug/m6/test_runner.py +82 -0
- graphed-0.0.1/tests/frozen/debug/m6/test_stage_error.py +60 -0
- graphed-0.0.1/tests/frozen/debug/m6/test_topologies.py +77 -0
- graphed-0.0.1/tests/frozen/debug/m6/test_traceback.py +71 -0
- graphed-0.0.1/tests/frozen/debug/m6/test_visualize.py +53 -0
- graphed-0.0.1/tests/frozen/frontend/m10/README.md +12 -0
- graphed-0.0.1/tests/frozen/frontend/m10/m10_toy.py +94 -0
- graphed-0.0.1/tests/frozen/frontend/m10/test_compiled_execution.py +136 -0
- graphed-0.0.1/tests/frozen/frontend/m10/test_incremental_session.py +65 -0
- graphed-0.0.1/tests/frozen/frontend/m11/README.md +18 -0
- graphed-0.0.1/tests/frozen/frontend/m11/m11_toy.py +81 -0
- graphed-0.0.1/tests/frozen/frontend/m11/test_array_factory.py +69 -0
- graphed-0.0.1/tests/frozen/frontend/m11/test_ufunc_surface.py +137 -0
- graphed-0.0.1/tests/frozen/frontend/m12/README.md +15 -0
- graphed-0.0.1/tests/frozen/frontend/m12/m12_toy.py +91 -0
- graphed-0.0.1/tests/frozen/frontend/m12/test_reduction_surface.py +107 -0
- graphed-0.0.1/tests/frozen/frontend/m13/README.md +11 -0
- graphed-0.0.1/tests/frozen/frontend/m13/m13_toy.py +91 -0
- graphed-0.0.1/tests/frozen/frontend/m13/test_getitem_surface.py +71 -0
- graphed-0.0.1/tests/frozen/frontend/m14/README.md +10 -0
- graphed-0.0.1/tests/frozen/frontend/m14/m14_toy.py +54 -0
- graphed-0.0.1/tests/frozen/frontend/m14/test_apply.py +65 -0
- graphed-0.0.1/tests/frozen/frontend/m15/README.md +11 -0
- graphed-0.0.1/tests/frozen/frontend/m15/m15_toy.py +55 -0
- graphed-0.0.1/tests/frozen/frontend/m15/test_parquet_base.py +171 -0
- graphed-0.0.1/tests/frozen/frontend/m17/README.md +6 -0
- graphed-0.0.1/tests/frozen/frontend/m17/m17_toy.py +91 -0
- graphed-0.0.1/tests/frozen/frontend/m17/test_fields_subset.py +41 -0
- graphed-0.0.1/tests/frozen/frontend/m2/backends.py +99 -0
- graphed-0.0.1/tests/frozen/frontend/m2/test_backend_independence.py +34 -0
- graphed-0.0.1/tests/frozen/frontend/m2/test_external.py +32 -0
- graphed-0.0.1/tests/frozen/frontend/m2/test_provenance_errors.py +48 -0
- graphed-0.0.1/tests/frozen/frontend/m2/test_recording.py +46 -0
- graphed-0.0.1/tests/frozen/frontend/m20/README.md +9 -0
- graphed-0.0.1/tests/frozen/frontend/m20/test_write_base.py +93 -0
- graphed-0.0.1/tests/frozen/frontend/m22/README.md +9 -0
- graphed-0.0.1/tests/frozen/frontend/m22/test_output_scoped_compiles.py +79 -0
- graphed-0.0.1/tests/frozen/frontend/m23/README.md +7 -0
- graphed-0.0.1/tests/frozen/frontend/m23/test_external_overrides.py +120 -0
- graphed-0.0.1/tests/frozen/frontend/m3/test_array_surface.py +83 -0
- graphed-0.0.1/tests/frozen/frontend/m3/test_provenance.py +61 -0
- graphed-0.0.1/tests/frozen/frontend/m3/test_topologies.py +100 -0
- graphed-0.0.1/tests/frozen/frontend/m3/toy.py +40 -0
- graphed-0.0.1/tests/frozen/frontend/m35/test_deep_graph_walk.py +34 -0
- graphed-0.0.1/tests/frozen/frontend/m39/README.md +31 -0
- graphed-0.0.1/tests/frozen/frontend/m39/shuffle_backends.py +98 -0
- graphed-0.0.1/tests/frozen/frontend/m39/test_repartition_api.py +68 -0
- graphed-0.0.1/tests/frozen/frontend/m39/test_shuffle_plan_builder.py +64 -0
- graphed-0.0.1/tests/frozen/frontend/m5/test_aggregate_plan.py +108 -0
- graphed-0.0.1/tests/frozen/frontend/m5/test_projection_support.py +118 -0
- graphed-0.0.1/tests/frozen/frontend/m5/test_read_columns_projection.py +71 -0
- graphed-0.0.1/tests/frozen/frontend/m8/test_serialized_ir.py +69 -0
- graphed-0.0.1/tests/frozen/frontend/m9/test_sourcemap.py +21 -0
- graphed-0.0.1/tests/frozen/numpy/m11/README.md +14 -0
- graphed-0.0.1/tests/frozen/numpy/m11/test_elementwise_full.py +157 -0
- graphed-0.0.1/tests/frozen/numpy/m11/test_form_inference.py +83 -0
- graphed-0.0.1/tests/frozen/numpy/m11/test_numpy_array_idiom.py +31 -0
- graphed-0.0.1/tests/frozen/numpy/m11/test_projection_and_determinism.py +56 -0
- graphed-0.0.1/tests/frozen/numpy/m12/README.md +13 -0
- graphed-0.0.1/tests/frozen/numpy/m12/test_creation.py +74 -0
- graphed-0.0.1/tests/frozen/numpy/m12/test_random_and_monoids.py +119 -0
- graphed-0.0.1/tests/frozen/numpy/m12/test_reductions_match_numpy.py +98 -0
- graphed-0.0.1/tests/frozen/numpy/m13/README.md +13 -0
- graphed-0.0.1/tests/frozen/numpy/m13/m13_helpers.py +13 -0
- graphed-0.0.1/tests/frozen/numpy/m13/test_combination_and_aggregates.py +128 -0
- graphed-0.0.1/tests/frozen/numpy/m13/test_indexing.py +87 -0
- graphed-0.0.1/tests/frozen/numpy/m13/test_manipulation.py +171 -0
- graphed-0.0.1/tests/frozen/numpy/m14/README.md +8 -0
- graphed-0.0.1/tests/frozen/numpy/m14/test_apply_gufunc.py +124 -0
- graphed-0.0.1/tests/frozen/numpy/m15/README.md +12 -0
- graphed-0.0.1/tests/frozen/numpy/m15/test_parquet_io.py +178 -0
- graphed-0.0.1/tests/frozen/numpy/m2/test_backend_methods.py +55 -0
- graphed-0.0.1/tests/frozen/numpy/m2/test_external_payload.py +41 -0
- graphed-0.0.1/tests/frozen/numpy/m2/test_numpy_program.py +62 -0
- graphed-0.0.1/tests/frozen/numpy/m39/README.md +23 -0
- graphed-0.0.1/tests/frozen/numpy/m39/golden_route.py +133 -0
- graphed-0.0.1/tests/frozen/numpy/m39/test_exchange_primitives.py +89 -0
- graphed-0.0.1/tests/frozen/numpy/m5/test_no_overtouch.py +86 -0
- graphed-0.0.1/tests/frozen/numpy/m5/test_projection.py +88 -0
- graphed-0.0.1/tests/frozen/numpy/m5/test_topologies.py +62 -0
- graphed-0.0.1/tests/frozen/preserve/m25/test_histogram_preservation.py +94 -0
- graphed-0.0.1/tests/frozen/preserve/m26/conftest.py +9 -0
- graphed-0.0.1/tests/frozen/preserve/m26/fake_triton.py +79 -0
- graphed-0.0.1/tests/frozen/preserve/m26/test_ml_bundle_roundtrips.py +152 -0
- graphed-0.0.1/tests/frozen/preserve/m26/test_ml_plugin_frameworks.py +228 -0
- graphed-0.0.1/tests/frozen/preserve/m26/test_ml_plugin_registry.py +78 -0
- graphed-0.0.1/tests/frozen/preserve/m27/conftest.py +8 -0
- graphed-0.0.1/tests/frozen/preserve/m27/fake_triton_multi.py +76 -0
- graphed-0.0.1/tests/frozen/preserve/m27/test_variadic_call_templates.py +301 -0
- graphed-0.0.1/tests/frozen/preserve/m27/test_variadic_frameworks.py +193 -0
- graphed-0.0.1/tests/frozen/preserve/m30/test_producer_cross_seam.py +189 -0
- graphed-0.0.1/tests/frozen/preserve/m36/test_content_hash_memo.py +54 -0
- graphed-0.0.1/tests/frozen/preserve/m9/README.md +33 -0
- graphed-0.0.1/tests/frozen/preserve/m9/agc.py +191 -0
- graphed-0.0.1/tests/frozen/preserve/m9/conftest.py +25 -0
- graphed-0.0.1/tests/frozen/preserve/m9/test_build_errors.py +56 -0
- graphed-0.0.1/tests/frozen/preserve/m9/test_fingerprint.py +47 -0
- graphed-0.0.1/tests/frozen/preserve/m9/test_inspect.py +59 -0
- graphed-0.0.1/tests/frozen/preserve/m9/test_missing_payload.py +45 -0
- graphed-0.0.1/tests/frozen/preserve/m9/test_ml_plugins.py +337 -0
- graphed-0.0.1/tests/frozen/preserve/m9/test_no_originals.py +48 -0
- graphed-0.0.1/tests/frozen/preserve/m9/test_plugins.py +270 -0
- graphed-0.0.1/tests/frozen/preserve/m9/test_reproduce.py +60 -0
- graphed-0.0.1/tests/frozen/preserve/m9/test_triton_server.py +140 -0
- graphed-0.0.1/tests/samples/triton_models/scorer/1/model.py +23 -0
- graphed-0.0.1/tests/samples/triton_models/scorer/config.pbtxt +18 -0
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
name: ci
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
|
|
9
|
+
concurrency:
|
|
10
|
+
group: ci-${{ github.ref }}
|
|
11
|
+
cancel-in-progress: true
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
# Python frozen suites on the full OS matrix. One `-e .[dev]` builds the maturin extension and
|
|
15
|
+
# installs every backend — no more git-sibling installs. Tests run per-subtree (see
|
|
16
|
+
# scripts/run-tests.sh) so each package's suite keeps its origin-repo isolation.
|
|
17
|
+
test:
|
|
18
|
+
name: test ${{ matrix.os }} py${{ matrix.python }}
|
|
19
|
+
runs-on: ${{ matrix.os }}
|
|
20
|
+
strategy:
|
|
21
|
+
fail-fast: false
|
|
22
|
+
matrix:
|
|
23
|
+
os: [ubuntu-latest, ubuntu-24.04-arm, macos-latest, windows-latest]
|
|
24
|
+
python: ["3.11", "3.12", "3.13", "3.14"]
|
|
25
|
+
steps:
|
|
26
|
+
- uses: actions/checkout@v4
|
|
27
|
+
- uses: actions/setup-python@v5
|
|
28
|
+
with:
|
|
29
|
+
python-version: ${{ matrix.python }}
|
|
30
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
31
|
+
- name: Install (builds the extension)
|
|
32
|
+
run: |
|
|
33
|
+
python -m pip install --upgrade pip
|
|
34
|
+
python -m pip install -e ".[dev]"
|
|
35
|
+
- uses: astral-sh/setup-uv@v5
|
|
36
|
+
- name: Lint + types (Python hooks via prek)
|
|
37
|
+
# this job's toolchain has no clippy/rustfmt components, so run only the Python hooks
|
|
38
|
+
run: uvx prek@0.4.5 run --all-files --show-diff-on-failure ruff-check ruff-format mypy
|
|
39
|
+
- name: Frozen suites (per-subtree)
|
|
40
|
+
shell: bash
|
|
41
|
+
run: ./scripts/run-tests.sh
|
|
42
|
+
|
|
43
|
+
# Combined branch-coverage gate (>=90%). Accumulated with --cov-append across subtrees, gated
|
|
44
|
+
# once on the union. The Rust core is measured separately (coverage-rust).
|
|
45
|
+
coverage:
|
|
46
|
+
name: coverage (>=90% combined)
|
|
47
|
+
runs-on: ubuntu-latest
|
|
48
|
+
steps:
|
|
49
|
+
- uses: actions/checkout@v4
|
|
50
|
+
- uses: actions/setup-python@v5
|
|
51
|
+
with:
|
|
52
|
+
python-version: "3.12"
|
|
53
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
54
|
+
- name: Install (builds the extension)
|
|
55
|
+
run: |
|
|
56
|
+
python -m pip install --upgrade pip
|
|
57
|
+
python -m pip install -e ".[dev]"
|
|
58
|
+
- name: Combined coverage
|
|
59
|
+
shell: bash
|
|
60
|
+
run: COV=1 ./scripts/run-tests.sh
|
|
61
|
+
|
|
62
|
+
# Pure-Rust IR: formatting, clippy (deny warnings), unit tests, and the loom model.
|
|
63
|
+
rust:
|
|
64
|
+
name: rust (clippy + cargo test + loom)
|
|
65
|
+
runs-on: ubuntu-latest
|
|
66
|
+
steps:
|
|
67
|
+
- uses: actions/checkout@v4
|
|
68
|
+
- uses: actions/setup-python@v5
|
|
69
|
+
with:
|
|
70
|
+
python-version: "3.12"
|
|
71
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
72
|
+
with:
|
|
73
|
+
components: clippy, rustfmt
|
|
74
|
+
- name: Link libpython for the test binary
|
|
75
|
+
run: echo "LD_LIBRARY_PATH=$(python -c 'import sysconfig; print(sysconfig.get_config_var(\"LIBDIR\"))')" >> "$GITHUB_ENV"
|
|
76
|
+
- uses: astral-sh/setup-uv@v5
|
|
77
|
+
- name: Rust lint (cargo fmt + clippy via prek)
|
|
78
|
+
run: uvx prek@0.4.5 run --all-files cargo-fmt cargo-clippy
|
|
79
|
+
- run: cargo test
|
|
80
|
+
- name: loom model of the locking discipline
|
|
81
|
+
run: RUSTFLAGS="--cfg loom" cargo test --lib loom_model
|
|
82
|
+
|
|
83
|
+
coverage-rust:
|
|
84
|
+
name: rust coverage (cargo llvm-cov)
|
|
85
|
+
runs-on: ubuntu-latest
|
|
86
|
+
steps:
|
|
87
|
+
- uses: actions/checkout@v4
|
|
88
|
+
- uses: actions/setup-python@v5
|
|
89
|
+
with:
|
|
90
|
+
python-version: "3.12"
|
|
91
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
92
|
+
with:
|
|
93
|
+
components: llvm-tools-preview
|
|
94
|
+
- uses: taiki-e/install-action@cargo-llvm-cov
|
|
95
|
+
- name: Link libpython for the test binary
|
|
96
|
+
run: echo "LD_LIBRARY_PATH=$(python -c 'import sysconfig; print(sysconfig.get_config_var(\"LIBDIR\"))')" >> "$GITHUB_ENV"
|
|
97
|
+
- name: cargo llvm-cov (fail under 90% lines, bindings excluded)
|
|
98
|
+
run: cargo llvm-cov --ignore-filename-regex 'lib\.rs' --fail-under-lines 90
|
|
99
|
+
|
|
100
|
+
# Free-threaded Python (plan A.5), REQUIRED for the core + frontend + numpy suites: these need
|
|
101
|
+
# only numpy (which ships free-threaded wheels), so the no-GIL thread-safety of the Rust core is
|
|
102
|
+
# a hard gate. The awkward/onnx-dependent suites run advisory below (their wheels lag on 3.14t).
|
|
103
|
+
test-freethreaded:
|
|
104
|
+
name: test py3.14t (free-threaded, core+frontend+numpy)
|
|
105
|
+
runs-on: ubuntu-latest
|
|
106
|
+
steps:
|
|
107
|
+
- uses: actions/checkout@v4
|
|
108
|
+
- uses: actions/setup-python@v5
|
|
109
|
+
with:
|
|
110
|
+
python-version: "3.14t"
|
|
111
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
112
|
+
- run: |
|
|
113
|
+
python -m pip install --upgrade pip
|
|
114
|
+
python -m pip install -e .
|
|
115
|
+
python -m pip install pytest hypothesis numpy
|
|
116
|
+
# separate invocations: a single pytest over multiple subtrees collides on duplicate
|
|
117
|
+
# test basenames (test_topologies.py, test_external.py) — same reason run-tests.sh exists.
|
|
118
|
+
pytest tests/frozen/core -p no:cacheprovider
|
|
119
|
+
pytest tests/frozen/frontend -p no:cacheprovider
|
|
120
|
+
pytest tests/frozen/numpy -p no:cacheprovider
|
|
121
|
+
|
|
122
|
+
test-freethreaded-backends:
|
|
123
|
+
name: test py3.14t (free-threaded, backends — advisory)
|
|
124
|
+
runs-on: ubuntu-latest
|
|
125
|
+
continue-on-error: true
|
|
126
|
+
steps:
|
|
127
|
+
- uses: actions/checkout@v4
|
|
128
|
+
- uses: actions/setup-python@v5
|
|
129
|
+
with:
|
|
130
|
+
python-version: "3.14t"
|
|
131
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
132
|
+
- shell: bash
|
|
133
|
+
run: |
|
|
134
|
+
python -m pip install --upgrade pip
|
|
135
|
+
python -m pip install -e ".[dev]"
|
|
136
|
+
./scripts/run-tests.sh
|
|
137
|
+
|
|
138
|
+
# The live dashboard's BROWSER render in headless Chromium (M37). Heavy (a real browser), so it
|
|
139
|
+
# runs once here; the matrix's dashboard tests importorskip Playwright and skip the smoke test.
|
|
140
|
+
dashboard-smoke:
|
|
141
|
+
name: dashboard browser smoke
|
|
142
|
+
runs-on: ubuntu-latest
|
|
143
|
+
steps:
|
|
144
|
+
- uses: actions/checkout@v4
|
|
145
|
+
- uses: actions/setup-python@v5
|
|
146
|
+
with:
|
|
147
|
+
python-version: "3.12"
|
|
148
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
149
|
+
- shell: bash
|
|
150
|
+
run: |
|
|
151
|
+
python -m pip install --upgrade pip
|
|
152
|
+
python -m pip install -e ".[dev,dashboard]"
|
|
153
|
+
python -m pip install playwright
|
|
154
|
+
python -m playwright install --with-deps chromium
|
|
155
|
+
pytest tests/frozen/debug/m37/test_dashboard_browser.py -q -p no:cacheprovider
|
|
156
|
+
|
|
157
|
+
docs:
|
|
158
|
+
name: docs (sphinx -W)
|
|
159
|
+
runs-on: ubuntu-latest
|
|
160
|
+
steps:
|
|
161
|
+
- uses: actions/checkout@v4
|
|
162
|
+
- uses: actions/setup-python@v5
|
|
163
|
+
with:
|
|
164
|
+
python-version: "3.12"
|
|
165
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
166
|
+
- name: Graphviz (inheritance diagrams)
|
|
167
|
+
run: sudo apt-get update && sudo apt-get install -y graphviz
|
|
168
|
+
- run: |
|
|
169
|
+
python -m pip install --upgrade pip
|
|
170
|
+
python -m pip install -e ".[docs,dev]"
|
|
171
|
+
sphinx-build -W -b html docs docs/_build/html
|
|
172
|
+
|
|
173
|
+
# Reproduce a preservation bundle through a REAL NVIDIA Triton server (gRPC + HTTP) with every ML
|
|
174
|
+
# framework present — the fully-realistic External-plugin cell. Serves tests/samples/triton_models.
|
|
175
|
+
triton:
|
|
176
|
+
name: real triton server (grpc + http)
|
|
177
|
+
runs-on: ubuntu-latest
|
|
178
|
+
steps:
|
|
179
|
+
- uses: actions/checkout@v4
|
|
180
|
+
- uses: actions/setup-python@v5
|
|
181
|
+
with:
|
|
182
|
+
python-version: "3.12"
|
|
183
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
184
|
+
- name: Free disk space (GPU-less runner; drop unused SDKs before the Triton image pull)
|
|
185
|
+
run: |
|
|
186
|
+
sudo rm -rf /usr/share/dotnet /opt/ghc /usr/local/lib/android /usr/local/share/boost || true
|
|
187
|
+
df -h /
|
|
188
|
+
- name: Start Triton server with the example model
|
|
189
|
+
run: |
|
|
190
|
+
docker run -d --rm --name triton -p 8000:8000 -p 8001:8001 -p 8002:8002 \
|
|
191
|
+
-v ${{ github.workspace }}/tests/samples/triton_models:/models \
|
|
192
|
+
nvcr.io/nvidia/tritonserver:25.11-pyt-python-py3 \
|
|
193
|
+
tritonserver --model-repository=/models
|
|
194
|
+
- name: Install this package + CPU-only ML frameworks + triton client (grpc + http)
|
|
195
|
+
run: |
|
|
196
|
+
python -m pip install --upgrade pip
|
|
197
|
+
python -m pip install -e ".[dev]"
|
|
198
|
+
# The runner has no GPU: the default torch/tensorflow wheels drag the multi-GB CUDA/NVIDIA
|
|
199
|
+
# stack and exhaust the disk. Install CPU-only builds (torch from the CPU index,
|
|
200
|
+
# tensorflow-cpu; jax and xgboost are CPU by default). tritonclient is just the client libs.
|
|
201
|
+
python -m pip install torch --index-url https://download.pytorch.org/whl/cpu
|
|
202
|
+
python -m pip install tensorflow-cpu jax xgboost "tritonclient[grpc,http]"
|
|
203
|
+
- name: Wait for Triton to be ready
|
|
204
|
+
run: |
|
|
205
|
+
for i in $(seq 1 90); do
|
|
206
|
+
if [ "$(curl -s -o /dev/null -w '%{http_code}' localhost:8000/v2/health/ready)" = "200" ]; then
|
|
207
|
+
echo "triton ready after ${i} tries"; exit 0
|
|
208
|
+
fi
|
|
209
|
+
sleep 2
|
|
210
|
+
done
|
|
211
|
+
echo "triton did not become ready"; docker logs triton; exit 1
|
|
212
|
+
- name: Full preserve suite against real Triton (gRPC + HTTP); nothing in m26 may skip
|
|
213
|
+
env:
|
|
214
|
+
GRAPHED_TRITON_GRPC: localhost:8001
|
|
215
|
+
GRAPHED_TRITON_HTTP: localhost:8000
|
|
216
|
+
TRITON_SERVER_URL: localhost:8000
|
|
217
|
+
run: |
|
|
218
|
+
pytest tests/frozen/preserve -p no:cacheprovider
|
|
219
|
+
pytest tests/frozen/preserve/m26 -q -rs | tee m26run.txt
|
|
220
|
+
! grep -i "skipped" m26run.txt || (echo "m26 skipped tests on the everything-present cell" && exit 1)
|
|
221
|
+
- name: Triton logs (on failure)
|
|
222
|
+
if: failure()
|
|
223
|
+
run: docker logs triton || true
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
name: release
|
|
2
|
+
|
|
3
|
+
# Publish to PyPI on a version tag (vX.Y.Z), using PyPI Trusted Publishing (OIDC — no API token).
|
|
4
|
+
#
|
|
5
|
+
# BEFORE this can publish you must, once, configure a Trusted Publisher on PyPI for the `graphed`
|
|
6
|
+
# project (https://pypi.org/manage/project/graphed/settings/publishing/):
|
|
7
|
+
# owner=graphed-org repo=graphed workflow=release.yml environment=pypi
|
|
8
|
+
# The project name `graphed` is currently free on PyPI. Until the trusted publisher is configured,
|
|
9
|
+
# this workflow builds and verifies the artifacts but the publish step will no-op/fail — that is
|
|
10
|
+
# intentional (nothing is uploaded without the maintainer opting in).
|
|
11
|
+
|
|
12
|
+
on:
|
|
13
|
+
push:
|
|
14
|
+
tags: ["v*"]
|
|
15
|
+
workflow_dispatch:
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
build:
|
|
19
|
+
name: build wheels + sdist (maturin)
|
|
20
|
+
runs-on: ${{ matrix.os }}
|
|
21
|
+
strategy:
|
|
22
|
+
fail-fast: false
|
|
23
|
+
matrix:
|
|
24
|
+
os: [ubuntu-latest, ubuntu-24.04-arm, macos-latest, windows-latest]
|
|
25
|
+
python: ["3.11", "3.12", "3.13", "3.14", "3.14t"]
|
|
26
|
+
steps:
|
|
27
|
+
- uses: actions/checkout@v4
|
|
28
|
+
- uses: actions/setup-python@v5
|
|
29
|
+
with:
|
|
30
|
+
python-version: ${{ matrix.python }}
|
|
31
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
32
|
+
- name: Add macOS universal2 targets
|
|
33
|
+
if: runner.os == 'macOS'
|
|
34
|
+
run: rustup target add x86_64-apple-darwin aarch64-apple-darwin
|
|
35
|
+
- shell: bash
|
|
36
|
+
run: |
|
|
37
|
+
python -m pip install --upgrade pip maturin
|
|
38
|
+
if [ "$RUNNER_OS" = "macOS" ]; then
|
|
39
|
+
maturin build --release --out dist --target universal2-apple-darwin -i python
|
|
40
|
+
else
|
|
41
|
+
maturin build --release --out dist -i python
|
|
42
|
+
fi
|
|
43
|
+
- uses: actions/upload-artifact@v4
|
|
44
|
+
with:
|
|
45
|
+
name: dist-${{ matrix.os }}-py${{ matrix.python }}
|
|
46
|
+
path: dist/*
|
|
47
|
+
|
|
48
|
+
sdist:
|
|
49
|
+
runs-on: ubuntu-latest
|
|
50
|
+
steps:
|
|
51
|
+
- uses: actions/checkout@v4
|
|
52
|
+
- uses: actions/setup-python@v5
|
|
53
|
+
with:
|
|
54
|
+
python-version: "3.12"
|
|
55
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
56
|
+
- run: |
|
|
57
|
+
python -m pip install --upgrade pip maturin
|
|
58
|
+
maturin sdist --out dist
|
|
59
|
+
- uses: actions/upload-artifact@v4
|
|
60
|
+
with:
|
|
61
|
+
name: dist-sdist
|
|
62
|
+
path: dist/*.tar.gz
|
|
63
|
+
|
|
64
|
+
publish:
|
|
65
|
+
name: publish to PyPI (trusted publishing)
|
|
66
|
+
needs: [build, sdist]
|
|
67
|
+
runs-on: ubuntu-latest
|
|
68
|
+
environment: pypi
|
|
69
|
+
permissions:
|
|
70
|
+
id-token: write # OIDC token for trusted publishing
|
|
71
|
+
steps:
|
|
72
|
+
- uses: actions/download-artifact@v4
|
|
73
|
+
with:
|
|
74
|
+
path: dist
|
|
75
|
+
merge-multiple: true
|
|
76
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
77
|
+
with:
|
|
78
|
+
packages-dir: dist
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
name: wheels
|
|
2
|
+
|
|
3
|
+
# Build-only release artifacts (plan A.5 / M0): per-interpreter wheels via maturin on every
|
|
4
|
+
# OS x arch target, including a DEDICATED free-threaded 3.14t wheel, plus the sdist. macOS builds
|
|
5
|
+
# universal2 (x86_64 + arm64 in one wheel). Each wheel carries the compiled core AND all pure-Python
|
|
6
|
+
# subpackages (one distribution). No PyPI upload here — see release.yml.
|
|
7
|
+
|
|
8
|
+
on:
|
|
9
|
+
push:
|
|
10
|
+
branches: [main]
|
|
11
|
+
pull_request:
|
|
12
|
+
workflow_dispatch:
|
|
13
|
+
|
|
14
|
+
concurrency:
|
|
15
|
+
group: wheels-${{ github.ref }}
|
|
16
|
+
cancel-in-progress: true
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
build:
|
|
20
|
+
name: wheel ${{ matrix.os }} py${{ matrix.python }}
|
|
21
|
+
runs-on: ${{ matrix.os }}
|
|
22
|
+
strategy:
|
|
23
|
+
fail-fast: false
|
|
24
|
+
matrix:
|
|
25
|
+
os: [ubuntu-latest, ubuntu-24.04-arm, macos-latest, windows-latest]
|
|
26
|
+
python: ["3.11", "3.12", "3.13", "3.14", "3.14t"]
|
|
27
|
+
steps:
|
|
28
|
+
- uses: actions/checkout@v4
|
|
29
|
+
- uses: actions/setup-python@v5
|
|
30
|
+
with:
|
|
31
|
+
python-version: ${{ matrix.python }}
|
|
32
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
33
|
+
- name: Add macOS universal2 targets
|
|
34
|
+
if: runner.os == 'macOS'
|
|
35
|
+
run: rustup target add x86_64-apple-darwin aarch64-apple-darwin
|
|
36
|
+
- name: Build wheel (universal2 on macOS)
|
|
37
|
+
shell: bash
|
|
38
|
+
run: |
|
|
39
|
+
python -m pip install --upgrade pip maturin
|
|
40
|
+
if [ "$RUNNER_OS" = "macOS" ]; then
|
|
41
|
+
maturin build --release --out dist --target universal2-apple-darwin -i python
|
|
42
|
+
else
|
|
43
|
+
maturin build --release --out dist -i python
|
|
44
|
+
fi
|
|
45
|
+
- name: Smoke-test the wheel (base install stays light)
|
|
46
|
+
shell: bash
|
|
47
|
+
run: |
|
|
48
|
+
python -m pip install dist/*.whl
|
|
49
|
+
python -c "import graphed, graphed.core; print('graphed', graphed.__version__, '/ core', graphed.core.version())"
|
|
50
|
+
- uses: actions/upload-artifact@v4
|
|
51
|
+
with:
|
|
52
|
+
name: wheel-${{ matrix.os }}-py${{ matrix.python }}
|
|
53
|
+
path: dist/*.whl
|
|
54
|
+
|
|
55
|
+
sdist:
|
|
56
|
+
name: sdist
|
|
57
|
+
runs-on: ubuntu-latest
|
|
58
|
+
steps:
|
|
59
|
+
- uses: actions/checkout@v4
|
|
60
|
+
- uses: actions/setup-python@v5
|
|
61
|
+
with:
|
|
62
|
+
python-version: "3.12"
|
|
63
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
64
|
+
- run: |
|
|
65
|
+
python -m pip install --upgrade pip maturin
|
|
66
|
+
maturin sdist --out dist
|
|
67
|
+
- uses: actions/upload-artifact@v4
|
|
68
|
+
with:
|
|
69
|
+
name: sdist
|
|
70
|
+
path: dist/*.tar.gz
|
graphed-0.0.1/.gitignore
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Rust (Cargo.lock IS committed for reproducible wheel builds)
|
|
2
|
+
/target/
|
|
3
|
+
**/*.rs.bk
|
|
4
|
+
|
|
5
|
+
# Python
|
|
6
|
+
__pycache__/
|
|
7
|
+
*.py[cod]
|
|
8
|
+
.venv/
|
|
9
|
+
venv/
|
|
10
|
+
*.egg-info/
|
|
11
|
+
.pytest_cache/
|
|
12
|
+
.mypy_cache/
|
|
13
|
+
.ruff_cache/
|
|
14
|
+
.coverage
|
|
15
|
+
.coverage.*
|
|
16
|
+
htmlcov/
|
|
17
|
+
coverage.xml
|
|
18
|
+
dist/
|
|
19
|
+
build/
|
|
20
|
+
_build/
|
|
21
|
+
docs/generated/
|
|
22
|
+
*.so
|
|
23
|
+
|
|
24
|
+
# Tools
|
|
25
|
+
.serena/
|
|
26
|
+
.DS_Store
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Lint + type-check hooks for the Python surface, run by prek (https://github.com/j178/prek).
|
|
2
|
+
#
|
|
3
|
+
# These commands live here ONCE and are consumed by every gate: CI (`uvx prek run
|
|
4
|
+
# --all-files`), the graphed-orchestrator pre-commit gate, and a developer's local
|
|
5
|
+
# `prek install`. No more hand-rolled `ruff`/`mypy` shell chains duplicated per workflow.
|
|
6
|
+
#
|
|
7
|
+
# ruff and mypy are `system` hooks on purpose: they use the versions already installed in
|
|
8
|
+
# the project's env (the `dev` extra, intentionally unpinned), so there is a single source
|
|
9
|
+
# of truth for tool versions rather than a second set pinned here that could drift.
|
|
10
|
+
#
|
|
11
|
+
# cargo fmt + clippy are hooks too (below); the dedicated `rust` CI job invokes them through prek,
|
|
12
|
+
# so the Rust lint commands live here once as well. cargo test / loom / llvm-cov stay as their own
|
|
13
|
+
# steps — those are tests/coverage, not lint. The matrix `test` job runs only the Python hook ids
|
|
14
|
+
# (its toolchain has no clippy/rustfmt components), and the `rust` job runs only the cargo hook ids.
|
|
15
|
+
repos:
|
|
16
|
+
- repo: local
|
|
17
|
+
hooks:
|
|
18
|
+
- id: ruff-check
|
|
19
|
+
name: ruff check
|
|
20
|
+
entry: ruff check --force-exclude
|
|
21
|
+
language: system
|
|
22
|
+
types_or: [python, pyi]
|
|
23
|
+
require_serial: true
|
|
24
|
+
- id: ruff-format
|
|
25
|
+
name: ruff format
|
|
26
|
+
entry: ruff format --check --force-exclude
|
|
27
|
+
language: system
|
|
28
|
+
types_or: [python, pyi]
|
|
29
|
+
require_serial: true
|
|
30
|
+
- id: mypy
|
|
31
|
+
name: mypy (strict)
|
|
32
|
+
entry: mypy
|
|
33
|
+
language: system
|
|
34
|
+
pass_filenames: false
|
|
35
|
+
always_run: true
|
|
36
|
+
- id: cargo-fmt
|
|
37
|
+
name: cargo fmt
|
|
38
|
+
entry: cargo fmt --check
|
|
39
|
+
language: system
|
|
40
|
+
types: [rust]
|
|
41
|
+
pass_filenames: false
|
|
42
|
+
- id: cargo-clippy
|
|
43
|
+
name: cargo clippy (deny warnings)
|
|
44
|
+
entry: cargo clippy --all-targets -- -D warnings
|
|
45
|
+
language: system
|
|
46
|
+
types: [rust]
|
|
47
|
+
pass_filenames: false
|
graphed-0.0.1/CLAUDE.md
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# CLAUDE.md — graphed (consolidated package)
|
|
2
|
+
|
|
3
|
+
Defers to the root **`graphed-project/CLAUDE.md`**; the **project plan
|
|
4
|
+
(`graphed-project-plan-gated.md`) always wins.** This repository consolidates the eight
|
|
5
|
+
`graphed-*-mvp` prototype packages into one pip-installable distribution, `graphed`.
|
|
6
|
+
|
|
7
|
+
## What this repo is
|
|
8
|
+
|
|
9
|
+
One package, `graphed`, with the former repos as subpackages:
|
|
10
|
+
|
|
11
|
+
| Import | Was | Guardrail (§A.4) |
|
|
12
|
+
|-------------------|----------------------|--------------------------------------------------------|
|
|
13
|
+
| `graphed` | `graphed` frontend | backend-agnostic; no numpy/awkward in core types |
|
|
14
|
+
| `graphed.core` | `graphed-core` | Rust+PyO3 IR/optimizer/plan; **MUST NOT import awkward**|
|
|
15
|
+
| `graphed.awkward` | `graphed-awkward` | awkward typetracer backend |
|
|
16
|
+
| `graphed.numpy` | `graphed-numpy` | trivial numpy backend |
|
|
17
|
+
| `graphed.debug` | `graphed-debug` | source-mapped tracebacks, lowering, dashboard |
|
|
18
|
+
| `graphed.checkpoint` | `graphed-checkpoint` | content-addressed store / resume |
|
|
19
|
+
| `graphed.preserve`| `graphed-preserve` | preservation bundle; invents no formats |
|
|
20
|
+
|
|
21
|
+
This is a **packaging/presentation** consolidation — **no new functionality** over the prototypes.
|
|
22
|
+
|
|
23
|
+
## Hard rules (unchanged from the plan)
|
|
24
|
+
|
|
25
|
+
- `graphed.core` **MUST NOT import awkward**; the base `import graphed` / `import graphed.core` stays
|
|
26
|
+
free of numpy/awkward (verified: a base install pulls only the compiled core + `executing`).
|
|
27
|
+
- Reproducibility: the serializable IR — not cloudpickle — is the canonical durable representation.
|
|
28
|
+
cloudpickle is only for genuinely opaque user callables (flagged `opaque=True`).
|
|
29
|
+
- Standards, not invented formats: correctionlib JSON, ONNX, UHI, HS3, content-addressed payloads.
|
|
30
|
+
- `tests/frozen/**` is read-only (freeze/integrity rules §A.7/§B.6). The one-time consolidation
|
|
31
|
+
rewrote frozen imports mechanically (`graphed_core` → `graphed.core`, …) without weakening any
|
|
32
|
+
assertion; that baseline is now the freeze. Do not route around a frozen test — file a dispute.
|
|
33
|
+
|
|
34
|
+
## Build & test
|
|
35
|
+
|
|
36
|
+
maturin mixed layout: Rust at `src/*.rs` + `Cargo.toml` (root), Python at `python/graphed/`,
|
|
37
|
+
`module-name = "graphed.core.graphed_core"`. Tests run **per-subtree** (`./scripts/run-tests.sh`) —
|
|
38
|
+
see `CONTRIBUTING.md` for why a single `pytest tests/` cannot collect this tree.
|
|
39
|
+
|
|
40
|
+
## Separate repos (not consolidated)
|
|
41
|
+
|
|
42
|
+
`graphed-histogram`, `graphed-exec-local` (executor), and `graphed-orchestrator` stay their own
|
|
43
|
+
packages; the first two depend on this consolidated `graphed`.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Contributing to `graphed`
|
|
2
|
+
|
|
3
|
+
## Layout
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
Cargo.toml, Cargo.lock, src/*.rs the Rust core crate (graphed.core.graphed_core)
|
|
7
|
+
python/graphed/ the Python package
|
|
8
|
+
__init__.py, *.py frontend (Session, Array, Backend, provenance)
|
|
9
|
+
core/ awkward/ numpy/ debug/ checkpoint/ preserve/ the subpackages
|
|
10
|
+
tests/frozen/<pkg>/mX/ the frozen acceptance suites, per package + milestone
|
|
11
|
+
tests/extra/<pkg>/ implementer-added (non-frozen) tests
|
|
12
|
+
tests/_corpus/ vendored M0.5 fixtures (graphed_corpus) + reference data
|
|
13
|
+
docs/ one Sphinx project (per-package design pages under docs/<pkg>/)
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
The build backend is **maturin** (mixed Rust/Python): the compiled extension is nested at
|
|
17
|
+
`graphed.core.graphed_core` and re-exported by `graphed.core`. `python-source = "python"` ships the
|
|
18
|
+
whole `graphed/` tree.
|
|
19
|
+
|
|
20
|
+
## Setup
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
pip install -e ".[dev]" # builds the Rust extension and installs the full toolchain
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Running tests
|
|
27
|
+
|
|
28
|
+
Run **one subtree at a time** — a single `pytest tests/` will not collect (duplicate test basenames
|
|
29
|
+
across packages) and would break frozen guards that assert process-global state:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
./scripts/run-tests.sh # every package's suite, isolated
|
|
33
|
+
COV=1 ./scripts/run-tests.sh # + combined branch coverage, gate >=90
|
|
34
|
+
pytest tests/frozen/awkward # a single package
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Gates (run before pushing)
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
uvx prek run --all-files # ruff check + ruff format --check + mypy + cargo fmt + clippy
|
|
41
|
+
./scripts/run-tests.sh # Python suites
|
|
42
|
+
cargo test # Rust unit tests (set DYLD_FALLBACK_LIBRARY_PATH / LD_LIBRARY_PATH to python's libdir)
|
|
43
|
+
RUSTFLAGS="--cfg loom" cargo test --lib loom_model
|
|
44
|
+
sphinx-build -W -b html docs docs/_build/html
|
|
45
|
+
python -m graphed_orchestrator.precommit . # the project integrity/gate wrapper (see note)
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
- `mypy --strict` runs on `python/` (`files = ["python"]`); ruff/format cover `python` and `tests`.
|
|
49
|
+
- The Rust `cargo test` binary links libpython — export `DYLD_FALLBACK_LIBRARY_PATH` (macOS) or
|
|
50
|
+
`LD_LIBRARY_PATH` (Linux) to `python -c 'import sysconfig; print(sysconfig.get_config_var("LIBDIR"))'`.
|
|
51
|
+
- **Integrity / freeze rule:** `tests/frozen/**` is read-only. Do not edit, skip, xfail, weaken, or
|
|
52
|
+
stub what a frozen test verifies. If a frozen test seems wrong, file a dispute — do not route
|
|
53
|
+
around it.
|
|
54
|
+
- **Coverage gate note:** because the suite runs per-subtree, coverage is accumulated with
|
|
55
|
+
`--cov-append` across subtrees and gated once (`coverage report --fail-under=90`). The
|
|
56
|
+
`graphed_orchestrator.precommit` coverage sub-check expects a single whole-repo `pytest --cov`
|
|
57
|
+
line; here `COV=1 ./scripts/run-tests.sh` is the enforcing command (CI runs it directly).
|