Commit 16cbb7ab authored by rusty1s's avatar rusty1s
Browse files

added all splines

parent c5f0df95
...@@ -2,34 +2,52 @@ ...@@ -2,34 +2,52 @@
#define TH_GENERIC_FILE "generic/cpu.c" #define TH_GENERIC_FILE "generic/cpu.c"
#else #else
void spline_(basis_linear)(THTensor *basis, THLongTensor *weight_index, THTensor *pseudo, THLongTensor *kernel_size, THByteTensor *is_open_spline, int K) { #define SPLINE_BASIS(M, basis, weight_index, pseudo, kernel_size, is_open_spline, K, CODE) { \
int64_t *kernel_size_data = kernel_size->storage->data + kernel_size->storageOffset; int64_t *kernel_size_data = kernel_size->storage->data + kernel_size->storageOffset; \
uint8_t *is_open_spline_data = is_open_spline->storage->data + is_open_spline->storageOffset; uint8_t *is_open_spline_data = is_open_spline->storage->data + is_open_spline->storageOffset; \
int64_t D = THTensor_(size)(pseudo, 1); int64_t D = THTensor_(size)(pseudo, 1); \
int64_t S = THLongTensor_size(weight_index, 1); int64_t S = THLongTensor_size(weight_index, 1); \
int64_t s, d; int64_t s, d, k, k_mod, i, offset; real value, b; \
\
TH_TENSOR_DIM_APPLY3(real, basis, int64_t, weight_index, real, pseudo, 1, TH_TENSOR_DIM_APPLY3_SIZE_EQ_EXCEPT_DIM, \
for (s = 0; s < S; s++) { \
b = 1; i = 0; k = s; offset = K; \
for (d = 0; d < D; d++) { \
offset /= kernel_size_data[d]; \
k_mod = k % (M + 1); \
k /= (M + 1); \
value = *(pseudo_data + d * pseudo_stride) * (kernel_size_data[d] - M * is_open_spline_data[d]); \
i += ((((int64_t) value) + k_mod) % kernel_size_data[d]) * offset; \
value -= floor(value); \
CODE \
b *= value; \
} \
basis_data[s * basis_stride] = b; \
weight_index_data[s * weight_index_stride] = i; \
}) \
}
TH_TENSOR_DIM_APPLY3(real, basis, int64_t, weight_index, real, pseudo, 1, TH_TENSOR_DIM_APPLY3_SIZE_EQ_EXCEPT_DIM, void spline_(basis_linear)(THTensor *basis, THLongTensor *weight_index, THTensor *pseudo, THLongTensor *kernel_size, THByteTensor *is_open_spline, int K) {
for (s = 0; s < S; s++) { SPLINE_BASIS(1, basis, weight_index, pseudo, kernel_size, is_open_spline, K,
real b = 1; int64_t i = 0; value = (1 - k_mod) * value + k_mod * (1 - value);
int64_t k = s; )
int64_t bla = K; }
for (d = 0; d < D; d++) {
bla /= kernel_size_data[d];
int64_t mod = k % 2;
k >>= 1;
real value = *(pseudo_data + d * pseudo_stride) * (kernel_size_data[d] - is_open_spline_data[d]); void spline_(basis_quadratic)(THTensor *basis, THLongTensor *weight_index, THTensor *pseudo, THLongTensor *kernel_size, THByteTensor *is_open_spline, int K) {
int64_t bot = ((int64_t) value) % kernel_size_data[d]; SPLINE_BASIS(2, basis, weight_index, pseudo, kernel_size, is_open_spline, K,
int64_t top = ((int64_t) (value + 1)) % kernel_size_data[d]; if (k_mod == 0) value = 0.5 * (1 - value) * (1 - value);
value -= floor(value); else if (k_mod == 1) value = -value * value + value + 0.5;
else value = 0.5 * value * value;
)
}
b *= (1 - mod) * value + mod * (1 - value); void spline_(basis_cubic)(THTensor *basis, THLongTensor *weight_index, THTensor *pseudo, THLongTensor *kernel_size, THByteTensor *is_open_spline, int K) {
i += ((1 - mod) * top + mod * bot) * bla; SPLINE_BASIS(3, basis, weight_index, pseudo, kernel_size, is_open_spline, K,
} if (k_mod == 0) value = (1 - value) * (1 - value) * (1 - value) / 6.0;
basis_data[s * basis_stride] = b; else if (k_mod == 1) value = (3 * value * value * value - 6 * value * value + 4) / 6.0;
weight_index_data[s * weight_index_stride] = i; else if (k_mod == 2) value = (-3 * value * value * value + 3 * value * value + 3 * value + 1) / 6.0;
}) else value = value * value * value / 6.0;
)
} }
#endif #endif
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment