Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
OpenDAS
dgl
Commits
d93a9759
"docs/git@developer.sourcefind.cn:OpenDAS/vision.git" did not exist on "96f5467b6adfe59a2b63bbcf1356ec736bb06769"
Unverified
Commit
d93a9759
authored
Feb 19, 2021
by
Quan (Andy) Gan
Committed by
GitHub
Feb 19, 2021
Browse files
revert (#2672)
parent
ff64bd0d
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
44 additions
and
153 deletions
+44
-153
python/dgl/dataloading/dataloader.py
python/dgl/dataloading/dataloader.py
+16
-72
python/dgl/dataloading/pytorch/__init__.py
python/dgl/dataloading/pytorch/__init__.py
+7
-11
tests/pytorch/test_dataloader.py
tests/pytorch/test_dataloader.py
+21
-70
No files found.
python/dgl/dataloading/dataloader.py
View file @
d93a9759
...
@@ -316,9 +316,6 @@ class NodeCollator(Collator):
...
@@ -316,9 +316,6 @@ class NodeCollator(Collator):
The node set to compute outputs.
The node set to compute outputs.
block_sampler : dgl.dataloading.BlockSampler
block_sampler : dgl.dataloading.BlockSampler
The neighborhood sampler.
The neighborhood sampler.
return_eids : bool, default False
Whether to additionally return the indices of the input ``nids`` array sampled in the
minibatch.
Examples
Examples
--------
--------
...
@@ -334,24 +331,20 @@ class NodeCollator(Collator):
...
@@ -334,24 +331,20 @@ class NodeCollator(Collator):
>>> for input_nodes, output_nodes, blocks in dataloader:
>>> for input_nodes, output_nodes, blocks in dataloader:
... train_on(input_nodes, output_nodes, blocks)
... train_on(input_nodes, output_nodes, blocks)
"""
"""
def
__init__
(
self
,
g
,
nids
,
block_sampler
,
return_indices
=
False
):
def
__init__
(
self
,
g
,
nids
,
block_sampler
):
self
.
g
=
g
self
.
g
=
g
self
.
_is_distributed
=
isinstance
(
g
,
DistGraph
)
self
.
_is_distributed
=
isinstance
(
g
,
DistGraph
)
if
not
isinstance
(
nids
,
Mapping
):
if
not
isinstance
(
nids
,
Mapping
):
assert
len
(
g
.
ntypes
)
==
1
,
\
assert
len
(
g
.
ntypes
)
==
1
,
\
"nids should be a dict of node type and ids for graph with multiple node types"
"nids should be a dict of node type and ids for graph with multiple node types"
self
.
block_sampler
=
block_sampler
self
.
block_sampler
=
block_sampler
self
.
return_indices
=
return_indices
if
isinstance
(
nids
,
Mapping
):
if
isinstance
(
nids
,
Mapping
):
self
.
nids
=
_prepare_tensor_dict
(
g
,
nids
,
'nids'
,
self
.
_is_distributed
)
self
.
nids
=
_prepare_tensor_dict
(
g
,
nids
,
'nids'
,
self
.
_is_distributed
)
dataset
=
{
k
:
F
.
arange
(
0
,
len
(
v
),
F
.
dtype
(
v
),
F
.
context
(
v
))
self
.
_dataset
=
utils
.
FlattenedDict
(
self
.
nids
)
for
k
,
v
in
self
.
nids
.
items
()}
if
return_indices
else
self
.
nids
self
.
_dataset
=
utils
.
FlattenedDict
(
dataset
)
else
:
else
:
self
.
nids
=
_prepare_tensor
(
g
,
nids
,
'nids'
,
self
.
_is_distributed
)
self
.
nids
=
_prepare_tensor
(
g
,
nids
,
'nids'
,
self
.
_is_distributed
)
self
.
_dataset
=
F
.
arange
(
0
,
len
(
nids
),
F
.
dtype
(
nids
),
F
.
context
(
nids
))
\
self
.
_dataset
=
self
.
nids
if
return_indices
else
nids
@
property
@
property
def
dataset
(
self
):
def
dataset
(
self
):
...
@@ -367,9 +360,6 @@ class NodeCollator(Collator):
...
@@ -367,9 +360,6 @@ class NodeCollator(Collator):
Either a list of node IDs (for homogeneous graphs), or a list of node type-ID
Either a list of node IDs (for homogeneous graphs), or a list of node type-ID
pairs (for heterogeneous graphs).
pairs (for heterogeneous graphs).
If ``return_indices`` is True, represents the indices to the seed node
array(s) instead.
Returns
Returns
-------
-------
input_nodes : Tensor or dict[ntype, Tensor]
input_nodes : Tensor or dict[ntype, Tensor]
...
@@ -382,10 +372,6 @@ class NodeCollator(Collator):
...
@@ -382,10 +372,6 @@ class NodeCollator(Collator):
If the original graph has multiple node types, return a dictionary of
If the original graph has multiple node types, return a dictionary of
node type names and node ID tensors. Otherwise, return a single tensor.
node type names and node ID tensors. Otherwise, return a single tensor.
indices : Tensor or dict[ntype, Tensor], optional
The indices of the sampled nodes in the ``nids`` member.
Only returned if ``return_indices`` is True.
blocks : list[DGLGraph]
blocks : list[DGLGraph]
The list of blocks necessary for computing the representation.
The list of blocks necessary for computing the representation.
"""
"""
...
@@ -396,20 +382,11 @@ class NodeCollator(Collator):
...
@@ -396,20 +382,11 @@ class NodeCollator(Collator):
else
:
else
:
items
=
_prepare_tensor
(
self
.
g
,
items
,
'items'
,
self
.
_is_distributed
)
items
=
_prepare_tensor
(
self
.
g
,
items
,
'items'
,
self
.
_is_distributed
)
if
isinstance
(
items
,
dict
):
blocks
=
self
.
block_sampler
.
sample_blocks
(
self
.
g
,
items
)
sample_items
=
{
k
:
F
.
gather_row
(
self
.
nids
[
k
],
v
)
for
k
,
v
in
items
.
items
()}
\
if
self
.
return_indices
else
items
else
:
sample_items
=
F
.
gather_row
(
self
.
nids
,
items
)
if
self
.
return_indices
else
items
blocks
=
self
.
block_sampler
.
sample_blocks
(
self
.
g
,
sample_items
)
output_nodes
=
blocks
[
-
1
].
dstdata
[
NID
]
output_nodes
=
blocks
[
-
1
].
dstdata
[
NID
]
input_nodes
=
blocks
[
0
].
srcdata
[
NID
]
input_nodes
=
blocks
[
0
].
srcdata
[
NID
]
if
not
self
.
return_indices
:
return
input_nodes
,
output_nodes
,
blocks
return
input_nodes
,
output_nodes
,
blocks
else
:
return
input_nodes
,
output_nodes
,
items
,
blocks
class
EdgeCollator
(
Collator
):
class
EdgeCollator
(
Collator
):
"""DGL collator to combine edges and their computation dependencies within a minibatch for
"""DGL collator to combine edges and their computation dependencies within a minibatch for
...
@@ -489,9 +466,6 @@ class EdgeCollator(Collator):
...
@@ -489,9 +466,6 @@ class EdgeCollator(Collator):
A set of builtin negative samplers are provided in
A set of builtin negative samplers are provided in
:ref:`the negative sampling module <api-dataloading-negative-sampling>`.
:ref:`the negative sampling module <api-dataloading-negative-sampling>`.
return_eids : bool, default False
Whether to additionally return the indices of the input ``eids`` array sampled in the
minibatch.
Examples
Examples
--------
--------
...
@@ -577,18 +551,16 @@ class EdgeCollator(Collator):
...
@@ -577,18 +551,16 @@ class EdgeCollator(Collator):
... collator.dataset, collate_fn=collator.collate,
... collator.dataset, collate_fn=collator.collate,
... batch_size=1024, shuffle=True, drop_last=False, num_workers=4)
... batch_size=1024, shuffle=True, drop_last=False, num_workers=4)
>>> for input_nodes, pos_pair_graph, neg_pair_graph, blocks in dataloader:
>>> for input_nodes, pos_pair_graph, neg_pair_graph, blocks in dataloader:
... train_on(input_nod
s
e, pair_graph, neg_pair_graph, blocks)
... train_on(input_node
s
, pair_graph, neg_pair_graph, blocks)
"""
"""
def
__init__
(
self
,
g
,
eids
,
block_sampler
,
g_sampling
=
None
,
exclude
=
None
,
def
__init__
(
self
,
g
,
eids
,
block_sampler
,
g_sampling
=
None
,
exclude
=
None
,
reverse_eids
=
None
,
reverse_etypes
=
None
,
negative_sampler
=
None
,
reverse_eids
=
None
,
reverse_etypes
=
None
,
negative_sampler
=
None
):
return_indices
=
False
):
self
.
g
=
g
self
.
g
=
g
self
.
_is_distributed
=
isinstance
(
g
,
DistGraph
)
self
.
_is_distributed
=
isinstance
(
g
,
DistGraph
)
if
not
isinstance
(
eids
,
Mapping
):
if
not
isinstance
(
eids
,
Mapping
):
assert
len
(
g
.
etypes
)
==
1
,
\
assert
len
(
g
.
etypes
)
==
1
,
\
"eids should be a dict of etype and ids for graph with multiple etypes"
"eids should be a dict of etype and ids for graph with multiple etypes"
self
.
block_sampler
=
block_sampler
self
.
block_sampler
=
block_sampler
self
.
return_indices
=
return_indices
# One may wish to iterate over the edges in one graph while perform sampling in
# One may wish to iterate over the edges in one graph while perform sampling in
# another graph. This may be the case for iterating over validation and test
# another graph. This may be the case for iterating over validation and test
...
@@ -608,13 +580,10 @@ class EdgeCollator(Collator):
...
@@ -608,13 +580,10 @@ class EdgeCollator(Collator):
if
isinstance
(
eids
,
Mapping
):
if
isinstance
(
eids
,
Mapping
):
self
.
eids
=
_prepare_tensor_dict
(
g
,
eids
,
'eids'
,
self
.
_is_distributed
)
self
.
eids
=
_prepare_tensor_dict
(
g
,
eids
,
'eids'
,
self
.
_is_distributed
)
dataset
=
{
k
:
F
.
arange
(
0
,
len
(
v
),
F
.
dtype
(
v
),
F
.
context
(
v
))
self
.
_dataset
=
utils
.
FlattenedDict
(
self
.
eids
)
for
k
,
v
in
self
.
eids
.
items
()}
if
return_indices
else
self
.
eids
self
.
_dataset
=
utils
.
FlattenedDict
(
dataset
)
else
:
else
:
self
.
eids
=
_prepare_tensor
(
g
,
eids
,
'eids'
,
self
.
_is_distributed
)
self
.
eids
=
_prepare_tensor
(
g
,
eids
,
'eids'
,
self
.
_is_distributed
)
self
.
_dataset
=
F
.
arange
(
0
,
len
(
eids
),
F
.
dtype
(
eids
),
F
.
context
(
eids
))
\
self
.
_dataset
=
self
.
eids
if
return_indices
else
eids
@
property
@
property
def
dataset
(
self
):
def
dataset
(
self
):
...
@@ -628,19 +597,13 @@ class EdgeCollator(Collator):
...
@@ -628,19 +597,13 @@ class EdgeCollator(Collator):
else
:
else
:
items
=
_prepare_tensor
(
self
.
g_sampling
,
items
,
'items'
,
self
.
_is_distributed
)
items
=
_prepare_tensor
(
self
.
g_sampling
,
items
,
'items'
,
self
.
_is_distributed
)
if
isinstance
(
items
,
dict
):
pair_graph
=
self
.
g
.
edge_subgraph
(
items
)
sample_items
=
{
k
:
F
.
gather_row
(
self
.
eids
[
k
],
v
)
for
k
,
v
in
items
.
items
()}
\
if
self
.
return_indices
else
items
else
:
sample_items
=
F
.
gather_row
(
self
.
eids
,
items
)
if
self
.
return_indices
else
items
pair_graph
=
self
.
g
.
edge_subgraph
(
sample_items
)
seed_nodes
=
pair_graph
.
ndata
[
NID
]
seed_nodes
=
pair_graph
.
ndata
[
NID
]
exclude_eids
=
_find_exclude_eids
(
exclude_eids
=
_find_exclude_eids
(
self
.
g
,
self
.
g
,
self
.
exclude
,
self
.
exclude
,
sample_
items
,
items
,
reverse_eid_map
=
self
.
reverse_eids
,
reverse_eid_map
=
self
.
reverse_eids
,
reverse_etype_map
=
self
.
reverse_etypes
)
reverse_etype_map
=
self
.
reverse_etypes
)
...
@@ -648,10 +611,7 @@ class EdgeCollator(Collator):
...
@@ -648,10 +611,7 @@ class EdgeCollator(Collator):
self
.
g_sampling
,
seed_nodes
,
exclude_eids
=
exclude_eids
)
self
.
g_sampling
,
seed_nodes
,
exclude_eids
=
exclude_eids
)
input_nodes
=
blocks
[
0
].
srcdata
[
NID
]
input_nodes
=
blocks
[
0
].
srcdata
[
NID
]
if
not
self
.
return_indices
:
return
input_nodes
,
pair_graph
,
blocks
return
input_nodes
,
pair_graph
,
blocks
else
:
return
input_nodes
,
pair_graph
,
items
,
blocks
def
_collate_with_negative_sampling
(
self
,
items
):
def
_collate_with_negative_sampling
(
self
,
items
):
if
isinstance
(
items
[
0
],
tuple
):
if
isinstance
(
items
[
0
],
tuple
):
...
@@ -661,16 +621,10 @@ class EdgeCollator(Collator):
...
@@ -661,16 +621,10 @@ class EdgeCollator(Collator):
else
:
else
:
items
=
_prepare_tensor
(
self
.
g_sampling
,
items
,
'items'
,
self
.
_is_distributed
)
items
=
_prepare_tensor
(
self
.
g_sampling
,
items
,
'items'
,
self
.
_is_distributed
)
if
isinstance
(
items
,
dict
):
pair_graph
=
self
.
g
.
edge_subgraph
(
items
,
preserve_nodes
=
True
)
sample_items
=
{
k
:
F
.
gather_row
(
self
.
eids
[
k
],
v
)
for
k
,
v
in
items
.
items
()}
\
if
self
.
return_indices
else
items
else
:
sample_items
=
F
.
gather_row
(
self
.
eids
,
items
)
if
self
.
return_indices
else
items
pair_graph
=
self
.
g
.
edge_subgraph
(
sample_items
,
preserve_nodes
=
True
)
induced_edges
=
pair_graph
.
edata
[
EID
]
induced_edges
=
pair_graph
.
edata
[
EID
]
neg_srcdst
=
self
.
negative_sampler
(
self
.
g
,
sample_
items
)
neg_srcdst
=
self
.
negative_sampler
(
self
.
g
,
items
)
if
not
isinstance
(
neg_srcdst
,
Mapping
):
if
not
isinstance
(
neg_srcdst
,
Mapping
):
assert
len
(
self
.
g
.
etypes
)
==
1
,
\
assert
len
(
self
.
g
.
etypes
)
==
1
,
\
'graph has multiple or no edge types; '
\
'graph has multiple or no edge types; '
\
...
@@ -692,7 +646,7 @@ class EdgeCollator(Collator):
...
@@ -692,7 +646,7 @@ class EdgeCollator(Collator):
exclude_eids
=
_find_exclude_eids
(
exclude_eids
=
_find_exclude_eids
(
self
.
g
,
self
.
g
,
self
.
exclude
,
self
.
exclude
,
sample_
items
,
items
,
reverse_eid_map
=
self
.
reverse_eids
,
reverse_eid_map
=
self
.
reverse_eids
,
reverse_etype_map
=
self
.
reverse_etypes
)
reverse_etype_map
=
self
.
reverse_etypes
)
...
@@ -700,10 +654,7 @@ class EdgeCollator(Collator):
...
@@ -700,10 +654,7 @@ class EdgeCollator(Collator):
self
.
g_sampling
,
seed_nodes
,
exclude_eids
=
exclude_eids
)
self
.
g_sampling
,
seed_nodes
,
exclude_eids
=
exclude_eids
)
input_nodes
=
blocks
[
0
].
srcdata
[
NID
]
input_nodes
=
blocks
[
0
].
srcdata
[
NID
]
if
not
self
.
return_indices
:
return
input_nodes
,
pair_graph
,
neg_pair_graph
,
blocks
return
input_nodes
,
pair_graph
,
neg_pair_graph
,
blocks
else
:
return
input_nodes
,
pair_graph
,
neg_pair_graph
,
items
,
blocks
def
collate
(
self
,
items
):
def
collate
(
self
,
items
):
"""Combines the sampled edges into a minibatch for edge classification, edge
"""Combines the sampled edges into a minibatch for edge classification, edge
...
@@ -715,9 +666,6 @@ class EdgeCollator(Collator):
...
@@ -715,9 +666,6 @@ class EdgeCollator(Collator):
Either a list of edge IDs (for homogeneous graphs), or a list of edge type-ID
Either a list of edge IDs (for homogeneous graphs), or a list of edge type-ID
pairs (for heterogeneous graphs).
pairs (for heterogeneous graphs).
If ``return_indices`` is True, represents the indices to the seed edge
array(s) instead.
Returns
Returns
-------
-------
Either ``(input_nodes, pair_graph, blocks)``, or
Either ``(input_nodes, pair_graph, blocks)``, or
...
@@ -741,10 +689,6 @@ class EdgeCollator(Collator):
...
@@ -741,10 +689,6 @@ class EdgeCollator(Collator):
Note that the metagraph of this graph will be identical to that of the original
Note that the metagraph of this graph will be identical to that of the original
graph.
graph.
items : Tensor or dict[ntype, Tensor]
The indices of the sampled edges in the ``eids`` member.
Only returned if ``return_indices`` is True.
blocks : list[DGLGraph]
blocks : list[DGLGraph]
The list of blocks necessary for computing the representation of the edges.
The list of blocks necessary for computing the representation of the edges.
"""
"""
...
...
python/dgl/dataloading/pytorch/__init__.py
View file @
d93a9759
...
@@ -126,13 +126,13 @@ class _NodeCollator(NodeCollator):
...
@@ -126,13 +126,13 @@ class _NodeCollator(NodeCollator):
class
_EdgeCollator
(
EdgeCollator
):
class
_EdgeCollator
(
EdgeCollator
):
def
collate
(
self
,
items
):
def
collate
(
self
,
items
):
if
self
.
negative_sampler
is
None
:
if
self
.
negative_sampler
is
None
:
# input_nodes, pair_graph,
[items],
blocks
# input_nodes, pair_graph, blocks
result
=
super
().
collate
(
items
)
result
=
super
().
collate
(
items
)
_pop_subgraph_storage
(
result
[
1
],
self
.
g
)
_pop_subgraph_storage
(
result
[
1
],
self
.
g
)
_pop_blocks_storage
(
result
[
-
1
],
self
.
g_sampling
)
_pop_blocks_storage
(
result
[
-
1
],
self
.
g_sampling
)
return
result
return
result
else
:
else
:
# input_nodes, pair_graph, neg_pair_graph,
[items],
blocks
# input_nodes, pair_graph, neg_pair_graph, blocks
result
=
super
().
collate
(
items
)
result
=
super
().
collate
(
items
)
_pop_subgraph_storage
(
result
[
1
],
self
.
g
)
_pop_subgraph_storage
(
result
[
1
],
self
.
g
)
_pop_subgraph_storage
(
result
[
2
],
self
.
g
)
_pop_subgraph_storage
(
result
[
2
],
self
.
g
)
...
@@ -156,13 +156,11 @@ class _NodeDataLoaderIter:
...
@@ -156,13 +156,11 @@ class _NodeDataLoaderIter:
self
.
iter_
=
iter
(
node_dataloader
.
dataloader
)
self
.
iter_
=
iter
(
node_dataloader
.
dataloader
)
def
__next__
(
self
):
def
__next__
(
self
):
# input_nodes, output_nodes,
[items],
blocks
# input_nodes, output_nodes, blocks
result_
=
next
(
self
.
iter_
)
result_
=
next
(
self
.
iter_
)
_restore_blocks_storage
(
result_
[
-
1
],
self
.
node_dataloader
.
collator
.
g
)
_restore_blocks_storage
(
result_
[
-
1
],
self
.
node_dataloader
.
collator
.
g
)
result
=
[]
result
=
[
_to_device
(
data
,
self
.
device
)
for
data
in
result_
]
for
data
in
result_
:
result
.
append
(
_to_device
(
data
,
self
.
device
))
return
result
return
result
class
_EdgeDataLoaderIter
:
class
_EdgeDataLoaderIter
:
...
@@ -175,15 +173,13 @@ class _EdgeDataLoaderIter:
...
@@ -175,15 +173,13 @@ class _EdgeDataLoaderIter:
result_
=
next
(
self
.
iter_
)
result_
=
next
(
self
.
iter_
)
if
self
.
edge_dataloader
.
collator
.
negative_sampler
is
not
None
:
if
self
.
edge_dataloader
.
collator
.
negative_sampler
is
not
None
:
# input_nodes, pair_graph, neg_pair_graph,
[items],
blocks
# input_nodes, pair_graph, neg_pair_graph, blocks
# Otherwise, input_nodes, pair_graph,
[items],
blocks
# Otherwise, input_nodes, pair_graph, blocks
_restore_subgraph_storage
(
result_
[
2
],
self
.
edge_dataloader
.
collator
.
g
)
_restore_subgraph_storage
(
result_
[
2
],
self
.
edge_dataloader
.
collator
.
g
)
_restore_subgraph_storage
(
result_
[
1
],
self
.
edge_dataloader
.
collator
.
g
)
_restore_subgraph_storage
(
result_
[
1
],
self
.
edge_dataloader
.
collator
.
g
)
_restore_blocks_storage
(
result_
[
-
1
],
self
.
edge_dataloader
.
collator
.
g_sampling
)
_restore_blocks_storage
(
result_
[
-
1
],
self
.
edge_dataloader
.
collator
.
g_sampling
)
result
=
[]
result
=
[
_to_device
(
data
,
self
.
device
)
for
data
in
result_
]
for
data
in
result_
:
result
.
append
(
_to_device
(
data
,
self
.
device
))
return
result
return
result
class
NodeDataLoader
:
class
NodeDataLoader
:
...
...
tests/pytorch/test_dataloader.py
View file @
d93a9759
...
@@ -10,36 +10,16 @@ def _check_neighbor_sampling_dataloader(g, nids, dl, mode, collator):
...
@@ -10,36 +10,16 @@ def _check_neighbor_sampling_dataloader(g, nids, dl, mode, collator):
for
item
in
dl
:
for
item
in
dl
:
if
mode
==
'node'
:
if
mode
==
'node'
:
input_nodes
,
output_nodes
,
items
,
blocks
=
item
input_nodes
,
output_nodes
,
blocks
=
item
elif
mode
==
'edge'
:
elif
mode
==
'edge'
:
input_nodes
,
pair_graph
,
items
,
blocks
=
item
input_nodes
,
pair_graph
,
blocks
=
item
output_nodes
=
pair_graph
.
ndata
[
dgl
.
NID
]
output_nodes
=
pair_graph
.
ndata
[
dgl
.
NID
]
elif
mode
==
'link'
:
elif
mode
==
'link'
:
input_nodes
,
pair_graph
,
neg_graph
,
items
,
blocks
=
item
input_nodes
,
pair_graph
,
neg_graph
,
blocks
=
item
output_nodes
=
pair_graph
.
ndata
[
dgl
.
NID
]
output_nodes
=
pair_graph
.
ndata
[
dgl
.
NID
]
for
ntype
in
pair_graph
.
ntypes
:
for
ntype
in
pair_graph
.
ntypes
:
assert
F
.
array_equal
(
pair_graph
.
nodes
[
ntype
].
data
[
dgl
.
NID
],
neg_graph
.
nodes
[
ntype
].
data
[
dgl
.
NID
])
assert
F
.
array_equal
(
pair_graph
.
nodes
[
ntype
].
data
[
dgl
.
NID
],
neg_graph
.
nodes
[
ntype
].
data
[
dgl
.
NID
])
# TODO: check if items match output nodes/edges
if
mode
==
'node'
:
if
len
(
g
.
ntypes
)
>
1
:
for
ntype
in
g
.
ntypes
:
if
ntype
not
in
items
:
assert
len
(
output_nodes
[
ntype
])
==
0
else
:
assert
F
.
array_equal
(
output_nodes
[
ntype
],
F
.
gather_row
(
collator
.
nids
[
ntype
],
items
[
ntype
]))
else
:
assert
F
.
array_equal
(
output_nodes
,
F
.
gather_row
(
collator
.
nids
,
items
))
else
:
if
len
(
g
.
etypes
)
>
1
:
for
etype
,
eids
in
collator
.
eids
.
items
():
if
etype
not
in
items
:
assert
pair_graph
.
num_edges
(
etype
=
etype
)
==
0
else
:
assert
F
.
array_equal
(
pair_graph
.
edges
[
etype
].
data
[
dgl
.
EID
],
F
.
gather_row
(
eids
,
items
[
etype
]))
else
:
assert
F
.
array_equal
(
pair_graph
.
edata
[
dgl
.
EID
],
F
.
gather_row
(
collator
.
eids
,
items
))
if
len
(
g
.
ntypes
)
>
1
:
if
len
(
g
.
ntypes
)
>
1
:
for
ntype
in
g
.
ntypes
:
for
ntype
in
g
.
ntypes
:
assert
F
.
array_equal
(
input_nodes
[
ntype
],
blocks
[
0
].
srcnodes
[
ntype
].
data
[
dgl
.
NID
])
assert
F
.
array_equal
(
input_nodes
[
ntype
],
blocks
[
0
].
srcnodes
[
ntype
].
data
[
dgl
.
NID
])
...
@@ -130,34 +110,31 @@ def test_neighbor_sampler_dataloader():
...
@@ -130,34 +110,31 @@ def test_neighbor_sampler_dataloader():
for
seeds
,
sampler
in
product
(
for
seeds
,
sampler
in
product
(
[
F
.
tensor
([
0
,
1
,
2
,
3
,
5
],
dtype
=
F
.
int64
),
F
.
tensor
([
4
,
5
],
dtype
=
F
.
int64
)],
[
F
.
tensor
([
0
,
1
,
2
,
3
,
5
],
dtype
=
F
.
int64
),
F
.
tensor
([
4
,
5
],
dtype
=
F
.
int64
)],
[
g_sampler1
,
g_sampler2
]):
[
g_sampler1
,
g_sampler2
]):
collators
.
append
(
dgl
.
dataloading
.
NodeCollator
(
g
,
seeds
,
sampler
,
return_indices
=
True
))
collators
.
append
(
dgl
.
dataloading
.
NodeCollator
(
g
,
seeds
,
sampler
))
graphs
.
append
(
g
)
graphs
.
append
(
g
)
nids
.
append
({
'user'
:
seeds
})
nids
.
append
({
'user'
:
seeds
})
modes
.
append
(
'node'
)
modes
.
append
(
'node'
)
collators
.
append
(
dgl
.
dataloading
.
EdgeCollator
(
g
,
seeds
,
sampler
,
return_indices
=
True
))
collators
.
append
(
dgl
.
dataloading
.
EdgeCollator
(
g
,
seeds
,
sampler
))
graphs
.
append
(
g
)
graphs
.
append
(
g
)
nids
.
append
({
'follow'
:
seeds
})
nids
.
append
({
'follow'
:
seeds
})
modes
.
append
(
'edge'
)
modes
.
append
(
'edge'
)
collators
.
append
(
dgl
.
dataloading
.
EdgeCollator
(
collators
.
append
(
dgl
.
dataloading
.
EdgeCollator
(
g
,
seeds
,
sampler
,
exclude
=
'reverse_id'
,
reverse_eids
=
reverse_eids
,
g
,
seeds
,
sampler
,
exclude
=
'reverse_id'
,
reverse_eids
=
reverse_eids
))
return_indices
=
True
))
graphs
.
append
(
g
)
graphs
.
append
(
g
)
nids
.
append
({
'follow'
:
seeds
})
nids
.
append
({
'follow'
:
seeds
})
modes
.
append
(
'edge'
)
modes
.
append
(
'edge'
)
collators
.
append
(
dgl
.
dataloading
.
EdgeCollator
(
collators
.
append
(
dgl
.
dataloading
.
EdgeCollator
(
g
,
seeds
,
sampler
,
negative_sampler
=
dgl
.
dataloading
.
negative_sampler
.
Uniform
(
2
),
g
,
seeds
,
sampler
,
negative_sampler
=
dgl
.
dataloading
.
negative_sampler
.
Uniform
(
2
)))
return_indices
=
True
))
graphs
.
append
(
g
)
graphs
.
append
(
g
)
nids
.
append
({
'follow'
:
seeds
})
nids
.
append
({
'follow'
:
seeds
})
modes
.
append
(
'link'
)
modes
.
append
(
'link'
)
collators
.
append
(
dgl
.
dataloading
.
EdgeCollator
(
collators
.
append
(
dgl
.
dataloading
.
EdgeCollator
(
g
,
seeds
,
sampler
,
exclude
=
'reverse_id'
,
reverse_eids
=
reverse_eids
,
g
,
seeds
,
sampler
,
exclude
=
'reverse_id'
,
reverse_eids
=
reverse_eids
,
negative_sampler
=
dgl
.
dataloading
.
negative_sampler
.
Uniform
(
2
),
negative_sampler
=
dgl
.
dataloading
.
negative_sampler
.
Uniform
(
2
)))
return_indices
=
True
))
graphs
.
append
(
g
)
graphs
.
append
(
g
)
nids
.
append
({
'follow'
:
seeds
})
nids
.
append
({
'follow'
:
seeds
})
modes
.
append
(
'link'
)
modes
.
append
(
'link'
)
...
@@ -166,7 +143,7 @@ def test_neighbor_sampler_dataloader():
...
@@ -166,7 +143,7 @@ def test_neighbor_sampler_dataloader():
[{
'user'
:
F
.
tensor
([
0
,
1
,
3
,
5
],
dtype
=
F
.
int64
),
'game'
:
F
.
tensor
([
0
,
1
,
2
],
dtype
=
F
.
int64
)},
[{
'user'
:
F
.
tensor
([
0
,
1
,
3
,
5
],
dtype
=
F
.
int64
),
'game'
:
F
.
tensor
([
0
,
1
,
2
],
dtype
=
F
.
int64
)},
{
'user'
:
F
.
tensor
([
4
,
5
],
dtype
=
F
.
int64
),
'game'
:
F
.
tensor
([
0
,
1
,
2
],
dtype
=
F
.
int64
)}],
{
'user'
:
F
.
tensor
([
4
,
5
],
dtype
=
F
.
int64
),
'game'
:
F
.
tensor
([
0
,
1
,
2
],
dtype
=
F
.
int64
)}],
[
hg_sampler1
,
hg_sampler2
]):
[
hg_sampler1
,
hg_sampler2
]):
collators
.
append
(
dgl
.
dataloading
.
NodeCollator
(
hg
,
seeds
,
sampler
,
return_indices
=
True
))
collators
.
append
(
dgl
.
dataloading
.
NodeCollator
(
hg
,
seeds
,
sampler
))
graphs
.
append
(
hg
)
graphs
.
append
(
hg
)
nids
.
append
(
seeds
)
nids
.
append
(
seeds
)
modes
.
append
(
'node'
)
modes
.
append
(
'node'
)
...
@@ -175,29 +152,26 @@ def test_neighbor_sampler_dataloader():
...
@@ -175,29 +152,26 @@ def test_neighbor_sampler_dataloader():
[{
'follow'
:
F
.
tensor
([
0
,
1
,
3
,
5
],
dtype
=
F
.
int64
),
'play'
:
F
.
tensor
([
1
,
3
],
dtype
=
F
.
int64
)},
[{
'follow'
:
F
.
tensor
([
0
,
1
,
3
,
5
],
dtype
=
F
.
int64
),
'play'
:
F
.
tensor
([
1
,
3
],
dtype
=
F
.
int64
)},
{
'follow'
:
F
.
tensor
([
4
,
5
],
dtype
=
F
.
int64
),
'play'
:
F
.
tensor
([
1
,
3
],
dtype
=
F
.
int64
)}],
{
'follow'
:
F
.
tensor
([
4
,
5
],
dtype
=
F
.
int64
),
'play'
:
F
.
tensor
([
1
,
3
],
dtype
=
F
.
int64
)}],
[
hg_sampler1
,
hg_sampler2
]):
[
hg_sampler1
,
hg_sampler2
]):
collators
.
append
(
dgl
.
dataloading
.
EdgeCollator
(
hg
,
seeds
,
sampler
,
return_indices
=
True
))
collators
.
append
(
dgl
.
dataloading
.
EdgeCollator
(
hg
,
seeds
,
sampler
))
graphs
.
append
(
hg
)
graphs
.
append
(
hg
)
nids
.
append
(
seeds
)
nids
.
append
(
seeds
)
modes
.
append
(
'edge'
)
modes
.
append
(
'edge'
)
collators
.
append
(
dgl
.
dataloading
.
EdgeCollator
(
collators
.
append
(
dgl
.
dataloading
.
EdgeCollator
(
hg
,
seeds
,
sampler
,
exclude
=
'reverse_types'
,
reverse_etypes
=
reverse_etypes
,
hg
,
seeds
,
sampler
,
exclude
=
'reverse_types'
,
reverse_etypes
=
reverse_etypes
))
return_indices
=
True
))
graphs
.
append
(
hg
)
graphs
.
append
(
hg
)
nids
.
append
(
seeds
)
nids
.
append
(
seeds
)
modes
.
append
(
'edge'
)
modes
.
append
(
'edge'
)
collators
.
append
(
dgl
.
dataloading
.
EdgeCollator
(
collators
.
append
(
dgl
.
dataloading
.
EdgeCollator
(
hg
,
seeds
,
sampler
,
negative_sampler
=
dgl
.
dataloading
.
negative_sampler
.
Uniform
(
2
),
hg
,
seeds
,
sampler
,
negative_sampler
=
dgl
.
dataloading
.
negative_sampler
.
Uniform
(
2
)))
return_indices
=
True
))
graphs
.
append
(
hg
)
graphs
.
append
(
hg
)
nids
.
append
(
seeds
)
nids
.
append
(
seeds
)
modes
.
append
(
'link'
)
modes
.
append
(
'link'
)
collators
.
append
(
dgl
.
dataloading
.
EdgeCollator
(
collators
.
append
(
dgl
.
dataloading
.
EdgeCollator
(
hg
,
seeds
,
sampler
,
exclude
=
'reverse_types'
,
reverse_etypes
=
reverse_etypes
,
hg
,
seeds
,
sampler
,
exclude
=
'reverse_types'
,
reverse_etypes
=
reverse_etypes
,
negative_sampler
=
dgl
.
dataloading
.
negative_sampler
.
Uniform
(
2
),
negative_sampler
=
dgl
.
dataloading
.
negative_sampler
.
Uniform
(
2
)))
return_indices
=
True
))
graphs
.
append
(
hg
)
graphs
.
append
(
hg
)
nids
.
append
(
seeds
)
nids
.
append
(
seeds
)
modes
.
append
(
'link'
)
modes
.
append
(
'link'
)
...
@@ -232,7 +206,6 @@ def test_node_dataloader():
...
@@ -232,7 +206,6 @@ def test_node_dataloader():
g1
=
dgl
.
graph
(([
0
,
0
,
0
,
1
,
1
],
[
1
,
2
,
3
,
3
,
4
]))
g1
=
dgl
.
graph
(([
0
,
0
,
0
,
1
,
1
],
[
1
,
2
,
3
,
3
,
4
]))
g1
.
ndata
[
'feat'
]
=
F
.
copy_to
(
F
.
randn
((
5
,
8
)),
F
.
cpu
())
g1
.
ndata
[
'feat'
]
=
F
.
copy_to
(
F
.
randn
((
5
,
8
)),
F
.
cpu
())
# return_indices = False
dataloader
=
dgl
.
dataloading
.
NodeDataLoader
(
dataloader
=
dgl
.
dataloading
.
NodeDataLoader
(
g1
,
g1
.
nodes
(),
sampler
,
device
=
F
.
ctx
(),
batch_size
=
g1
.
num_nodes
())
g1
,
g1
.
nodes
(),
sampler
,
device
=
F
.
ctx
(),
batch_size
=
g1
.
num_nodes
())
for
input_nodes
,
output_nodes
,
blocks
in
dataloader
:
for
input_nodes
,
output_nodes
,
blocks
in
dataloader
:
...
@@ -240,15 +213,6 @@ def test_node_dataloader():
...
@@ -240,15 +213,6 @@ def test_node_dataloader():
_check_device
(
output_nodes
)
_check_device
(
output_nodes
)
_check_device
(
blocks
)
_check_device
(
blocks
)
# return_indices = True
dataloader
=
dgl
.
dataloading
.
NodeDataLoader
(
g1
,
g1
.
nodes
(),
sampler
,
device
=
F
.
ctx
(),
batch_size
=
g1
.
num_nodes
(),
return_indices
=
True
)
for
input_nodes
,
output_nodes
,
items
,
blocks
in
dataloader
:
_check_device
(
input_nodes
)
_check_device
(
output_nodes
)
_check_device
(
items
)
_check_device
(
blocks
)
g2
=
dgl
.
heterograph
({
g2
=
dgl
.
heterograph
({
(
'user'
,
'follow'
,
'user'
):
([
0
,
0
,
0
,
1
,
1
,
1
,
2
],
[
1
,
2
,
3
,
0
,
2
,
3
,
0
]),
(
'user'
,
'follow'
,
'user'
):
([
0
,
0
,
0
,
1
,
1
,
1
,
2
],
[
1
,
2
,
3
,
0
,
2
,
3
,
0
]),
(
'user'
,
'followed-by'
,
'user'
):
([
1
,
2
,
3
,
0
,
2
,
3
,
0
],
[
0
,
0
,
0
,
1
,
1
,
1
,
2
]),
(
'user'
,
'followed-by'
,
'user'
):
([
1
,
2
,
3
,
0
,
2
,
3
,
0
],
[
0
,
0
,
0
,
1
,
1
,
1
,
2
]),
...
@@ -259,7 +223,6 @@ def test_node_dataloader():
...
@@ -259,7 +223,6 @@ def test_node_dataloader():
g2
.
nodes
[
ntype
].
data
[
'feat'
]
=
F
.
copy_to
(
F
.
randn
((
g2
.
num_nodes
(
ntype
),
8
)),
F
.
cpu
())
g2
.
nodes
[
ntype
].
data
[
'feat'
]
=
F
.
copy_to
(
F
.
randn
((
g2
.
num_nodes
(
ntype
),
8
)),
F
.
cpu
())
batch_size
=
max
(
g2
.
num_nodes
(
nty
)
for
nty
in
g2
.
ntypes
)
batch_size
=
max
(
g2
.
num_nodes
(
nty
)
for
nty
in
g2
.
ntypes
)
# return_indices = False
dataloader
=
dgl
.
dataloading
.
NodeDataLoader
(
dataloader
=
dgl
.
dataloading
.
NodeDataLoader
(
g2
,
{
nty
:
g2
.
nodes
(
nty
)
for
nty
in
g2
.
ntypes
},
g2
,
{
nty
:
g2
.
nodes
(
nty
)
for
nty
in
g2
.
ntypes
},
sampler
,
device
=
F
.
ctx
(),
batch_size
=
batch_size
)
sampler
,
device
=
F
.
ctx
(),
batch_size
=
batch_size
)
...
@@ -268,16 +231,6 @@ def test_node_dataloader():
...
@@ -268,16 +231,6 @@ def test_node_dataloader():
_check_device
(
output_nodes
)
_check_device
(
output_nodes
)
_check_device
(
blocks
)
_check_device
(
blocks
)
# return_indices = True
dataloader
=
dgl
.
dataloading
.
NodeDataLoader
(
g2
,
{
nty
:
g2
.
nodes
(
nty
)
for
nty
in
g2
.
ntypes
},
sampler
,
device
=
F
.
ctx
(),
batch_size
=
batch_size
,
return_indices
=
True
)
for
input_nodes
,
output_nodes
,
items
,
blocks
in
dataloader
:
_check_device
(
input_nodes
)
_check_device
(
output_nodes
)
_check_device
(
items
)
_check_device
(
blocks
)
def
test_edge_dataloader
():
def
test_edge_dataloader
():
sampler
=
dgl
.
dataloading
.
MultiLayerFullNeighborSampler
(
2
)
sampler
=
dgl
.
dataloading
.
MultiLayerFullNeighborSampler
(
2
)
neg_sampler
=
dgl
.
dataloading
.
negative_sampler
.
Uniform
(
2
)
neg_sampler
=
dgl
.
dataloading
.
negative_sampler
.
Uniform
(
2
)
...
@@ -285,7 +238,7 @@ def test_edge_dataloader():
...
@@ -285,7 +238,7 @@ def test_edge_dataloader():
g1
=
dgl
.
graph
(([
0
,
0
,
0
,
1
,
1
],
[
1
,
2
,
3
,
3
,
4
]))
g1
=
dgl
.
graph
(([
0
,
0
,
0
,
1
,
1
],
[
1
,
2
,
3
,
3
,
4
]))
g1
.
ndata
[
'feat'
]
=
F
.
copy_to
(
F
.
randn
((
5
,
8
)),
F
.
cpu
())
g1
.
ndata
[
'feat'
]
=
F
.
copy_to
(
F
.
randn
((
5
,
8
)),
F
.
cpu
())
#
return_indices = False &
no negative sampler
# no negative sampler
dataloader
=
dgl
.
dataloading
.
EdgeDataLoader
(
dataloader
=
dgl
.
dataloading
.
EdgeDataLoader
(
g1
,
g1
.
edges
(
form
=
'eid'
),
sampler
,
device
=
F
.
ctx
(),
batch_size
=
g1
.
num_edges
())
g1
,
g1
.
edges
(
form
=
'eid'
),
sampler
,
device
=
F
.
ctx
(),
batch_size
=
g1
.
num_edges
())
for
input_nodes
,
pos_pair_graph
,
blocks
in
dataloader
:
for
input_nodes
,
pos_pair_graph
,
blocks
in
dataloader
:
...
@@ -293,7 +246,7 @@ def test_edge_dataloader():
...
@@ -293,7 +246,7 @@ def test_edge_dataloader():
_check_device
(
pos_pair_graph
)
_check_device
(
pos_pair_graph
)
_check_device
(
blocks
)
_check_device
(
blocks
)
#
return_indices = False &
negative sampler
# negative sampler
dataloader
=
dgl
.
dataloading
.
EdgeDataLoader
(
dataloader
=
dgl
.
dataloading
.
EdgeDataLoader
(
g1
,
g1
.
edges
(
form
=
'eid'
),
sampler
,
device
=
F
.
ctx
(),
g1
,
g1
.
edges
(
form
=
'eid'
),
sampler
,
device
=
F
.
ctx
(),
negative_sampler
=
neg_sampler
,
batch_size
=
g1
.
num_edges
())
negative_sampler
=
neg_sampler
,
batch_size
=
g1
.
num_edges
())
...
@@ -313,26 +266,24 @@ def test_edge_dataloader():
...
@@ -313,26 +266,24 @@ def test_edge_dataloader():
g2
.
nodes
[
ntype
].
data
[
'feat'
]
=
F
.
copy_to
(
F
.
randn
((
g2
.
num_nodes
(
ntype
),
8
)),
F
.
cpu
())
g2
.
nodes
[
ntype
].
data
[
'feat'
]
=
F
.
copy_to
(
F
.
randn
((
g2
.
num_nodes
(
ntype
),
8
)),
F
.
cpu
())
batch_size
=
max
(
g2
.
num_edges
(
ety
)
for
ety
in
g2
.
canonical_etypes
)
batch_size
=
max
(
g2
.
num_edges
(
ety
)
for
ety
in
g2
.
canonical_etypes
)
#
return_indices = True &
no negative sampler
# no negative sampler
dataloader
=
dgl
.
dataloading
.
EdgeDataLoader
(
dataloader
=
dgl
.
dataloading
.
EdgeDataLoader
(
g2
,
{
ety
:
g2
.
edges
(
form
=
'eid'
,
etype
=
ety
)
for
ety
in
g2
.
canonical_etypes
},
g2
,
{
ety
:
g2
.
edges
(
form
=
'eid'
,
etype
=
ety
)
for
ety
in
g2
.
canonical_etypes
},
sampler
,
device
=
F
.
ctx
(),
batch_size
=
batch_size
,
return_indices
=
True
)
sampler
,
device
=
F
.
ctx
(),
batch_size
=
batch_size
)
for
input_nodes
,
pos_pair_graph
,
items
,
blocks
in
dataloader
:
for
input_nodes
,
pos_pair_graph
,
blocks
in
dataloader
:
_check_device
(
input_nodes
)
_check_device
(
input_nodes
)
_check_device
(
pos_pair_graph
)
_check_device
(
pos_pair_graph
)
_check_device
(
items
)
_check_device
(
blocks
)
_check_device
(
blocks
)
#
return_indices = True &
negative sampler
# negative sampler
dataloader
=
dgl
.
dataloading
.
EdgeDataLoader
(
dataloader
=
dgl
.
dataloading
.
EdgeDataLoader
(
g2
,
{
ety
:
g2
.
edges
(
form
=
'eid'
,
etype
=
ety
)
for
ety
in
g2
.
canonical_etypes
},
g2
,
{
ety
:
g2
.
edges
(
form
=
'eid'
,
etype
=
ety
)
for
ety
in
g2
.
canonical_etypes
},
sampler
,
device
=
F
.
ctx
(),
negative_sampler
=
neg_sampler
,
sampler
,
device
=
F
.
ctx
(),
negative_sampler
=
neg_sampler
,
batch_size
=
batch_size
,
return_indices
=
True
)
batch_size
=
batch_size
)
for
input_nodes
,
pos_pair_graph
,
neg_pair_graph
,
items
,
blocks
in
dataloader
:
for
input_nodes
,
pos_pair_graph
,
neg_pair_graph
,
blocks
in
dataloader
:
_check_device
(
input_nodes
)
_check_device
(
input_nodes
)
_check_device
(
pos_pair_graph
)
_check_device
(
pos_pair_graph
)
_check_device
(
neg_pair_graph
)
_check_device
(
neg_pair_graph
)
_check_device
(
items
)
_check_device
(
blocks
)
_check_device
(
blocks
)
if
__name__
==
'__main__'
:
if
__name__
==
'__main__'
:
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment