matthias muntwiler bbd16d0f94 add files for public distribution
based on internal repository 0a462b6 2017-11-22 14:41:39 +0100
2017-11-22 14:55:20 +01:00

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);
}