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.
Files changed (365) hide show
  1. graphed-0.0.1/.github/workflows/ci.yml +223 -0
  2. graphed-0.0.1/.github/workflows/release.yml +78 -0
  3. graphed-0.0.1/.github/workflows/wheels.yml +70 -0
  4. graphed-0.0.1/.gitignore +26 -0
  5. graphed-0.0.1/.pre-commit-config.yaml +47 -0
  6. graphed-0.0.1/CLAUDE.md +43 -0
  7. graphed-0.0.1/CONTRIBUTING.md +57 -0
  8. graphed-0.0.1/Cargo.lock +520 -0
  9. graphed-0.0.1/Cargo.toml +32 -0
  10. graphed-0.0.1/MIGRATION.md +36 -0
  11. graphed-0.0.1/PKG-INFO +141 -0
  12. graphed-0.0.1/README.md +59 -0
  13. graphed-0.0.1/docs/_templates/autosummary/module.rst +45 -0
  14. graphed-0.0.1/docs/api.rst +18 -0
  15. graphed-0.0.1/docs/awkward/design.rst +163 -0
  16. graphed-0.0.1/docs/awkward/improvements.rst +20 -0
  17. graphed-0.0.1/docs/awkward/index.rst +25 -0
  18. graphed-0.0.1/docs/checkpoint/design.rst +127 -0
  19. graphed-0.0.1/docs/checkpoint/improvements.rst +40 -0
  20. graphed-0.0.1/docs/checkpoint/index.rst +31 -0
  21. graphed-0.0.1/docs/conf.py +68 -0
  22. graphed-0.0.1/docs/core/design.rst +396 -0
  23. graphed-0.0.1/docs/core/improvements.rst +33 -0
  24. graphed-0.0.1/docs/core/index.rst +29 -0
  25. graphed-0.0.1/docs/corpus/design.rst +97 -0
  26. graphed-0.0.1/docs/corpus/graph_bloat_note.md +52 -0
  27. graphed-0.0.1/docs/corpus/improvements.rst +25 -0
  28. graphed-0.0.1/docs/corpus/index.rst +24 -0
  29. graphed-0.0.1/docs/corpus/requirements/ops_catalog.md +76 -0
  30. graphed-0.0.1/docs/debug/design.rst +204 -0
  31. graphed-0.0.1/docs/debug/improvements.rst +24 -0
  32. graphed-0.0.1/docs/debug/index.rst +22 -0
  33. graphed-0.0.1/docs/frontend/design.rst +198 -0
  34. graphed-0.0.1/docs/frontend/improvements.rst +21 -0
  35. graphed-0.0.1/docs/frontend/index.rst +25 -0
  36. graphed-0.0.1/docs/index.rst +37 -0
  37. graphed-0.0.1/docs/numpy/design.rst +138 -0
  38. graphed-0.0.1/docs/numpy/improvements.rst +17 -0
  39. graphed-0.0.1/docs/numpy/index.rst +24 -0
  40. graphed-0.0.1/docs/preserve/design.rst +187 -0
  41. graphed-0.0.1/docs/preserve/improvements.rst +92 -0
  42. graphed-0.0.1/docs/preserve/index.rst +34 -0
  43. graphed-0.0.1/pyproject.toml +122 -0
  44. graphed-0.0.1/python/graphed/__init__.py +57 -0
  45. graphed-0.0.1/python/graphed/aggregate.py +108 -0
  46. graphed-0.0.1/python/graphed/array.py +410 -0
  47. graphed-0.0.1/python/graphed/awkward/__init__.py +33 -0
  48. graphed-0.0.1/python/graphed/awkward/_ops.py +391 -0
  49. graphed-0.0.1/python/graphed/awkward/backend.py +132 -0
  50. graphed-0.0.1/python/graphed/awkward/functions.py +715 -0
  51. graphed-0.0.1/python/graphed/awkward/io.py +278 -0
  52. graphed-0.0.1/python/graphed/awkward/payloads.py +156 -0
  53. graphed-0.0.1/python/graphed/awkward/projection.py +149 -0
  54. graphed-0.0.1/python/graphed/awkward/shuffle.py +75 -0
  55. graphed-0.0.1/python/graphed/backend.py +52 -0
  56. graphed-0.0.1/python/graphed/checkpoint/__init__.py +38 -0
  57. graphed-0.0.1/python/graphed/checkpoint/codec.py +48 -0
  58. graphed-0.0.1/python/graphed/checkpoint/errors.py +41 -0
  59. graphed-0.0.1/python/graphed/checkpoint/py.typed +0 -0
  60. graphed-0.0.1/python/graphed/checkpoint/retry.py +164 -0
  61. graphed-0.0.1/python/graphed/checkpoint/runner.py +230 -0
  62. graphed-0.0.1/python/graphed/checkpoint/store.py +159 -0
  63. graphed-0.0.1/python/graphed/core/__init__.py +70 -0
  64. graphed-0.0.1/python/graphed/core/__init__.pyi +102 -0
  65. graphed-0.0.1/python/graphed/core/execution.py +395 -0
  66. graphed-0.0.1/python/graphed/core/graphed_core.pyi +85 -0
  67. graphed-0.0.1/python/graphed/core/plan.py +388 -0
  68. graphed-0.0.1/python/graphed/core/py.typed +0 -0
  69. graphed-0.0.1/python/graphed/debug/__init__.py +31 -0
  70. graphed-0.0.1/python/graphed/debug/_sampler.py +157 -0
  71. graphed-0.0.1/python/graphed/debug/dashboard/__init__.py +19 -0
  72. graphed-0.0.1/python/graphed/debug/dashboard/_client.py +105 -0
  73. graphed-0.0.1/python/graphed/debug/dashboard/_dashboard.py +85 -0
  74. graphed-0.0.1/python/graphed/debug/dashboard/_server.py +281 -0
  75. graphed-0.0.1/python/graphed/debug/dashboard/_wire.py +62 -0
  76. graphed-0.0.1/python/graphed/debug/dashboard/static/index.html +220 -0
  77. graphed-0.0.1/python/graphed/debug/dashboard/static/vendor/README.md +40 -0
  78. graphed-0.0.1/python/graphed/debug/dashboard/static/vendor/d3-flamegraph.css +46 -0
  79. graphed-0.0.1/python/graphed/debug/dashboard/static/vendor/d3-flamegraph.min.js +1 -0
  80. graphed-0.0.1/python/graphed/debug/dashboard/static/vendor/d3.min.js +2 -0
  81. graphed-0.0.1/python/graphed/debug/dashboard/static/vendor/perspective-dashboard.js +17 -0
  82. graphed-0.0.1/python/graphed/debug/dashboard/static/vendor/themes.css +1 -0
  83. graphed-0.0.1/python/graphed/debug/errors.py +81 -0
  84. graphed-0.0.1/python/graphed/debug/lowering.py +156 -0
  85. graphed-0.0.1/python/graphed/debug/runner.py +90 -0
  86. graphed-0.0.1/python/graphed/debug/tracebacks.py +31 -0
  87. graphed-0.0.1/python/graphed/debug/viz.py +66 -0
  88. graphed-0.0.1/python/graphed/errors.py +22 -0
  89. graphed-0.0.1/python/graphed/execute.py +126 -0
  90. graphed-0.0.1/python/graphed/numpy/__init__.py +520 -0
  91. graphed-0.0.1/python/graphed/numpy/array.py +566 -0
  92. graphed-0.0.1/python/graphed/numpy/creation.py +91 -0
  93. graphed-0.0.1/python/graphed/numpy/forms.py +56 -0
  94. graphed-0.0.1/python/graphed/numpy/gufunc.py +90 -0
  95. graphed-0.0.1/python/graphed/numpy/io.py +238 -0
  96. graphed-0.0.1/python/graphed/numpy/projection.py +77 -0
  97. graphed-0.0.1/python/graphed/numpy/random.py +53 -0
  98. graphed-0.0.1/python/graphed/numpy/reductions.py +179 -0
  99. graphed-0.0.1/python/graphed/numpy/shuffle.py +77 -0
  100. graphed-0.0.1/python/graphed/parquet.py +162 -0
  101. graphed-0.0.1/python/graphed/preserve/__init__.py +66 -0
  102. graphed-0.0.1/python/graphed/preserve/bundle.py +307 -0
  103. graphed-0.0.1/python/graphed/preserve/errors.py +17 -0
  104. graphed-0.0.1/python/graphed/preserve/externals/__init__.py +67 -0
  105. graphed-0.0.1/python/graphed/preserve/externals/_base.py +255 -0
  106. graphed-0.0.1/python/graphed/preserve/externals/_helpers.py +150 -0
  107. graphed-0.0.1/python/graphed/preserve/externals/correctionlib_external.py +78 -0
  108. graphed-0.0.1/python/graphed/preserve/externals/histogram_external.py +66 -0
  109. graphed-0.0.1/python/graphed/preserve/externals/jax_external.py +75 -0
  110. graphed-0.0.1/python/graphed/preserve/externals/onnx_external.py +84 -0
  111. graphed-0.0.1/python/graphed/preserve/externals/pytorch_external.py +88 -0
  112. graphed-0.0.1/python/graphed/preserve/externals/tensorflow_external.py +92 -0
  113. graphed-0.0.1/python/graphed/preserve/externals/triton_external.py +103 -0
  114. graphed-0.0.1/python/graphed/preserve/externals/xgboost_external.py +64 -0
  115. graphed-0.0.1/python/graphed/preserve/interpreter.py +48 -0
  116. graphed-0.0.1/python/graphed/preserve/manifest.py +27 -0
  117. graphed-0.0.1/python/graphed/preserve/py.typed +0 -0
  118. graphed-0.0.1/python/graphed/projection.py +147 -0
  119. graphed-0.0.1/python/graphed/provenance.py +79 -0
  120. graphed-0.0.1/python/graphed/py.typed +0 -0
  121. graphed-0.0.1/python/graphed/session.py +280 -0
  122. graphed-0.0.1/python/graphed/shuffle.py +138 -0
  123. graphed-0.0.1/python/graphed/write.py +97 -0
  124. graphed-0.0.1/scripts/run-tests.sh +48 -0
  125. graphed-0.0.1/src/lib.rs +541 -0
  126. graphed-0.0.1/src/node.rs +239 -0
  127. graphed-0.0.1/src/optimizer/engine.rs +143 -0
  128. graphed-0.0.1/src/optimizer/incremental.rs +211 -0
  129. graphed-0.0.1/src/optimizer/mod.rs +677 -0
  130. graphed-0.0.1/src/param.rs +177 -0
  131. graphed-0.0.1/src/serialize.rs +461 -0
  132. graphed-0.0.1/src/store.rs +477 -0
  133. graphed-0.0.1/tests/_corpus/graphed_corpus/__init__.py +28 -0
  134. graphed-0.0.1/tests/_corpus/graphed_corpus/analyses/__init__.py +8 -0
  135. graphed-0.0.1/tests/_corpus/graphed_corpus/analyses/adl.py +154 -0
  136. graphed-0.0.1/tests/_corpus/graphed_corpus/analyses/systematics.py +112 -0
  137. graphed-0.0.1/tests/_corpus/graphed_corpus/dataset.py +67 -0
  138. graphed-0.0.1/tests/_corpus/graphed_corpus/histograms.py +56 -0
  139. graphed-0.0.1/tests/_corpus/references/adl_q1.json +55 -0
  140. graphed-0.0.1/tests/_corpus/references/adl_q2.json +55 -0
  141. graphed-0.0.1/tests/_corpus/references/adl_q3.json +55 -0
  142. graphed-0.0.1/tests/_corpus/references/adl_q4.json +55 -0
  143. graphed-0.0.1/tests/_corpus/references/adl_q5.json +55 -0
  144. graphed-0.0.1/tests/_corpus/references/adl_q6.json +55 -0
  145. graphed-0.0.1/tests/_corpus/references/adl_q7.json +55 -0
  146. graphed-0.0.1/tests/_corpus/references/adl_q8.json +55 -0
  147. graphed-0.0.1/tests/_corpus/references/ttbar_4j1b_btag_down.json +45 -0
  148. graphed-0.0.1/tests/_corpus/references/ttbar_4j1b_btag_up.json +45 -0
  149. graphed-0.0.1/tests/_corpus/references/ttbar_4j1b_jes_down.json +45 -0
  150. graphed-0.0.1/tests/_corpus/references/ttbar_4j1b_jes_up.json +45 -0
  151. graphed-0.0.1/tests/_corpus/references/ttbar_4j1b_nominal.json +45 -0
  152. graphed-0.0.1/tests/_corpus/references/ttbar_4j2b_btag_down.json +45 -0
  153. graphed-0.0.1/tests/_corpus/references/ttbar_4j2b_btag_up.json +45 -0
  154. graphed-0.0.1/tests/_corpus/references/ttbar_4j2b_jes_down.json +45 -0
  155. graphed-0.0.1/tests/_corpus/references/ttbar_4j2b_jes_up.json +45 -0
  156. graphed-0.0.1/tests/_corpus/references/ttbar_4j2b_nominal.json +45 -0
  157. graphed-0.0.1/tests/_corpus/references/ttgamma_jes_down.json +35 -0
  158. graphed-0.0.1/tests/_corpus/references/ttgamma_jes_up.json +35 -0
  159. graphed-0.0.1/tests/_corpus/references/ttgamma_nominal.json +35 -0
  160. graphed-0.0.1/tests/_corpus/references/ttgamma_pho_down.json +35 -0
  161. graphed-0.0.1/tests/_corpus/references/ttgamma_pho_up.json +35 -0
  162. graphed-0.0.1/tests/extra/checkpoint/m8/test_kill_after_guard.py +50 -0
  163. graphed-0.0.1/tests/extra/frontend/m13/test_not_iterable.py +31 -0
  164. graphed-0.0.1/tests/extra/numpy/m13/test_handler_argument_errors.py +124 -0
  165. graphed-0.0.1/tests/extra/numpy/m15/test_pandas_free.py +51 -0
  166. graphed-0.0.1/tests/frozen/awkward/m10/README.md +14 -0
  167. graphed-0.0.1/tests/frozen/awkward/m10/test_buffer_projection.py +117 -0
  168. graphed-0.0.1/tests/frozen/awkward/m11/test_functions_only_idiom.py +36 -0
  169. graphed-0.0.1/tests/frozen/awkward/m15/README.md +11 -0
  170. graphed-0.0.1/tests/frozen/awkward/m15/test_parquet_io.py +180 -0
  171. graphed-0.0.1/tests/frozen/awkward/m16/README.md +9 -0
  172. graphed-0.0.1/tests/frozen/awkward/m16/m16_helpers.py +33 -0
  173. graphed-0.0.1/tests/frozen/awkward/m16/test_reducers.py +71 -0
  174. graphed-0.0.1/tests/frozen/awkward/m16/test_structural_rule.py +71 -0
  175. graphed-0.0.1/tests/frozen/awkward/m16/test_ufunc_tier.py +115 -0
  176. graphed-0.0.1/tests/frozen/awkward/m17/README.md +9 -0
  177. graphed-0.0.1/tests/frozen/awkward/m17/test_structure_ops.py +127 -0
  178. graphed-0.0.1/tests/frozen/awkward/m18/README.md +10 -0
  179. graphed-0.0.1/tests/frozen/awkward/m18/test_behaviors.py +92 -0
  180. graphed-0.0.1/tests/frozen/awkward/m19/README.md +6 -0
  181. graphed-0.0.1/tests/frozen/awkward/m19/test_conveniences.py +48 -0
  182. graphed-0.0.1/tests/frozen/awkward/m21/README.md +12 -0
  183. graphed-0.0.1/tests/frozen/awkward/m21/test_partitioned_writer.py +124 -0
  184. graphed-0.0.1/tests/frozen/awkward/m24/README.md +13 -0
  185. graphed-0.0.1/tests/frozen/awkward/m24/test_interface_parity.py +243 -0
  186. graphed-0.0.1/tests/frozen/awkward/m28/test_preservable_externals.py +192 -0
  187. graphed-0.0.1/tests/frozen/awkward/m3/analyses.py +130 -0
  188. graphed-0.0.1/tests/frozen/awkward/m3/conftest.py +12 -0
  189. graphed-0.0.1/tests/frozen/awkward/m3/test_dispatch.py +74 -0
  190. graphed-0.0.1/tests/frozen/awkward/m3/test_eval.py +46 -0
  191. graphed-0.0.1/tests/frozen/awkward/m3/test_integration_adl.py +53 -0
  192. graphed-0.0.1/tests/frozen/awkward/m3/test_metadata_only.py +42 -0
  193. graphed-0.0.1/tests/frozen/awkward/m3/test_payloads.py +96 -0
  194. graphed-0.0.1/tests/frozen/awkward/m3/test_provenance.py +39 -0
  195. graphed-0.0.1/tests/frozen/awkward/m3/test_recording.py +49 -0
  196. graphed-0.0.1/tests/frozen/awkward/m39/README.md +24 -0
  197. graphed-0.0.1/tests/frozen/awkward/m39/golden_route.py +133 -0
  198. graphed-0.0.1/tests/frozen/awkward/m39/test_exchange_primitives.py +102 -0
  199. graphed-0.0.1/tests/frozen/awkward/m5/test_no_overtouch.py +87 -0
  200. graphed-0.0.1/tests/frozen/awkward/m5/test_projection.py +73 -0
  201. graphed-0.0.1/tests/frozen/awkward/m5/test_topologies.py +66 -0
  202. graphed-0.0.1/tests/frozen/awkward/m9/test_generic_external.py +52 -0
  203. graphed-0.0.1/tests/frozen/checkpoint/m39/README.md +34 -0
  204. graphed-0.0.1/tests/frozen/checkpoint/m39/shuffle_analyses.py +64 -0
  205. graphed-0.0.1/tests/frozen/checkpoint/m39/test_multistage_journal.py +60 -0
  206. graphed-0.0.1/tests/frozen/checkpoint/m39/test_shuffle_resume.py +70 -0
  207. graphed-0.0.1/tests/frozen/checkpoint/m8/README.md +28 -0
  208. graphed-0.0.1/tests/frozen/checkpoint/m8/analyses.py +183 -0
  209. graphed-0.0.1/tests/frozen/checkpoint/m8/deployment.py +163 -0
  210. graphed-0.0.1/tests/frozen/checkpoint/m8/test_codec.py +32 -0
  211. graphed-0.0.1/tests/frozen/checkpoint/m8/test_deployment.py +116 -0
  212. graphed-0.0.1/tests/frozen/checkpoint/m8/test_errors.py +104 -0
  213. graphed-0.0.1/tests/frozen/checkpoint/m8/test_no_source.py +97 -0
  214. graphed-0.0.1/tests/frozen/checkpoint/m8/test_realistic.py +34 -0
  215. graphed-0.0.1/tests/frozen/checkpoint/m8/test_resume.py +69 -0
  216. graphed-0.0.1/tests/frozen/checkpoint/m8/test_store.py +53 -0
  217. graphed-0.0.1/tests/frozen/core/m1/README.md +18 -0
  218. graphed-0.0.1/tests/frozen/core/m1/test_determinism_and_guardrails.py +66 -0
  219. graphed-0.0.1/tests/frozen/core/m1/test_external.py +61 -0
  220. graphed-0.0.1/tests/frozen/core/m1/test_interning.py +85 -0
  221. graphed-0.0.1/tests/frozen/core/m1/test_property.py +49 -0
  222. graphed-0.0.1/tests/frozen/core/m1/test_threadsafe.py +67 -0
  223. graphed-0.0.1/tests/frozen/core/m10/README.md +14 -0
  224. graphed-0.0.1/tests/frozen/core/m10/test_blind_partition.py +68 -0
  225. graphed-0.0.1/tests/frozen/core/m10/test_incremental_reducer.py +110 -0
  226. graphed-0.0.1/tests/frozen/core/m10/test_maximal_fusion.py +94 -0
  227. graphed-0.0.1/tests/frozen/core/m10/test_sound_rules.py +64 -0
  228. graphed-0.0.1/tests/frozen/core/m10/test_stage_members.py +121 -0
  229. graphed-0.0.1/tests/frozen/core/m22/README.md +9 -0
  230. graphed-0.0.1/tests/frozen/core/m22/test_output_scoped_reduction.py +114 -0
  231. graphed-0.0.1/tests/frozen/core/m32/test_sequential_runner.py +92 -0
  232. graphed-0.0.1/tests/frozen/core/m33/test_bounded_resources.py +80 -0
  233. graphed-0.0.1/tests/frozen/core/m37/test_monitor_seam.py +134 -0
  234. graphed-0.0.1/tests/frozen/core/m39/README.md +34 -0
  235. graphed-0.0.1/tests/frozen/core/m39/test_durable_plan_v2.py +125 -0
  236. graphed-0.0.1/tests/frozen/core/m39/test_exchange_ir.py +83 -0
  237. graphed-0.0.1/tests/frozen/core/m39/test_exchange_serialize.py +69 -0
  238. graphed-0.0.1/tests/frozen/core/m39/test_shuffle_backend_protocol.py +91 -0
  239. graphed-0.0.1/tests/frozen/core/m4/test_benchmark.py +53 -0
  240. graphed-0.0.1/tests/frozen/core/m4/test_reduce.py +118 -0
  241. graphed-0.0.1/tests/frozen/core/m4/test_systematics.py +53 -0
  242. graphed-0.0.1/tests/frozen/core/m4/test_topologies.py +132 -0
  243. graphed-0.0.1/tests/frozen/core/m7/test_execution_contract.py +61 -0
  244. graphed-0.0.1/tests/frozen/core/m8/README.md +25 -0
  245. graphed-0.0.1/tests/frozen/core/m8/test_deployment.py +119 -0
  246. graphed-0.0.1/tests/frozen/core/m8/test_durable_plan.py +198 -0
  247. graphed-0.0.1/tests/frozen/core/m8/test_ir_serialization.py +90 -0
  248. graphed-0.0.1/tests/frozen/core/m9/test_introspection.py +74 -0
  249. graphed-0.0.1/tests/frozen/corpus/m05/conftest.py +42 -0
  250. graphed-0.0.1/tests/frozen/corpus/m05/test_catalog.py +52 -0
  251. graphed-0.0.1/tests/frozen/corpus/m05/test_determinism.py +26 -0
  252. graphed-0.0.1/tests/frozen/corpus/m05/test_fixtures_reproduce.py +35 -0
  253. graphed-0.0.1/tests/frozen/corpus/m05/test_systematics.py +53 -0
  254. graphed-0.0.1/tests/frozen/debug/m37/test_dashboard.py +301 -0
  255. graphed-0.0.1/tests/frozen/debug/m37/test_dashboard_browser.py +93 -0
  256. graphed-0.0.1/tests/frozen/debug/m6/analyses.py +56 -0
  257. graphed-0.0.1/tests/frozen/debug/m6/test_awkward_mass.py +34 -0
  258. graphed-0.0.1/tests/frozen/debug/m6/test_lowering.py +58 -0
  259. graphed-0.0.1/tests/frozen/debug/m6/test_process_boundary.py +31 -0
  260. graphed-0.0.1/tests/frozen/debug/m6/test_runner.py +82 -0
  261. graphed-0.0.1/tests/frozen/debug/m6/test_stage_error.py +60 -0
  262. graphed-0.0.1/tests/frozen/debug/m6/test_topologies.py +77 -0
  263. graphed-0.0.1/tests/frozen/debug/m6/test_traceback.py +71 -0
  264. graphed-0.0.1/tests/frozen/debug/m6/test_visualize.py +53 -0
  265. graphed-0.0.1/tests/frozen/frontend/m10/README.md +12 -0
  266. graphed-0.0.1/tests/frozen/frontend/m10/m10_toy.py +94 -0
  267. graphed-0.0.1/tests/frozen/frontend/m10/test_compiled_execution.py +136 -0
  268. graphed-0.0.1/tests/frozen/frontend/m10/test_incremental_session.py +65 -0
  269. graphed-0.0.1/tests/frozen/frontend/m11/README.md +18 -0
  270. graphed-0.0.1/tests/frozen/frontend/m11/m11_toy.py +81 -0
  271. graphed-0.0.1/tests/frozen/frontend/m11/test_array_factory.py +69 -0
  272. graphed-0.0.1/tests/frozen/frontend/m11/test_ufunc_surface.py +137 -0
  273. graphed-0.0.1/tests/frozen/frontend/m12/README.md +15 -0
  274. graphed-0.0.1/tests/frozen/frontend/m12/m12_toy.py +91 -0
  275. graphed-0.0.1/tests/frozen/frontend/m12/test_reduction_surface.py +107 -0
  276. graphed-0.0.1/tests/frozen/frontend/m13/README.md +11 -0
  277. graphed-0.0.1/tests/frozen/frontend/m13/m13_toy.py +91 -0
  278. graphed-0.0.1/tests/frozen/frontend/m13/test_getitem_surface.py +71 -0
  279. graphed-0.0.1/tests/frozen/frontend/m14/README.md +10 -0
  280. graphed-0.0.1/tests/frozen/frontend/m14/m14_toy.py +54 -0
  281. graphed-0.0.1/tests/frozen/frontend/m14/test_apply.py +65 -0
  282. graphed-0.0.1/tests/frozen/frontend/m15/README.md +11 -0
  283. graphed-0.0.1/tests/frozen/frontend/m15/m15_toy.py +55 -0
  284. graphed-0.0.1/tests/frozen/frontend/m15/test_parquet_base.py +171 -0
  285. graphed-0.0.1/tests/frozen/frontend/m17/README.md +6 -0
  286. graphed-0.0.1/tests/frozen/frontend/m17/m17_toy.py +91 -0
  287. graphed-0.0.1/tests/frozen/frontend/m17/test_fields_subset.py +41 -0
  288. graphed-0.0.1/tests/frozen/frontend/m2/backends.py +99 -0
  289. graphed-0.0.1/tests/frozen/frontend/m2/test_backend_independence.py +34 -0
  290. graphed-0.0.1/tests/frozen/frontend/m2/test_external.py +32 -0
  291. graphed-0.0.1/tests/frozen/frontend/m2/test_provenance_errors.py +48 -0
  292. graphed-0.0.1/tests/frozen/frontend/m2/test_recording.py +46 -0
  293. graphed-0.0.1/tests/frozen/frontend/m20/README.md +9 -0
  294. graphed-0.0.1/tests/frozen/frontend/m20/test_write_base.py +93 -0
  295. graphed-0.0.1/tests/frozen/frontend/m22/README.md +9 -0
  296. graphed-0.0.1/tests/frozen/frontend/m22/test_output_scoped_compiles.py +79 -0
  297. graphed-0.0.1/tests/frozen/frontend/m23/README.md +7 -0
  298. graphed-0.0.1/tests/frozen/frontend/m23/test_external_overrides.py +120 -0
  299. graphed-0.0.1/tests/frozen/frontend/m3/test_array_surface.py +83 -0
  300. graphed-0.0.1/tests/frozen/frontend/m3/test_provenance.py +61 -0
  301. graphed-0.0.1/tests/frozen/frontend/m3/test_topologies.py +100 -0
  302. graphed-0.0.1/tests/frozen/frontend/m3/toy.py +40 -0
  303. graphed-0.0.1/tests/frozen/frontend/m35/test_deep_graph_walk.py +34 -0
  304. graphed-0.0.1/tests/frozen/frontend/m39/README.md +31 -0
  305. graphed-0.0.1/tests/frozen/frontend/m39/shuffle_backends.py +98 -0
  306. graphed-0.0.1/tests/frozen/frontend/m39/test_repartition_api.py +68 -0
  307. graphed-0.0.1/tests/frozen/frontend/m39/test_shuffle_plan_builder.py +64 -0
  308. graphed-0.0.1/tests/frozen/frontend/m5/test_aggregate_plan.py +108 -0
  309. graphed-0.0.1/tests/frozen/frontend/m5/test_projection_support.py +118 -0
  310. graphed-0.0.1/tests/frozen/frontend/m5/test_read_columns_projection.py +71 -0
  311. graphed-0.0.1/tests/frozen/frontend/m8/test_serialized_ir.py +69 -0
  312. graphed-0.0.1/tests/frozen/frontend/m9/test_sourcemap.py +21 -0
  313. graphed-0.0.1/tests/frozen/numpy/m11/README.md +14 -0
  314. graphed-0.0.1/tests/frozen/numpy/m11/test_elementwise_full.py +157 -0
  315. graphed-0.0.1/tests/frozen/numpy/m11/test_form_inference.py +83 -0
  316. graphed-0.0.1/tests/frozen/numpy/m11/test_numpy_array_idiom.py +31 -0
  317. graphed-0.0.1/tests/frozen/numpy/m11/test_projection_and_determinism.py +56 -0
  318. graphed-0.0.1/tests/frozen/numpy/m12/README.md +13 -0
  319. graphed-0.0.1/tests/frozen/numpy/m12/test_creation.py +74 -0
  320. graphed-0.0.1/tests/frozen/numpy/m12/test_random_and_monoids.py +119 -0
  321. graphed-0.0.1/tests/frozen/numpy/m12/test_reductions_match_numpy.py +98 -0
  322. graphed-0.0.1/tests/frozen/numpy/m13/README.md +13 -0
  323. graphed-0.0.1/tests/frozen/numpy/m13/m13_helpers.py +13 -0
  324. graphed-0.0.1/tests/frozen/numpy/m13/test_combination_and_aggregates.py +128 -0
  325. graphed-0.0.1/tests/frozen/numpy/m13/test_indexing.py +87 -0
  326. graphed-0.0.1/tests/frozen/numpy/m13/test_manipulation.py +171 -0
  327. graphed-0.0.1/tests/frozen/numpy/m14/README.md +8 -0
  328. graphed-0.0.1/tests/frozen/numpy/m14/test_apply_gufunc.py +124 -0
  329. graphed-0.0.1/tests/frozen/numpy/m15/README.md +12 -0
  330. graphed-0.0.1/tests/frozen/numpy/m15/test_parquet_io.py +178 -0
  331. graphed-0.0.1/tests/frozen/numpy/m2/test_backend_methods.py +55 -0
  332. graphed-0.0.1/tests/frozen/numpy/m2/test_external_payload.py +41 -0
  333. graphed-0.0.1/tests/frozen/numpy/m2/test_numpy_program.py +62 -0
  334. graphed-0.0.1/tests/frozen/numpy/m39/README.md +23 -0
  335. graphed-0.0.1/tests/frozen/numpy/m39/golden_route.py +133 -0
  336. graphed-0.0.1/tests/frozen/numpy/m39/test_exchange_primitives.py +89 -0
  337. graphed-0.0.1/tests/frozen/numpy/m5/test_no_overtouch.py +86 -0
  338. graphed-0.0.1/tests/frozen/numpy/m5/test_projection.py +88 -0
  339. graphed-0.0.1/tests/frozen/numpy/m5/test_topologies.py +62 -0
  340. graphed-0.0.1/tests/frozen/preserve/m25/test_histogram_preservation.py +94 -0
  341. graphed-0.0.1/tests/frozen/preserve/m26/conftest.py +9 -0
  342. graphed-0.0.1/tests/frozen/preserve/m26/fake_triton.py +79 -0
  343. graphed-0.0.1/tests/frozen/preserve/m26/test_ml_bundle_roundtrips.py +152 -0
  344. graphed-0.0.1/tests/frozen/preserve/m26/test_ml_plugin_frameworks.py +228 -0
  345. graphed-0.0.1/tests/frozen/preserve/m26/test_ml_plugin_registry.py +78 -0
  346. graphed-0.0.1/tests/frozen/preserve/m27/conftest.py +8 -0
  347. graphed-0.0.1/tests/frozen/preserve/m27/fake_triton_multi.py +76 -0
  348. graphed-0.0.1/tests/frozen/preserve/m27/test_variadic_call_templates.py +301 -0
  349. graphed-0.0.1/tests/frozen/preserve/m27/test_variadic_frameworks.py +193 -0
  350. graphed-0.0.1/tests/frozen/preserve/m30/test_producer_cross_seam.py +189 -0
  351. graphed-0.0.1/tests/frozen/preserve/m36/test_content_hash_memo.py +54 -0
  352. graphed-0.0.1/tests/frozen/preserve/m9/README.md +33 -0
  353. graphed-0.0.1/tests/frozen/preserve/m9/agc.py +191 -0
  354. graphed-0.0.1/tests/frozen/preserve/m9/conftest.py +25 -0
  355. graphed-0.0.1/tests/frozen/preserve/m9/test_build_errors.py +56 -0
  356. graphed-0.0.1/tests/frozen/preserve/m9/test_fingerprint.py +47 -0
  357. graphed-0.0.1/tests/frozen/preserve/m9/test_inspect.py +59 -0
  358. graphed-0.0.1/tests/frozen/preserve/m9/test_missing_payload.py +45 -0
  359. graphed-0.0.1/tests/frozen/preserve/m9/test_ml_plugins.py +337 -0
  360. graphed-0.0.1/tests/frozen/preserve/m9/test_no_originals.py +48 -0
  361. graphed-0.0.1/tests/frozen/preserve/m9/test_plugins.py +270 -0
  362. graphed-0.0.1/tests/frozen/preserve/m9/test_reproduce.py +60 -0
  363. graphed-0.0.1/tests/frozen/preserve/m9/test_triton_server.py +140 -0
  364. graphed-0.0.1/tests/samples/triton_models/scorer/1/model.py +23 -0
  365. 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
@@ -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
@@ -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).