diff --git a/frontend/learn.c b/frontend/learn.c index 94b4d6a6..6d6cd4f5 100644 --- a/frontend/learn.c +++ b/frontend/learn.c @@ -95,7 +95,10 @@ static void learn_option_finish(learn_option_t* opt) { int i; + free(opt->logbase); free(opt->model); + free(opt->algorithm); + free(opt->type); for (i = 0;i < opt->num_params;++i) { free(opt->params[i]); diff --git a/frontend/reader.c b/frontend/reader.c index a8f58f5c..b9f0ecf7 100644 --- a/frontend/reader.c +++ b/frontend/reader.c @@ -116,6 +116,7 @@ int read_data(FILE *fpi, FILE *fpo, crfsuite_data_t* data, int group) /* Unrecognized declaration. */ fprintf(fpo, "\n"); fprintf(fpo, "ERROR: unrecognized declaration: %s\n", token->attr); + iwa_delete(iwa); return -1; } } else { @@ -148,5 +149,7 @@ int read_data(FILE *fpi, FILE *fpo, crfsuite_data_t* data, int group) progress(fpo, prev, 100); fprintf(fpo, "\n"); + iwa_delete(iwa); + return n; } diff --git a/lib/cqdb/src/cqdb.c b/lib/cqdb/src/cqdb.c index f164a38f..9500e93f 100644 --- a/lib/cqdb/src/cqdb.c +++ b/lib/cqdb/src/cqdb.c @@ -268,6 +268,7 @@ int cqdb_writer_close(cqdb_writer_t* dbw) /* Initialize the file header. */ strncpy((char*)header.chunkid, CHUNKID, 4); + header.flag = 0; header.byteorder = BYTEORDER_CHECK; header.bwd_offset = 0; header.bwd_size = dbw->bwd_num; diff --git a/lib/crf/src/crf1d_encode.c b/lib/crf/src/crf1d_encode.c index 4dd32e08..598c8b43 100644 --- a/lib/crf/src/crf1d_encode.c +++ b/lib/crf/src/crf1d_encode.c @@ -98,6 +98,8 @@ static void crf1de_init(crf1de_t *crf1de) static void crf1de_finish(crf1de_t *crf1de) { + int i; + if (crf1de->ctx != NULL) { crf1dc_delete(crf1de->ctx); crf1de->ctx = NULL; @@ -107,10 +109,16 @@ static void crf1de_finish(crf1de_t *crf1de) crf1de->features = NULL; } if (crf1de->attributes != NULL) { + for (i = 0; i < crf1de->num_attributes; ++i) { + free(crf1de->attributes[i].fids); + } free(crf1de->attributes); crf1de->attributes = NULL; } if (crf1de->forward_trans != NULL) { + for (i = 0; i < crf1de->num_labels; ++i) { + free(crf1de->forward_trans[i].fids); + } free(crf1de->forward_trans); crf1de->forward_trans = NULL; } @@ -917,6 +925,14 @@ static int encoder_objective_and_gradients(encoder_t *self, floatval_t *f, float return 0; } +static void encoder_release(encoder_t *self) +{ + crf1de_t *crf1de = (crf1de_t*)self->internal; + crf1de_finish(crf1de); + free(crf1de); + free(self); +} + encoder_t *crf1d_create_encoder() { encoder_t *self = (encoder_t*)calloc(1, sizeof(encoder_t)); @@ -936,6 +952,7 @@ encoder_t *crf1d_create_encoder() self->viterbi = encoder_viterbi; self->partition_factor = encoder_partition_factor; self->objective_and_gradients = encoder_objective_and_gradients; + self->release = encoder_release; self->internal = enc; } } diff --git a/lib/crf/src/crfsuite_internal.h b/lib/crf/src/crfsuite_internal.h index 096998df..f338f037 100644 --- a/lib/crf/src/crfsuite_internal.h +++ b/lib/crf/src/crfsuite_internal.h @@ -158,6 +158,7 @@ struct tag_encoder int (*save_model)(encoder_t *self, const char *filename, const floatval_t *w, logging_t *lg); + void (*release)(encoder_t *self); }; /** diff --git a/lib/crf/src/crfsuite_train.c b/lib/crf/src/crfsuite_train.c index d5886d28..f906a4ce 100644 --- a/lib/crf/src/crfsuite_train.c +++ b/lib/crf/src/crfsuite_train.c @@ -84,12 +84,16 @@ static void crfsuite_train_delete(crfsuite_trainer_t* self) { crfsuite_train_internal_t *tr = (crfsuite_train_internal_t*)self->internal; if (tr != NULL) { + if (tr->gm != NULL) { + tr->gm->release(tr->gm); + } if (tr->params != NULL) { tr->params->release(tr->params); } free(tr->lg); free(tr); } + free(self); } static int crfsuite_train_addref(crfsuite_trainer_t* tr) @@ -207,6 +211,10 @@ static int crfsuite_train_train( gm->save_model(gm, filename, w, lg); } + if (0 <= holdout) { + dataset_finish(&testset); + } + dataset_finish(&trainset); free(w); return 0; diff --git a/lib/crf/src/params.c b/lib/crf/src/params.c index a43c35e6..27bbf1a5 100644 --- a/lib/crf/src/params.c +++ b/lib/crf/src/params.c @@ -84,7 +84,9 @@ static int params_release(crfsuite_params_t* params) free(pars->params[i].val_s); free(pars->params[i].help); } + free(pars->params); free(pars); + free(params); } return count; } diff --git a/lib/crf/src/rumavl.c b/lib/crf/src/rumavl.c index a587ac20..dd6ec58f 100644 --- a/lib/crf/src/rumavl.c +++ b/lib/crf/src/rumavl.c @@ -831,6 +831,7 @@ static RUMAVL_NODE *node_new(RUMAVL *tree, const void *record) *--------------------------------------------------------------------------*/ static void node_destroy (RUMAVL *tree, RUMAVL_NODE *node) { + mem_free(tree, node->rec); mem_free(tree, node); }