pyg-nightly 2.7.0.dev20250825__py3-none-any.whl → 2.7.0.dev20250827__py3-none-any.whl

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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyg-nightly
3
- Version: 2.7.0.dev20250825
3
+ Version: 2.7.0.dev20250827
4
4
  Summary: Graph Neural Network Library for PyTorch
5
5
  Keywords: deep-learning,pytorch,geometric-deep-learning,graph-neural-networks,graph-convolutional-networks
6
6
  Author-email: Matthias Fey <matthias@pyg.org>
@@ -1,6 +1,6 @@
1
- torch_geometric/__init__.py,sha256=gW8Oh8YbJkaHeP3GCMHrya4iUQRSM5J_66CaZtNpvKQ,2250
1
+ torch_geometric/__init__.py,sha256=zrScFs8nlSfWgDBBpXpfkFiUoXxIN10YeQdNHNX4kIw,2292
2
2
  torch_geometric/_compile.py,sha256=9yqMTBKatZPr40WavJz9FjNi7pQj8YZAZOyZmmRGXgc,1351
3
- torch_geometric/_onnx.py,sha256=V9ffrIKSqhDw6xUZ12lkuSfNs48cQp2EeJ6Z19GfnVw,349
3
+ torch_geometric/_onnx.py,sha256=ODB_8cwFUiwBUjngXn6-K5HHb7IDul7DDXuuGX7vj_0,8178
4
4
  torch_geometric/backend.py,sha256=lVaf7aLoVaB3M-UcByUJ1G4T4FOK6LXAg0CF4W3E8jo,1575
5
5
  torch_geometric/config_mixin.py,sha256=hOTJu5LLVrEAZ6Pjt4ScLDLKv9aHbfAzF_3ufwKgO4I,4301
6
6
  torch_geometric/config_store.py,sha256=zdMzlgBpUmBkPovpYQh5fMNwTZLDq2OneqX47QEx7zk,16818
@@ -281,7 +281,7 @@ torch_geometric/loader/hgt_loader.py,sha256=1gjYFzn3rU4BlAozRWI0eefUfmi5XC5y6YXq
281
281
  torch_geometric/loader/ibmb_loader.py,sha256=6OAP_R1tK1Le5MCBYqtZPD0RFsDhfIXDnhgjmlXTAzw,31444
282
282
  torch_geometric/loader/imbalanced_sampler.py,sha256=clPERglHRk5SyeFevDrgezYFl7ir975OVFMyJwOV090,3754
283
283
  torch_geometric/loader/link_loader.py,sha256=XIYgwo5do_70r-wKQLTKTpET85DMCrEeC3fuKH5xOVQ,16208
284
- torch_geometric/loader/link_neighbor_loader.py,sha256=HdZifaJI3b0M11Og8m7ztY9YobkE_7fz8aY-dc4QyaM,14384
284
+ torch_geometric/loader/link_neighbor_loader.py,sha256=0KjvWNYeGyrLOrpqITat6WF925zw6BO08T6CAkJhw58,14464
285
285
  torch_geometric/loader/mixin.py,sha256=_2sHZt3rkuWR2iqFMxnz4G9oscR2bt5q7y1hZahlOqY,10976
286
286
  torch_geometric/loader/neighbor_loader.py,sha256=vnLn_RhBKTux5h8pi0vzj0d7JPoOpLA3n3vjyIWv9lo,12452
287
287
  torch_geometric/loader/neighbor_sampler.py,sha256=mraVFXIIGctYot4Xr2VOAhCKAOQyW2gP9KROf7g6tcc,8497
@@ -432,7 +432,7 @@ torch_geometric/nn/kge/distmult.py,sha256=dGQ0bVzjreZgFN1lXE23_IIidsiOq7ehPrMb-N
432
432
  torch_geometric/nn/kge/loader.py,sha256=5Uc1j3OUMQnBYSHDqL7pLCty1siFLzoPkztigYO2zP8,771
