Heterogeneous subgraph operation crashes with CSC-only format
- Dominant language
- Python
- Stars
- 14.3k
- Forks
- 3.1k
- PR merge metrics
- No merged PRs in 30d
Description
## 🐛 Bug
Calling `hg.subgraph()` will crash on heterogeneous graphs with CSC format under certain cases
## To Reproduce
Steps to reproduce the behavior:
```python
g = dgl.heterograph({
('A', 'AB', 'B'): ([1,2,3,4,5],[0,1,2,1,0]),
('B', 'BA', 'A'): ([0,1,2,1,0],[1,2,3,4,5]),
})
# works
g = g.formats('csr')
g.subgraph({'A': [3, 4, 5], 'B': [0, 1, 2]})
# crashes
g = g.formats('csc')
g.subgraph({'A': [3, 4, 5], 'B': [0, 1, 2]})
```
```
---------------------------------------------------------------------------
DGLError Traceback (most recent call last)
Input In [28], in ()
1 g = g.formats('csc')
----> 2 sg = g.subgraph({'A': [3, 4, 5], 'B': [0, 1, 2]})
File ~/miniconda3/lib/python3.9/site-packages/dgl-1.2-py3.9-linux-x86_64.egg/dgl/utils/internal.py:1051, in alias_func.._fn(*args, **kwargs)
1049 @wraps(func)
1050 def _fn(*args, **kwargs):
-> 1051 return func(*args, **kwargs)
File ~/miniconda3/lib/python3.9/site-packages/dgl-1.2-py3.9-linux-x86_64.egg/dgl/subgraph.py:164, in node_subgraph(graph, nodes, relabel_nodes, store_ids, output_device)
158 device = context_of(nodes)
160 induced_nodes = [
161 nodes.get(ntype, F.copy_to(F.tensor([], graph.idtype), device))
162 for ntype in graph.ntypes
163 ]
--> 164 sgi = graph._graph.node_subgraph(induced_nodes, relabel_nodes)
165 induced_edges = sgi.induced_edges
166 # (BarclayII) should not write induced_nodes = sgi.induced_nodes due to the same
167 # bug in #1453.
File ~/miniconda3/lib/python3.9/site-packages/dgl-1.2-py3.9-linux-x86_64.egg/dgl/heterograph_index.py:1038, in HeteroGraphIndex.node_subgraph(self, induced_nodes, relabel_nodes)
1021 """Return the induced node subgraph.
1022
1023 Parameters
(...)
1035 The subgraph index.
1036 """
1037 vids = [F.to_dgl_nd(nodes) for nodes in induced_nodes]
-> 1038 return _CAPI_DGLHeteroVertexSubgraph(self, vids, relabel_nodes)
File dgl/_ffi/_cython/./function.pxi:295, in dgl._ffi._cy3.core.FunctionBase.__call__()
File dgl/_ffi/_cython/./function.pxi:227, in dgl._ffi._cy3.core.FuncCall()
File dgl/_ffi/_cython/./function.pxi:217, in dgl._ffi._cy3.core.FuncCall3()
DGLError: [07:53:52] /home/ubuntu/dgl/src/array/cpu/spmat_op_impl_csr.cc:514: Check failed: oldi >= 0 && oldi < csr.num_rows: Invalid row index: 3
Stack trace:
[bt] (0) /home/ubuntu/miniconda3/lib/python3.9/site-packages/dgl-1.2-py3.9-linux-x86_64.egg/dgl/libdgl.so(dmlc::LogMessageFatal::~LogMessageFatal()+0x4e) [0x7fd7ab47ff06]
[bt] (1) /home/ubuntu/miniconda3/lib/python3.9/site-packages/dgl-1.2-py3.9-linux-x86_64.egg/dgl/libdgl.so(dgl::aten::CSRMatrix dgl::aten::impl::CSRSliceMatrix<(DGLDeviceType)1, long>(dgl::aten::CSRMatrix, dgl::runtime::NDArray, dgl::runtime::NDArray)+0x2c2) [0x7fd7ab764b6e]
[bt] (2) /home/ubuntu/miniconda3/lib/python3.9/site-packages/dgl-1.2-py3.9-linux-x86_64.egg/dgl/libdgl.so(dgl::aten::CSRSliceMatrix(dgl::aten::CSRMatrix, dgl::runtime::NDArray, dgl::runtime::NDArray)+0x8bf) [0x7fd7ab45c21c]
[bt] (3) /home/ubuntu/miniconda3/lib/python3.9/site-packages/dgl-1.2-py3.9-linux-x86_64.egg/dgl/libdgl.so(dgl::UnitGraph::CSR::VertexSubgraph(std::vector > const&) const+0x336) [0x7fd7abb6b476]
[bt] (4) /home/ubuntu/miniconda3/lib/python3.9/site-packages/dgl-1.2-py3.9-linux-x86_64.egg/dgl/libdgl.so(dgl::UnitGraph::VertexSubgraph(std::vector > const&) const+0x9d) [0x7fd7abb577f7]
[bt] (5) /home/ubuntu/miniconda3/lib/python3.9/site-packages/dgl-1.2-py3.9-linux-x86_64.egg/dgl/libdgl.so(dgl::HeteroGraph::VertexSubgraph(std::vector > const&) const+0x5cf) [0x7fd7ab9ecc67]
[bt] (6) /home/ubuntu/miniconda3/lib/python3.9/site-packages/dgl-1.2-py3.9-linux-x86_64.egg/dgl/libdgl.so(+0xd9ca69) [0x7fd7aba05a69]
[bt] (7) /home/ubuntu/miniconda3/lib/python3.9/site-packages/dgl-1.2-py3.9-linux-x86_64.egg/dgl/libdgl.so(+0xda9b4a) [0x7fd7aba12b4a]
[bt] (8) /home/ubuntu/miniconda3/lib/python3.9/site-packages/dgl-1.2-py3.9-linux-x86_64.egg/dgl/libdgl.so(std::function::operator()(dgl::runtime::DGLArgs, dgl::runtime::DGLRetValue*) const+0x5a) [0x7fd7ab93ba72]
```
## Expected behavior
CSC should not crash
## Environment
- DGL Version (e.g., 1.0): master
- Backend Library & Version (e.g., PyTorch 0.4.1, MXNet/Gluon 1.3): PyTorch 2.0
- OS (e.g., Linux): Linux
- How you installed DGL (`conda`, `pip`, source): source
- Build command you used (if compiling from source): `cmake -DUSE_OPENMP=OFF -DUSE_CUDA=ON` (turning on OpenMP has the same problem).
- Python version: 3.9
- CUDA/cuDNN version (if applicable):
- GPU models and configuration (e.g. V100):
- Any other relevant information:
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.