unit_graph.h 6.06 KB
Newer Older
1
2
/*!
 *  Copyright (c) 2019 by Contributors
Minjie Wang's avatar
Minjie Wang committed
3
4
 * \file graph/unit_graph.h
 * \brief UnitGraph graph
5
6
 */

Minjie Wang's avatar
Minjie Wang committed
7
8
#ifndef DGL_GRAPH_UNIT_GRAPH_H_
#define DGL_GRAPH_UNIT_GRAPH_H_
9
10

#include <dgl/base_heterograph.h>
11
12
#include <dgl/lazy.h>
#include <dgl/array.h>
13
#include <utility>
14
15
16
17
#include <string>
#include <vector>

#include "../c_api_common.h"
18
19
20
21

namespace dgl {

/*!
Minjie Wang's avatar
Minjie Wang committed
22
 * \brief UnitGraph graph
23
 *
Minjie Wang's avatar
Minjie Wang committed
24
25
26
27
28
29
30
 * UnitGraph graph is a special type of heterograph which
 * (1) Have two types of nodes: "Src" and "Dst". All the edges are
 *     from "Src" type nodes to "Dst" type nodes, so there is no edge among
 *     nodes of the same type. Thus, its metagraph has two nodes and one edge
 *     between them.
 * (2) Have only one type of nodes and edges. Thus, its metagraph has one node
 *     and one self-loop edge.
31
 */
Minjie Wang's avatar
Minjie Wang committed
32
class UnitGraph : public BaseHeteroGraph {
33
 public:
34
35
36
37
38
39
  // internal data structure
  class COO;
  class CSR;
  typedef std::shared_ptr<COO> COOPtr;
  typedef std::shared_ptr<CSR> CSRPtr;

Minjie Wang's avatar
Minjie Wang committed
40
41
42
43
44
45
  inline dgl_type_t SrcType() const {
    return 0;
  }

  inline dgl_type_t DstType() const {
    return NumVertexTypes() == 1? 0 : 1;
46
47
  }

Minjie Wang's avatar
Minjie Wang committed
48
49
  inline dgl_type_t EdgeType() const {
    return 0;
50
51
52
  }

  HeteroGraphPtr GetRelationGraph(dgl_type_t etype) const override {
Minjie Wang's avatar
Minjie Wang committed
53
    LOG(FATAL) << "The method shouldn't be called for UnitGraph graph. "
54
55
56
57
58
      << "The relation graph is simply this graph itself.";
    return {};
  }

  void AddVertices(dgl_type_t vtype, uint64_t num_vertices) override {
Minjie Wang's avatar
Minjie Wang committed
59
    LOG(FATAL) << "UnitGraph graph is not mutable.";
60
61
62
  }

  void AddEdge(dgl_type_t etype, dgl_id_t src, dgl_id_t dst) override {
Minjie Wang's avatar
Minjie Wang committed
63
    LOG(FATAL) << "UnitGraph graph is not mutable.";
64
65
66
  }

  void AddEdges(dgl_type_t etype, IdArray src_ids, IdArray dst_ids) override {
Minjie Wang's avatar
Minjie Wang committed
67
    LOG(FATAL) << "UnitGraph graph is not mutable.";
68
69
70
  }

  void Clear() override {
Minjie Wang's avatar
Minjie Wang committed
71
    LOG(FATAL) << "UnitGraph graph is not mutable.";
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
  }

  DLContext Context() const override;

  uint8_t NumBits() const override;

  bool IsMultigraph() const override;

  bool IsReadonly() const override {
    return true;
  }

  uint64_t NumVertices(dgl_type_t vtype) const override;

  uint64_t NumEdges(dgl_type_t etype) const override;

  bool HasVertex(dgl_type_t vtype, dgl_id_t vid) const override;

  BoolArray HasVertices(dgl_type_t vtype, IdArray vids) const override;

  bool HasEdgeBetween(dgl_type_t etype, dgl_id_t src, dgl_id_t dst) const override;

  BoolArray HasEdgesBetween(dgl_type_t etype, IdArray src_ids, IdArray dst_ids) const override;

  IdArray Predecessors(dgl_type_t etype, dgl_id_t dst) const override;

  IdArray Successors(dgl_type_t etype, dgl_id_t src) const override;

  IdArray EdgeId(dgl_type_t etype, dgl_id_t src, dgl_id_t dst) const override;

  EdgeArray EdgeIds(dgl_type_t etype, IdArray src, IdArray dst) const override;