433
433
  torch_geometric/nn/kge/rotate.py,sha256=XLuO1AbyTt5cJxr97ZzoyAyIEsHKesgW5TvDmnGJAao,3208
434
434
  torch_geometric/nn/kge/transe.py,sha256=jlejq5BLMm-sb1wWcLDp7pZqCdelWBgjDIC8ctbjSdU,3088
435
- torch_geometric/nn/models/__init__.py,sha256=71Hqc-ZMfCKn9lelFYDjpHXapbEa0wqVAd2OXCb1y5o,2448
435
+ torch_geometric/nn/models/__init__.py,sha256=2INurndMehxviZcdD7REV7qnIaLJ9AXdnNvcwqa00HM,2496
436
436
  torch_geometric/nn/models/attentive_fp.py,sha256=1z3iTV2O5W9tqHFAdno8FeBFeXmuG-TDZk4lwwVh3Ac,6634
437
437
  torch_geometric/nn/models/attract_repel.py,sha256=h9OyogT0NY0xiT0DkpJHMxH6ZUmo8R-CmwZdKEwq8Ek,5277
438
438
  torch_geometric/nn/models/autoencoder.py,sha256=nGje-zty78Y3hxOJ9o0_6QziJjOvBlknk6z0_fDQwQU,10770
@@ -454,6 +454,7 @@ torch_geometric/nn/models/jumping_knowledge.py,sha256=9JR2EoViXKjcDSLb8tjJm-UHfv
454
454
  torch_geometric/nn/models/label_prop.py,sha256=6XYBKp7OLmUgcn-73jXXpYZpef9Za1m0gI9QLv2bMEw,3908
455
455
  torch_geometric/nn/models/lightgcn.py,sha256=dXKiBvM96jGKLtYp4l90Fko4he0kKdR9fRw-0ZCqSrA,12466
456
456
  torch_geometric/nn/models/linkx.py,sha256=BOWGdJ7rJxk4P0XrIy316vyw8PZabbUAK2XKbwYPMQw,5812
457
+ torch_geometric/nn/models/lpformer.py,sha256=XjXr-w-QlMl_2ioBGWA1ph2tgt4xrl3umT4zXNpB-Ks,29706
457
458
  torch_geometric/nn/models/mask_label.py,sha256=B2HcL6ZkaUEo3a8nebZoUqEIfDEfcIGOV56sEmNgOxQ,2580
458
459
  torch_geometric/nn/models/meta.py,sha256=lQWovjdQgTGT_rDAm6L186ObINeQCD9tLBz8xenmrF0,6540
459
460
  torch_geometric/nn/models/metapath2vec.py,sha256=jwpEwVUnt9uWcriVfyX1BVCzXOqKpnDVsPQSxJAGoBQ,10788
@@ -518,11 +519,11 @@ torch_geometric/profile/nvtx.py,sha256=AKBr-rqlHDnls_UM02Dfq5BZmyFTHS5Li5gaeKmsA
518
519
  torch_geometric/profile/profile.py,sha256=cHCY4U0XtyqyKC5u380q6TspsOZ5tGHNXaZsKuzYi1A,11793
519
520
  torch_geometric/profile/profiler.py,sha256=rfNciRzWDka_BgO6aPFi3cy8mcT4lSgFWy-WfPgI2SI,16891
520
521
  torch_geometric/profile/utils.py,sha256=ynlUVemNJZ6XjJKIkPJNwFPoUyBgVAnchfHBpKOp_HE,5903
