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

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

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

22
23
24
///////////////////////////// Graph API ///////////////////////////////////

DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphCreateMutable")
25
.set_body([] (DGLArgs args, DGLRetValue* rv) {
26
    *rv = GraphRef(Graph::Create());
Minjie Wang's avatar
Minjie Wang committed
27
  });
Minjie Wang's avatar
Minjie Wang committed
28

29

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

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

    IdArray edge_ids = IdArray::Empty({indices->shape[0]},
                                      DLDataType{kDLInt, 64, 1}, DLContext{kDLCPU, 0});
    int64_t *edge_data = static_cast<int64_t *>(edge_ids->data);
    for (size_t i = 0; i < edge_ids->shape[0]; i++)
      edge_data[i] = i;
55
    if (shared_mem_name.empty()) {
56
      *rv = GraphRef(ImmutableGraph::CreateFromCSR(indptr, indices, edge_ids, edge_dir));
57
    } else {
58
59
      *rv = GraphRef(ImmutableGraph::CreateFromCSR(
          indptr, indices, edge_ids, edge_dir, shared_mem_name));
60
    }
61
62
63
64
65
66
67
  });

DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphCSRCreateMMap")
.set_body([] (DGLArgs args, DGLRetValue* rv) {
    const std::string shared_mem_name = args[0];
    const int64_t num_vertices = args[1];
    const int64_t num_edges = args[2];
68
    const std::string edge_dir = args[3];
69
    *rv = GraphRef(ImmutableGraph::CreateFromCSR(
70
      shared_mem_name, num_vertices, num_edges, edge_dir));
Minjie Wang's avatar
Minjie Wang committed
71
  });
Minjie Wang's avatar
Minjie Wang committed
72

73
74
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphAddVertices")
.set_body([] (DGLArgs args, DGLRetValue* rv) {
75
    GraphRef g = args[0];
Minjie Wang's avatar
Minjie Wang committed
76
    uint64_t num_vertices = args[1];
77
    g->AddVertices(num_vertices);
Minjie Wang's avatar
Minjie Wang committed
78
  });
Minjie Wang's avatar
Minjie Wang committed
79

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

88
89
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphAddEdges")
.set_body([] (DGLArgs args, DGLRetValue* rv) {
90
    GraphRef g = args[0];
91
92
    const IdArray src = args[1];
    const IdArray dst = args[2];
93
    g->AddEdges(src, dst);
Minjie Wang's avatar
Minjie Wang committed
94
95
  });

96
97
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphClear")
.set_body([] (DGLArgs args, DGLRetValue* rv) {
98
99
    GraphRef g = args[0];
    g->Clear();
Minjie Wang's avatar
Minjie Wang committed
100
  });
Minjie Wang's avatar
Minjie Wang committed
101

102
103
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphIsMultigraph")
.set_body([] (DGLArgs args, DGLRetValue *rv) {
104
105
    GraphRef g = args[0];
    *rv = g->IsMultigraph();
106
107
  });

108
109
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphIsReadonly")
.set_body([] (DGLArgs args, DGLRetValue *rv) {
110
111
    GraphRef g = args[0];
    *rv = g->IsReadonly();
112
113
  });

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

120
121
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphNumEdges")
.set_body([] (DGLArgs args, DGLRetValue* rv) {
122
123
    GraphRef g = args[0];
    *rv = static_cast<int64_t>(g->NumEdges());
Minjie Wang's avatar
Minjie Wang committed
124
125
  });

126
127
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphHasVertex")
.set_body([] (DGLArgs args, DGLRetValue* rv) {
128
    GraphRef g = args[0];
Minjie Wang's avatar
Minjie Wang committed
129
    const dgl_id_t vid = args[1];
130
    *rv = g->HasVertex(vid);
Minjie Wang's avatar
Minjie Wang committed
131
132
  });

133
134
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphHasVertices")
.set_body([] (DGLArgs args, DGLRetValue* rv) {
135
    GraphRef g = args[0];
136
    const IdArray vids = args[1];
137
    *rv = g->HasVertices(vids);
138
139
  });

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

148
149
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphHasEdgesBetween")
.set_body([] (DGLArgs args, DGLRetValue* rv) {
150
    GraphRef g = args[0];
151
152
    const IdArray src = args[1];
    const IdArray dst = args[2];
153
    *rv = g->HasEdgesBetween(src, dst);
Minjie Wang's avatar
Minjie Wang committed
154
155
  });

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

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

172
173
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphEdgeId")
.set_body([] (DGLArgs args, DGLRetValue* rv) {
174
    GraphRef g = args[0];
Minjie Wang's avatar
Minjie Wang committed
175
176
    const dgl_id_t src = args[1];
    const dgl_id_t dst = args[2];
177
    *rv = g->EdgeId(src, dst);
Minjie Wang's avatar
Minjie Wang committed
178
179
  });

180
181
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphEdgeIds")
.set_body([] (DGLArgs args, DGLRetValue* rv) {
182
    GraphRef g = args[0];
183
184
    const IdArray src = args[1];
    const IdArray dst = args[2];
185
    *rv = ConvertEdgeArrayToPackedFunc(g->EdgeIds(src, dst));
186
187
  });

188
189
190
191
192
193
194
195
196
197
198
199
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphFindEdge")
.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) {
        const int choice = args[0];
        const int64_t ret = (choice == 0? pair.first : pair.second);
        *rv = ret;
      });
  });

