ho22joshua commited on
Commit
64efda9
·
1 Parent(s): 0b48d9c

deps: enable DGL for Apple Silicon

Browse files
Files changed (5) hide show
  1. .github/workflows/ci.yml +2 -2
  2. README.md +6 -6
  3. docs/testing.md +3 -3
  4. pyproject.toml +3 -0
  5. uv.lock +77 -15
.github/workflows/ci.yml CHANGED
@@ -35,7 +35,7 @@ jobs:
35
  - run: uv run pytest
36
 
37
  test-macos:
38
- name: test (macOS core)
39
  runs-on: macos-14
40
  steps:
41
  - uses: actions/checkout@v4
@@ -43,7 +43,7 @@ jobs:
43
  with:
44
  version: "0.8.x"
45
  enable-cache: true
46
- - run: uv sync --dev
47
  - run: uv run pytest tests/unit tests/integration -m "not gpu"
48
 
49
  package:
 
35
  - run: uv run pytest
36
 
37
  test-macos:
38
+ name: test (macOS ROOT-GNN CPU)
39
  runs-on: macos-14
40
  steps:
41
  - uses: actions/checkout@v4
 
43
  with:
44
  version: "0.8.x"
45
  enable-cache: true
46
+ - run: uv sync --dev --extra root-gnn
47
  - run: uv run pytest tests/unit tests/integration -m "not gpu"
48
 
49
  package:
README.md CHANGED
@@ -23,8 +23,8 @@ The supported development environment is Python 3.12 (`>=3.12,<3.13`). Core
23
  development is supported on macOS and Linux:
24
 
25
  ```bash
26
- # macOS (Apple Silicon): core package development and CPU tests
27
- uv sync --dev
28
 
29
  # Linux x86_64 with an NVIDIA GPU: validated ROOT-GNN development
30
  uv sync --dev --extra root-gnn
@@ -32,10 +32,10 @@ uv sync --dev --extra root-gnn
32
 
33
  The core package can be installed without DGL when only shared data or task
34
  code is needed. ROOT-GNN models, graph construction, and ROOT-GNN parity tests
35
- require the `root-gnn` extra on Linux x86_64. That extra uses the validated
36
- CUDA 12.1 wheel sources configured in `pyproject.toml`; a compatible NVIDIA
37
- driver is still required. On macOS, use the core environment for shared code,
38
- configuration, linting, and tests that do not require DGL or CUDA. Do not add
39
  site-specific CUDA, Slurm, or filesystem paths to model or task configuration.
40
 
41
  ## Quick start
 
23
  development is supported on macOS and Linux:
24
 
25
  ```bash
26
+ # macOS (Apple Silicon): CPU ROOT-GNN development and tests
27
+ uv sync --dev --extra root-gnn
28
 
29
  # Linux x86_64 with an NVIDIA GPU: validated ROOT-GNN development
30
  uv sync --dev --extra root-gnn
 
32
 
33
  The core package can be installed without DGL when only shared data or task
34
  code is needed. ROOT-GNN models, graph construction, and ROOT-GNN parity tests
35
+ require the `root-gnn` extra. On Linux x86_64, it uses the validated CUDA 12.1
36
+ wheels configured in `pyproject.toml`; a compatible NVIDIA driver is still
37
+ required. On Apple Silicon macOS, it installs the CPU DGL wheel, supporting
38
+ local graph and model development but not CUDA training. Do not add
39
  site-specific CUDA, Slurm, or filesystem paths to model or task configuration.
40
 
41
  ## Quick start
docs/testing.md CHANGED
@@ -19,9 +19,9 @@ uv run pytest -m gpu -v
19
  GNN4COLLIDERS_ROOT_FIXTURE=/path/to/reduced.root uv run pytest -m real_data -v
20
  ```
21
 
22
- On macOS, use `uv sync --dev` and run the shared-package tests. ROOT-GNN,
23
- CUDA, and the required ROOT-GNN parity gate are validated on Linux x86_64 with
24
- the `root-gnn` extra installed.
25
 
26
  Unit tests use deterministic, small tensors and generated ROOT files. DGL,
27
  ONNX, CUDA, distributed execution, and reduced real-data fixtures remain
 
19
  GNN4COLLIDERS_ROOT_FIXTURE=/path/to/reduced.root uv run pytest -m real_data -v
20
  ```
21
 
22
+ On Apple Silicon macOS, `uv sync --dev --extra root-gnn` supports CPU
23
+ ROOT-GNN unit and integration testing. CUDA and the required ROOT-GNN parity
24
+ gate are validated on Linux x86_64 with the `root-gnn` extra installed.
25
 
26
  Unit tests use deterministic, small tensors and generated ROOT files. DGL,
27
  ONNX, CUDA, distributed execution, and reduced real-data fixtures remain
