graph_apis.cc 10.3 KB
Newer Older
1
2
/*!
 *  Copyright (c) 2018 by Contributors
3
4
 * @file graph/graph.cc
 * @brief DGL graph index APIs
5
 */
Minjie Wang's avatar
Minjie Wang committed
6
#include <dgl/graph.h>
Minjie Wang's avatar
Minjie Wang committed
7
#include <dgl/graph_op.h>
8
#include <dgl/immutable_graph.h>
9
#include <dgl/nodeflow.h>
10
11
12
#include <dgl/packed_func_ext.h>
#include <dgl/sampler.h>

Lingfan Yu's avatar
Lingfan Yu committed
13
#include "../c_api_common.h"
Minjie Wang's avatar
Minjie Wang committed
14

15
16
17
18
using dgl::runtime::DGLArgs;
using dgl::runtime::DGLArgValue;
using dgl::runtime::DGLRetValue;
using dgl::runtime::NDArray;
19
using dgl::runtime::PackedFunc;
Minjie Wang's avatar
Minjie Wang committed
20
21

namespace dgl {
Minjie Wang's avatar
Minjie Wang committed
22

23
24
25
///////////////////////////// Graph API ///////////////////////////////////

DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphCreateMutable")
26
27
28
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      *rv = GraphRef(Graph::Create());
    });
29

30
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphCreate")
31
32
33
34
35
36
37
38
39
40
41
42
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      const IdArray src_ids = args[0];
      const IdArray dst_ids = args[1];
      const int64_t num_nodes = args[2];
      const bool readonly = args[3];
      if (readonly) {
        *rv = GraphRef(
            ImmutableGraph::CreateFromCOO(num_nodes, src_ids, dst_ids));
      } else {
        *rv = GraphRef(Graph::CreateFromCOO(num_nodes, src_ids, dst_ids));
      }
    });
43

44
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphCSRCreate")
45
46
47
48
49
50
51
52
53
54
55
56
57
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      const IdArray indptr = args[0];
      const IdArray indices = args[1];
      const std::string edge_dir = args[2];

      IdArray edge_ids = IdArray::Empty(
          {indices->shape[0]}, DGLDataType{kDGLInt, 64, 1},
          DGLContext{kDGLCPU, 0});
      int64_t* edge_data = static_cast<int64_t*>(edge_ids->data);
      for (int64_t i = 0; i < edge_ids->shape[0]; i++) edge_data[i] = i;
      *rv = GraphRef(
          ImmutableGraph::CreateFromCSR(indptr, indices, edge_ids, edge_dir));
    });
58
59

DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphCSRCreateMMap")
60
61
62
63
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      const std::string shared_mem_name = args[0];
      *rv = GraphRef(ImmutableGraph::CreateFromCSR(shared_mem_name));
    });
Minjie Wang's avatar
Minjie Wang committed
64

65
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphAddVertices")
66
67
68
69
70
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      GraphRef g = args[0];
      uint64_t num_vertices = args[1];
      g->AddVertices(num_vertices);
    });
Minjie Wang's avatar
Minjie Wang committed
71

72
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphAddEdge")
73
74
75
76
77
78
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      GraphRef g = args[0];
      const dgl_id_t src = args[1];
      const dgl_id_t dst = args[2];
      g->AddEdge(src, dst);
    });
Minjie Wang's avatar
Minjie Wang committed
79

80
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphAddEdges")
81
82
83
84
85
86
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      GraphRef g = args[0];
      const IdArray src = args[1];
      const IdArray dst = args[2];
      g->AddEdges(src, dst);
    });
Minjie Wang's avatar
Minjie Wang committed
87

88
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphClear")
89
90
91
92
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      GraphRef g = args[0];
      g->Clear();
    });
Minjie Wang's avatar
Minjie Wang committed
93

94
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphIsMultigraph")
95
96
97
98
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      GraphRef g = args[0];
      *rv = g->IsMultigraph();
    });
99

100
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphIsReadonly")
101
102
103
104
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      GraphRef g = args[0];
      *rv = g->IsReadonly();
    });
105

