1 /* FILE: netw_dump.cpp
2 * DATE MODIFIED: 31-Aug-07
3 * DESCRIPTION: Part of the SREC graph compiler project source files.
4 *
5 * Copyright 2007, 2008 Nuance Communciations, Inc. *
6 * *
7 * Licensed under the Apache License, Version 2.0 (the 'License'); *
8 * you may not use this file except in compliance with the License. *
9 * *
10 * You may obtain a copy of the License at *
11 * http://www.apache.org/licenses/LICENSE-2.0 *
12 * *
13 * Unless required by applicable law or agreed to in writing, software *
14 * distributed under the License is distributed on an 'AS IS' BASIS, *
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
16 * See the License for the specific language governing permissions and *
17 * limitations under the License. *
18 * *
19 *---------------------------------------------------------------------------*/
20
21 #include <fstream>
22 #include <iostream>
23 #include <sstream>
24
25 #include <string>
26
27 #include "netw_arc.h"
28 #include "sub_grph.h"
29
30 #include "grxmldoc.h"
31
RemapForSortedOutput(GRXMLDoc & p_Doc)32 void SubGraph::RemapForSortedOutput ( GRXMLDoc &p_Doc )
33 {
34 int origIndex, sortedIndex;
35
36 for (int ii= 0; ii < numArc; ii++) {
37 origIndex= arc[ii]->GetInput();
38 if (origIndex >= 0 && p_Doc.findSortedLabelIndex (origIndex, sortedIndex ))
39 arc[ii]->AssignInput (sortedIndex);
40 }
41 return;
42 }
43
WriteForwardGraphFile(std::string & fileName,GRXMLDoc & p_Doc)44 void SubGraph::WriteForwardGraphFile( std::string & fileName, GRXMLDoc &p_Doc )
45 {
46 // Creates file of forward graph - the {name}.G.txt file
47 int loc;
48 std::string inLabel;
49 std::ofstream outfile;
50 std::string label;
51 std::string separator = "\t";
52 std::string Eps = "eps";
53
54 RemapForSortedOutput (p_Doc);
55 SortLanguageForMin ();
56 p_Doc.sortLabels();
57 outfile.open ( fileName.c_str() );
58 for (int ii= 0; ii < numArc; ii++) {
59 inLabel="";
60 loc = forwardList[ii];
61 switch ( arc[loc]->inputLabel ) {
62 case TERMINAL_LABEL: // Terminal transition
63 outfile << arc[loc]->fromId << std::endl;
64 break;
65 case NONE_LABEL: // Null transition
66 outfile << arc[loc]->fromId << separator << arc[loc]->toId << separator << Eps << std::endl;
67 break;
68 case TAG_LABEL: // Tag transition
69 case WB_LABEL: // Word boundary transition
70 case BEGINSCOPE_LABEL: // Start of scope
71 case ENDSCOPE_LABEL: // End of scope
72 case BEGINRULE_LABEL: // Start of rule
73 case ENDRULE_LABEL: // End of rule
74 case DISCARD_LABEL: // Discard (internal)
75 break;
76 default:
77 {
78 // if (!p_Doc.findLabel( arc[loc]->inputLabel, inLabel ) ) {
79 if (!p_Doc.findSortedLabel( arc[loc]->inputLabel, inLabel ) ) {
80 std::stringstream ss;
81 ss << arc[loc]->inputLabel;
82 inLabel = ss.str();
83 }
84 outfile << arc[loc]->fromId << separator << arc[loc]->toId << separator << inLabel.c_str() << std::endl;
85 }
86 break;
87 } // switch
88
89 }
90 outfile.close();
91
92 SortLanguage ();
93 return;
94 }
95
96
WriteForwardGraphWithSemantic(std::string & fileName,GRXMLDoc & p_Doc)97 void SubGraph::WriteForwardGraphWithSemantic ( std::string & fileName, GRXMLDoc &p_Doc )
98 {
99 int loc;
100 std::string inLabel, outLabel;
101 std::string tag;
102 std::string Eps = "eps";
103 std::string OpenBrace = "{";
104 std::string CloseBrace = "}";
105 std::string Separator ="\t";
106
107 std::ofstream outfile;
108 std::string label;
109 std::string separator = "\t";
110 outfile.open ( fileName.c_str() );
111
112 RemapForSortedOutput (p_Doc);
113 SortLanguageForMin ();
114 p_Doc.sortLabels();
115 for ( int ii= 0; ii < numArc; ii++ ) {
116 loc= forwardList[ii];
117 inLabel = "";
118 switch ( arc[loc]->inputLabel ) {
119 case BEGINRULE_LABEL: // Start of rule
120 inLabel = Eps;
121 outLabel = OpenBrace;
122 break;
123 case ENDRULE_LABEL: // End of rule
124 {
125 inLabel = Eps;
126 if (!p_Doc.findRule( arc[loc]->outputLabel, outLabel ) ) {
127 std::stringstream ss;
128 ss << arc[loc]->outputLabel;
129 outLabel = "(" + ss.str() + ")";
130 }
131 outLabel = outLabel + CloseBrace;
132 }
133 break;
134 case NONE_LABEL: // Null transition
135 inLabel = Eps;
136 outLabel= Eps;
137 break;
138 case TAG_LABEL: // Tag transition
139 inLabel = Eps;
140 {
141 std::stringstream ss;
142 ss << SCRIPT_LABEL_PREFIX << arc[loc]->outputLabel;
143 outLabel = ss.str();
144 }
145 break;
146 case TERMINAL_LABEL: // Terminal transition
147 outLabel = "";
148 break;
149 case WB_LABEL: // Word boundary transition
150 case BEGINSCOPE_LABEL: // Start of scope
151 case ENDSCOPE_LABEL: // End of scope
152 case DISCARD_LABEL: // Discard (internal)
153 break;
154 default:
155 // Input label
156 // if (!p_Doc.findLabel( arc[loc]->inputLabel, inLabel ) ) {
157 if (!p_Doc.findSortedLabel( arc[loc]->inputLabel, inLabel ) ) {
158 inLabel = arc[loc]->inputLabel;
159 }
160
161 // Output label
162 if (arc[loc]->outputLabel == -1)
163 outLabel= Eps;
164 else {
165 std::stringstream ss;
166 ss << SCRIPT_LABEL_PREFIX << arc[loc]->outputLabel;
167 outLabel = ss.str();
168 }
169 break;
170 }
171 if ( outLabel.empty() )
172 outfile << arc[loc]->fromId << std::endl;
173 else {
174 outfile << arc[loc]->fromId << Separator << arc[loc]->toId << Separator << inLabel.c_str() << Separator << outLabel.c_str() << std::endl;
175 p_Doc.addOLabelToOList( outLabel);
176 }
177 }
178 outfile.close();
179
180 return;
181 }
182
WriteHMMGraphFile(std::string & fileName,GRXMLDoc & p_Doc)183 void SubGraph::WriteHMMGraphFile( std::string & fileName, GRXMLDoc &p_Doc )
184 {
185 // Creates file of forward graph - the {name}.G.txt file
186 int loc;
187 std::string inLabel;
188 std::string outLabel;
189 std::string phLabel;
190 std::string metaname;
191 std::string wtw;
192 std::ofstream outfile;
193 std::string label;
194 std::string separator = "\t";
195 std::string Eps = "eps";
196 std::string Pau = "-pau-";
197 std::string Pau2 = "-pau2-";
198 bool bRes;
199
200 metaname = "word_penalty";
201 bRes = p_Doc.findMeta(metaname, wtw);
202
203 outfile.open ( fileName.c_str() );
204 for (int ii= 0; ii < numArc; ii++) {
205 inLabel="";
206 loc = forwardList[ii];
207 switch ( arc[loc]->inputLabel ) {
208 case TERMINAL_LABEL: // Terminal transition
209 outfile << arc[loc]->fromId << std::endl;
210 break;
211 case NONE_LABEL: // Null transition
212 if (arc[loc]->outputLabel >= 0) {
213 if (!p_Doc.findLabel( arc[loc]->outputLabel, outLabel ) ) {
214 std::stringstream ss;
215 ss << arc[loc]->outputLabel;
216 outLabel = ss.str();
217 }
218 outfile << arc[loc]->fromId << separator << arc[loc]->toId << separator << Eps << separator << outLabel.c_str() << std::endl;
219 }
220 else
221 outfile << arc[loc]->fromId << separator << arc[loc]->toId << separator << Eps << separator << Eps << std::endl;
222 break;
223 case WB_LABEL: // Word boundary transition
224 if (arc[loc]->outputLabel >= 0) {
225 if (!p_Doc.findLabel( arc[loc]->outputLabel, outLabel ) ) {
226 std::stringstream ss;
227 ss << arc[loc]->outputLabel;
228 outLabel = ss.str();
229 }
230 outfile << arc[loc]->fromId << separator << arc[loc]->toId << separator << ".wb" << separator << outLabel.c_str() << std::endl;
231 }
232 else
233 outfile << arc[loc]->fromId << separator << arc[loc]->toId << separator << ".wb" << separator << Eps << std::endl;
234 break;
235 case TAG_LABEL: // Tag transition
236 case BEGINSCOPE_LABEL: // Start of scope
237 case ENDSCOPE_LABEL: // End of scope
238 case BEGINRULE_LABEL: // Start of rule
239 case ENDRULE_LABEL: // End of rule
240 case DISCARD_LABEL: // Discard (internal)
241 break;
242 default:
243 {
244 if (arc[loc]->outputLabel >= 0) {
245 if (!p_Doc.findLabel( arc[loc]->outputLabel, outLabel ) ) {
246 std::stringstream ss;
247 ss << arc[loc]->outputLabel;
248 outLabel = ss.str();
249 }
250 }
251 else if (arc[loc]->outputLabel == INITIAL_LABEL)
252 outLabel= Pau;
253 else if (arc[loc]->outputLabel == FINAL_LABEL)
254 outLabel= Pau2;
255 else
256 outLabel= Eps;
257 }
258 break;
259 } // switch
260
261 }
262 outfile.close();
263 return;
264 }
265
WritePhonemeGraphFile(std::string & fileName,GRXMLDoc & p_Doc)266 void SubGraph::WritePhonemeGraphFile( std::string & fileName, GRXMLDoc &p_Doc )
267 {
268 // Creates file of forward graph - the {name}.G.txt file
269 int loc;
270 std::string inLabel;
271 std::string outLabel;
272 std::ofstream outfile;
273 std::string label;
274 std::string separator = "\t";
275 std::string Eps = "eps";
276
277 outfile.open ( fileName.c_str() );
278 for (int ii= 0; ii < numArc; ii++) {
279 inLabel="";
280 loc = forwardList[ii];
281 switch ( arc[loc]->inputLabel ) {
282 case TERMINAL_LABEL: // Terminal transition
283 outfile << arc[loc]->fromId << std::endl;
284 break;
285 case NONE_LABEL: // Null transition
286 if (arc[loc]->outputLabel >= 0) {
287 if (!p_Doc.findLabel( arc[loc]->outputLabel, outLabel ) ) {
288 std::stringstream ss;
289 ss << arc[loc]->outputLabel;
290 outLabel = ss.str();
291 }
292 outfile << arc[loc]->fromId << separator << arc[loc]->toId << separator << Eps << separator << outLabel.c_str() << std::endl;
293 }
294 else
295 outfile << arc[loc]->fromId << separator << arc[loc]->toId << separator << Eps << separator << Eps << std::endl;
296 break;
297 case WB_LABEL: // Word boundary transition
298 if (arc[loc]->outputLabel >= 0) {
299 if (!p_Doc.findLabel( arc[loc]->outputLabel, outLabel ) ) {
300 std::stringstream ss;
301 ss << arc[loc]->outputLabel;
302 outLabel = ss.str();
303 }
304 outfile << arc[loc]->fromId << separator << arc[loc]->toId << separator << ".wb" << separator << outLabel.c_str() << std::endl;
305 }
306 else
307 outfile << arc[loc]->fromId << separator << arc[loc]->toId << separator << ".wb" << separator << Eps << std::endl;
308 break;
309 case TAG_LABEL: // Tag transition
310 case BEGINSCOPE_LABEL: // Start of scope
311 case ENDSCOPE_LABEL: // End of scope
312 case BEGINRULE_LABEL: // Start of rule
313 case ENDRULE_LABEL: // End of rule
314 case DISCARD_LABEL: // Discard (internal)
315 break;
316 default:
317 if ( arc[loc]->inputLabel >= 0) {
318
319 }
320 else {
321 // Note negative index
322 if (!p_Doc.findLabel( -arc[loc]->inputLabel, inLabel ) ) {
323 std::stringstream ss;
324 ss << arc[loc]->inputLabel;
325 inLabel = ss.str();
326 }
327 outfile << arc[loc]->fromId << separator << arc[loc]->toId << separator << inLabel.c_str() << separator << Eps << std::endl;
328 }
329 break;
330 } // switch
331
332 }
333 outfile.close();
334
335 return;
336 }
337
338
PrintWithLabels(GRXMLDoc & p_Doc)339 void SubGraph::PrintWithLabels( GRXMLDoc &p_Doc )
340 {
341 int loc;
342 std::string inLabel, outLabel;
343 std::string label;
344
345 printf ("Graph %s (%d %d)\n", title, startId, lastId);
346 for (int ii= 0; ii < numArc; ii++) {
347 loc= forwardList[ii];
348 if (!p_Doc.findLabel( arc[loc]->inputLabel, inLabel ) ) {
349 inLabel = arc[loc]->inputLabel;
350 //std::stringstream ss;
351 //ss << arc[loc]->inputLabel;
352 //inLabel = ss.str();
353 }
354 if (!p_Doc.findTag( arc[loc]->outputLabel, outLabel ) ) {
355 outLabel = arc[loc]->outputLabel;
356 //std::stringstream ss;
357 //ss << arc[loc]->outputLabel;
358 //outLabel = ss.str();
359 }
360 std::cout << arc[loc]->fromId <<" " << arc[loc]->toId << " " << inLabel.c_str() <<" " << outLabel.c_str() << std::endl;
361 }
362
363 return;
364 }
365
Dump(GRXMLDoc & p_Doc)366 void NUANArc::Dump(GRXMLDoc &p_Doc )
367 {
368 // I need a handle to the grxml doc object in order to access labels
369 printf ("%d %d %d %d\n", fromId, toId, inputLabel, outputLabel);
370 return;
371 }
372
373
374
375