AI-MaxEntropy
view release on metacpan or search on metacpan
AI-MaxEntropy.xs view on Meta::CPAN
if (lambda_i != -1) p_f[lambda_i] = SvNV(
*av_fetch((AV*)SvRV(*av_fetch(f_freq, j, 0)), i, 0)) +
1e-5;
}
/* iterate */
k = 0;
do {
TRACE("iteration");
/* get p1(f) for current lambda */
for (i = 0; i < f_num; i++) p1_f[i] = 0;
for (i = 0; i < samples->s_num; i++) {
for (sum_exp_lambda_f = 0, y = 0; y < y_num; y++) {
for (exp_lambda_f[y] = 0, j = 0; j < af_num; j++) {
lambda_i = lambda_idx[y][samples->x[i][j]];
if (lambda_i != -1)
exp_lambda_f[y] += lambda[lambda_i];
}
exp_lambda_f[y] = exp(exp_lambda_f[y]);
sum_exp_lambda_f += exp_lambda_f[y];
}
for (y = 0; y < y_num; y++) {
pxy = exp_lambda_f[y] / sum_exp_lambda_f;
for (j = 0; j < af_num; j++) {
lambda_i = lambda_idx[y][samples->x[i][j]];
if (lambda_i != -1)
p1_f[lambda_i] += pxy * samples->w[i];
}
}
}
/* lambda = lambda + d_lambda */
d_lambda_norm = 0;
lambda_norm = 0;
for (i = 0; i < f_num; i++) {
d_lambda[i] = (1.0 / af_num) * log(p_f[i] / p1_f[i]);
lambda[i] += d_lambda[i];
d_lambda_norm += d_lambda[i] * d_lambda[i];
lambda_norm += lambda[i] * lambda[i];
}
d_lambda_norm = sqrt(d_lambda_norm);
lambda_norm = sqrt(lambda_norm);
/* call progress_cb if defined */
if (SvOK(progress_cb) && SvROK(progress_cb) &&
SvTYPE(SvRV(progress_cb)) == SVt_PVCV) {
TRACE("call progress_cb");
av_lambda = newAV();
av_d_lambda = newAV();
av_extend(av_lambda, f_num - 1);
av_extend(av_d_lambda, f_num - 1);
for (i = 0; i < f_num; i++) {
av_store(av_lambda, i, newSVnv(lambda[i]));
av_store(av_d_lambda, i, newSVnv(d_lambda[i]));
}
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSHs(sv_2mortal(newSViv(k)));
XPUSHs(sv_2mortal(newRV_noinc((SV*)av_lambda)));
XPUSHs(sv_2mortal(newRV_noinc((SV*)av_d_lambda)));
XPUSHs(sv_2mortal(newSVnv(lambda_norm)));
XPUSHs(sv_2mortal(newSVnv(d_lambda_norm)));
PUTBACK;
call_sv(progress_cb, G_ARRAY);
SPAGAIN;
sv_r = POPs;
r = SvIV(sv_r);
PUTBACK;
FREETMPS;
LEAVE;
while (SvREFCNT(sv_r) > 0) { SvREFCNT_dec(sv_r); }
if (r != 0) break;
}
k++;
} while (d_lambda_norm > lambda_norm * epsilon);
/* finish */
av_lambda = newAV();
av_extend(av_lambda, f_num - 1);
for (i = 0; i < f_num; i++)
av_store(av_lambda, i, newSVnv(lambda[i]));
RETVAL = newRV_noinc((SV*)av_lambda);
TRACE("leave");
OUTPUT:
RETVAL
CLEANUP:
free(p_f);
free(p1_f);
free(lambda);
free(d_lambda);
free(exp_lambda_f);
void
_cache_samples(self)
SV* self
PREINIT:
SV* _c = *hvref_fetch(self, "_c");
AV* samples = (AV*)SvRV(*hvref_fetch(self, "samples"));
AV *sample, *x;
struct samples_t* ss =
(struct samples_t*)malloc(sizeof(struct samples_t));;
int i, j;
CODE:
ss->s_num = av_len(samples) + 1;
ss->x_len = (int*)malloc(sizeof(int) * ss->s_num);
ss->x = (int**)malloc(sizeof(int*) * ss->s_num);
ss->y = (int*)malloc(sizeof(int) * ss->s_num);
ss->w = (double*)malloc(sizeof(double) * ss->s_num);
for (i = 0; i < ss->s_num; i++) {
sample = (AV*)SvRV(*av_fetch(samples, i, 0));
x = (AV*)SvRV(*av_fetch(sample, 0, 0));
ss->x_len[i] = av_len(x) + 1;
ss->x[i] = (int*)malloc(sizeof(int) * ss->x_len[i]);
for (j = 0; j < ss->x_len[i]; j++)
ss->x[i][j] = SvIV(*av_fetch(x, j, 0));
ss->y[i] = SvIV(*av_fetch(sample, 1, 0));
ss->w[i] = SvNV(*av_fetch(sample, 2, 0));
}
hvref_store(_c, "samples", newSViv(PTR2IV(ss)));
void
_free_cache_samples(self)
SV* self
PREINIT:
SV* _c = *hvref_fetch(self, "_c");
struct samples_t* ss =
INT2PTR(struct samples_t*, SvIV(*hvref_fetch(_c, "samples")));
int i;
CODE:
free(ss->x_len);
for (i = 0; i < ss->s_num; i++) free(ss->x[i]);
free(ss->x);
free(ss->y);
free(ss->w);
free(ss);
hvref_delete(_c, "samples");
void
_cache_f_map(self)
SV* self
PREINIT:
SV* _c = *hvref_fetch(self, "_c");
AV* f_map = (AV*)SvRV(*hvref_fetch(self, "f_map"));
AV* f_map_y;
( run in 1.777 second using v1.01-cache-2.11-cpan-13bb782fe5a )