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

5
void spline_(linear_basis_forward)(THTensor *basis, THLongTensor *weight_index, THTensor *pseudo, THLongTensor *kernel_size, THByteTensor *is_open_spline, int K) {
rusty1s's avatar
rusty1s committed
6
  SPLINE_BASIS_FORWARD(1, basis, weight_index, pseudo, kernel_size, is_open_spline, K,
rusty1s's avatar
rusty1s committed
7
    value = 1 - value - k_mod + 2 * value * k_mod;
rusty1s's avatar
rusty1s committed
8
9
  )
}
rusty1s's avatar
rusty1s committed
10

11
void spline_(quadratic_basis_forward)(THTensor *basis, THLongTensor *weight_index, THTensor *pseudo, THLongTensor *kernel_size, THByteTensor *is_open_spline, int K) {
rusty1s's avatar
rusty1s committed
12
  SPLINE_BASIS_FORWARD(2, basis, weight_index, pseudo, kernel_size, is_open_spline, K,
rusty1s's avatar
rusty1s committed
13
    if (k_mod == 0) value = 0.5 * value * value - value + 0.5;
rusty1s's avatar
rusty1s committed
14
15
16
17
    else if (k_mod == 1) value = -value * value + value + 0.5;
    else value = 0.5 * value * value;
  )
}
rusty1s's avatar
rusty1s committed
18

19
void spline_(cubic_basis_forward)(THTensor *basis, THLongTensor *weight_index, THTensor *pseudo, THLongTensor *kernel_size, THByteTensor *is_open_spline, int K) {
rusty1s's avatar
rusty1s committed
20
  SPLINE_BASIS_FORWARD(3, basis, weight_index, pseudo, kernel_size, is_open_spline, K,
rusty1s's avatar
rusty1s committed
21
22
23
24
    if (k_mod == 0) { value = (1 - value); value = value * value * value / 6.0; }
    else if (k_mod == 1) value = (3 * value * value * value - 6 * value * value + 4) / 6;
    else if (k_mod == 2) value = (-3 * value * value * value + 3 * value * value + 3 * value + 1) / 6;
    else value = value * value * value / 6;
rusty1s's avatar
rusty1s committed
25
  )
rusty1s's avatar
rusty1s committed
26
27
}

rusty1s's avatar
rusty1s committed
28
void spline_(linear_basis_backward)(THTensor *grad_pseudo, THTensor *grad_basis, THTensor *pseudo, THLongTensor *kernel_size, THByteTensor *is_open_spline) {
rusty1s's avatar
rusty1s committed
29
  SPLINE_BASIS_BACKWARD(1, grad_pseudo, grad_basis, pseudo, kernel_size, is_open_spline,
rusty1s's avatar
rusty1s committed
30
    value = 1 - value - k_mod + 2 * value * k_mod;
rusty1s's avatar
rusty1s committed
31
32
    ,
    value = -1 + k_mod + k_mod;
rusty1s's avatar
rusty1s committed
33
  )
rusty1s's avatar
rusty1s committed
34
35
}

rusty1s's avatar
rusty1s committed
36
void spline_(quadratic_basis_backward)(THTensor *grad_pseudo, THTensor *grad_basis, THTensor *pseudo, THLongTensor *kernel_size, THByteTensor *is_open_spline) {
rusty1s's avatar
rusty1s committed
37
38
39
40
41
  SPLINE_BASIS_BACKWARD(2, grad_pseudo, grad_basis, pseudo, kernel_size, is_open_spline,
    if (k_mod == 0) value = 0.5 * value * value - value + 0.5;
    else if (k_mod == 1) value = -value * value + value + 0.5;
    else value = 0.5 * value * value;
    ,
rusty1s's avatar
rusty1s committed
42
    if (k_mod == 0) value = value - 1;
rusty1s's avatar
rusty1s committed
43
44
45
    else if (k_mod == 1) value = -2 * value + 1;
    else value = value;
  )
rusty1s's avatar
rusty1s committed
46
47
}

rusty1s's avatar
rusty1s committed
48
void spline_(cubic_basis_backward)(THTensor *grad_pseudo, THTensor *grad_basis, THTensor *pseudo, THLongTensor *kernel_size, THByteTensor *is_open_spline) {
rusty1s's avatar
rusty1s committed
49
  SPLINE_BASIS_BACKWARD(3, grad_pseudo, grad_basis, pseudo, kernel_size, is_open_spline,
rusty1s's avatar
rusty1s committed
50
51
52
53
    if (k_mod == 0) { value = (1 - value); value = value * value * value / 6.0; }
    else if (k_mod == 1) value = (3 * value * value * value - 6 * value * value + 4) / 6;
    else if (k_mod == 2) value = (-3 * value * value * value + 3 * value * value + 3 * value + 1) / 6;
    else value = value * value * value / 6;
rusty1s's avatar
rusty1s committed
54
    ,
rusty1s's avatar
rusty1s committed
55
56
57
58
    if (k_mod == 0) value = (-value * value + 2 * value - 1) / 2;
    else if (k_mod == 1) value = (3 * value * value - 4 * value) / 2;
    else if (k_mod == 2) value = (-3 * value * value + 2 * value + 1) / 2;
    else value = value * value / 2;
rusty1s's avatar
rusty1s committed
59
  )
rusty1s's avatar
rusty1s committed
60
61
}

