static int crf1m_model_create(const char *filename, crfsuite_model_t** ptr_model) { int ret = 0; crf1dm_t *crf1dm = NULL; crf1dt_t *crf1dt = NULL; crfsuite_model_t *model = NULL; model_internal_t *internal = NULL; crfsuite_tagger_t *tagger = NULL; crfsuite_dictionary_t *attrs = NULL, *labels = NULL; *ptr_model = NULL; /* Open the model file. */ crf1dm = crf1dm_new(filename); if (crf1dm == NULL) { ret = CRFSUITEERR_INCOMPATIBLE; goto error_exit; } /* Construct a tagger based on the model. */ crf1dt = crf1dt_new(crf1dm); if (crf1dt == NULL) { ret = CRFSUITEERR_OUTOFMEMORY; goto error_exit; } /* Create an instance of internal data attached to the model. */ internal = (model_internal_t*)calloc(1, sizeof(model_internal_t)); if (internal == NULL) { ret = CRFSUITEERR_OUTOFMEMORY; goto error_exit; } /* Create an instance of dictionary object for attributes. */ attrs = (crfsuite_dictionary_t*)calloc(1, sizeof(crfsuite_dictionary_t)); if (attrs == NULL) { ret = CRFSUITEERR_OUTOFMEMORY; goto error_exit; } attrs->internal = crf1dm; attrs->nref = 1; attrs->addref = model_attrs_addref; attrs->release = model_attrs_release; attrs->get = model_attrs_get; attrs->to_id = model_attrs_to_id; attrs->to_string = model_attrs_to_string; attrs->num = model_attrs_num; attrs->free = model_attrs_free; /* Create an instance of dictionary object for labels. */ labels = (crfsuite_dictionary_t*)calloc(1, sizeof(crfsuite_dictionary_t)); if (labels == NULL) { ret = CRFSUITEERR_OUTOFMEMORY; goto error_exit; } labels->internal = crf1dm; labels->nref = 1; labels->addref = model_labels_addref; labels->release = model_labels_release; labels->get = model_labels_get; labels->to_id = model_labels_to_id; labels->to_string = model_labels_to_string; labels->num = model_labels_num; labels->free = model_labels_free; /* Create an instance of tagger object. */ tagger = (crfsuite_tagger_t*)calloc(1, sizeof(crfsuite_tagger_t)); if (tagger == NULL) { ret = CRFSUITEERR_OUTOFMEMORY; goto error_exit; } tagger->internal = crf1dt; tagger->nref = 1; tagger->addref = tagger_addref; tagger->release = tagger_release; tagger->set = tagger_set; tagger->length = tagger_length; tagger->viterbi = tagger_viterbi; tagger->viterbi_decode = tagger_viterbi_decode; tagger->score = tagger_score; tagger->lognorm = tagger_lognorm; tagger->marginal_point = tagger_marginal_point; tagger->marginal_path = tagger_marginal_path; /* Set the internal data for the model object. */ internal->crf1dm = crf1dm; internal->attrs = attrs; internal->labels = labels; internal->tagger = tagger; /* Create an instance of model object. */ model = (crfsuite_model_t*)calloc(1, sizeof(crfsuite_model_t)); if (model == NULL) { ret = CRFSUITEERR_OUTOFMEMORY; goto error_exit; } model->internal = internal; model->nref = 1; model->addref = model_addref; model->release = model_release; model->get_attrs = model_get_attrs; model->get_labels = model_get_labels; model->get_tagger = model_get_tagger; model->dump = model_dump; *ptr_model = model; return 0; error_exit: free(tagger); free(labels); free(attrs); if (crf1dt != NULL) { crf1dt_delete(crf1dt); } if (crf1dm != NULL) { crf1dm_close(crf1dm); } free(internal); free(model); return ret; }
int crf1m_create_instance_from_file(const char *filename, void **ptr) { return crf1m_model_create(crf1dm_new(filename), (crfsuite_model_t**)ptr); }