void extract_thin_linkage(Sentence sent, Parse_Options opts, Linkage linkage) { int i; Sublinkage *sublinkage; Parse_info pi = sent->parse_info; sublinkage = x_create_sublinkage(pi); compute_link_names(sent); for (i=0; i<pi->N_links; i++) { copy_full_link(&sublinkage->link[i],&(pi->link_array[i])); } linkage->num_sublinkages = 1; linkage->sublinkage = ex_create_sublinkage(pi); for (i=0; i<pi->N_links; ++i) { linkage->sublinkage->link[i] = excopy_link(sublinkage->link[i]); } free_sublinkage(sublinkage); }
Sublinkage unionize_linkage(Linkage linkage) { int i, j, num_in_union=0; Sublinkage u; Link link; char *p; for (i=0; i<linkage->num_sublinkages; ++i) { for (j=0; j<linkage->sublinkage[i].num_links; ++j) { link = linkage->sublinkage[i].link[j]; if (!link_already_appears(linkage, link, i)) num_in_union++; } } u.num_links = num_in_union; u.link = (Link *) exalloc(sizeof(Link)*num_in_union); u.pp_info = (PP_info *) exalloc(sizeof(PP_info)*num_in_union); u.violation = NULL; num_in_union = 0; for (i=0; i<linkage->num_sublinkages; ++i) { for (j=0; j<linkage->sublinkage[i].num_links; ++j) { link = linkage->sublinkage[i].link[j]; if (!link_already_appears(linkage, link, i)) { u.link[num_in_union] = excopy_link(link); u.pp_info[num_in_union] = excopy_pp_info(linkage->sublinkage[i].pp_info[j]); if (((p=linkage->sublinkage[i].violation) != NULL) && (u.violation == NULL)) { u.violation = (char *) exalloc((strlen(p)+1)*sizeof(char)); strcpy(u.violation, p); } num_in_union++; } } } return u; }
/** * This procedure mimics analyze_fat_linkage in order to * extract the sublinkages and copy them to the Linkage * data structure passed in. */ void extract_fat_linkage(Sentence sent, Parse_Options opts, Linkage linkage) { int i, j, N_thin_links; DIS_node *d_root; int num_sublinkages; Sublinkage * sublinkage; Parse_info pi = sent->parse_info; sublinkage = x_create_sublinkage(pi); build_digraph(pi, word_links); structure_violation = FALSE; d_root = build_DIS_CON_tree(pi, word_links); if (structure_violation) { compute_link_names(sent); for (i=0; i<pi->N_links; i++) { copy_full_link(&sublinkage->link[i],&(pi->link_array[i])); } linkage->num_sublinkages=1; linkage->sublinkage = ex_create_sublinkage(pi); /* This will have fat links! */ for (i=0; i<pi->N_links; ++i) { linkage->sublinkage->link[i] = excopy_link(sublinkage->link[i]); } free_sublinkage(sublinkage); free_digraph(pi, word_links); free_DIS_tree(d_root); return; } /* first get number of sublinkages and allocate space */ num_sublinkages = 0; for (;;) { num_sublinkages++; if (!advance_DIS(d_root)) break; } linkage->num_sublinkages = num_sublinkages; linkage->sublinkage = (Sublinkage *) exalloc(sizeof(Sublinkage)*num_sublinkages); for (i=0; i<num_sublinkages; ++i) { linkage->sublinkage[i].link = NULL; linkage->sublinkage[i].pp_info = NULL; linkage->sublinkage[i].violation = NULL; } /* now fill out the sublinkage arrays */ compute_link_names(sent); num_sublinkages = 0; for (;;) { for (i=0; i<pi->N_links; i++) { patch_array[i].used = patch_array[i].changed = FALSE; patch_array[i].newl = pi->link_array[i].l; patch_array[i].newr = pi->link_array[i].r; copy_full_link(&sublinkage->link[i], &(pi->link_array[i])); } fill_patch_array_DIS(d_root, NULL, word_links); for (i=0; i<pi->N_links; i++) { if (patch_array[i].changed || patch_array[i].used) { sublinkage->link[i]->l = patch_array[i].newl; sublinkage->link[i]->r = patch_array[i].newr; } else if ((dfs_root_word[pi->link_array[i].l] != -1) && (dfs_root_word[pi->link_array[i].r] != -1)) { sublinkage->link[i]->l = -1; } } compute_pp_link_array_connectors(sent, sublinkage); compute_pp_link_names(sent, sublinkage); /* Don't copy the fat links into the linkage */ N_thin_links = 0; for (i= 0; i<pi->N_links; ++i) { if (sublinkage->link[i]->l == -1) continue; N_thin_links++; } linkage->sublinkage[num_sublinkages].num_links = N_thin_links; linkage->sublinkage[num_sublinkages].link = (Link *) exalloc(sizeof(Link)*N_thin_links); linkage->sublinkage[num_sublinkages].pp_info = NULL; linkage->sublinkage[num_sublinkages].violation = NULL; for (i=0, j=0; i<pi->N_links; ++i) { if (sublinkage->link[i]->l == -1) continue; linkage->sublinkage[num_sublinkages].link[j++] = excopy_link(sublinkage->link[i]); } num_sublinkages++; if (!advance_DIS(d_root)) break; } free_sublinkage(sublinkage); free_digraph(pi, word_links); free_DIS_tree(d_root); }
static void copy_full_link(Link *dest, Link src) { if (*dest != NULL) exfree_link(*dest); *dest = excopy_link(src); }