graph_apis.cc 9.84 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 edge_dir = args[2];
48
49
50
51
52
53

    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;
54
    *rv = GraphRef(ImmutableGraph::CreateFromCSR(indptr, indices, edge_ids, edge_dir));
55
56
57
58
59
  });

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

178
179
180
181
182
183
184
185
186
187
188
189
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;
      });
  });

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Da Zheng's avatar
Da Zheng committed
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
// 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
319
320
321
322
323
324
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
325
}  // namespace dgl