void ap_sentence(sentence_type *s, Float score[], Float w[], Float dw, Float sum_w[], size_t it, size_t changed[]) { Float max_winner_score, max_score; size_t best_i = sentence_scores(s, w, score, &max_winner_score, &max_score); if (score[0] <= max_score) { /* update between parse[0] and parse[best_i] */ size_t j; parse_type *correct = &s->parse[0], *winner = &s->parse[best_i]; if (winner->Pyx >= correct->Pyx) return; /* multiply update weight by importance of this pair */ assert(correct->Pyx > 0); dw *= s->Px * fabs(correct->Pyx - winner->Pyx)/correct->Pyx; /* subtract winner's feature counts */ for (j = 0; j < winner->nf; ++j) ap_update1(winner->f[j], w, -dw, sum_w, it, changed); for (j = 0; j < winner->nfc; ++j) ap_update1(winner->fc[j].f, w, -dw*winner->fc[j].c, sum_w, it, changed); /* add correct's feature counts */ for (j = 0; j < correct->nf; ++j) ap_update1(correct->f[j], w, dw, sum_w, it, changed); for (j = 0; j < correct->nfc; ++j) ap_update1(correct->fc[j].f, w, dw*correct->fc[j].c, sum_w, it, changed); } } /* ap_sentence() */
void wap_sentence(sentence_type *s, Float w[], Float dw, const size_type feat_class[], const Float class_dw[], Float sum_w[], size_type it, size_type changed[]) { Float best_correct_score, best_score; int best_correct_i = 0, best_i = 0; ap_sentence_scores(s, w, &best_correct_score, &best_correct_i, &best_score, &best_i); if (best_correct_score <= best_score) { /* update between parse[best_correct_i] and parse[best_i] */ size_type j; parse_type *correct = &s->parse[best_correct_i]; parse_type *winner = &s->parse[best_i]; if (winner->Pyx >= correct->Pyx) return; /* multiply update weight by importance of this pair */ dw *= s->Px * fabs(correct->Pyx - winner->Pyx)/correct->Pyx; /* subtract winner's feature counts */ for (j = 0; j < winner->nf; ++j) { size_type f = winner->f[j]; ap_update1(f, w, -dw*class_dw[feat_class[f]], sum_w, it, changed); } for (j = 0; j < winner->nfc; ++j) { size_type f = winner->fc[j].f; ap_update1(f, w, -dw*winner->fc[j].c*class_dw[feat_class[f]], sum_w, it, changed); } /* add correct's feature counts */ for (j = 0; j < correct->nf; ++j) { size_type f = correct->f[j]; ap_update1(f, w, dw*class_dw[feat_class[f]], sum_w, it, changed); } for (j = 0; j < correct->nfc; ++j) { size_type f = correct->fc[j].f; ap_update1(f, w, dw*correct->fc[j].c*class_dw[feat_class[f]], sum_w, it, changed); } } } /* wap_sentence() */
void ap_sentence(sentence_type *s, Float w[], Float dw, Float weightdecay, Float sum_w[], size_type it, size_type changed[]) { Float best_correct_score, best_score; int best_i, best_correct_i; if (weightdecay == 0) ap_sentence_scores(s, w, &best_correct_score, &best_correct_i, &best_score, &best_i); else ap_wd_sentence_scores(s, w, weightdecay, sum_w, it, changed, &best_correct_score, &best_correct_i, &best_score, &best_i); if (best_correct_score <= best_score) { /* update between parse[best_correct_i] and parse[best_i] */ size_type j; parse_type *correct = &s->parse[best_correct_i]; parse_type *winner = &s->parse[best_i]; if (winner->Pyx >= correct->Pyx) return; /* multiply update weight by importance of this pair */ assert(correct->Pyx > 0); dw *= s->Px * fabs(correct->Pyx - winner->Pyx)/correct->Pyx; /* subtract winner's feature counts */ for (j = 0; j < winner->nf; ++j) ap_update1(winner->f[j], w, -dw, sum_w, it, changed); for (j = 0; j < winner->nfc; ++j) ap_update1(winner->fc[j].f, w, -dw*winner->fc[j].c, sum_w, it, changed); /* add correct's feature counts */ for (j = 0; j < correct->nf; ++j) ap_update1(correct->f[j], w, dw, sum_w, it, changed); for (j = 0; j < correct->nfc; ++j) ap_update1(correct->fc[j].f, w, dw*correct->fc[j].c, sum_w, it, changed); } } /* ap_sentence() */
void wap_sentence(sentence_type *s, Float score[], Float w[], Float dw, const size_t feat_class[], const Float class_dw[], Float sum_w[], size_t it, size_t changed[]) { Float max_winner_score, max_score; size_t best_i = sentence_scores(s, w, score, &max_winner_score, &max_score); if (score[0] <= max_score) { /* update between parse[0] and parse[best_i] */ size_t j; parse_type *correct = &s->parse[0], *winner = &s->parse[best_i]; /* multiply update weight by importance of this pair */ dw *= s->Px * fabs(correct->Pyx - winner->Pyx); /* subtract winner's feature counts */ for (j = 0; j < winner->nf; ++j) { size_t f = winner->f[j]; ap_update1(f, w, -dw*class_dw[feat_class[f]], sum_w, it, changed); } for (j = 0; j < winner->nfc; ++j) { size_t f = winner->fc[j].f; ap_update1(f, w, -dw*winner->fc[j].c*class_dw[feat_class[f]], sum_w, it, changed); } /* add correct's feature counts */ for (j = 0; j < correct->nf; ++j) { size_t f = correct->f[j]; ap_update1(f, w, dw*class_dw[feat_class[f]], sum_w, it, changed); } for (j = 0; j < correct->nfc; ++j) { size_t f = correct->fc[j].f; ap_update1(f, w, dw*correct->fc[j].c*class_dw[feat_class[f]], sum_w, it, changed); } } } /* wap_sentence() */