forked from pytorch/pytorch
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathutils.h
More file actions
125 lines (101 loc) · 4.52 KB
/
utils.h
File metadata and controls
125 lines (101 loc) · 4.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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
#pragma once
#include <ATen/ATen.h>
#include <c10/util/Exception.h>
#include <torch/csrc/Storage.h>
#include <torch/csrc/THConcat.h>
#include <torch/csrc/utils/object_ptr.h>
#include <torch/csrc/utils/python_compat.h>
#include <torch/csrc/utils/python_numbers.h>
#include <string>
#include <type_traits>
#include <vector>
#define THPUtils_(NAME) TH_CONCAT_4(THP, Real, Utils_, NAME)
#define THPUtils_typename(obj) (Py_TYPE(obj)->tp_name)
#if defined(__GNUC__) || defined(__ICL) || defined(__clang__)
#define THP_EXPECT(x, y) (__builtin_expect((x), (y)))
#else
#define THP_EXPECT(x, y) (x)
#endif
#define THPUtils_unpackReal_FLOAT(object) \
(PyFloat_Check(object) ? PyFloat_AsDouble(object) \
: PyLong_Check(object) \
? PyLong_AsLongLong(object) \
: (throw std::runtime_error("Could not parse real"), 0))
#define THPUtils_checkReal_INT(object) PyLong_Check(object)
#define THPUtils_unpackReal_INT(object) \
(PyLong_Check(object) \
? PyLong_AsLongLong(object) \
: (throw std::runtime_error("Could not parse real"), 0))
#define THPUtils_unpackReal_BOOL(object) \
(PyBool_Check(object) \
? object \
: (throw std::runtime_error("Could not parse real"), Py_False))
#define THPUtils_unpackReal_COMPLEX(object) \
(PyComplex_Check(object) \
? (c10::complex<double>( \
PyComplex_RealAsDouble(object), PyComplex_ImagAsDouble(object))) \
: PyFloat_Check(object) \
? (c10::complex<double>(PyFloat_AsDouble(object), 0)) \
: PyLong_Check(object) \
? (c10::complex<double>(PyLong_AsLongLong(object), 0)) \
: (throw std::runtime_error("Could not parse real"), \
c10::complex<double>(0, 0)))
#define THPBoolUtils_unpackReal(object) THPUtils_unpackReal_BOOL(object)
#define THPBoolUtils_checkAccreal(object) THPUtils_checkReal_BOOL(object)
#define THPByteUtils_checkReal(object) THPUtils_checkReal_INT(object)
#define THPByteUtils_unpackReal(object) \
(unsigned char)THPUtils_unpackReal_INT(object)
/*
From https://github.com/python/cpython/blob/v3.7.0/Modules/xxsubtype.c
If compiled as a shared library, some compilers don't allow addresses of
Python objects defined in other libraries to be used in static PyTypeObject
initializers. The DEFERRED_ADDRESS macro is used to tag the slots where such
addresses appear; the module init function that adds the PyTypeObject to the
module must fill in the tagged slots at runtime. The argument is for
documentation -- the macro ignores it.
*/
#define DEFERRED_ADDRESS(ADDR) nullptr
TORCH_PYTHON_API void THPUtils_setError(const char* format, ...);
TORCH_PYTHON_API void THPUtils_invalidArguments(
PyObject* given_args,
PyObject* given_kwargs,
const char* function_name,
size_t num_options,
...);
bool THPUtils_checkIntTuple(PyObject* arg);
std::vector<int> THPUtils_unpackIntTuple(PyObject* arg);
TORCH_PYTHON_API void THPUtils_addPyMethodDefs(
std::vector<PyMethodDef>& vector,
const PyMethodDef* methods);
int THPUtils_getCallable(PyObject* arg, PyObject** result);
typedef THPPointer<THPGenerator> THPGeneratorPtr;
typedef class THPPointer<THPStorage> THPStoragePtr;
TORCH_PYTHON_API std::vector<int64_t> THPUtils_unpackLongs(PyObject* arg);
PyObject* THPUtils_dispatchStateless(
PyObject* tensor,
const char* name,
PyObject* args,
PyObject* kwargs);
template <typename _real, typename = void>
struct mod_traits {};
template <typename _real>
struct mod_traits<_real, std::enable_if_t<std::is_floating_point_v<_real>>> {
static _real mod(_real a, _real b) {
return fmod(a, b);
}
};
template <typename _real>
struct mod_traits<_real, std::enable_if_t<std::is_integral_v<_real>>> {
static _real mod(_real a, _real b) {
return a % b;
}
};
void setBackCompatBroadcastWarn(bool warn);
bool getBackCompatBroadcastWarn();
void setBackCompatKeepdimWarn(bool warn);
bool getBackCompatKeepdimWarn();
bool maybeThrowBackCompatKeepdimWarn(char* func);
void storage_fill(const at::Storage& self, uint8_t value);
void storage_set(const at::Storage& self, ptrdiff_t idx, uint8_t value);
uint8_t storage_get(const at::Storage& self, ptrdiff_t idx);
std::string uuid_to_string(const char* uuid_bytes);