pyg-nightly 2.7.0.dev20250215__py3-none-any.whl → 2.7.0.dev20250217__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pyg-nightly
3
- Version: 2.7.0.dev20250215
3
+ Version: 2.7.0.dev20250217
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>
@@ -22,6 +22,7 @@ Requires-Dist: psutil>=5.8.0
22
22
  Requires-Dist: pyparsing
23
23
  Requires-Dist: requests
24
24
  Requires-Dist: tqdm
25
+ Requires-Dist: xxhash
25
26
  Requires-Dist: matplotlib ; extra == "benchmark"
26
27
  Requires-Dist: networkx ; extra == "benchmark"
27
28
  Requires-Dist: pandas ; extra == "benchmark"
@@ -1,4 +1,4 @@
1
- torch_geometric/__init__.py,sha256=WUHw4l8NRfqG5Jr-cDi2l7tNpLMNU6SgjrnbmA6eFhY,1978
1
+ torch_geometric/__init__.py,sha256=LZOz8NuqxM3Gqi_c9iZqnbd58Dk5w1hMcWGTBRlN8jM,1978
2
2
  torch_geometric/_compile.py,sha256=f-WQeH4VLi5Hn9lrgztFUCSrN_FImjhQa6BxFzcYC38,1338
3
3
  torch_geometric/_onnx.py,sha256=V9ffrIKSqhDw6xUZ12lkuSfNs48cQp2EeJ6Z19GfnVw,349
4
4
  torch_geometric/backend.py,sha256=lVaf7aLoVaB3M-UcByUJ1G4T4FOK6LXAg0CF4W3E8jo,1575
@@ -9,7 +9,7 @@ torch_geometric/deprecation.py,sha256=dWRymDIUkUVI2MeEmBG5WF4R6jObZeseSBV9G6FNfj
9
9
  torch_geometric/device.py,sha256=tU5-_lBNVbVHl_kUmWPwiG5mQ1pyapwMF4JkmtNN3MM,1224
10
10
  torch_geometric/edge_index.py,sha256=BsLh5tOZRjjSYDkjqOFAdBuvMaDg7EWaaLELYsUL0Z8,70048
11
11
  torch_geometric/experimental.py,sha256=JbtNNEXjFGI8hZ9raM6-qrZURP6Z5nlDK8QicZUIbz0,4756
12
- torch_geometric/hash_tensor.py,sha256=MRmjpF7dnH_IfC3HdT0LnjBa1-Q6zpPehPSCLxy2lLY,3912
12
+ torch_geometric/hash_tensor.py,sha256=N4_LPbg9F35g_e9Wy2WgkLMA9kJPnKiYEgTn_4YrypU,5976
13
13
  torch_geometric/home.py,sha256=EV54B4Dmiv61GDbkCwtCfWGWJ4eFGwZ8s3KOgGjwYgY,790
14
14
  torch_geometric/index.py,sha256=9ChzWFCwj2slNcVBOgfV-wQn-KscJe_y7502w-Vf76w,24045
15
15
  torch_geometric/inspector.py,sha256=nKi5o4Mn6xsG0Ex1GudTEQt_EqnF9mcMqGtp7Shh9sQ,19336
@@ -19,7 +19,7 @@ torch_geometric/logging.py,sha256=HmHHLiCcM64k-6UYNOSfXPIeSGNAyiGGcn8cD8tlyuQ,85
19
19
  torch_geometric/resolver.py,sha256=fn-_6mCpI2xv7eDZnIFcYrHOn0IrwbkWFLDb9laQrWI,1270
20
20
  torch_geometric/seed.py,sha256=MJLbVwpb9i8mK3oi32sS__Cq-dRq_afTeoOL_HoA9ko,372
21
21
  torch_geometric/template.py,sha256=rqjDWgcSAgTCiV4bkOjWRPaO4PpUdC_RXigzxxBqAu8,1060
22
- torch_geometric/typing.py,sha256=-YM1o6csJsWsHpEzmnjIh82_3yq6m-1nwC2TjUMKRGk,15520
22
+ torch_geometric/typing.py,sha256=mtSM6QhCsrohstnyvqMuxEIajCkhcvkQKOU4uVu-nDs,15596
23
23
  torch_geometric/warnings.py,sha256=t114CbkrmiqkXaavx5g7OO52dLdktf-U__B5QqYIQvI,413