pyproject.toml CHANGED
@@ -20,6 +20,9 @@ dependencies = [
20
  [project.optional-dependencies]
21
  root-gnn = [
22
  "dgl==2.4.0+cu121; sys_platform == 'linux' and platform_machine == 'x86_64'",
 
 
 
23
  ]
24
  onnx = [
25
  "onnx>=1.16,<2",
 
20
  [project.optional-dependencies]
21
  root-gnn = [
22
  "dgl==2.4.0+cu121; sys_platform == 'linux' and platform_machine == 'x86_64'",
23
+ "dgl==2.2.0; sys_platform == 'darwin' and platform_machine == 'arm64'",
24
+ "pydantic>=2,<3; sys_platform == 'darwin' and platform_machine == 'arm64'",
25
+ "torchdata>=0.7,<0.8; sys_platform == 'darwin' and platform_machine == 'arm64'",
26
  ]
27
  onnx = [
28
  "onnx>=1.16,<2",
uv.lock CHANGED
@@ -3,7 +3,9 @@ revision = 2
3
  requires-python = "==3.12.*"
4
  resolution-markers = [
5
  "platform_machine == 'x86_64' and sys_platform == 'linux'",
6
- "platform_machine != 'x86_64' or sys_platform != 'linux'",
 
 
7
  ]
8
 
9
  [[package]]
@@ -70,7 +72,7 @@ name = "cffi"
70
  version = "2.1.1"
71
  source = { registry = "https://pypi.org/simple" }
72
  dependencies = [
73
- { name = "pycparser", marker = "implementation_name != 'PyPy'" },
74
  ]
75
  sdist = { url = "https://files.pythonhosted.org/packages/9e/ef/008a1939e372c06329a3fce4279c02f328488f3526744906eeec3da7ad5f/cffi-2.1.1.tar.gz", hash = "sha256:dd31f52ea1086513bb9df30f8fcee9b8918323ae067a3d5b78bc826a000712be", size = 530807, upload-time = "2026-08-03T21:21:18.939Z" }
76
  wheels = [
@@ -207,7 +209,7 @@ name = "cryptography"
207
  version = "50.0.0"
208
  source = { registry = "https://pypi.org/simple" }
209
  dependencies = [
210
- { name = "cffi", marker = "platform_python_implementation != 'PyPy'" },
211
  ]
212
  sdist = { url = "https://files.pythonhosted.org/packages/de/41/6cbdcf9142d00fe82836fbb51e503e58088575cf7a0fe1dbff6695bf0840/cryptography-50.0.0.tar.gz", hash = "sha256:eeac2acb5a20ed25e0ad6d1df9891a520b78b404266b6d11778f25d5d691a6c9", size = 880201, upload-time = "2026-07-31T14:25:10.11Z" }
213
  wheels = [
@@ -244,10 +246,34 @@ wheels = [
244
  { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" },
245
  ]
246
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
247
  [[package]]
248
  name = "dgl"
249
  version = "2.4.0+cu121"
250
  source = { registry = "https://data.dgl.ai/wheels/torch-2.2/cu121/repo.html" }
 
 
 
251
  dependencies = [
252
  { name = "networkx", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
253
  { name = "numpy", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
@@ -336,7 +362,10 @@ onnx = [
336
  { name = "onnxruntime" },
337
  ]
338
  root-gnn = [
339
- { name = "dgl", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
 
 
 
340
  ]
341
 
342
  [package.dev-dependencies]
@@ -353,14 +382,17 @@ dev = [
353
  [package.metadata]
354
  requires-dist = [
355
  { name = "awkward", specifier = ">=2.0" },
 
356
  { name = "dgl", marker = "platform_machine == 'x86_64' and sys_platform == 'linux' and extra == 'root-gnn'", specifier = "==2.4.0+cu121", index = "https://data.dgl.ai/wheels/torch-2.2/cu121/repo.html" },
357
  { name = "hydra-core", specifier = ">=1.3" },
358
  { name = "numpy", specifier = ">=1.24,<2" },
359
  { name = "onnx", marker = "extra == 'onnx'", specifier = ">=1.16,<2" },
360
  { name = "onnxruntime", marker = "extra == 'onnx'", specifier = ">=1.18,<2" },
 
361
  { name = "scikit-learn", specifier = ">=1.3" },
362
  { name = "torch", marker = "platform_machine != 'x86_64' or sys_platform != 'linux'", specifier = "==2.2.2" },
363
  { name = "torch", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'", specifier = "==2.2.2", index = "https://download.pytorch.org/whl/cu121" },
 
364
  { name = "uproot", specifier = ">=5.0" },
365
  ]
366
  provides-extras = ["root-gnn", "onnx"]
@@ -858,12 +890,16 @@ name = "pandas"
858
  version = "3.0.5"
859
  source = { registry = "https://pypi.org/simple" }
860
  dependencies = [
861
- { name = "numpy", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
862
- { name = "python-dateutil", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
863
  ]
864
  sdist = { url = "https://files.pythonhosted.org/packages/be/4f/5f3422a2afec5ffc46308b79e53291365a93748b498ac2e58bead0197916/pandas-3.0.5.tar.gz", hash = "sha256:dca3734d6ab7c906e6730f0788b0a1dbb9f2467731f9711f77995c8e9d62d712", size = 4658219, upload-time = "2026-07-22T22:19:28.819Z" }
865
  wheels = [
 
 
 
866
  { url = "https://files.pythonhosted.org/packages/12/98/e976540c1addf70442be7842a18cf70884a964abbf69442504f4d2939989/pandas-3.0.5-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d373ce03ffd84010ed9839fa73672a9c8256990532e158440c0085db7d914b34", size = 10998091, upload-time = "2026-07-22T22:18:15.209Z" },
 
867
  { url = "https://files.pythonhosted.org/packages/9d/e2/bd9c98ad2df7b38bde002adde4cdf353519da51881634323b126c55997f9/pandas-3.0.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a5ad3b02ed6bc7d7ae9b70804b2c6aa31827489d150f8e623ce82491b82085d7", size = 12060559, upload-time = "2026-07-22T22:18:20.147Z" },
868
  ]
869
 
@@ -914,7 +950,11 @@ version = "7.2.2"
914
  source = { registry = "https://pypi.org/simple" }
915
  sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" }
916
  wheels = [
 
 
917
  { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" },
 
 
918
  { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" },
919
  ]
920
 
@@ -932,10 +972,10 @@ name = "pydantic"
932
  version = "2.13.4"
933
  source = { registry = "https://pypi.org/simple" }
934
  dependencies = [
935
- { name = "annotated-types", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
936
- { name = "pydantic-core", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
937
- { name = "typing-extensions", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
938
- { name = "typing-inspection", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
939
  ]
940
  sdist = { url = "https://files.pythonhosted.org/packages/18/a5/b60d21ac674192f8ab0ba4e9fd860690f9b4a6e51ca5df118733b487d8d6/pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6", size = 844775, upload-time = "2026-05-06T13:43:05.343Z" }
941
  wheels = [
@@ -947,17 +987,24 @@ name = "pydantic-core"
947
  version = "2.46.4"
948
  source = { registry = "https://pypi.org/simple" }
949
  dependencies = [
950
- { name = "typing-extensions", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
951
  ]
952
  sdist = { url = "https://files.pythonhosted.org/packages/9d/56/921726b776ace8d8f5db44c4ef961006580d91dc52b803c489fafd1aa249/pydantic_core-2.46.4.tar.gz", hash = "sha256:62f875393d7f270851f20523dd2e29f082bcc82292d66db2b64ea71f64b6e1c1", size = 471464, upload-time = "2026-05-06T13:37:06.98Z" }
953
  wheels = [
 
 
 
954
  { url = "https://files.pythonhosted.org/packages/5b/11/9b9a5b0306345664a2da6410877af6e8082481b5884b3ddd78d47c6013ce/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a233125ac121aa3ffba9a2b59edfc4a985a76092dc8279586ab4b71390875e7", size = 2052418, upload-time = "2026-05-06T13:37:38.234Z" },
955
  { url = "https://files.pythonhosted.org/packages/f1/b7/a65fec226f5d78fc39f4a13c4cc0c768c22b113438f60c14adc9d2865038/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b712b53160b79a5850310b912a5ef8e57e56947c8ad690c227f5c9d7e561712", size = 2232274, upload-time = "2026-05-06T13:38:27.753Z" },
956
  { url = "https://files.pythonhosted.org/packages/68/f0/92039db98b907ef49269a8271f67db9cb78ae2fc68062ef7e4e77adb5f61/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9401557acd873c3a7f3eb9383edef8ac4968f9510e340f4808d427e75667e7b4", size = 2309940, upload-time = "2026-05-06T13:38:05.353Z" },
957
  { url = "https://files.pythonhosted.org/packages/5f/97/2aab507d3d00ca626e8e57c1eac6a79e4e5fbcc63eb99733ff55d1717f65/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:926c9541b14b12b1681dca8a0b75feb510b06c6341b70a8e500c2fdcff837cce", size = 2094516, upload-time = "2026-05-06T13:39:10.577Z" },
958
  { url = "https://files.pythonhosted.org/packages/22/37/a8aca44d40d737dde2bc05b3c6c07dff0de07ce6f82e9f3167aeaf4d5dea/pydantic_core-2.46.4-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:56cb4851bcaf3d117eddcef4fe66afd750a50274b0da8e22be256d10e5611987", size = 2136854, upload-time = "2026-05-06T13:40:22.59Z" },
 
959
  { url = "https://files.pythonhosted.org/packages/6b/65/d9cadc9f1920d7a127ad2edba16c1db7916e59719285cd6c94600b0080ba/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:8d0820e8192167f80d88d64038e609c31452eeca865b4e1d9950a27a4609b00b", size = 2329133, upload-time = "2026-05-06T13:39:57.365Z" },
960
  { url = "https://files.pythonhosted.org/packages/d0/cf/c873d91679f3a30bcf5e7ac280ce5573483e72295307685120d0d5ad3416/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fbdb89b3e1c94a30cc5edfce477c6e6a5dc4d8f84665b455c27582f211a1c72c", size = 2374464, upload-time = "2026-05-06T13:38:06.976Z" },
 
 
 
961
  { url = "https://files.pythonhosted.org/packages/fa/c3/7c8b240552251faf6b3a957db200fcfbbcec36763c050428b601e0c9b83b/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00c603d540afdd6b80eb39f078f33ebd46211f02f33e34a32d9f053bba711de0", size = 2147590, upload-time = "2026-05-06T13:39:29.883Z" },
962
  ]
963
 
@@ -1183,8 +1230,8 @@ name = "secretstorage"
1183
  version = "3.5.0"
1184
  source = { registry = "https://pypi.org/simple" }
1185
  dependencies = [
1186
- { name = "cryptography" },
1187
- { name = "jeepney" },
1188
  ]
1189
  sdist = { url = "https://files.pythonhosted.org/packages/1c/03/e834bcd866f2f8a49a85eaff47340affa3bfa391ee9912a952a1faa68c7b/secretstorage-3.5.0.tar.gz", hash = "sha256:f04b8e4689cbce351744d5537bf6b1329c6fc68f91fa666f60a380edddcd11be", size = 19884, upload-time = "2025-11-23T19:02:53.191Z" }
1190
  wheels = [
@@ -1226,7 +1273,9 @@ name = "torch"
1226
  version = "2.2.2"
1227
  source = { registry = "https://pypi.org/simple" }
1228
  resolution-markers = [
1229
- "platform_machine != 'x86_64' or sys_platform != 'linux'",
 
 
1230
  ]
1231
  dependencies = [
1232
  { name = "filelock", marker = "platform_machine != 'x86_64' or sys_platform != 'linux'" },
@@ -1274,6 +1323,19 @@ wheels = [
1274
  { url = "https://download-r2.pytorch.org/whl/cu121/torch-2.2.2%2Bcu121-cp312-cp312-linux_x86_64.whl", hash = "sha256:badc14d413ff1847d15021a1ec0affa479d24dfc83e6d51b9b4b9fbfaad1b14c", upload-time = "2024-04-24T17:07:56Z" },
1275
  ]
1276
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1277
  [[package]]
1278
  name = "tqdm"
1279
  version = "4.70.0"
@@ -1317,7 +1379,7 @@ name = "typing-inspection"
1317
  version = "0.4.4"
1318
  source = { registry = "https://pypi.org/simple" }
1319
  dependencies = [
1320
- { name = "typing-extensions", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
1321
  ]
1322
  sdist = { url = "https://files.pythonhosted.org/packages/a3/26/b09b8010994eccc3c09092e6b34058f36a460eea2d4c3e8b910c695975a0/typing_inspection-0.4.4.tar.gz", hash = "sha256:547274fa6b0a561ccf549cc9524b999a578e737d015d8709d021f9d0d13bea47", size = 76928, upload-time = "2026-08-12T12:37:25.997Z" }
1323
  wheels = [
 
3
  requires-python = "==3.12.*"
4
  resolution-markers = [
5
  "platform_machine == 'x86_64' and sys_platform == 'linux'",
6
+ "sys_platform == 'win32'",
7
+ "sys_platform == 'emscripten'",
8
+ "(platform_machine != 'x86_64' and sys_platform == 'linux') or (sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32')",
9
  ]
10
 
11
  [[package]]
 
72
  version = "2.1.1"
73
  source = { registry = "https://pypi.org/simple" }
74
  dependencies = [
75
+ { name = "pycparser", marker = "implementation_name != 'PyPy' and sys_platform != 'emscripten' and sys_platform != 'win32'" },
76
  ]
77
  sdist = { url = "https://files.pythonhosted.org/packages/9e/ef/008a1939e372c06329a3fce4279c02f328488f3526744906eeec3da7ad5f/cffi-2.1.1.tar.gz", hash = "sha256:dd31f52ea1086513bb9df30f8fcee9b8918323ae067a3d5b78bc826a000712be", size = 530807, upload-time = "2026-08-03T21:21:18.939Z" }
78
  wheels = [
 
209
  version = "50.0.0"
210
  source = { registry = "https://pypi.org/simple" }
211
  dependencies = [
212
+ { name = "cffi", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'emscripten' and sys_platform != 'win32'" },
213
  ]
214
  sdist = { url = "https://files.pythonhosted.org/packages/de/41/6cbdcf9142d00fe82836fbb51e503e58088575cf7a0fe1dbff6695bf0840/cryptography-50.0.0.tar.gz", hash = "sha256:eeac2acb5a20ed25e0ad6d1df9891a520b78b404266b6d11778f25d5d691a6c9", size = 880201, upload-time = "2026-07-31T14:25:10.11Z" }
215
  wheels = [
 
246
  { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" },
247
  ]
248
 
249
+ [[package]]
250
+ name = "dgl"
251
+ version = "2.2.0"
252
+ source = { registry = "https://pypi.org/simple" }
253
+ resolution-markers = [
254
+ "(platform_machine != 'x86_64' and sys_platform == 'linux') or (sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32')",
255
+ ]
256
+ dependencies = [
257
+ { name = "networkx", marker = "(platform_machine != 'x86_64' and sys_platform == 'linux') or (sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32')" },
258
+ { name = "numpy", marker = "(platform_machine != 'x86_64' and sys_platform == 'linux') or (sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32')" },
259
+ { name = "pandas", marker = "(platform_machine != 'x86_64' and sys_platform == 'linux') or (sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32')" },
260
+ { name = "psutil", marker = "(platform_machine != 'x86_64' and sys_platform == 'linux') or (sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32')" },
261
+ { name = "requests", marker = "(platform_machine != 'x86_64' and sys_platform == 'linux') or (sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32')" },
262
+ { name = "scipy", marker = "(platform_machine != 'x86_64' and sys_platform == 'linux') or (sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32')" },
263
+ { name = "torchdata", marker = "(platform_machine != 'x86_64' and sys_platform == 'linux') or (sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32')" },
264
+ { name = "tqdm", marker = "(platform_machine != 'x86_64' and sys_platform == 'linux') or (sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32')" },
265
+ ]
266
+ wheels = [
267
+ { url = "https://files.pythonhosted.org/packages/dc/82/a8857a5a86e7a0f8c12913e51c1dfecabe5a658ca43569ce26ddb0e7020d/dgl-2.2.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:b05d98c1dc8c8cd30de5aaffbca4905dd6426ba3bb17c967cc99317d0c2d5685", size = 7382847, upload-time = "2024-05-08T07:16:20.225Z" },
268
+ ]
269
+
270
  [[package]]
271
  name = "dgl"
272
  version = "2.4.0+cu121"
273
  source = { registry = "https://data.dgl.ai/wheels/torch-2.2/cu121/repo.html" }
274
+ resolution-markers = [
275
+ "platform_machine == 'x86_64' and sys_platform == 'linux'",
276
+ ]
277
  dependencies = [
278
  { name = "networkx", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
279
  { name = "numpy", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
 
362
  { name = "onnxruntime" },
363
  ]
364
  root-gnn = [
365
+ { name = "dgl", version = "2.2.0", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" },
366
+ { name = "dgl", version = "2.4.0+cu121", source = { registry = "https://data.dgl.ai/wheels/torch-2.2/cu121/repo.html" }, marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" },
367
+ { name = "pydantic", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" },
368
+ { name = "torchdata", marker = "platform_machine == 'arm64' and sys_platform == 'darwin'" },
369
  ]
370
 
371
  [package.dev-dependencies]
 
382
  [package.metadata]
383
  requires-dist = [
384
  { name = "awkward", specifier = ">=2.0" },
385
+ { name = "dgl", marker = "platform_machine == 'arm64' and sys_platform == 'darwin' and extra == 'root-gnn'", specifier = "==2.2.0" },
386
  { name = "dgl", marker = "platform_machine == 'x86_64' and sys_platform == 'linux' and extra == 'root-gnn'", specifier = "==2.4.0+cu121", index = "https://data.dgl.ai/wheels/torch-2.2/cu121/repo.html" },
387
  { name = "hydra-core", specifier = ">=1.3" },
388
  { name = "numpy", specifier = ">=1.24,<2" },
389
  { name = "onnx", marker = "extra == 'onnx'", specifier = ">=1.16,<2" },
390
  { name = "onnxruntime", marker = "extra == 'onnx'", specifier = ">=1.18,<2" },
391
+ { name = "pydantic", marker = "platform_machine == 'arm64' and sys_platform == 'darwin' and extra == 'root-gnn'", specifier = ">=2,<3" },
392
  { name = "scikit-learn", specifier = ">=1.3" },
393
  { name = "torch", marker = "platform_machine != 'x86_64' or sys_platform != 'linux'", specifier = "==2.2.2" },
394
  { name = "torch", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'", specifier = "==2.2.2", index = "https://download.pytorch.org/whl/cu121" },
395
+ { name = "torchdata", marker = "platform_machine == 'arm64' and sys_platform == 'darwin' and extra == 'root-gnn'", specifier = ">=0.7,<0.8" },
396
  { name = "uproot", specifier = ">=5.0" },
397
  ]
398
  provides-extras = ["root-gnn", "onnx"]
 
890
  version = "3.0.5"
891
  source = { registry = "https://pypi.org/simple" }
892
  dependencies = [
893
+ { name = "numpy", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
894
+ { name = "python-dateutil", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
895
  ]
896
  sdist = { url = "https://files.pythonhosted.org/packages/be/4f/5f3422a2afec5ffc46308b79e53291365a93748b498ac2e58bead0197916/pandas-3.0.5.tar.gz", hash = "sha256:dca3734d6ab7c906e6730f0788b0a1dbb9f2467731f9711f77995c8e9d62d712", size = 4658219, upload-time = "2026-07-22T22:19:28.819Z" }
897
  wheels = [
898
+ { url = "https://files.pythonhosted.org/packages/1c/54/1dc810ea558d1320b597aa140a514f2fdf1d2ea09c38cf556f13ea712ec9/pandas-3.0.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fa290c16964d4963fbfbc358928239cf3bd755b20e988ce944877def2f44471d", size = 10411717, upload-time = "2026-07-22T22:18:08.307Z" },
899
+ { url = "https://files.pythonhosted.org/packages/68/56/fbe81c09195924d8b7b8d4461a20458fe80a6a5ed6b24f0314da684277e1/pandas-3.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c2e26bb46934b8a2ca0c3de1d3d606fc5f6746584791b2db264d58cf370e08dc", size = 9957095, upload-time = "2026-07-22T22:18:10.6Z" },
900
+ { url = "https://files.pythonhosted.org/packages/e0/51/fac252f4a913ed5eabf3c11b880a9e8d5a6c10f0b2129d0462212d238b4d/pandas-3.0.5-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:73fa87b08a7ef706f8aafda39ddaccf2a99047bea62d8c88a0361bcafb2237bc", size = 10485458, upload-time = "2026-07-22T22:18:12.834Z" },
901
  { url = "https://files.pythonhosted.org/packages/12/98/e976540c1addf70442be7842a18cf70884a964abbf69442504f4d2939989/pandas-3.0.5-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d373ce03ffd84010ed9839fa73672a9c8256990532e158440c0085db7d914b34", size = 10998091, upload-time = "2026-07-22T22:18:15.209Z" },
902
+ { url = "https://files.pythonhosted.org/packages/a4/8c/1f29b5be8d3fc47dd7567eb167fabba2085879b31e0287ce7cba6d3d2ff4/pandas-3.0.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2a29c53d85ea98c5e792c59ef82ee9fbe6ca902c0d0adb6b23f45ef894cd7bf6", size = 11499501, upload-time = "2026-07-22T22:18:17.689Z" },
903
  { url = "https://files.pythonhosted.org/packages/9d/e2/bd9c98ad2df7b38bde002adde4cdf353519da51881634323b126c55997f9/pandas-3.0.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a5ad3b02ed6bc7d7ae9b70804b2c6aa31827489d150f8e623ce82491b82085d7", size = 12060559, upload-time = "2026-07-22T22:18:20.147Z" },
904
  ]
905
 
 
950
  source = { registry = "https://pypi.org/simple" }
951
  sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" }
952
  wheels = [
953
+ { url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090, upload-time = "2026-01-28T18:15:22.168Z" },
954
+ { url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859, upload-time = "2026-01-28T18:15:23.795Z" },
955
  { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" },
956
+ { url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997, upload-time = "2026-01-28T18:15:27.794Z" },
957
+ { url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972, upload-time = "2026-01-28T18:15:29.342Z" },
958
  { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" },
959
  ]
960
 
 
972
  version = "2.13.4"
973
  source = { registry = "https://pypi.org/simple" }
974
  dependencies = [
975
+ { name = "annotated-types", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
976
+ { name = "pydantic-core", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
977
+ { name = "typing-extensions", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
978
+ { name = "typing-inspection", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
979
  ]
980
  sdist = { url = "https://files.pythonhosted.org/packages/18/a5/b60d21ac674192f8ab0ba4e9fd860690f9b4a6e51ca5df118733b487d8d6/pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6", size = 844775, upload-time = "2026-05-06T13:43:05.343Z" }
981
  wheels = [
 
987
  version = "2.46.4"
988
  source = { registry = "https://pypi.org/simple" }
989
  dependencies = [
990
+ { name = "typing-extensions", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
991
  ]
992
  sdist = { url = "https://files.pythonhosted.org/packages/9d/56/921726b776ace8d8f5db44c4ef961006580d91dc52b803c489fafd1aa249/pydantic_core-2.46.4.tar.gz", hash = "sha256:62f875393d7f270851f20523dd2e29f082bcc82292d66db2b64ea71f64b6e1c1", size = 471464, upload-time = "2026-05-06T13:37:06.98Z" }
993
  wheels = [
994
+ { url = "https://files.pythonhosted.org/packages/ce/8c/af022f0af448d7747c5154288d46b5f2bc5f17366eaa0e23e9aa04d59f3b/pydantic_core-2.46.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3245406455a5d98187ec35530fd772b1d799b26667980872c8d4614991e2c4a2", size = 2106158, upload-time = "2026-05-06T13:38:57.215Z" },
995
+ { url = "https://files.pythonhosted.org/packages/19/95/6195171e385007300f0f5574592e467c568becce2d937a0b6804f218bc49/pydantic_core-2.46.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:962ccbab7b642487b1d8b7df90ef677e03134cf1fd8880bf698649b22a69371f", size = 1951724, upload-time = "2026-05-06T13:37:02.697Z" },
996
+ { url = "https://files.pythonhosted.org/packages/8e/bc/f47d1ff9cbb1620e1b5b697eef06010035735f07820180e74178226b27b3/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8233f2947cf85404441fd7e0085f53b10c93e0ee78611099b5c7237e36aacbf7", size = 1975742, upload-time = "2026-05-06T13:37:09.448Z" },
997
  { url = "https://files.pythonhosted.org/packages/5b/11/9b9a5b0306345664a2da6410877af6e8082481b5884b3ddd78d47c6013ce/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a233125ac121aa3ffba9a2b59edfc4a985a76092dc8279586ab4b71390875e7", size = 2052418, upload-time = "2026-05-06T13:37:38.234Z" },
998
  { url = "https://files.pythonhosted.org/packages/f1/b7/a65fec226f5d78fc39f4a13c4cc0c768c22b113438f60c14adc9d2865038/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b712b53160b79a5850310b912a5ef8e57e56947c8ad690c227f5c9d7e561712", size = 2232274, upload-time = "2026-05-06T13:38:27.753Z" },
999
  { url = "https://files.pythonhosted.org/packages/68/f0/92039db98b907ef49269a8271f67db9cb78ae2fc68062ef7e4e77adb5f61/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9401557acd873c3a7f3eb9383edef8ac4968f9510e340f4808d427e75667e7b4", size = 2309940, upload-time = "2026-05-06T13:38:05.353Z" },
1000
  { url = "https://files.pythonhosted.org/packages/5f/97/2aab507d3d00ca626e8e57c1eac6a79e4e5fbcc63eb99733ff55d1717f65/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:926c9541b14b12b1681dca8a0b75feb510b06c6341b70a8e500c2fdcff837cce", size = 2094516, upload-time = "2026-05-06T13:39:10.577Z" },
1001
  { url = "https://files.pythonhosted.org/packages/22/37/a8aca44d40d737dde2bc05b3c6c07dff0de07ce6f82e9f3167aeaf4d5dea/pydantic_core-2.46.4-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:56cb4851bcaf3d117eddcef4fe66afd750a50274b0da8e22be256d10e5611987", size = 2136854, upload-time = "2026-05-06T13:40:22.59Z" },
1002
+ { url = "https://files.pythonhosted.org/packages/ae/6c/fc44000918855b42779d007ae63b0532794739027b2f417321cddbc44f6a/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b2f69dec1725e79a012d920df1707de5caf7ed5e08f3be4435e25803efc47458", size = 2190044, upload-time = "2026-05-06T13:40:43.231Z" },
1003
  { url = "https://files.pythonhosted.org/packages/6b/65/d9cadc9f1920d7a127ad2edba16c1db7916e59719285cd6c94600b0080ba/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:8d0820e8192167f80d88d64038e609c31452eeca865b4e1d9950a27a4609b00b", size = 2329133, upload-time = "2026-05-06T13:39:57.365Z" },
1004
  { url = "https://files.pythonhosted.org/packages/d0/cf/c873d91679f3a30bcf5e7ac280ce5573483e72295307685120d0d5ad3416/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fbdb89b3e1c94a30cc5edfce477c6e6a5dc4d8f84665b455c27582f211a1c72c", size = 2374464, upload-time = "2026-05-06T13:38:06.976Z" },
1005
+ { url = "https://files.pythonhosted.org/packages/9d/1d/8987ad40f65ae1432753072f214fb5c74fe47ffbd0698bb9cbbb585664f8/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:1d8ba486450b14f3b1d63bc521d410ec7565e52f887b9fb671791886436a42f7", size = 2095527, upload-time = "2026-05-06T13:39:52.283Z" },
1006
+ { url = "https://files.pythonhosted.org/packages/64/d3/84c282a7eee1d3ac4c0377546ef5a1ea436ce26840d9ac3b7ed54a377507/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:3009f12e4e90b7f88b4f9adb1b0c4a3d58fe7820f3238c190047209d148026df", size = 1936024, upload-time = "2026-05-06T13:40:15.671Z" },
1007
+ { url = "https://files.pythonhosted.org/packages/d7/ca/eac61596cdeb4d7e174d3dc0bd8a6238f14f75f97a24e7b7db4c7e7340a0/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad785e92e6dc634c21555edc8bd6b64957ab844541bcb96a1366c202951ae526", size = 1990696, upload-time = "2026-05-06T13:38:34.717Z" },
1008
  { url = "https://files.pythonhosted.org/packages/fa/c3/7c8b240552251faf6b3a957db200fcfbbcec36763c050428b601e0c9b83b/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00c603d540afdd6b80eb39f078f33ebd46211f02f33e34a32d9f053bba711de0", size = 2147590, upload-time = "2026-05-06T13:39:29.883Z" },
1009
  ]
1010
 
 
1230
  version = "3.5.0"
1231
  source = { registry = "https://pypi.org/simple" }
1232
  dependencies = [
1233
+ { name = "cryptography", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
1234
+ { name = "jeepney", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
1235
  ]
1236
  sdist = { url = "https://files.pythonhosted.org/packages/1c/03/e834bcd866f2f8a49a85eaff47340affa3bfa391ee9912a952a1faa68c7b/secretstorage-3.5.0.tar.gz", hash = "sha256:f04b8e4689cbce351744d5537bf6b1329c6fc68f91fa666f60a380edddcd11be", size = 19884, upload-time = "2025-11-23T19:02:53.191Z" }
1237
  wheels = [
 
1273
  version = "2.2.2"
1274
  source = { registry = "https://pypi.org/simple" }
1275
  resolution-markers = [
1276
+ "sys_platform == 'win32'",
1277
+ "sys_platform == 'emscripten'",
1278
+ "(platform_machine != 'x86_64' and sys_platform == 'linux') or (sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32')",
1279
  ]
1280
  dependencies = [
1281
  { name = "filelock", marker = "platform_machine != 'x86_64' or sys_platform != 'linux'" },
 
1323
  { url = "https://download-r2.pytorch.org/whl/cu121/torch-2.2.2%2Bcu121-cp312-cp312-linux_x86_64.whl", hash = "sha256:badc14d413ff1847d15021a1ec0affa479d24dfc83e6d51b9b4b9fbfaad1b14c", upload-time = "2024-04-24T17:07:56Z" },
1324
  ]
1325
 
1326
+ [[package]]
1327
+ name = "torchdata"
1328
+ version = "0.7.1"
1329
+ source = { registry = "https://pypi.org/simple" }
1330
+ dependencies = [
1331
+ { name = "requests", marker = "(platform_machine != 'x86_64' and sys_platform == 'linux') or (sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32')" },
1332
+ { name = "torch", version = "2.2.2", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine != 'x86_64' and sys_platform == 'linux') or (sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32')" },
1333
+ { name = "urllib3", marker = "(platform_machine != 'x86_64' and sys_platform == 'linux') or (sys_platform != 'emscripten' and sys_platform != 'linux' and sys_platform != 'win32')" },
1334
+ ]
1335
+ wheels = [
1336
+ { url = "https://files.pythonhosted.org/packages/e2/c8/34eda2bd6beb8a11c06cf905db74092bdbc3dec51a48f4f22cc474866a0a/torchdata-0.7.1-py3-none-any.whl", hash = "sha256:9f9476a26987d90fa3f87cb09ec82b78ce6031ddcaa91851c9fa9f732a987ab8", size = 184418, upload-time = "2023-11-15T17:09:10.159Z" },
1337
+ ]
1338
+
1339
  [[package]]
1340
  name = "tqdm"
1341
  version = "4.70.0"
 
1379
  version = "0.4.4"
1380
  source = { registry = "https://pypi.org/simple" }
1381
  dependencies = [
1382
+ { name = "typing-extensions", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
1383
  ]
1384
  sdist = { url = "https://files.pythonhosted.org/packages/a3/26/b09b8010994eccc3c09092e6b34058f36a460eea2d4c3e8b910c695975a0/typing_inspection-0.4.4.tar.gz", hash = "sha256:547274fa6b0a561ccf549cc9524b999a578e737d015d8709d021f9d0d13bea47", size = 76928, upload-time = "2026-08-12T12:37:25.997Z" }
1385
  wheels = [