unique_consecutive_cpu_template Class — pytorch Architecture
Architecture documentation for the unique_consecutive_cpu_template class in Unique.cpp from the pytorch codebase.
Entity Profile
Source Code
aten/src/ATen/native/Unique.cpp lines 266–322
template <typename scalar_t>
std::tuple<Tensor, Tensor, Tensor> unique_consecutive_cpu_template(
const Tensor& self,
const bool return_inverse,
const bool return_counts) {
const Tensor& input = self.contiguous();
const scalar_t* input_data = input.const_data_ptr<scalar_t>();
int64_t numel = input.numel();
Tensor output = at::empty({numel}, input.options());
Tensor inverse_indices = at::empty({0}, self.options().dtype(kLong));
Tensor counts = at::empty({0}, self.options().dtype(kLong));
if (return_inverse) {
inverse_indices.resize_(input.sizes());
}
if (numel > 0) {
scalar_t *output_data = output.data_ptr<scalar_t>();
int64_t *inverse_data = inverse_indices.data_ptr<int64_t>();;
int64_t *counts_data = nullptr;
scalar_t last_value = c10::load(input_data);
*output_data = last_value;
if (return_counts) {
counts.resize_({numel});
counts_data = counts.data_ptr<int64_t>();
}
scalar_t *p = output_data;
int64_t *q = counts_data;
int64_t last = 0;
if (return_inverse) {
inverse_data[0] = 0;
}
for (const auto i : c10::irange(1, numel)) {
const auto value = c10::load(&input_data[i]);
if (value != last_value) {
*(++p) = value;
last_value = value;
if (return_counts) {
*(q++) = i - last;
last = i;
}
}
if (return_inverse) {
inverse_data[i] = p - output_data;
}
}
int64_t output_size = p - output_data + 1;
if (return_counts) {
*q = numel - last;
counts.resize_({output_size});
}
output.resize_({output_size});
}
return std::make_tuple(output, inverse_indices, counts);
}
Source
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free