24
24
  torch_geometric/contrib/__init__.py,sha256=0pWkmXfZtbdr-AKwlii5LTFggTEH-MCrSKpZxrtPlVs,352
25
25
  torch_geometric/contrib/datasets/__init__.py,sha256=lrGnWsEiJf5zsBRmshGZZFN_uYR2ezDjbj9n9nCpvtk,23
@@ -633,6 +633,6 @@ torch_geometric/utils/undirected.py,sha256=H_nfpI0_WluOG6VfjPyldvcjL4w5USAKWu2x5
633
633
  torch_geometric/visualization/__init__.py,sha256=PyR_4K5SafsJrBr6qWrkjKr6GBL1b7FtZybyXCDEVwY,154
634
634
  torch_geometric/visualization/graph.py,sha256=ZuLPL92yGRi7lxlqsUPwL_EVVXF7P2kMcveTtW79vpA,4784
635
635
  torch_geometric/visualization/influence.py,sha256=CWMvuNA_Nf1sfbJmQgn58yS4OFpeKXeZPe7kEuvkUBw,477
636
- pyg_nightly-2.7.0.dev20250215.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82
637
- pyg_nightly-2.7.0.dev20250215.dist-info/METADATA,sha256=j3pySMauadU_aRqO78jwhWjPQhV5lapZkr3uvX3fffk,62977
638
- pyg_nightly-2.7.0.dev20250215.dist-info/RECORD,,
636
+ pyg_nightly-2.7.0.dev20250217.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82
637
+ pyg_nightly-2.7.0.dev20250217.dist-info/METADATA,sha256=ACH7q4dHQ_l_FbmuJwFJ_K6syGHcHVDwHD3WlqPs0lw,62999
638
+ pyg_nightly-2.7.0.dev20250217.dist-info/RECORD,,
@@ -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.dev20250215'
34
+ __version__ = '2.7.0.dev20250217'
35
35
 
