"src/vscode:/vscode.git/clone" did not exist on "62077ef33b1d5f25190983e23fff89aee203a12c"
Commit ba1f449f authored by rusty1s's avatar rusty1s
Browse files

linear and one-dimensional pseudos

parent f7377ac4
......@@ -3,7 +3,7 @@
"degree": 1,
"pseudo": [0, 0.25, 0.5, 0.75, 1],
"kernel_size": [5],
"is_open_spline": [0],
"is_open_spline": [1],
"expected_basis": [[0, 1], [0, 1], [0, 1], [0, 1], [0, 1]],
"expected_index": [[1, 0], [2, 1], [3, 2], [4, 3], [0, 4]]
}
......
......@@ -3,7 +3,7 @@ from torch.autograd import Function
from .._ext import ffi
degrees = {1: 'linear', 2: 'quadric', 3: 'cubic'}
implemented_degrees = {1: 'linear', 2: 'quadric', 3: 'cubic'}
def get_func(name, tensor):
......@@ -19,7 +19,7 @@ def spline_basis(degree, pseudo, kernel_size, is_open_spline, K):
basis = pseudo.new(pseudo.size(0), s)
weight_index = kernel_size.new(pseudo.size(0), s)
degree = degrees.get(degree)
degree = implemented_degrees.get(degree)
if degree is None:
raise NotImplementedError('Basis computation not implemented for '
'specified B-spline degree')
......
......@@ -3,30 +3,41 @@
#else
void spline_(basis_linear)(THTensor *basis, THLongTensor *weight_index, THTensor *pseudo, THTensor *kernel_size, THByteTensor *is_open_spline, int K) {
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;
int64_t k, s, S, d, D;
real value;
D = THTensor_(size)(pseudo, 1);
S = THLongTensor_size(weight_index, 1);
/* TH_TENSOR_DIM_APPLY3(real, basis, int64_t, weight_index, real, pseudo, 1, TH_TENSOR_DIM_APPLY3_SIZE_EX_EXCEPT_DIM, */
/* for (s = 0; s < S; s++) { */
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++) {
/* /1* k = K; *1/ */
/* /1* b = 1; i = 0; *1/ */
real b = 1; int64_t i = 0;
/* for (d = 0; d < D; d++) { */
for (d = 0; d < D; d++) {
/* /1* k /= kernel_size[d]; *1/ */
/* /1* value = *(pseudo_data + d * pseudo_stride) * (kernel_size[d] - is_open_spline[d]); *1/ */
value = *(pseudo_data + d * pseudo_stride) * (kernel_size_data[d] - is_open_spline_data[d]);
int64_t bot = ((int64_t) value) % kernel_size_data[d];
int64_t top = ((int64_t) (value + 1)) % kernel_size_data[d];
value -= floor(value);
int mod = s % 2;
b *= (1 - mod) * value + mod * (1 - value);
i += (1 - mod) * top + mod * bot;
/* /1* int bot = int64_t(value); *1/ */
/* /1* int top = (bot + 1) % kernel_size[d]; *1/ */
/* /1* bot %= kernel_size[d]; *1/ */
/* } */
/* basis_data[s * basis_stride] = 1; */
/* weight_index_data[s * weight_index_stride] = 2; */
/* }) */
}
basis_data[s * basis_stride] = b;
weight_index_data[s * weight_index_stride] = i;
})
}
......
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