/** * Counts features in a preliminary feature vector * @param fv Valid feature vector */ static void count_feat(fvec_t *fv) { feat_t *p_dim = fv->dim; float n = 0, *p_val = fv->val; unsigned int i; /* Loop over features */ for (i = 0; i < fv->len; i++) { /* Skip zero values */ if (fabs(fv->val[i]) < 1e-12) continue; /* Check for duplicate dims */ if (i < fv->len - 1 && fv->dim[i] == fv->dim[i + 1]) { n += fv->val[i]; } else { *(p_dim++) = fv->dim[i]; *(p_val++) = fv->val[i] + n; n = 0; } } /* Update length */ fv->len = p_dim - fv->dim; /* Reallocate memory */ fvec_realloc(fv); }
/** * Condense a feature vector by counting duplicate features. * @param fv Feature vector */ static void fvec_condense(fvec_t *fv, embed_t e) { feat_t *p_dim = fv->dim; float n = 0, *p_val = fv->val; unsigned int i; /* Loop over features */ for (i = 0; i < fv->len; i++) { /* Skip zero values */ if (fabs(fv->val[i]) < 1e-12) continue; /* Check for duplicate dims */ if (i < fv->len - 1 && fv->dim[i] == fv->dim[i + 1]) { switch (e) { case EMBED_CNT: n += fv->val[i]; break; case EMBED_BIN: n = (float) fmax(n, fv->val[i]); break; } } else { *(p_dim++) = fv->dim[i]; *(p_val++) = fv->val[i] + n; n = 0; } } /* Update length */ fv->len = p_dim - fv->dim; fv->mem += fv->len * (sizeof(feat_t) + sizeof(float)); /* Reallocate memory */ fvec_realloc(fv); }