200
201
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphFindEdges")
.set_body([] (DGLArgs args, DGLRetValue* rv) {
202
    GraphRef g = args[0];
203
    const IdArray eids = args[1];
204
    *rv = ConvertEdgeArrayToPackedFunc(g->FindEdges(eids));
Minjie Wang's avatar
Minjie Wang committed
205
206
  });

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

214
215
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphInEdges_2")
.set_body([] (DGLArgs args, DGLRetValue* rv) {
216
    GraphRef g = args[0];
217
    const IdArray vids = args[1];
218
    *rv = ConvertEdgeArrayToPackedFunc(g->InEdges(vids));
Minjie Wang's avatar
Minjie Wang committed
219
220
  });

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

228
229
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphOutEdges_2")
.set_body([] (DGLArgs args, DGLRetValue* rv) {
230
    GraphRef g = args[0];
231
    const IdArray vids = args[1];
232
    *rv = ConvertEdgeArrayToPackedFunc(g->OutEdges(vids));
Minjie Wang's avatar
Minjie Wang committed
233
234
  });

235
236
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphEdges")
.set_body([] (DGLArgs args, DGLRetValue* rv) {
237
    GraphRef g = args[0];
238
    std::string order = args[1];
239
    *rv = ConvertEdgeArrayToPackedFunc(g->Edges(order));
Minjie Wang's avatar
Minjie Wang committed
240
241
  });

242
243
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphInDegree")
.set_body([] (DGLArgs args, DGLRetValue* rv) {
244
    GraphRef g = args[0];
Minjie Wang's avatar
Minjie Wang committed
245
    const dgl_id_t vid = args[1];
246
    *rv = static_cast<int64_t>(g->InDegree(vid));
Minjie Wang's avatar
Minjie Wang committed
247
248
  });

249
250
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphInDegrees")
.set_body([] (DGLArgs args, DGLRetValue* rv) {
251
    GraphRef g = args[0];
252
    const IdArray vids = args[1];
253
    *rv = g->InDegrees(vids);
Minjie Wang's avatar
Minjie Wang committed
254
255
  });

256
257
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphOutDegree")
.set_body([] (DGLArgs args, DGLRetValue* rv) {
258
    GraphRef g = args[0];
Minjie Wang's avatar
Minjie Wang committed
259
    const dgl_id_t vid = args[1];
260
    *rv = static_cast<int64_t>(g->OutDegree(vid));
Minjie Wang's avatar
Minjie Wang committed
261
262
  });

263
264
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphOutDegrees")
.set_body([] (DGLArgs args, DGLRetValue* rv) {
265
    GraphRef g = args[0];
266
    const IdArray vids = args[1];
267
    *rv = g->OutDegrees(vids);
Minjie Wang's avatar
Minjie Wang committed
268
  });
Minjie Wang's avatar
Minjie Wang committed
269

270
271
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphVertexSubgraph")
.set_body([] (DGLArgs args, DGLRetValue* rv) {
272
    GraphRef g = args[0];
273
    const IdArray vids = args[1];
Da Zheng's avatar
Da Zheng committed
274
275
    std::shared_ptr<Subgraph> subg(new Subgraph(g->VertexSubgraph(vids)));
    *rv = SubgraphRef(subg);
Minjie Wang's avatar
Minjie Wang committed
276
277
  });

278
279
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphEdgeSubgraph")
.set_body([] (DGLArgs args, DGLRetValue* rv) {
280
    GraphRef g = args[0];
281
    const IdArray eids = args[1];
282
    bool preserve_nodes = args[2];
Da Zheng's avatar
Da Zheng committed
283
284
285
    std::shared_ptr<Subgraph> subg(
        new Subgraph(g->EdgeSubgraph(eids, preserve_nodes)));
    *rv = SubgraphRef(subg);
GaiYu0's avatar
cpp lg  
GaiYu0 committed
286
  });
GaiYu0's avatar
GaiYu0 committed
287

288
289
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphGetAdj")
.set_body([] (DGLArgs args, DGLRetValue* rv) {
290
    GraphRef g = args[0];
291
292
    bool transpose = args[1];
    std::string format = args[2];
293
    auto res = g->GetAdj(transpose, format);
294
    *rv = ConvertNDArrayVectorToPackedFunc(res);
295
296
  });

297
298
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphContext")
.set_body([] (DGLArgs args, DGLRetValue* rv) {
299
300
    GraphRef g = args[0];
    *rv = g->Context();
301
302
  });

303
304
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLGraphNumBits")
.set_body([] (DGLArgs args, DGLRetValue* rv) {
305
306
    GraphRef g = args[0];
    *rv = g->NumBits();
307
308
  });

Da Zheng's avatar
Da Zheng committed
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
// Subgraph C APIs

DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLSubgraphGetGraph")
.set_body([] (DGLArgs args, DGLRetValue* rv) {
    SubgraphRef subg = args[0];
    *rv = GraphRef(subg->graph);
  });

DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLSubgraphGetInducedVertices")
.set_body([] (DGLArgs args, DGLRetValue* rv) {
    SubgraphRef subg = args[0];
    *rv = subg->induced_vertices;
  });

DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLSubgraphGetInducedEdges")
.set_body([] (DGLArgs args, DGLRetValue* rv) {
    SubgraphRef subg = args[0];
    *rv = subg->induced_edges;
  });

Da Zheng's avatar
Da Zheng committed
329
330
331
332
333
334
DGL_REGISTER_GLOBAL("graph_index._CAPI_DGLSortAdj")
.set_body([] (DGLArgs args, DGLRetValue* rv) {
    GraphRef g = args[0];
    g->SortCSR();
  });

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