AI-FANN

 view release on metacpan or  search on metacpan

FANN.xs  view on Meta::CPAN


struct fann_train_data *
fann_train_data_new_empty(klass, num_data, num_input, num_output)
    SV *klass;
    unsigned int num_data;
    unsigned int num_input;
    unsigned int num_output;
  CODE:
    RETVAL = fann_train_data_create(num_data, num_input, num_output);
  OUTPUT:
    RETVAL
  CLEANUP:
    _check_error(aTHX_ (struct fann_error *)RETVAL);

void
fann_train_data_data(self, index, ...)
    struct fann_train_data *self;
    unsigned int index;
  PREINIT:
    AV *input;
    AV *output;
    unsigned int i;
  PPCODE:
    if (index >= self->num_data)
        Perl_croak(aTHX_"index %d is out of range", index);
    switch (items) {
    case 4:
        input = _srv2av(aTHX_ ST(2), self->num_input, "input");
        for (i = 0; i < self->num_input; i++) {
            SV **svp = av_fetch(input, i, 0);
            self->input[index][i] = SvNV(svp ? *svp : &PL_sv_undef);
        }
        output = _srv2av(aTHX_ ST(3), self->num_output, "output");
        for (i = 0; i < self->num_output; i++) {
            SV **svp = av_fetch(output, i, 0);
            self->output[index][i] = SvNV(svp ? *svp : &PL_sv_undef);
        }
    case 2:
        if (GIMME_V == G_ARRAY) {
            input = newAV();
            output = newAV();
            av_extend(input, self->num_input - 1);
            av_extend(output, self->num_output - 1);
            for (i = 0; i < self->num_input; i++) {
                SV *sv = newSVnv(self->input[index][i]);
                av_store(input, i, sv);
            }
            for (i = 0; i < self->num_output; i++) {
                SV *sv = newSVnv(self->output[index][i]);
                av_store(output, i, sv);
            }
            ST(0) = sv_2mortal(newRV_inc((SV*)input));
            ST(1) = sv_2mortal(newRV_inc((SV*)output));
            XSRETURN(2);
        }
        else {
            ST(0) = &PL_sv_yes;
            XSRETURN(1);
        }
        break;
    default:
        Perl_croak(aTHX_ "Usage: AI::FANN::TrainData::data(self, index [, input, output])");
    }

struct fann_train_data *
fann_train_data_new(klass, input, output, ...)
    SV *klass;
    AV *input;
    AV *output;
  PREINIT:
    unsigned int num_data;
    unsigned int num_input;
    unsigned int num_output;
    unsigned int i;
  CODE:
    if (!(items & 1)) {
		Perl_croak(aTHX_ "wrong number of arguments in constructor");
    }
    num_data = items >> 1;
    num_input = av_len(input) + 1;
    if (!num_input)
        Perl_croak(aTHX_ "input array is empty");
    num_output = av_len(output) + 1;
    if (!num_output)
        Perl_croak(aTHX_ "output array is empty");
    RETVAL = fann_train_data_create(num_data, num_input, num_output);
  OUTPUT:
    RETVAL
  CLEANUP:
    _check_error(aTHX_ (struct fann_error *)RETVAL);
    /* we do that at cleanup to ensure that the just created object is
     * freed if we croak */
    if (RETVAL) {
        for (i = 0; i < num_data; i++) {
            unsigned int j;
            input = _srv2av(aTHX_ ST(1 + i * 2), num_input, "input");
            for (j = 0; j < num_input; j++) {
                SV **svp = av_fetch(input, j, 0);
                RETVAL->input[i][j] = SvNV(svp ? *svp : &PL_sv_undef);
            }
            output = _srv2av(aTHX_ ST(2 + i * 2), num_output, "output");
            for (j = 0; j < num_output; j++) {
                SV **svp = av_fetch(output, j, 0);
                RETVAL->output[i][j] = SvNV(svp ? *svp : &PL_sv_undef);
            }
        }
    }

void
fann_train_data_DESTROY(self)
    struct fann_train_data * self;
  CODE:
    fann_destroy_train(self);
    sv_unmagic(SvRV(ST(0)), '~');

void
fann_train_data_shuffle(self)
    struct fann_train_data *self;
  CLEANUP:
    _check_error(aTHX_ (struct fann_error *)self);



( run in 0.557 second using v1.01-cache-2.11-cpan-437f7b0c052 )