106
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphNumVertices")
107
108
109
110
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      GraphRef g = args[0];
      *rv = static_cast<int64_t>(g->NumVertices());
    });
Minjie Wang's avatar
Minjie Wang committed
111

112
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphNumEdges")
113
114
115
116
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      GraphRef g = args[0];
      *rv = static_cast<int64_t>(g->NumEdges());
    });
Minjie Wang's avatar
Minjie Wang committed
117

118
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphHasVertex")
119
120
121
122
123
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      GraphRef g = args[0];
      const dgl_id_t vid = args[1];
      *rv = g->HasVertex(vid);
    });
Minjie Wang's avatar
Minjie Wang committed
124

125
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphHasVertices")
126
127
128
129
130
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      GraphRef g = args[0];
      const IdArray vids = args[1];
      *rv = g->HasVertices(vids);
    });
131

132
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphHasEdgeBetween")
133
134
135
136
137
138
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      GraphRef g = args[0];
      const dgl_id_t src = args[1];
      const dgl_id_t dst = args[2];
      *rv = g->HasEdgeBetween(src, dst);
    });
Minjie Wang's avatar
Minjie Wang committed
139

140
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphHasEdgesBetween")
141
142
143
144
145
146
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      GraphRef g = args[0];
      const IdArray src = args[1];
      const IdArray dst = args[2];
      *rv = g->HasEdgesBetween(src, dst);
    });
Minjie Wang's avatar
Minjie Wang committed
147

148
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphPredecessors")
149
150
151
152
153
154
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      GraphRef g = args[0];
      const dgl_id_t vid = args[1];
      const uint64_t radius = args[2];
      *rv = g->Predecessors(vid, radius);
    });
Minjie Wang's avatar
Minjie Wang committed
155

156
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphSuccessors")
157
158
159
160
161
162
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      GraphRef g = args[0];
      const dgl_id_t vid = args[1];
      const uint64_t radius = args[2];
      *rv = g->Successors(vid, radius);
    });
Minjie Wang's avatar
Minjie Wang committed
163

164
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphEdgeId")
165
166
167
168
169
170
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      GraphRef g = args[0];
      const dgl_id_t src = args[1];
      const dgl_id_t dst = args[2];
      *rv = g->EdgeId(src, dst);
    });
Minjie Wang's avatar
Minjie Wang committed
171

172
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphEdgeIds")
173
174
175
176
177
178
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      GraphRef g = args[0];
      const IdArray src = args[1];
      const IdArray dst = args[2];
      *rv = ConvertEdgeArrayToPackedFunc(g->EdgeIds(src, dst));
    });
179

180
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphFindEdge")
181
182
183
184
185
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      GraphRef g = args[0];
      const dgl_id_t eid = args[1];
      const auto& pair = g->FindEdge(eid);
      *rv = PackedFunc([pair](DGLArgs args, DGLRetValue* rv) {
186
        const int choice = args[0];
187
        const int64_t ret = (choice == 0 ? pair.first : pair.second);
188
189
        *rv = ret;
      });
190
    });
191

192
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphFindEdges")
193
194
195
196
197
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      GraphRef g = args[0];
      const IdArray eids = args[1];
      *rv = ConvertEdgeArrayToPackedFunc(g->FindEdges(eids));
    });
Minjie Wang's avatar
Minjie Wang committed
198

199
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphInEdges_1")
200
201
202
203
204
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      GraphRef g = args[0];
      const dgl_id_t vid = args[1];
      *rv = ConvertEdgeArrayToPackedFunc(g->InEdges(vid));
    });
Minjie Wang's avatar
Minjie Wang committed
205

206
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphInEdges_2")
207
208
209
210
211
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      GraphRef g = args[0];
      const IdArray vids = args[1];
      *rv = ConvertEdgeArrayToPackedFunc(g->InEdges(vids));
    });
Minjie Wang's avatar
Minjie Wang committed
212

213
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphOutEdges_1")
214
215
216
217
218
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      GraphRef g = args[0];
      const dgl_id_t vid = args[1];
      *rv = ConvertEdgeArrayToPackedFunc(g->OutEdges(vid));
    });