521
- torch_geometric/sampler/__init__.py,sha256=0h_xJ7CQnlTxF5hUpc81WPQ0QaBtouG8eKK1RzPGA-s,512
522
- torch_geometric/sampler/base.py,sha256=0z5e6DYqUGa1-eyJKUGCyUJe6T-DoKBVpOdNxD-dOzM,29225
522
+ torch_geometric/sampler/__init__.py,sha256=NsAvP6S9wfR0Dsc1d5tR7fj5owRlARRUj3RuUeh8ydg,578
523
+ torch_geometric/sampler/base.py,sha256=GifHECotqBrD82yeqFHuW67MyTB7djN3ejHEkqR3GNI,41187
523
524
  torch_geometric/sampler/hgt_sampler.py,sha256=jizRJyEoz4WBOEELuqdytG2hB3UpVQX7yVPM83kvpfE,2991
524
- torch_geometric/sampler/neighbor_sampler.py,sha256=GBnIwPF5pf85wDo_FaMKtMgBlQhzRx5ysiAomMNhCrQ,34092
525
- torch_geometric/sampler/utils.py,sha256=U4XGCEBX6rhmKHpCwYjskNvKNnRTXb9GeVKR1vSWuvA,7250
525
+ torch_geometric/sampler/neighbor_sampler.py,sha256=hH8mSbdlq5J9ijFrO_qlkY-1hodhUzaxyFnx_BsEkGQ,45450
526
+ torch_geometric/sampler/utils.py,sha256=vZU--z8OELmV1pqnUA2Xn56HmAt4eUD8R4m8izJGfxk,8571
526
527
  torch_geometric/testing/__init__.py,sha256=m3yp_5UnCAxVgzTFofpiVt0vdbl5GwVAve8WTrAaNxo,1319
527
528
  torch_geometric/testing/asserts.py,sha256=DLC9HnBgFWuTIiQs2OalsQcXGhOVG-e6R99IWhkO32c,4606
528
529
  torch_geometric/testing/data.py,sha256=O1qo8FyNxt6RGf63Ys3eXBfa5RvYydeZLk74szrez3c,2604
@@ -645,7 +646,7 @@ torch_geometric/utils/undirected.py,sha256=H_nfpI0_WluOG6VfjPyldvcjL4w5USAKWu2x5
645
646
  torch_geometric/visualization/__init__.py,sha256=b-HnVesXjyJ_L1N-DnjiRiRVf7lhwKaBQF_2i5YMVSU,208
646
647
  torch_geometric/visualization/graph.py,sha256=mfZHXYfiU-CWMtfawYc80IxVwVmtK9hbIkSKhM_j7oI,14311
647
648
  torch_geometric/visualization/influence.py,sha256=CWMvuNA_Nf1sfbJmQgn58yS4OFpeKXeZPe7kEuvkUBw,477
648
- pyg_nightly-2.7.0.dev20250825.dist-info/licenses/LICENSE,sha256=ic-27cMJc1kWoMEYncz3Ya3Ur2Bi3bNLWib2DT763-o,1067
649
- pyg_nightly-2.7.0.dev20250825.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
650
- pyg_nightly-2.7.0.dev20250825.dist-info/METADATA,sha256=8Gvqce4-VL_jOaNBwDxOxfD05-94P4j90fLWbCV4IgA,64100
651
- pyg_nightly-2.7.0.dev20250825.dist-info/RECORD,,
649
+ pyg_nightly-2.7.0.dev20250827.dist-info/licenses/LICENSE,sha256=ic-27cMJc1kWoMEYncz3Ya3Ur2Bi3bNLWib2DT763-o,1067
650
+ pyg_nightly-2.7.0.dev20250827.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
651
+ pyg_nightly-2.7.0.dev20250827.dist-info/METADATA,sha256=v9ks0RFVcvThZaDFy2GCqnuXZGHqkd3DJD2w4UQpCFU,64100
652
+ pyg_nightly-2.7.0.dev20250827.dist-info/RECORD,,
@@ -4,7 +4,7 @@ import torch
4
4
  import torch_geometric.typing
5
5
 
6
6
  from ._compile import compile, is_compiling
7
- from ._onnx import is_in_onnx_export
7
+ from ._onnx import is_in_onnx_export, safe_onnx_export
8
8
  from .index import Index