rusty1s's avatar
rusty1s committed
62
void spline_(weighting_forward)(THTensor *output, THTensor *input, THTensor *weight, THTensor *basis, THLongTensor *weight_index) {
rusty1s's avatar
rusty1s committed
63
64
  real *weight_data = weight->storage->data + weight->storageOffset; real b;
  SPLINE_WEIGHTING(output, input, basis, weight_index, THTensor_(size)(weight, 1), THTensor_(size)(weight, 2), THLongTensor_size(weight_index, 1),
rusty1s's avatar
rusty1s committed
65
66
67
68
    for (m_out = 0; m_out < M_out; m_out++) {
      value = 0;
      for (s = 0; s < S; s++) {
        b = *(basis_data + s * basis_stride);
rusty1s's avatar
rename  
rusty1s committed
69
        w_idx = *(weight_index_data + s * weight_index_stride);
rusty1s's avatar
rusty1s committed
70
        for (m_in = 0; m_in < M_in; m_in++) {
rusty1s's avatar
rename  
rusty1s committed
71
          value += b * *(weight_data + w_idx * M_in * M_out + m_in * M_out + m_out) * *(input_data + m_in * input_stride);
rusty1s's avatar
rusty1s committed
72
73
74
75
76
        }
      }
      output_data[m_out * output_stride] = value;
    }
  )
rusty1s's avatar
rusty1s committed
77
78
}

79
80
void spline_(weighting_backward_input)(THTensor *grad_input, THTensor *grad_output, THTensor *weight, THTensor *basis, THLongTensor *weight_index) {
  real *weight_data = weight->storage->data + weight->storageOffset; real b;
rusty1s's avatar
rusty1s committed
81
  SPLINE_WEIGHTING(grad_input, grad_output, basis, weight_index, THTensor_(size)(weight, 2), THTensor_(size)(weight, 1), THLongTensor_size(weight_index, 1),
rusty1s's avatar
rusty1s committed
82
    for (m_in = 0; m_in < M_in; m_in++) {
83
      value = 0;
rusty1s's avatar
rusty1s committed
84
85
      for (s = 0; s < S; s++) {
        b = *(basis_data + s * basis_stride);
rusty1s's avatar
rename  
rusty1s committed
86
        w_idx = *(weight_index_data + s * weight_index_stride);
rusty1s's avatar
rusty1s committed
87
        for (m_out = 0; m_out < M_out; m_out++) {
rusty1s's avatar
rusty1s committed
88
          value += b * *(grad_output_data + m_out * grad_output_stride) * *(weight_data + w_idx * M_in * M_out + m_out * M_in + m_in);
89
90
        }
      }
rusty1s's avatar
rusty1s committed
91
      grad_input_data[m_in * grad_input_stride] = value;
92
93
94
95
    }
  )
}

rusty1s's avatar
rusty1s committed
96
97
void spline_(weighting_backward_basis)(THTensor *grad_basis, THTensor *grad_output, THTensor *input, THTensor *weight, THLongTensor *weight_index) {
  real *weight_data = weight->storage->data + weight->storageOffset;
rusty1s's avatar
rusty1s committed
98
  SPLINE_WEIGHTING(grad_basis, grad_output, input, weight_index, THTensor_(size)(weight, 1), THTensor_(size)(weight, 2), THLongTensor_size(weight_index, 1),
99
100
    for (m_out = 0; m_out < M_out; m_out++) {
      for (s = 0; s < S; s++) {
rusty1s's avatar
rusty1s committed
101
        w_idx = *(weight_index_data + s * weight_index_stride); value = 0;
102
        for (m_in = 0; m_in < M_in; m_in++) {
rusty1s's avatar
rusty1s committed
103
          value += *(input_data + m_in * input_stride) * *(weight_data + w_idx * M_in * M_out + m_in * M_out + m_out);
104
        }
rusty1s's avatar
rusty1s committed
105
        grad_basis_data[s * grad_basis_stride] += value * *(grad_output_data + m_out * grad_output_stride);
106
107
108
109
110
      }
    }
  )
}

rusty1s's avatar
rusty1s committed
111
112
void spline_(weighting_backward_weight)(THTensor *grad_weight, THTensor *grad_output, THTensor *input, THTensor *basis, THLongTensor *weight_index) {
  real *grad_weight_data = grad_weight->storage->data + grad_weight->storageOffset; real b;
rusty1s's avatar
rusty1s committed
113
  SPLINE_WEIGHTING(grad_output, input, basis, weight_index, THTensor_(size)(input, 1), THTensor_(size)(grad_output, 1), THLongTensor_size(weight_index, 1),
114
    for (m_out = 0; m_out < M_out; m_out++) {
rusty1s's avatar
rusty1s committed
115
      value = *(grad_output_data + m_out * grad_output_stride);
116
      for (s = 0; s < S; s++) {
rusty1s's avatar
rusty1s committed
117
118
        b = *(basis_data + s * basis_stride);
        w_idx = *(weight_index_data + s * weight_index_stride);
119
        for (m_in = 0; m_in < M_in; m_in++) {
rusty1s's avatar
rusty1s committed
120
          grad_weight_data[w_idx * M_in * M_out + m_in * M_out + m_out] += b * value * *(input_data + m_in * input_stride);
rusty1s's avatar
rusty1s committed
121
122
123
        }
      }
    }
rusty1s's avatar
rusty1s committed
124
  )
rusty1s's avatar
rusty1s committed
125
126
}

rusty1s's avatar
rusty1s committed
127
#endif