1 /****************************************************************\
2 * *
3 * Model for alignments with non-equivalenced regions *
4 * *
5 * Guy St.C. Slater.. mailto:guy@ebi.ac.uk *
6 * Copyright (C) 2000-2009. All Rights Reserved. *
7 * *
8 * This source code is distributed under the terms of the *
9 * GNU General Public License, version 3. See the file COPYING *
10 * or http://www.gnu.org/licenses/gpl.txt for details *
11 * *
12 * If you use this code, please keep this notice intact. *
13 * *
14 \****************************************************************/
15
16 #include <string.h> /* For strlen() */
17
18 #include "ner.h"
19
NER_ArgumentSet_create(Argument * arg)20 NER_ArgumentSet *NER_ArgumentSet_create(Argument *arg){
21 register ArgumentSet *as;
22 static NER_ArgumentSet nas;
23 if(arg){
24 as = ArgumentSet_create("NER Model Options");
25 ArgumentSet_add_option(as, 0, "minner", "length",
26 "Minimum NER length", "10",
27 Argument_parse_int, &nas.min_ner);
28 ArgumentSet_add_option(as, 0, "maxner", "length",
29 "Maximum NER length", "50000",
30 Argument_parse_int, &nas.max_ner);
31 ArgumentSet_add_option(as, 0, "neropen", "score",
32 "NER open penalty", "-20",
33 Argument_parse_int, &nas.ner_open_penalty);
34 Argument_absorb_ArgumentSet(arg, as);
35 }
36 return &nas;
37 }
38
NER_Data_create(Sequence * query,Sequence * target)39 NER_Data *NER_Data_create(Sequence *query, Sequence *target){
40 register NER_Data *nd = g_new0(NER_Data, 1);
41 Affine_Data_init(&nd->ad, query, target, FALSE);
42 nd->nas = NER_ArgumentSet_create(NULL);
43 return nd;
44 }
45
NER_Data_destroy(NER_Data * nd)46 void NER_Data_destroy(NER_Data *nd){
47 Affine_Data_clear(&nd->ad);
48 g_free(nd);
49 return;
50 }
51
52 /* Calc functions */
53
ner_ner_open_calc_func(gint query_pos,gint target_pos,gpointer user_data)54 static C4_Score ner_ner_open_calc_func(gint query_pos,
55 gint target_pos,
56 gpointer user_data){
57 register NER_Data *nd = (NER_Data*)user_data;
58 return nd->nas->ner_open_penalty;
59 }
60
61 static gchar *ner_ner_open_calc_macro
62 = "(nd->nas->ner_open_penalty)\n";
63
64 /**/
65
NER_create(Alphabet_Type query_type,Alphabet_Type target_type)66 C4_Model *NER_create(Alphabet_Type query_type,
67 Alphabet_Type target_type){
68 register C4_Model *ner = Affine_create(Affine_Model_Type_LOCAL,
69 query_type, target_type,
70 FALSE);
71 register C4_State *ner_state;
72 register C4_Calc *ner_open_calc;
73 register NER_ArgumentSet *nas
74 = NER_ArgumentSet_create(NULL);
75 register C4_Transition *match_transition;
76 register gchar *model_name = g_strdup_printf("NER:%s", ner->name);
77 C4_Model_rename(ner, model_name);
78 g_free(model_name);
79 C4_Model_open(ner);
80 match_transition = C4_Model_select_single_transition(ner,
81 C4_Label_MATCH);
82 g_assert(match_transition);
83 ner_state = C4_Model_add_state(ner, "ner");
84 ner_open_calc = C4_Model_add_calc(ner, "ner open",
85 nas->ner_open_penalty,
86 ner_ner_open_calc_func,
87 ner_ner_open_calc_macro,
88 NULL, NULL, NULL, NULL, C4_Protect_NONE);
89 /**/
90 /* Transitions from match */
91 C4_Model_add_transition(ner, "match to ner",
92 match_transition->input, ner_state, 1, 1,
93 ner_open_calc, C4_Label_NER, NULL);
94 /* Transitions from ner */
95 C4_Model_add_transition(ner, "ner to match",
96 ner_state, match_transition->input, 0, 0,
97 NULL, C4_Label_NONE, NULL);
98 C4_Model_add_transition(ner, "ner loop insert",
99 ner_state, ner_state, 1, 0,
100 NULL, C4_Label_NER, NULL);
101 C4_Model_add_transition(ner, "ner loop delete",
102 ner_state, ner_state, 0, 1,
103 NULL, C4_Label_NER, NULL);
104 /**/
105 C4_Model_add_span(ner, "ner span", ner_state,
106 nas->min_ner, nas->max_ner,
107 nas->min_ner, nas->max_ner);
108 /**/
109 C4_Model_append_codegen(ner,
110 "#include \"ner.h\"\n",
111 "register NER_Data *nd = (NER_Data*)user_data;\n", NULL);
112 C4_Model_close(ner);
113 return ner;
114 }
115
116