9
9
  from .edge_index import EdgeIndex
10
10
  from .hash_tensor import HashTensor
@@ -31,7 +31,7 @@ from .lazy_loader import LazyLoader
31
31
  contrib = LazyLoader('contrib', globals(), 'torch_geometric.contrib')
32
32
  graphgym = LazyLoader('graphgym', globals(), 'torch_geometric.graphgym')
33
33
 
34
- __version__ = '2.7.0.dev20250825'
34
+ __version__ = '2.7.0.dev20250827'
35
35
 
36
36
  __all__ = [
37
37
  'Index',
@@ -43,6 +43,7 @@ __all__ = [
43
43
  'compile',
44
44
  'is_compiling',
45
45
  'is_in_onnx_export',
46
+ 'safe_onnx_export',
46
47
  'is_mps_available',
47
48
  'is_xpu_available',
48
49
  'device',
torch_geometric/_onnx.py CHANGED
@@ -1,3 +1,7 @@
1
+ import warnings
2
+ from os import PathLike
3
+ from typing import Any, Union
4
+
1
5
  import torch
2
6
 
3
7
  from torch_geometric import is_compiling
@@ -12,3 +16,213 @@ def is_in_onnx_export() -> bool:
12
16
  if torch.jit.is_scripting():
13
17
  return False
14
18
  return torch.onnx.is_in_onnx_export()
19
+
20
+
21
+ def safe_onnx_export(
22
+ model: torch.nn.Module,
23
+ args: Union[torch.Tensor, tuple[Any, ...]],
24
+ f: Union[str, PathLike[Any], None],
25
+ skip_on_error: bool = False,
26
+ **kwargs: Any,
27
+ ) -> bool:
28
+ r"""A safe wrapper around :meth:`torch.onnx.export` that handles known
29
+ ONNX serialization issues in PyTorch Geometric.
30
+
31
+ This function provides workarounds for the ``onnx_ir.serde.SerdeError``
32
+ with boolean ``allowzero`` attributes that occurs in certain environments.
33
+
34
+ Args:
35
+ model (torch.nn.Module): The model to export.
36
+ args (torch.Tensor or tuple): The input arguments for the model.
37
+ f (str or PathLike): The file path to save the model.
38
+ skip_on_error (bool): If True, return False instead of raising when
39
+ workarounds fail. Useful for CI environments.
40
+ **kwargs: Additional arguments passed to :meth:`torch.onnx.export`.
41
+
42
+ Returns:
43
+ bool: True if export succeeded, False if skipped due to known issues
44
+ (only when skip_on_error=True).
45
+
46
+ Example:
47
+ >>> from torch_geometric.nn import SAGEConv
48
+ >>> from torch_geometric import safe_onnx_export
49
+ >>>
50
+ >>> class MyModel(torch.nn.Module):
51
+ ... def __init__(self):
52
+ ... super().__init__()
53
+ ... self.conv = SAGEConv(8, 16)
54
+ ... def forward(self, x, edge_index):
55
+ ... return self.conv(x, edge_index)
56
+ >>>
57
+ >>> model = MyModel()
58
+ >>> x = torch.randn(3, 8)
59
+ >>> edge_index = torch.tensor([[0, 1, 2], [1, 0, 2]])
60
+ >>> success = safe_onnx_export(model, (x, edge_index), 'model.onnx')
61
+ >>>
62
+ >>> # For CI environments:
63
+ >>> success = safe_onnx_export(model, (x, edge_index), 'model.onnx',
64
+ ... skip_on_error=True)
65
+ >>> if not success:
66
+ ... print("ONNX export skipped due to known upstream issue")
67
+ """
68
+ # Convert single tensor to tuple for torch.onnx.export compatibility
69
+ if isinstance(args, torch.Tensor):
70
+ args = (args, )
71
+
72
+ try:
73
+ # First attempt: standard ONNX export
74
+ torch.onnx.export(model, args, f, **kwargs)
75
+ return True
76
+
77
+ except Exception as e:
78
+ error_str = str(e)
79
+ error_type = type(e).__name__
80
+
81
+ # Check for the specific onnx_ir.serde.SerdeError patterns
82
+ is_allowzero_error = (('onnx_ir.serde.SerdeError' in error_str
83
+ and 'allowzero' in error_str) or
84
+ 'ValueError: Value out of range: 1' in error_str
85
+ or 'serialize_model_into' in error_str
86
+ or 'serialize_attribute_into' in error_str)
87
+
88
+ if is_allowzero_error:
89
+ warnings.warn(
90
+ f"Encountered known ONNX serialization issue ({error_type}). "
91
+ "This is likely the allowzero boolean attribute bug. "
92
+ "Attempting workaround...", UserWarning, stacklevel=2)
93
+
94
+ # Apply workaround strategies
95
+ return _apply_onnx_allowzero_workaround(model, args, f,
96
+ skip_on_error, **kwargs)
97
+
98
+ else:
99
+ # Re-raise other errors
100
+ raise
101
+
102
+
103
+ def _apply_onnx_allowzero_workaround(
104
+ model: torch.nn.Module,
105
+ args: tuple[Any, ...],
106
+ f: Union[str, PathLike[Any], None],
107
+ skip_on_error: bool = False,
108
+ **kwargs: Any,
109
+ ) -> bool:
110
+ r"""Apply workaround strategies for onnx_ir.serde.SerdeError with allowzero
111
+ attributes.
112
+
113
+ Returns:
114
+ bool: True if export succeeded, False if skipped (when
115
+ skip_on_error=True).
116
+ """
117
+ # Strategy 1: Try without dynamo if it was enabled
118
+ if kwargs.get('dynamo', False):
119
+ try:
120
+ kwargs_no_dynamo = kwargs.copy()
121
+ kwargs_no_dynamo['dynamo'] = False
122
+
123
+ warnings.warn(
124
+ "Retrying ONNX export with dynamo=False as workaround",
125
+ UserWarning, stacklevel=3)
126
+
127
+ torch.onnx.export(model, args, f, **kwargs_no_dynamo)
128
+ return True
129
+
130
+ except Exception:
131
+ pass
132
+
133
+ # Strategy 2: Try with different opset versions
134
+ original_opset = kwargs.get('opset_version', 18)
135
+ for opset_version in [17, 16, 15, 14, 13, 11]:
136
+ if opset_version != original_opset:
137
+ try:
138
+ kwargs_opset = kwargs.copy()
139
+ kwargs_opset['opset_version'] = opset_version
140
+
141
+ warnings.warn(
142
+ f"Retrying ONNX export with opset_version={opset_version}",
143
+ UserWarning, stacklevel=3)
144
+
145
+ torch.onnx.export(model, args, f, **kwargs_opset)
146
+ return True
147
+
148
+ except Exception:
149
+ continue
150
+
151
+ # Strategy 3: Try legacy export (non-dynamo with older opset)
152
+ try:
153
+ kwargs_legacy = kwargs.copy()
154
+ kwargs_legacy['dynamo'] = False
155
+ kwargs_legacy['opset_version'] = 11
156
+
157
+ warnings.warn(
158
+ "Retrying ONNX export with legacy settings "
159
+ "(dynamo=False, opset_version=11)", UserWarning, stacklevel=3)
160
+
161
+ torch.onnx.export(model, args, f, **kwargs_legacy)
162
+ return True
163
+
164
+ except Exception:
165
+ pass
166
+
167
+ # Strategy 4: Try with minimal settings
168
+ try:
169
+ minimal_kwargs: dict[str, Any] = {
170
+ 'opset_version': 11,
171
+ 'dynamo': False,
172
+ }
173
+ # Add optional parameters if they exist
174
+ if kwargs.get('input_names') is not None:
175
+ minimal_kwargs['input_names'] = kwargs.get('input_names')
176
+ if kwargs.get('output_names') is not None:
177
+ minimal_kwargs['output_names'] = kwargs.get('output_names')
178
+
179
+ warnings.warn(
180
+ "Retrying ONNX export with minimal settings as last resort",
181
+ UserWarning, stacklevel=3)
182
+
183
+ torch.onnx.export(model, args, f, **minimal_kwargs)
184
+ return True
185
+
186
+ except Exception:
187
+ pass
188
+
189
+ # If all strategies fail, handle based on skip_on_error flag
190
+ import os
191
+ pytest_detected = 'PYTEST_CURRENT_TEST' in os.environ or 'pytest' in str(f)
192
+
193
+ if skip_on_error:
194
+ # For CI environments: skip gracefully instead of failing
195
+ warnings.warn(
196
+ "ONNX export skipped due to known upstream issue "
197
+ "(onnx_ir.serde.SerdeError). "
198
+ "This is caused by a bug in the onnx_ir package where boolean "
199
+ "allowzero attributes cannot be serialized. All workarounds "
200
+ "failed. Consider updating packages: pip install --upgrade onnx "
201
+ "onnxscript "
202
+ "onnx_ir", UserWarning, stacklevel=3)
203
+ return False
204
+
205
+ # For regular usage: provide detailed error message
206
+ error_msg = (
207
+ "Failed to export model to ONNX due to known serialization issue. "
208
+ "This is caused by a bug in the onnx_ir package where boolean "
209
+ "allowzero attributes cannot be serialized. "
210
+ "Workarounds attempted: dynamo=False, multiple opset versions, "
211
+ "and legacy export. ")
212
+
213
+ if pytest_detected:
214
+ error_msg += (
215
+ "\n\nThis error commonly occurs in pytest environments. "
216
+ "Try one of these solutions:\n"
217
+ "1. Run the export outside of pytest (in a regular Python "
218
+ "script)\n"
219
+ "2. Update packages: pip install --upgrade onnx onnxscript "
220
+ "onnx_ir\n"
221
+ "3. Use torch.jit.script() instead of ONNX export for testing\n"
222
+ "4. Use safe_onnx_export(..., skip_on_error=True) to skip "
223
+ "gracefully in CI")
224
+ else:
225
+ error_msg += ("\n\nTry updating packages: pip install --upgrade onnx "
226
+ "onnxscript onnx_ir")
227
+
228
+ raise RuntimeError(error_msg)
@@ -170,6 +170,7 @@ class LinkNeighborLoader(LinkLoader):
170
170
  negative sampling mode.
171
171
  If set to :obj:`None`, no negative sampling strategy is applied.
172
172
  (default: :obj:`None`)
173
+ For example use obj:`neg_sampling=dict(mode= 'binary', amount=0.5)`
173
174
  neg_sampling_ratio (int or float, optional): The ratio of sampled
174
175
  negative edges to the number of positive edges.
175
176
  Deprecated in favor of the :obj:`neg_sampling` argument.
@@ -34,7 +34,9 @@ from .git_mol import GITMol
34
34
  from .molecule_gpt import MoleculeGPT
35
35
  from .protein_mpnn import ProteinMPNN
36
36
  from .glem import GLEM
37
+ from .lpformer import LPFormer
37
38
  from .sgformer import SGFormer
39
+
38
40
  from .polynormer import Polynormer
39
41
  # Deprecated:
40
42
  from torch_geometric.explain.algorithm.captum import (to_captum_input,
@@ -90,6 +92,7 @@ __all__ = classes = [
90
92
  'MoleculeGPT',
91
93
  'ProteinMPNN',
92
94
  'GLEM',
95
+ 'LPFormer',
93
96
  'SGFormer',
94
97
  'Polynormer',
95
98
  'ARLinkPredictor',