cpu.c 915 Bytes
Newer Older
rusty1s's avatar
rusty1s committed
1
2
3
4
#ifndef TH_GENERIC_FILE
#define TH_GENERIC_FILE "generic/cpu.c"
#else

5
int64_t cluster_(grid)(THLongTensor *output, THTensor *position, THTensor *size, THTensor *maxPosition) {
rusty1s's avatar
rusty1s committed
6
  real *size_data = size->storage->data + size->storageOffset;
7
8
9
10
11
12
13
14
15
16
  real *maxPosition_data = maxPosition->storage->data + maxPosition->storageOffset;

  int64_t Dims = THTensor_(nDimension)(position);
  int64_t D = THTensor_(size)(position, Dims - 1);

  TH_TENSOR_DIM_APPLY2(int64_t, output, real, position, Dims - 1,
    int weight = 1; int64_t cluster = 0;
    for (int d = D - 1; d >= 0; d--) {
      cluster += weight * (int64_t) (*(position_data + d * position_stride) / *(size_data + d));
      weight *= (int64_t) (maxPosition_data[d] / size_data[d]) + 1;
rusty1s's avatar
rusty1s committed
17
    }
18
    output_data[0] = cluster;
rusty1s's avatar
rusty1s committed
19
  )
20
21
22
23
24
25

  int64_t C = 1;
  for (int d = 1; d < D; d++) {
    C *= (int64_t) (maxPosition_data[d] / size_data[d]) + 1;
  }
  return C;
rusty1s's avatar
rusty1s committed
26
27
28
}

#endif