176 lines
4.6 KiB
C
176 lines
4.6 KiB
C
#include "S.h"
|
|
#include "loess.h"
|
|
|
|
void
|
|
predict(eval, m, lo, pre, se)
|
|
double *eval;
|
|
int m, se;
|
|
struct loess_struct *lo;
|
|
struct pred_struct *pre;
|
|
{
|
|
int size_info[3];
|
|
void pred_();
|
|
|
|
pre->fit = (double *) malloc(m * sizeof(double));
|
|
pre->se_fit = (double *) malloc(m * sizeof(double));
|
|
pre->residual_scale = lo->out.s;
|
|
pre->df = (lo->out.one_delta * lo->out.one_delta) / lo->out.two_delta;
|
|
|
|
size_info[0] = lo->in.p;
|
|
size_info[1] = lo->in.n;
|
|
size_info[2] = m;
|
|
|
|
pred_(lo->in.y, lo->in.x, eval, size_info, &lo->out.s,
|
|
lo->in.weights,
|
|
lo->out.robust,
|
|
&lo->model.span,
|
|
&lo->model.degree,
|
|
&lo->model.normalize,
|
|
lo->model.parametric,
|
|
lo->model.drop_square,
|
|
&lo->control.surface,
|
|
&lo->control.cell,
|
|
&lo->model.family,
|
|
lo->kd_tree.parameter,
|
|
lo->kd_tree.a,
|
|
lo->kd_tree.xi,
|
|
lo->kd_tree.vert,
|
|
lo->kd_tree.vval,
|
|
lo->out.divisor,
|
|
&se,
|
|
pre->fit,
|
|
pre->se_fit);
|
|
}
|
|
|
|
void
|
|
pred_(y, x_, new_x, size_info, s, weights, robust, span, degree,
|
|
normalize, parametric, drop_square, surface, cell, family,
|
|
parameter, a, xi, vert, vval, divisor, se, fit, se_fit)
|
|
double *y, *x_, *new_x, *weights, *robust, *span, *cell, *fit, *s,
|
|
*xi, *vert, *vval, *divisor, *se_fit;
|
|
int *size_info, *degree, *normalize, *parametric, *drop_square,
|
|
*parameter, *a, *se;
|
|
char **surface, **family;
|
|
{
|
|
double *x, *x_tmp, *x_evaluate, *L, new_cell, z, tmp, *fit_tmp,
|
|
*temp, sum, mean;
|
|
int N, D, M, sum_drop_sqr = 0, sum_parametric = 0,
|
|
nonparametric = 0, *order_parametric, *order_drop_sqr;
|
|
int i, j, k, p, cut, comp();
|
|
|
|
D = size_info[0];
|
|
N = size_info[1];
|
|
M = size_info[2];
|
|
|
|
x = (double *) malloc(N * D * sizeof(double));
|
|
x_tmp = (double *) malloc(N * D * sizeof(double));
|
|
x_evaluate = (double *) malloc(M * D * sizeof(double));
|
|
L = (double *) malloc(N * M * sizeof(double));
|
|
order_parametric = (int *) malloc(D * sizeof(int));
|
|
order_drop_sqr = (int *) malloc(D * sizeof(int));
|
|
temp = (double *) malloc(N * D * sizeof(double));
|
|
|
|
for(i = 0; i < (N * D); i++)
|
|
x_tmp[i] = x_[i];
|
|
for(i = 0; i < D; i++) {
|
|
k = i * M;
|
|
for(j = 0; j < M; j++) {
|
|
p = k + j;
|
|
new_x[p] = new_x[p] / divisor[i];
|
|
}
|
|
}
|
|
if(!strcmp(*surface, "direct") || se) {
|
|
for(i = 0; i < D; i++) {
|
|
k = i * N;
|
|
for(j = 0; j < N; j++) {
|
|
p = k + j;
|
|
x_tmp[p] = x_[p] / divisor[i];
|
|
}
|
|
}
|
|
}
|
|
j = D - 1;
|
|
for(i = 0; i < D; i++) {
|
|
sum_drop_sqr = sum_drop_sqr + drop_square[i];
|
|
sum_parametric = sum_parametric + parametric[i];
|
|
if(parametric[i])
|
|
order_parametric[j--] = i;
|
|
else
|
|
order_parametric[nonparametric++] = i;
|
|
}
|
|
for(i = 0; i < D; i++) {
|
|
order_drop_sqr[i] = 2 - drop_square[order_parametric[i]];
|
|
k = i * M;
|
|
p = order_parametric[i] * M;
|
|
for(j = 0; j < M; j++)
|
|
x_evaluate[k + j] = new_x[p + j];
|
|
k = i * N;
|
|
p = order_parametric[i] * N;
|
|
for(j = 0; j < N; j++)
|
|
x[k + j] = x_tmp[p + j];
|
|
}
|
|
for(i = 0; i < N; i++)
|
|
robust[i] = weights[i] * robust[i];
|
|
|
|
if(!strcmp(*surface, "direct")) {
|
|
if(*se) {
|
|
loess_dfitse(y, x, x_evaluate, weights, robust,
|
|
!strcmp(*family, "gaussian"), span, degree,
|
|
&nonparametric, order_drop_sqr, &sum_drop_sqr,
|
|
&D, &N, &M, fit, L);
|
|
}
|
|
else {
|
|
loess_dfit(y, x, x_evaluate, robust, span, degree,
|
|
&nonparametric, order_drop_sqr, &sum_drop_sqr,
|
|
&D, &N, &M, fit);
|
|
}
|
|
}
|
|
else {
|
|
loess_ifit(parameter, a, xi, vert, vval, &M, x_evaluate, fit);
|
|
if(*se) {
|
|
new_cell = (*span) * (*cell);
|
|
fit_tmp = (double *) malloc(M * sizeof(double));
|
|
loess_ise(y, x, x_evaluate, weights, span, degree,
|
|
&nonparametric, order_drop_sqr, &sum_drop_sqr,
|
|
&new_cell, &D, &N, &M, fit_tmp, L);
|
|
free(fit_tmp);
|
|
}
|
|
}
|
|
if(*se) {
|
|
for(i = 0; i < N; i++) {
|
|
k = i * M;
|
|
for(j = 0; j < M; j++) {
|
|
p = k + j;
|
|
L[p] = L[p] / weights[i];
|
|
L[p] = L[p] * L[p];
|
|
}
|
|
}
|
|
for(i = 0; i < M; i++) {
|
|
tmp = 0;
|
|
for(j = 0; j < N; j++)
|
|
tmp = tmp + L[i + j * M];
|
|
se_fit[i] = (*s) * sqrt(tmp);
|
|
}
|
|
}
|
|
free(x);
|
|
free(x_tmp);
|
|
free(x_evaluate);
|
|
free(L);
|
|
free(order_parametric);
|
|
free(order_drop_sqr);
|
|
free(temp);
|
|
}
|
|
|
|
void
|
|
pred_free_mem(pre)
|
|
struct pred_struct *pre;
|
|
{
|
|
free(pre->fit);
|
|
free(pre->se_fit);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|