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