  std::pair<dgl_id_t, dgl_id_t> FindEdge(dgl_type_t etype, dgl_id_t eid) const override;

  EdgeArray FindEdges(dgl_type_t etype, IdArray eids) const override;

  EdgeArray InEdges(dgl_type_t etype, dgl_id_t vid) const override;

  EdgeArray InEdges(dgl_type_t etype, IdArray vids) const override;

  EdgeArray OutEdges(dgl_type_t etype, dgl_id_t vid) const override;

  EdgeArray OutEdges(dgl_type_t etype, IdArray vids) const override;

  EdgeArray Edges(dgl_type_t etype, const std::string &order = "") const override;

  uint64_t InDegree(dgl_type_t etype, dgl_id_t vid) const override;

  DegreeArray InDegrees(dgl_type_t etype, IdArray vids) const override;

  uint64_t OutDegree(dgl_type_t etype, dgl_id_t vid) const override;

  DegreeArray OutDegrees(dgl_type_t etype, IdArray vids) const override;

  DGLIdIters SuccVec(dgl_type_t etype, dgl_id_t vid) const override;

  DGLIdIters OutEdgeVec(dgl_type_t etype, dgl_id_t vid) const override;

  DGLIdIters PredVec(dgl_type_t etype, dgl_id_t vid) const override;

  DGLIdIters InEdgeVec(dgl_type_t etype, dgl_id_t vid) const override;

  std::vector<IdArray> GetAdj(
      dgl_type_t etype, bool transpose, const std::string &fmt) const override;

  HeteroSubgraph VertexSubgraph(const std::vector<IdArray>& vids) const override;

  HeteroSubgraph EdgeSubgraph(
      const std::vector<IdArray>& eids, bool preserve_nodes = false) const override;

  // creators
Minjie Wang's avatar
Minjie Wang committed
143
144
145
  /*! \brief Create a graph from COO arrays */
  static HeteroGraphPtr CreateFromCOO(
      int64_t num_vtypes, int64_t num_src, int64_t num_dst,
146
147
      IdArray row, IdArray col);

Minjie Wang's avatar
Minjie Wang committed
148
  /*! \brief Create a graph from (out) CSR arrays */
149
  static HeteroGraphPtr CreateFromCSR(
Minjie Wang's avatar
Minjie Wang committed
150
      int64_t num_vtypes, int64_t num_src, int64_t num_dst,
151
152
      IdArray indptr, IdArray indices, IdArray edge_ids);

153
154
  /*! \brief Convert the graph to use the given number of bits for storage */
  static HeteroGraphPtr AsNumBits(HeteroGraphPtr g, uint8_t bits);
155

156
157
  /*! \brief Copy the data to another context */
  static HeteroGraphPtr CopyTo(HeteroGraphPtr g, const DLContext& ctx);
158
159
160
161
162
163
164
165
166
167

  /*! \return Return the in-edge CSR format. Create from other format if not exist. */
  CSRPtr GetInCSR() const;

  /*! \return Return the out-edge CSR format. Create from other format if not exist. */
  CSRPtr GetOutCSR() const;

  /*! \return Return the COO format. Create from other format if not exist. */
  COOPtr GetCOO() const;

168
169
170
171
172
173
174
175
176
177
  /*! \return Return the in-edge CSR in the matrix form */
  aten::CSRMatrix GetInCSRMatrix() const;

  /*! \return Return the out-edge CSR in the matrix form */
  aten::CSRMatrix GetOutCSRMatrix() const;

  /*! \return Return the COO matrix form */
  aten::COOMatrix GetCOOMatrix() const;

 private:
Minjie Wang's avatar
Minjie Wang committed
178
179
180
181
182
183
184
185
  /*!
   * \brief constructor
   * \param metagraph metagraph
   * \param in_csr in edge csr
   * \param out_csr out edge csr
   * \param coo coo
   */
  UnitGraph(GraphPtr metagraph, CSRPtr in_csr, CSRPtr out_csr, COOPtr coo);
186

187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
  /*! \return Return any existing format. */
  HeteroGraphPtr GetAny() const;

  // Graph stored in different format. We use an on-demand strategy: the format is
  // only materialized if the operation that suitable for it is invoked.
  /*! \brief CSR graph that stores reverse edges */
  CSRPtr in_csr_;
  /*! \brief CSR representation */
  CSRPtr out_csr_;
  /*! \brief COO representation */
  COOPtr coo_;
};

};  // namespace dgl

Minjie Wang's avatar
Minjie Wang committed
202
#endif  // DGL_GRAPH_UNIT_GRAPH_H_