#pragma once #include #include #include #include namespace torch::lazy { TORCH_API std::vector InversePermutation( c10::ArrayRef input_permutation); TORCH_API bool IsPermutation(c10::ArrayRef permutation); // Gathers the input using the order specified by the permutation. For each i, // output[i] = dimensions[permutation[i]]. The given permutation must be the // same size as the input. template std::vector PermuteDimensions( c10::ArrayRef permutation, const Container& dimensions) { using T = typename Container::value_type; TORCH_CHECK( dimensions.size() == permutation.size(), "Invalid permutation specified. dimensions.size() != permutation.size() (", dimensions.size(), " vs. ", permutation.size(), ")"); TORCH_CHECK( IsPermutation(permutation), "Invalid permutation specified. Permutation is not permutation"); std::vector output(dimensions.size()); for (const auto i : c10::irange(permutation.size())) { output[i] = dimensions[permutation[i]]; } return output; } } // namespace torch::lazy