36
36
  __all__ = [
37
37
  'Index',
@@ -2,16 +2,54 @@ from typing import Any, Callable, Dict, Iterable, Optional, Tuple, Type, Union
2
2
 
3
3
  import torch
4
4
  import torch.utils._pytree as pytree
5
+ import xxhash
5
6
  from torch import Tensor
6
7
 
8
+ import torch_geometric.typing
7
9
  from torch_geometric.typing import CPUHashMap, CUDAHashMap
8
10
 
9
11
  HANDLED_FUNCTIONS: Dict[Callable, Callable] = {}
10
12
 
11
13
 
14
+ def as_key_tensor(
15
+ key: Any,
16
+ *,
17
+ device: Optional[torch.device] = None,
18
+ ) -> Tensor:
19
+ try:
20
+ key = torch.as_tensor(key, device=device)
21
+ except Exception:
22
+ device = device or torch.get_default_device()
23
+ # On GPU, we default to int32 for faster 'CUDAHashMap' implementation:
24
+ if device.type == 'cuda':
25
+ key = torch.tensor(
26
+ [xxhash.xxh32(x).intdigest() & 0x7FFFFFFF for x in key],
27
+ dtype=torch.int32, device=device)
28
+ else:
29
+ key = torch.tensor([
30
+ xxhash.xxh64(x).intdigest() & 0x7FFFFFFFFFFFFFFF for x in key
31
+ ], dtype=torch.int64, device=device)
32
+
33
+ if key.element_size() == 1:
34
+ key = key.view(torch.uint8)
35
+ elif key.element_size() == 2:
36
+ key = key.view(torch.int16)
37
+ elif key.element_size() == 4:
38
+ key = key.view(torch.int32)
39
+ elif key.element_size() == 8:
40
+ key = key.view(torch.int64)
41
+ else:
42
+ raise ValueError(f"Received invalid dtype '{key.dtype}' with "
43
+ f"{key.element_size()} bytes")
44
+
45
+ return key
46
+
47
+
12
48
  class HashTensor(Tensor):
13
49
  _map: Union[Tensor, CPUHashMap, CUDAHashMap]
14
50
  _value: Optional[Tensor]
51
+ _min_key: Tensor
52
+ _max_key: Tensor
15
53
 
16
54
  @staticmethod
17
55
  def __new__(
@@ -24,18 +62,11 @@ class HashTensor(Tensor):
24
62
  ) -> 'HashTensor':
25
63
 
26
64
  if value is not None:
27
- if not isinstance(value, Tensor):
28
- value = torch.tensor(value, dtype=dtype, device=device)
29
- else:
30
- value = value.to(device, dtype)
31
-
32
- # TODO Add numpy support
33
- if not isinstance(key, Tensor):
34
- device = value.device if value is not None else device
35
- key = torch.tensor(key, device=device)
36
- else:
37
- key = key.to(device)
38
- device = key.device
65
+ value = torch.as_tensor(value, dtype=dtype, device=device)
66
+ device = value.device
67
+
68
+ key = as_key_tensor(key, device=device)
69
+ device = key.device
39
70
 
40
71
  if key.dim() != 1:
41
72
  raise ValueError(f"'key' data in '{cls.__name__}' needs to be "
@@ -81,6 +112,34 @@ class HashTensor(Tensor):
81
112
 
82
113
  out._value = value
83
114
 
115
+ out._min_key = key.min() if key.numel() > 0 else key.new_zeros(())
116
+ out._max_key = key.max() if key.numel() > 0 else key.new_zeros(())
117
+
118
+ _range = out._max_key - out._min_key
119
+ # TODO Expose fixed threshold as argument.
120
+ if (key.dtype in {torch.uint8, torch.int16} or _range <= 1_000_000
121
+ or _range <= 2 * key.numel()):
122
+ out._map = torch.full(
123
+ size=(_range + 2, ),
124
+ fill_value=-1,
125
+ dtype=torch.int64,
126
+ device=device,
127
+ )
128
+ out._map[(key - (out._min_key - 1)).long()] = torch.arange(
129
+ key.numel(),
130
+ dtype=out._map.dtype,
131
+ device=out._map.device,
132
+ )
133
+ elif torch_geometric.typing.WITH_CUDA_HASH_MAP and key.is_cuda:
134
+ # TODO Convert int64 to int32.
135
+ out._map = CUDAHashMap(key, 0.5)
136
+ elif torch_geometric.typing.WITH_CPU_HASH_MAP and key.is_cpu:
137
+ out._map = CPUHashMap(key, -1)
138
+ else:
139
+ # TODO Expose pandas fallback.
140
+ # warnings.warn()
141
+ raise NotImplementedError
142
+
84
143
  return out
85
144
 
86
145
  def as_tensor(self) -> Tensor:
torch_geometric/typing.py CHANGED
@@ -69,10 +69,16 @@ try:
69
69
  pyg_lib.sampler.neighbor_sample).parameters)
70
70
  WITH_WEIGHTED_NEIGHBOR_SAMPLE = ('edge_weight' in inspect.signature(
71
71
  pyg_lib.sampler.neighbor_sample).parameters)
72
- # WITH_CPU_HASH_MAP = hasattr(torch.classes.pyg, 'CPUHashMap')
73
- # WITH_CUDA_HASH_MAP = hasattr(torch.classes.pyg, 'CUDAHashMap')
74
- WITH_CPU_HASH_MAP = False
75
- WITH_CUDA_HASH_MAP = False
72
+ try:
73
+ torch.classes.pyg.CPUHashMap
74
+ WITH_CPU_HASH_MAP = True
75
+ except Exception:
76
+ WITH_CPU_HASH_MAP = False
77
+ try:
78
+ torch.classes.pyg.CUDAHashMap
79
+ WITH_CUDA_HASH_MAP = True
80
+ except Exception:
81
+ WITH_CUDA_HASH_MAP = False
76
82
  except Exception as e:
77
83
  if not isinstance(e, ImportError): # pragma: no cover
78
84
  warnings.warn(f"An issue occurred while importing 'pyg-lib'. "