Minjie Wang's avatar
Minjie Wang committed
219

220
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphOutEdges_2")
221
222
223
224
225
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      GraphRef g = args[0];
      const IdArray vids = args[1];
      *rv = ConvertEdgeArrayToPackedFunc(g->OutEdges(vids));
    });
Minjie Wang's avatar
Minjie Wang committed
226

227
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphEdges")
228
229
230
231
232
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      GraphRef g = args[0];
      std::string order = args[1];
      *rv = ConvertEdgeArrayToPackedFunc(g->Edges(order));
    });
Minjie Wang's avatar
Minjie Wang committed
233

234
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphInDegree")
235
236
237
238
239
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      GraphRef g = args[0];
      const dgl_id_t vid = args[1];
      *rv = static_cast<int64_t>(g->InDegree(vid));
    });
Minjie Wang's avatar
Minjie Wang committed
240

241
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphInDegrees")
242
243
244
245
246
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      GraphRef g = args[0];
      const IdArray vids = args[1];
      *rv = g->InDegrees(vids);
    });
Minjie Wang's avatar
Minjie Wang committed
247

248
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphOutDegree")
249
250
251
252
253
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      GraphRef g = args[0];
      const dgl_id_t vid = args[1];
      *rv = static_cast<int64_t>(g->OutDegree(vid));
    });
Minjie Wang's avatar
Minjie Wang committed
254

255
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphOutDegrees")
256
257
258
259
260
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      GraphRef g = args[0];
      const IdArray vids = args[1];
      *rv = g->OutDegrees(vids);
    });
Minjie Wang's avatar
Minjie Wang committed
261

262
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphVertexSubgraph")
263
264
265
266
267
268
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      GraphRef g = args[0];
      const IdArray vids = args[1];
      std::shared_ptr<Subgraph> subg(new Subgraph(g->VertexSubgraph(vids)));
      *rv = SubgraphRef(subg);
    });
Minjie Wang's avatar
Minjie Wang committed
269

270
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphEdgeSubgraph")
271
272
273
274
275
276
277
278
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      GraphRef g = args[0];
      const IdArray eids = args[1];
      bool preserve_nodes = args[2];
      std::shared_ptr<Subgraph> subg(
          new Subgraph(g->EdgeSubgraph(eids, preserve_nodes)));
      *rv = SubgraphRef(subg);
    });
GaiYu0's avatar
GaiYu0 committed
279

280
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphGetAdj")
281
282
283
284
285
286
287
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      GraphRef g = args[0];
      bool transpose = args[1];
      std::string format = args[2];
      auto res = g->GetAdj(transpose, format);
      *rv = ConvertNDArrayVectorToPackedFunc(res);
    });
288

289
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphContext")
290
291
292
293
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      GraphRef g = args[0];
      *rv = g->Context();
    });
294

295
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphNumBits")
296
297
298
299
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      GraphRef g = args[0];
      *rv = g->NumBits();
    });
300

Da Zheng's avatar
Da Zheng committed
301
302
303
// Subgraph C APIs

DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLSubgraphGetGraph")
304
305
306
307
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      SubgraphRef subg = args[0];
      *rv = GraphRef(subg->graph);
    });
Da Zheng's avatar
Da Zheng committed
308
309

DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLSubgraphGetInducedVertices")
310
311
312
313
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      SubgraphRef subg = args[0];
      *rv = subg->induced_vertices;
    });
Da Zheng's avatar
Da Zheng committed
314
315

DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLSubgraphGetInducedEdges")
316
317
318
319
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      SubgraphRef subg = args[0];
      *rv = subg->induced_edges;
    });
Da Zheng's avatar
Da Zheng committed
320

Da Zheng's avatar
Da Zheng committed
321
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLSortAdj")
322
323
324
325
    .set_body([](DGLArgs args, DGLRetValue* rv) {
      GraphRef g = args[0];
      g->SortCSR();
    });
Da Zheng's avatar
Da Zheng committed
326

Minjie Wang's avatar
Minjie Wang committed
327
}  // namespace dgl