c_api_common.h 2.2 KB
Newer Older
1
2
3
4
5
/*!
 *  Copyright (c) 2018 by Contributors
 * \file c_api_common.h
 * \brief DGL C API common util functions
 */
Lingfan Yu's avatar
Lingfan Yu committed
6
7
8
9
10
11
#ifndef DGL_C_API_COMMON_H_
#define DGL_C_API_COMMON_H_

#include <dgl/runtime/ndarray.h>
#include <dgl/runtime/packed_func.h>
#include <dgl/runtime/registry.h>
GaiYu0's avatar
GaiYu0 committed
12
#include <algorithm>
Lingfan Yu's avatar
Lingfan Yu committed
13
14
15
16
17
18
19
#include <vector>

namespace dgl {

// Graph handler type
typedef void* GraphHandle;

20
21
22
23
24
25
/*!
 * \brief Convert the given DLTensor to DLManagedTensor.
 *
 * Return a temporary DLManagedTensor that does not own memory.
 */
DLManagedTensor* CreateTmpDLManagedTensor(
26
    const dgl::runtime::DGLArgValue& arg);
Lingfan Yu's avatar
Lingfan Yu committed
27

28
29
30
/*!
 * \brief Convert a vector of NDArray to PackedFunc.
 */
31
32
dgl::runtime::PackedFunc ConvertNDArrayVectorToPackedFunc(
    const std::vector<dgl::runtime::NDArray>& vec);
Lingfan Yu's avatar
Lingfan Yu committed
33

GaiYu0's avatar
GaiYu0 committed
34
/*!\brief Return whether the array is a valid 1D int array*/
35
inline bool IsValidIdArray(const dgl::runtime::NDArray& arr) {
GaiYu0's avatar
GaiYu0 committed
36
37
38
39
40
41
42
43
44
45
  return arr->ctx.device_type == kDLCPU && arr->ndim == 1
    && arr->dtype.code == kDLInt && arr->dtype.bits == 64;
}

/*!
 * \brief Copy a vector to an int64_t NDArray.
 *
 * The element type of the vector must be convertible to int64_t.
 */
template<typename DType>
46
dgl::runtime::NDArray CopyVectorToNDArray(
GaiYu0's avatar
GaiYu0 committed
47
    const std::vector<DType>& vec) {
48
  using dgl::runtime::NDArray;
GaiYu0's avatar
GaiYu0 committed
49
50
51
52
53
54
  const int64_t len = vec.size();
  NDArray a = NDArray::Empty({len}, DLDataType{kDLInt, 64, 1}, DLContext{kDLCPU, 0});
  std::copy(vec.begin(), vec.end(), static_cast<int64_t*>(a->data));
  return a;
}

55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/* A structure used to return a vector of void* pointers. */
struct CAPIVectorWrapper {
  // The pointer vector.
  std::vector<void*> pointers;
};

/*!
 * \brief A helper function used to return vector of pointers from C to frontend.
 *
 * Note that the function will move the given vector memory into the returned
 * wrapper object.
 * 
 * \param vec The given pointer vectors.
 * \return A wrapper object containing the given data.
 */
template<typename PType>
CAPIVectorWrapper* WrapVectorReturn(std::vector<PType*> vec) {
  CAPIVectorWrapper* wrapper = new CAPIVectorWrapper;
  wrapper->pointers.reserve(vec.size());
  wrapper->pointers.insert(wrapper->pointers.end(), vec.begin(), vec.end());
  return wrapper;
}

78
}  // namespace dgl
Lingfan Yu's avatar
Lingfan Yu committed
79

80
#endif  // DGL_C_API_COMMON_H_