NEURON
permute_utils.hpp
Go to the documentation of this file.
1 #include <algorithm>
2 #include <vector>
3 
4 template <typename T>
5 void forward_permute(std::vector<T>& data, const std::vector<int>& perm) {
6  // Move data[perm[i]] to data[i]
7  std::vector<T> new_data;
8  new_data.reserve(data.size());
9  std::transform(perm.begin(), perm.end(), std::back_inserter(new_data), [&data](int ind) {
10  return data[ind];
11  });
12  data = std::move(new_data);
13 }
14 
15 template <typename T>
16 void forward_permute(T*& data, int data_size, const std::vector<int>& perm) {
17  // Move data[perm[i]] to data[i]
18  auto new_data = new T[data_size];
19  for (auto i = 0; i < perm.size(); ++i) {
20  new_data[i] = data[perm[i]];
21  }
22  // cannot std::swap because data may have been allocated by malloc
23  // std::swap(data, new_data);
24  for (auto i = 0; i < perm.size(); ++i) {
25  data[i] = new_data[i];
26  }
27  delete[] new_data;
28 }
29 
30 template <typename T>
31 std::vector<T> inverse_permute_vector(const std::vector<T>& p) {
32  std::vector<T> pinv(p.size());
33  for (int i = 0; i < p.size(); ++i) {
34  pinv[p[i]] = i;
35  }
36  return pinv;
37 }
#define i
Definition: md1redef.h:19
void move(Item *q1, Item *q2, Item *q3)
Definition: list.cpp:200
data_handle< T > transform(data_handle< T > handle, Transform type)
Definition: node.cpp:32
size_t p
std::vector< T > inverse_permute_vector(const std::vector< T > &p)
void forward_permute(std::vector< T > &data, const std::vector< int > &perm)