inline double_array *averaged_perceptron_predict_scores(averaged_perceptron_t *self, cstring_array *features) { if (self->scores == NULL || self->scores->n == 0) self->scores = double_array_new_zeros((size_t)self->num_classes); double_array_set(self->scores->a, self->scores->n, 0.0); double *scores = self->scores->a; uint32_t i = 0; char *feature; uint32_t feature_id; uint32_t *indptr = self->weights->indptr->a; uint32_t *indices = self->weights->indices->a; double *data = self->weights->data->a; cstring_array_foreach(features, i, feature, { if (!averaged_perceptron_get_feature_id(self, feature, &feature_id)) { continue; } for (int col = indptr[feature_id]; col < indptr[feature_id + 1]; col++) { uint32_t class_id = indices[col]; scores[class_id] += data[col]; } }) return self->scores;
void crf_context_beta_score(crf_context_t *self) { double *cur = NULL; double *row = self->row->a; double *row_trans = self->row_trans->a; const double *next = NULL; const double *state = NULL; const double *state_trans = NULL; const double *trans = NULL; const size_t T = self->num_items; const size_t L = self->num_labels; double *scale = self->scale_factor->a; /* Compute the beta scores at (T-1, *). */ cur = beta_score(self, T - 1); double scale_t = scale[T - 1]; double_array_set(cur, scale_t, L); /* Compute the beta scores at (t, *). */ for (ssize_t t = T - 2; t >= 0; t--) { cur = beta_score(self, t); next = beta_score(self, t + 1); state = exp_state_score(self, t + 1); double_array_raw_copy(row, next, L); double_array_mul_array(row, state, L); /* Compute the beta score at (t, i). */ for (int i = 0; i < L; i++) { trans = exp_trans_score(self, i); double_array_raw_copy(row_trans, row, L); double_array_mul_array(row_trans, trans, L); state_trans = exp_state_trans_score(self, t + 1, i); cur[i] = double_array_dot(state_trans, row_trans, L); } scale_t = scale[t]; double_array_mul(cur, scale_t, L); } }