THBasis.c 2.83 KB
Newer Older
rusty1s's avatar
rusty1s committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <TH/TH.h>

#define TH_TENSOR_BASIS_FORWARD(M, basis, weightIndex, pseudo, kernelSize, isOpenSpline, CODE) { \
  real *basisData = THTensor_(data)(basis); \
  int64_t *weightIndexData = THLongTensor_data(weightIndex); \
  real *pseudoData = THTensor_(data)(pseudo); \
  int64_t *kernelSizeData = THLongTensor_data(kernelSize); \
  uint8_t *isOpenSplineData = THByteTensor_data(isOpenSpline); \
\
  ptrdiff_t e, s, d; \
  int64_t k, kMod, wi, wiOffset; \
  real b, v; \
  for (e = 0; e < THTensor_(size)(pseudo, 0); e++) { \
    for (s = 0; s < THTensor_(size)(basis, 1); s++) { \
      k = s; b = 1; wi = 0; wiOffset = 1; \
      for (d = 0; d < THTensor_(size)(pseudo, 1); d++) { \
        kMod = k % (M + 1); \
        k /= M + 1; \
\
        v = pseudoData[e * pseudo->stride[0] + d * pseudo->stride[1]]; \
        v *= kernelSizeData[d] - M * isOpenSplineData[d]; \
\
        wi += (((int64_t) v + kMod) % kernelSizeData[d]) * wiOffset; \
        wiOffset *= kernelSizeData[d]; \
\
        v -= floor(v); \
rusty1s's avatar
rusty1s committed
27
        v = CODE; \
rusty1s's avatar
rusty1s committed
28
29
30
31
32
33
34
35
        b *= v; \
      } \
      basisData[e * basis->stride[0] + s * basis->stride[1]] = b; \
      weightIndexData[e * weightIndex->stride[0] + s * weightIndex->stride[1]] = wi; \
    } \
  } \
}

rusty1s's avatar
rusty1s committed
36
37
38
39
40
41
42
43
#define TH_TENSOR_BASIS_BACKWARD(M, self, gradBasis, pseudo, kernelSize, isOpenSpline, CODE, \
                                 GRAD_CODE) { \
  real *selfData = THTensor_(data)(self); \
  real *gradBasisData = THTensor_(data)(gradBasis); \
  real *pseudoData = THTensor_(data)(pseudo); \
  int64_t *kernelSizeData = THLongTensor_data(kernelSize); \
  uint8_t *isOpenSplineData = THByteTensor_data(isOpenSpline); \
\
rusty1s's avatar
rusty1s committed
44
45
46
  ptrdiff_t e, d, s, dIt, dOther; \
  int64_t kMod; \
  real g, v, tmp; \
rusty1s's avatar
rusty1s committed
47
48
49
\
  for (e = 0; e < THTensor_(size)(pseudo, 0); e++) { \
    for (d = 0; d < THTensor_(size)(pseudo, 1); d++) { \
rusty1s's avatar
rusty1s committed
50
      g = 0; \
rusty1s's avatar
rusty1s committed
51
      for (s = 0; s < THTensor_(size)(gradBasis, 1); s++) { \
rusty1s's avatar
rusty1s committed
52
        kMod = (s / (ptrdiff_t) pow(M + 1, d)) % (M + 1); \
rusty1s's avatar
rusty1s committed
53
54
55
56
        v = pseudoData[e * pseudo->stride[0] + d * pseudo->stride[1]]; \
        v *= kernelSizeData[d] - M * isOpenSplineData[d]; \
        v -= floor(v); \
        v = GRAD_CODE; \
rusty1s's avatar
rusty1s committed
57
        tmp = v; \
rusty1s's avatar
rusty1s committed
58
\
rusty1s's avatar
rusty1s committed
59
60
61
62
63
        for (dIt = 1; dIt < THTensor_(size)(pseudo, 1); dIt++) { \
          dOther = dIt - (d >= dIt); \
          kMod = (s / (ptrdiff_t) pow(M + 1, dOther)) % (M + 1); \
          v = pseudoData[e * pseudo->stride[0] + dOther * pseudo->stride[1]]; \
          v *= kernelSizeData[dOther] - M * isOpenSplineData[dOther]; \
rusty1s's avatar
rusty1s committed
64
65
          v -= floor(v); \
          v = CODE; \
rusty1s's avatar
rusty1s committed
66
          tmp *= v; \
rusty1s's avatar
rusty1s committed
67
        } \
rusty1s's avatar
rusty1s committed
68
        g += tmp * gradBasisData[e * gradBasis->stride[0] + s * gradBasis->stride[1]]; \
rusty1s's avatar
rusty1s committed
69
      } \
rusty1s's avatar
rusty1s committed
70
71
      g *= kernelSizeData[d] - M * isOpenSplineData[d]; \
      selfData[e * self->stride[0] + d * self->stride[1]] = g; \
rusty1s's avatar
rusty1s committed
72
73
74
75
    } \
  } \
}

rusty1s's avatar
rusty1s committed
76
77
#include "generic/THBasis.c"
#include "THGenerateFloatTypes.h"