blob: ae1170bb9597bc28a2ba36f311ba1886a7747ab8 [file] [log] [blame]
#if defined(TH_REAL_IS_FLOAT) || defined(TH_REAL_IS_DOUBLE)
#define RealStr "float"
#else
#define RealStr "int"
#endif
#ifdef THC_REAL_IS_HALF
#define AS_REAL(x) THC_float2half(x)
#else
#define AS_REAL(x) x
#endif
#ifndef THC_GENERIC_FILE
#define IS_CUDA false
#define CUDA_FLOAT false
#else
#define IS_CUDA true
#define CUDA_FLOAT defined(THC_REAL_IS_FLOAT)
#endif
[[
elementSize STATEFUL_ONLY
elementSize -> long STORAGE_CALL
]]
[[
storage STATEFUL_ONLY
storage -> THStorageINCREF
- self
]]
[[
storageOffset STATEFUL_ONLY
storageOffset -> long
- self
]]
[[
nDimension STATEFUL_ONLY
nDimension -> long
- self
]]
[[
free STATEFUL_ONLY
free -> self
- self
]]
[[
retain STATEFUL_ONLY
retain -> self
- self
]]
[[
reshape STATEFUL_ONLY
reshape -> new THTensor LONG_ARGS
- self
- CONSTANT _long_args
]]
[[
reshape STATELESS_ONLY
reshape -> self LONG_ARGS
- self
- THTensor source
- CONSTANT _long_args
reshape -> new THTensor LONG_ARGS
- THTensor source
- CONSTANT _long_args
]]
[[
resize STATEFUL_ONLY
resize -> self LONG_ARGS
- self
- CONSTANT _long_args
- CONSTANT NULL
]]
[[
zeros
zeros -> self LONG_ARGS OPTIONAL_SELF
- self
- CONSTANT _long_args
]]
[[
ones
ones -> self LONG_ARGS OPTIONAL_SELF
- self
- CONSTANT _long_args
]]
[[
numel
numel -> long
- self
]]
[[
set STATEFUL_ONLY
set -> self
- self
- THTensor source
setStorage -> self
- self
- CONSTANT NULL
- CONSTANT 0
- CONSTANT NULL
- CONSTANT NULL
setStorage -> self
- self
- THStorage sourceStorage
- CONSTANT 0
- EXPRESSION THLongStorage_newWithSize1(THStorage_(size)(LIBRARY_STATE sourceStorage->cdata))
- CONSTANT NULL
setStorage -> self
- self
- THStorage sourceStorage
- long storageOffset
- THLongStorage sizes
- THLongStorage strides OPTIONAL NULL
setStorage -> self LONG_ARGS
- self
- THStorage sourceStorage
- long storageOffset
- CONSTANT _long_args
- CONSTANT NULL
]]
static PyObject * THPTensor_(select)(THPTensor *self, PyObject *args)
{
HANDLE_TH_ERRORS
long dim, idx;
if (!PyArg_ParseTuple(args, "ll", &dim, &idx))
return NULL;
int ndim = THTensor_(nDimension)(LIBRARY_STATE self->cdata);
if(ndim > 1) {
THTensor *selected = THTensor_(newWithTensor)(LIBRARY_STATE self->cdata);
THTensor_(select)(LIBRARY_STATE selected, NULL, dim, idx);
return THPTensor_(newObject)(selected);
}
else {
THArgCheck(ndim == 1, 1, "empty Tensor");
return THPUtils_(newReal)(THTensor_(get1d)(LIBRARY_STATE self->cdata, idx));
}
END_HANDLE_TH_ERRORS
}
#if defined(TH_REAL_IS_DOUBLE) || defined(TH_REAL_IS_FLOAT)
#define BUILD_REAL_FMT "d"
#else
#define BUILD_REAL_FMT "L"
#endif
#if !IS_CUDA
static PyObject * THPTensor_(apply)(THPTensor *self, PyObject *arg)
{
HANDLE_TH_ERRORS
if (!PyCallable_Check(arg)) {
THPUtils_setError("apply requires a callable as it's first argument");
return NULL;
}
real v;
THTensor *tensor = self->cdata;
TH_TENSOR_APPLY(real, tensor,
PyObject *ret =
PyObject_CallFunction(arg, BUILD_REAL_FMT, *tensor_data);
if (!ret)
return NULL;
bool success = THPUtils_(parseReal)(ret, &v);
Py_DECREF(ret);
if (!success)
THError("given function should return a number");
*tensor_data = v;
);
Py_INCREF(self);
return (PyObject*)self;
END_HANDLE_TH_ERRORS
}
static PyObject * THPTensor_(map)(THPTensor *self, PyObject *args)
{
HANDLE_TH_ERRORS
PyObject *fn;
THPTensor *src_object;
if (!PyArg_ParseTuple(args, "O!O&", &THPTensorType, &src_object, THPUtils_getCallable, &fn))
return NULL;
real v;
THTensor *tensor = self->cdata;
THTensor *src = src_object->cdata;
TH_TENSOR_APPLY2(real, tensor, real, src,
PyObject *ret =
PyObject_CallFunction(fn, BUILD_REAL_FMT BUILD_REAL_FMT,
*tensor_data, *src_data);
if (!ret)
return NULL;
bool success = THPUtils_(parseReal)(ret, &v);
Py_DECREF(ret);
if (!success)
THError("given function should return a number");
*tensor_data = v;
);
Py_INCREF(self);
return (PyObject*)self;
END_HANDLE_TH_ERRORS
}
static PyObject * THPTensor_(map2)(THPTensor *self, PyObject *args)
{
HANDLE_TH_ERRORS
PyObject *fn;
THPTensor *src1_object;
THPTensor *src2_object;
if (!PyArg_ParseTuple(args, "O!O!O&", &THPTensorType, &src1_object, &THPTensorType, &src2_object, THPUtils_getCallable, &fn))
return NULL;
real v;
THTensor *tensor = self->cdata;
THTensor *src1 = src1_object->cdata;
THTensor *src2 = src2_object->cdata;
TH_TENSOR_APPLY3(real, tensor, real, src1, real, src2,
PyObject *ret =
PyObject_CallFunction(fn, BUILD_REAL_FMT BUILD_REAL_FMT BUILD_REAL_FMT,
*tensor_data, *src1_data, *src2_data);
if (!ret)
return NULL;
bool success = THPUtils_(parseReal)(ret, &v);
Py_DECREF(ret);
if (!success)
THError("given function should return a number");
*tensor_data = v;
);
Py_INCREF(self);
return (PyObject*)self;
END_HANDLE_TH_ERRORS
}
#endif /* !IS_CUDA */
#undef BUILD_REAL_FMT
#if defined(TH_REAL_IS_INT) || defined(TH_REAL_IS_LONG)
[[
abs
abs -> self
- self
- self
abs -> self OPTIONAL_SELF
- self
- THTensor source
]]
#endif /* defined(TH_REAL_IS_INT) || defined(TH_REAL_IS_LONG) */
#if defined(TH_REAL_IS_FLOAT) || defined(TH_REAL_IS_DOUBLE) || \
CUDA_FLOAT
[[
sigmoid
sigmoid -> self
- self
- self
sigmoid -> self OPTIONAL_SELF
- self
- THTensor source
]]
[[
log
log -> self
- self
- self
log -> self OPTIONAL_SELF
- self
- THTensor source
]]
[[
log1p
log1p -> self
- self
- self
log1p -> self OPTIONAL_SELF
- self
- THTensor other
]]
[[
exp
exp -> self
- self
- self
exp -> self OPTIONAL_SELF
- self
- THTensor other
]]
[[
cos
cos -> self
- self
- self
cos -> self OPTIONAL_SELF
- self
- THTensor other
]]
[[
acos
acos -> self
- self
- self
acos -> self OPTIONAL_SELF
- self
- THTensor other
]]
[[
cosh
cosh -> self
- self
- self
cosh -> self OPTIONAL_SELF
- self
- THTensor other
]]
[[
sin
sin -> self
- self
- self
sin -> self OPTIONAL_SELF
- self
- THTensor other
]]
[[
asin
asin -> self
- self
- self
asin -> self OPTIONAL_SELF
- self
- THTensor other
]]
[[
sinh
sinh -> self
- self
- self
sinh -> self OPTIONAL_SELF
- self
- THTensor other
]]
[[
tan
tan -> self
- self
- self
tan -> self OPTIONAL_SELF
- self
- THTensor other
]]
[[
atan
atan -> self
- self
- self
atan -> self OPTIONAL_SELF
- self
- THTensor other
]]
[[
tanh
tanh -> self
- self
- self
tanh -> self OPTIONAL_SELF
- self
- THTensor other
]]
[[
sqrt
sqrt -> self
- self
- self
sqrt -> self OPTIONAL_SELF
- self
- THTensor other
]]
[[
rsqrt
rsqrt -> self
- self
- self
rsqrt -> self OPTIONAL_SELF
- self
- THTensor other
]]
[[
ceil
ceil -> self
- self
- self
ceil -> self OPTIONAL_SELF
- self
- THTensor other
]]
[[
floor
floor -> self
- self
- self
floor -> self OPTIONAL_SELF
- self
- THTensor other
]]
[[
round
round -> self
- self
- self
round -> self OPTIONAL_SELF
- self
- THTensor other
]]
[[
abs
abs -> self
- self
- self
abs -> self OPTIONAL_SELF
- self
- THTensor other
]]
[[
trunc
trunc -> self
- self
- self
trunc -> self OPTIONAL_SELF
- self
- THTensor other
]]
[[
frac
frac -> self
- self
- self
frac -> self OPTIONAL_SELF
- self
- THTensor other
]]
[[
mean
meanall -> accreal
- self
mean -> self
- self
- self
- long dim
mean -> self OPTIONAL_SELF
- self
- THTensor source
- long dim
]]
[[
var
varall -> accreal
- self
var -> self
- self
- self
- long dim
- CONSTANT false
var -> self OPTIONAL_SELF
- self
- THTensor source
- long dim
- CONSTANT false
]]
[[
std
stdall -> accreal
- self
std -> self
- self
- self
- long dim
- CONSTANT false
std -> self OPTIONAL_SELF
- self
- THTensor source
- long dim
- CONSTANT false
]]
[[
norm
normall -> accreal
- self
- real p OPTIONAL 2
norm -> new THTensor
- self
- real p
- long dim
norm -> self OPTIONAL_SELF
- self
- THTensor source
- real p
- long dim
]]
[[
renorm
renorm -> self
- self
- self
- real p
- long dim
- real maxnorm
renorm -> self OPTIONAL_SELF
- self
- THTensor source
- real p
- long dim
- real maxnorm
]]
[[
dist
dist -> accreal
- self
- THTensor a
- real p OPTIONAL 2
]]
[[
cinv
cinv -> self
- self
- self
cinv -> self OPTIONAL_SELF
- self
- THTensor source
]]
[[
neg
neg -> self
- self
- self
neg -> self OPTIONAL_SELF
- self
- THTensor source
]]
[[
atan2 STATEFUL_ONLY
atan2 -> self
- self
- self
- THTensor other
atan2 -> self
- self
- THTensor other
- THTensor other2
]]
[[
atan2 STATELESS_ONLY
atan2 -> self OPTIONAL_SELF
- self
- THTensor other
- THTensor other2
atan2 -> real PLAIN_CALL
- real a
- real b
]]
[[
pow STATEFUL_ONLY
pow -> self
- self
- self
- real power
pow -> self
- self
- THTensor source
- real power
tpow -> self
- self
- real value
- THTensor source
]]
[[
pow STATELESS_ONLY
pow -> self OPTIONAL_SELF
- self
- THTensor source
- real power
tpow -> self OPTIONAL_SELF
- self
- real value
- THTensor source
pow -> real PLAIN_CALL
- real value
- real power
]]
[[
lerp STATEFUL_ONLY
lerp -> self
- self
- self
- THTensor a
- real weight
lerp -> self
- self
- THTensor a
- THTensor b
- real weight
]]
[[
lerp STATELESS_ONLY
lerp -> self OPTIONAL_SELF
- self
- THTensor a
- THTensor b
- real weight
TH_lerp -> real PLAIN_CALL
- real start
- real end
- real weight
]]
#endif
#if defined(TH_REAL_IS_FLOAT) || defined(TH_REAL_IS_DOUBLE)
[[
linspace
linspace -> self OPTIONAL_SELF
- self
- real start
- real end
- CONSTANT 100
linspace -> self OPTIONAL_SELF
- self
- real start
- real end
- long steps
]]
[[
logspace
logspace -> self OPTIONAL_SELF
- self
- real start
- real end
- CONSTANT 100
logspace -> self OPTIONAL_SELF
- self
- real start
- real end
- long steps
]]
[[
histc
histc -> self
- self
- THTensor src
- CONSTANT 100
- CONSTANT 0
- CONSTANT 0
histc -> self
- self
- THTensor src
- long bins
- CONSTANT 0
- CONSTANT 0
histc -> self
- self
- THTensor src
- long bins
- real min
- CONSTANT 0
histc -> self
- self
- THTensor src
- long bins
- real min
- real max
histc -> new THTensor
- self
- CONSTANT 100
- CONSTANT 0
- CONSTANT 0
histc -> new THTensor
- self
- long bins
- CONSTANT 0
- CONSTANT 0
histc -> new THTensor
- self
- long bins
- real min
- CONSTANT 0
histc -> new THTensor
- self
- long bins
- real min
- real max
]]
#endif /* defined(TH_REAL_IS_FLOAT) || defined(TH_REAL_IS_DOUBLE) */
[[
zero
zero -> self
- self
]]
[[
size STATEFUL_ONLY
size -> long
- self
- long dim
newSizeOf -> THLongStorage
- self
]]
[[
stride STATEFUL_ONLY
stride -> long
- self
- long dim
newStrideOf -> THLongStorage
- self
]]
[[
fill
fill -> self
- self
- real value
]]
[[
isSameSizeAs STATEFUL_ONLY
isSameSizeAs -> bool
- self
- THTensor other
]]
[[
isContiguous STATEFUL_ONLY
isContiguous -> bool
- self
]]
[[
isSetTo STATEFUL_ONLY
isSetTo -> bool
- self
- THTensor other
]]
[[
isSize STATEFUL_ONLY
isSize -> bool
- self
- THLongStorage other
]]
#if !IS_CUDA || CUDA_FLOAT
[[
cmax
cmax -> self
- self
- self
- THTensor a
cmax -> self OPTIONAL_SELF
- self
- THTensor a
- THTensor b
cmaxValue -> self OPTIONAL_SELF
- self
- THTensor b
- real value
cmaxValue -> self
- self
- self
- real value
]]
[[
cmin
cmin -> self
- self
- self
- THTensor a
cmin -> self OPTIONAL_SELF
- self
- THTensor a
- THTensor b
cminValue -> self OPTIONAL_SELF
- self
- THTensor b
- real value
cminValue -> self
- self
- self
- real value
]]
[[
sum
sumall -> accreal
- self
sum -> new THTensor
- self
- long dim
sum -> self OPTIONAL_SELF
- self
- THTensor source
- long dim
]]
[[
prod
prodall -> accreal
- self
prod -> new THTensor
- self
- long dim
prod -> self OPTIONAL_SELF
- self
- THTensor source
- long dim
]]
[[
cumsum
cumsum -> self OPTIONAL_SELF
- self
- THTensor source
- long dim
cumsum -> new THTensor
- self
- long dim
]]
[[
cumprod
cumprod -> self OPTIONAL_SELF
- self
- THTensor source
- long dim
cumprod -> new THTensor
- self
- long dim
]]
[[
sign
sign -> self OPTIONAL_SELF
- self
- THTensor source
sign -> self
- self
- self
]]
#endif /* !IS_CUDA || CUDA_FLOAT */
#if !IS_CUDA
[[
trace
trace -> accreal
- self
]]
#endif
[[
add
add -> self
- self
- self
- real value
add -> self OPTIONAL_SELF
- self
- THTensor a
- real value
cadd -> self
- self
- self
- CONSTANT AS_REAL(1)
- THTensor a
cadd -> self
- self
- self
- real value
- THTensor a
cadd -> self OPTIONAL_SELF
- self
- THTensor a
- CONSTANT AS_REAL(1)
- THTensor b
cadd -> self OPTIONAL_SELF
- self
- THTensor a
- real value
- THTensor b
]]
[[
csub
sub -> self
- self
- self
- real value
sub -> self OPTIONAL_SELF
- self
- THTensor a
- real value
csub -> self
- self
- self
- CONSTANT AS_REAL(1)
- THTensor a
csub -> self
- self
- self
- real value
- THTensor a
csub -> self OPTIONAL_SELF
- self
- THTensor a
- CONSTANT AS_REAL(1)
- THTensor b
csub -> self OPTIONAL_SELF
- self
- THTensor a
- real value
- THTensor b
]]
[[
mul
mul -> self
- self
- self
- real value
mul -> self OPTIONAL_SELF
- self
- THTensor a
- real value
]]
[[
cmul
cmul -> self
- self
- self
- THTensor a
cmul -> self OPTIONAL_SELF
- self
- THTensor a
- THTensor b
]]
[[
div
div -> self
- self
- self
- real value
div -> self OPTIONAL_SELF
- self
- THTensor a
- real value
]]
[[
cdiv
cdiv -> self
- self
- self
- THTensor a
cdiv -> self OPTIONAL_SELF
- self
- THTensor a
- THTensor b
]]
[[
cpow
cpow -> self
- self
- self
- THTensor pow
cpow -> self OPTIONAL_SELF
- self
- THTensor source
- THTensor pow
]]
#if !IS_CUDA
[[
fmod
fmod -> self
- self
- self
- real value
fmod -> self OPTIONAL_SELF
- self
- THTensor source
- real value
]]
[[
cfmod
cfmod -> self
- self
- self
- THTensor div
cfmod -> self OPTIONAL_SELF
- self
- THTensor source
- THTensor div
]]
[[
remainder
remainder -> self
- self
- self
- real value
remainder -> self OPTIONAL_SELF
- self
- THTensor source
- real value
]]
[[
cremainder
cremainder -> self
- self
- self
- THTensor div
cremainder -> self OPTIONAL_SELF
- self
- THTensor source
- THTensor div
]]
#endif /* !IS_CUDA */
#if !IS_CUDA || CUDA_FLOAT
[[
clamp
clamp -> self
- self
- self
- real min
- real max
clamp -> self OPTIONAL_SELF
- self
- THTensor source
- real min
- real max
]]
[[
dot
dot -> accreal
- self
- THTensor a
dot -> accreal
- THTensor a
- THTensor b
]]
[[
tril
tril -> self
- self
- self
- long k OPTIONAL 0
tril -> self OPTIONAL_SELF
- self
- THTensor source
- long k OPTIONAL 0
]]
[[
triu
triu -> self
- self
- self
- long k OPTIONAL 0
triu -> self OPTIONAL_SELF
- self
- THTensor source
- long k OPTIONAL 0
]]
[[
cross
cross -> self
- self
- self
- THTensor a
- CONSTANT -1
cross -> self
- self
- self
- THTensor a
- long dim
cross -> self OPTIONAL_SELF
- self
- THTensor a
- THTensor b
- CONSTANT -1
cross -> self OPTIONAL_SELF
- self
- THTensor a
- THTensor b
- long dim
]]
#endif /* !IS_CUDA || CUDA_FLOAT */
#if !IS_CUDA
[[
eye
eye -> self OPTIONAL_SELF
- self
- long n
- long n
eye -> self OPTIONAL_SELF
- self
- long n
- long m
]]
[[
equal
equal -> bool
- self
- THTensor other
]]
[[
diag
diag -> self
- self
- self
- CONSTANT 0
diag -> self OPTIONAL_SELF
- self
- THTensor other
- CONSTANT 0
diag -> self
- self
- self
- long k
diag -> self OPTIONAL_SELF
- self
- THTensor other
- long k
]]
#endif /* !IS_CUDA */
#if !IS_CUDA
[[
lt
ltValue -> new THByteTensor
- self
- real value
ltValueT -> self
- self
- THTensor other
- real value
ltTensor -> new THByteTensor
- self
- THTensor other
ltTensorT -> self
- self
- THTensor other
- THTensor other2
]]
[[
gt
gtValue -> new THByteTensor
- self
- real value
gtValueT -> self
- self
- THTensor other
- real value
gtTensor -> new THByteTensor
- self
- THTensor other
gtTensorT -> self
- self
- THTensor other
- THTensor other2
]]
[[
le
leValue -> new THByteTensor
- self
- real value
leValueT -> self
- self
- THTensor other
- real value
leTensor -> new THByteTensor
- self
- THTensor other
leTensorT -> self
- self
- THTensor other
- THTensor other2
]]
[[
ge
geValue -> new THByteTensor
- self
- real value
geValueT -> self
- self
- THTensor other
- real value
geTensor -> new THByteTensor
- self
- THTensor other
geTensorT -> self
- self
- THTensor other
- THTensor other2
]]
[[
eq
eqValue -> new THByteTensor
- self
- real value
eqValueT -> self
- self
- THTensor other
- real value
eqTensor -> new THByteTensor
- self
- THTensor other
eqTensorT -> self
- self
- THTensor other
- THTensor other2
]]
[[
ne
neValue -> new THByteTensor
- self
- real value
neValueT -> self
- self
- THTensor other
- real value
neTensor -> new THByteTensor
- self
- THTensor other
neTensorT -> self
- self
- THTensor other
- THTensor other2
]]
#elif CUDA_FLOAT
[[
lt
ltValue -> new THTensor
- self
- real value
ltValue -> self
- self
- THTensor other
- real value
ltTensor -> new THTensor
- self
- THTensor other
ltTensor -> self
- self
- THTensor other
- THTensor other2
]]
[[
gt
gtValue -> new THTensor
- self
- real value
gtValue -> self
- self
- THTensor other
- real value
gtTensor -> new THTensor
- self
- THTensor other
gtTensor -> self
- self
- THTensor other
- THTensor other2
]]
[[
le
leValue -> new THTensor
- self
- real value
leValue -> self
- self
- THTensor other
- real value
leTensor -> new THTensor
- self
- THTensor other
leTensor -> self
- self
- THTensor other
- THTensor other2
]]
[[
ge
geValue -> new THTensor
- self
- real value
geValue -> self
- self
- THTensor other
- real value
geTensor -> new THTensor
- self
- THTensor other
geTensor -> self
- self
- THTensor other
- THTensor other2
]]
[[
eq
eqValue -> new THTensor
- self
- real value
eqValue -> self
- self
- THTensor other
- real value
eqTensor -> new THTensor
- self
- THTensor other
eqTensor -> self
- self
- THTensor other
- THTensor other2
]]
[[
ne
neValue -> new THTensor
- self
- real value
neValue -> self
- self
- THTensor other
- real value
neTensor -> new THTensor
- self
- THTensor other
neTensor -> self
- self
- THTensor other
- THTensor other2
]]
#endif
#if !IS_CUDA
[[
min
minall -> real
- self
min -> new ValueIndexPair
- self
- long index
min -> new SelfIndexPair
- THTensor other
- long index
]]
[[
max
maxall -> real
- self
max -> new ValueIndexPair
- self
- long index
max -> new SelfIndexPair
- THTensor other
- long index
]]
[[
kthvalue
kthvalue -> new ValueIndexPair
- self
- long k
- EXPRESSION THTensor_(nDimension)(LIBRARY_STATE {2}->cdata)-1
kthvalue -> new ValueIndexPair
- self
- long k
- long dim
kthvalue -> new SelfIndexPair
- THTensor other
- long k
- EXPRESSION THTensor_(nDimension)(LIBRARY_STATE {2}->cdata)-1
kthvalue -> new SelfIndexPair
- THTensor other
- long k
- long dim
]]
[[
mode
mode -> new ValueIndexPair
- self
- EXPRESSION THTensor_(nDimension)(LIBRARY_STATE {2}->cdata)-1
mode -> new ValueIndexPair
- self
- long dim
mode -> new SelfIndexPair
- THTensor other
- EXPRESSION THTensor_(nDimension)(LIBRARY_STATE {2}->cdata)-1
mode -> new SelfIndexPair
- THTensor other
- long dim
]]
[[
median
median -> new ValueIndexPair
- self
- EXPRESSION THTensor_(nDimension)(LIBRARY_STATE {2}->cdata)-1
median -> new ValueIndexPair
- self
- long dim
median -> new SelfIndexPair
- THTensor other
- EXPRESSION THTensor_(nDimension)(LIBRARY_STATE {2}->cdata)-1
median -> new SelfIndexPair
- THTensor other
- long dim
]]
[[
sort
sort -> new ValueIndexPair
- self
- EXPRESSION THTensor_(nDimension)(LIBRARY_STATE {2}->cdata)-1
- CONSTANT false
sort -> new ValueIndexPair
- self
- long dim
- CONSTANT false
sort -> new ValueIndexPair
- self
- long dim
- bool descending
sort -> new SelfIndexPair
- THTensor source
- EXPRESSION THTensor_(nDimension)(LIBRARY_STATE {2}->cdata)-1
- CONSTANT false
sort -> new SelfIndexPair
- THTensor source
- long dim
- CONSTANT false
sort -> new SelfIndexPair
- THTensor source
- long dim
- bool descending
]]
[[
topk
topk -> new ValueIndexPair
- self
- CONSTANT 1
- EXPRESSION THTensor_(nDimension)(LIBRARY_STATE {2}->cdata)-1
- CONSTANT false
- CONSTANT false
topk -> new ValueIndexPair
- self
- long k
- EXPRESSION THTensor_(nDimension)(LIBRARY_STATE {2}->cdata)-1
- CONSTANT false
- CONSTANT false
topk -> new ValueIndexPair
- self
- long k
- long dim
- CONSTANT false
- CONSTANT false
topk -> new ValueIndexPair
- self
- long k
- long dim
- bool smallest
- CONSTANT false
topk -> new ValueIndexPair
- self
- long k
- long dim
- bool smallest
- bool sorted
topk -> new SelfIndexPair
- THTensor source
- CONSTANT 1
- EXPRESSION THTensor_(nDimension)(LIBRARY_STATE {2}->cdata)-1
- CONSTANT false
- CONSTANT false
topk -> new SelfIndexPair
- THTensor source
- long k
- EXPRESSION THTensor_(nDimension)(LIBRARY_STATE {2}->cdata)-1
- CONSTANT false
- CONSTANT false
topk -> new SelfIndexPair
- THTensor source
- long k
- long dim
- CONSTANT false
- CONSTANT false
topk -> new SelfIndexPair
- THTensor source
- long k
- long dim
- bool smallest
- CONSTANT false
topk -> new SelfIndexPair
- THTensor source
- long k
- long dim
- bool smallest
- bool sorted
]]
#elif CUDA_FLOAT
[[
min
minall -> real
- self
min -> new ValueValuePair
- self
- long index
min -> new SelfValuePair
- THTensor other
- long index
]]
[[
max
maxall -> real
- self
max -> new ValueValuePair
- self
- long index
max -> new SelfValuePair
- THTensor other
- long index
]]
[[
sort
sort -> new ValueValuePair
- self
- EXPRESSION THTensor_(nDimension)(LIBRARY_STATE {2}->cdata)-1
- CONSTANT false
sort -> new ValueValuePair
- self
- long dim
- CONSTANT false
sort -> new ValueValuePair
- self
- long dim
- bool descending
sort -> new SelfValuePair
- THTensor source
- EXPRESSION THTensor_(nDimension)(LIBRARY_STATE {2}->cdata)-1
- CONSTANT false
sort -> new SelfValuePair
- THTensor source
- long dim
- CONSTANT false
sort -> new SelfValuePair
- THTensor source
- long dim
- bool descending
]]
[[
topk
topk -> new ValueValuePair
- self
- CONSTANT 1
- EXPRESSION THTensor_(nDimension)(LIBRARY_STATE {2}->cdata)-1
- CONSTANT false
- CONSTANT false
topk -> new ValueValuePair
- self
- long k
- EXPRESSION THTensor_(nDimension)(LIBRARY_STATE {2}->cdata)-1
- CONSTANT false
- CONSTANT false
topk -> new ValueValuePair
- self
- long k
- long dim
- CONSTANT false
- CONSTANT false
topk -> new ValueValuePair
- self
- long k
- long dim
- bool smallest
- CONSTANT false
topk -> new ValueValuePair
- self
- long k
- long dim
- bool smallest
- bool sorted
topk -> new SelfValuePair
- THTensor source
- CONSTANT 1
- EXPRESSION THTensor_(nDimension)(LIBRARY_STATE {2}->cdata)-1
- CONSTANT false
- CONSTANT false
topk -> new SelfValuePair
- THTensor source
- long k
- EXPRESSION THTensor_(nDimension)(LIBRARY_STATE {2}->cdata)-1
- CONSTANT false
- CONSTANT false
topk -> new SelfValuePair
- THTensor source
- long k
- long dim
- CONSTANT false
- CONSTANT false
topk -> new SelfValuePair
- THTensor source
- long k
- long dim
- bool smallest
- CONSTANT false
topk -> new SelfValuePair
- THTensor source
- long k
- long dim
- bool smallest
- bool sorted
]]
#endif
// TODO: why are these stateful only?
#if !IS_CUDA
[[
maskedFill STATEFUL_ONLY
maskedFill -> self
- self
- THByteTensor mask
- real value
]]
[[
maskedCopy STATEFUL_ONLY
maskedCopy -> self
- self
- THByteTensor mask
- THTensor source
]]
[[
maskedSelect STATEFUL_ONLY
maskedSelect -> new THTensor
- self
- THByteTensor mask
maskedSelect -> self
- self
- THTensor source
- THByteTensor mask
]]
#elif CUDA_FLOAT
[[
maskedFill STATEFUL_ONLY
maskedFill -> self
- self
- THTensor mask
- real value
]]
[[
maskedCopy STATEFUL_ONLY
maskedCopy -> self
- self
- THTensor mask
- THTensor source
]]
[[
maskedSelect STATEFUL_ONLY
maskedSelect -> new THTensor
- self
- THTensor mask
maskedSelect -> self
- self
- THTensor source
- THTensor mask
]]
#endif
#ifdef TH_REAL_IS_BYTE
[[
all
logicalall -> bool
- self
]]
[[
any
logicalany -> bool
- self
]]
#endif
[[
transpose
newTranspose -> THTensor
- self
- long dim0
- long dim1
]]
[[
t
newTranspose -> THTensor
- self
- CONSTANT 0
- CONSTANT 1
]]
// TODO: inconsistent with lua - doesn't return a number when one-elemtn tensor
// collapses to one dimension
[[
squeeze
squeeze -> self
- self
- self
squeeze -> self OPTIONAL_SELF
- self
- THTensor other
squeeze1d -> self
- self
- self
- long dim
squeeze1d -> self OPTIONAL_SELF
- self
- THTensor other
- long dim
]]
#if !IS_CUDA
[[
nonzero
nonzero -> new THLongTensor
- self
nonzero -> CUSTOM {expr}; Py_INCREF(indices); return (PyObject*)indices
- THLongTensor indices
- self
]]
#endif /* !IS_CUDA */
[[
contiguous
newContiguous -> THTensor
- self
]]
[[
clone
newClone -> THTensor
- self
]]
[[
resizeAs STATEFUL_ONLY
resizeAs -> self
- self
- THTensor other
]]
// TODO: index* methods expect 1-based indexing
// this has to be fixed in TH
#if !IS_CUDA
[[
index
indexSelect -> self
- self
- self
- long dim
- THLongTensor index
indexSelect -> self OPTIONAL_SELF
- self
- THTensor source
- long dim
- THLongTensor index
]]
[[
indexCopy
indexCopy -> self
- self
- long dim
- THLongTensor index
- THTensor source
]]
[[
indexAdd
indexAdd -> self
- self
- long dim
- THLongTensor index
- THTensor source
]]
[[
indexFill
indexFill -> self
- self
- long dim
- THLongTensor index
- real value
]]
#elif CUDA_FLOAT
[[
index
indexSelect -> self
- self
- self
- long dim
- THTensor index
indexSelect -> self OPTIONAL_SELF
- self
- THTensor source
- long dim
- THTensor index
]]
[[
indexCopy
indexCopy -> self
- self
- long dim
- THTensor index
- THTensor source
]]
[[
indexAdd
indexAdd -> self
- self
- long dim
- THTensor index
- THTensor source
]]
[[
indexFill
indexFill -> self
- self
- long dim
- THTensor index
- real value
]]
#endif
[[
narrow
narrow -> new THTensor
- self
- long dimension
- long firstIndex
- long size
]]
[[
unfold
unfold -> new THTensor
- self
- long dimension
- long size
- long step
]]
#if !IS_CUDA
[[
range
range -> self OPTIONAL_SELF
- self
- accreal xmin
- accreal xmax
- accreal step OPTIONAL 1
]]
#endif /* !IS_CUDA */
#if !IS_CUDA
[[
scatter
scatter -> self OPTIONAL_SELF
- self
- long dim
- THLongTensor index
- THTensor src
scatterFill -> self OPTIONAL_SELF
- self
- long dim
- THLongTensor index
- real value
]]
[[
gather STATEFUL_ONLY
gather -> CUSTOM THTensorPtr _value = THTensor_(new)(LIBRARY_STATE_NOARGS); THLongStoragePtr _size = THLongTensor_newSizeOf(LIBRARY_STATE index->cdata); THTensor_(resize)(LIBRARY_STATE _value, _size, NULL); THPTensorPtr _ret = (THPTensor*)THPTensor_(newObject)(_value); _value.release(); {expr}; return (PyObject*)_ret.release();
- CONSTANT _ret->cdata
- self
- long dim
- THLongTensor index
gather -> self
- self
- THTensor src
- long dim
- THLongTensor index
]]
[[
gather STATELESS_ONLY
gather -> CUSTOM THTensorPtr _value = THTensor_(new)(LIBRARY_STATE_NOARGS); THLongStoragePtr _size = THLongTensor_newSizeOf(LIBRARY_STATE index->cdata); THTensor_(resize)(LIBRARY_STATE _value, _size, NULL); THPTensorPtr _ret = (THPTensor*)THPTensor_(newObject)(_value); _value.release(); {expr}; return (PyObject*)_ret.release();
- CONSTANT _ret->cdata
- self
- long dim
- THLongTensor index
gather -> self
- self
- THTensor src
- long dim
- THLongTensor index
]]
#elif CUDA_FLOAT
[[
scatter
scatter -> self OPTIONAL_SELF
- self
- long dim
- THTensor index
- THTensor src
scatterFill -> self OPTIONAL_SELF
- self
- long dim
- THTensor index
- real value
]]
[[
gather STATEFUL_ONLY
gather -> CUSTOM THTensorPtr _value = THTensor_(new)(LIBRARY_STATE_NOARGS); THStoragePtr _size = THTensor_newSizeOf(LIBRARY_STATE index->cdata); THTensor_(resize)(LIBRARY_STATE _value, _size, NULL); THPTensorPtr _ret = (THPTensor*)THPTensor_(newObject)(_value); _value.release(); {expr}; return (PyObject*)_ret.release();
- CONSTANT _ret->cdata
- self
- long dim
- THTensor index
gather -> self
- self
- THTensor src
- long dim
- THTensor index
]]
[[
gather STATELESS_ONLY
gather -> CUSTOM THTensorPtr _value = THTensor_(new)(LIBRARY_STATE_NOARGS); THStoragePtr _size = THTensor_newSizeOf(LIBRARY_STATE index->cdata); THTensor_(resize)(LIBRARY_STATE _value, _size, NULL); THPTensorPtr _ret = (THPTensor*)THPTensor_(newObject)(_value); _value.release(); {expr}; return (PyObject*)_ret.release();
- CONSTANT _ret->cdata
- self
- long dim
- THTensor index
gather -> self
- self
- THTensor src
- long dim
- THTensor index
]]
#endif
#if !IS_CUDA || CUDA_FLOAT
// TODO: torch docs provide 7 args
[[
addmm
addmm -> self
- self
- real beta OPTIONAL 1
- self
- real alpha OPTIONAL 1
- THTensor mat1
- THTensor mat2
addmm -> self OPTIONAL_SELF
- self
- real beta OPTIONAL 1
- THTensor M
- real alpha OPTIONAL 1
- THTensor mat1
- THTensor mat2
]]
[[
addmv
addmv -> self
- self
- real beta OPTIONAL 1
- self
- real alpha OPTIONAL 1
- THTensor mat
- THTensor vec
addmv -> self OPTIONAL_SELF
- self
- real beta OPTIONAL 1
- THTensor M
- real alpha OPTIONAL 1
- THTensor mat
- THTensor vec
]]
[[
addr
addr -> self
- self
- real beta OPTIONAL 1
- self
- real alpha OPTIONAL 1
- THTensor vec1
- THTensor vec2
addr -> self OPTIONAL_SELF
- self
- real beta OPTIONAL 1
- THTensor M
- real alpha OPTIONAL 1
- THTensor vec1
- THTensor vec2
]]
#define IMPLEMENT_TWO_MAT_OP(NAME, TH_NAME, PRE_CALL) \
static PyObject * THPTensor_(NAME)(THPTensor *self, PyObject *args) \
{ \
HANDLE_TH_ERRORS \
int _argcount = args ? PyTuple_Size(args) : 0; \
if (_argcount != 2) { \
THPUtils_setError("Provided %d args, but " #NAME "expects exactly two!", _argcount); \
return NULL; \
} \
THPTensor *t1 = (THPTensor*)PyTuple_GET_ITEM(args, 0); \
THPTensor *t2 = (THPTensor*)PyTuple_GET_ITEM(args, 1); \
if (!THPTensor_(IsSubclass)((PyObject*)t1) || !THPTensor_(IsSubclass)((PyObject*)t2)) { \
THPUtils_setError("Expected two " THPTensorBaseStr); \
return NULL; \
} \
PRE_CALL; \
THTensor_(TH_NAME)(LIBRARY_STATE self->cdata, 0, self->cdata, 1, t1->cdata, t2->cdata); \
\
Py_INCREF(self); \
return (PyObject*)self; \
END_HANDLE_TH_ERRORS \
}
#define IMPLEMENT_TWO_MAT_OP_STATELESS(NAME, TH_NAME, PRE_CALL) \
static PyObject * THPTensor_stateless_(NAME)(PyObject *_unused, PyObject *args)\
{ \
HANDLE_TH_ERRORS \
int _argcount = args ? PyTuple_Size(args) : 0; \
THPTensor *t1; \
THPTensor *t2; \
THPTensorPtr self_ptr; \
if (_argcount < 2 || _argcount > 3) { \
THPUtils_setError("Provided %d args, but expects two or three!", _argcount); \
return NULL; \
} \
if (_argcount == 2) { \
t1 = (THPTensor*)PyTuple_GET_ITEM(args, 0); \
t2 = (THPTensor*)PyTuple_GET_ITEM(args, 1); \
if (!THPTensor_(IsSubclass)((PyObject*)t1) || !THPTensor_(IsSubclass)((PyObject*)t2)) { \
THPUtils_setError("Expected two " THPTensorBaseStr); \
return NULL; \
} \
THTensorPtr _tmp = THTensor_(new)(LIBRARY_STATE_NOARGS); \
self_ptr = (THPTensor*)THPTensor_(newObject)(_tmp); \
_tmp.release(); \
} else { \
THPTensor *self = (THPTensor*)PyTuple_GET_ITEM(args, 0); \
Py_INCREF(self); \
self_ptr = self; \
t1 = (THPTensor*)PyTuple_GET_ITEM(args, 1); \
t2 = (THPTensor*)PyTuple_GET_ITEM(args, 2); \
if (!THPTensor_(IsSubclass)((PyObject*)t1) || !THPTensor_(IsSubclass)((PyObject*)t2) || !THPTensor_(IsSubclass)((PyObject*)self)) { \
THPUtils_setError("Expected three " THPTensorBaseStr); \
return NULL; \
} \
} \
PRE_CALL; \
THTensor_(TH_NAME)(LIBRARY_STATE self_ptr->cdata, 0, self_ptr->cdata, 1, t1->cdata, t2->cdata); \
\
return (PyObject*)self_ptr.release(); \
END_HANDLE_TH_ERRORS \
}
IMPLEMENT_TWO_MAT_OP(ger, addr,
long s1 = THTensor_(size)(LIBRARY_STATE t1->cdata, 0);
long s2 = THTensor_(size)(LIBRARY_STATE t2->cdata, 0);
THTensor_(resize2d)(LIBRARY_STATE self->cdata, s1, s2)
);
IMPLEMENT_TWO_MAT_OP(mv, addmv,
long s = THTensor_(size)(LIBRARY_STATE t1->cdata, 0);
THTensor_(resize1d)(LIBRARY_STATE self->cdata, s)
);
IMPLEMENT_TWO_MAT_OP(mm, addmm,
long s1 = THTensor_(size)(LIBRARY_STATE t1->cdata, 0);
long s2 = THTensor_(size)(LIBRARY_STATE t2->cdata, 1);
THTensor_(resize2d)(LIBRARY_STATE self->cdata, s1, s2)
);
IMPLEMENT_TWO_MAT_OP(bmm, baddbmm,
long s1 = THTensor_(size)(LIBRARY_STATE t1->cdata, 0);
long s2 = THTensor_(size)(LIBRARY_STATE t1->cdata, 1);
long s3 = THTensor_(size)(LIBRARY_STATE t2->cdata, 2);
THTensor_(resize3d)(LIBRARY_STATE self->cdata, s1, s2, s3)
);
IMPLEMENT_TWO_MAT_OP_STATELESS(ger, addr,
long s1 = THTensor_(size)(LIBRARY_STATE t1->cdata, 0);
long s2 = THTensor_(size)(LIBRARY_STATE t2->cdata, 0);
THTensor_(resize2d)(LIBRARY_STATE self_ptr->cdata, s1, s2)
);
IMPLEMENT_TWO_MAT_OP_STATELESS(mv, addmv,
long s = THTensor_(size)(LIBRARY_STATE t1->cdata, 0);
THTensor_(resize1d)(LIBRARY_STATE self_ptr->cdata, s)
);
IMPLEMENT_TWO_MAT_OP_STATELESS(mm, addmm,
long s1 = THTensor_(size)(LIBRARY_STATE t1->cdata, 0);
long s2 = THTensor_(size)(LIBRARY_STATE t2->cdata, 1);
THTensor_(resize2d)(LIBRARY_STATE self_ptr->cdata, s1, s2)
);
IMPLEMENT_TWO_MAT_OP_STATELESS(bmm, baddbmm,
long s1 = THTensor_(size)(LIBRARY_STATE t1->cdata, 0);
long s2 = THTensor_(size)(LIBRARY_STATE t1->cdata, 1);
long s3 = THTensor_(size)(LIBRARY_STATE t2->cdata, 2);
THTensor_(resize3d)(LIBRARY_STATE self_ptr->cdata, s1, s2, s3)
);
[[
addbmm
addbmm -> self
- self
- real beta OPTIONAL 1
- self
- real alpha OPTIONAL 1
- THTensor batch1
- THTensor batch2
addbmm -> self OPTIONAL_SELF
- self
- real beta OPTIONAL 1
- THTensor M
- real alpha OPTIONAL 1
- THTensor batch1
- THTensor batch2
]]
[[
baddbmm
baddbmm -> self
- self
- real beta OPTIONAL 1
- self
- real alpha OPTIONAL 1
- THTensor batch1
- THTensor batch2
baddbmm -> self OPTIONAL_SELF
- self
- real beta OPTIONAL 1
- THTensor M
- real alpha OPTIONAL 1
- THTensor batch1
- THTensor batch2
]]
[[
addcmul
addcmul -> self OPTIONAL_SELF
- self
- self
- real value OPTIONAL 1
- THTensor t1
- THTensor t2
addcmul -> self OPTIONAL_SELF
- self
- THTensor M
- real value OPTIONAL 1
- THTensor t1
- THTensor t2
]]
[[
addcdiv
addcdiv -> self
- self
- self
- real value OPTIONAL 1
- THTensor t1
- THTensor t2
addcdiv -> self OPTIONAL_SELF
- self
- THTensor M
- real value OPTIONAL 1
- THTensor t1
- THTensor t2
]]
#endif
#if !IS_CUDA
[[
randperm
randperm -> self OPTIONAL_SELF
- self
- THGenerator generator OPTIONAL THPDefaultGenerator->cdata
- long n
]]
static void THTensor_(random2__)(THTensor *self, THGenerator *gen, long a, long b)
{
THArgCheck(b >= a, 2, "upper bound must be larger than lower bound");
TH_TENSOR_APPLY(real, self, *self_data = ((THRandom_random(gen) % (b+1-a)) + a);)
}
static void THTensor_(random1__)(THTensor *self, THGenerator *gen, long b)
{
THArgCheck(b > 0, 1, "upper bound must be strictly positive");
TH_TENSOR_APPLY(real, self, *self_data = (THRandom_random(gen) % b + 1);)
}
[[
random
random -> self
- self
- THGenerator generator OPTIONAL THPDefaultGenerator->cdata
random1__ -> self
- self
- THGenerator generator OPTIONAL THPDefaultGenerator->cdata
- long a
random2__ -> self
- self
- THGenerator generator OPTIONAL THPDefaultGenerator->cdata
- long a
- long b
]]
#endif
#if defined(TH_REAL_IS_FLOAT) || defined(TH_REAL_IS_DOUBLE)
[[
multinomial
multinomial -> new THLongTensor
- THGenerator generator OPTIONAL THPDefaultGenerator->cdata
- self
- long num_samples
- bool replacement OPTIONAL false
]]
[[
uniform
uniform -> self
- self
- THGenerator generator OPTIONAL THPDefaultGenerator->cdata
- real a OPTIONAL 0
- real b OPTIONAL 1
]]
[[
normal
normal -> self
- self
- THGenerator generator OPTIONAL THPDefaultGenerator->cdata
- real a OPTIONAL 0
- real b OPTIONAL 1
]]
[[
cauchy
cauchy -> self
- self
- THGenerator generator OPTIONAL THPDefaultGenerator->cdata
- real a OPTIONAL 0
- real b OPTIONAL 1
]]
[[
logNormal
logNormal -> self
- self
- THGenerator generator OPTIONAL THPDefaultGenerator->cdata
- real a OPTIONAL 1
- real b OPTIONAL 2
]]
[[
exponential
exponential -> self
- self
- THGenerator generator OPTIONAL THPDefaultGenerator->cdata
- real lambda OPTIONAL 1
]]
[[
rand
rand -> self LONG_ARGS OPTIONAL_SELF
- self
- THGenerator generator OPTIONAL THPDefaultGenerator->cdata
- CONSTANT _long_args
]]
[[
randn
randn -> self LONG_ARGS OPTIONAL_SELF
- self
- THGenerator generator OPTIONAL THPDefaultGenerator->cdata
- CONSTANT _long_args
]]
#elif CUDA_FLOAT
[[
multinomial
multinomial -> new THTensor
- self
- long n
- bool replacement OPTIONAL false
]]
[[
uniform
uniform -> self
- self
- real a OPTIONAL 0
- real b OPTIONAL 1
]]
[[
normal
normal -> self
- self
- real a OPTIONAL 0
- real b OPTIONAL 1
]]
[[
cauchy
cauchy -> self
- self
- real a OPTIONAL 0
- real b OPTIONAL 1
]]
[[
logNormal
logNormal -> self
- self
- real a OPTIONAL 1
- real b OPTIONAL 2
]]
[[
exponential
exponential -> self
- self
- real lambda OPTIONAL 1
]]
[[
rand
rand -> self LONG_ARGS OPTIONAL_SELF
- self
- CONSTANT _long_args
]]
[[
randn
randn -> self LONG_ARGS OPTIONAL_SELF
- self
- CONSTANT _long_args
]]
#endif
#if !IS_CUDA
// TODO: can't handle sampling from [a, b]
[[
geometric
geometric -> self
- self
- THGenerator generator OPTIONAL THPDefaultGenerator->cdata
- double p
]]
[[
bernoulli
bernoulli -> self
- self
- THGenerator generator OPTIONAL THPDefaultGenerator->cdata
- double p OPTIONAL 0.5
bernoulli_FloatTensor -> self
- self
- THGenerator generator OPTIONAL THPDefaultGenerator->cdata
- THFloatTensor float_probabilities
bernoulli_DoubleTensor -> self
- self
- THGenerator generator OPTIONAL THPDefaultGenerator->cdata
- THDoubleTensor double_probabilities
]]
#elif CUDA_FLOAT
[[
geometric
geometric -> self
- self
- double p
]]
[[
bernoulli
bernoulli -> self
- self
- double p OPTIONAL 0.5
]]
#endif
static std::pair<std::vector<THPObjectPtr>, std::vector<THTensor *>>
THPTensor_(_iterableTensors)(PyObject *iterable)
{
THPObjectPtr iterator;
THPObjectPtr item;
std::vector<THPObjectPtr> items;
std::vector<THTensor *> item_tensors;
if ((iterator = PyObject_GetIter(iterable))) {
while((item = PyIter_Next(iterator))) {
if (!THPTensor_(IsSubclass)(item)) {
THPUtils_setError("expected an iterable of " THPTensorStr ", but found %s in it", Py_TYPE(item)->tp_name);
throw std::exception();
}
item_tensors.push_back(((THPTensor*)item.get())->cdata);
items.emplace_back(std::move(item));
}
} else {
throw std::invalid_argument("");
}
return std::make_pair(std::move(items), std::move(item_tensors));
}
static PyObject * THPTensor_(cat)(THPTensor *self, PyObject *args)
{
HANDLE_TH_ERRORS
THPTensor *tensor1;
THPTensor *tensor2;
long dimension;
Py_ssize_t _argcount = PyTuple_Size(args);
if (_argcount == 2) {
PyObject *iterable = PyTuple_GET_ITEM(args, 0);
PyObject *dim = PyTuple_GET_ITEM(args, 1);
std::vector<THPObjectPtr> items;
std::vector<THTensor *> item_tensors;
if (THPUtils_getLong(dim, &dimension)) {
try {
std::tie(items, item_tensors) = THPTensor_(_iterableTensors)(iterable);
THTensor_(catArray)(self->cdata, item_tensors.data(), items.size(), dimension);
Py_INCREF(self);
return (PyObject*)self;
} catch (std::invalid_argument &e) {
} catch (std::exception &e) {
return NULL;
}
}
} else if (_argcount == 3) {
if (PyArg_ParseTuple(args, "O!O!l", &THPTensorType, &tensor1, &THPTensorType, &tensor2, &dimension)) {
THTensor_(cat)(self->cdata, tensor1->cdata, tensor2->cdata, dimension);
Py_INCREF(self);
return (PyObject*)self;
}
}
// TODO: describe args
THPUtils_invalidArguments(args, "(TODO)");
return NULL;
END_HANDLE_TH_ERRORS
}
static PyObject * THPTensor_stateless_(cat)(THPTensor *_unused, PyObject *args)
{
HANDLE_TH_ERRORS
THPTensor *tensor1;
THPTensor *tensor2;
long dimension;
Py_ssize_t _argcount = PyTuple_Size(args);
if (_argcount == 2) {
THTensorPtr _self = THTensor_(new)(LIBRARY_STATE_NOARGS);
THPTensorPtr self = (THPTensor*)THPTensor_(newObject)(_self);
_self.release();
PyObject *iterable = PyTuple_GET_ITEM(args, 0);
PyObject *dim = PyTuple_GET_ITEM(args, 1);
std::vector<THPObjectPtr> items;
std::vector<THTensor *> item_tensors;
if (THPUtils_getLong(dim, &dimension)) {
try {
std::tie(items, item_tensors) = THPTensor_(_iterableTensors)(iterable);
THTensor_(catArray)(self->cdata, item_tensors.data(), items.size(), dimension);
Py_INCREF(self.get());
return (PyObject*)self.release();
} catch (std::invalid_argument &e) {
} catch (std::exception &e) {
return NULL;
}
}
} else if (_argcount == 3) {
if (PyArg_ParseTuple(args, "O!O!l", &THPTensorType, &tensor1, &THPTensorType, &tensor2, &dimension)) {
THTensorPtr _self = THTensor_(new)(LIBRARY_STATE_NOARGS);
THPTensorPtr self = (THPTensor*)THPTensor_(newObject)(_self.get());
_self.release();
THTensor_(cat)(self->cdata, tensor1->cdata, tensor2->cdata, dimension);
Py_INCREF(self.get());
return (PyObject*)self.release();
} else {
PyErr_Clear();
THPTensor *self = (THPTensor*)PyTuple_GET_ITEM(args, 0);
PyObject *iterable = PyTuple_GET_ITEM(args, 1);
PyObject *dim = PyTuple_GET_ITEM(args, 2);
std::vector<THPObjectPtr> items;
std::vector<THTensor *> item_tensors;
if (THPUtils_getLong(dim, &dimension)) {
try {
std::tie(items, item_tensors) = THPTensor_(_iterableTensors)(iterable);
THTensor_(catArray)(self->cdata, item_tensors.data(), items.size(), dimension);
Py_INCREF(self);
return (PyObject*)self;
} catch (std::invalid_argument &e) {
} catch (std::exception &e) {
fprintf(stderr, "e: %s\n", e.what());
return NULL;
}
}
}
} else if (_argcount == 4) {
THPTensor *self;
if (PyArg_ParseTuple(args, "O!O!O!l", &THPTensorType, &self, &THPTensorType, &tensor1, &THPTensorType, &tensor2, &dimension)) {
THTensor_(cat)(self->cdata, tensor1->cdata, tensor2->cdata, dimension);
Py_INCREF(self);
return (PyObject*)self;
}
}
// TODO: describe args
THPUtils_invalidArguments(args, "(TODO)");
return NULL;
END_HANDLE_TH_ERRORS
}
// Declared in TensorCopy.cpp
//PyObject * THPTensor_(copy)(THPTensor *self, PyObject *other);
static PyMethodDef THPTensor_(methods)[] = {
//////////////////////////////////////////////////////////////////////////////
// These methods are stateful only
{"elementSize", (PyCFunction)THPTensor_(elementSize), METH_NOARGS, NULL},
{"isSameSizeAs", (PyCFunction)THPTensor_(isSameSizeAs), METH_VARARGS, NULL},
{"isContiguous", (PyCFunction)THPTensor_(isContiguous), METH_VARARGS, NULL},
{"isSetTo", (PyCFunction)THPTensor_(isSetTo), METH_VARARGS, NULL},
{"isSize", (PyCFunction)THPTensor_(isSize), METH_VARARGS, NULL},
{"dim", (PyCFunction)THPTensor_(nDimension), METH_NOARGS, NULL},
{"stride", (PyCFunction)THPTensor_(stride), METH_VARARGS, NULL},
{"storage", (PyCFunction)THPTensor_(storage), METH_NOARGS, NULL},
{"storageOffset", (PyCFunction)THPTensor_(storageOffset), METH_NOARGS, NULL},
{"nElement", (PyCFunction)THPTensor_(numel), METH_NOARGS, NULL},
{"nDimension", (PyCFunction)THPTensor_(nDimension), METH_NOARGS, NULL},
//{"copy", (PyCFunction)THPTensor_(copy), METH_O, NULL},
{"free", (PyCFunction)THPTensor_(free), METH_NOARGS, NULL},
{"retain", (PyCFunction)THPTensor_(retain), METH_NOARGS, NULL},
{"size", (PyCFunction)THPTensor_(size), METH_VARARGS, NULL},
{"select", (PyCFunction)THPTensor_(select), METH_VARARGS, NULL},
#if !IS_CUDA || CUDA_FLOAT
{"maskedFill", (PyCFunction)THPTensor_(maskedFill), METH_VARARGS, NULL},
{"maskedCopy", (PyCFunction)THPTensor_(maskedCopy), METH_VARARGS, NULL},
{"maskedSelect", (PyCFunction)THPTensor_(maskedSelect), METH_VARARGS, NULL},
#endif
#if !IS_CUDA
{"apply", (PyCFunction)THPTensor_(apply), METH_O, NULL},
{"map", (PyCFunction)THPTensor_(map), METH_VARARGS, NULL},
{"map2", (PyCFunction)THPTensor_(map2), METH_VARARGS, NULL},
#endif
{"resize", (PyCFunction)THPTensor_(resize), METH_VARARGS, NULL},
{"resizeAs", (PyCFunction)THPTensor_(resizeAs), METH_VARARGS, NULL},
{"set", (PyCFunction)THPTensor_(set), METH_VARARGS, NULL},
//////////////////////////////////////////////////////////////////////////////
#if defined(TH_REAL_IS_INT) || defined(TH_REAL_IS_LONG)
{"abs", (PyCFunction)THPTensor_(abs), METH_VARARGS, NULL},
#endif
#if defined(TH_REAL_IS_FLOAT) || defined(TH_REAL_IS_DOUBLE) || CUDA_FLOAT
{"sigmoid", (PyCFunction)THPTensor_(sigmoid), METH_VARARGS, NULL},
{"log", (PyCFunction)THPTensor_(log), METH_VARARGS, NULL},
{"log1p", (PyCFunction)THPTensor_(log1p), METH_VARARGS, NULL},
{"exp", (PyCFunction)THPTensor_(exp), METH_VARARGS, NULL},
{"cos", (PyCFunction)THPTensor_(cos), METH_VARARGS, NULL},
{"acos", (PyCFunction)THPTensor_(acos), METH_VARARGS, NULL},
{"cosh", (PyCFunction)THPTensor_(cosh), METH_VARARGS, NULL},
{"sin", (PyCFunction)THPTensor_(sin), METH_VARARGS, NULL},
{"asin", (PyCFunction)THPTensor_(asin), METH_VARARGS, NULL},
{"sinh", (PyCFunction)THPTensor_(sinh), METH_VARARGS, NULL},
{"tan", (PyCFunction)THPTensor_(tan), METH_VARARGS, NULL},
{"atan", (PyCFunction)THPTensor_(atan), METH_VARARGS, NULL},
{"tanh", (PyCFunction)THPTensor_(tanh), METH_VARARGS, NULL},
{"sqrt", (PyCFunction)THPTensor_(sqrt), METH_VARARGS, NULL},
{"rsqrt", (PyCFunction)THPTensor_(rsqrt), METH_VARARGS, NULL},
{"ceil", (PyCFunction)THPTensor_(ceil), METH_VARARGS, NULL},
{"floor", (PyCFunction)THPTensor_(floor), METH_VARARGS, NULL},
{"round", (PyCFunction)THPTensor_(round), METH_VARARGS, NULL},
{"abs", (PyCFunction)THPTensor_(abs), METH_VARARGS, NULL},
{"trunc", (PyCFunction)THPTensor_(trunc), METH_VARARGS, NULL},
{"frac", (PyCFunction)THPTensor_(frac), METH_VARARGS, NULL},
{"mean", (PyCFunction)THPTensor_(mean), METH_VARARGS, NULL},
{"std", (PyCFunction)THPTensor_(std), METH_VARARGS, NULL},
{"var", (PyCFunction)THPTensor_(var), METH_VARARGS, NULL},
{"norm", (PyCFunction)THPTensor_(norm), METH_VARARGS, NULL},
{"cinv", (PyCFunction)THPTensor_(cinv), METH_VARARGS, NULL},
{"neg", (PyCFunction)THPTensor_(neg), METH_VARARGS, NULL},
{"renorm", (PyCFunction)THPTensor_(renorm), METH_VARARGS, NULL},
{"dist", (PyCFunction)THPTensor_(dist), METH_VARARGS, NULL},
{"atan2", (PyCFunction)THPTensor_(atan2), METH_VARARGS, NULL},
{"pow", (PyCFunction)THPTensor_(pow), METH_VARARGS, NULL},
{"lerp", (PyCFunction)THPTensor_(lerp), METH_VARARGS, NULL},
#endif
#if defined(TH_REAL_IS_FLOAT) || defined(TH_REAL_IS_DOUBLE)
{"linspace", (PyCFunction)THPTensor_(linspace), METH_VARARGS, NULL},
{"logspace", (PyCFunction)THPTensor_(logspace), METH_VARARGS, NULL},
{"histc", (PyCFunction)THPTensor_(histc), METH_VARARGS, NULL},
#endif
#if defined(TH_REAL_IS_FLOAT) || defined(TH_REAL_IS_DOUBLE) || CUDA_FLOAT
{"multinomial", (PyCFunction)THPTensor_(multinomial), METH_VARARGS, NULL},
{"uniform", (PyCFunction)THPTensor_(uniform), METH_VARARGS, NULL},
{"normal", (PyCFunction)THPTensor_(normal), METH_VARARGS, NULL},
{"cauchy", (PyCFunction)THPTensor_(cauchy), METH_VARARGS, NULL},
{"logNormal", (PyCFunction)THPTensor_(logNormal), METH_VARARGS, NULL},
{"exponential", (PyCFunction)THPTensor_(exponential), METH_VARARGS, NULL},
{"rand", (PyCFunction)THPTensor_(rand), METH_VARARGS, NULL},
{"randn", (PyCFunction)THPTensor_(randn), METH_VARARGS, NULL},
#endif
#if !IS_CUDA || CUDA_FLOAT
{"geometric", (PyCFunction)THPTensor_(geometric), METH_VARARGS, NULL},
{"bernoulli", (PyCFunction)THPTensor_(bernoulli), METH_VARARGS, NULL},
#endif
#ifdef TH_REAL_IS_BYTE
{"all", (PyCFunction)THPTensor_(all), METH_VARARGS, NULL},
{"any", (PyCFunction)THPTensor_(any), METH_VARARGS, NULL},
#endif
#if !IS_CUDA
{"randperm", (PyCFunction)THPTensor_(randperm), METH_VARARGS, NULL},
{"random", (PyCFunction)THPTensor_(random), METH_VARARGS, NULL},
{"fmod", (PyCFunction)THPTensor_(fmod), METH_VARARGS, NULL},
{"mod", (PyCFunction)THPTensor_(fmod), METH_VARARGS, NULL},
{"cfmod", (PyCFunction)THPTensor_(cfmod), METH_VARARGS, NULL},
{"cmod", (PyCFunction)THPTensor_(cfmod), METH_VARARGS, NULL},
{"remainder", (PyCFunction)THPTensor_(remainder), METH_VARARGS, NULL},
{"cremainder", (PyCFunction)THPTensor_(cremainder), METH_VARARGS, NULL},
{"eye", (PyCFunction)THPTensor_(eye), METH_VARARGS, NULL},
{"equal", (PyCFunction)THPTensor_(equal), METH_VARARGS, NULL},
{"diag", (PyCFunction)THPTensor_(diag), METH_VARARGS, NULL},
{"trace", (PyCFunction)THPTensor_(trace), METH_VARARGS, NULL},
{"kthvalue", (PyCFunction)THPTensor_(kthvalue), METH_VARARGS, NULL},
{"mode", (PyCFunction)THPTensor_(mode), METH_VARARGS, NULL},
{"median", (PyCFunction)THPTensor_(median), METH_VARARGS, NULL},
{"nonzero", (PyCFunction)THPTensor_(nonzero), METH_VARARGS, NULL},
#endif
#if !IS_CUDA || CUDA_FLOAT
{"min", (PyCFunction)THPTensor_(min), METH_VARARGS, NULL},
{"max", (PyCFunction)THPTensor_(max), METH_VARARGS, NULL},
{"cmax", (PyCFunction)THPTensor_(cmax), METH_VARARGS, NULL},
{"cmin", (PyCFunction)THPTensor_(cmin), METH_VARARGS, NULL},
{"dot", (PyCFunction)THPTensor_(dot), METH_VARARGS, NULL},
{"sum", (PyCFunction)THPTensor_(sum), METH_VARARGS, NULL},
{"prod", (PyCFunction)THPTensor_(prod), METH_VARARGS, NULL},
{"cumsum", (PyCFunction)THPTensor_(cumsum), METH_VARARGS, NULL},
{"cumprod", (PyCFunction)THPTensor_(cumprod), METH_VARARGS, NULL},
{"clamp", (PyCFunction)THPTensor_(clamp), METH_VARARGS, NULL},
{"sign", (PyCFunction)THPTensor_(sign), METH_VARARGS, NULL},
{"tril", (PyCFunction)THPTensor_(tril), METH_VARARGS, NULL},
{"triu", (PyCFunction)THPTensor_(triu), METH_VARARGS, NULL},
{"gt", (PyCFunction)THPTensor_(gt), METH_VARARGS, NULL},
{"lt", (PyCFunction)THPTensor_(lt), METH_VARARGS, NULL},
{"ge", (PyCFunction)THPTensor_(ge), METH_VARARGS, NULL},
{"le", (PyCFunction)THPTensor_(le), METH_VARARGS, NULL},
{"eq", (PyCFunction)THPTensor_(eq), METH_VARARGS, NULL},
{"ne", (PyCFunction)THPTensor_(ne), METH_VARARGS, NULL},
{"cross", (PyCFunction)THPTensor_(cross), METH_VARARGS, NULL},
{"sort", (PyCFunction)THPTensor_(sort), METH_VARARGS, NULL},
{"topk", (PyCFunction)THPTensor_(topk), METH_VARARGS, NULL},
#endif
{"add", (PyCFunction)THPTensor_(add), METH_VARARGS, NULL},
{"csub", (PyCFunction)THPTensor_(csub), METH_VARARGS, NULL},
{"mul", (PyCFunction)THPTensor_(mul), METH_VARARGS, NULL},
{"cmul", (PyCFunction)THPTensor_(cmul), METH_VARARGS, NULL},
{"div", (PyCFunction)THPTensor_(div), METH_VARARGS, NULL},
{"cdiv", (PyCFunction)THPTensor_(cdiv), METH_VARARGS, NULL},
{"cpow", (PyCFunction)THPTensor_(cpow), METH_VARARGS, NULL},
{"fill", (PyCFunction)THPTensor_(fill), METH_VARARGS, NULL},
{"numel", (PyCFunction)THPTensor_(numel), METH_VARARGS, NULL},
{"zero", (PyCFunction)THPTensor_(zero), METH_VARARGS, NULL},
{"t", (PyCFunction)THPTensor_(t), METH_VARARGS, NULL},
{"transpose", (PyCFunction)THPTensor_(transpose), METH_VARARGS, NULL},
{"squeeze", (PyCFunction)THPTensor_(squeeze), METH_VARARGS, NULL},
{"contiguous", (PyCFunction)THPTensor_(contiguous), METH_VARARGS, NULL},
{"clone", (PyCFunction)THPTensor_(clone), METH_VARARGS, NULL},
{"reshape", (PyCFunction)THPTensor_(reshape), METH_VARARGS, NULL},
{"zeros", (PyCFunction)THPTensor_(zeros), METH_VARARGS, NULL},
{"ones", (PyCFunction)THPTensor_(ones), METH_VARARGS, NULL},
#if !IS_CUDA || CUDA_FLOAT
{"index", (PyCFunction)THPTensor_(index), METH_VARARGS, NULL},
{"indexCopy", (PyCFunction)THPTensor_(indexCopy), METH_VARARGS, NULL},
{"indexAdd", (PyCFunction)THPTensor_(indexAdd), METH_VARARGS, NULL},
{"indexFill", (PyCFunction)THPTensor_(indexFill), METH_VARARGS, NULL},
#endif
{"cat", (PyCFunction)THPTensor_(cat), METH_VARARGS, NULL},
{"narrow", (PyCFunction)THPTensor_(narrow), METH_VARARGS, NULL},
{"unfold", (PyCFunction)THPTensor_(unfold), METH_VARARGS, NULL},
#if !IS_CUDA || CUDA_FLOAT
{"addmm", (PyCFunction)THPTensor_(addmm), METH_VARARGS, NULL},
{"addmv", (PyCFunction)THPTensor_(addmv), METH_VARARGS, NULL},
{"addr", (PyCFunction)THPTensor_(addr), METH_VARARGS, NULL},
{"ger", (PyCFunction)THPTensor_(ger), METH_VARARGS, NULL},
{"mv", (PyCFunction)THPTensor_(mv), METH_VARARGS, NULL},
{"addbmm", (PyCFunction)THPTensor_(addbmm), METH_VARARGS, NULL},
{"baddbmm", (PyCFunction)THPTensor_(baddbmm), METH_VARARGS, NULL},
{"addcmul", (PyCFunction)THPTensor_(addcmul), METH_VARARGS, NULL},
{"addcdiv", (PyCFunction)THPTensor_(addcdiv), METH_VARARGS, NULL},
{"mm", (PyCFunction)THPTensor_(mm), METH_VARARGS, NULL},
{"bmm", (PyCFunction)THPTensor_(bmm), METH_VARARGS, NULL},
#if !IS_CUDA
{"range", (PyCFunction)THPTensor_(range), METH_VARARGS, NULL},
#endif
{"gather", (PyCFunction)THPTensor_(gather), METH_VARARGS, NULL},
{"scatter", (PyCFunction)THPTensor_(scatter), METH_VARARGS, NULL},
#endif
{NULL}
};
static PyMethodDef THPTensorStatelessMethods[] = {
#if defined(TH_REAL_IS_INT) || defined(TH_REAL_IS_LONG)
{"abs", (PyCFunction)THPTensor_stateless_(abs), METH_VARARGS, NULL},
#endif
#if defined(TH_REAL_IS_FLOAT) || defined(TH_REAL_IS_DOUBLE) || CUDA_FLOAT
{"sigmoid", (PyCFunction)THPTensor_stateless_(sigmoid), METH_VARARGS, NULL},
{"log", (PyCFunction)THPTensor_stateless_(log), METH_VARARGS, NULL},
{"log1p", (PyCFunction)THPTensor_stateless_(log1p), METH_VARARGS, NULL},
{"exp", (PyCFunction)THPTensor_stateless_(exp), METH_VARARGS, NULL},
{"cos", (PyCFunction)THPTensor_stateless_(cos), METH_VARARGS, NULL},
{"acos", (PyCFunction)THPTensor_stateless_(acos), METH_VARARGS, NULL},
{"cosh", (PyCFunction)THPTensor_stateless_(cosh), METH_VARARGS, NULL},
{"sin", (PyCFunction)THPTensor_stateless_(sin), METH_VARARGS, NULL},
{"asin", (PyCFunction)THPTensor_stateless_(asin), METH_VARARGS, NULL},
{"sinh", (PyCFunction)THPTensor_stateless_(sinh), METH_VARARGS, NULL},
{"tan", (PyCFunction)THPTensor_stateless_(tan), METH_VARARGS, NULL},
{"atan", (PyCFunction)THPTensor_stateless_(atan), METH_VARARGS, NULL},
{"tanh", (PyCFunction)THPTensor_stateless_(tanh), METH_VARARGS, NULL},
{"sqrt", (PyCFunction)THPTensor_stateless_(sqrt), METH_VARARGS, NULL},
{"rsqrt", (PyCFunction)THPTensor_stateless_(rsqrt), METH_VARARGS, NULL},
{"ceil", (PyCFunction)THPTensor_stateless_(ceil), METH_VARARGS, NULL},
{"floor", (PyCFunction)THPTensor_stateless_(floor), METH_VARARGS, NULL},
{"round", (PyCFunction)THPTensor_stateless_(round), METH_VARARGS, NULL},
{"abs", (PyCFunction)THPTensor_stateless_(abs), METH_VARARGS, NULL},
{"trunc", (PyCFunction)THPTensor_stateless_(trunc), METH_VARARGS, NULL},
{"frac", (PyCFunction)THPTensor_stateless_(frac), METH_VARARGS, NULL},
{"mean", (PyCFunction)THPTensor_stateless_(mean), METH_VARARGS, NULL},
{"std", (PyCFunction)THPTensor_stateless_(std), METH_VARARGS, NULL},
{"var", (PyCFunction)THPTensor_stateless_(var), METH_VARARGS, NULL},
{"norm", (PyCFunction)THPTensor_stateless_(norm), METH_VARARGS, NULL},
{"cinv", (PyCFunction)THPTensor_stateless_(cinv), METH_VARARGS, NULL},
{"neg", (PyCFunction)THPTensor_stateless_(neg), METH_VARARGS, NULL},
{"renorm", (PyCFunction)THPTensor_stateless_(renorm), METH_VARARGS, NULL},
{"dist", (PyCFunction)THPTensor_stateless_(dist), METH_VARARGS, NULL},
{"atan2", (PyCFunction)THPTensor_stateless_(atan2), METH_VARARGS, NULL},
{"pow", (PyCFunction)THPTensor_stateless_(pow), METH_VARARGS, NULL},
{"lerp", (PyCFunction)THPTensor_stateless_(lerp), METH_VARARGS, NULL},
#endif
#if defined(TH_REAL_IS_FLOAT) || defined(TH_REAL_IS_DOUBLE)
{"linspace", (PyCFunction)THPTensor_stateless_(linspace), METH_VARARGS, NULL},
{"logspace", (PyCFunction)THPTensor_stateless_(logspace), METH_VARARGS, NULL},
{"histc", (PyCFunction)THPTensor_stateless_(histc), METH_VARARGS, NULL},
#endif
#if defined(TH_REAL_IS_FLOAT) || defined(TH_REAL_IS_DOUBLE) || CUDA_FLOAT
{"multinomial", (PyCFunction)THPTensor_stateless_(multinomial), METH_VARARGS, NULL},
{"uniform", (PyCFunction)THPTensor_stateless_(uniform), METH_VARARGS, NULL},
{"normal", (PyCFunction)THPTensor_stateless_(normal), METH_VARARGS, NULL},
{"cauchy", (PyCFunction)THPTensor_stateless_(cauchy), METH_VARARGS, NULL},
{"logNormal", (PyCFunction)THPTensor_stateless_(logNormal), METH_VARARGS, NULL},
{"exponential", (PyCFunction)THPTensor_stateless_(exponential), METH_VARARGS, NULL},
{"rand", (PyCFunction)THPTensor_stateless_(rand), METH_VARARGS, NULL},
{"randn", (PyCFunction)THPTensor_stateless_(randn), METH_VARARGS, NULL},
#endif
#if !IS_CUDA || CUDA_FLOAT
{"geometric", (PyCFunction)THPTensor_stateless_(geometric), METH_VARARGS, NULL},
{"bernoulli", (PyCFunction)THPTensor_stateless_(bernoulli), METH_VARARGS, NULL},
#endif
#ifdef TH_REAL_IS_BYTE
{"all", (PyCFunction)THPTensor_stateless_(all), METH_VARARGS, NULL},
{"any", (PyCFunction)THPTensor_stateless_(any), METH_VARARGS, NULL},
#endif
#if !IS_CUDA
{"randperm", (PyCFunction)THPTensor_stateless_(randperm), METH_VARARGS, NULL},
{"random", (PyCFunction)THPTensor_stateless_(random), METH_VARARGS, NULL},
{"fmod", (PyCFunction)THPTensor_stateless_(fmod), METH_VARARGS, NULL},
{"mod", (PyCFunction)THPTensor_stateless_(fmod), METH_VARARGS, NULL},
{"cfmod", (PyCFunction)THPTensor_stateless_(cfmod), METH_VARARGS, NULL},
{"cmod", (PyCFunction)THPTensor_stateless_(cfmod), METH_VARARGS, NULL},
{"remainder", (PyCFunction)THPTensor_stateless_(remainder), METH_VARARGS, NULL},
{"cremainder", (PyCFunction)THPTensor_stateless_(cremainder), METH_VARARGS, NULL},
{"eye", (PyCFunction)THPTensor_stateless_(eye), METH_VARARGS, NULL},
{"equal", (PyCFunction)THPTensor_stateless_(equal), METH_VARARGS, NULL},
{"diag", (PyCFunction)THPTensor_stateless_(diag), METH_VARARGS, NULL},
{"trace", (PyCFunction)THPTensor_stateless_(trace), METH_VARARGS, NULL},
{"kthvalue", (PyCFunction)THPTensor_stateless_(kthvalue), METH_VARARGS, NULL},
{"mode", (PyCFunction)THPTensor_stateless_(mode), METH_VARARGS, NULL},
{"median", (PyCFunction)THPTensor_stateless_(median), METH_VARARGS, NULL},
{"nonzero", (PyCFunction)THPTensor_stateless_(nonzero), METH_VARARGS, NULL},
#endif
#if !IS_CUDA || CUDA_FLOAT
{"min", (PyCFunction)THPTensor_stateless_(min), METH_VARARGS, NULL},
{"max", (PyCFunction)THPTensor_stateless_(max), METH_VARARGS, NULL},
{"cmax", (PyCFunction)THPTensor_stateless_(cmax), METH_VARARGS, NULL},
{"cmin", (PyCFunction)THPTensor_stateless_(cmin), METH_VARARGS, NULL},
{"dot", (PyCFunction)THPTensor_stateless_(dot), METH_VARARGS, NULL},
{"sum", (PyCFunction)THPTensor_stateless_(sum), METH_VARARGS, NULL},
{"prod", (PyCFunction)THPTensor_stateless_(prod), METH_VARARGS, NULL},
{"cumsum", (PyCFunction)THPTensor_stateless_(cumsum), METH_VARARGS, NULL},
{"cumprod", (PyCFunction)THPTensor_stateless_(cumprod), METH_VARARGS, NULL},
{"clamp", (PyCFunction)THPTensor_stateless_(clamp), METH_VARARGS, NULL},
{"sign", (PyCFunction)THPTensor_stateless_(sign), METH_VARARGS, NULL},
{"tril", (PyCFunction)THPTensor_stateless_(tril), METH_VARARGS, NULL},
{"triu", (PyCFunction)THPTensor_stateless_(triu), METH_VARARGS, NULL},
{"gt", (PyCFunction)THPTensor_stateless_(gt), METH_VARARGS, NULL},
{"lt", (PyCFunction)THPTensor_stateless_(lt), METH_VARARGS, NULL},
{"ge", (PyCFunction)THPTensor_stateless_(ge), METH_VARARGS, NULL},
{"le", (PyCFunction)THPTensor_stateless_(le), METH_VARARGS, NULL},
{"eq", (PyCFunction)THPTensor_stateless_(eq), METH_VARARGS, NULL},
{"ne", (PyCFunction)THPTensor_stateless_(ne), METH_VARARGS, NULL},
{"cross", (PyCFunction)THPTensor_stateless_(cross), METH_VARARGS, NULL},
{"sort", (PyCFunction)THPTensor_stateless_(sort), METH_VARARGS, NULL},
{"topk", (PyCFunction)THPTensor_stateless_(topk), METH_VARARGS, NULL},
#endif
{"add", (PyCFunction)THPTensor_stateless_(add), METH_VARARGS, NULL},
{"csub", (PyCFunction)THPTensor_stateless_(csub), METH_VARARGS, NULL},
{"mul", (PyCFunction)THPTensor_stateless_(mul), METH_VARARGS, NULL},
{"cmul", (PyCFunction)THPTensor_stateless_(cmul), METH_VARARGS, NULL},
{"div", (PyCFunction)THPTensor_stateless_(div), METH_VARARGS, NULL},
{"cdiv", (PyCFunction)THPTensor_stateless_(cdiv), METH_VARARGS, NULL},
{"cpow", (PyCFunction)THPTensor_stateless_(cpow), METH_VARARGS, NULL},
{"fill", (PyCFunction)THPTensor_stateless_(fill), METH_VARARGS, NULL},
{"numel", (PyCFunction)THPTensor_stateless_(numel), METH_VARARGS, NULL},
{"zero", (PyCFunction)THPTensor_stateless_(zero), METH_VARARGS, NULL},
{"t", (PyCFunction)THPTensor_stateless_(t), METH_VARARGS, NULL},
{"transpose", (PyCFunction)THPTensor_stateless_(transpose), METH_VARARGS, NULL},
{"squeeze", (PyCFunction)THPTensor_stateless_(squeeze), METH_VARARGS, NULL},
{"contiguous", (PyCFunction)THPTensor_stateless_(contiguous), METH_VARARGS, NULL},
{"clone", (PyCFunction)THPTensor_stateless_(clone), METH_VARARGS, NULL},
{"reshape", (PyCFunction)THPTensor_stateless_(reshape), METH_VARARGS, NULL},
{"zeros", (PyCFunction)THPTensor_stateless_(zeros), METH_VARARGS, NULL},
{"ones", (PyCFunction)THPTensor_stateless_(ones), METH_VARARGS, NULL},
#if !IS_CUDA || CUDA_FLOAT
{"index", (PyCFunction)THPTensor_stateless_(index), METH_VARARGS, NULL},
{"indexCopy", (PyCFunction)THPTensor_stateless_(indexCopy), METH_VARARGS, NULL},
{"indexAdd", (PyCFunction)THPTensor_stateless_(indexAdd), METH_VARARGS, NULL},
{"indexFill", (PyCFunction)THPTensor_stateless_(indexFill), METH_VARARGS, NULL},
#endif
{"cat", (PyCFunction)THPTensor_stateless_(cat), METH_VARARGS, NULL},
{"narrow", (PyCFunction)THPTensor_stateless_(narrow), METH_VARARGS, NULL},
{"unfold", (PyCFunction)THPTensor_stateless_(unfold), METH_VARARGS, NULL},
#if !IS_CUDA || CUDA_FLOAT
{"addmm", (PyCFunction)THPTensor_stateless_(addmm), METH_VARARGS, NULL},
{"addmv", (PyCFunction)THPTensor_stateless_(addmv), METH_VARARGS, NULL},
{"addr", (PyCFunction)THPTensor_stateless_(addr), METH_VARARGS, NULL},
{"ger", (PyCFunction)THPTensor_stateless_(ger), METH_VARARGS, NULL},
{"mv", (PyCFunction)THPTensor_stateless_(mv), METH_VARARGS, NULL},
{"addbmm", (PyCFunction)THPTensor_stateless_(addbmm), METH_VARARGS, NULL},
{"baddbmm", (PyCFunction)THPTensor_stateless_(baddbmm), METH_VARARGS, NULL},
{"addcmul", (PyCFunction)THPTensor_stateless_(addcmul), METH_VARARGS, NULL},
{"addcdiv", (PyCFunction)THPTensor_stateless_(addcdiv), METH_VARARGS, NULL},
{"mm", (PyCFunction)THPTensor_stateless_(mm), METH_VARARGS, NULL},
{"bmm", (PyCFunction)THPTensor_stateless_(bmm), METH_VARARGS, NULL},
#if !IS_CUDA
{"range", (PyCFunction)THPTensor_stateless_(range), METH_VARARGS, NULL},
#endif
{"gather", (PyCFunction)THPTensor_stateless_(gather), METH_VARARGS, NULL},
{"scatter", (PyCFunction)THPTensor_stateless_(scatter), METH_VARARGS, NULL},
#endif
{NULL}
};
#undef RealStr
#undef AS_REAL