| 338 | // 2. permutation.size() == input.size(). |
| 339 | template <typename Container> |
| 340 | std::vector<typename Container::value_type> Permute( |
| 341 | absl::Span<const int64> permutation, const Container& input) { |
| 342 | using T = typename Container::value_type; |
| 343 | absl::Span<const T> data(input); |
| 344 | CHECK(IsPermutation(permutation, data.size())); |
| 345 | std::vector<T> output(data.size()); |
| 346 | for (size_t i = 0; i < permutation.size(); ++i) { |
| 347 | output[permutation[i]] = data[i]; |
| 348 | } |
| 349 | return output; |
| 350 | } |
| 351 | |
| 352 | // Inverts a permutation, i.e., output_permutation[input_permutation[i]] = i. |
| 353 | std::vector<int64> InversePermutation( |