Language trans.
[apertium.git] / apertium-transfer-tools / src / AlignmentTemplate.H
blob4ae93ee8d4b2bade641aa845d220026b1dc0ab26
1 /*
2  * Copyright (C) 2006-2007 Felipe Sánchez-Martínez
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation; either version 2 of the
7  * License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
17  * 02111-1307, USA.
18  */
20 #ifndef __ALIGNMENTTEMPLATE_H_
21 #define __ALIGNMENTTEMPLATE_H_
23 using namespace std;
25 #include <vector>
26 #include <string>
27 #include <iostream>
28 #include <map>
29 #include <set>
30 #include <lttoolbox/FSTProcessor.H>
32 #include "Alignment.H"
33 #include "LexicalizedWords.H"
36 class AlignmentTemplate:public Alignment {
37 private:
38   vector<string> restrictions;
39   int invalid; //While extracting the AT this flag is modified
41   static LexicalizedWords source_lexicalized_words;
42   static LexicalizedWords target_lexicalized_words;
44   //Return true if the translation 't' is ok
45   static bool is_translation_ok(string t);
47 public: 
49   //Set of constant to identify why an AT is discarded (invalid)
50   static const int VALID = 0;
51   static const int INVALID_WRONG_OPEN_WORDS = 1;       
52   static const int INVALID_NO_OK_TRANSLATIONS = 2;
53   static const int INVALID_DIFFERENT_TRANSLATIONS = 3;
54   static const int INVALID_RESTRICTIONS = 4;
55   static const int INVALID_NO_EQUALCAT = 5;
56   static const int INVALID_EQUIVALENT_WORD_FOR_WORD = 6;
57   static const int INVALID_OTHERS = 7;
59   AlignmentTemplate();
61   AlignmentTemplate(string al);
63   AlignmentTemplate(const AlignmentTemplate& al);
64     
65   ~AlignmentTemplate();
67   /** Use to set the number of times this AT occurs */
68   void set_count(int count);
70   int get_count();
72   /** Test wether this AT is valid, i. e. it is suitable to be used
73    * within the apertium machine translation system.
74    * if 'equalcat' is true the fisrt tag of aligned (open) words must be
75    * the same
76    */
77   bool is_valid(bool equalcat, bool noword4word, FSTProcessor &fstp, Alignment &bilph);
79   int invalid_reason();
81   /** Test wheter the alignments between open words in source and
82    * target language are ok, i.e., all source open words are aligned
83    * with only one target open word, and vice versa.
84    */
85   bool are_open_word_aligments_ok();
87   /** This method returns the position of the open source word that is
88    * aligned with the open target word received as a parameter
89    * NOTE: It is supossed that ONLY one open source word is aligned
90    * with each open target word.
91    */
92   int get_open_source_word_pos(int target_pos);
94   /** This method returns the position of the open target word that is
95    * aligned with the open source word received as a parameter
96    * NOTE: It is supossed that ONLY one open target word is aligned
97    * with each open source word.
98    */
99   int get_open_target_word_pos(int source_pos);
101   /** Test if the alignment template performs no transformation, i.e.,
102    *  it is equivalent to word-for-word translation.
103    *  NOTE: It is supossed that the Alignment received as input
104    *  matches the SL part of the AT and the restrictions.
105    */
106   bool is_equivalent_to_word_for_word(Alignment& al, FSTProcessor& fstp);
108   string to_string();
110   static void set_lexicalized_words(const LexicalizedWords& scw, const LexicalizedWords& tcw);
112   static AlignmentTemplate xtract_alignment_template(Alignment& al, FSTProcessor& fstp);
114   friend ostream& operator << (ostream& os, AlignmentTemplate& at);
116   friend class TransferRule;
117   
118   friend class AlignmentTemplateGreaterThanByCount;
120   //friend class AlignmentTemplateLessThan;
124 //Definition of the compare function used to sort the
125 //alignment templates by their counts
126 class AlignmentTemplateGreaterThanByCount {
127 public:
128   bool operator()(const AlignmentTemplate &at1, const AlignmentTemplate &at2)  const {
129     return (at1.score>at2.score);
130   }
134 //Definition of the compare function used to sort the
135 //alignment templates
136 class AlignmentTemplateLessThan {
137 public:
138   bool operator()(const AlignmentTemplate &at1, const AlignmentTemplate &at2)  const {
139     //True if at1 is less than at2
141     if (at1.source.size()<at2.source.size()) 
142       return true;
143     else if (at1.source.size()>at2.source.size()) 
144       return false;
145     
147     if (at1.target.size()<at2.target.size()) 
148       return true;
149     else if (at1.target.size()>at2.target.size()) 
150       return false;
152     
153     if (at1.restrictions.size()<at2.restrictions.size()) 
154       return true;
155     else if (at1.restrictions.size()>at2.restrictions.size()) 
156       return false;
157     
159     if (at1.alignment<at2.alignment) 
160       return true;
161     else if (at1.alignment>at2.alignment) 
162       return false;
163     
165     for (unsigned i=0; i<at1.source.size(); i++) {
166       if (at1.source[i]<at2.source[i]) 
167         return true;
168       else if (at1.source[i]>at2.source[i]) 
169         return false;
170     }
172     for (unsigned i=0; i<at1.target.size(); i++) {
173       if (at1.target[i]<at2.target[i])
174         return true;
175       else if (at1.target[i]>at2.target[i])
176         return false;
177     }
179     for (unsigned i=0; i<at1.restrictions.size(); i++) {
180       if (at1.restrictions[i]<at2.restrictions[i]) 
181         return true;
182       else if (at1.restrictions[i]>at2.restrictions[i]) 
183         return false;
184     }
186     return false;
187   }
191 #endif