static void crf1dt_state_score(crf1dt_t *crf1dt, const crfsuite_instance_t *inst) { int a, i, l, t, r, fid; crf1dm_feature_t f; feature_refs_t attr; floatval_t value, *state = NULL; crf1dm_t* model = crf1dt->model; crf1d_context_t* ctx = crf1dt->ctx; const crfsuite_item_t* item = NULL; const int T = inst->num_items; const int L = crf1dt->num_labels; /* Loop over the items in the sequence. */ for (t = 0;t < T;++t) { item = &inst->items[t]; state = STATE_SCORE(ctx, t); /* Loop over the contents (attributes) attached to the item. */ for (i = 0;i < item->num_contents;++i) { /* Access the list of state features associated with the attribute. */ a = item->contents[i].aid; crf1dm_get_attrref(model, a, &attr); /* A scale usually represents the atrribute frequency in the item. */ value = item->contents[i].value; /* Loop over the state features associated with the attribute. */ for (r = 0;r < attr.num_features;++r) { /* The state feature #(attr->fids[r]), which is represented by the attribute #a, outputs the label #(f->dst). */ fid = crf1dm_get_featureid(&attr, r); crf1dm_get_feature(model, fid, &f); l = f.dst; state[l] += f.weight * value; } } } }
void crf1dm_dump(crf1dm_t* crf1dm, FILE *fp) { int j; uint32_t i; feature_refs_t refs; const header_t* hfile = crf1dm->header; /* Dump the file header. */ fprintf(fp, "FILEHEADER = {\n"); fprintf(fp, " magic: %c%c%c%c\n", hfile->magic[0], hfile->magic[1], hfile->magic[2], hfile->magic[3]); fprintf(fp, " size: %d\n", hfile->size); fprintf(fp, " type: %c%c%c%c\n", hfile->type[0], hfile->type[1], hfile->type[2], hfile->type[3]); fprintf(fp, " version: %d\n", hfile->version); fprintf(fp, " num_features: %d\n", hfile->num_features); fprintf(fp, " num_labels: %d\n", hfile->num_labels); fprintf(fp, " num_attrs: %d\n", hfile->num_attrs); fprintf(fp, " off_features: 0x%X\n", hfile->off_features); fprintf(fp, " off_labels: 0x%X\n", hfile->off_labels); fprintf(fp, " off_attrs: 0x%X\n", hfile->off_attrs); fprintf(fp, " off_labelrefs: 0x%X\n", hfile->off_labelrefs); fprintf(fp, " off_attrrefs: 0x%X\n", hfile->off_attrrefs); fprintf(fp, "}\n"); fprintf(fp, "\n"); /* Dump the labels. */ fprintf(fp, "LABELS = {\n"); for (i = 0;i < hfile->num_labels;++i) { const char *str = crf1dm_to_label(crf1dm, i); #if 0 int check = crf1dm_to_lid(crf1dm, str); if (i != check) { fprintf(fp, "WARNING: inconsistent label CQDB\n"); } #endif fprintf(fp, " %5d: %s\n", i, str); } fprintf(fp, "}\n"); fprintf(fp, "\n"); /* Dump the attributes. */ fprintf(fp, "ATTRIBUTES = {\n"); for (i = 0;i < hfile->num_attrs;++i) { const char *str = crf1dm_to_attr(crf1dm, i); #if 0 int check = crf1dm_to_aid(crf1dm, str); if (i != check) { fprintf(fp, "WARNING: inconsistent attribute CQDB\n"); } #endif fprintf(fp, " %5d: %s\n", i, str); } fprintf(fp, "}\n"); fprintf(fp, "\n"); /* Dump the transition features. */ fprintf(fp, "TRANSITIONS = {\n"); for (i = 0;i < hfile->num_labels;++i) { crf1dm_get_labelref(crf1dm, i, &refs); for (j = 0;j < refs.num_features;++j) { crf1dm_feature_t f; int fid = crf1dm_get_featureid(&refs, j); const char *from = NULL, *to = NULL; crf1dm_get_feature(crf1dm, fid, &f); from = crf1dm_to_label(crf1dm, f.src); to = crf1dm_to_label(crf1dm, f.dst); fprintf(fp, " (%d) %s --> %s: %f\n", f.type, from, to, f.weight); } } fprintf(fp, "}\n"); fprintf(fp, "\n"); /* Dump the transition features. */ fprintf(fp, "STATE_FEATURES = {\n"); for (i = 0;i < hfile->num_attrs;++i) { crf1dm_get_attrref(crf1dm, i, &refs); for (j = 0;j < refs.num_features;++j) { crf1dm_feature_t f; int fid = crf1dm_get_featureid(&refs, j); const char *attr = NULL, *to = NULL; crf1dm_get_feature(crf1dm, fid, &f); #if 0 if (f.src != i) { fprintf(fp, "WARNING: an inconsistent attribute reference.\n"); } #endif attr = crf1dm_to_attr(crf1dm, f.src); to = crf1dm_to_label(crf1dm, f.dst); fprintf(fp, " (%d) %s --> %s: %f\n", f.type, attr, to, f.weight); } } fprintf(fp, "}\n"); fprintf(fp, "\n"); }