Caffe2 - C++ API
A deep learning, cross platform ML framework
Type.h
1 #pragma once
2 
3 #include <ATen/core/ATenGeneral.h>
4 #include <c10/core/Allocator.h>
5 #include <c10/util/Deprecated.h>
6 #include <ATen/core/Generator.h>
7 #include <c10/core/Layout.h>
8 #include <c10/core/Scalar.h>
9 #include <c10/core/ScalarType.h>
10 #include <ATen/core/SparseTensorRef.h>
11 #include <c10/util/ArrayRef.h>
12 #include <c10/util/Half.h>
13 #include <c10/core/TensorTypeIdRegistration.h>
14 #include <ATen/core/Reduction.h>
15 #include <c10/core/TensorOptions.h>
16 
17 #include <c10/util/Optional.h>
18 
19 #include <array>
20 #include <cstddef>
21 #include <functional>
22 #include <limits>
23 #include <memory>
24 
25 // To solve the conflict of s_addr in inaddr.h
26 #ifdef _MSC_VER
27 #ifdef s_addr
28 #undef s_addr
29 #endif
30 #endif
31 
32 namespace c10 {
33 struct Storage;
34 }
35 
36 namespace at {
37 
38 class Tensor;
39 using TensorList = ArrayRef<Tensor>;
40 
41 class Context;
42 struct Generator;
43 
44 static inline void noop_deleter(void*) {}
45 
46 enum class TypeID {
47  CPUBool,
48  CPUByte,
49  CPUChar,
50  CPUDouble,
51  CPUFloat,
52  CPUInt,
53  CPULong,
54  CPUShort,
55  CPUHalf,
56  SparseCPUBool,
57  SparseCPUByte,
58  SparseCPUChar,
59  SparseCPUDouble,
60  SparseCPUFloat,
61  SparseCPUInt,
62  SparseCPULong,
63  SparseCPUShort,
64  CUDABool,
65  CUDAByte,
66  CUDAChar,
67  CUDADouble,
68  CUDAFloat,
69  CUDAInt,
70  CUDALong,
71  CUDAShort,
72  CUDAHalf,
73  SparseCUDABool,
74  SparseCUDAByte,
75  SparseCUDAChar,
76  SparseCUDADouble,
77  SparseCUDAFloat,
78  SparseCUDAInt,
79  SparseCUDALong,
80  SparseCUDAShort,
81  MSNPUBool,
82  MSNPUByte,
83  MSNPUChar,
84  MSNPUDouble,
85  MSNPUFloat,
86  MSNPUInt,
87  MSNPULong,
88  MSNPUShort,
89  MSNPUHalf,
90  XLABool,
91  XLAByte,
92  XLAChar,
93  XLADouble,
94  XLAFloat,
95  XLAInt,
96  XLALong,
97  XLAShort,
98  XLAHalf,
99  CPUComplexFloat,
100  CPUComplexDouble,
101  CUDAComplexFloat,
102  CUDAComplexDouble,
103  Undefined,
104  NumOptions
105 };
106 
107 struct CAFFE2_API Type {
108  explicit Type(TensorTypeId type_id, bool is_variable, bool is_undefined)
109  : type_id_(type_id), is_variable_(is_variable), is_undefined_(is_undefined) {}
110 
111  virtual ~Type() {}
112  virtual ScalarType scalarType() const = 0;
113  virtual caffe2::TypeMeta typeMeta() const = 0;
114  virtual Backend backend() const = 0;
115  Layout layout() const noexcept { return layout_from_backend(backend()); }
116  virtual bool is_cuda() const = 0;
117  virtual bool is_hip() const = 0;
118  virtual bool is_sparse() const = 0;
119  virtual bool is_distributed() const = 0;
120  bool is_variable() const noexcept { return is_variable_; }
121  bool is_undefined() const noexcept { return is_undefined_; }
122  virtual Allocator * allocator() const = 0;
123  virtual Device getDeviceFromPtr(void * data) const = 0;
124  virtual Storage storageFromBlob(void * data, int64_t size, const std::function<void(void*)> & deleter=noop_deleter) const = 0;
125  virtual Storage storageWithAllocator(int64_t size, Allocator* allocator) const = 0;
126  virtual std::unique_ptr<Generator> generator() const = 0;
127  virtual Tensor unsafeTensorFromTH(void * th_pointer, bool retain) const = 0;
128  virtual Storage unsafeStorageFromTH(void * th_pointer, bool retain) const = 0;
129  virtual const char * toString() const = 0;
130  virtual Type & toBackend(Backend b) const = 0;
131  virtual Type & toScalarType(ScalarType s) const = 0;
132  Type & toSparse() const {
133  return this->toBackend(at::toSparse(this->backend()));
134  }
135  Type & toDense() const {
136  return this->toBackend(at::toDense(this->backend()));
137  }
138  Type & cpu() const {
139  return this->toBackend(at::backendToCPU(this->backend()));
140  }
141  Type & cuda() const {
142  return this->toBackend(at::backendToCUDA(this->backend()));
143  }
144  Type & hip() const {
145  return this->toBackend(at::backendToHIP(this->backend()));
146  }
147  // contiguous IDs for all types in the system
148  // for external dispatch
149  virtual TypeID ID() const = 0;
150 
151  // New-style TensorTypeId that supports open registration.
152  TensorTypeId type_id() const { return type_id_; }
153 
154  // NB: This will return DeviceType::CPU for Backend::SparseCPU
155  DeviceType device_type() const {
156  return backendToDeviceType(backend());
157  }
158 
159  virtual Tensor copy(
160  const Tensor& src,
161  bool non_blocking = false,
162  c10::optional<Device> to_device = {}) const = 0;
163  virtual Tensor & copy_(Tensor & self, const Tensor & src, bool non_blocking=false) const = 0;
164 
165  virtual void backward(
166  Tensor& self,
167  c10::optional<Tensor> gradient,
168  bool keep_graph,
169  bool create_graph) const = 0;
170  virtual void set_data(Tensor & self, Tensor new_data) const = 0;
171 
172  virtual Tensor tensorFromBlob(void * data, IntArrayRef sizes, const std::function<void(void*)> & deleter=noop_deleter) const = 0;
173  virtual Tensor tensorFromBlob(void * data, IntArrayRef sizes, IntArrayRef strides, const std::function<void(void*)> & deleter=noop_deleter) const = 0;
174  virtual Tensor tensorWithAllocator(IntArrayRef sizes, Allocator* allocator) const = 0;
175  virtual Tensor tensorWithAllocator(IntArrayRef sizes, IntArrayRef strides, Allocator* allocator) const = 0;
176 
177  bool operator==(const Type& other) const {
178  return this == &other;
179  }
180  bool operator!=(const Type& other) const {
181  return this != &other;
182  }
183 
185  TensorOptions options(int16_t device_index = -1) const {
186  return TensorOptions().dtype(typeMeta())
187  .device(device_type(), device_index)
188  .layout(layout())
189  .is_variable(is_variable());
190  }
191 
195  if (!device_opt.has_value()) {
196  return options(-1);
197  } else {
198  Device device = device_opt.value();
199  AT_ASSERT(device.type() == device_type());
200  return options(device.index());
201  }
202  }
203 
204  operator TensorOptions() const {
205  return options();
206  }
207 
208  // example
209  // virtual Tensor * add(Tensor & a, Tensor & b) = 0;
210  virtual Tensor abs(const Tensor & self) const = 0;
211  virtual Tensor & abs_(Tensor & self) const = 0;
212  virtual Tensor acos(const Tensor & self) const = 0;
213  virtual Tensor & acos_(Tensor & self) const = 0;
214  virtual Tensor add(const Tensor & self, const Tensor & other, Scalar alpha) const = 0;
215  virtual Tensor & add_(Tensor & self, const Tensor & other, Scalar alpha) const = 0;
216  virtual Tensor add(const Tensor & self, Scalar other, Scalar alpha) const = 0;
217  virtual Tensor & add_(Tensor & self, Scalar other, Scalar alpha) const = 0;
218  virtual Tensor addmv(const Tensor & self, const Tensor & mat, const Tensor & vec, Scalar beta, Scalar alpha) const = 0;
219  virtual Tensor & addmv_(Tensor & self, const Tensor & mat, const Tensor & vec, Scalar beta, Scalar alpha) const = 0;
220  virtual Tensor addr(const Tensor & self, const Tensor & vec1, const Tensor & vec2, Scalar beta, Scalar alpha) const = 0;
221  virtual Tensor & addr_(Tensor & self, const Tensor & vec1, const Tensor & vec2, Scalar beta, Scalar alpha) const = 0;
222  virtual Tensor all(const Tensor & self, int64_t dim, bool keepdim) const = 0;
223  virtual bool allclose(const Tensor & self, const Tensor & other, double rtol, double atol, bool equal_nan) const = 0;
224  virtual Tensor any(const Tensor & self, int64_t dim, bool keepdim) const = 0;
225  virtual Tensor argmax(const Tensor & self, c10::optional<int64_t> dim, bool keepdim) const = 0;
226  virtual Tensor argmin(const Tensor & self, c10::optional<int64_t> dim, bool keepdim) const = 0;
227  virtual Tensor as_strided(const Tensor & self, IntArrayRef size, IntArrayRef stride, c10::optional<int64_t> storage_offset) const = 0;
228  virtual Tensor & as_strided_(Tensor & self, IntArrayRef size, IntArrayRef stride, c10::optional<int64_t> storage_offset) const = 0;
229  virtual Tensor asin(const Tensor & self) const = 0;
230  virtual Tensor & asin_(Tensor & self) const = 0;
231  virtual Tensor atan(const Tensor & self) const = 0;
232  virtual Tensor & atan_(Tensor & self) const = 0;
233  virtual Tensor baddbmm(const Tensor & self, const Tensor & batch1, const Tensor & batch2, Scalar beta, Scalar alpha) const = 0;
234  virtual Tensor & baddbmm_(Tensor & self, const Tensor & batch1, const Tensor & batch2, Scalar beta, Scalar alpha) const = 0;
235  virtual Tensor bernoulli(const Tensor & self, Generator * generator) const = 0;
236  virtual Tensor & bernoulli_(Tensor & self, const Tensor & p, Generator * generator) const = 0;
237  virtual Tensor & bernoulli_(Tensor & self, double p, Generator * generator) const = 0;
238  virtual Tensor bernoulli(const Tensor & self, double p, Generator * generator) const = 0;
239  virtual Tensor bincount(const Tensor & self, const Tensor & weights, int64_t minlength) const = 0;
240  virtual Tensor bmm(const Tensor & self, const Tensor & mat2) const = 0;
241  virtual Tensor ceil(const Tensor & self) const = 0;
242  virtual Tensor & ceil_(Tensor & self) const = 0;
243  virtual std::vector<Tensor> chunk(const Tensor & self, int64_t chunks, int64_t dim) const = 0;
244  virtual Tensor clamp(const Tensor & self, c10::optional<Scalar> min, c10::optional<Scalar> max) const = 0;
245  virtual Tensor & clamp_(Tensor & self, c10::optional<Scalar> min, c10::optional<Scalar> max) const = 0;
246  virtual Tensor clamp_max(const Tensor & self, Scalar max) const = 0;
247  virtual Tensor & clamp_max_(Tensor & self, Scalar max) const = 0;
248  virtual Tensor clamp_min(const Tensor & self, Scalar min) const = 0;
249  virtual Tensor & clamp_min_(Tensor & self, Scalar min) const = 0;
250  virtual Tensor contiguous(const Tensor & self) const = 0;
251  virtual Tensor cos(const Tensor & self) const = 0;
252  virtual Tensor & cos_(Tensor & self) const = 0;
253  virtual Tensor cosh(const Tensor & self) const = 0;
254  virtual Tensor & cosh_(Tensor & self) const = 0;
255  virtual Tensor cumsum(const Tensor & self, int64_t dim, ScalarType dtype) const = 0;
256  virtual Tensor cumsum(const Tensor & self, int64_t dim) const = 0;
257  virtual Tensor cumprod(const Tensor & self, int64_t dim, ScalarType dtype) const = 0;
258  virtual Tensor cumprod(const Tensor & self, int64_t dim) const = 0;
259  virtual Tensor det(const Tensor & self) const = 0;
260  virtual Tensor diag_embed(const Tensor & self, int64_t offset, int64_t dim1, int64_t dim2) const = 0;
261  virtual Tensor diagflat(const Tensor & self, int64_t offset) const = 0;
262  virtual Tensor diagonal(const Tensor & self, int64_t offset, int64_t dim1, int64_t dim2) const = 0;
263  virtual Tensor div(const Tensor & self, const Tensor & other) const = 0;
264  virtual Tensor & div_(Tensor & self, const Tensor & other) const = 0;
265  virtual Tensor div(const Tensor & self, Scalar other) const = 0;
266  virtual Tensor & div_(Tensor & self, Scalar other) const = 0;
267  virtual Tensor dot(const Tensor & self, const Tensor & tensor) const = 0;
268  virtual Tensor & resize_(Tensor & self, IntArrayRef size) const = 0;
269  virtual Tensor erf(const Tensor & self) const = 0;
270  virtual Tensor & erf_(Tensor & self) const = 0;
271  virtual Tensor erfc(const Tensor & self) const = 0;
272  virtual Tensor & erfc_(Tensor & self) const = 0;
273  virtual Tensor exp(const Tensor & self) const = 0;
274  virtual Tensor & exp_(Tensor & self) const = 0;
275  virtual Tensor expm1(const Tensor & self) const = 0;
276  virtual Tensor & expm1_(Tensor & self) const = 0;
277  virtual Tensor expand(const Tensor & self, IntArrayRef size, bool implicit) const = 0;
278  virtual Tensor expand_as(const Tensor & self, const Tensor & other) const = 0;
279  virtual Tensor flatten(const Tensor & self, int64_t start_dim, int64_t end_dim) const = 0;
280  virtual Tensor & fill_(Tensor & self, Scalar value) const = 0;
281  virtual Tensor & fill_(Tensor & self, const Tensor & value) const = 0;
282  virtual Tensor floor(const Tensor & self) const = 0;
283  virtual Tensor & floor_(Tensor & self) const = 0;
284  virtual Tensor ger(const Tensor & self, const Tensor & vec2) const = 0;
285  virtual Tensor fft(const Tensor & self, int64_t signal_ndim, bool normalized) const = 0;
286  virtual Tensor ifft(const Tensor & self, int64_t signal_ndim, bool normalized) const = 0;
287  virtual Tensor rfft(const Tensor & self, int64_t signal_ndim, bool normalized, bool onesided) const = 0;
288  virtual Tensor irfft(const Tensor & self, int64_t signal_ndim, bool normalized, bool onesided, IntArrayRef signal_sizes) const = 0;
289  virtual Tensor index(const Tensor & self, TensorList indices) const = 0;
290  virtual Tensor & index_copy_(Tensor & self, int64_t dim, const Tensor & index, const Tensor & source) const = 0;
291  virtual Tensor index_copy(const Tensor & self, int64_t dim, const Tensor & index, const Tensor & source) const = 0;
292  virtual Tensor & index_put_(Tensor & self, TensorList indices, const Tensor & values, bool accumulate) const = 0;
293  virtual Tensor index_put(const Tensor & self, TensorList indices, const Tensor & values, bool accumulate) const = 0;
294  virtual Tensor inverse(const Tensor & self) const = 0;
295  virtual Tensor isclose(const Tensor & self, const Tensor & other, double rtol, double atol, bool equal_nan) const = 0;
296  virtual bool is_distributed(const Tensor & self) const = 0;
297  virtual bool is_floating_point(const Tensor & self) const = 0;
298  virtual bool is_complex(const Tensor & self) const = 0;
299  virtual bool is_nonzero(const Tensor & self) const = 0;
300  virtual bool is_same_size(const Tensor & self, const Tensor & other) const = 0;
301  virtual bool is_signed(const Tensor & self) const = 0;
302  virtual std::tuple<Tensor,Tensor> kthvalue(const Tensor & self, int64_t k, int64_t dim, bool keepdim) const = 0;
303  virtual Tensor log(const Tensor & self) const = 0;
304  virtual Tensor & log_(Tensor & self) const = 0;
305  virtual Tensor log10(const Tensor & self) const = 0;
306  virtual Tensor & log10_(Tensor & self) const = 0;
307  virtual Tensor log1p(const Tensor & self) const = 0;
308  virtual Tensor & log1p_(Tensor & self) const = 0;
309  virtual Tensor log2(const Tensor & self) const = 0;
310  virtual Tensor & log2_(Tensor & self) const = 0;
311  virtual Tensor logdet(const Tensor & self) const = 0;
312  virtual Tensor log_softmax(const Tensor & self, int64_t dim, ScalarType dtype) const = 0;
313  virtual Tensor log_softmax(const Tensor & self, int64_t dim) const = 0;
314  virtual Tensor logsumexp(const Tensor & self, IntArrayRef dim, bool keepdim) const = 0;
315  virtual Tensor matmul(const Tensor & self, const Tensor & other) const = 0;
316  virtual Tensor matrix_power(const Tensor & self, int64_t n) const = 0;
317  virtual std::tuple<Tensor,Tensor> max(const Tensor & self, int64_t dim, bool keepdim) const = 0;
318  virtual Tensor max_values(const Tensor & self, IntArrayRef dim, bool keepdim) const = 0;
319  virtual Tensor mean(const Tensor & self, ScalarType dtype) const = 0;
320  virtual Tensor mean(const Tensor & self) const = 0;
321  virtual Tensor mean(const Tensor & self, IntArrayRef dim, bool keepdim, ScalarType dtype) const = 0;
322  virtual Tensor mean(const Tensor & self, IntArrayRef dim, bool keepdim) const = 0;
323  virtual Tensor mean(const Tensor & self, IntArrayRef dim, ScalarType dtype) const = 0;
324  virtual std::tuple<Tensor,Tensor> median(const Tensor & self, int64_t dim, bool keepdim) const = 0;
325  virtual std::tuple<Tensor,Tensor> min(const Tensor & self, int64_t dim, bool keepdim) const = 0;
326  virtual Tensor min_values(const Tensor & self, IntArrayRef dim, bool keepdim) const = 0;
327  virtual Tensor mm(const Tensor & self, const Tensor & mat2) const = 0;
328  virtual std::tuple<Tensor,Tensor> mode(const Tensor & self, int64_t dim, bool keepdim) const = 0;
329  virtual Tensor mul(const Tensor & self, const Tensor & other) const = 0;
330  virtual Tensor & mul_(Tensor & self, const Tensor & other) const = 0;
331  virtual Tensor mul(const Tensor & self, Scalar other) const = 0;
332  virtual Tensor & mul_(Tensor & self, Scalar other) const = 0;
333  virtual Tensor mv(const Tensor & self, const Tensor & vec) const = 0;
334  virtual Tensor mvlgamma(const Tensor & self, int64_t p) const = 0;
335  virtual Tensor & mvlgamma_(Tensor & self, int64_t p) const = 0;
336  virtual Tensor narrow_copy(const Tensor & self, int64_t dim, int64_t start, int64_t length) const = 0;
337  virtual Tensor narrow(const Tensor & self, int64_t dim, int64_t start, int64_t length) const = 0;
338  virtual Tensor permute(const Tensor & self, IntArrayRef dims) const = 0;
339  virtual Tensor pin_memory(const Tensor & self) const = 0;
340  virtual Tensor pinverse(const Tensor & self, double rcond) const = 0;
341  virtual Tensor repeat(const Tensor & self, IntArrayRef repeats) const = 0;
342  virtual Tensor reshape(const Tensor & self, IntArrayRef shape) const = 0;
343  virtual Tensor reshape_as(const Tensor & self, const Tensor & other) const = 0;
344  virtual Tensor round(const Tensor & self) const = 0;
345  virtual Tensor & round_(Tensor & self) const = 0;
346  virtual Tensor relu(const Tensor & self) const = 0;
347  virtual Tensor & relu_(Tensor & self) const = 0;
348  virtual Tensor prelu(const Tensor & self, const Tensor & weight) const = 0;
349  virtual std::tuple<Tensor,Tensor> prelu_backward(const Tensor & grad_output, const Tensor & self, const Tensor & weight) const = 0;
350  virtual Tensor hardshrink(const Tensor & self, Scalar lambd) const = 0;
351  virtual Tensor hardshrink_backward(const Tensor & grad_out, const Tensor & self, Scalar lambd) const = 0;
352  virtual Tensor rsqrt(const Tensor & self) const = 0;
353  virtual Tensor & rsqrt_(Tensor & self) const = 0;
354  virtual Tensor select(const Tensor & self, int64_t dim, int64_t index) const = 0;
355  virtual Tensor sigmoid(const Tensor & self) const = 0;
356  virtual Tensor & sigmoid_(Tensor & self) const = 0;
357  virtual Tensor sin(const Tensor & self) const = 0;
358  virtual Tensor & sin_(Tensor & self) const = 0;
359  virtual Tensor sinh(const Tensor & self) const = 0;
360  virtual Tensor & sinh_(Tensor & self) const = 0;
361  virtual Tensor detach(const Tensor & self) const = 0;
362  virtual Tensor & detach_(Tensor & self) const = 0;
363  virtual int64_t size(const Tensor & self, int64_t dim) const = 0;
364  virtual Tensor slice(const Tensor & self, int64_t dim, int64_t start, int64_t end, int64_t step) const = 0;
365  virtual std::tuple<Tensor,Tensor> slogdet(const Tensor & self) const = 0;
366  virtual Tensor smm(const Tensor & self, const Tensor & mat2) const = 0;
367  virtual Tensor softmax(const Tensor & self, int64_t dim, ScalarType dtype) const = 0;
368  virtual Tensor softmax(const Tensor & self, int64_t dim) const = 0;
369  virtual std::vector<Tensor> split(const Tensor & self, int64_t split_size, int64_t dim) const = 0;
370  virtual std::vector<Tensor> split_with_sizes(const Tensor & self, IntArrayRef split_sizes, int64_t dim) const = 0;
371  virtual Tensor squeeze(const Tensor & self) const = 0;
372  virtual Tensor squeeze(const Tensor & self, int64_t dim) const = 0;
373  virtual Tensor & squeeze_(Tensor & self) const = 0;
374  virtual Tensor & squeeze_(Tensor & self, int64_t dim) const = 0;
375  virtual Tensor sspaddmm(const Tensor & self, const Tensor & mat1, const Tensor & mat2, Scalar beta, Scalar alpha) const = 0;
376  virtual Tensor stft(const Tensor & self, int64_t n_fft, c10::optional<int64_t> hop_length, c10::optional<int64_t> win_length, const Tensor & window, bool normalized, bool onesided) const = 0;
377  virtual int64_t stride(const Tensor & self, int64_t dim) const = 0;
378  virtual Tensor sum(const Tensor & self, ScalarType dtype) const = 0;
379  virtual Tensor sum(const Tensor & self) const = 0;
380  virtual Tensor sum(const Tensor & self, IntArrayRef dim, bool keepdim, ScalarType dtype) const = 0;
381  virtual Tensor sum(const Tensor & self, IntArrayRef dim, bool keepdim) const = 0;
382  virtual Tensor sum(const Tensor & self, IntArrayRef dim, ScalarType dtype) const = 0;
383  virtual Tensor sum_to_size(const Tensor & self, IntArrayRef size) const = 0;
384  virtual Tensor sqrt(const Tensor & self) const = 0;
385  virtual Tensor & sqrt_(Tensor & self) const = 0;
386  virtual Tensor std(const Tensor & self, bool unbiased) const = 0;
387  virtual Tensor std(const Tensor & self, IntArrayRef dim, bool unbiased, bool keepdim) const = 0;
388  virtual Tensor prod(const Tensor & self, ScalarType dtype) const = 0;
389  virtual Tensor prod(const Tensor & self) const = 0;
390  virtual Tensor prod(const Tensor & self, int64_t dim, bool keepdim, ScalarType dtype) const = 0;
391  virtual Tensor prod(const Tensor & self, int64_t dim, bool keepdim) const = 0;
392  virtual Tensor prod(const Tensor & self, int64_t dim, ScalarType dtype) const = 0;
393  virtual Tensor t(const Tensor & self) const = 0;
394  virtual Tensor & t_(Tensor & self) const = 0;
395  virtual Tensor tan(const Tensor & self) const = 0;
396  virtual Tensor & tan_(Tensor & self) const = 0;
397  virtual Tensor tanh(const Tensor & self) const = 0;
398  virtual Tensor & tanh_(Tensor & self) const = 0;
399  virtual Tensor transpose(const Tensor & self, int64_t dim0, int64_t dim1) const = 0;
400  virtual Tensor & transpose_(Tensor & self, int64_t dim0, int64_t dim1) const = 0;
401  virtual Tensor flip(const Tensor & self, IntArrayRef dims) const = 0;
402  virtual Tensor roll(const Tensor & self, IntArrayRef shifts, IntArrayRef dims) const = 0;
403  virtual Tensor rot90(const Tensor & self, int64_t k, IntArrayRef dims) const = 0;
404  virtual Tensor trunc(const Tensor & self) const = 0;
405  virtual Tensor & trunc_(Tensor & self) const = 0;
406  virtual Tensor type_as(const Tensor & self, const Tensor & other) const = 0;
407  virtual Tensor unsqueeze(const Tensor & self, int64_t dim) const = 0;
408  virtual Tensor & unsqueeze_(Tensor & self, int64_t dim) const = 0;
409  virtual Tensor var(const Tensor & self, bool unbiased) const = 0;
410  virtual Tensor var(const Tensor & self, IntArrayRef dim, bool unbiased, bool keepdim) const = 0;
411  virtual Tensor view_as(const Tensor & self, const Tensor & other) const = 0;
412  virtual Tensor where(const Tensor & condition, const Tensor & self, const Tensor & other) const = 0;
413  virtual Tensor norm(const Tensor & self, c10::optional<Scalar> p, ScalarType dtype) const = 0;
414  virtual Tensor norm(const Tensor & self, Scalar p) const = 0;
415  virtual Tensor norm(const Tensor & self, c10::optional<Scalar> p, IntArrayRef dim, bool keepdim, ScalarType dtype) const = 0;
416  virtual Tensor norm(const Tensor & self, c10::optional<Scalar> p, IntArrayRef dim, bool keepdim) const = 0;
417  virtual Tensor clone(const Tensor & self) const = 0;
418  virtual Tensor & resize_as_(Tensor & self, const Tensor & the_template) const = 0;
419  virtual Tensor pow(const Tensor & self, Scalar exponent) const = 0;
420  virtual Tensor & zero_(Tensor & self) const = 0;
421  virtual Tensor sub(const Tensor & self, const Tensor & other, Scalar alpha) const = 0;
422  virtual Tensor & sub_(Tensor & self, const Tensor & other, Scalar alpha) const = 0;
423  virtual Tensor sub(const Tensor & self, Scalar other, Scalar alpha) const = 0;
424  virtual Tensor & sub_(Tensor & self, Scalar other, Scalar alpha) const = 0;
425  virtual Tensor addmm(const Tensor & self, const Tensor & mat1, const Tensor & mat2, Scalar beta, Scalar alpha) const = 0;
426  virtual Tensor & addmm_(Tensor & self, const Tensor & mat1, const Tensor & mat2, Scalar beta, Scalar alpha) const = 0;
427  virtual Tensor & sparse_resize_(Tensor & self, IntArrayRef size, int64_t sparse_dim, int64_t dense_dim) const = 0;
428  virtual Tensor & sparse_resize_and_clear_(Tensor & self, IntArrayRef size, int64_t sparse_dim, int64_t dense_dim) const = 0;
429  virtual Tensor sparse_mask(const Tensor & self, SparseTensorRef mask) const = 0;
430  virtual Tensor to_dense(const Tensor & self) const = 0;
431  virtual int64_t sparse_dim(const Tensor & self) const = 0;
432  virtual int64_t _dimI(const Tensor & self) const = 0;
433  virtual int64_t dense_dim(const Tensor & self) const = 0;
434  virtual int64_t _dimV(const Tensor & self) const = 0;
435  virtual int64_t _nnz(const Tensor & self) const = 0;
436  virtual Tensor coalesce(const Tensor & self) const = 0;
437  virtual bool is_coalesced(const Tensor & self) const = 0;
438  virtual Tensor _indices(const Tensor & self) const = 0;
439  virtual Tensor _values(const Tensor & self) const = 0;
440  virtual Tensor & _coalesced_(Tensor & self, bool coalesced) const = 0;
441  virtual Tensor indices(const Tensor & self) const = 0;
442  virtual Tensor values(const Tensor & self) const = 0;
443  virtual int64_t numel(const Tensor & self) const = 0;
444  virtual std::vector<Tensor> unbind(const Tensor & self, int64_t dim) const = 0;
445  virtual Tensor to_sparse(const Tensor & self, int64_t sparse_dim) const = 0;
446  virtual Tensor to_sparse(const Tensor & self) const = 0;
447  virtual Tensor to(const Tensor & self, const TensorOptions & options, bool non_blocking, bool copy) const = 0;
448  virtual Tensor to(const Tensor & self, Device device, ScalarType dtype, bool non_blocking, bool copy) const = 0;
449  virtual Tensor to(const Tensor & self, ScalarType dtype, bool non_blocking, bool copy) const = 0;
450  virtual Tensor to(const Tensor & self, const Tensor & other, bool non_blocking, bool copy) const = 0;
451  virtual Scalar item(const Tensor & self) const = 0;
452  virtual void* data_ptr(const Tensor & self) const = 0;
453  virtual Tensor & set_(Tensor & self, Storage source) const = 0;
454  virtual Tensor & set_(Tensor & self, Storage source, int64_t storage_offset, IntArrayRef size, IntArrayRef stride) const = 0;
455  virtual Tensor & set_(Tensor & self, const Tensor & source) const = 0;
456  virtual Tensor & set_(Tensor & self) const = 0;
457  virtual bool is_set_to(const Tensor & self, const Tensor & tensor) const = 0;
458  virtual Tensor & masked_fill_(Tensor & self, const Tensor & mask, Scalar value) const = 0;
459  virtual Tensor masked_fill(const Tensor & self, const Tensor & mask, Scalar value) const = 0;
460  virtual Tensor & masked_fill_(Tensor & self, const Tensor & mask, const Tensor & value) const = 0;
461  virtual Tensor masked_fill(const Tensor & self, const Tensor & mask, const Tensor & value) const = 0;
462  virtual Tensor & masked_scatter_(Tensor & self, const Tensor & mask, const Tensor & source) const = 0;
463  virtual Tensor masked_scatter(const Tensor & self, const Tensor & mask, const Tensor & source) const = 0;
464  virtual Tensor view(const Tensor & self, IntArrayRef size) const = 0;
465  virtual Tensor & put_(Tensor & self, const Tensor & index, const Tensor & source, bool accumulate) const = 0;
466  virtual Tensor & index_add_(Tensor & self, int64_t dim, const Tensor & index, const Tensor & source) const = 0;
467  virtual Tensor index_add(const Tensor & self, int64_t dim, const Tensor & index, const Tensor & source) const = 0;
468  virtual Tensor & index_fill_(Tensor & self, int64_t dim, const Tensor & index, Scalar value) const = 0;
469  virtual Tensor index_fill(const Tensor & self, int64_t dim, const Tensor & index, Scalar value) const = 0;
470  virtual Tensor & index_fill_(Tensor & self, int64_t dim, const Tensor & index, const Tensor & value) const = 0;
471  virtual Tensor index_fill(const Tensor & self, int64_t dim, const Tensor & index, const Tensor & value) const = 0;
472  virtual Tensor & scatter_(Tensor & self, int64_t dim, const Tensor & index, const Tensor & src) const = 0;
473  virtual Tensor scatter(const Tensor & self, int64_t dim, const Tensor & index, const Tensor & src) const = 0;
474  virtual Tensor & scatter_(Tensor & self, int64_t dim, const Tensor & index, Scalar value) const = 0;
475  virtual Tensor scatter(const Tensor & self, int64_t dim, const Tensor & index, Scalar value) const = 0;
476  virtual Tensor & scatter_add_(Tensor & self, int64_t dim, const Tensor & index, const Tensor & src) const = 0;
477  virtual Tensor scatter_add(const Tensor & self, int64_t dim, const Tensor & index, const Tensor & src) const = 0;
478  virtual Tensor & lt_(Tensor & self, Scalar other) const = 0;
479  virtual Tensor & lt_(Tensor & self, const Tensor & other) const = 0;
480  virtual Tensor & gt_(Tensor & self, Scalar other) const = 0;
481  virtual Tensor & gt_(Tensor & self, const Tensor & other) const = 0;
482  virtual Tensor & le_(Tensor & self, Scalar other) const = 0;
483  virtual Tensor & le_(Tensor & self, const Tensor & other) const = 0;
484  virtual Tensor & ge_(Tensor & self, Scalar other) const = 0;
485  virtual Tensor & ge_(Tensor & self, const Tensor & other) const = 0;
486  virtual Tensor & eq_(Tensor & self, Scalar other) const = 0;
487  virtual Tensor & eq_(Tensor & self, const Tensor & other) const = 0;
488  virtual Tensor & ne_(Tensor & self, Scalar other) const = 0;
489  virtual Tensor & ne_(Tensor & self, const Tensor & other) const = 0;
490  virtual Tensor __and__(const Tensor & self, Scalar other) const = 0;
491  virtual Tensor __and__(const Tensor & self, const Tensor & other) const = 0;
492  virtual Tensor & __iand__(Tensor & self, Scalar other) const = 0;
493  virtual Tensor & __iand__(Tensor & self, const Tensor & other) const = 0;
494  virtual Tensor __or__(const Tensor & self, Scalar other) const = 0;
495  virtual Tensor __or__(const Tensor & self, const Tensor & other) const = 0;
496  virtual Tensor & __ior__(Tensor & self, Scalar other) const = 0;
497  virtual Tensor & __ior__(Tensor & self, const Tensor & other) const = 0;
498  virtual Tensor __xor__(const Tensor & self, Scalar other) const = 0;
499  virtual Tensor __xor__(const Tensor & self, const Tensor & other) const = 0;
500  virtual Tensor & __ixor__(Tensor & self, Scalar other) const = 0;
501  virtual Tensor & __ixor__(Tensor & self, const Tensor & other) const = 0;
502  virtual Tensor __lshift__(const Tensor & self, Scalar other) const = 0;
503  virtual Tensor __lshift__(const Tensor & self, const Tensor & other) const = 0;
504  virtual Tensor & __ilshift__(Tensor & self, Scalar other) const = 0;
505  virtual Tensor & __ilshift__(Tensor & self, const Tensor & other) const = 0;
506  virtual Tensor __rshift__(const Tensor & self, Scalar other) const = 0;
507  virtual Tensor __rshift__(const Tensor & self, const Tensor & other) const = 0;
508  virtual Tensor & __irshift__(Tensor & self, Scalar other) const = 0;
509  virtual Tensor & __irshift__(Tensor & self, const Tensor & other) const = 0;
510  virtual Tensor & lgamma_(Tensor & self) const = 0;
511  virtual Tensor & atan2_(Tensor & self, const Tensor & other) const = 0;
512  virtual Tensor & tril_(Tensor & self, int64_t diagonal) const = 0;
513  virtual Tensor & triu_(Tensor & self, int64_t diagonal) const = 0;
514  virtual Tensor & digamma_(Tensor & self) const = 0;
515  virtual Tensor & polygamma_(Tensor & self, int64_t n) const = 0;
516  virtual Tensor & erfinv_(Tensor & self) const = 0;
517  virtual Tensor & frac_(Tensor & self) const = 0;
518  virtual Tensor & renorm_(Tensor & self, Scalar p, int64_t dim, Scalar maxnorm) const = 0;
519  virtual Tensor & reciprocal_(Tensor & self) const = 0;
520  virtual Tensor & neg_(Tensor & self) const = 0;
521  virtual Tensor & pow_(Tensor & self, Scalar exponent) const = 0;
522  virtual Tensor & pow_(Tensor & self, const Tensor & exponent) const = 0;
523  virtual Tensor & lerp_(Tensor & self, const Tensor & end, Scalar weight) const = 0;
524  virtual Tensor & lerp_(Tensor & self, const Tensor & end, const Tensor & weight) const = 0;
525  virtual Tensor & sign_(Tensor & self) const = 0;
526  virtual Tensor & fmod_(Tensor & self, Scalar other) const = 0;
527  virtual Tensor & fmod_(Tensor & self, const Tensor & other) const = 0;
528  virtual Tensor & remainder_(Tensor & self, Scalar other) const = 0;
529  virtual Tensor & remainder_(Tensor & self, const Tensor & other) const = 0;
530  virtual Tensor & addbmm_(Tensor & self, const Tensor & batch1, const Tensor & batch2, Scalar beta, Scalar alpha) const = 0;
531  virtual Tensor addbmm(const Tensor & self, const Tensor & batch1, const Tensor & batch2, Scalar beta, Scalar alpha) const = 0;
532  virtual Tensor & addcmul_(Tensor & self, const Tensor & tensor1, const Tensor & tensor2, Scalar value) const = 0;
533  virtual Tensor & addcdiv_(Tensor & self, const Tensor & tensor1, const Tensor & tensor2, Scalar value) const = 0;
534  virtual Tensor & random_(Tensor & self, int64_t from, int64_t to, Generator * generator) const = 0;
535  virtual Tensor & random_(Tensor & self, int64_t to, Generator * generator) const = 0;
536  virtual Tensor & random_(Tensor & self, Generator * generator) const = 0;
537  virtual Tensor & uniform_(Tensor & self, double from, double to, Generator * generator) const = 0;
538  virtual Tensor & normal_(Tensor & self, double mean, double std, Generator * generator) const = 0;
539  virtual Tensor & cauchy_(Tensor & self, double median, double sigma, Generator * generator) const = 0;
540  virtual Tensor & log_normal_(Tensor & self, double mean, double std, Generator * generator) const = 0;
541  virtual Tensor & exponential_(Tensor & self, double lambd, Generator * generator) const = 0;
542  virtual Tensor & geometric_(Tensor & self, double p, Generator * generator) const = 0;
543  virtual Tensor diag(const Tensor & self, int64_t diagonal) const = 0;
544  virtual Tensor cross(const Tensor & self, const Tensor & other, int64_t dim) const = 0;
545  virtual Tensor triu(const Tensor & self, int64_t diagonal) const = 0;
546  virtual Tensor tril(const Tensor & self, int64_t diagonal) const = 0;
547  virtual Tensor trace(const Tensor & self) const = 0;
548  virtual Tensor ne(const Tensor & self, Scalar other) const = 0;
549  virtual Tensor ne(const Tensor & self, const Tensor & other) const = 0;
550  virtual Tensor eq(const Tensor & self, Scalar other) const = 0;
551  virtual Tensor eq(const Tensor & self, const Tensor & other) const = 0;
552  virtual Tensor ge(const Tensor & self, Scalar other) const = 0;
553  virtual Tensor ge(const Tensor & self, const Tensor & other) const = 0;
554  virtual Tensor le(const Tensor & self, Scalar other) const = 0;
555  virtual Tensor le(const Tensor & self, const Tensor & other) const = 0;
556  virtual Tensor gt(const Tensor & self, Scalar other) const = 0;
557  virtual Tensor gt(const Tensor & self, const Tensor & other) const = 0;
558  virtual Tensor lt(const Tensor & self, Scalar other) const = 0;
559  virtual Tensor lt(const Tensor & self, const Tensor & other) const = 0;
560  virtual Tensor take(const Tensor & self, const Tensor & index) const = 0;
561  virtual Tensor index_select(const Tensor & self, int64_t dim, const Tensor & index) const = 0;
562  virtual Tensor masked_select(const Tensor & self, const Tensor & mask) const = 0;
563  virtual Tensor nonzero(const Tensor & self) const = 0;
564  virtual Tensor gather(const Tensor & self, int64_t dim, const Tensor & index, bool sparse_grad) const = 0;
565  virtual Tensor addcmul(const Tensor & self, const Tensor & tensor1, const Tensor & tensor2, Scalar value) const = 0;
566  virtual Tensor addcdiv(const Tensor & self, const Tensor & tensor1, const Tensor & tensor2, Scalar value) const = 0;
567  virtual std::tuple<Tensor,Tensor> gels(const Tensor & self, const Tensor & A) const = 0;
568  virtual std::tuple<Tensor,Tensor> trtrs(const Tensor & self, const Tensor & A, bool upper, bool transpose, bool unitriangular) const = 0;
569  virtual std::tuple<Tensor,Tensor> symeig(const Tensor & self, bool eigenvectors, bool upper) const = 0;
570  virtual std::tuple<Tensor,Tensor> eig(const Tensor & self, bool eigenvectors) const = 0;
571  virtual std::tuple<Tensor,Tensor,Tensor> svd(const Tensor & self, bool some, bool compute_uv) const = 0;
572  virtual Tensor cholesky(const Tensor & self, bool upper) const = 0;
573  virtual Tensor cholesky_solve(const Tensor & self, const Tensor & input2, bool upper) const = 0;
574  virtual std::tuple<Tensor,Tensor> solve(const Tensor & self, const Tensor & A) const = 0;
575  virtual Tensor potri(const Tensor & self, bool upper) const = 0;
576  virtual std::tuple<Tensor,Tensor> pstrf(const Tensor & self, bool upper, Scalar tol) const = 0;
577  virtual std::tuple<Tensor,Tensor> qr(const Tensor & self) const = 0;
578  virtual std::tuple<Tensor,Tensor> geqrf(const Tensor & self) const = 0;
579  virtual Tensor orgqr(const Tensor & self, const Tensor & input2) const = 0;
580  virtual Tensor ormqr(const Tensor & self, const Tensor & input2, const Tensor & input3, bool left, bool transpose) const = 0;
581  virtual std::tuple<Tensor,Tensor> btrifact(const Tensor & self, bool pivot) const = 0;
582  virtual std::tuple<Tensor,Tensor,Tensor> btrifact_with_info(const Tensor & self, bool pivot) const = 0;
583  virtual Tensor btrisolve(const Tensor & self, const Tensor & LU_data, const Tensor & LU_pivots) const = 0;
584  virtual Tensor multinomial(const Tensor & self, int64_t num_samples, bool replacement, Generator * generator) const = 0;
585  virtual Tensor lgamma(const Tensor & self) const = 0;
586  virtual Tensor digamma(const Tensor & self) const = 0;
587  virtual Tensor polygamma(int64_t n, const Tensor & self) const = 0;
588  virtual Tensor erfinv(const Tensor & self) const = 0;
589  virtual Tensor frac(const Tensor & self) const = 0;
590  virtual Tensor dist(const Tensor & self, const Tensor & other, Scalar p) const = 0;
591  virtual Tensor reciprocal(const Tensor & self) const = 0;
592  virtual Tensor neg(const Tensor & self) const = 0;
593  virtual Tensor atan2(const Tensor & self, const Tensor & other) const = 0;
594  virtual Tensor lerp(const Tensor & self, const Tensor & end, Scalar weight) const = 0;
595  virtual Tensor lerp(const Tensor & self, const Tensor & end, const Tensor & weight) const = 0;
596  virtual Tensor histc(const Tensor & self, int64_t bins, Scalar min, Scalar max) const = 0;
597  virtual Tensor sign(const Tensor & self) const = 0;
598  virtual Tensor fmod(const Tensor & self, Scalar other) const = 0;
599  virtual Tensor fmod(const Tensor & self, const Tensor & other) const = 0;
600  virtual Tensor remainder(const Tensor & self, Scalar other) const = 0;
601  virtual Tensor remainder(const Tensor & self, const Tensor & other) const = 0;
602  virtual Tensor min(const Tensor & self, const Tensor & other) const = 0;
603  virtual Tensor min(const Tensor & self) const = 0;
604  virtual Tensor max(const Tensor & self, const Tensor & other) const = 0;
605  virtual Tensor max(const Tensor & self) const = 0;
606  virtual Tensor median(const Tensor & self) const = 0;
607  virtual std::tuple<Tensor,Tensor> sort(const Tensor & self, int64_t dim, bool descending) const = 0;
608  virtual Tensor argsort(const Tensor & self, int64_t dim, bool descending) const = 0;
609  virtual std::tuple<Tensor,Tensor> topk(const Tensor & self, int64_t k, int64_t dim, bool largest, bool sorted) const = 0;
610  virtual Tensor all(const Tensor & self) const = 0;
611  virtual Tensor any(const Tensor & self) const = 0;
612  virtual Tensor renorm(const Tensor & self, Scalar p, int64_t dim, Scalar maxnorm) const = 0;
613  virtual Tensor unfold(const Tensor & self, int64_t dimension, int64_t size, int64_t step) const = 0;
614  virtual bool equal(const Tensor & self, const Tensor & other) const = 0;
615  virtual Tensor pow(const Tensor & self, const Tensor & exponent) const = 0;
616  virtual Tensor pow(Scalar self, const Tensor & exponent) const = 0;
617  virtual Tensor alias(const Tensor & self) const = 0;
618 protected:
619  TensorTypeId type_id_;
620  bool is_variable_;
621  bool is_undefined_;
622 };
623 
624 } // namespace at
625 
626 #include <ATen/core/Tensor.h>
TensorOptions device_index(int16_t device_index)
Convenience function that returns a TensorOptions object with the device set to CUDA and the device_i...
Scalar represents a 0-dimensional tensor which contains a single element.
Definition: Scalar.h:22
TensorOptions device(Device device)
Convenience function that returns a TensorOptions object with the device set to the given one...
TensorOptions options(int16_t device_index=-1) const
Constructs the TensorOptions from a type and a device_index.
Definition: Type.h:185
Represents a a compute device on which a tensor is located.
Definition: Device.h:30
Backend
This legacy enum class defines the set of backends supported by old school, code generated Type-based...
Definition: Backend.h:23
Definition: static.cpp:52
Dynamic type ID of a Tensor argument.
Definition: TensorTypeId.h:19
TensorOptions(T &&device)
A class to encapsulate construction axes of an Tensor.
Definition: TensorOptions.h:80
TensorOptions layout(Layout layout)
Convenience function that returns a TensorOptions object with the layout set to the given one...
To register your own kernel for an operator, do in one (!) cpp file: C10_REGISTER_KERNEL(OperatorHand...
Definition: alias_info.h:7
Flush-To-Zero and Denormals-Are-Zero mode.
TypeMeta is a thin class that allows us to store the type of a container such as a blob...
Definition: typeid.h:324
DeviceIndex index() const noexcept
Returns the optional index.
Definition: Device.h:70
TensorOptions options(c10::optional< Device > device_opt) const
Constructs the TensorOptions from a type and a Device.
Definition: Type.h:194
DeviceType type() const noexcept
Returns the type of device this is.
Definition: Device.h:65
TensorOptions dtype(caffe2::TypeMeta dtype)
Convenience function that returns a TensorOptions object with the dtype set to the given one...