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.
- {pyg_nightly-2.7.0.dev20250215.dist-info → pyg_nightly-2.7.0.dev20250217.dist-info}/METADATA +2 -1
- {pyg_nightly-2.7.0.dev20250215.dist-info → pyg_nightly-2.7.0.dev20250217.dist-info}/RECORD +6 -6
- torch_geometric/__init__.py +1 -1
- torch_geometric/hash_tensor.py +71 -12
- torch_geometric/typing.py +10 -4
- {pyg_nightly-2.7.0.dev20250215.dist-info → pyg_nightly-2.7.0.dev20250217.dist-info}/WHEEL +0 -0
{pyg_nightly-2.7.0.dev20250215.dist-info → pyg_nightly-2.7.0.dev20250217.dist-info}/METADATA
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: pyg-nightly
|
3
|
-
Version: 2.7.0.
|
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=
|
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=
|
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
|
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.
|
637
|
-
pyg_nightly-2.7.0.
|
638
|
-
pyg_nightly-2.7.0.
|
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,,
|
torch_geometric/__init__.py
CHANGED
@@ -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.
|
34
|
+
__version__ = '2.7.0.dev20250217'
|
35
35
|
|
36
36
|
__all__ = [
|
37
37
|
'Index',
|
torch_geometric/hash_tensor.py
CHANGED
@@ -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
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
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
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
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'. "
|
File without changes
|