/
usr
/
local
/
lib64
/
python3.6
/
site-packages
/
torch
/
include
/
ATen
/
native
/
/usr/local/lib64/python3.6/site-packages/torch/include/ATen/native
mkdir
upload
Name
Size
Mode
Actions
cpu/
-
0755
rm
cuda/
-
0755
rm
quantized/
-
0755
rm
Activation.h
3069
0644
edit
dl
rm
AdaptivePooling.h
1165
0644
edit
dl
rm
BatchLinearAlgebra.h
8246
0644
edit
dl
rm
batch_norm.h
1285
0644
edit
dl
rm
BinaryOps.h
4916
0644
edit
dl
rm
BucketizationUtils.h
4248
0644
edit
dl
rm
ComplexHelper.h
3797
0644
edit
dl
rm
CompositeRandomAccessor.h
888
0644
edit
dl
rm
CompositeRandomAccessorCommon.h
6713
0644
edit
dl
rm
ConvUtils.h
5350
0644
edit
dl
rm
Copy.h
356
0644
edit
dl
rm
CPUBlas.h
4199
0644
edit
dl
rm
CPUFallback.h
2404
0644
edit
dl
rm
Cross.h
262
0644
edit
dl
rm
DilatedConvolutionUtils.h
6416
0644
edit
dl
rm
DispatchStub.h
7672
0644
edit
dl
rm
Distance.h
732
0644
edit
dl
rm
Distributions.h
21654
0644
edit
dl
rm
DistributionTemplates.h
18623
0644
edit
dl
rm
EmbeddingBag.h
1320
0644
edit
dl
rm
Fill.h
384
0644
edit
dl
rm
ForeachUtils.h
5962
0644
edit
dl
rm
FunctionOfAMatrixUtils.h
436
0644
edit
dl
rm
GridSampler.h
10525
0644
edit
dl
rm
group_norm.h
896
0644
edit
dl
rm
Histogram.h
492
0644
edit
dl
rm
im2col.h
2838
0644
edit
dl
rm
im2col_shape_check.h
6181
0644
edit
dl
rm
IndexingUtils.h
5373
0644
edit
dl
rm
layer_norm.h
2892
0644
edit
dl
rm
Lerp.h
553
0644
edit
dl
rm
LinearAlgebra.h
603
0644
edit
dl
rm
LinearAlgebraUtils.h
25236
0644
edit
dl
rm
LossMulti.h
2197
0644
edit
dl
rm
Math.h
91356
0644
edit
dl
rm
MathBitFallThroughLists.h
4086
0644
edit
dl
rm
MathBitsFallback.h
7326
0644
edit
dl
rm
MaxPooling.h
1234
0644
edit
dl
rm
Normalization.h
302
0644
edit
dl
rm
PointwiseOps.h
749
0644
edit
dl
rm
Pool.h
10922
0644
edit
dl
rm
Pow.h
1694
0644
edit
dl
rm
ReduceAllOps.h
378
0644
edit
dl
rm
ReduceOps.h
1745
0644
edit
dl
rm
ReduceOpsUtils.h
12245
0644
edit
dl
rm
Repeat.h
1286
0644
edit
dl
rm
Resize.h
6501
0644
edit
dl
rm
ResizeCommon.h
1321
0644
edit
dl
rm
RNN.h
2467
0644
edit
dl
rm
ScatterGatherChecks.h
3641
0644
edit
dl
rm
SegmentReduce.h
685
0644
edit
dl
rm
SharedReduceOps.h
15785
0644
edit
dl
rm
SobolEngineOpsUtils.h
1723
0644
edit
dl
rm
Sorting.h
536
0644
edit
dl
rm
SortingUtils.h
5722
0644
edit
dl
rm
SpectralOpsUtils.h
3146
0644
edit
dl
rm
StridedRandomAccessor.h
6847
0644
edit
dl
rm
TensorAdvancedIndexing.h
3072
0644
edit
dl
rm
TensorCompare.h
1333
0644
edit
dl
rm
TensorDimApply.h
1832
0644
edit
dl
rm
TensorFactories.h
3382
0644
edit
dl
rm
TensorIterator.h
46
0644
edit
dl
rm
TensorIteratorDynamicCasting.h
2025
0644
edit
dl
rm
TensorShape.h
1049
0644
edit
dl
rm
TensorTransformations.h
938
0644
edit
dl
rm
TriangularOpsUtils.h
2000
0644
edit
dl
rm
TypeProperties.h
496
0644
edit
dl
rm
UnaryOps.h
4464
0644
edit
dl
rm
Unfold2d.h
551
0644
edit
dl
rm
Unfold3d.h
852
0644
edit
dl
rm
UnfoldBackward.h
5398
0644
edit
dl
rm
UpSample.h
13599
0644
edit
dl
rm
vol2col.h
3642
0644
edit
dl
rm
Edit:
/usr/local/lib64/python3.6/site-packages/torch/include/ATen/native/DistributionTemplates.h
(18623B)
#pragma once #include <ATen/Dispatch.h> #include <ATen/Generator.h> #include <ATen/Tensor.h> #include <ATen/MemoryOverlap.h> #include <ATen/native/TensorIterator.h> #include <c10/util/Optional.h> #include <limits> #include <cmath> namespace at { namespace native { namespace templates { // ==================================================== Random ======================================================== // The purpose of `update_from` and `update_to` is to find the closest valid int64_t number that can be used as actual `from`. // The current implementation of `random_` uses uint64_t arithmetics and casts the result to the target dtype(scalar_t). // This casting can result in generating numbers that happen to be greater or equal to `to` value. For instance: // // auto actual = torch::empty({3, 3}, torch::half); // actual.random_(0, 65504); // // If random's uint64_t arithmetics produces 65503 as a random value after casting to torch::half it becomes 65504 // and violates the requirement that random value must be less than `to`. To resolve this issue `update_from` and `update_to` // moves `from` to the right and `to` to the left to the next closest value that won't go outside [from, to) after casting to // the target dtype. For `to` = 65504 it moves left for (1 << (log2(to) - 11 + 1)) = 32 and becomes 65472, which is previous // available number for torch::half dtype. template<typename scalar_t> int64_t update_from(int64_t from) { static_assert( std::is_floating_point<scalar_t>::value || std::is_same<scalar_t, at::Half>::value || std::is_same<scalar_t, at::BFloat16>::value, "scalar_t must be floating-point type"); const auto from_plus_1 = static_cast<int64_t>(static_cast<scalar_t>(from + 1)); if (from_plus_1 < from) { int64_t from_ = std::abs(from + 1); int n = 0; while (from_ >>= 1) ++n; // NOLINTNEXTLINE(clang-analyzer-core.UndefinedBinaryOperatorResult) from = from_plus_1 + (1LL << (n - std::numeric_limits<scalar_t>::digits + 1)); } return from; } template<typename scalar_t> int64_t update_to(int64_t to) { static_assert( std::is_floating_point<scalar_t>::value || std::is_same<scalar_t, at::Half>::value || std::is_same<scalar_t, at::BFloat16>::value, "scalar_t must be floating-point type"); const auto to_minus_1 = static_cast<int64_t>(static_cast<scalar_t>(to - 1)); if (to_minus_1 >= to) { int64_t to_ = std::abs(to - 1); int n = 0; while (to_ >>= 1) ++n; // NOLINTNEXTLINE(clang-analyzer-core.UndefinedBinaryOperatorResult) to = to_minus_1 - (1LL << (n - std::numeric_limits<scalar_t>::digits + 1)); } return to; } template<template<typename> class random_kernel, typename RNG> at::Tensor& random_impl(at::Tensor& self, c10::optional<Generator> generator) { auto iter = at::TensorIterator::borrowing_nullary_op(self); random_kernel<RNG>()(iter, generator); return self; } #define CHECK_OUT_OF_BOUNDS(var, name, min, max, dtype) \ TORCH_CHECK(var >= min && var <= max, name , " is out of bounds for ", dtype); \ #define WARN_OUT_OF_BOUNDS(var, name, digits, dtype) \ if (var < -(1LL << digits) || var > (1LL << digits)) { \ TORCH_WARN(name , " is out of bounds [-(2^", digits, "), 2^", digits, "]. ", \ "Due to precision limitations ", dtype, " can support discrete uniform distribution only within this range. ", \ "This warning will become an error in version 1.7 release, please fix the code in advance"); \ } static void check_from_to_in_range(int64_t from, int64_t to_inc, caffe2::TypeMeta dtype) { const auto scalar_type = typeMetaToScalarType(dtype); if (isFloatingType(scalar_type)) { AT_DISPATCH_FLOATING_TYPES_AND2(at::ScalarType::Half, at::ScalarType::BFloat16, scalar_type, "check_random_fp_bounds", [&] { const auto min = static_cast<double>(std::numeric_limits<scalar_t>::lowest()); const auto max = static_cast<double>(std::numeric_limits<scalar_t>::max()); CHECK_OUT_OF_BOUNDS(from, "from", min, max, dtype); CHECK_OUT_OF_BOUNDS(to_inc, "to - 1", min, max, dtype); constexpr auto digits = std::numeric_limits<scalar_t>::digits; WARN_OUT_OF_BOUNDS(from, "from", digits, dtype); WARN_OUT_OF_BOUNDS(to_inc, "to - 1", digits, dtype); }); } else if (isIntegralType(scalar_type, /*includeBool=*/true)) { AT_DISPATCH_INTEGRAL_TYPES_AND(at::ScalarType::Bool, scalar_type, "check_random_integral_bounds", [&]() { const auto min = static_cast<int64_t>(std::numeric_limits<scalar_t>::lowest()); const auto max = static_cast<int64_t>(std::numeric_limits<scalar_t>::max()); CHECK_OUT_OF_BOUNDS(from, "from", min, max, dtype); CHECK_OUT_OF_BOUNDS(to_inc, "to - 1", min, max, dtype); }); } else { TORCH_CHECK(false, "check_random_bounds handles only integral, floating-point and boolean types"); } } template<template<typename> class random_from_to_kernel, typename RNG> at::Tensor& random_from_to_impl(at::Tensor& self, int64_t from, c10::optional<int64_t> to_opt, c10::optional<Generator> generator) { uint64_t range = 0; auto iter = at::TensorIterator::borrowing_nullary_op(self); if (to_opt.has_value()) { // [from, to) int64_t to = *to_opt; TORCH_CHECK(from < to, "random_ expects 'from' to be less than 'to', but got from=", from, " >= to=", to); if (isFloatingType(iter.dtype())) { AT_DISPATCH_FLOATING_TYPES_AND2(at::ScalarType::Half, at::ScalarType::BFloat16, self.scalar_type(), "random_update_from_to", [&] { from = update_from<scalar_t>(from); to = update_to<scalar_t>(to); TORCH_CHECK(from < to, "random_ expects 'from' casted to dtype to be less than 'to' casted to dtype, but got from=", from, " >= to=", to); }); } check_from_to_in_range(from, to - 1, self.dtype()); range = static_cast<uint64_t>(to) - static_cast<uint64_t>(from); random_from_to_kernel<RNG>()(iter, range, from, generator); } else if (from != std::numeric_limits<int64_t>::lowest()) { // [from, std::numeric_limits<int64_t>::max()] int64_t to_inc = 0; if (isFloatingType(iter.dtype())) { AT_DISPATCH_FLOATING_TYPES_AND2(at::ScalarType::Half, at::ScalarType::BFloat16, self.scalar_type(), "random_from_to_range_calc", [&] { constexpr int64_t scalar_t_max = static_cast<int64_t>(1) << std::numeric_limits<scalar_t>::digits; to_inc = scalar_t_max > std::numeric_limits<int64_t>::max() ? std::numeric_limits<int64_t>::max() : static_cast<int64_t>(scalar_t_max); from = update_from<scalar_t>(from); TORCH_CHECK(from < to_inc, "random_ expects 'from' casted to dtype to be less than or equal to 'to_inc' casted to dtype, but got from=", from, " > to_inc=", to_inc); }); } else if (isIntegralType(iter.dtype(), /*includeBool=*/true)) { AT_DISPATCH_INTEGRAL_TYPES_AND(at::ScalarType::Bool, self.scalar_type(), "random_from_to_range_calc", [&] { if (std::is_same<scalar_t, bool>::value) { to_inc = static_cast<int64_t>(true); } else { to_inc = static_cast<int64_t>(std::numeric_limits<scalar_t>::max()); } }); } else { TORCH_CHECK(false, "random_from_to_impl handles only integral, floating-point and boolean types"); } check_from_to_in_range(from, to_inc, self.dtype()); range = static_cast<uint64_t>(to_inc) - static_cast<uint64_t>(from) + 1; random_from_to_kernel<RNG>()(iter, range, from, generator); } else { // [std::numeric_limits<int64_t>::lowest(), std::numeric_limits<int64_t>::max()] // range = 2^64 random_from_to_kernel<RNG>()(iter, generator); } return self; } // ==================================================== Normal ======================================================== // This function computes broadcasted size of mean and std, resize the output to the broadcasted size if it was empty // [Note] The following features will be deprecated in version 1.6 release and function signature will be changed after // When mean and std are not broadcastable but have same number of elements: // This function will resize the output to the size of mean if it was empty. // This function will reshape the std to the shape of mean. // This function will return true in deprecated case, false in broadcastable case and throw in all other cases before deprecation. // This function will not return and throw if mean and std are not broadcastable after deprecation static bool resize_output_for_normal(at::Tensor& output, const at::Tensor& mean, const at::Tensor& std) { bool expandable = at::are_expandable(mean.sizes(), std.sizes()); bool empty_output = output.numel() == 0; if (expandable) { auto shape = at::infer_size(mean.sizes(), std.sizes()); TORCH_CHECK( empty_output || output.sizes().equals(shape), "inconsistent tensor, output size (", output.sizes(), ") is not the same as broadcasted mean and std size (", shape, ")"); if (empty_output) { at::native::resize_(output, shape); } return false; } else { TORCH_CHECK( mean.numel() == std.numel(), "inconsistent tensor, std and mean are not broadcastable and have different number of elements, " "expected mean ", mean.sizes(), " and std ", std.sizes(), " to have same number of elements)"); TORCH_CHECK( empty_output || output.sizes().equals(mean.sizes()), "inconsistent tensor, std and mean are not broadcastable, output size (", output.sizes(), ") is not the same as mean size (", mean.sizes(), ")"); TORCH_WARN_ONCE( "std and mean have the same number of elements, but are not broadcastable. This was previously a " "supported mode of operation, but is now deprecated and the support will be removed in version 1.6 release. " "Note that the current implementation reshapes std to the shape of mean, which may be incur data copies. " "Please ensure that std and mean are broadcastable to avoid these issues."); if (empty_output) { at::native::resize_(output, mean.sizes()); } return true; } } template<template<typename> class normal_kernel, typename RNG> Tensor& normal_impl_(Tensor& self, double mean, double std, c10::optional<Generator> gen) { TORCH_CHECK(std >= 0.0, "normal_ expects std >= 0.0, but found std=", std); if (self.is_complex()) { auto float_tensor = at::view_as_real(self); // variance for normal distribution of the real and imaginary values // is half of the input variance normal_kernel<RNG>()(float_tensor, mean, std/(std::sqrt(2)), gen); } else { normal_kernel<RNG>()(self, mean, std, gen); } return self; } template<template<typename> class normal_kernel, typename RNG> Tensor& normal_out_impl(Tensor& output, const Tensor& mean, double std, c10::optional<Generator> gen) { normal_impl_<normal_kernel, RNG>(output, 0, std, gen); output.add_(mean); return output; } template<template<typename> class normal_kernel, typename RNG> Tensor& normal_out_impl(Tensor& output, double mean, const Tensor& std, c10::optional<Generator> gen) { TORCH_CHECK(!std.is_complex(), "normal expects standard deviation to be non-complex"); TORCH_CHECK( std.min().ge(0).item<bool>(), "normal expects all elements of std >= 0.0"); normal_impl_<normal_kernel, RNG>(output, 0, 1, gen); auto mean_tensor = at::full({}, mean, output.options()); // CUDA NB: addcmul_out copies the tensor to be added into the output. // Please look at aten/src/THC/generic/THCTensorMathPointwise.cu // The previous function here was addcmul_out(output, mean_tensor, output, std, 1); // The third argument is not a constant reference and hence the samples in output are overwritten. // Consequently, the computation performed is mean_tensor + mean_tensor * std instead of mean_tensor + output * std output.mul_(std).add_(mean_tensor); return output; } template<template<typename> class normal_kernel, typename RNG> Tensor& normal_out_impl(Tensor& output, const Tensor& mean, const Tensor& std, c10::optional<Generator> gen) { TORCH_CHECK(!std.is_complex(), "normal expects standard deviation to be non-complex"); TORCH_CHECK( std.numel() == 0 || std.min().ge(0).item<bool>(), "normal expects all elements of std >= 0.0"); bool is_deprecated_th_impl = resize_output_for_normal(output, mean, std); normal_impl_<normal_kernel, RNG>(output, 0, 1, gen); // CUDA NB: addcmul_out copies the tensor to be added into the output. // Please look at aten/src/THC/generic/THCTensorMathPointwise.cu // The previous function here was addcmul_out(output, mean, output, std, 1); // The third argument is not a constant reference and hence the samples in output are overwritten. // Consequently, the computation performed is mean + mean * std instead of mean + output * std if (is_deprecated_th_impl) { output.mul_(std.reshape(mean.sizes())).add_(mean); } else { output.mul_(std).add_(mean); } return output; } template<template<typename> class normal_kernel, typename RNG> Tensor normal_impl(const Tensor& mean, double std, c10::optional<Generator> gen) { Tensor ret = at::empty_like(mean, MemoryFormat::Contiguous); normal_out_impl<normal_kernel, RNG>(ret, mean, std, gen); return ret; } template<template<typename> class normal_kernel, typename RNG> Tensor normal_impl(double mean, const Tensor& std, c10::optional<Generator> gen) { Tensor ret = at::empty_like(std, MemoryFormat::Contiguous); normal_out_impl<normal_kernel, RNG>(ret, mean, std, gen); return ret; } template<template<typename> class normal_kernel, typename RNG> Tensor normal_impl(const Tensor& mean, const Tensor& std, c10::optional<Generator> gen) { Tensor ret = at::empty({0}, mean.options(), MemoryFormat::Contiguous); normal_out_impl<normal_kernel, RNG>(ret, mean, std, gen); return ret; } // ==================================================== Uniform ======================================================= template<template<typename> class uniform_kernel, typename RNG> at::Tensor& uniform_impl_(at::Tensor& self, double from, double to, c10::optional<Generator> generator) { if (self.is_complex()) { auto float_tensor = at::view_as_real(self); uniform_impl_<uniform_kernel, RNG>(float_tensor, from, to, generator); } else { AT_DISPATCH_FLOATING_TYPES_AND2(at::ScalarType::Half, at::ScalarType::BFloat16, self.scalar_type(), "check_uniform_bounds", [&] { const auto dtype = self.dtype(); const auto min = static_cast<double>(std::numeric_limits<scalar_t>::lowest()); const auto max = static_cast<double>(std::numeric_limits<scalar_t>::max()); CHECK_OUT_OF_BOUNDS(from, "from", min, max, dtype); CHECK_OUT_OF_BOUNDS(to, "to", min, max, dtype); TORCH_CHECK(from <= to, "uniform_ expects to return a [from, to) range, but found from=", from, " > to=", to); TORCH_CHECK((to - from) <= std::numeric_limits<scalar_t>::max(), "uniform_ expects to-from <= std::numeric_limits<", toString(self.scalar_type()), ">::max(), but found to=", to, " and from=", from, " which result in to-from to exceed the limit"); from = std::min(std::max(from, min), max); to = std::max(std::min(to, max), min); }); auto iter = at::TensorIterator::borrowing_nullary_op(self); uniform_kernel<RNG>()(iter, from, to, generator); } return self; } // ================================================== LogNormal ======================================================= template<template<typename> class log_normal_kernel, typename RNG> at::Tensor& log_normal_impl_(at::Tensor& self, double mean, double std, c10::optional<Generator> gen) { TORCH_CHECK(std > 0.0, "log_normal_ expects std > 0.0, but found std=", std); auto iter = TensorIterator::borrowing_nullary_op(self); log_normal_kernel<RNG>()(iter, mean, std, gen); return self; } // =================================================== Geometric ====================================================== template<template<typename> class geometric_kernel, typename RNG> Tensor& geometric_impl_(Tensor& self, double p, c10::optional<Generator> gen) { TORCH_CHECK(0 < p && p < 1, "geometric_ expects p to be in (0, 1), but got p=", p); auto iter = TensorIterator::borrowing_nullary_op(self); geometric_kernel<RNG>()(iter, p, gen); return self; } // ================================================== Exponential ===================================================== template<template<typename> class exponential_kernel, typename RNG> Tensor& exponential_impl_(Tensor& self, double lambda, c10::optional<Generator> gen) { TORCH_CHECK(lambda >= 0.0, "exponential_ expects lambda >= 0.0, but found lambda=", lambda); auto iter = TensorIterator::borrowing_nullary_op(self); exponential_kernel<RNG>()(iter, lambda, gen); return self; } // ==================================================== Cauchy ======================================================== template<template<typename> class cauchy_kernel, typename RNG> Tensor& cauchy_impl_(Tensor& self, double median, double sigma, c10::optional<Generator> gen) { auto iter = TensorIterator::borrowing_nullary_op(self); cauchy_kernel<RNG>()(iter, median, sigma, gen); return self; } // ==================================================== Bernoulli ===================================================== template<template<typename> class bernoulli_tensor_kernel, typename RNG> Tensor& bernoulli_impl_(Tensor& self, const Tensor& p_, c10::optional<Generator> gen) { NoNamesGuard guard; at::assert_no_internal_overlap(self); bernoulli_tensor_kernel<RNG>()(self, p_, gen); return self; } template<template<typename> class bernoulli_scalar_kernel, typename RNG> Tensor& bernoulli_impl_(Tensor& self, double p, c10::optional<Generator> gen) { TORCH_CHECK(0 <= p && p <= 1, "bernoulli_ expects p to be in [0, 1], but got p=", p); at::assert_no_internal_overlap(self); bernoulli_scalar_kernel<RNG>()(self, p, gen); return self; } template<template<typename> class bernoulli_tensor_kernel, typename RNG> Tensor& bernoulli_out_impl(Tensor& result, const Tensor& self, c10::optional<Generator> gen) { // result.resize_as_(self) requires self to have same dtype as result, so we // use resize_ instead. // TODO: Fix resize_as_. See pytorch/pytorch#11665. result.resize_(self.sizes()); bernoulli_impl_<bernoulli_tensor_kernel, RNG>(result, self, gen); namedinference::propagate_names(result, self); return result; } #undef CHECK_OUT_OF_BOUNDS #undef WARN_OUT_OF_BOUNDS }}}
Save
cmd:
run