• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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