Unverified Commit be444e52 authored by Mufei Li's avatar Mufei Li Committed by GitHub
Browse files

[Doc/Feature] Refactor, doc update and behavior fix for graphs (#1983)



* Update graph

* Fix for dgl.graph

* from_scipy

* Replace canonical_etypes with relations

* from_networkx

* Update for hetero_from_relations

* Roll back the change of canonical_etypes to relations

* heterograph

* bipartite

* Update doc

* Fix lint

* Fix lint

* Fix test cases

* Fix

* Fix

* Fix

* Fix

* Fix

* Fix

* Update

* Fix test

* Fix

* Update

* Use DGLError

* Update

* Update

* Update

* Update

* Fix

* Fix

* Fix

* Fix

* Fix

* Fix

* Fix

* Fix

* Update

* Fix

* Update

* Fix

* Fix

* Fix

* Update

* Fix

* Update

* Fix

* Update

* Update

* Update

* Update

* Update

* Update

* Update

* Fix

* Fix

* Update

* Update

* Update

* Update

* Update

* Update

* rewrite sanity checks

* delete unnecessary checks

* Update

* Update

* Update

* Update

* Update

* Update

* Update

* Update

* Fix

* Update

* Update

* Update

* Fix

* Fix

* Fix

* Update

* Fix

* Update

* Fix

* Fix

* Update

* Fix

* Update

* Fix
Co-authored-by: default avatarxiang song(charlie.song) <classicxsong@gmail.com>
Co-authored-by: default avatarMinjie Wang <wmjlyjemaine@gmail.com>
Co-authored-by: default avatarQuan Gan <coin2028@hotmail.com>
parent 0afc3cf8
...@@ -21,114 +21,78 @@ def create_test_heterograph(idtype): ...@@ -21,114 +21,78 @@ def create_test_heterograph(idtype):
# ('user', 'wishes', 'game'), # ('user', 'wishes', 'game'),
# ('developer', 'develops', 'game')]) # ('developer', 'develops', 'game')])
plays_spmat = ssp.coo_matrix(([1, 1, 1, 1], ([0, 1, 2, 1], [0, 0, 1, 1]))) g = dgl.heterograph({
wishes_nx = nx.DiGraph() ('user', 'follows', 'user'): ([0, 1], [1, 2]),
wishes_nx.add_nodes_from(['u0', 'u1', 'u2'], bipartite=0) ('user', 'plays', 'game'): ([0, 1, 2, 1], [0, 0, 1, 1]),
wishes_nx.add_nodes_from(['g0', 'g1'], bipartite=1) ('user', 'wishes', 'game'): ([0, 2], [1, 0]),
wishes_nx.add_edge('u0', 'g1', id=0) ('developer', 'develops', 'game'): ([0, 1], [0, 1])
wishes_nx.add_edge('u2', 'g0', id=1) }, idtype=idtype, device=F.ctx())
follows_g = dgl.graph([(0, 1), (1, 2)], 'user', 'follows', idtype=idtype, device=F.ctx())
plays_g = dgl.bipartite(plays_spmat, 'user', 'plays', 'game', idtype=idtype, device=F.ctx())
wishes_g = dgl.bipartite(wishes_nx, 'user', 'wishes', 'game', idtype=idtype, device=F.ctx())
develops_g = dgl.bipartite([(0, 0), (1, 1)], 'developer', 'develops', 'game', idtype=idtype, device=F.ctx())
assert follows_g.idtype == idtype
assert plays_g.idtype == idtype
assert wishes_g.idtype == idtype
assert develops_g.idtype == idtype
g = dgl.hetero_from_relations([follows_g, plays_g, wishes_g, develops_g])
assert g.idtype == idtype assert g.idtype == idtype
assert g.device == F.ctx() assert g.device == F.ctx()
return g return g
def create_test_heterograph1(idtype): def create_test_heterograph1(idtype):
edges = [] edges = []
edges.extend([(0,1), (1,2)]) # follows edges.extend([(0, 1), (1, 2)]) # follows
edges.extend([(0,3), (1,3), (2,4), (1,4)]) # plays edges.extend([(0, 3), (1, 3), (2, 4), (1, 4)]) # plays
edges.extend([(0,4), (2,3)]) # wishes edges.extend([(0, 4), (2, 3)]) # wishes
edges.extend([(5,3), (6,4)]) # develops edges.extend([(5, 3), (6, 4)]) # develops
edges = tuple(zip(*edges))
ntypes = F.tensor([0, 0, 0, 1, 1, 2, 2]) ntypes = F.tensor([0, 0, 0, 1, 1, 2, 2])
etypes = F.tensor([0, 0, 1, 1, 1, 1, 2, 2, 3, 3]) etypes = F.tensor([0, 0, 1, 1, 1, 1, 2, 2, 3, 3])
g0 = dgl.graph(edges, idtype=idtype, device=F.ctx()) g0 = dgl.graph(edges, idtype=idtype, device=F.ctx())
g0.ndata[dgl.NTYPE] = ntypes g0.ndata[dgl.NTYPE] = ntypes
g0.edata[dgl.ETYPE] = etypes g0.edata[dgl.ETYPE] = etypes
return dgl.to_hetero(g0, ['user', 'game', 'developer'], ['follows', 'plays', 'wishes', 'develops']) return dgl.to_heterogeneous(g0, ['user', 'game', 'developer'],
['follows', 'plays', 'wishes', 'develops'])
def create_test_heterograph2(idtype): def create_test_heterograph2(idtype):
plays_spmat = ssp.coo_matrix(([1, 1, 1, 1], ([0, 1, 2, 1], [0, 0, 1, 1])))
wishes_nx = nx.DiGraph()
wishes_nx.add_nodes_from(['u0', 'u1', 'u2'], bipartite=0)
wishes_nx.add_nodes_from(['g0', 'g1'], bipartite=1)
wishes_nx.add_edge('u0', 'g1', id=0)
wishes_nx.add_edge('u2', 'g0', id=1)
g = dgl.heterograph({ g = dgl.heterograph({
('user', 'follows', 'user'): [(0, 1), (1, 2)], ('user', 'follows', 'user'): ([0, 1], [1, 2]),
('user', 'plays', 'game'): plays_spmat, ('user', 'plays', 'game'): ([0, 1, 2, 1], [0, 0, 1, 1]),
('user', 'wishes', 'game'): wishes_nx, ('user', 'wishes', 'game'): ([0, 2], [1, 0]),
('developer', 'develops', 'game'): (F.tensor([0, 1]), F.tensor([0, 1])), ('developer', 'develops', 'game'): ([0, 1], [0, 1]),
}, idtype=idtype, device=F.ctx()) }, idtype=idtype, device=F.ctx())
assert g.idtype == idtype assert g.idtype == idtype
assert g.device == F.ctx() assert g.device == F.ctx()
return g return g
def create_test_heterograph3(idtype): def create_test_heterograph3(idtype):
device = F.ctx()
plays_spmat = ssp.coo_matrix(([1, 1, 1, 1], ([0, 1, 2, 1], [0, 0, 1, 1])))
wishes_nx = nx.DiGraph()
wishes_nx.add_nodes_from(['u0', 'u1', 'u2'], bipartite=0)
wishes_nx.add_nodes_from(['g0', 'g1'], bipartite=1)
wishes_nx.add_edge('u0', 'g1', id=0)
wishes_nx.add_edge('u2', 'g0', id=1)
follows_g = dgl.graph([(0, 1), (1, 2)], 'user', 'follows',
idtype=idtype, device=device, formats='coo')
plays_g = dgl.bipartite([(0, 0), (1, 0), (2, 1), (1, 1)], 'user', 'plays', 'game',
idtype=idtype, device=device, formats='coo')
wishes_g = dgl.bipartite([(0, 1), (2, 0)], 'user', 'wishes', 'game',
idtype=idtype, device=device, formats='coo')
develops_g = dgl.bipartite([(0, 0), (1, 1)], 'developer', 'develops', 'game',
idtype=idtype, device=device, formats='coo')
g = dgl.hetero_from_relations([follows_g, plays_g, wishes_g, develops_g])
assert g.idtype == idtype
assert g.device == device
return g
def create_test_heterograph4(idtype):
g = dgl.heterograph({ g = dgl.heterograph({
('user', 'plays', 'game'): (F.tensor([0, 1, 1, 2], dtype=idtype), ('user', 'plays', 'game'): (F.tensor([0, 1, 1, 2], dtype=idtype),
F.tensor([0, 0, 1, 1], dtype=idtype)), F.tensor([0, 0, 1, 1], dtype=idtype)),
('developer', 'develops', 'game'): (F.tensor([0, 1], dtype=idtype), ('developer', 'develops', 'game'): (F.tensor([0, 1], dtype=idtype),
F.tensor([0, 1], dtype=idtype))}, F.tensor([0, 1], dtype=idtype))},
idtype=idtype, device=F.ctx()) idtype=idtype, device=F.ctx())
g.ndata['h'] = {'user' : F.copy_to(F.tensor([1, 1, 1], dtype=idtype), ctx=F.ctx()),
'game' : F.copy_to(F.tensor([2, 2], dtype=idtype), ctx=F.ctx()), g.nodes['user'].data['h'] = F.copy_to(F.tensor([1, 1, 1], dtype=idtype), ctx=F.ctx())
'developer' : F.copy_to(F.tensor([3, 3], dtype=idtype), ctx=F.ctx())} g.nodes['game'].data['h'] = F.copy_to(F.tensor([2, 2], dtype=idtype), ctx=F.ctx())
g.nodes['developer'].data['h'] = F.copy_to(F.tensor([3, 3], dtype=idtype), ctx=F.ctx())
g.edges['plays'].data['h'] = F.copy_to(F.tensor([1, 1, 1, 1], dtype=idtype), ctx=F.ctx()) g.edges['plays'].data['h'] = F.copy_to(F.tensor([1, 1, 1, 1], dtype=idtype), ctx=F.ctx())
return g return g
def create_test_heterograph5(idtype): def create_test_heterograph4(idtype):
g = dgl.heterograph({ g = dgl.heterograph({
('user', 'follows', 'user'): (F.tensor([0, 1, 1, 2, 2, 2], dtype=idtype), ('user', 'follows', 'user'): (F.tensor([0, 1, 1, 2, 2, 2], dtype=idtype),
F.tensor([0, 0, 1, 1, 2, 2], dtype=idtype)), F.tensor([0, 0, 1, 1, 2, 2], dtype=idtype)),
('user', 'plays', 'game'): (F.tensor([0, 1], dtype=idtype), ('user', 'plays', 'game'): (F.tensor([0, 1], dtype=idtype),
F.tensor([0, 1], dtype=idtype))}, F.tensor([0, 1], dtype=idtype))},
idtype=idtype, device=F.ctx()) idtype=idtype, device=F.ctx())
g.ndata['h'] = {'user' : F.copy_to(F.tensor([1, 1, 1], dtype=idtype), ctx=F.ctx()), g.nodes['user'].data['h'] = F.copy_to(F.tensor([1, 1, 1], dtype=idtype), ctx=F.ctx())
'game' : F.copy_to(F.tensor([2, 2], dtype=idtype), ctx=F.ctx())} g.nodes['game'].data['h'] = F.copy_to(F.tensor([2, 2], dtype=idtype), ctx=F.ctx())
g.edges['follows'].data['h'] = F.copy_to(F.tensor([1, 2, 3, 4, 5, 6], dtype=idtype), ctx=F.ctx()) g.edges['follows'].data['h'] = F.copy_to(F.tensor([1, 2, 3, 4, 5, 6], dtype=idtype), ctx=F.ctx())
g.edges['plays'].data['h'] = F.copy_to(F.tensor([1, 2], dtype=idtype), ctx=F.ctx()) g.edges['plays'].data['h'] = F.copy_to(F.tensor([1, 2], dtype=idtype), ctx=F.ctx())
return g return g
def create_test_heterograph6(idtype): def create_test_heterograph5(idtype):
g = dgl.heterograph({ g = dgl.heterograph({
('user', 'follows', 'user'): (F.tensor([1, 2], dtype=idtype), ('user', 'follows', 'user'): (F.tensor([1, 2], dtype=idtype),
F.tensor([0, 1], dtype=idtype)), F.tensor([0, 1], dtype=idtype)),
('user', 'plays', 'game'): (F.tensor([0, 1], dtype=idtype), ('user', 'plays', 'game'): (F.tensor([0, 1], dtype=idtype),
F.tensor([0, 1], dtype=idtype))}, F.tensor([0, 1], dtype=idtype))},
idtype=idtype, device=F.ctx()) idtype=idtype, device=F.ctx())
g.ndata['h'] = {'user' : F.copy_to(F.tensor([1, 1, 1], dtype=idtype), ctx=F.ctx()), g.nodes['user'].data['h'] = F.copy_to(F.tensor([1, 1, 1], dtype=idtype), ctx=F.ctx())
'game' : F.copy_to(F.tensor([2, 2], dtype=idtype), ctx=F.ctx())} g.nodes['game'].data['h'] = F.copy_to(F.tensor([2, 2], dtype=idtype), ctx=F.ctx())
g.edges['follows'].data['h'] = F.copy_to(F.tensor([1, 2], dtype=idtype), ctx=F.ctx()) g.edges['follows'].data['h'] = F.copy_to(F.tensor([1, 2], dtype=idtype), ctx=F.ctx())
g.edges['plays'].data['h'] = F.copy_to(F.tensor([1, 2], dtype=idtype), ctx=F.ctx()) g.edges['plays'].data['h'] = F.copy_to(F.tensor([1, 2], dtype=idtype), ctx=F.ctx())
return g return g
...@@ -145,32 +109,71 @@ def test_create(idtype): ...@@ -145,32 +109,71 @@ def test_create(idtype):
assert set(g0.ntypes) == set(g1.ntypes) == set(g2.ntypes) assert set(g0.ntypes) == set(g1.ntypes) == set(g2.ntypes)
assert set(g0.canonical_etypes) == set(g1.canonical_etypes) == set(g2.canonical_etypes) assert set(g0.canonical_etypes) == set(g1.canonical_etypes) == set(g2.canonical_etypes)
# create from nx complete bipartite graph # Create a bipartite graph from a SciPy matrix
nxg = nx.complete_bipartite_graph(3, 4) src_ids = np.array([2, 3, 4])
g = dgl.bipartite(nxg, 'user', 'plays', 'game', idtype=idtype, device=device) dst_ids = np.array([1, 2, 3])
assert g.ntypes == ['user', 'game'] eweight = np.array([0.2, 0.3, 0.5])
assert g.etypes == ['plays'] sp_mat = ssp.coo_matrix((eweight, (src_ids, dst_ids)))
assert g.number_of_edges() == 12 g = dgl.bipartite_from_scipy(sp_mat, utype='user', etype='plays',
vtype='game', idtype=idtype, device=device)
assert g.idtype == idtype
assert g.device == device
assert g.num_src_nodes() == 5
assert g.num_dst_nodes() == 4
assert g.num_edges() == 3
src, dst = g.edges()
assert F.allclose(src, F.tensor([2, 3, 4], dtype=idtype))
assert F.allclose(dst, F.tensor([1, 2, 3], dtype=idtype))
g = dgl.bipartite_from_scipy(sp_mat, utype='_U', etype='_E', vtype='_V',
eweight_name='w', idtype=idtype, device=device)
assert F.allclose(g.edata['w'], F.tensor(eweight))
# Create a bipartite graph from a NetworkX graph
nx_g = nx.DiGraph()
nx_g.add_nodes_from([1, 3], bipartite=0, feat1=np.zeros((2)), feat2=np.ones((2)))
nx_g.add_nodes_from([2, 4, 5], bipartite=1, feat3=np.zeros((3)))
nx_g.add_edge(1, 4, weight=np.ones((1)), eid=np.array([1]))
nx_g.add_edge(3, 5, weight=np.ones((1)), eid=np.array([0]))
g = dgl.bipartite_from_networkx(nx_g, utype='user', etype='plays',
vtype='game', idtype=idtype, device=device)
assert g.idtype == idtype assert g.idtype == idtype
assert g.device == device assert g.device == device
assert g.num_src_nodes() == 2
assert g.num_dst_nodes() == 3
assert g.num_edges() == 2
src, dst = g.edges()
assert F.allclose(src, F.tensor([0, 1], dtype=idtype))
assert F.allclose(dst, F.tensor([1, 2], dtype=idtype))
g = dgl.bipartite_from_networkx(nx_g, utype='_U', etype='_E', vtype='V',
u_attrs=['feat1', 'feat2'],
e_attrs = ['weight'], v_attrs = ['feat3'])
assert F.allclose(g.srcdata['feat1'], F.tensor(np.zeros((2, 2))))
assert F.allclose(g.srcdata['feat2'], F.tensor(np.ones((2, 2))))
assert F.allclose(g.dstdata['feat3'], F.tensor(np.zeros((3, 3))))
assert F.allclose(g.edata['weight'], F.tensor(np.ones((2, 1))))
g = dgl.bipartite_from_networkx(nx_g, utype='_U', etype='_E', vtype='V',
edge_id_attr_name='eid', idtype=idtype, device=device)
src, dst = g.edges()
assert F.allclose(src, F.tensor([1, 0], dtype=idtype))
assert F.allclose(dst, F.tensor([2, 1], dtype=idtype))
# create from scipy # create from scipy
spmat = ssp.coo_matrix(([1,1,1], ([0, 0, 1], [2, 3, 2])), shape=(4, 4)) spmat = ssp.coo_matrix(([1,1,1], ([0, 0, 1], [2, 3, 2])), shape=(4, 4))
g = dgl.graph(spmat, idtype=idtype, device=device) g = dgl.from_scipy(spmat, idtype=idtype, device=device)
assert g.number_of_nodes() == 4 assert g.num_nodes() == 4
assert g.number_of_edges() == 3 assert g.num_edges() == 3
assert g.idtype == idtype assert g.idtype == idtype
assert g.device == device assert g.device == device
# test inferring number of nodes for heterograph # test inferring number of nodes for heterograph
g = dgl.heterograph({ g = dgl.heterograph({
('l0', 'e0', 'l1'): [(0, 1), (0, 2)], ('l0', 'e0', 'l1'): ([0, 0], [1, 2]),
('l0', 'e1', 'l2'): [(2, 2)], ('l0', 'e1', 'l2'): ([2], [2]),
('l2', 'e2', 'l2'): [(1, 1), (3, 3)], ('l2', 'e2', 'l2'): ([1, 3], [1, 3])
}, idtype=idtype, device=device) }, idtype=idtype, device=device)
assert g.number_of_nodes('l0') == 3 assert g.num_nodes('l0') == 3
assert g.number_of_nodes('l1') == 3 assert g.num_nodes('l1') == 3
assert g.number_of_nodes('l2') == 4 assert g.num_nodes('l2') == 4
assert g.idtype == idtype assert g.idtype == idtype
assert g.device == device assert g.device == device
...@@ -180,18 +183,14 @@ def test_create(idtype): ...@@ -180,18 +183,14 @@ def test_create(idtype):
g = dgl.graph( g = dgl.graph(
([0, 0, 0, 1, 1, 2], [0, 1, 2, 0, 1, 2]), ([0, 0, 0, 1, 1, 2], [0, 1, 2, 0, 1, 2]),
num_nodes=2, num_nodes=2,
validate=True,
idtype=idtype, device=device idtype=idtype, device=device
) )
# bipartite graph # bipartite graph
def _test_validate_bipartite(card): def _test_validate_bipartite(card):
with pytest.raises(DGLError): with pytest.raises(DGLError):
g = dgl.bipartite( g = dgl.heterograph({
([0, 0, 1, 1, 2], [1, 1, 2, 2, 3]), ('_U', '_E', '_V'): ([0, 0, 1, 1, 2], [1, 1, 2, 2, 3])
num_nodes=card, }, {'_U': card[0], '_V': card[1]}, idtype=idtype, device=device)
validate=True,
idtype=idtype, device=device
)
_test_validate_bipartite((3, 3)) _test_validate_bipartite((3, 3))
_test_validate_bipartite((2, 4)) _test_validate_bipartite((2, 4))
...@@ -237,10 +236,10 @@ def test_query(idtype): ...@@ -237,10 +236,10 @@ def test_query(idtype):
def _test(g): def _test(g):
# number of nodes # number of nodes
assert [g.number_of_nodes(ntype) for ntype in ntypes] == [3, 2, 2] assert [g.num_nodes(ntype) for ntype in ntypes] == [3, 2, 2]
# number of edges # number of edges
assert [g.number_of_edges(etype) for etype in etypes] == [2, 4, 2, 2] assert [g.num_edges(etype) for etype in etypes] == [2, 4, 2, 2]
# has_node & has_nodes # has_node & has_nodes
for ntype in ntypes: for ntype in ntypes:
...@@ -337,7 +336,7 @@ def test_query(idtype): ...@@ -337,7 +336,7 @@ def test_query(idtype):
_test(g) _test(g)
if F._default_context_str != 'gpu': if F._default_context_str != 'gpu':
# XXX: CUDA COO operators have not been live yet. # XXX: CUDA COO operators have not been live yet.
g = create_test_heterograph3(idtype) g = create_test_heterograph2(idtype)
_test(g) _test(g)
etypes = canonical_etypes etypes = canonical_etypes
...@@ -360,7 +359,7 @@ def test_query(idtype): ...@@ -360,7 +359,7 @@ def test_query(idtype):
_test(g) _test(g)
if F._default_context_str != 'gpu': if F._default_context_str != 'gpu':
# XXX: CUDA COO operators have not been live yet. # XXX: CUDA COO operators have not been live yet.
g = create_test_heterograph3(idtype) g = create_test_heterograph2(idtype)
_test(g) _test(g)
# test repr # test repr
...@@ -372,10 +371,10 @@ def test_hypersparse(): ...@@ -372,10 +371,10 @@ def test_hypersparse():
N2 = 1 << 48 N2 = 1 << 48
g = dgl.heterograph({ g = dgl.heterograph({
('user', 'follows', 'user'): [(0, 1)], ('user', 'follows', 'user'): (F.tensor([0], F.int64), F.tensor([1], F.int64)),
('user', 'plays', 'game'): [(0, N2)]}, ('user', 'plays', 'game'): (F.tensor([0], F.int64), F.tensor([N2], F.int64))},
{'user': N1, 'game': N1}, {'user': N1, 'game': N1},
idtype=F.int64, device=F.ctx()) device=F.ctx())
assert g.number_of_nodes('user') == N1 assert g.number_of_nodes('user') == N1
assert g.number_of_nodes('game') == N1 assert g.number_of_nodes('game') == N1
assert g.number_of_edges('follows') == 1 assert g.number_of_edges('follows') == 1
...@@ -437,16 +436,16 @@ def test_edge_ids(): ...@@ -437,16 +436,16 @@ def test_edge_ids():
N2 = 1 << 48 N2 = 1 << 48
g = dgl.heterograph({ g = dgl.heterograph({
('user', 'follows', 'user'): [(0, 1)], ('user', 'follows', 'user'): (F.tensor([0], F.int64), F.tensor([1], F.int64)),
('user', 'plays', 'game'): [(0, N2)]}, ('user', 'plays', 'game'): (F.tensor([0], F.int64), F.tensor([N2], F.int64))},
{'user': N1, 'game': N1}) {'user': N1, 'game': N1})
with pytest.raises(DGLError): with pytest.raises(DGLError):
eid = g.edge_ids(0, 0, etype='follows') eid = g.edge_ids(0, 0, etype='follows')
g2 = dgl.heterograph({ g2 = dgl.heterograph({
('user', 'follows', 'user'): [(0, 1), (0, 1)], ('user', 'follows', 'user'): (F.tensor([0, 0], F.int64), F.tensor([1, 1], F.int64)),
('user', 'plays', 'game'): [(0, N2)]}, ('user', 'plays', 'game'): (F.tensor([0], F.int64), F.tensor([N2], F.int64))},
{'user': N1, 'game': N1}) {'user': N1, 'game': N1}, device=F.cpu())
eid = g2.edge_ids(0, 1, etype='follows') eid = g2.edge_ids(0, 1, etype='follows')
assert eid == 0 assert eid == 0
...@@ -510,7 +509,6 @@ def test_adj(idtype): ...@@ -510,7 +509,6 @@ def test_adj(idtype):
@parametrize_dtype @parametrize_dtype
def test_inc(idtype): def test_inc(idtype):
g = create_test_heterograph(idtype) g = create_test_heterograph(idtype)
#follows_g = dgl.graph([(0, 1), (1, 2)], 'user', 'follows')
adj = F.sparse_to_numpy(g['follows'].inc('in')) adj = F.sparse_to_numpy(g['follows'].inc('in'))
assert np.allclose( assert np.allclose(
adj, adj,
...@@ -550,7 +548,9 @@ def test_inc(idtype): ...@@ -550,7 +548,9 @@ def test_inc(idtype):
@parametrize_dtype @parametrize_dtype
def test_view(idtype): def test_view(idtype):
# test single node type # test single node type
g = dgl.graph([(0, 1), (1, 2)], 'user', 'follows', idtype=idtype, device=F.ctx()) g = dgl.heterograph({
('user', 'follows', 'user'): ([0, 1], [1, 2])
}, idtype=idtype, device=F.ctx())
f1 = F.randn((3, 6)) f1 = F.randn((3, 6))
g.ndata['h'] = f1 g.ndata['h'] = f1
f2 = g.nodes['user'].data['h'] f2 = g.nodes['user'].data['h']
...@@ -593,20 +593,6 @@ def test_view(idtype): ...@@ -593,20 +593,6 @@ def test_view(idtype):
except Exception: except Exception:
fail = True fail = True
assert fail assert fail
g.ndata['h'] = {'user' : f1,
'game' : f2}
f3 = g.nodes['user'].data['h']
f4 = g.nodes['game'].data['h']
assert F.array_equal(f1, f3)
assert F.array_equal(f2, f4)
data = g.ndata['h']
assert F.array_equal(f1, data['user'])
assert F.array_equal(f2, data['game'])
# test repr
print(g.ndata)
g.ndata.pop('h')
# test repr
print(g.ndata)
f3 = F.randn((2, 4)) f3 = F.randn((2, 4))
g.edges['user', 'follows', 'user'].data['h'] = f3 g.edges['user', 'follows', 'user'].data['h'] = f3
...@@ -624,18 +610,6 @@ def test_view(idtype): ...@@ -624,18 +610,6 @@ def test_view(idtype):
except Exception: except Exception:
fail = True fail = True
assert fail assert fail
g.edata['h'] = {('user', 'follows', 'user') : f3}
f4 = g.edges['user', 'follows', 'user'].data['h']
f5 = g.edges['follows'].data['h']
assert F.array_equal(f3, f4)
assert F.array_equal(f3, f5)
data = g.edata['h']
assert F.array_equal(f3, data[('user', 'follows', 'user')])
# test repr
print(g.edata)
g.edata.pop('h')
# test repr
print(g.edata)
# test srcdata # test srcdata
f1 = F.randn((3, 6)) f1 = F.randn((3, 6))
...@@ -645,28 +619,6 @@ def test_view(idtype): ...@@ -645,28 +619,6 @@ def test_view(idtype):
assert F.array_equal(g.srcnodes('user'), F.arange(0, 3, idtype)) assert F.array_equal(g.srcnodes('user'), F.arange(0, 3, idtype))
g.srcnodes['user'].data.pop('h') g.srcnodes['user'].data.pop('h')
# multi type ndata
f1 = F.randn((3, 6))
f2 = F.randn((2, 6))
fail = False
try:
g.srcdata['h'] = f1
except Exception:
fail = True
assert fail
g.srcdata['h'] = {'user' : f1,
'developer' : f2}
f3 = g.srcnodes['user'].data['h']
f4 = g.srcnodes['developer'].data['h']
assert F.array_equal(f1, f3)
assert F.array_equal(f2, f4)
data = g.srcdata['h']
assert F.array_equal(f1, data['user'])
assert F.array_equal(f2, data['developer'])
# test repr
print(g.srcdata)
g.srcdata.pop('h')
# test dstdata # test dstdata
f1 = F.randn((3, 6)) f1 = F.randn((3, 6))
g.dstnodes['user'].data['h'] = f1 # ok g.dstnodes['user'].data['h'] = f1 # ok
...@@ -675,28 +627,6 @@ def test_view(idtype): ...@@ -675,28 +627,6 @@ def test_view(idtype):
assert F.array_equal(g.dstnodes('user'), F.arange(0, 3, idtype)) assert F.array_equal(g.dstnodes('user'), F.arange(0, 3, idtype))
g.dstnodes['user'].data.pop('h') g.dstnodes['user'].data.pop('h')
# multi type ndata
f1 = F.randn((3, 6))
f2 = F.randn((2, 6))
fail = False
try:
g.dstdata['h'] = f1
except Exception:
fail = True
assert fail
g.dstdata['h'] = {'user' : f1,
'game' : f2}
f3 = g.dstnodes['user'].data['h']
f4 = g.dstnodes['game'].data['h']
assert F.array_equal(f1, f3)
assert F.array_equal(f2, f4)
data = g.dstdata['h']
assert F.array_equal(f1, data['user'])
assert F.array_equal(f2, data['game'])
# test repr
print(g.dstdata)
g.dstdata.pop('h')
@parametrize_dtype @parametrize_dtype
def test_view1(idtype): def test_view1(idtype):
# test relation view # test relation view
...@@ -826,15 +756,6 @@ def test_view1(idtype): ...@@ -826,15 +756,6 @@ def test_view1(idtype):
assert F.array_equal(f3, f4) assert F.array_equal(f3, f4)
assert F.array_equal(g.edges(form='eid'), F.arange(0, 2, g.idtype)) assert F.array_equal(g.edges(form='eid'), F.arange(0, 2, g.idtype))
# multiple types
ndata = HG.ndata['h']
assert isinstance(ndata, dict)
assert F.array_equal(ndata['user'], f2)
edata = HG.edata['h']
assert isinstance(edata, dict)
assert F.array_equal(edata[('user', 'follows', 'user')], f4)
@parametrize_dtype @parametrize_dtype
def test_flatten(idtype): def test_flatten(idtype):
def check_mapping(g, fg): def check_mapping(g, fg):
...@@ -881,7 +802,7 @@ def test_flatten(idtype): ...@@ -881,7 +802,7 @@ def test_flatten(idtype):
etypes = F.asnumpy(fg.edata[dgl.ETYPE]).tolist() etypes = F.asnumpy(fg.edata[dgl.ETYPE]).tolist()
eids = F.asnumpy(fg.edata[dgl.EID]).tolist() eids = F.asnumpy(fg.edata[dgl.EID]).tolist()
assert set(zip(etypes, eids)) == set([(1, 0), (1, 1), (1, 2), (1, 3), (2, 0), (2, 1)]) assert set(zip(etypes, eids)) == set([(3, 0), (3, 1), (2, 1), (2, 0), (2, 3), (2, 2)])
check_mapping(g, fg) check_mapping(g, fg)
...@@ -915,18 +836,14 @@ def test_flatten(idtype): ...@@ -915,18 +836,14 @@ def test_flatten(idtype):
check_mapping(g, fg) check_mapping(g, fg)
# Test another heterograph # Test another heterograph
g_x = dgl.graph(([0, 1, 2], [1, 2, 3]), 'user', 'follows', idtype=idtype, device=F.ctx()) g = dgl.heterograph({
g_y = dgl.graph(([0, 2], [2, 3]), 'user', 'knows', idtype=idtype, device=F.ctx()) ('user', 'follows', 'user'): ([0, 1, 2], [1, 2, 3]),
g_x.nodes['user'].data['h'] = F.randn((4, 3)) ('user', 'knows', 'user'): ([0, 2], [2, 3])
g_x.edges['follows'].data['w'] = F.randn((3, 2)) }, idtype=idtype, device=F.ctx())
g_y.nodes['user'].data['hh'] = F.randn((4, 5)) g.nodes['user'].data['h'] = F.randn((4, 3))
g_y.edges['knows'].data['ww'] = F.randn((2, 10)) g.edges['follows'].data['w'] = F.randn((3, 2))
g = dgl.hetero_from_relations([g_x, g_y]) g.nodes['user'].data['hh'] = F.randn((4, 5))
g.edges['knows'].data['ww'] = F.randn((2, 10))
assert F.array_equal(g.ndata['h'], g_x.ndata['h'])
assert F.array_equal(g.ndata['hh'], g_y.ndata['hh'])
assert F.array_equal(g.edges['follows'].data['w'], g_x.edata['w'])
assert F.array_equal(g.edges['knows'].data['ww'], g_y.edata['ww'])
fg = g['user', :, 'user'] fg = g['user', :, 'user']
assert fg.idtype == g.idtype assert fg.idtype == g.idtype
...@@ -1002,16 +919,18 @@ def test_to_device2(g, idtype): ...@@ -1002,16 +919,18 @@ def test_to_device2(g, idtype):
def test_convert_bound(idtype): def test_convert_bound(idtype):
def _test_bipartite_bound(data, card): def _test_bipartite_bound(data, card):
with pytest.raises(DGLError): with pytest.raises(DGLError):
dgl.bipartite(data, num_nodes=card, idtype=idtype, device=F.ctx()) dgl.heterograph({
('_U', '_E', '_V'): data
}, {'_U': card[0], '_V': card[1]}, idtype=idtype, device=F.ctx())
def _test_graph_bound(data, card): def _test_graph_bound(data, card):
with pytest.raises(DGLError): with pytest.raises(DGLError):
dgl.graph(data, num_nodes=card, idtype=idtype, device=F.ctx()) dgl.graph(data, num_nodes=card, idtype=idtype, device=F.ctx())
_test_bipartite_bound(([1,2],[1,2]),(2,3)) _test_bipartite_bound(([1, 2], [1, 2]), (2, 3))
_test_bipartite_bound(([0,1],[1,4]),(2,3)) _test_bipartite_bound(([0, 1], [1, 4]), (2, 3))
_test_graph_bound(([1,3],[1,2]), 3) _test_graph_bound(([1, 3], [1, 2]), 3)
_test_graph_bound(([0,1],[1,3]),3) _test_graph_bound(([0, 1], [1, 3]), 3)
@parametrize_dtype @parametrize_dtype
...@@ -1030,7 +949,7 @@ def test_convert(idtype): ...@@ -1030,7 +949,7 @@ def test_convert(idtype):
ws.append(w) ws.append(w)
hg.edges['plays'].data['x'] = F.randn((4, 3)) hg.edges['plays'].data['x'] = F.randn((4, 3))
g = dgl.to_homo(hg) g = dgl.to_homogeneous(hg, ndata=['h'], edata=['w'])
assert g.idtype == idtype assert g.idtype == idtype
assert g.device == hg.device assert g.device == hg.device
assert F.array_equal(F.cat(hs, dim=0), g.ndata['h']) assert F.array_equal(F.cat(hs, dim=0), g.ndata['h'])
...@@ -1058,7 +977,7 @@ def test_convert(idtype): ...@@ -1058,7 +977,7 @@ def test_convert(idtype):
('developer', 'game', 'develops')]) ('developer', 'game', 'develops')])
for _mg in [None, mg]: for _mg in [None, mg]:
hg2 = dgl.to_hetero( hg2 = dgl.to_heterogeneous(
g, hg.ntypes, hg.etypes, g, hg.ntypes, hg.etypes,
ntype_field=dgl.NTYPE, etype_field=dgl.ETYPE, metagraph=_mg) ntype_field=dgl.NTYPE, etype_field=dgl.ETYPE, metagraph=_mg)
assert hg2.idtype == hg.idtype assert hg2.idtype == hg.idtype
...@@ -1076,10 +995,10 @@ def test_convert(idtype): ...@@ -1076,10 +995,10 @@ def test_convert(idtype):
assert F.array_equal(hg.edges[canonical_etype].data['w'], hg2.edges[canonical_etype].data['w']) assert F.array_equal(hg.edges[canonical_etype].data['w'], hg2.edges[canonical_etype].data['w'])
# hetero_from_homo test case 2 # hetero_from_homo test case 2
g = dgl.graph([(0, 2), (1, 2), (2, 3), (0, 3)], idtype=idtype, device=F.ctx()) g = dgl.graph(([0, 1, 2, 0], [2, 2, 3, 3]), idtype=idtype, device=F.ctx())
g.ndata[dgl.NTYPE] = F.tensor([0, 0, 1, 2]) g.ndata[dgl.NTYPE] = F.tensor([0, 0, 1, 2])
g.edata[dgl.ETYPE] = F.tensor([0, 0, 1, 2]) g.edata[dgl.ETYPE] = F.tensor([0, 0, 1, 2])
hg = dgl.to_hetero(g, ['l0', 'l1', 'l2'], ['e0', 'e1', 'e2']) hg = dgl.to_heterogeneous(g, ['l0', 'l1', 'l2'], ['e0', 'e1', 'e2'])
assert hg.idtype == idtype assert hg.idtype == idtype
assert hg.device == g.device assert hg.device == g.device
assert set(hg.canonical_etypes) == set( assert set(hg.canonical_etypes) == set(
...@@ -1095,11 +1014,11 @@ def test_convert(idtype): ...@@ -1095,11 +1014,11 @@ def test_convert(idtype):
mg = nx.MultiDiGraph([ mg = nx.MultiDiGraph([
('user', 'movie', 'watches'), ('user', 'movie', 'watches'),
('user', 'TV', 'watches')]) ('user', 'TV', 'watches')])
g = dgl.graph([(0, 1), (0, 2)], idtype=idtype, device=F.ctx()) g = dgl.graph(((0, 0), (1, 2)), idtype=idtype, device=F.ctx())
g.ndata[dgl.NTYPE] = F.tensor([0, 1, 2]) g.ndata[dgl.NTYPE] = F.tensor([0, 1, 2])
g.edata[dgl.ETYPE] = F.tensor([0, 0]) g.edata[dgl.ETYPE] = F.tensor([0, 0])
for _mg in [None, mg]: for _mg in [None, mg]:
hg = dgl.to_hetero(g, ['user', 'TV', 'movie'], ['watches'], metagraph=_mg) hg = dgl.to_heterogeneous(g, ['user', 'TV', 'movie'], ['watches'], metagraph=_mg)
assert hg.idtype == g.idtype assert hg.idtype == g.idtype
assert hg.device == g.device assert hg.device == g.device
assert set(hg.canonical_etypes) == set( assert set(hg.canonical_etypes) == set(
...@@ -1112,8 +1031,10 @@ def test_convert(idtype): ...@@ -1112,8 +1031,10 @@ def test_convert(idtype):
assert len(hg.etypes) == 2 assert len(hg.etypes) == 2
# hetero_to_homo test case 2 # hetero_to_homo test case 2
hg = dgl.bipartite([(0, 0), (1, 1)], num_nodes=(2, 3), idtype=idtype, device=F.ctx()) hg = dgl.heterograph({
g = dgl.to_homo(hg) ('_U', '_E', '_V'): ([0, 1], [0, 1])
}, {'_U': 2, '_V': 3}, idtype=idtype, device=F.ctx())
g = dgl.to_homogeneous(hg)
assert hg.idtype == g.idtype assert hg.idtype == g.idtype
assert hg.device == g.device assert hg.device == g.device
assert g.number_of_nodes() == 5 assert g.number_of_nodes() == 5
...@@ -1126,7 +1047,7 @@ def test_metagraph_reachable(idtype): ...@@ -1126,7 +1047,7 @@ def test_metagraph_reachable(idtype):
new_g = dgl.metapath_reachable_graph(g, ['follows', 'plays']) new_g = dgl.metapath_reachable_graph(g, ['follows', 'plays'])
assert new_g.idtype == idtype assert new_g.idtype == idtype
assert new_g.ntypes == ['user', 'game'] assert new_g.ntypes == ['game', 'user']
assert new_g.number_of_edges() == 3 assert new_g.number_of_edges() == 3
assert F.asnumpy(new_g.has_edges_between([0, 0, 1], [0, 1, 1])).all() assert F.asnumpy(new_g.has_edges_between([0, 0, 1], [0, 1, 1])).all()
...@@ -1328,20 +1249,6 @@ def test_subgraph(idtype): ...@@ -1328,20 +1249,6 @@ def test_subgraph(idtype):
sg5 = g.edge_type_subgraph(['follows', 'plays', 'wishes']) sg5 = g.edge_type_subgraph(['follows', 'plays', 'wishes'])
_check_typed_subgraph1(g, sg5) _check_typed_subgraph1(g, sg5)
# Test for restricted format
if F._default_context_str != 'gpu':
# TODO(minjie): enable this later
for fmt in ['csr', 'csc', 'coo']:
g = dgl.graph([(0, 1), (1, 2)], formats=fmt)
sg = g.subgraph({g.ntypes[0]: [1, 0]})
nids = F.asnumpy(sg.ndata[dgl.NID])
assert np.array_equal(nids, np.array([1, 0]))
src, dst = sg.edges(order='eid')
src = F.asnumpy(src)
dst = F.asnumpy(dst)
assert np.array_equal(src, np.array([1]))
assert np.array_equal(dst, np.array([0]))
@parametrize_dtype @parametrize_dtype
def test_apply(idtype): def test_apply(idtype):
def node_udf(nodes): def node_udf(nodes):
...@@ -1565,24 +1472,18 @@ def test_empty_heterograph(idtype): ...@@ -1565,24 +1472,18 @@ def test_empty_heterograph(idtype):
assert g.number_of_edges('plays') == 0 assert g.number_of_edges('plays') == 0
assert g.number_of_nodes('game') == 0 assert g.number_of_nodes('game') == 0
# empty edge list
assert_empty(dgl.heterograph({('user', 'plays', 'game'): []}))
# empty src-dst pair # empty src-dst pair
assert_empty(dgl.heterograph({('user', 'plays', 'game'): ([], [])})) assert_empty(dgl.heterograph({('user', 'plays', 'game'): ([], [])}))
# empty sparse matrix
assert_empty(dgl.heterograph({('user', 'plays', 'game'): ssp.coo_matrix((0, 0))}))
# empty networkx graph
assert_empty(dgl.heterograph({('user', 'plays', 'game'): nx.DiGraph()}))
g = dgl.heterograph({('user', 'follows', 'user'): []}, idtype=idtype, device=F.ctx()) g = dgl.heterograph({('user', 'follows', 'user'): ([], [])}, idtype=idtype, device=F.ctx())
assert g.idtype == idtype assert g.idtype == idtype
assert g.device == F.ctx() assert g.device == F.ctx()
assert g.number_of_nodes('user') == 0 assert g.number_of_nodes('user') == 0
assert g.number_of_edges('follows') == 0 assert g.number_of_edges('follows') == 0
# empty relation graph with others # empty relation graph with others
g = dgl.heterograph({('user', 'plays', 'game'): [], ('developer', 'develops', 'game'): [ g = dgl.heterograph({('user', 'plays', 'game'): ([], []), ('developer', 'develops', 'game'):
(0, 0), (1, 1)]}, idtype=idtype, device=F.ctx()) ([0, 1], [0, 1])}, idtype=idtype, device=F.ctx())
assert g.idtype == idtype assert g.idtype == idtype
assert g.device == F.ctx() assert g.device == F.ctx()
assert g.number_of_nodes('user') == 0 assert g.number_of_nodes('user') == 0
...@@ -1625,7 +1526,8 @@ def test_types_in_function(idtype): ...@@ -1625,7 +1526,8 @@ def test_types_in_function(idtype):
assert edges.canonical_etype == ('user', 'plays', 'game') assert edges.canonical_etype == ('user', 'plays', 'game')
return F.zeros((2,)) return F.zeros((2,))
g = dgl.graph([(0, 1), (1, 2)], 'user', 'follow', idtype=idtype, device=F.ctx()) g = dgl.heterograph({('user', 'follow', 'user'): ((0, 1), (1, 2))},
idtype=idtype, device=F.ctx())
g.apply_nodes(rfunc1) g.apply_nodes(rfunc1)
g.apply_edges(mfunc1) g.apply_edges(mfunc1)
g.update_all(mfunc1, rfunc1) g.update_all(mfunc1, rfunc1)
...@@ -1635,7 +1537,7 @@ def test_types_in_function(idtype): ...@@ -1635,7 +1537,7 @@ def test_types_in_function(idtype):
g.filter_nodes(filter_nodes1) g.filter_nodes(filter_nodes1)
g.filter_edges(filter_edges1) g.filter_edges(filter_edges1)
g = dgl.bipartite([(0, 1), (1, 2)], 'user', 'plays', 'game', idtype=idtype, device=F.ctx()) g = dgl.heterograph({('user', 'plays', 'game'): ([0, 1], [1, 2])}, idtype=idtype, device=F.ctx())
g.apply_nodes(rfunc2, ntype='game') g.apply_nodes(rfunc2, ntype='game')
g.apply_edges(mfunc2) g.apply_edges(mfunc2)
g.update_all(mfunc2, rfunc2) g.update_all(mfunc2, rfunc2)
...@@ -1675,7 +1577,7 @@ def test_stack_reduce(idtype): ...@@ -1675,7 +1577,7 @@ def test_stack_reduce(idtype):
@parametrize_dtype @parametrize_dtype
def test_isolated_ntype(idtype): def test_isolated_ntype(idtype):
g = dgl.heterograph({ g = dgl.heterograph({
('A', 'AB', 'B'): [(0, 1), (1, 2), (2, 3)]}, ('A', 'AB', 'B'): ([0, 1, 2], [1, 2, 3])},
num_nodes_dict={'A': 3, 'B': 4, 'C': 4}, num_nodes_dict={'A': 3, 'B': 4, 'C': 4},
idtype=idtype, device=F.ctx()) idtype=idtype, device=F.ctx())
assert g.number_of_nodes('A') == 3 assert g.number_of_nodes('A') == 3
...@@ -1683,7 +1585,7 @@ def test_isolated_ntype(idtype): ...@@ -1683,7 +1585,7 @@ def test_isolated_ntype(idtype):
assert g.number_of_nodes('C') == 4 assert g.number_of_nodes('C') == 4
g = dgl.heterograph({ g = dgl.heterograph({
('A', 'AC', 'C'): [(0, 1), (1, 2), (2, 3)]}, ('A', 'AC', 'C'): ([0, 1, 2], [1, 2, 3])},
num_nodes_dict={'A': 3, 'B': 4, 'C': 4}, num_nodes_dict={'A': 3, 'B': 4, 'C': 4},
idtype=idtype, device=F.ctx()) idtype=idtype, device=F.ctx())
assert g.number_of_nodes('A') == 3 assert g.number_of_nodes('A') == 3
...@@ -1693,7 +1595,7 @@ def test_isolated_ntype(idtype): ...@@ -1693,7 +1595,7 @@ def test_isolated_ntype(idtype):
G = dgl.graph(([0, 1, 2], [4, 5, 6]), num_nodes=11, idtype=idtype, device=F.ctx()) G = dgl.graph(([0, 1, 2], [4, 5, 6]), num_nodes=11, idtype=idtype, device=F.ctx())
G.ndata[dgl.NTYPE] = F.tensor([0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], dtype=F.int64) G.ndata[dgl.NTYPE] = F.tensor([0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], dtype=F.int64)
G.edata[dgl.ETYPE] = F.tensor([0, 0, 0], dtype=F.int64) G.edata[dgl.ETYPE] = F.tensor([0, 0, 0], dtype=F.int64)
g = dgl.to_hetero(G, ['A', 'B', 'C'], ['AB']) g = dgl.to_heterogeneous(G, ['A', 'B', 'C'], ['AB'])
assert g.number_of_nodes('A') == 3 assert g.number_of_nodes('A') == 3
assert g.number_of_nodes('B') == 4 assert g.number_of_nodes('B') == 4
assert g.number_of_nodes('C') == 4 assert g.number_of_nodes('C') == 4
...@@ -1701,30 +1603,41 @@ def test_isolated_ntype(idtype): ...@@ -1701,30 +1603,41 @@ def test_isolated_ntype(idtype):
@parametrize_dtype @parametrize_dtype
def test_ismultigraph(idtype): def test_ismultigraph(idtype):
g1 = dgl.bipartite([(0, 1), (0, 2), (1, 5), (2, 5)], 'A', g1 = dgl.heterograph({('A', 'AB', 'B'): ([0, 0, 1, 2], [1, 2, 5, 5])},
'AB', 'B', num_nodes=(6, 6), idtype=idtype, device=F.ctx()) {'A': 6, 'B': 6}, idtype=idtype, device=F.ctx())
assert g1.is_multigraph == False assert g1.is_multigraph == False
g2 = dgl.bipartite([(0, 1), (0, 1), (0, 2), (1, 5)], 'A', g2 = dgl.heterograph({('A', 'AC', 'C'): ([0, 0, 0, 1], [1, 1, 2, 5])},
'AC', 'C', num_nodes=(6, 6), idtype=idtype, device=F.ctx()) {'A': 6, 'C': 6}, idtype=idtype, device=F.ctx())
assert g2.is_multigraph == True assert g2.is_multigraph == True
g3 = dgl.graph([(0, 1), (1, 2)], 'A', 'AA', g3 = dgl.graph(((0, 1), (1, 2)), num_nodes=6, idtype=idtype, device=F.ctx())
num_nodes=6, idtype=idtype, device=F.ctx())
assert g3.is_multigraph == False assert g3.is_multigraph == False
g4 = dgl.graph([(0, 1), (0, 1), (1, 2)], 'A', 'AA', g4 = dgl.graph(([0, 0, 1], [1, 1, 2]), num_nodes=6, idtype=idtype, device=F.ctx())
num_nodes=6, idtype=idtype, device=F.ctx())
assert g4.is_multigraph == True assert g4.is_multigraph == True
g = dgl.hetero_from_relations([g1, g3]) g = dgl.heterograph({
('A', 'AB', 'B'): ([0, 0, 1, 2], [1, 2, 5, 5]),
('A', 'AA', 'A'): ([0, 1], [1, 2])},
{'A': 6, 'B': 6}, idtype=idtype, device=F.ctx())
assert g.is_multigraph == False assert g.is_multigraph == False
g = dgl.hetero_from_relations([g1, g2]) g = dgl.heterograph({
('A', 'AB', 'B'): ([0, 0, 1, 2], [1, 2, 5, 5]),
('A', 'AC', 'C'): ([0, 0, 0, 1], [1, 1, 2, 5])},
{'A': 6, 'B': 6, 'C': 6}, idtype=idtype, device=F.ctx())
assert g.is_multigraph == True assert g.is_multigraph == True
g = dgl.hetero_from_relations([g1, g4]) g = dgl.heterograph({
('A', 'AB', 'B'): ([0, 0, 1, 2], [1, 2, 5, 5]),
('A', 'AA', 'A'): ([0, 0, 1], [1, 1, 2])},
{'A': 6, 'B': 6}, idtype=idtype, device=F.ctx())
assert g.is_multigraph == True assert g.is_multigraph == True
g = dgl.hetero_from_relations([g2, g4]) g = dgl.heterograph({
('A', 'AC', 'C'): ([0, 0, 0, 1], [1, 1, 2, 5]),
('A', 'AA', 'A'): ([0, 1], [1, 2])},
{'A': 6, 'C': 6}, idtype=idtype, device=F.ctx())
assert g.is_multigraph == True assert g.is_multigraph == True
@parametrize_dtype @parametrize_dtype
def test_bipartite(idtype): def test_bipartite(idtype):
g1 = dgl.bipartite([(0, 1), (0, 2), (1, 5)], 'A', 'AB', 'B', idtype=idtype, device=F.ctx()) g1 = dgl.heterograph({('A', 'AB', 'B'): ([0, 0, 1], [1, 2, 5])},
idtype=idtype, device=F.ctx())
assert g1.is_unibipartite assert g1.is_unibipartite
assert len(g1.ntypes) == 2 assert len(g1.ntypes) == 2
assert g1.etypes == ['AB'] assert g1.etypes == ['AB']
...@@ -1747,30 +1660,36 @@ def test_bipartite(idtype): ...@@ -1747,30 +1660,36 @@ def test_bipartite(idtype):
assert F.array_equal(g1.nodes['DST/B'].data['h'], g1.dstdata['h']) assert F.array_equal(g1.nodes['DST/B'].data['h'], g1.dstdata['h'])
# more complicated bipartite # more complicated bipartite
g2 = dgl.bipartite([(1, 0), (0, 0)], 'A', 'AC', 'C', idtype=idtype, device=F.ctx()) g2 = dgl.heterograph({
g3 = dgl.hetero_from_relations([g1, g2]) ('A', 'AB', 'B'): ([0, 0, 1], [1, 2, 5]),
assert g3.is_unibipartite ('A', 'AC', 'C'): ([1, 0], [0, 0])
assert g3.srctypes == ['A'] }, idtype=idtype, device=F.ctx())
assert set(g3.dsttypes) == {'B', 'C'}
assert g3.number_of_nodes('A') == 2 assert g2.is_unibipartite
assert g3.number_of_nodes('B') == 6 assert g2.srctypes == ['A']
assert g3.number_of_nodes('C') == 1 assert set(g2.dsttypes) == {'B', 'C'}
assert g3.number_of_src_nodes('A') == 2 assert g2.number_of_nodes('A') == 2
assert g3.number_of_src_nodes() == 2 assert g2.number_of_nodes('B') == 6
assert g3.number_of_dst_nodes('B') == 6 assert g2.number_of_nodes('C') == 1
assert g3.number_of_dst_nodes('C') == 1 assert g2.number_of_src_nodes('A') == 2
g3.srcdata['h'] = F.randn((2, 5)) assert g2.number_of_src_nodes() == 2
assert F.array_equal(g3.srcnodes['A'].data['h'], g3.srcdata['h']) assert g2.number_of_dst_nodes('B') == 6
assert F.array_equal(g3.nodes['A'].data['h'], g3.srcdata['h']) assert g2.number_of_dst_nodes('C') == 1
assert F.array_equal(g3.nodes['SRC/A'].data['h'], g3.srcdata['h']) g2.srcdata['h'] = F.randn((2, 5))
assert F.array_equal(g2.srcnodes['A'].data['h'], g2.srcdata['h'])
g4 = dgl.graph([(0, 0), (1, 1)], 'A', 'AA', idtype=idtype, device=F.ctx()) assert F.array_equal(g2.nodes['A'].data['h'], g2.srcdata['h'])
g5 = dgl.hetero_from_relations([g1, g2, g4]) assert F.array_equal(g2.nodes['SRC/A'].data['h'], g2.srcdata['h'])
assert not g5.is_unibipartite
g3 = dgl.heterograph({
('A', 'AB', 'B'): ([0, 0, 1], [1, 2, 5]),
('A', 'AC', 'C'): ([1, 0], [0, 0]),
('A', 'AA', 'A'): ([0, 1], [0, 1])
}, idtype=idtype, device=F.ctx())
assert not g3.is_unibipartite
@parametrize_dtype @parametrize_dtype
def test_dtype_cast(idtype): def test_dtype_cast(idtype):
g = dgl.graph([(0, 0), (1, 1), (0, 1), (2, 0)], idtype=idtype, device=F.ctx()) g = dgl.graph(([0, 1, 0, 2], [0, 1, 1, 0]), idtype=idtype, device=F.ctx())
assert g.idtype == idtype assert g.idtype == idtype
g.ndata["feat"] = F.tensor([3, 4, 5]) g.ndata["feat"] = F.tensor([3, 4, 5])
g.edata["h"] = F.tensor([3, 4, 5, 6]) g.edata["h"] = F.tensor([3, 4, 5, 6])
...@@ -1785,15 +1704,8 @@ def test_dtype_cast(idtype): ...@@ -1785,15 +1704,8 @@ def test_dtype_cast(idtype):
@parametrize_dtype @parametrize_dtype
def test_format(idtype): def test_format(idtype):
# single relation # single relation
g = dgl.graph([(0, 0), (1, 1), (0, 1), (2, 0)], idtype=idtype, device=F.ctx(), formats='coo') g = dgl.graph(([0, 1, 0, 2], [0, 1, 1, 0]), idtype=idtype, device=F.ctx())
assert g.formats()['created'] == ['coo'] assert g.formats()['created'] == ['coo']
assert len(g.formats()['not created']) == 0
try:
spmat = g.adjacency_matrix(scipy_fmt="csr")
except:
print('test passed, graph with allowed format coo should not create csr matrix.')
else:
assert False, 'cannot create csr when allowed format is coo'
g1 = g.formats(['coo', 'csr', 'csc']) g1 = g.formats(['coo', 'csr', 'csc'])
assert len(g1.formats()['created']) + len(g1.formats()['not created']) == 3 assert len(g1.formats()['created']) + len(g1.formats()['not created']) == 3
g1.create_format_() g1.create_format_()
...@@ -1802,23 +1714,18 @@ def test_format(idtype): ...@@ -1802,23 +1714,18 @@ def test_format(idtype):
# multiple relation # multiple relation
g = dgl.heterograph({ g = dgl.heterograph({
('user', 'follows', 'user'): [(0, 1), (1, 2)], ('user', 'follows', 'user'): ([0, 1], [1, 2]),
('user', 'plays', 'game'): [(0, 0), (1, 0), (1, 1), (2, 1)], ('user', 'plays', 'game'): ([0, 1, 1, 2], [0, 0, 1, 1]),
('developer', 'develops', 'game'): [(0, 0), (1, 1)], ('developer', 'develops', 'game'): ([0, 1], [0, 1])
}, idtype=idtype, device=F.ctx(), formats='csr') }, idtype=idtype, device=F.ctx())
user_feat = F.randn((g['follows'].number_of_src_nodes(), 5)) user_feat = F.randn((g['follows'].number_of_src_nodes(), 5))
g['follows'].srcdata['h'] = user_feat g['follows'].srcdata['h'] = user_feat
assert g.formats()['created'] == ['csr']
assert len(g.formats()['not created']) == 0
g1 = g.formats('csc') g1 = g.formats('csc')
# test frame # test frame
assert F.array_equal(g1['follows'].srcdata['h'], user_feat) assert F.array_equal(g1['follows'].srcdata['h'], user_feat)
# test each relation graph # test each relation graph
assert g1.formats()['created'] == ['csc'] assert g1.formats()['created'] == ['csc']
assert len(g1.formats()['not created']) == 0 assert len(g1.formats()['not created']) == 0
assert g.formats()['created'] == ['csr']
assert len(g.formats()['not created']) == 0
@parametrize_dtype @parametrize_dtype
def test_edges_order(idtype): def test_edges_order(idtype):
...@@ -1985,13 +1892,13 @@ def test_clone(idtype): ...@@ -1985,13 +1892,13 @@ def test_clone(idtype):
assert g.number_of_edges() != new_g.number_of_edges() assert g.number_of_edges() != new_g.number_of_edges()
# zero data graph # zero data graph
g = dgl.graph([], num_nodes=0, idtype=idtype, device=F.ctx()) g = dgl.graph(([], []), num_nodes=0, idtype=idtype, device=F.ctx())
new_g = g.clone() new_g = g.clone()
assert g.number_of_nodes() == new_g.number_of_nodes() assert g.number_of_nodes() == new_g.number_of_nodes()
assert g.number_of_edges() == new_g.number_of_edges() assert g.number_of_edges() == new_g.number_of_edges()
# heterograph # heterograph
g = create_test_heterograph4(idtype) g = create_test_heterograph3(idtype)
g.edges['plays'].data['h'] = F.copy_to(F.tensor([1, 2, 3, 4], dtype=idtype), ctx=F.ctx()) g.edges['plays'].data['h'] = F.copy_to(F.tensor([1, 2, 3, 4], dtype=idtype), ctx=F.ctx())
new_g = g.clone() new_g = g.clone()
assert g.number_of_nodes('user') == new_g.number_of_nodes('user') assert g.number_of_nodes('user') == new_g.number_of_nodes('user')
...@@ -2076,7 +1983,7 @@ def test_add_edges(idtype): ...@@ -2076,7 +1983,7 @@ def test_add_edges(idtype):
assert F.array_equal(g.edata['hh'], F.tensor([0, 0, 2, 2], dtype=idtype)) assert F.array_equal(g.edata['hh'], F.tensor([0, 0, 2, 2], dtype=idtype))
# zero data graph # zero data graph
g = dgl.graph([], num_nodes=0, idtype=idtype, device=F.ctx()) g = dgl.graph(([], []), num_nodes=0, idtype=idtype, device=F.ctx())
u = F.tensor([0, 1], dtype=idtype) u = F.tensor([0, 1], dtype=idtype)
v = F.tensor([2, 2], dtype=idtype) v = F.tensor([2, 2], dtype=idtype)
e_feat = {'h' : F.copy_to(F.tensor([2, 2], dtype=idtype), ctx=F.ctx()), e_feat = {'h' : F.copy_to(F.tensor([2, 2], dtype=idtype), ctx=F.ctx()),
...@@ -2091,7 +1998,8 @@ def test_add_edges(idtype): ...@@ -2091,7 +1998,8 @@ def test_add_edges(idtype):
assert F.array_equal(g.edata['hh'], F.tensor([2, 2], dtype=idtype)) assert F.array_equal(g.edata['hh'], F.tensor([2, 2], dtype=idtype))
# bipartite graph # bipartite graph
g = dgl.bipartite(([0, 1], [1, 2]), 'user', 'plays', 'game', idtype=idtype, device=F.ctx()) g = dgl.heterograph({('user', 'plays', 'game'): ([0, 1], [1, 2])},
idtype=idtype, device=F.ctx())
u = 0 u = 0
v = 1 v = 1
g.add_edges(u, v) g.add_edges(u, v)
...@@ -2118,7 +2026,8 @@ def test_add_edges(idtype): ...@@ -2118,7 +2026,8 @@ def test_add_edges(idtype):
assert F.array_equal(v, F.tensor([1, 2, 1, 1, 1], dtype=idtype)) assert F.array_equal(v, F.tensor([1, 2, 1, 1, 1], dtype=idtype))
# node id larger than current max node id # node id larger than current max node id
g = dgl.bipartite(([0, 1], [1, 2]), 'user', 'plays', 'game', idtype=idtype, device=F.ctx()) g = dgl.heterograph({('user', 'plays', 'game'): ([0, 1], [1, 2])},
idtype=idtype, device=F.ctx())
u = F.tensor([0, 2], dtype=idtype) u = F.tensor([0, 2], dtype=idtype)
v = F.tensor([2, 3], dtype=idtype) v = F.tensor([2, 3], dtype=idtype)
g.add_edges(u, v) g.add_edges(u, v)
...@@ -2131,9 +2040,11 @@ def test_add_edges(idtype): ...@@ -2131,9 +2040,11 @@ def test_add_edges(idtype):
assert F.array_equal(v, F.tensor([1, 2, 2, 3], dtype=idtype)) assert F.array_equal(v, F.tensor([1, 2, 2, 3], dtype=idtype))
# has data # has data
g = dgl.bipartite(([0, 1], [1, 2]), 'user', 'plays', 'game', idtype=idtype, device=F.ctx()) g = dgl.heterograph({
g.ndata['h'] = {'user' : F.copy_to(F.tensor([1, 1], dtype=idtype), ctx=F.ctx()), ('user', 'plays', 'game'): ([0, 1], [1, 2])
'game' : F.copy_to(F.tensor([2, 2, 2], dtype=idtype), ctx=F.ctx())} }, idtype=idtype, device=F.ctx())
g.nodes['user'].data['h'] = F.copy_to(F.tensor([1, 1], dtype=idtype), ctx=F.ctx())
g.nodes['game'].data['h'] = F.copy_to(F.tensor([2, 2, 2], dtype=idtype), ctx=F.ctx())
g.edata['h'] = F.copy_to(F.tensor([1, 1], dtype=idtype), ctx=F.ctx()) g.edata['h'] = F.copy_to(F.tensor([1, 1], dtype=idtype), ctx=F.ctx())
u = F.tensor([0, 2], dtype=idtype) u = F.tensor([0, 2], dtype=idtype)
v = F.tensor([2, 3], dtype=idtype) v = F.tensor([2, 3], dtype=idtype)
...@@ -2152,7 +2063,7 @@ def test_add_edges(idtype): ...@@ -2152,7 +2063,7 @@ def test_add_edges(idtype):
assert F.array_equal(g.edata['hh'], F.tensor([0, 0, 2, 2], dtype=idtype)) assert F.array_equal(g.edata['hh'], F.tensor([0, 0, 2, 2], dtype=idtype))
# heterogeneous graph # heterogeneous graph
g = create_test_heterograph4(idtype) g = create_test_heterograph3(idtype)
u = F.tensor([0, 2], dtype=idtype) u = F.tensor([0, 2], dtype=idtype)
v = F.tensor([2, 3], dtype=idtype) v = F.tensor([2, 3], dtype=idtype)
g.add_edges(u, v, etype='plays') g.add_edges(u, v, etype='plays')
...@@ -2196,14 +2107,15 @@ def test_add_nodes(idtype): ...@@ -2196,14 +2107,15 @@ def test_add_nodes(idtype):
assert F.array_equal(g.ndata['h'], F.tensor([1, 1, 1, 0], dtype=idtype)) assert F.array_equal(g.ndata['h'], F.tensor([1, 1, 1, 0], dtype=idtype))
# zero node graph # zero node graph
g = dgl.graph([], num_nodes=3, idtype=idtype, device=F.ctx()) g = dgl.graph(([], []), num_nodes=3, idtype=idtype, device=F.ctx())
g.ndata['h'] = F.copy_to(F.tensor([1,1,1], dtype=idtype), ctx=F.ctx()) g.ndata['h'] = F.copy_to(F.tensor([1,1,1], dtype=idtype), ctx=F.ctx())
g.add_nodes(1, data={'h' : F.copy_to(F.tensor([2], dtype=idtype), ctx=F.ctx())}) g.add_nodes(1, data={'h' : F.copy_to(F.tensor([2], dtype=idtype), ctx=F.ctx())})
assert g.number_of_nodes() == 4 assert g.number_of_nodes() == 4
assert F.array_equal(g.ndata['h'], F.tensor([1, 1, 1, 2], dtype=idtype)) assert F.array_equal(g.ndata['h'], F.tensor([1, 1, 1, 2], dtype=idtype))
# bipartite graph # bipartite graph
g = dgl.bipartite(([0, 1], [1, 2]), 'user', 'plays', 'game', idtype=idtype, device=F.ctx()) g = dgl.heterograph({('user', 'plays', 'game'): ([0, 1], [1, 2])},
idtype=idtype, device=F.ctx())
g.add_nodes(2, data={'h' : F.copy_to(F.tensor([2, 2], dtype=idtype), ctx=F.ctx())}, ntype='user') g.add_nodes(2, data={'h' : F.copy_to(F.tensor([2, 2], dtype=idtype), ctx=F.ctx())}, ntype='user')
assert g.number_of_nodes('user') == 4 assert g.number_of_nodes('user') == 4
assert F.array_equal(g.nodes['user'].data['h'], F.tensor([0, 0, 2, 2], dtype=idtype)) assert F.array_equal(g.nodes['user'].data['h'], F.tensor([0, 0, 2, 2], dtype=idtype))
...@@ -2211,7 +2123,7 @@ def test_add_nodes(idtype): ...@@ -2211,7 +2123,7 @@ def test_add_nodes(idtype):
assert g.number_of_nodes('game') == 5 assert g.number_of_nodes('game') == 5
# heterogeneous graph # heterogeneous graph
g = create_test_heterograph4(idtype) g = create_test_heterograph3(idtype)
g.add_nodes(1, ntype='user') g.add_nodes(1, ntype='user')
g.add_nodes(2, data={'h' : F.copy_to(F.tensor([2, 2], dtype=idtype), ctx=F.ctx())}, ntype='game') g.add_nodes(2, data={'h' : F.copy_to(F.tensor([2, 2], dtype=idtype), ctx=F.ctx())}, ntype='game')
g.add_nodes(0, ntype='developer') g.add_nodes(0, ntype='developer')
...@@ -2266,14 +2178,17 @@ def test_remove_edges(idtype): ...@@ -2266,14 +2178,17 @@ def test_remove_edges(idtype):
assert assert_fail assert assert_fail
# bipartite graph # bipartite graph
g = dgl.bipartite(([0, 1], [1, 2]), 'user', 'plays', 'game', idtype=idtype, device=F.ctx()) g = dgl.heterograph({
('user', 'plays', 'game'): ([0, 1], [1, 2])
}, idtype=idtype, device=F.ctx())
e = 0 e = 0
g.remove_edges(e) g.remove_edges(e)
assert g.number_of_edges() == 1 assert g.number_of_edges() == 1
u, v = g.edges(form='uv', order='eid') u, v = g.edges(form='uv', order='eid')
assert F.array_equal(u, F.tensor([1], dtype=idtype)) assert F.array_equal(u, F.tensor([1], dtype=idtype))
assert F.array_equal(v, F.tensor([2], dtype=idtype)) assert F.array_equal(v, F.tensor([2], dtype=idtype))
g = dgl.bipartite(([0, 1], [1, 2]), 'user', 'plays', 'game', idtype=idtype, device=F.ctx()) g = dgl.heterograph(
{('user', 'plays', 'game'): ([0, 1], [1, 2])}, idtype=idtype, device=F.ctx())
e = [0] e = [0]
g.remove_edges(e) g.remove_edges(e)
assert g.number_of_edges() == 1 assert g.number_of_edges() == 1
...@@ -2285,9 +2200,10 @@ def test_remove_edges(idtype): ...@@ -2285,9 +2200,10 @@ def test_remove_edges(idtype):
assert g.number_of_edges() == 0 assert g.number_of_edges() == 0
# has data # has data
g = dgl.bipartite(([0, 1], [1, 2]), 'user', 'plays', 'game', idtype=idtype, device=F.ctx()) g = dgl.heterograph(
g.ndata['h'] = {'user' : F.copy_to(F.tensor([1, 1], dtype=idtype), ctx=F.ctx()), {('user', 'plays', 'game'): ([0, 1], [1, 2])}, idtype=idtype, device=F.ctx())
'game' : F.copy_to(F.tensor([2, 2, 2], dtype=idtype), ctx=F.ctx())} g.nodes['user'].data['h'] = F.copy_to(F.tensor([1, 1], dtype=idtype), ctx=F.ctx())
g.nodes['game'].data['h'] = F.copy_to(F.tensor([2, 2, 2], dtype=idtype), ctx=F.ctx())
g.edata['h'] = F.copy_to(F.tensor([1, 2], dtype=idtype), ctx=F.ctx()) g.edata['h'] = F.copy_to(F.tensor([1, 2], dtype=idtype), ctx=F.ctx())
g.remove_edges(1) g.remove_edges(1)
assert g.number_of_edges() == 1 assert g.number_of_edges() == 1
...@@ -2296,7 +2212,7 @@ def test_remove_edges(idtype): ...@@ -2296,7 +2212,7 @@ def test_remove_edges(idtype):
assert F.array_equal(g.edata['h'], F.tensor([1], dtype=idtype)) assert F.array_equal(g.edata['h'], F.tensor([1], dtype=idtype))
# heterogeneous graph # heterogeneous graph
g = create_test_heterograph4(idtype) g = create_test_heterograph3(idtype)
g.edges['plays'].data['h'] = F.copy_to(F.tensor([1, 2, 3, 4], dtype=idtype), ctx=F.ctx()) g.edges['plays'].data['h'] = F.copy_to(F.tensor([1, 2, 3, 4], dtype=idtype), ctx=F.ctx())
g.remove_edges(1, etype='plays') g.remove_edges(1, etype='plays')
assert g.number_of_edges('plays') == 3 assert g.number_of_edges('plays') == 3
...@@ -2358,7 +2274,8 @@ def test_remove_nodes(idtype): ...@@ -2358,7 +2274,8 @@ def test_remove_nodes(idtype):
assert F.array_equal(g.edata['he'], F.tensor([3], dtype=idtype)) assert F.array_equal(g.edata['he'], F.tensor([3], dtype=idtype))
# node id larger than current max node id # node id larger than current max node id
g = dgl.bipartite(([0, 1], [1, 2]), 'user', 'plays', 'game', idtype=idtype, device=F.ctx()) g = dgl.heterograph(
{('user', 'plays', 'game'): ([0, 1], [1, 2])}, idtype=idtype, device=F.ctx())
n = 0 n = 0
g.remove_nodes(n, ntype='user') g.remove_nodes(n, ntype='user')
assert g.number_of_nodes('user') == 1 assert g.number_of_nodes('user') == 1
...@@ -2367,7 +2284,8 @@ def test_remove_nodes(idtype): ...@@ -2367,7 +2284,8 @@ def test_remove_nodes(idtype):
u, v = g.edges(form='uv', order='eid') u, v = g.edges(form='uv', order='eid')
assert F.array_equal(u, F.tensor([0], dtype=idtype)) assert F.array_equal(u, F.tensor([0], dtype=idtype))
assert F.array_equal(v, F.tensor([2], dtype=idtype)) assert F.array_equal(v, F.tensor([2], dtype=idtype))
g = dgl.bipartite(([0, 1], [1, 2]), 'user', 'plays', 'game', idtype=idtype, device=F.ctx()) g = dgl.heterograph(
{('user', 'plays', 'game'): ([0, 1], [1, 2])}, idtype=idtype, device=F.ctx())
n = [1] n = [1]
g.remove_nodes(n, ntype='user') g.remove_nodes(n, ntype='user')
assert g.number_of_nodes('user') == 1 assert g.number_of_nodes('user') == 1
...@@ -2376,7 +2294,8 @@ def test_remove_nodes(idtype): ...@@ -2376,7 +2294,8 @@ def test_remove_nodes(idtype):
u, v = g.edges(form='uv', order='eid') u, v = g.edges(form='uv', order='eid')
assert F.array_equal(u, F.tensor([0], dtype=idtype)) assert F.array_equal(u, F.tensor([0], dtype=idtype))
assert F.array_equal(v, F.tensor([1], dtype=idtype)) assert F.array_equal(v, F.tensor([1], dtype=idtype))
g = dgl.bipartite(([0, 1], [1, 2]), 'user', 'plays', 'game', idtype=idtype, device=F.ctx()) g = dgl.heterograph(
{('user', 'plays', 'game'): ([0, 1], [1, 2])}, idtype=idtype, device=F.ctx())
n = F.tensor([0], dtype=idtype) n = F.tensor([0], dtype=idtype)
g.remove_nodes(n, ntype='game') g.remove_nodes(n, ntype='game')
assert g.number_of_nodes('user') == 2 assert g.number_of_nodes('user') == 2
...@@ -2387,7 +2306,7 @@ def test_remove_nodes(idtype): ...@@ -2387,7 +2306,7 @@ def test_remove_nodes(idtype):
assert F.array_equal(v, F.tensor([0 ,1], dtype=idtype)) assert F.array_equal(v, F.tensor([0 ,1], dtype=idtype))
# heterogeneous graph # heterogeneous graph
g = create_test_heterograph4(idtype) g = create_test_heterograph3(idtype)
g.edges['plays'].data['h'] = F.copy_to(F.tensor([1, 2, 3, 4], dtype=idtype), ctx=F.ctx()) g.edges['plays'].data['h'] = F.copy_to(F.tensor([1, 2, 3, 4], dtype=idtype), ctx=F.ctx())
g.remove_nodes(0, ntype='game') g.remove_nodes(0, ntype='game')
assert g.number_of_nodes('user') == 3 assert g.number_of_nodes('user') == 3
......
...@@ -141,19 +141,18 @@ def test_pickling_graph(g, idtype): ...@@ -141,19 +141,18 @@ def test_pickling_graph(g, idtype):
@unittest.skipIf(F._default_context_str == 'gpu', reason="GPU not implemented") @unittest.skipIf(F._default_context_str == 'gpu', reason="GPU not implemented")
def test_pickling_batched_heterograph(): def test_pickling_batched_heterograph():
# copied from test_heterograph.create_test_heterograph() # copied from test_heterograph.create_test_heterograph()
plays_spmat = ssp.coo_matrix(([1, 1, 1, 1], ([0, 1, 2, 1], [0, 0, 1, 1]))) g = dgl.heterograph({
wishes_nx = nx.DiGraph() ('user', 'follows', 'user'): ([0, 1], [1, 2]),
wishes_nx.add_nodes_from(['u0', 'u1', 'u2'], bipartite=0) ('user', 'plays', 'game'): ([0, 1, 2, 1], [0, 0, 1, 1]),
wishes_nx.add_nodes_from(['g0', 'g1'], bipartite=1) ('user', 'wishes', 'game'): ([0, 2], [1, 0]),
wishes_nx.add_edge('u0', 'g1', id=0) ('developer', 'develops', 'game'): ([0, 1], [0, 1])
wishes_nx.add_edge('u2', 'g0', id=1) })
g2 = dgl.heterograph({
follows_g = dgl.graph([(0, 1), (1, 2)], 'user', 'follows') ('user', 'follows', 'user'): ([0, 1], [1, 2]),
plays_g = dgl.bipartite(plays_spmat, 'user', 'plays', 'game') ('user', 'plays', 'game'): ([0, 1, 2, 1], [0, 0, 1, 1]),
wishes_g = dgl.bipartite(wishes_nx, 'user', 'wishes', 'game') ('user', 'wishes', 'game'): ([0, 2], [1, 0]),
develops_g = dgl.bipartite([(0, 0), (1, 1)], 'developer', 'develops', 'game') ('developer', 'develops', 'game'): ([0, 1], [0, 1])
g = dgl.hetero_from_relations([follows_g, plays_g, wishes_g, develops_g]) })
g2 = dgl.hetero_from_relations([follows_g, plays_g, wishes_g, develops_g])
g.nodes['user'].data['u_h'] = F.randn((3, 4)) g.nodes['user'].data['u_h'] = F.randn((3, 4))
g.nodes['game'].data['g_h'] = F.randn((2, 5)) g.nodes['game'].data['g_h'] = F.randn((2, 5))
...@@ -166,28 +165,6 @@ def test_pickling_batched_heterograph(): ...@@ -166,28 +165,6 @@ def test_pickling_batched_heterograph():
new_bg = _reconstruct_pickle(bg) new_bg = _reconstruct_pickle(bg)
test_utils.check_graph_equal(bg, new_bg) test_utils.check_graph_equal(bg, new_bg)
@unittest.skipIf(F._default_context_str == 'gpu', reason="GPU not implemented")
@unittest.skipIf(dgl.backend.backend_name != "pytorch", reason="Only test for pytorch format file")
def test_pickling_heterograph_index_compatibility():
plays_spmat = ssp.coo_matrix(([1, 1, 1, 1], ([0, 1, 2, 1], [0, 0, 1, 1])))
wishes_nx = nx.DiGraph()
wishes_nx.add_nodes_from(['u0', 'u1', 'u2'], bipartite=0)
wishes_nx.add_nodes_from(['g0', 'g1'], bipartite=1)
wishes_nx.add_edge('u0', 'g1', id=0)
wishes_nx.add_edge('u2', 'g0', id=1)
follows_g = dgl.graph([(0, 1), (1, 2)], 'user', 'follows')
plays_g = dgl.bipartite(plays_spmat, 'user', 'plays', 'game')
wishes_g = dgl.bipartite(wishes_nx, 'user', 'wishes', 'game')
develops_g = dgl.bipartite([(0, 0), (1, 1)], 'developer', 'develops', 'game')
g = dgl.hetero_from_relations([follows_g, plays_g, wishes_g, develops_g])
with open("tests/compute/hetero_pickle_old.pkl", "rb") as f:
gi = pickle.load(f)
f.close()
new_g = dgl.DGLHeteroGraph(gi, g.ntypes, g.etypes)
_assert_is_identical_hetero(g, new_g)
if __name__ == '__main__': if __name__ == '__main__':
test_pickling_index() test_pickling_index()
test_pickling_graph_index() test_pickling_graph_index()
......
...@@ -5,6 +5,10 @@ import unittest ...@@ -5,6 +5,10 @@ import unittest
import utils as U import utils as U
from utils import parametrize_dtype from utils import parametrize_dtype
def create_graph(idtype):
g = dgl.from_networkx(nx.path_graph(5), idtype=idtype, device=F.ctx())
return g
def mfunc(edges): def mfunc(edges):
return {'m' : edges.src['x']} return {'m' : edges.src['x']}
...@@ -15,7 +19,7 @@ def rfunc(nodes): ...@@ -15,7 +19,7 @@ def rfunc(nodes):
@unittest.skipIf(F._default_context_str == 'gpu', reason="GPU not implemented") @unittest.skipIf(F._default_context_str == 'gpu', reason="GPU not implemented")
@parametrize_dtype @parametrize_dtype
def test_prop_nodes_bfs(idtype): def test_prop_nodes_bfs(idtype):
g = dgl.graph(nx.path_graph(5), idtype=idtype, device=F.ctx()) g = create_graph(idtype)
g.ndata['x'] = F.ones((5, 2)) g.ndata['x'] = F.ones((5, 2))
dgl.prop_nodes_bfs(g, 0, message_func=mfunc, reduce_func=rfunc, apply_node_func=None) dgl.prop_nodes_bfs(g, 0, message_func=mfunc, reduce_func=rfunc, apply_node_func=None)
# pull nodes using bfs order will result in a cumsum[i] + data[i] + data[i+1] # pull nodes using bfs order will result in a cumsum[i] + data[i] + data[i+1]
...@@ -25,7 +29,7 @@ def test_prop_nodes_bfs(idtype): ...@@ -25,7 +29,7 @@ def test_prop_nodes_bfs(idtype):
@unittest.skipIf(F._default_context_str == 'gpu', reason="GPU not implemented") @unittest.skipIf(F._default_context_str == 'gpu', reason="GPU not implemented")
@parametrize_dtype @parametrize_dtype
def test_prop_edges_dfs(idtype): def test_prop_edges_dfs(idtype):
g = dgl.graph(nx.path_graph(5), idtype=idtype, device=F.ctx()) g = create_graph(idtype)
g.ndata['x'] = F.ones((5, 2)) g.ndata['x'] = F.ones((5, 2))
dgl.prop_edges_dfs(g, 0, message_func=mfunc, reduce_func=rfunc, apply_node_func=None) dgl.prop_edges_dfs(g, 0, message_func=mfunc, reduce_func=rfunc, apply_node_func=None)
# snr using dfs results in a cumsum # snr using dfs results in a cumsum
...@@ -48,7 +52,7 @@ def test_prop_edges_dfs(idtype): ...@@ -48,7 +52,7 @@ def test_prop_edges_dfs(idtype):
@parametrize_dtype @parametrize_dtype
def test_prop_nodes_topo(idtype): def test_prop_nodes_topo(idtype):
# bi-directional chain # bi-directional chain
g = dgl.graph(nx.path_graph(5), idtype=idtype, device=F.ctx()) g = create_graph(idtype)
assert U.check_fail(dgl.prop_nodes_topo, g) # has loop assert U.check_fail(dgl.prop_nodes_topo, g) # has loop
# tree # tree
......
...@@ -60,11 +60,17 @@ def test_random_walk_with_restart(): ...@@ -60,11 +60,17 @@ def test_random_walk_with_restart():
trace_diff = np.diff(F.zerocopy_to_numpy(t), axis=-1) trace_diff = np.diff(F.zerocopy_to_numpy(t), axis=-1)
assert (trace_diff % 2 == 0).all() assert (trace_diff % 2 == 0).all()
@parametrize_dtype def test_metapath_random_walk(idtype=F.int32):
def test_metapath_random_walk(idtype): g1 = dgl.heterograph({
g1 = dgl.bipartite(([0, 1, 2, 3], [0, 1, 2, 3]), 'a', 'ab', 'b', idtype=idtype) ('a', 'ab', 'b'): ([0, 1, 2, 3], [0, 1, 2, 3])
g2 = dgl.bipartite(([0, 0, 1, 1, 2, 2, 3, 3], [1, 3, 2, 0, 3, 1, 0, 2]), 'b', 'ba', 'a', idtype=idtype) }, idtype=idtype)
G = dgl.hetero_from_relations([g1, g2]) g2 = dgl.heterograph({
('b', 'ba', 'a'): ([0, 0, 1, 1, 2, 2, 3, 3], [1, 3, 2, 0, 3, 1, 0, 2])
}, idtype=idtype)
G = dgl.heterograph({
('a', 'ab', 'b'): ([0, 1, 2, 3], [0, 1, 2, 3]),
('b', 'ba', 'a'): ([0, 0, 1, 1, 2, 2, 3, 3], [1, 3, 2, 0, 3, 1, 0, 2])
}, idtype=idtype)
seeds = [0, 1] seeds = [0, 1]
traces = dgl.contrib.sampling.metapath_random_walk(G, ['ab', 'ba'] * 4, seeds, 3) traces = dgl.contrib.sampling.metapath_random_walk(G, ['ab', 'ba'] * 4, seeds, 3)
for seed, traces_per_seed in zip(seeds, traces): for seed, traces_per_seed in zip(seeds, traces):
......
...@@ -23,19 +23,19 @@ def check_random_walk(g, metapath, traces, ntypes, prob=None): ...@@ -23,19 +23,19 @@ def check_random_walk(g, metapath, traces, ntypes, prob=None):
@unittest.skipIf(F._default_context_str == 'gpu', reason="GPU random walk not implemented") @unittest.skipIf(F._default_context_str == 'gpu', reason="GPU random walk not implemented")
def test_random_walk(): def test_random_walk():
g1 = dgl.heterograph({ g1 = dgl.heterograph({
('user', 'follow', 'user'): [(0, 1), (1, 2), (2, 0)] ('user', 'follow', 'user'): ([0, 1, 2], [1, 2, 0])
}) })
g2 = dgl.heterograph({ g2 = dgl.heterograph({
('user', 'follow', 'user'): [(0, 1), (1, 2), (1, 3), (2, 0), (3, 0)] ('user', 'follow', 'user'): ([0, 1, 1, 2, 3], [1, 2, 3, 0, 0])
}) })
g3 = dgl.heterograph({ g3 = dgl.heterograph({
('user', 'follow', 'user'): [(0, 1), (1, 2), (2, 0)], ('user', 'follow', 'user'): ([0, 1, 2], [1, 2, 0]),
('user', 'view', 'item'): [(0, 0), (1, 1), (2, 2)], ('user', 'view', 'item'): ([0, 1, 2], [0, 1, 2]),
('item', 'viewed-by', 'user'): [(0, 0), (1, 1), (2, 2)]}) ('item', 'viewed-by', 'user'): ([0, 1, 2], [0, 1, 2])})
g4 = dgl.heterograph({ g4 = dgl.heterograph({
('user', 'follow', 'user'): [(0, 1), (1, 2), (1, 3), (2, 0), (3, 0)], ('user', 'follow', 'user'): ([0, 1, 1, 2, 3], [1, 2, 3, 0, 0]),
('user', 'view', 'item'): [(0, 0), (0, 1), (1, 1), (2, 2), (3, 2), (3, 1)], ('user', 'view', 'item'): ([0, 0, 1, 2, 3, 3], [0, 1, 1, 2, 2, 1]),
('item', 'viewed-by', 'user'): [(0, 0), (1, 0), (1, 1), (2, 2), (2, 3), (1, 3)]}) ('item', 'viewed-by', 'user'): ([0, 1, 1, 2, 2, 1], [0, 0, 1, 2, 3, 3])})
g2.edata['p'] = F.tensor([3, 0, 3, 3, 3], dtype=F.float32) g2.edata['p'] = F.tensor([3, 0, 3, 3, 3], dtype=F.float32)
g2.edata['p2'] = F.tensor([[3], [0], [3], [3], [3]], dtype=F.float32) g2.edata['p2'] = F.tensor([[3], [0], [3], [3], [3]], dtype=F.float32)
...@@ -124,8 +124,8 @@ def test_pinsage_sampling(): ...@@ -124,8 +124,8 @@ def test_pinsage_sampling():
assert (2, 2) in uv or (3, 2) in uv assert (2, 2) in uv or (3, 2) in uv
g = dgl.heterograph({ g = dgl.heterograph({
('item', 'bought-by', 'user'): [(0, 0), (0, 1), (1, 0), (1, 1), (2, 2), (2, 3), (3, 2), (3, 3)], ('item', 'bought-by', 'user'): ([0, 0, 1, 1, 2, 2, 3, 3], [0, 1, 0, 1, 2, 3, 2, 3]),
('user', 'bought', 'item'): [(0, 0), (1, 0), (0, 1), (1, 1), (2, 2), (3, 2), (2, 3), (3, 3)]}) ('user', 'bought', 'item'): ([0, 1, 0, 1, 2, 3, 2, 3], [0, 0, 1, 1, 2, 2, 3, 3])})
sampler = dgl.sampling.PinSAGESampler(g, 'item', 'user', 4, 0.5, 3, 2) sampler = dgl.sampling.PinSAGESampler(g, 'item', 'user', 4, 0.5, 3, 2)
_test_sampler(g, sampler, 'item') _test_sampler(g, sampler, 'item')
sampler = dgl.sampling.RandomWalkNeighborSampler(g, 4, 0.5, 3, 2, ['bought-by', 'bought']) sampler = dgl.sampling.RandomWalkNeighborSampler(g, 4, 0.5, 3, 2, ['bought-by', 'bought'])
...@@ -133,13 +133,14 @@ def test_pinsage_sampling(): ...@@ -133,13 +133,14 @@ def test_pinsage_sampling():
sampler = dgl.sampling.RandomWalkNeighborSampler(g, 4, 0.5, 3, 2, sampler = dgl.sampling.RandomWalkNeighborSampler(g, 4, 0.5, 3, 2,
[('item', 'bought-by', 'user'), ('user', 'bought', 'item')]) [('item', 'bought-by', 'user'), ('user', 'bought', 'item')])
_test_sampler(g, sampler, 'item') _test_sampler(g, sampler, 'item')
g = dgl.graph([(0, 0), (0, 1), (1, 0), (1, 1), (2, 2), (2, 3), (3, 2), (3, 3)]) g = dgl.graph(([0, 0, 1, 1, 2, 2, 3, 3],
[0, 1, 0, 1, 2, 3, 2, 3]))
sampler = dgl.sampling.RandomWalkNeighborSampler(g, 4, 0.5, 3, 2) sampler = dgl.sampling.RandomWalkNeighborSampler(g, 4, 0.5, 3, 2)
_test_sampler(g, sampler, g.ntypes[0]) _test_sampler(g, sampler, g.ntypes[0])
g = dgl.heterograph({ g = dgl.heterograph({
('A', 'AB', 'B'): [(0, 1), (2, 3)], ('A', 'AB', 'B'): ([0, 2], [1, 3]),
('B', 'BC', 'C'): [(1, 2), (3, 1)], ('B', 'BC', 'C'): ([1, 3], [2, 1]),
('C', 'CA', 'A'): [(2, 0), (1, 2)]}) ('C', 'CA', 'A'): ([2, 1], [0, 2])})
sampler = dgl.sampling.RandomWalkNeighborSampler(g, 4, 0.5, 3, 2, ['AB', 'BC', 'CA']) sampler = dgl.sampling.RandomWalkNeighborSampler(g, 4, 0.5, 3, 2, ['AB', 'BC', 'CA'])
_test_sampler(g, sampler, 'A') _test_sampler(g, sampler, 'A')
...@@ -147,68 +148,76 @@ def _gen_neighbor_sampling_test_graph(hypersparse, reverse): ...@@ -147,68 +148,76 @@ def _gen_neighbor_sampling_test_graph(hypersparse, reverse):
if hypersparse: if hypersparse:
# should crash if allocated a CSR # should crash if allocated a CSR
card = 1 << 50 card = 1 << 50
card2 = (1 << 50, 1 << 50) num_nodes_dict = {'user': card, 'game': card, 'coin': card}
else: else:
card = None card = None
card2 = None num_nodes_dict = None
if reverse: if reverse:
g = dgl.graph([(0,1),(0,2),(0,3),(1,0),(1,2),(1,3),(2,0)], g = dgl.heterograph({
'user', 'follow', num_nodes=card) ('user', 'follow', 'user'): ([0, 0, 0, 1, 1, 1, 2], [1, 2, 3, 0, 2, 3, 0])
}, {'user': card if card is not None else 4})
g.edata['prob'] = F.tensor([.5, .5, 0., .5, .5, 0., 1.], dtype=F.float32) g.edata['prob'] = F.tensor([.5, .5, 0., .5, .5, 0., 1.], dtype=F.float32)
g1 = dgl.bipartite([(0,0),(1,0),(2,1),(2,3)], 'game', 'play', 'user', num_nodes=card2) hg = dgl.heterograph({
g1.edata['prob'] = F.tensor([.8, .5, .5, .5], dtype=F.float32) ('user', 'follow', 'user'): ([0, 0, 0, 1, 1, 1, 2],
g2 = dgl.bipartite([(0,2),(1,2),(2,2),(0,1),(3,1),(0,0)], 'user', 'liked-by', 'game', num_nodes=card2) [1, 2, 3, 0, 2, 3, 0]),
g2.edata['prob'] = F.tensor([.3, .5, .2, .5, .1, .1], dtype=F.float32) ('game', 'play', 'user'): ([0, 1, 2, 2], [0, 0, 1, 3]),
g3 = dgl.bipartite([(0,0),(0,1),(0,2),(0,3)], 'coin', 'flips', 'user', num_nodes=card2) ('user', 'liked-by', 'game'): ([0, 1, 2, 0, 3, 0], [2, 2, 2, 1, 1, 0]),
('coin', 'flips', 'user'): ([0, 0, 0, 0], [0, 1, 2, 3])
hg = dgl.hetero_from_relations([g, g1, g2, g3]) }, num_nodes_dict)
else: else:
g = dgl.graph([(1,0),(2,0),(3,0),(0,1),(2,1),(3,1),(0,2)], g = dgl.heterograph({
'user', 'follow', num_nodes=card) ('user', 'follow', 'user'): ([1, 2, 3, 0, 2, 3, 0], [0, 0, 0, 1, 1, 1, 2])
}, {'user': card if card is not None else 4})
g.edata['prob'] = F.tensor([.5, .5, 0., .5, .5, 0., 1.], dtype=F.float32) g.edata['prob'] = F.tensor([.5, .5, 0., .5, .5, 0., 1.], dtype=F.float32)
g1 = dgl.bipartite([(0,0),(0,1),(1,2),(3,2)], 'user', 'play', 'game', num_nodes=card2) hg = dgl.heterograph({
g1.edata['prob'] = F.tensor([.8, .5, .5, .5], dtype=F.float32) ('user', 'follow', 'user'): ([1, 2, 3, 0, 2, 3, 0],
g2 = dgl.bipartite([(2,0),(2,1),(2,2),(1,0),(1,3),(0,0)], 'game', 'liked-by', 'user', num_nodes=card2) [0, 0, 0, 1, 1, 1, 2]),
g2.edata['prob'] = F.tensor([.3, .5, .2, .5, .1, .1], dtype=F.float32) ('user', 'play', 'game'): ([0, 0, 1, 3], [0, 1, 2, 2]),
g3 = dgl.bipartite([(0,0),(1,0),(2,0),(3,0)], 'user', 'flips', 'coin', num_nodes=card2) ('game', 'liked-by', 'user'): ([2, 2, 2, 1, 1, 0], [0, 1, 2, 0, 3, 0]),
('user', 'flips', 'coin'): ([0, 1, 2, 3], [0, 0, 0, 0])
}, num_nodes_dict)
hg.edges['follow'].data['prob'] = F.tensor([.5, .5, 0., .5, .5, 0., 1.], dtype=F.float32)
hg.edges['play'].data['prob'] = F.tensor([.8, .5, .5, .5], dtype=F.float32)
hg.edges['liked-by'].data['prob'] = F.tensor([.3, .5, .2, .5, .1, .1], dtype=F.float32)
hg = dgl.hetero_from_relations([g, g1, g2, g3])
return g, hg return g, hg
def _gen_neighbor_topk_test_graph(hypersparse, reverse): def _gen_neighbor_topk_test_graph(hypersparse, reverse):
if hypersparse: if hypersparse:
# should crash if allocated a CSR # should crash if allocated a CSR
card = 1 << 50 card = 1 << 50
card2 = (1 << 50, 1 << 50)
else: else:
card = None card = None
card2 = None
if reverse: if reverse:
g = dgl.graph([(0,1),(0,2),(0,3),(1,0),(1,2),(1,3),(2,0)], g = dgl.heterograph({
'user', 'follow') ('user', 'follow', 'user'): ([0, 0, 0, 1, 1, 1, 2], [1, 2, 3, 0, 2, 3, 0])
})
g.edata['weight'] = F.tensor([.5, .3, 0., -5., 22., 0., 1.], dtype=F.float32) g.edata['weight'] = F.tensor([.5, .3, 0., -5., 22., 0., 1.], dtype=F.float32)
g1 = dgl.bipartite([(0,0),(1,0),(2,1),(2,3)], 'game', 'play', 'user') hg = dgl.heterograph({
g1.edata['weight'] = F.tensor([.8, .5, .4, .5], dtype=F.float32) ('user', 'follow', 'user'): ([0, 0, 0, 1, 1, 1, 2],
g2 = dgl.bipartite([(0,2),(1,2),(2,2),(0,1),(3,1),(0,0)], 'user', 'liked-by', 'game') [1, 2, 3, 0, 2, 3, 0]),
g2.edata['weight'] = F.tensor([.3, .5, .2, .5, .1, .1], dtype=F.float32) ('game', 'play', 'user'): ([0, 1, 2, 2], [0, 0, 1, 3]),
g3 = dgl.bipartite([(0,0),(0,1),(0,2),(0,3)], 'coin', 'flips', 'user') ('user', 'liked-by', 'game'): ([0, 1, 2, 0, 3, 0], [2, 2, 2, 1, 1, 0]),
g3.edata['weight'] = F.tensor([10, 2, 13, -1], dtype=F.float32) ('coin', 'flips', 'user'): ([0, 0, 0, 0], [0, 1, 2, 3])
})
hg = dgl.hetero_from_relations([g, g1, g2, g3])
else: else:
g = dgl.graph([(1,0),(2,0),(3,0),(0,1),(2,1),(3,1),(0,2)], g = dgl.heterograph({
'user', 'follow') ('user', 'follow', 'user'): ([1, 2, 3, 0, 2, 3, 0], [0, 0, 0, 1, 1, 1, 2])
})
g.edata['weight'] = F.tensor([.5, .3, 0., -5., 22., 0., 1.], dtype=F.float32) g.edata['weight'] = F.tensor([.5, .3, 0., -5., 22., 0., 1.], dtype=F.float32)
g1 = dgl.bipartite([(0,0),(0,1),(1,2),(3,2)], 'user', 'play', 'game') hg = dgl.heterograph({
g1.edata['weight'] = F.tensor([.8, .5, .4, .5], dtype=F.float32) ('user', 'follow', 'user'): ([1, 2, 3, 0, 2, 3, 0],
g2 = dgl.bipartite([(2,0),(2,1),(2,2),(1,0),(1,3),(0,0)], 'game', 'liked-by', 'user') [0, 0, 0, 1, 1, 1, 2]),
g2.edata['weight'] = F.tensor([.3, .5, .2, .5, .1, .1], dtype=F.float32) ('user', 'play', 'game'): ([0, 0, 1, 3], [0, 1, 2, 2]),
g3 = dgl.bipartite([(0,0),(1,0),(2,0),(3,0)], 'user', 'flips', 'coin') ('game', 'liked-by', 'user'): ([2, 2, 2, 1, 1, 0], [0, 1, 2, 0, 3, 0]),
g3.edata['weight'] = F.tensor([10, 2, 13, -1], dtype=F.float32) ('user', 'flips', 'coin'): ([0, 1, 2, 3], [0, 0, 0, 0])
})
hg = dgl.hetero_from_relations([g, g1, g2, g3]) hg.edges['follow'].data['weight'] = F.tensor([.5, .3, 0., -5., 22., 0., 1.], dtype=F.float32)
hg.edges['play'].data['weight'] = F.tensor([.8, .5, .4, .5], dtype=F.float32)
hg.edges['liked-by'].data['weight'] = F.tensor([.3, .5, .2, .5, .1, .1], dtype=F.float32)
hg.edges['flips'].data['weight'] = F.tensor([10, 2, 13, -1], dtype=F.float32)
return g, hg return g, hg
def _test_sample_neighbors(hypersparse): def _test_sample_neighbors(hypersparse):
...@@ -541,7 +550,7 @@ def test_sample_neighbors_topk_outedge(): ...@@ -541,7 +550,7 @@ def test_sample_neighbors_topk_outedge():
@unittest.skipIf(F._default_context_str == 'gpu', reason="GPU sample neighbors not implemented") @unittest.skipIf(F._default_context_str == 'gpu', reason="GPU sample neighbors not implemented")
def test_sample_neighbors_with_0deg(): def test_sample_neighbors_with_0deg():
g = dgl.graph([], num_nodes=5) g = dgl.graph(([], []), num_nodes=5)
sg = dgl.sampling.sample_neighbors(g, F.tensor([1, 2], dtype=F.int64), 2, edge_dir='in', replace=False) sg = dgl.sampling.sample_neighbors(g, F.tensor([1, 2], dtype=F.int64), 2, edge_dir='in', replace=False)
assert sg.number_of_edges() == 0 assert sg.number_of_edges() == 0
sg = dgl.sampling.sample_neighbors(g, F.tensor([1, 2], dtype=F.int64), 2, edge_dir='in', replace=True) sg = dgl.sampling.sample_neighbors(g, F.tensor([1, 2], dtype=F.int64), 2, edge_dir='in', replace=True)
......
...@@ -19,7 +19,7 @@ def generate_rand_graph(n, is_hetero): ...@@ -19,7 +19,7 @@ def generate_rand_graph(n, is_hetero):
arr = (sp.sparse.random(n, n, density=0.1, arr = (sp.sparse.random(n, n, density=0.1,
format='coo') != 0).astype(np.int64) format='coo') != 0).astype(np.int64)
if is_hetero: if is_hetero:
return dgl.graph(arr) return dgl.from_scipy(arr)
else: else:
return DGLGraph(arr, readonly=True) return DGLGraph(arr, readonly=True)
...@@ -218,26 +218,44 @@ def test_load_old_files2(): ...@@ -218,26 +218,44 @@ def test_load_old_files2():
def create_heterographs(idtype): def create_heterographs(idtype):
g_x = dgl.graph(([0, 1, 2], [1, 2, 3]), 'user', g_x = dgl.heterograph({
'follows', idtype=idtype) ('user', 'follows', 'user'): ([0, 1, 2], [1, 2, 3])}, idtype=idtype)
g_y = dgl.graph(([0, 2], [2, 3]), 'user', 'knows', idtype=idtype).formats('csr') g_y = dgl.heterograph({
g_x.nodes['user'].data['h'] = F.randn((4, 3)) ('user', 'knows', 'user'): ([0, 2], [2, 3])}, idtype=idtype).formats('csr')
g_x.edges['follows'].data['w'] = F.randn((3, 2)) g_x.ndata['h'] = F.randn((4, 3))
g_y.nodes['user'].data['hh'] = F.ones((4, 5)) g_x.edata['w'] = F.randn((3, 2))
g_y.edges['knows'].data['ww'] = F.randn((2, 10)) g_y.ndata['hh'] = F.ones((4, 5))
g = dgl.hetero_from_relations([g_x, g_y]) g_y.edata['ww'] = F.randn((2, 10))
g = dgl.heterograph({
('user', 'follows', 'user'): ([0, 1, 2], [1, 2, 3]),
('user', 'knows', 'user'): ([0, 2], [2, 3])
}, idtype=idtype)
g.nodes['user'].data['h'] = g_x.ndata['h']
g.nodes['user'].data['hh'] = g_y.ndata['hh']
g.edges['follows'].data['w'] = g_x.edata['w']
g.edges['knows'].data['ww'] = g_y.edata['ww']
return [g, g_x, g_y] return [g, g_x, g_y]
def create_heterographs2(idtype): def create_heterographs2(idtype):
g_x = dgl.graph(([0, 1, 2], [1, 2, 3]), 'user', g_x = dgl.heterograph({
'follows', idtype=idtype) ('user', 'follows', 'user'): ([0, 1, 2], [1, 2, 3])}, idtype=idtype)
g_y = dgl.graph(([0, 2], [2, 3]), 'user', 'knows', idtype=idtype).formats('csr') g_y = dgl.heterograph({
g_z = dgl.bipartite(([0, 1, 3], [2, 3, 4]), 'user', 'knows', 'knowledge', idtype=idtype) ('user', 'knows', 'user'): ([0, 2], [2, 3])}, idtype=idtype).formats('csr')
g_x.nodes['user'].data['h'] = F.randn((4, 3)) g_z = dgl.heterograph(
g_x.edges['follows'].data['w'] = F.randn((3, 2)) {('user', 'knows', 'knowledge'): ([0, 1, 3], [2, 3, 4])}, idtype=idtype)
g_y.nodes['user'].data['hh'] = F.ones((4, 5)) g_x.ndata['h'] = F.randn((4, 3))
g_y.edges['knows'].data['ww'] = F.randn((2, 10)) g_x.edata['w'] = F.randn((3, 2))
g = dgl.hetero_from_relations([g_x, g_y, g_z]) g_y.ndata['hh'] = F.ones((4, 5))
g_y.edata['ww'] = F.randn((2, 10))
g = dgl.heterograph({
('user', 'follows', 'user'): ([0, 1, 2], [1, 2, 3]),
('user', 'knows', 'user'): ([0, 2], [2, 3]),
('user', 'knows', 'knowledge'): ([0, 1, 3], [2, 3, 4])
}, idtype=idtype)
g.nodes['user'].data['h'] = g_x.ndata['h']
g.edges['follows'].data['w'] = g_x.edata['w']
g.nodes['user'].data['hh'] = g_y.ndata['hh']
g.edges[('user', 'knows', 'user')].data['ww'] = g_y.edata['ww']
return [g, g_x, g_y, g_z] return [g, g_x, g_y, g_z]
def test_deserialize_old_heterograph_file(): def test_deserialize_old_heterograph_file():
......
...@@ -14,18 +14,12 @@ import multiprocessing as mp ...@@ -14,18 +14,12 @@ import multiprocessing as mp
import os import os
def create_test_graph(idtype): def create_test_graph(idtype):
plays_spmat = ssp.coo_matrix(([1, 1, 1, 1], ([0, 1, 2, 1], [0, 0, 1, 1]))) g = dgl.heterograph(({
wishes_nx = nx.DiGraph() ('user', 'follows', 'user'): ([0, 1], [1, 2]),
wishes_nx.add_nodes_from(['u0', 'u1', 'u2'], bipartite=0) ('user', 'plays', 'game'): ([0, 1, 2, 1], [0, 0, 1, 1]),
wishes_nx.add_nodes_from(['g0', 'g1'], bipartite=1) ('user', 'wishes', 'game'): ([0, 2], [1, 0]),
wishes_nx.add_edge('u0', 'g1', id=0) ('developer', 'develops', 'game'): ([0, 1], [0, 1])
wishes_nx.add_edge('u2', 'g0', id=1) }), idtype=idtype)
follows_g = dgl.graph([(0, 1), (1, 2)], 'user', 'follows', idtype=idtype)
plays_g = dgl.bipartite(plays_spmat, 'user', 'plays', 'game', idtype=idtype)
wishes_g = dgl.bipartite(wishes_nx, 'user', 'wishes', 'game', idtype=idtype)
develops_g = dgl.bipartite([(0, 0), (1, 1)], 'developer', 'develops', 'game', idtype=idtype)
g = dgl.hetero_from_relations([follows_g, plays_g, wishes_g, develops_g])
return g return g
def _assert_is_identical_hetero(g, g2): def _assert_is_identical_hetero(g, g2):
......
...@@ -71,7 +71,7 @@ udf_reduce = { ...@@ -71,7 +71,7 @@ udf_reduce = {
graphs = [ graphs = [
# dgl.rand_graph(30, 0), # dgl.rand_graph(30, 0),
dgl.rand_graph(30, 100), dgl.rand_graph(30, 100),
dgl.rand_bipartite(30, 40, 300) dgl.rand_bipartite('_U', '_E', '_V', 30, 40, 300)
] ]
spmm_shapes = [ spmm_shapes = [
......
...@@ -94,22 +94,12 @@ def create_test_heterograph(idtype): ...@@ -94,22 +94,12 @@ def create_test_heterograph(idtype):
# ('user', 'wishes', 'game'), # ('user', 'wishes', 'game'),
# ('developer', 'develops', 'game')]) # ('developer', 'develops', 'game')])
plays_spmat = ssp.coo_matrix(([1, 1, 1, 1], ([0, 1, 2, 1], [0, 0, 1, 1]))) g = dgl.heterograph({
wishes_nx = nx.DiGraph() ('user', 'follows', 'user'): ([0, 1], [1, 2]),
wishes_nx.add_nodes_from(['u0', 'u1', 'u2'], bipartite=0) ('user', 'plays', 'game'): ([0, 1, 2, 1], [0, 0, 1, 1]),
wishes_nx.add_nodes_from(['g0', 'g1'], bipartite=1) ('user', 'wishes', 'game'): ([0, 2], [1, 0]),
wishes_nx.add_edge('u0', 'g1', id=0) ('developer', 'develops', 'game'): ([0, 1], [0, 1])
wishes_nx.add_edge('u2', 'g0', id=1) }, idtype=idtype, device=F.ctx())
follows_g = dgl.graph([(0, 1), (1, 2)], 'user', 'follows', idtype=idtype, device=F.ctx())
plays_g = dgl.bipartite(plays_spmat, 'user', 'plays', 'game', idtype=idtype, device=F.ctx())
wishes_g = dgl.bipartite(wishes_nx, 'user', 'wishes', 'game', idtype=idtype, device=F.ctx())
develops_g = dgl.bipartite([(0, 0), (1, 1)], 'developer', 'develops', 'game', idtype=idtype, device=F.ctx())
assert follows_g.idtype == idtype
assert plays_g.idtype == idtype
assert wishes_g.idtype == idtype
assert develops_g.idtype == idtype
g = dgl.hetero_from_relations([follows_g, plays_g, wishes_g, develops_g])
assert g.idtype == idtype assert g.idtype == idtype
assert g.device == F.ctx() assert g.device == F.ctx()
return g return g
...@@ -310,7 +300,7 @@ def test_subgraph1(idtype): ...@@ -310,7 +300,7 @@ def test_subgraph1(idtype):
if F._default_context_str != 'gpu': if F._default_context_str != 'gpu':
# TODO(minjie): enable this later # TODO(minjie): enable this later
for fmt in ['csr', 'csc', 'coo']: for fmt in ['csr', 'csc', 'coo']:
g = dgl.graph([(0, 1), (1, 2)]).formats(fmt) g = dgl.graph(([0, 1], [1, 2])).formats(fmt)
sg = g.subgraph({g.ntypes[0]: [1, 0]}) sg = g.subgraph({g.ntypes[0]: [1, 0]})
nids = F.asnumpy(sg.ndata[dgl.NID]) nids = F.asnumpy(sg.ndata[dgl.NID])
assert np.array_equal(nids, np.array([1, 0])) assert np.array_equal(nids, np.array([1, 0]))
...@@ -323,11 +313,12 @@ def test_subgraph1(idtype): ...@@ -323,11 +313,12 @@ def test_subgraph1(idtype):
@unittest.skipIf(F._default_context_str == 'gpu', reason="GPU not implemented") @unittest.skipIf(F._default_context_str == 'gpu', reason="GPU not implemented")
@parametrize_dtype @parametrize_dtype
def test_in_subgraph(idtype): def test_in_subgraph(idtype):
g1 = dgl.graph([(1,0),(2,0),(3,0),(0,1),(2,1),(3,1),(0,2)], 'user', 'follow', idtype=idtype) hg = dgl.heterograph({
g2 = dgl.bipartite([(0,0),(0,1),(1,2),(3,2)], 'user', 'play', 'game', idtype=idtype) ('user', 'follow', 'user'): ([1, 2, 3, 0, 2, 3, 0], [0, 0, 0, 1, 1, 1, 2]),
g3 = dgl.bipartite([(2,0),(2,1),(2,2),(1,0),(1,3),(0,0)], 'game', 'liked-by', 'user', idtype=idtype) ('user', 'play', 'game'): ([0, 0, 1, 3], [0, 1, 2, 2]),
g4 = dgl.bipartite([(0,0),(1,0),(2,0),(3,0)], 'user', 'flips', 'coin', idtype=idtype) ('game', 'liked-by', 'user'): ([2, 2, 2, 1, 1, 0], [0, 1, 2, 0, 3, 0]),
hg = dgl.hetero_from_relations([g1, g2, g3, g4]) ('user', 'flips', 'coin'): ([0, 1, 2, 3], [0, 0, 0, 0])
}, idtype=idtype)
subg = dgl.in_subgraph(hg, {'user' : [0,1], 'game' : 0}) subg = dgl.in_subgraph(hg, {'user' : [0,1], 'game' : 0})
assert subg.idtype == idtype assert subg.idtype == idtype
assert len(subg.ntypes) == 3 assert len(subg.ntypes) == 3
...@@ -349,11 +340,12 @@ def test_in_subgraph(idtype): ...@@ -349,11 +340,12 @@ def test_in_subgraph(idtype):
@unittest.skipIf(F._default_context_str == 'gpu', reason="GPU not implemented") @unittest.skipIf(F._default_context_str == 'gpu', reason="GPU not implemented")
@parametrize_dtype @parametrize_dtype
def test_out_subgraph(idtype): def test_out_subgraph(idtype):
g1 = dgl.graph([(1,0),(2,0),(3,0),(0,1),(2,1),(3,1),(0,2)], 'user', 'follow', idtype=idtype) hg = dgl.heterograph({
g2 = dgl.bipartite([(0,0),(0,1),(1,2),(3,2)], 'user', 'play', 'game', idtype=idtype) ('user', 'follow', 'user'): ([1, 2, 3, 0, 2, 3, 0], [0, 0, 0, 1, 1, 1, 2]),
g3 = dgl.bipartite([(2,0),(2,1),(2,2),(1,0),(1,3),(0,0)], 'game', 'liked-by', 'user', idtype=idtype) ('user', 'play', 'game'): ([0, 0, 1, 3], [0, 1, 2, 2]),
g4 = dgl.bipartite([(0,0),(1,0),(2,0),(3,0)], 'user', 'flips', 'coin', idtype=idtype) ('game', 'liked-by', 'user'): ([2, 2, 2, 1, 1, 0], [0, 1, 2, 0, 3, 0]),
hg = dgl.hetero_from_relations([g1, g2, g3, g4]) ('user', 'flips', 'coin'): ([0, 1, 2, 3], [0, 0, 0, 0])
}, idtype=idtype)
subg = dgl.out_subgraph(hg, {'user' : [0,1], 'game' : 0}) subg = dgl.out_subgraph(hg, {'user' : [0,1], 'game' : 0})
assert subg.idtype == idtype assert subg.idtype == idtype
assert len(subg.ntypes) == 3 assert len(subg.ntypes) == 3
......
...@@ -10,7 +10,7 @@ from dgl.graph_index import from_scipy_sparse_matrix ...@@ -10,7 +10,7 @@ from dgl.graph_index import from_scipy_sparse_matrix
import unittest import unittest
from utils import parametrize_dtype from utils import parametrize_dtype
from test_heterograph import create_test_heterograph4, create_test_heterograph5, create_test_heterograph6 from test_heterograph import create_test_heterograph3, create_test_heterograph4, create_test_heterograph5
D = 5 D = 5
...@@ -20,7 +20,6 @@ def test_line_graph1(): ...@@ -20,7 +20,6 @@ def test_line_graph1():
N = 5 N = 5
G = dgl.DGLGraph(nx.star_graph(N)).to(F.ctx()) G = dgl.DGLGraph(nx.star_graph(N)).to(F.ctx())
G.edata['h'] = F.randn((2 * N, D)) G.edata['h'] = F.randn((2 * N, D))
n_edges = G.number_of_edges()
L = G.line_graph(shared=True) L = G.line_graph(shared=True)
assert L.number_of_nodes() == 2 * N assert L.number_of_nodes() == 2 * N
assert F.allclose(L.ndata['h'], G.edata['h']) assert F.allclose(L.ndata['h'], G.edata['h'])
...@@ -28,8 +27,9 @@ def test_line_graph1(): ...@@ -28,8 +27,9 @@ def test_line_graph1():
@parametrize_dtype @parametrize_dtype
def test_line_graph2(idtype): def test_line_graph2(idtype):
g = dgl.graph(([0, 1, 1, 2, 2],[2, 0, 2, 0, 1]), g = dgl.heterograph({
'user', 'follows', idtype=idtype) ('user', 'follows', 'user'): ([0, 1, 1, 2, 2],[2, 0, 2, 0, 1])
}, idtype=idtype)
lg = dgl.line_graph(g) lg = dgl.line_graph(g)
assert lg.number_of_nodes() == 5 assert lg.number_of_nodes() == 5
assert lg.number_of_edges() == 8 assert lg.number_of_edges() == 8
...@@ -47,8 +47,9 @@ def test_line_graph2(idtype): ...@@ -47,8 +47,9 @@ def test_line_graph2(idtype):
np.array([0, 1, 2, 4])) np.array([0, 1, 2, 4]))
assert np.array_equal(F.asnumpy(col), assert np.array_equal(F.asnumpy(col),
np.array([4, 0, 3, 1])) np.array([4, 0, 3, 1]))
g = dgl.graph(([0, 1, 1, 2, 2],[2, 0, 2, 0, 1]), g = dgl.heterograph({
'user', 'follows', idtype=idtype).formats('csr') ('user', 'follows', 'user'): ([0, 1, 1, 2, 2],[2, 0, 2, 0, 1])
}, idtype=idtype).formats('csr')
lg = dgl.line_graph(g) lg = dgl.line_graph(g)
assert lg.number_of_nodes() == 5 assert lg.number_of_nodes() == 5
assert lg.number_of_edges() == 8 assert lg.number_of_edges() == 8
...@@ -58,8 +59,9 @@ def test_line_graph2(idtype): ...@@ -58,8 +59,9 @@ def test_line_graph2(idtype):
assert np.array_equal(F.asnumpy(col), assert np.array_equal(F.asnumpy(col),
np.array([3, 4, 0, 3, 4, 0, 1, 2])) np.array([3, 4, 0, 3, 4, 0, 1, 2]))
g = dgl.graph(([0, 1, 1, 2, 2],[2, 0, 2, 0, 1]), g = dgl.heterograph({
'user', 'follows', idtype=idtype).formats('csc') ('user', 'follows', 'user'): ([0, 1, 1, 2, 2],[2, 0, 2, 0, 1])
}, idtype=idtype).formats('csc')
lg = dgl.line_graph(g) lg = dgl.line_graph(g)
assert lg.number_of_nodes() == 5 assert lg.number_of_nodes() == 5
assert lg.number_of_edges() == 8 assert lg.number_of_edges() == 8
...@@ -238,9 +240,9 @@ def test_reverse_shared_frames(idtype): ...@@ -238,9 +240,9 @@ def test_reverse_shared_frames(idtype):
def test_to_bidirected(): def test_to_bidirected():
# homogeneous graph # homogeneous graph
elist = [(0, 0), (0, 1), (1, 0), elist = [(0, 0), (0, 1), (1, 0),
(1, 1), (2, 1), (2, 2)] (1, 1), (2, 1), (2, 2)]
num_edges = 7 num_edges = 7
g = dgl.graph(elist) g = dgl.graph(tuple(zip(*elist)))
elist.append((1, 2)) elist.append((1, 2))
elist = set(elist) elist = set(elist)
big = dgl.to_bidirected(g) big = dgl.to_bidirected(g)
...@@ -254,8 +256,8 @@ def test_to_bidirected(): ...@@ -254,8 +256,8 @@ def test_to_bidirected():
(1, 1), (2, 1), (2, 2)] (1, 1), (2, 1), (2, 2)]
elist2 = [(0, 0), (0, 1)] elist2 = [(0, 0), (0, 1)]
g = dgl.heterograph({ g = dgl.heterograph({
('user', 'wins', 'user'): elist1, ('user', 'wins', 'user'): tuple(zip(*elist1)),
('user', 'follows', 'user'): elist2 ('user', 'follows', 'user'): tuple(zip(*elist2))
}) })
g.nodes['user'].data['h'] = F.ones((3, 1)) g.nodes['user'].data['h'] = F.ones((3, 1))
elist1.append((1, 2)) elist1.append((1, 2))
...@@ -301,7 +303,7 @@ def test_add_reverse_edges(): ...@@ -301,7 +303,7 @@ def test_add_reverse_edges():
assert ('h' in bg.edata) is False assert ('h' in bg.edata) is False
# zero edge graph # zero edge graph
g = dgl.graph([]) g = dgl.graph(([], []))
bg = dgl.add_reverse_edges(g, copy_ndata=True, copy_edata=True) bg = dgl.add_reverse_edges(g, copy_ndata=True, copy_edata=True)
# heterogeneous graph # heterogeneous graph
...@@ -487,7 +489,7 @@ def create_large_graph(num_nodes): ...@@ -487,7 +489,7 @@ def create_large_graph(num_nodes):
spm = spsp.coo_matrix((np.ones(len(row)), (row, col))) spm = spsp.coo_matrix((np.ones(len(row)), (row, col)))
spm.sum_duplicates() spm.sum_duplicates()
return dgl.graph(spm) return dgl.from_scipy(spm)
def get_nodeflow(g, node_ids, num_layers): def get_nodeflow(g, node_ids, num_layers):
batch_size = len(node_ids) batch_size = len(node_ids)
...@@ -638,18 +640,20 @@ def test_reorder_nodes(): ...@@ -638,18 +640,20 @@ def test_reorder_nodes():
@parametrize_dtype @parametrize_dtype
def test_compact(idtype): def test_compact(idtype):
g1 = dgl.heterograph({ g1 = dgl.heterograph({
('user', 'follow', 'user'): [(1, 3), (3, 5)], ('user', 'follow', 'user'): ([1, 3], [3, 5]),
('user', 'plays', 'game'): [(2, 4), (3, 4), (2, 5)], ('user', 'plays', 'game'): ([2, 3, 2], [4, 4, 5]),
('game', 'wished-by', 'user'): [(6, 7), (5, 7)]}, ('game', 'wished-by', 'user'): ([6, 5], [7, 7])},
{'user': 20, 'game': 10}, idtype=idtype) {'user': 20, 'game': 10}, idtype=idtype)
g2 = dgl.heterograph({ g2 = dgl.heterograph({
('game', 'clicked-by', 'user'): [(3, 1)], ('game', 'clicked-by', 'user'): ([3], [1]),
('user', 'likes', 'user'): [(1, 8), (8, 9)]}, ('user', 'likes', 'user'): ([1, 8], [8, 9])},
{'user': 20, 'game': 10}, idtype=idtype) {'user': 20, 'game': 10}, idtype=idtype)
g3 = dgl.graph([(0, 1), (1, 2)], num_nodes=10, ntype='user', idtype=idtype) g3 = dgl.heterograph({('user', '_E', 'user'): ((0, 1), (1, 2))},
g4 = dgl.graph([(1, 3), (3, 5)], num_nodes=10, ntype='user', idtype=idtype) {'user': 10}, idtype=idtype)
g4 = dgl.heterograph({('user', '_E', 'user'): ((1, 3), (3, 5))},
{'user': 10}, idtype=idtype)
def _check(g, new_g, induced_nodes): def _check(g, new_g, induced_nodes):
assert g.ntypes == new_g.ntypes assert g.ntypes == new_g.ntypes
...@@ -854,9 +858,9 @@ def test_to_block(idtype): ...@@ -854,9 +858,9 @@ def test_to_block(idtype):
check(g, bg, ntype, etype, None, include_dst_in_src) check(g, bg, ntype, etype, None, include_dst_in_src)
g = dgl.heterograph({ g = dgl.heterograph({
('A', 'AA', 'A'): [(0, 1), (2, 3), (1, 2), (3, 4)], ('A', 'AA', 'A'): ([0, 2, 1, 3], [1, 3, 2, 4]),
('A', 'AB', 'B'): [(0, 1), (1, 3), (3, 5), (1, 6)], ('A', 'AB', 'B'): ([0, 1, 3, 1], [1, 3, 5, 6]),
('B', 'BA', 'A'): [(2, 3), (3, 2)]}, idtype=idtype) ('B', 'BA', 'A'): ([2, 3], [3, 2])}, idtype=idtype)
g.nodes['A'].data['x'] = F.randn((5, 10)) g.nodes['A'].data['x'] = F.randn((5, 10))
g.nodes['B'].data['x'] = F.randn((7, 5)) g.nodes['B'].data['x'] = F.randn((7, 5))
g.edges['AA'].data['x'] = F.randn((4, 3)) g.edges['AA'].data['x'] = F.randn((4, 3))
...@@ -946,20 +950,20 @@ def test_remove_edges(idtype): ...@@ -946,20 +950,20 @@ def test_remove_edges(idtype):
for fmt in ['coo', 'csr', 'csc']: for fmt in ['coo', 'csr', 'csc']:
for edges_to_remove in [[2], [2, 2], [3, 2], [1, 3, 1, 2]]: for edges_to_remove in [[2], [2, 2], [3, 2], [1, 3, 1, 2]]:
g = dgl.graph([(0, 1), (2, 3), (1, 2), (3, 4)], idtype=idtype).formats(fmt) g = dgl.graph(([0, 2, 1, 3], [1, 3, 2, 4]), idtype=idtype).formats(fmt)
g1 = dgl.remove_edges(g, F.tensor(edges_to_remove, idtype)) g1 = dgl.remove_edges(g, F.tensor(edges_to_remove, idtype))
check(g1, None, g, edges_to_remove) check(g1, None, g, edges_to_remove)
g = dgl.graph( g = dgl.from_scipy(
spsp.csr_matrix(([1, 1, 1, 1], ([0, 2, 1, 3], [1, 3, 2, 4])), shape=(5, 5)), spsp.csr_matrix(([1, 1, 1, 1], ([0, 2, 1, 3], [1, 3, 2, 4])), shape=(5, 5)),
idtype=idtype).formats(fmt) idtype=idtype).formats(fmt)
g1 = dgl.remove_edges(g, F.tensor(edges_to_remove, idtype)) g1 = dgl.remove_edges(g, F.tensor(edges_to_remove, idtype))
check(g1, None, g, edges_to_remove) check(g1, None, g, edges_to_remove)
g = dgl.heterograph({ g = dgl.heterograph({
('A', 'AA', 'A'): [(0, 1), (2, 3), (1, 2), (3, 4)], ('A', 'AA', 'A'): ([0, 2, 1, 3], [1, 3, 2, 4]),
('A', 'AB', 'B'): [(0, 1), (1, 3), (3, 5), (1, 6)], ('A', 'AB', 'B'): ([0, 1, 3, 1], [1, 3, 5, 6]),
('B', 'BA', 'A'): [(2, 3), (3, 2)]}, idtype=idtype) ('B', 'BA', 'A'): ([2, 3], [3, 2])}, idtype=idtype)
g2 = dgl.remove_edges(g, {'AA': F.tensor([2], idtype), 'AB': F.tensor([3], idtype), 'BA': F.tensor([1], idtype)}) g2 = dgl.remove_edges(g, {'AA': F.tensor([2], idtype), 'AB': F.tensor([3], idtype), 'BA': F.tensor([1], idtype)})
check(g2, 'AA', g, [2]) check(g2, 'AA', g, [2])
check(g2, 'AB', g, [3]) check(g2, 'AB', g, [3])
...@@ -1031,7 +1035,7 @@ def test_add_edges(idtype): ...@@ -1031,7 +1035,7 @@ def test_add_edges(idtype):
assert F.array_equal(g.edata['hh'], F.tensor([0, 0, 2, 2], dtype=idtype)) assert F.array_equal(g.edata['hh'], F.tensor([0, 0, 2, 2], dtype=idtype))
# zero data graph # zero data graph
g = dgl.graph([], num_nodes=0, idtype=idtype, device=F.ctx()) g = dgl.graph(([], []), num_nodes=0, idtype=idtype, device=F.ctx())
u = F.tensor([0, 1], dtype=idtype) u = F.tensor([0, 1], dtype=idtype)
v = F.tensor([2, 2], dtype=idtype) v = F.tensor([2, 2], dtype=idtype)
e_feat = {'h' : F.copy_to(F.tensor([2, 2], dtype=idtype), ctx=F.ctx()), e_feat = {'h' : F.copy_to(F.tensor([2, 2], dtype=idtype), ctx=F.ctx()),
...@@ -1046,7 +1050,8 @@ def test_add_edges(idtype): ...@@ -1046,7 +1050,8 @@ def test_add_edges(idtype):
assert F.array_equal(g.edata['hh'], F.tensor([2, 2], dtype=idtype)) assert F.array_equal(g.edata['hh'], F.tensor([2, 2], dtype=idtype))
# bipartite graph # bipartite graph
g = dgl.bipartite(([0, 1], [1, 2]), 'user', 'plays', 'game', idtype=idtype, device=F.ctx()) g = dgl.heterograph(
{('user', 'plays', 'game'): ([0, 1], [1, 2])}, idtype=idtype, device=F.ctx())
u = 0 u = 0
v = 1 v = 1
g = dgl.add_edges(g, u, v) g = dgl.add_edges(g, u, v)
...@@ -1073,7 +1078,8 @@ def test_add_edges(idtype): ...@@ -1073,7 +1078,8 @@ def test_add_edges(idtype):
assert F.array_equal(v, F.tensor([1, 2, 1, 1, 1], dtype=idtype)) assert F.array_equal(v, F.tensor([1, 2, 1, 1, 1], dtype=idtype))
# node id larger than current max node id # node id larger than current max node id
g = dgl.bipartite(([0, 1], [1, 2]), 'user', 'plays', 'game', idtype=idtype, device=F.ctx()) g = dgl.heterograph(
{('user', 'plays', 'game'): ([0, 1], [1, 2])}, idtype=idtype, device=F.ctx())
u = F.tensor([0, 2], dtype=idtype) u = F.tensor([0, 2], dtype=idtype)
v = F.tensor([2, 3], dtype=idtype) v = F.tensor([2, 3], dtype=idtype)
g = dgl.add_edges(g, u, v) g = dgl.add_edges(g, u, v)
...@@ -1086,9 +1092,10 @@ def test_add_edges(idtype): ...@@ -1086,9 +1092,10 @@ def test_add_edges(idtype):
assert F.array_equal(v, F.tensor([1, 2, 2, 3], dtype=idtype)) assert F.array_equal(v, F.tensor([1, 2, 2, 3], dtype=idtype))
# has data # has data
g = dgl.bipartite(([0, 1], [1, 2]), 'user', 'plays', 'game', idtype=idtype, device=F.ctx()) g = dgl.heterograph(
g.ndata['h'] = {'user' : F.copy_to(F.tensor([1, 1], dtype=idtype), ctx=F.ctx()), {('user', 'plays', 'game'): ([0, 1], [1, 2])}, idtype=idtype, device=F.ctx())
'game' : F.copy_to(F.tensor([2, 2, 2], dtype=idtype), ctx=F.ctx())} g.nodes['user'].data['h'] = F.copy_to(F.tensor([1, 1], dtype=idtype), ctx=F.ctx())
g.nodes['game'].data['h'] = F.copy_to(F.tensor([2, 2, 2], dtype=idtype), ctx=F.ctx())
g.edata['h'] = F.copy_to(F.tensor([1, 1], dtype=idtype), ctx=F.ctx()) g.edata['h'] = F.copy_to(F.tensor([1, 1], dtype=idtype), ctx=F.ctx())
u = F.tensor([0, 2], dtype=idtype) u = F.tensor([0, 2], dtype=idtype)
v = F.tensor([2, 3], dtype=idtype) v = F.tensor([2, 3], dtype=idtype)
...@@ -1107,7 +1114,7 @@ def test_add_edges(idtype): ...@@ -1107,7 +1114,7 @@ def test_add_edges(idtype):
assert F.array_equal(g.edata['hh'], F.tensor([0, 0, 2, 2], dtype=idtype)) assert F.array_equal(g.edata['hh'], F.tensor([0, 0, 2, 2], dtype=idtype))
# heterogeneous graph # heterogeneous graph
g = create_test_heterograph4(idtype) g = create_test_heterograph3(idtype)
u = F.tensor([0, 2], dtype=idtype) u = F.tensor([0, 2], dtype=idtype)
v = F.tensor([2, 3], dtype=idtype) v = F.tensor([2, 3], dtype=idtype)
g = dgl.add_edges(g, u, v, etype='plays') g = dgl.add_edges(g, u, v, etype='plays')
...@@ -1152,14 +1159,15 @@ def test_add_nodes(idtype): ...@@ -1152,14 +1159,15 @@ def test_add_nodes(idtype):
assert F.array_equal(new_g.ndata['h'], F.tensor([1, 1, 1, 0], dtype=idtype)) assert F.array_equal(new_g.ndata['h'], F.tensor([1, 1, 1, 0], dtype=idtype))
# zero node graph # zero node graph
g = dgl.graph([], num_nodes=3, idtype=idtype, device=F.ctx()) g = dgl.graph(([], []), num_nodes=3, idtype=idtype, device=F.ctx())
g.ndata['h'] = F.copy_to(F.tensor([1,1,1], dtype=idtype), ctx=F.ctx()) g.ndata['h'] = F.copy_to(F.tensor([1,1,1], dtype=idtype), ctx=F.ctx())
g = dgl.add_nodes(g, 1, data={'h' : F.copy_to(F.tensor([2], dtype=idtype), ctx=F.ctx())}) g = dgl.add_nodes(g, 1, data={'h' : F.copy_to(F.tensor([2], dtype=idtype), ctx=F.ctx())})
assert g.number_of_nodes() == 4 assert g.number_of_nodes() == 4
assert F.array_equal(g.ndata['h'], F.tensor([1, 1, 1, 2], dtype=idtype)) assert F.array_equal(g.ndata['h'], F.tensor([1, 1, 1, 2], dtype=idtype))
# bipartite graph # bipartite graph
g = dgl.bipartite(([0, 1], [1, 2]), 'user', 'plays', 'game', idtype=idtype, device=F.ctx()) g = dgl.heterograph(
{('user', 'plays', 'game'): ([0, 1], [1, 2])}, idtype=idtype, device=F.ctx())
g = dgl.add_nodes(g, 2, data={'h' : F.copy_to(F.tensor([2, 2], dtype=idtype), ctx=F.ctx())}, ntype='user') g = dgl.add_nodes(g, 2, data={'h' : F.copy_to(F.tensor([2, 2], dtype=idtype), ctx=F.ctx())}, ntype='user')
assert g.number_of_nodes('user') == 4 assert g.number_of_nodes('user') == 4
assert g.number_of_nodes('game') == 3 assert g.number_of_nodes('game') == 3
...@@ -1169,7 +1177,7 @@ def test_add_nodes(idtype): ...@@ -1169,7 +1177,7 @@ def test_add_nodes(idtype):
assert g.number_of_nodes('game') == 5 assert g.number_of_nodes('game') == 5
# heterogeneous graph # heterogeneous graph
g = create_test_heterograph4(idtype) g = create_test_heterograph3(idtype)
g = dgl.add_nodes(g, 1, ntype='user') g = dgl.add_nodes(g, 1, ntype='user')
g = dgl.add_nodes(g, 2, data={'h' : F.copy_to(F.tensor([2, 2], dtype=idtype), ctx=F.ctx())}, ntype='game') g = dgl.add_nodes(g, 2, data={'h' : F.copy_to(F.tensor([2, 2], dtype=idtype), ctx=F.ctx())}, ntype='game')
assert g.number_of_nodes('user') == 4 assert g.number_of_nodes('user') == 4
...@@ -1222,14 +1230,16 @@ def test_remove_edges(idtype): ...@@ -1222,14 +1230,16 @@ def test_remove_edges(idtype):
assert assert_fail assert assert_fail
# bipartite graph # bipartite graph
g = dgl.bipartite(([0, 1], [1, 2]), 'user', 'plays', 'game', idtype=idtype, device=F.ctx()) g = dgl.heterograph(
{('user', 'plays', 'game'): ([0, 1], [1, 2])}, idtype=idtype, device=F.ctx())
e = 0 e = 0
g = dgl.remove_edges(g, e) g = dgl.remove_edges(g, e)
assert g.number_of_edges() == 1 assert g.number_of_edges() == 1
u, v = g.edges(form='uv', order='eid') u, v = g.edges(form='uv', order='eid')
assert F.array_equal(u, F.tensor([1], dtype=idtype)) assert F.array_equal(u, F.tensor([1], dtype=idtype))
assert F.array_equal(v, F.tensor([2], dtype=idtype)) assert F.array_equal(v, F.tensor([2], dtype=idtype))
g = dgl.bipartite(([0, 1], [1, 2]), 'user', 'plays', 'game', idtype=idtype, device=F.ctx()) g = dgl.heterograph(
{('user', 'plays', 'game'): ([0, 1], [1, 2])}, idtype=idtype, device=F.ctx())
e = [0] e = [0]
g = dgl.remove_edges(g, e) g = dgl.remove_edges(g, e)
assert g.number_of_edges() == 1 assert g.number_of_edges() == 1
...@@ -1241,9 +1251,10 @@ def test_remove_edges(idtype): ...@@ -1241,9 +1251,10 @@ def test_remove_edges(idtype):
assert g.number_of_edges() == 0 assert g.number_of_edges() == 0
# has data # has data
g = dgl.bipartite(([0, 1], [1, 2]), 'user', 'plays', 'game', idtype=idtype, device=F.ctx()) g = dgl.heterograph(
g.ndata['h'] = {'user' : F.copy_to(F.tensor([1, 1], dtype=idtype), ctx=F.ctx()), {('user', 'plays', 'game'): ([0, 1], [1, 2])}, idtype=idtype, device=F.ctx())
'game' : F.copy_to(F.tensor([2, 2, 2], dtype=idtype), ctx=F.ctx())} g.nodes['user'].data['h'] = F.copy_to(F.tensor([1, 1], dtype=idtype), ctx=F.ctx())
g.nodes['game'].data['h'] = F.copy_to(F.tensor([2, 2, 2], dtype=idtype), ctx=F.ctx())
g.edata['h'] = F.copy_to(F.tensor([1, 2], dtype=idtype), ctx=F.ctx()) g.edata['h'] = F.copy_to(F.tensor([1, 2], dtype=idtype), ctx=F.ctx())
g = dgl.remove_edges(g, 1) g = dgl.remove_edges(g, 1)
assert g.number_of_edges() == 1 assert g.number_of_edges() == 1
...@@ -1252,7 +1263,7 @@ def test_remove_edges(idtype): ...@@ -1252,7 +1263,7 @@ def test_remove_edges(idtype):
assert F.array_equal(g.edata['h'], F.tensor([1], dtype=idtype)) assert F.array_equal(g.edata['h'], F.tensor([1], dtype=idtype))
# heterogeneous graph # heterogeneous graph
g = create_test_heterograph4(idtype) g = create_test_heterograph3(idtype)
g.edges['plays'].data['h'] = F.copy_to(F.tensor([1, 2, 3, 4], dtype=idtype), ctx=F.ctx()) g.edges['plays'].data['h'] = F.copy_to(F.tensor([1, 2, 3, 4], dtype=idtype), ctx=F.ctx())
g = dgl.remove_edges(g, 1, etype='plays') g = dgl.remove_edges(g, 1, etype='plays')
assert g.number_of_edges('plays') == 3 assert g.number_of_edges('plays') == 3
...@@ -1314,7 +1325,8 @@ def test_remove_nodes(idtype): ...@@ -1314,7 +1325,8 @@ def test_remove_nodes(idtype):
assert F.array_equal(g.edata['he'], F.tensor([3], dtype=idtype)) assert F.array_equal(g.edata['he'], F.tensor([3], dtype=idtype))
# node id larger than current max node id # node id larger than current max node id
g = dgl.bipartite(([0, 1], [1, 2]), 'user', 'plays', 'game', idtype=idtype, device=F.ctx()) g = dgl.heterograph(
{('user', 'plays', 'game'): ([0, 1], [1, 2])}, idtype=idtype, device=F.ctx())
n = 0 n = 0
g = dgl.remove_nodes(g, n, ntype='user') g = dgl.remove_nodes(g, n, ntype='user')
assert g.number_of_nodes('user') == 1 assert g.number_of_nodes('user') == 1
...@@ -1323,7 +1335,8 @@ def test_remove_nodes(idtype): ...@@ -1323,7 +1335,8 @@ def test_remove_nodes(idtype):
u, v = g.edges(form='uv', order='eid') u, v = g.edges(form='uv', order='eid')
assert F.array_equal(u, F.tensor([0], dtype=idtype)) assert F.array_equal(u, F.tensor([0], dtype=idtype))
assert F.array_equal(v, F.tensor([2], dtype=idtype)) assert F.array_equal(v, F.tensor([2], dtype=idtype))
g = dgl.bipartite(([0, 1], [1, 2]), 'user', 'plays', 'game', idtype=idtype, device=F.ctx()) g = dgl.heterograph(
{('user', 'plays', 'game'): ([0, 1], [1, 2])}, idtype=idtype, device=F.ctx())
n = [1] n = [1]
g = dgl.remove_nodes(g, n, ntype='user') g = dgl.remove_nodes(g, n, ntype='user')
assert g.number_of_nodes('user') == 1 assert g.number_of_nodes('user') == 1
...@@ -1332,7 +1345,8 @@ def test_remove_nodes(idtype): ...@@ -1332,7 +1345,8 @@ def test_remove_nodes(idtype):
u, v = g.edges(form='uv', order='eid') u, v = g.edges(form='uv', order='eid')
assert F.array_equal(u, F.tensor([0], dtype=idtype)) assert F.array_equal(u, F.tensor([0], dtype=idtype))
assert F.array_equal(v, F.tensor([1], dtype=idtype)) assert F.array_equal(v, F.tensor([1], dtype=idtype))
g = dgl.bipartite(([0, 1], [1, 2]), 'user', 'plays', 'game', idtype=idtype, device=F.ctx()) g = dgl.heterograph(
{('user', 'plays', 'game'): ([0, 1], [1, 2])}, idtype=idtype, device=F.ctx())
n = F.tensor([0], dtype=idtype) n = F.tensor([0], dtype=idtype)
g = dgl.remove_nodes(g, n, ntype='game') g = dgl.remove_nodes(g, n, ntype='game')
assert g.number_of_nodes('user') == 2 assert g.number_of_nodes('user') == 2
...@@ -1343,7 +1357,7 @@ def test_remove_nodes(idtype): ...@@ -1343,7 +1357,7 @@ def test_remove_nodes(idtype):
assert F.array_equal(v, F.tensor([0 ,1], dtype=idtype)) assert F.array_equal(v, F.tensor([0 ,1], dtype=idtype))
# heterogeneous graph # heterogeneous graph
g = create_test_heterograph4(idtype) g = create_test_heterograph3(idtype)
g.edges['plays'].data['h'] = F.copy_to(F.tensor([1, 2, 3, 4], dtype=idtype), ctx=F.ctx()) g.edges['plays'].data['h'] = F.copy_to(F.tensor([1, 2, 3, 4], dtype=idtype), ctx=F.ctx())
g = dgl.remove_nodes(g, 0, ntype='game') g = dgl.remove_nodes(g, 0, ntype='game')
assert g.number_of_nodes('user') == 3 assert g.number_of_nodes('user') == 3
...@@ -1377,7 +1391,8 @@ def test_add_selfloop(idtype): ...@@ -1377,7 +1391,8 @@ def test_add_selfloop(idtype):
assert F.array_equal(g.edata['he'], F.tensor([1, 2, 3, 0, 0, 0], dtype=idtype)) assert F.array_equal(g.edata['he'], F.tensor([1, 2, 3, 0, 0, 0], dtype=idtype))
# bipartite graph # bipartite graph
g = dgl.bipartite(([0, 1, 2], [1, 2, 2]), 'user', 'plays', 'game', idtype=idtype, device=F.ctx()) g = dgl.heterograph(
{('user', 'plays', 'game'): ([0, 1, 2], [1, 2, 2])}, idtype=idtype, device=F.ctx())
# nothing will happend # nothing will happend
raise_error = False raise_error = False
try: try:
...@@ -1386,7 +1401,7 @@ def test_add_selfloop(idtype): ...@@ -1386,7 +1401,7 @@ def test_add_selfloop(idtype):
raise_error = True raise_error = True
assert raise_error assert raise_error
g = create_test_heterograph6(idtype) g = create_test_heterograph5(idtype)
g = dgl.add_self_loop(g, etype='follows') g = dgl.add_self_loop(g, etype='follows')
assert g.number_of_nodes('user') == 3 assert g.number_of_nodes('user') == 3
assert g.number_of_nodes('game') == 2 assert g.number_of_nodes('game') == 2
...@@ -1416,7 +1431,8 @@ def test_remove_selfloop(idtype): ...@@ -1416,7 +1431,8 @@ def test_remove_selfloop(idtype):
assert F.array_equal(g.edata['he'], F.tensor([1, 4], dtype=idtype)) assert F.array_equal(g.edata['he'], F.tensor([1, 4], dtype=idtype))
# bipartite graph # bipartite graph
g = dgl.bipartite(([0, 1, 2], [1, 2, 2]), 'user', 'plays', 'game', idtype=idtype, device=F.ctx()) g = dgl.heterograph(
{('user', 'plays', 'game'): ([0, 1, 2], [1, 2, 2])}, idtype=idtype, device=F.ctx())
# nothing will happend # nothing will happend
raise_error = False raise_error = False
try: try:
...@@ -1425,7 +1441,7 @@ def test_remove_selfloop(idtype): ...@@ -1425,7 +1441,7 @@ def test_remove_selfloop(idtype):
raise_error = True raise_error = True
assert raise_error assert raise_error
g = create_test_heterograph5(idtype) g = create_test_heterograph4(idtype)
g = dgl.remove_self_loop(g, etype='follows') g = dgl.remove_self_loop(g, etype='follows')
assert g.number_of_nodes('user') == 3 assert g.number_of_nodes('user') == 3
assert g.number_of_nodes('game') == 2 assert g.number_of_nodes('game') == 2
......
...@@ -30,7 +30,7 @@ def test_bfs(idtype, n=100): ...@@ -30,7 +30,7 @@ def test_bfs(idtype, n=100):
for u, v in edges: for u, v in edges:
if u in layers_nx[-1]: if u in layers_nx[-1]:
frontier.add(v) frontier.add(v)
edge_frontier.add(g.edge_ids(u, v)) edge_frontier.add(g.edge_ids(int(u), int(v)))
else: else:
layers_nx.append(frontier) layers_nx.append(frontier)
edges_nx.append(edge_frontier) edges_nx.append(edge_frontier)
...@@ -43,7 +43,7 @@ def test_bfs(idtype, n=100): ...@@ -43,7 +43,7 @@ def test_bfs(idtype, n=100):
return layers_nx, edges_nx return layers_nx, edges_nx
a = sp.random(n, n, 3 / n, data_rvs=lambda n: np.ones(n)) a = sp.random(n, n, 3 / n, data_rvs=lambda n: np.ones(n))
g = dgl.graph(a).astype(idtype) g = dgl.from_scipy(a).astype(idtype)
g_nx = g.to_networkx() g_nx = g.to_networkx()
src = random.choice(range(n)) src = random.choice(range(n))
...@@ -53,7 +53,7 @@ def test_bfs(idtype, n=100): ...@@ -53,7 +53,7 @@ def test_bfs(idtype, n=100):
assert all(toset(x) == y for x, y in zip(layers_dgl, layers_nx)) assert all(toset(x) == y for x, y in zip(layers_dgl, layers_nx))
g_nx = nx.random_tree(n, seed=42) g_nx = nx.random_tree(n, seed=42)
g = dgl.graph(g_nx).astype(idtype) g = dgl.from_networkx(g_nx).astype(idtype)
src = 0 src = 0
_, edges_nx = _bfs_nx(g_nx, src) _, edges_nx = _bfs_nx(g_nx, src)
edges_dgl = dgl.bfs_edges_generator(g, src) edges_dgl = dgl.bfs_edges_generator(g, src)
...@@ -65,7 +65,7 @@ def test_bfs(idtype, n=100): ...@@ -65,7 +65,7 @@ def test_bfs(idtype, n=100):
def test_topological_nodes(idtype, n=100): def test_topological_nodes(idtype, n=100):
a = sp.random(n, n, 3 / n, data_rvs=lambda n: np.ones(n)) a = sp.random(n, n, 3 / n, data_rvs=lambda n: np.ones(n))
b = sp.tril(a, -1).tocoo() b = sp.tril(a, -1).tocoo()
g = dgl.graph(b).astype(idtype) g = dgl.from_scipy(b).astype(idtype)
layers_dgl = dgl.topological_nodes_generator(g) layers_dgl = dgl.topological_nodes_generator(g)
......
...@@ -51,7 +51,7 @@ def get_local_usable_addr(): ...@@ -51,7 +51,7 @@ def get_local_usable_addr():
def create_random_graph(n): def create_random_graph(n):
arr = (spsp.random(n, n, density=0.001, format='coo', random_state=100) != 0).astype(np.int64) arr = (spsp.random(n, n, density=0.001, format='coo', random_state=100) != 0).astype(np.int64)
return dgl.graph(arr) return dgl.from_scipy(arr)
def run_server(graph_name, server_id, server_count, num_clients, shared_mem): def run_server(graph_name, server_id, server_count, num_clients, shared_mem):
g = DistGraphServer(server_id, "kv_ip_config.txt", num_clients, server_count, g = DistGraphServer(server_id, "kv_ip_config.txt", num_clients, server_count,
......
...@@ -14,7 +14,7 @@ import random ...@@ -14,7 +14,7 @@ import random
def create_random_graph(n): def create_random_graph(n):
arr = (spsp.random(n, n, density=0.001, format='coo', random_state=100) != 0).astype(np.int64) arr = (spsp.random(n, n, density=0.001, format='coo', random_state=100) != 0).astype(np.int64)
return dgl.graph(arr) return dgl.from_scipy(arr)
def check_partition(g, part_method, reshuffle): def check_partition(g, part_method, reshuffle):
g.ndata['labels'] = F.arange(0, g.number_of_nodes()) g.ndata['labels'] = F.arange(0, g.number_of_nodes())
......
...@@ -21,7 +21,7 @@ def _AXWb(A, X, W, b): ...@@ -21,7 +21,7 @@ def _AXWb(A, X, W, b):
@parametrize_dtype @parametrize_dtype
def test_graph_conv(idtype): def test_graph_conv(idtype):
g = dgl.graph(nx.path_graph(3)) g = dgl.from_networkx(nx.path_graph(3))
g = g.astype(idtype).to(F.ctx()) g = g.astype(idtype).to(F.ctx())
ctx = F.ctx() ctx = F.ctx()
adj = g.adjacency_matrix(ctx=ctx) adj = g.adjacency_matrix(ctx=ctx)
...@@ -129,7 +129,7 @@ def _S2AXWb(A, N, X, W, b): ...@@ -129,7 +129,7 @@ def _S2AXWb(A, N, X, W, b):
return Y + b return Y + b
def test_tagconv(): def test_tagconv():
g = dgl.DGLGraph(nx.path_graph(3)).to(F.ctx()) g = dgl.from_networkx(nx.path_graph(3)).to(F.ctx())
ctx = F.ctx() ctx = F.ctx()
adj = g.adjacency_matrix(ctx=ctx) adj = g.adjacency_matrix(ctx=ctx)
norm = mx.nd.power(g.in_degrees().astype('float32'), -0.5) norm = mx.nd.power(g.in_degrees().astype('float32'), -0.5)
...@@ -209,7 +209,7 @@ def test_sage_conv_bi(idtype, g, aggre_type): ...@@ -209,7 +209,7 @@ def test_sage_conv_bi(idtype, g, aggre_type):
@pytest.mark.parametrize('aggre_type', ['mean', 'pool', 'gcn']) @pytest.mark.parametrize('aggre_type', ['mean', 'pool', 'gcn'])
def test_sage_conv_bi2(idtype, aggre_type): def test_sage_conv_bi2(idtype, aggre_type):
# Test the case for graphs without edges # Test the case for graphs without edges
g = dgl.bipartite([], num_nodes=(5, 3)) g = dgl.heterograph({('_U', '_E', '_V'): ([], [])}, {'_U': 5, '_V': 3})
g = g.astype(idtype).to(F.ctx()) g = g.astype(idtype).to(F.ctx())
ctx = F.ctx() ctx = F.ctx()
sage = nn.SAGEConv((3, 3), 2, 'gcn') sage = nn.SAGEConv((3, 3), 2, 'gcn')
...@@ -227,7 +227,7 @@ def test_sage_conv_bi2(idtype, aggre_type): ...@@ -227,7 +227,7 @@ def test_sage_conv_bi2(idtype, aggre_type):
assert h.shape[0] == 3 assert h.shape[0] == 3
def test_gg_conv(): def test_gg_conv():
g = dgl.DGLGraph(nx.erdos_renyi_graph(20, 0.3)).to(F.ctx()) g = dgl.from_networkx(nx.erdos_renyi_graph(20, 0.3)).to(F.ctx())
ctx = F.ctx() ctx = F.ctx()
gg_conv = nn.GatedGraphConv(10, 20, 3, 4) # n_step = 3, n_etypes = 4 gg_conv = nn.GatedGraphConv(10, 20, 3, 4) # n_step = 3, n_etypes = 4
...@@ -241,7 +241,7 @@ def test_gg_conv(): ...@@ -241,7 +241,7 @@ def test_gg_conv():
assert h1.shape == (20, 20) assert h1.shape == (20, 20)
def test_cheb_conv(): def test_cheb_conv():
g = dgl.DGLGraph(nx.erdos_renyi_graph(20, 0.3)).to(F.ctx()) g = dgl.from_networkx(nx.erdos_renyi_graph(20, 0.3)).to(F.ctx())
ctx = F.ctx() ctx = F.ctx()
cheb = nn.ChebConv(10, 20, 3) # k = 3 cheb = nn.ChebConv(10, 20, 3) # k = 3
...@@ -278,7 +278,7 @@ def test_agnn_conv_bi(g, idtype): ...@@ -278,7 +278,7 @@ def test_agnn_conv_bi(g, idtype):
assert h.shape == (g.number_of_dst_nodes(), 5) assert h.shape == (g.number_of_dst_nodes(), 5)
def test_appnp_conv(): def test_appnp_conv():
g = dgl.DGLGraph(nx.erdos_renyi_graph(20, 0.3)).to(F.ctx()) g = dgl.from_networkx(nx.erdos_renyi_graph(20, 0.3)).to(F.ctx())
ctx = F.ctx() ctx = F.ctx()
appnp_conv = nn.APPNPConv(3, 0.1, 0) appnp_conv = nn.APPNPConv(3, 0.1, 0)
...@@ -293,7 +293,7 @@ def test_appnp_conv(): ...@@ -293,7 +293,7 @@ def test_appnp_conv():
def test_dense_cheb_conv(): def test_dense_cheb_conv():
for k in range(1, 4): for k in range(1, 4):
ctx = F.ctx() ctx = F.ctx()
g = dgl.DGLGraph(sp.sparse.random(100, 100, density=0.3)).to(F.ctx()) g = dgl.from_scipy(sp.sparse.random(100, 100, density=0.3)).to(F.ctx())
adj = g.adjacency_matrix(ctx=ctx).tostype('default') adj = g.adjacency_matrix(ctx=ctx).tostype('default')
cheb = nn.ChebConv(5, 2, k) cheb = nn.ChebConv(5, 2, k)
dense_cheb = nn.DenseChebConv(5, 2, k) dense_cheb = nn.DenseChebConv(5, 2, k)
...@@ -472,7 +472,7 @@ def test_nn_conv_bi(g, idtype): ...@@ -472,7 +472,7 @@ def test_nn_conv_bi(g, idtype):
assert h1.shape == (g.number_of_dst_nodes(), 2) assert h1.shape == (g.number_of_dst_nodes(), 2)
def test_sg_conv(): def test_sg_conv():
g = dgl.DGLGraph(nx.erdos_renyi_graph(20, 0.3)).to(F.ctx()) g = dgl.from_networkx(nx.erdos_renyi_graph(20, 0.3)).to(F.ctx())
ctx = F.ctx() ctx = F.ctx()
sgc = nn.SGConv(5, 2, 2) sgc = nn.SGConv(5, 2, 2)
...@@ -485,7 +485,7 @@ def test_sg_conv(): ...@@ -485,7 +485,7 @@ def test_sg_conv():
assert h1.shape == (g.number_of_nodes(), 2) assert h1.shape == (g.number_of_nodes(), 2)
def test_set2set(): def test_set2set():
g = dgl.DGLGraph(nx.path_graph(10)).to(F.ctx()) g = dgl.from_networkx(nx.path_graph(10)).to(F.ctx())
ctx = F.ctx() ctx = F.ctx()
s2s = nn.Set2Set(5, 3, 3) # hidden size 5, 3 iters, 3 layers s2s = nn.Set2Set(5, 3, 3) # hidden size 5, 3 iters, 3 layers
...@@ -504,7 +504,7 @@ def test_set2set(): ...@@ -504,7 +504,7 @@ def test_set2set():
assert h1.shape[0] == 3 and h1.shape[1] == 10 and h1.ndim == 2 assert h1.shape[0] == 3 and h1.shape[1] == 10 and h1.ndim == 2
def test_glob_att_pool(): def test_glob_att_pool():
g = dgl.DGLGraph(nx.path_graph(10)).to(F.ctx()) g = dgl.from_networkx(nx.path_graph(10)).to(F.ctx())
ctx = F.ctx() ctx = F.ctx()
gap = nn.GlobalAttentionPooling(gluon.nn.Dense(1), gluon.nn.Dense(10)) gap = nn.GlobalAttentionPooling(gluon.nn.Dense(1), gluon.nn.Dense(10))
...@@ -522,7 +522,7 @@ def test_glob_att_pool(): ...@@ -522,7 +522,7 @@ def test_glob_att_pool():
assert h1.shape[0] == 4 and h1.shape[1] == 10 and h1.ndim == 2 assert h1.shape[0] == 4 and h1.shape[1] == 10 and h1.ndim == 2
def test_simple_pool(): def test_simple_pool():
g = dgl.DGLGraph(nx.path_graph(15)).to(F.ctx()) g = dgl.from_networkx(nx.path_graph(15)).to(F.ctx())
sum_pool = nn.SumPooling() sum_pool = nn.SumPooling()
avg_pool = nn.AvgPooling() avg_pool = nn.AvgPooling()
...@@ -542,7 +542,7 @@ def test_simple_pool(): ...@@ -542,7 +542,7 @@ def test_simple_pool():
assert h1.shape[0] == 1 and h1.shape[1] == 10 * 5 and h1.ndim == 2 assert h1.shape[0] == 1 and h1.shape[1] == 10 * 5 and h1.ndim == 2
# test#2: batched graph # test#2: batched graph
g_ = dgl.DGLGraph(nx.path_graph(5)).to(F.ctx()) g_ = dgl.from_networkx(nx.path_graph(5)).to(F.ctx())
bg = dgl.batch([g, g_, g, g_, g]) bg = dgl.batch([g, g_, g, g_, g])
h0 = F.randn((bg.number_of_nodes(), 5)) h0 = F.randn((bg.number_of_nodes(), 5))
h1 = sum_pool(bg, h0) h1 = sum_pool(bg, h0)
...@@ -575,7 +575,7 @@ def test_simple_pool(): ...@@ -575,7 +575,7 @@ def test_simple_pool():
def test_rgcn(): def test_rgcn():
ctx = F.ctx() ctx = F.ctx()
etype = [] etype = []
g = dgl.DGLGraph(sp.sparse.random(100, 100, density=0.1), readonly=True).to(F.ctx()) g = dgl.from_scipy(sp.sparse.random(100, 100, density=0.1)).to(F.ctx())
# 5 etypes # 5 etypes
R = 5 R = 5
for i in range(g.number_of_edges()): for i in range(g.number_of_edges()):
...@@ -639,7 +639,7 @@ def test_sequential(): ...@@ -639,7 +639,7 @@ def test_sequential():
e_feat += graph.edata['e'] e_feat += graph.edata['e']
return n_feat, e_feat return n_feat, e_feat
g = dgl.DGLGraph().to(F.ctx()) g = dgl.graph(([], [])).to(F.ctx())
g.add_nodes(3) g.add_nodes(3)
g.add_edges([0, 1, 2, 0, 1, 2, 0, 1, 2], [0, 0, 0, 1, 1, 1, 2, 2, 2]) g.add_edges([0, 1, 2, 0, 1, 2, 0, 1, 2], [0, 0, 0, 1, 1, 1, 2, 2, 2])
net = nn.Sequential() net = nn.Sequential()
...@@ -665,9 +665,10 @@ def test_sequential(): ...@@ -665,9 +665,10 @@ def test_sequential():
n_feat += graph.ndata['h'] n_feat += graph.ndata['h']
return n_feat.reshape(graph.number_of_nodes() // 2, 2, -1).sum(1) return n_feat.reshape(graph.number_of_nodes() // 2, 2, -1).sum(1)
g1 = dgl.DGLGraph(nx.erdos_renyi_graph(32, 0.05)).to(F.ctx()) g1 = dgl.from_networkx(nx.erdos_renyi_graph(32, 0.05)).to(F.ctx())
g2 = dgl.DGLGraph(nx.erdos_renyi_graph(16, 0.2)).to(F.ctx()) g2 = dgl.from_networkx(nx.erdos_renyi_graph(16, 0.2)).to(F.ctx())
g3 = dgl.DGLGraph(nx.erdos_renyi_graph(8, 0.8)).to(F.ctx()) g3 = dgl.from_networkx(nx.erdos_renyi_graph(8, 0.8)).to(F.ctx())
net = nn.Sequential() net = nn.Sequential()
net.add(ExampleLayer()) net.add(ExampleLayer())
net.add(ExampleLayer()) net.add(ExampleLayer())
...@@ -687,9 +688,9 @@ def myagg(alist, dsttype): ...@@ -687,9 +688,9 @@ def myagg(alist, dsttype):
@pytest.mark.parametrize('agg', ['sum', 'max', 'min', 'mean', 'stack', myagg]) @pytest.mark.parametrize('agg', ['sum', 'max', 'min', 'mean', 'stack', myagg])
def test_hetero_conv(agg, idtype): def test_hetero_conv(agg, idtype):
g = dgl.heterograph({ g = dgl.heterograph({
('user', 'follows', 'user'): [(0, 1), (0, 2), (2, 1), (1, 3)], ('user', 'follows', 'user'): ([0, 0, 2, 1], [1, 2, 1, 3]),
('user', 'plays', 'game'): [(0, 0), (0, 2), (0, 3), (1, 0), (2, 2)], ('user', 'plays', 'game'): ([0, 0, 0, 1, 2], [0, 2, 3, 0, 2]),
('store', 'sells', 'game'): [(0, 0), (0, 3), (1, 1), (1, 2)]}, ('store', 'sells', 'game'): ([0, 0, 1, 1], [0, 3, 1, 2])},
idtype=idtype, device=F.ctx()) idtype=idtype, device=F.ctx())
conv = nn.HeteroGraphConv({ conv = nn.HeteroGraphConv({
'follows': nn.GraphConv(2, 3, allow_zero_in_degree=True), 'follows': nn.GraphConv(2, 3, allow_zero_in_degree=True),
......
...@@ -72,18 +72,19 @@ def _check_neighbor_sampling_dataloader(g, nids, dl, mode): ...@@ -72,18 +72,19 @@ def _check_neighbor_sampling_dataloader(g, nids, dl, mode):
@unittest.skipIf(F._default_context_str == 'gpu', reason="GPU sample neighbors not implemented") @unittest.skipIf(F._default_context_str == 'gpu', reason="GPU sample neighbors not implemented")
def test_neighbor_sampler_dataloader(): def test_neighbor_sampler_dataloader():
g = dgl.graph([(0,1),(0,2),(0,3),(1,3),(1,4)], g = dgl.heterograph({('user', 'follow', 'user'): ([0, 0, 0, 1, 1], [1, 2, 3, 3, 4])},
'user', 'follow', num_nodes=6).long() {'user': 6}).long()
g = dgl.to_bidirected(g) g = dgl.to_bidirected(g)
reverse_eids = F.tensor([5, 6, 7, 8, 9, 0, 1, 2, 3, 4], dtype=F.int64) reverse_eids = F.tensor([5, 6, 7, 8, 9, 0, 1, 2, 3, 4], dtype=F.int64)
g_sampler1 = dgl.dataloading.MultiLayerNeighborSampler([2, 2], return_eids=True) g_sampler1 = dgl.dataloading.MultiLayerNeighborSampler([2, 2], return_eids=True)
g_sampler2 = dgl.dataloading.MultiLayerFullNeighborSampler(2, return_eids=True) g_sampler2 = dgl.dataloading.MultiLayerFullNeighborSampler(2, return_eids=True)
hg = dgl.heterograph({ hg = dgl.heterograph({
('user', 'follow', 'user'): [(0, 1), (0, 2), (0, 3), (1, 0), (1, 2), (1, 3), (2, 0)], ('user', 'follow', 'user'): ([0, 0, 0, 1, 1, 1, 2], [1, 2, 3, 0, 2, 3, 0]),
('user', 'followed-by', 'user'): [(1, 0), (2, 0), (3, 0), (0, 1), (2, 1), (3, 1), (0, 2)], ('user', 'followed-by', 'user'): ([1, 2, 3, 0, 2, 3, 0], [0, 0, 0, 1, 1, 1, 2]),
('user', 'play', 'game'): [(0, 0), (1, 1), (1, 2), (3, 0), (5, 2)], ('user', 'play', 'game'): ([0, 1, 1, 3, 5], [0, 1, 2, 0, 2]),
('game', 'played-by', 'user'): [(0, 0), (1, 1), (2, 1), (0, 3), (2, 5)]}).long() ('game', 'played-by', 'user'): ([0, 1, 2, 0, 2], [0, 1, 1, 3, 5])
}).long()
hg_sampler1 = dgl.dataloading.MultiLayerNeighborSampler( hg_sampler1 = dgl.dataloading.MultiLayerNeighborSampler(
[{'play': 1, 'played-by': 1, 'follow': 2, 'followed-by': 1}] * 2, return_eids=True) [{'play': 1, 'played-by': 1, 'follow': 2, 'followed-by': 1}] * 2, return_eids=True)
hg_sampler2 = dgl.dataloading.MultiLayerFullNeighborSampler(2, return_eids=True) hg_sampler2 = dgl.dataloading.MultiLayerFullNeighborSampler(2, return_eids=True)
......
...@@ -10,7 +10,7 @@ def sub_ipc(g): ...@@ -10,7 +10,7 @@ def sub_ipc(g):
@unittest.skipIf(os.name == 'nt', reason='Do not support windows yet') @unittest.skipIf(os.name == 'nt', reason='Do not support windows yet')
def test_torch_ipc(): def test_torch_ipc():
g = dgl.graph([(0, 1), (1, 2), (2, 3)]) g = dgl.graph(([0, 1, 2], [1, 2, 3]))
ctx = mp.get_context("spawn") ctx = mp.get_context("spawn")
p = ctx.Process(target=sub_ipc, args=(g, )) p = ctx.Process(target=sub_ipc, args=(g, ))
......
...@@ -419,7 +419,7 @@ def test_sage_conv_bi(idtype, g, aggre_type): ...@@ -419,7 +419,7 @@ def test_sage_conv_bi(idtype, g, aggre_type):
def test_sage_conv2(idtype): def test_sage_conv2(idtype):
# TODO: add test for blocks # TODO: add test for blocks
# Test the case for graphs without edges # Test the case for graphs without edges
g = dgl.bipartite([], num_nodes=(5, 3)) g = dgl.heterograph({('_U', '_E', '_V'): ([], [])}, {'_U': 5, '_V': 3})
g = g.astype(idtype).to(F.ctx()) g = g.astype(idtype).to(F.ctx())
ctx = F.ctx() ctx = F.ctx()
sage = nn.SAGEConv((3, 3), 2, 'gcn') sage = nn.SAGEConv((3, 3), 2, 'gcn')
...@@ -776,9 +776,9 @@ def myagg(alist, dsttype): ...@@ -776,9 +776,9 @@ def myagg(alist, dsttype):
@pytest.mark.parametrize('agg', ['sum', 'max', 'min', 'mean', 'stack', myagg]) @pytest.mark.parametrize('agg', ['sum', 'max', 'min', 'mean', 'stack', myagg])
def test_hetero_conv(agg, idtype): def test_hetero_conv(agg, idtype):
g = dgl.heterograph({ g = dgl.heterograph({
('user', 'follows', 'user'): [(0, 1), (0, 2), (2, 1), (1, 3)], ('user', 'follows', 'user'): ([0, 0, 2, 1], [1, 2, 1, 3]),
('user', 'plays', 'game'): [(0, 0), (0, 2), (0, 3), (1, 0), (2, 2)], ('user', 'plays', 'game'): ([0, 0, 0, 1, 2], [0, 2, 3, 0, 2]),
('store', 'sells', 'game'): [(0, 0), (0, 3), (1, 1), (1, 2)]}, ('store', 'sells', 'game'): ([0, 0, 1, 1], [0, 3, 1, 2])},
idtype=idtype, device=F.ctx()) idtype=idtype, device=F.ctx())
conv = nn.HeteroGraphConv({ conv = nn.HeteroGraphConv({
'follows': nn.GraphConv(2, 3, allow_zero_in_degree=True), 'follows': nn.GraphConv(2, 3, allow_zero_in_degree=True),
...@@ -789,8 +789,6 @@ def test_hetero_conv(agg, idtype): ...@@ -789,8 +789,6 @@ def test_hetero_conv(agg, idtype):
uf = F.randn((4, 2)) uf = F.randn((4, 2))
gf = F.randn((4, 4)) gf = F.randn((4, 4))
sf = F.randn((2, 3)) sf = F.randn((2, 3))
uf_dst = F.randn((4, 3))
gf_dst = F.randn((4, 4))
h = conv(g, {'user': uf}) h = conv(g, {'user': uf})
assert set(h.keys()) == {'user', 'game'} assert set(h.keys()) == {'user', 'game'}
...@@ -897,4 +895,4 @@ if __name__ == '__main__': ...@@ -897,4 +895,4 @@ if __name__ == '__main__':
test_dense_cheb_conv() test_dense_cheb_conv()
test_sequential() test_sequential()
test_atomic_conv() test_atomic_conv()
test_cf_conv() test_cf_conv()
\ No newline at end of file
...@@ -304,7 +304,7 @@ def test_sage_conv_bi(idtype, g, aggre_type): ...@@ -304,7 +304,7 @@ def test_sage_conv_bi(idtype, g, aggre_type):
@pytest.mark.parametrize('aggre_type', ['mean', 'pool', 'gcn']) @pytest.mark.parametrize('aggre_type', ['mean', 'pool', 'gcn'])
def test_sage_conv_bi_empty(idtype, aggre_type): def test_sage_conv_bi_empty(idtype, aggre_type):
# Test the case for graphs without edges # Test the case for graphs without edges
g = dgl.bipartite([], num_nodes=(5, 3)).to(F.ctx()) g = dgl.heterograph({('_U', '_E', '_V'): ([], [])}, {'_U': 5, '_V': 3}).to(F.ctx())
g = g.astype(idtype).to(F.ctx()) g = g.astype(idtype).to(F.ctx())
sage = nn.SAGEConv((3, 3), 2, 'gcn') sage = nn.SAGEConv((3, 3), 2, 'gcn')
feat = (F.randn((5, 3)), F.randn((3, 3))) feat = (F.randn((5, 3)), F.randn((3, 3)))
...@@ -385,9 +385,9 @@ def myagg(alist, dsttype): ...@@ -385,9 +385,9 @@ def myagg(alist, dsttype):
@pytest.mark.parametrize('agg', ['sum', 'max', 'min', 'mean', 'stack', myagg]) @pytest.mark.parametrize('agg', ['sum', 'max', 'min', 'mean', 'stack', myagg])
def test_hetero_conv(agg, idtype): def test_hetero_conv(agg, idtype):
g = dgl.heterograph({ g = dgl.heterograph({
('user', 'follows', 'user'): [(0, 1), (0, 2), (2, 1), (1, 3)], ('user', 'follows', 'user'): ([0, 0, 2, 1], [1, 2, 1, 3]),
('user', 'plays', 'game'): [(0, 0), (0, 2), (0, 3), (1, 0), (2, 2)], ('user', 'plays', 'game'): ([0, 0, 0, 1, 2], [0, 2, 3, 0, 2]),
('store', 'sells', 'game'): [(0, 0), (0, 3), (1, 1), (1, 2)]}, ('store', 'sells', 'game'): ([0, 0, 1, 1], [0, 3, 1, 2])},
idtype=idtype, device=F.ctx()) idtype=idtype, device=F.ctx())
conv = nn.HeteroGraphConv({ conv = nn.HeteroGraphConv({
'follows': nn.GraphConv(2, 3, allow_zero_in_degree=True), 'follows': nn.GraphConv(2, 3, allow_zero_in_degree=True),
......
...@@ -31,11 +31,13 @@ def get_cases(labels=None, exclude=[]): ...@@ -31,11 +31,13 @@ def get_cases(labels=None, exclude=[]):
@register_case(['bipartite', 'zero-degree']) @register_case(['bipartite', 'zero-degree'])
def bipartite1(): def bipartite1():
return dgl.bipartite([(0, 0), (0, 1), (0, 4), (2, 1), (2, 4), (3, 3)]) return dgl.heterograph({('_U', '_E', '_V'): ([0, 0, 0, 2, 2, 3],
[0, 1, 4, 1, 4, 3])})
@register_case(['bipartite']) @register_case(['bipartite'])
def bipartite_full(): def bipartite_full():
return dgl.bipartite([(0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), (1, 2), (1, 3)]) return dgl.heterograph({('_U', '_E', '_V'): ([0, 0, 0, 0, 1, 1, 1, 1],
[0, 1, 2, 3, 0, 1, 2, 3])})
@register_case(['homo']) @register_case(['homo'])
def graph0(): def graph0():
...@@ -44,12 +46,12 @@ def graph0(): ...@@ -44,12 +46,12 @@ def graph0():
@register_case(['homo', 'zero-degree', 'homo-zero-degree']) @register_case(['homo', 'zero-degree', 'homo-zero-degree'])
def bipartite1(): def bipartite1():
return dgl.graph([(0, 0), (0, 1), (0, 4), (2, 1), (2, 4), (3, 3)]) return dgl.graph(([0, 0, 0, 2, 2, 3], [0, 1, 4, 1, 4, 3]))
@register_case(['homo', 'has_feature']) @register_case(['homo', 'has_feature'])
def graph1(): def graph1():
g = dgl.graph(([0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 6, 6, 7, 8, 9], g = dgl.graph(([0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 6, 6, 7, 8, 9],
[4, 5, 1, 2, 4, 7, 9, 8 ,6, 4, 1, 0, 1, 0, 2, 3, 5])) [4, 5, 1, 2, 4, 7, 9, 8 ,6, 4, 1, 0, 1, 0, 2, 3, 5]), device=F.cpu())
g.ndata['h'] = F.copy_to(F.randn((g.number_of_nodes(), 2)), F.cpu()) g.ndata['h'] = F.copy_to(F.randn((g.number_of_nodes(), 2)), F.cpu())
g.edata['w'] = F.copy_to(F.randn((g.number_of_edges(), 3)), F.cpu()) g.edata['w'] = F.copy_to(F.randn((g.number_of_edges(), 3)), F.cpu())
return g return g
...@@ -58,7 +60,7 @@ def graph1(): ...@@ -58,7 +60,7 @@ def graph1():
def heterograph0(): def heterograph0():
g = dgl.heterograph({ g = dgl.heterograph({
('user', 'plays', 'game'): ([0, 1, 1, 2], [0, 0, 1, 1]), ('user', 'plays', 'game'): ([0, 1, 1, 2], [0, 0, 1, 1]),
('developer', 'develops', 'game'): ([0, 1], [0, 1])}) ('developer', 'develops', 'game'): ([0, 1], [0, 1])}, device=F.cpu())
g.nodes['user'].data['h'] = F.copy_to(F.randn((g.number_of_nodes('user'), 3)), F.cpu()) g.nodes['user'].data['h'] = F.copy_to(F.randn((g.number_of_nodes('user'), 3)), F.cpu())
g.nodes['game'].data['h'] = F.copy_to(F.randn((g.number_of_nodes('game'), 2)), F.cpu()) g.nodes['game'].data['h'] = F.copy_to(F.randn((g.number_of_nodes('game'), 2)), F.cpu())
g.nodes['developer'].data['h'] = F.copy_to(F.randn((g.number_of_nodes('developer'), 3)), F.cpu()) g.nodes['developer'].data['h'] = F.copy_to(F.randn((g.number_of_nodes('developer'), 3)), F.cpu())
...@@ -77,6 +79,7 @@ def batched_graph0(): ...@@ -77,6 +79,7 @@ def batched_graph0():
@register_case(['block', 'bipartite', 'block-biparitite']) @register_case(['block', 'bipartite', 'block-biparitite'])
def block_graph0(): def block_graph0():
g = dgl.graph(([2, 3, 4], [5, 6, 7]), num_nodes=100) g = dgl.graph(([2, 3, 4], [5, 6, 7]), num_nodes=100)
g = g.to(F.cpu())
return dgl.to_block(g) return dgl.to_block(g)
@register_case(['block']) @register_case(['block'])
...@@ -85,7 +88,7 @@ def block_graph1(): ...@@ -85,7 +88,7 @@ def block_graph1():
('user', 'plays', 'game') : ([0, 1, 2], [1, 1, 0]), ('user', 'plays', 'game') : ([0, 1, 2], [1, 1, 0]),
('user', 'likes', 'game') : ([1, 2, 3], [0, 0, 2]), ('user', 'likes', 'game') : ([1, 2, 3], [0, 0, 2]),
('store', 'sells', 'game') : ([0, 1, 1], [0, 1, 2]), ('store', 'sells', 'game') : ([0, 1, 1], [0, 1, 2]),
}) }, device=F.cpu())
return dgl.to_block(g) return dgl.to_block(g)
@register_case(['clique']) @register_case(['clique'])
...@@ -97,11 +100,12 @@ def random_dglgraph(size): ...@@ -97,11 +100,12 @@ def random_dglgraph(size):
return dgl.DGLGraph(nx.erdos_renyi_graph(size, 0.3)) return dgl.DGLGraph(nx.erdos_renyi_graph(size, 0.3))
def random_graph(size): def random_graph(size):
return dgl.graph(nx.erdos_renyi_graph(size, 0.3)) return dgl.from_networkx(nx.erdos_renyi_graph(size, 0.3))
def random_bipartite(size_src, size_dst): def random_bipartite(size_src, size_dst):
return dgl.bipartite(ssp.random(size_src, size_dst, 0.1)) return dgl.bipartite_from_scipy(ssp.random(size_src, size_dst, 0.1),
utype='_U', etype='_E', vtype='V', )
def random_block(size): def random_block(size):
g = dgl.graph(nx.erdos_renyi_graph(size, 0.1)) g = dgl.from_networkx(nx.erdos_renyi_graph(size, 0.1))
return dgl.to_block(g, np.unique(F.zerocopy_to_numpy(g.edges()[1]))) return dgl.to_block(g, np.unique(F.zerocopy_to_numpy(g.edges()[1])))
...@@ -135,7 +135,7 @@ g.edata['w'][th.tensor([0, 1, 2])] = th.zeros(3, 2) ...@@ -135,7 +135,7 @@ g.edata['w'][th.tensor([0, 1, 2])] = th.zeros(3, 2)
g.edata['w'][g.edge_id(1, 0)] = th.ones(1, 2) # edge 1 -> 0 g.edata['w'][g.edge_id(1, 0)] = th.ones(1, 2) # edge 1 -> 0
g.edata['w'][g.edge_ids([1, 2, 3], [0, 0, 0])] = th.ones(3, 2) # edges [1, 2, 3] -> 0 g.edata['w'][g.edge_ids([1, 2, 3], [0, 0, 0])] = th.ones(3, 2) # edges [1, 2, 3] -> 0
# Use edge broadcasting whenever applicable. # Use edge broadcasting whenever applicable.
g.edata['w'][g.edge_ids([1, 2, 3], 0)] = th.ones(3, 2) # edges [1, 2, 3] -> 0 g.edata['w'][g.edge_ids([1, 2, 3], [0, 0, 0])] = th.ones(3, 2) # edges [1, 2, 3] -> 0
############################################################################### ###############################################################################
# After assignments, each node or edge field will be associated with a scheme # After assignments, each node or edge field will be associated with a scheme
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment