1 /* FILE: netw_arc.h 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 #ifndef __netw_arc_h__ 22 #define __netw_arc_h__ 23 24 #undef assert 25 #define assert(X) 26 #include <cstdio> 27 28 class GRXMLDoc; 29 class NUANArc 30 { 31 public: 32 friend class SubGraph; 33 /* Constructors */ 34 35 /* Create arc with only input and output labels 36 */ NUANArc(int iLabel,int oLabel)37 NUANArc (int iLabel, int oLabel) 38 { 39 inputLabel= iLabel; 40 outputLabel= oLabel; 41 centre= -1; 42 left= -1; 43 right= -1; 44 return; 45 }; 46 47 /* Create arc with full data 48 */ NUANArc(int iLabel,int oLabel,int from,int to)49 NUANArc (int iLabel, int oLabel, int from, int to) 50 { 51 inputLabel= iLabel; 52 outputLabel= oLabel; 53 fromId= from; 54 toId= to; 55 left= -1; 56 right= -1; 57 centre= -1; 58 return; 59 }; 60 61 /* Copy an arc 62 */ NUANArc(NUANArc * arcsrc)63 NUANArc (NUANArc *arcsrc) 64 { 65 inputLabel= arcsrc->inputLabel; 66 outputLabel= arcsrc->outputLabel; 67 fromId= arcsrc->fromId; 68 toId= arcsrc->toId; 69 left= arcsrc->left; 70 right= arcsrc->right; 71 centre= arcsrc->centre; 72 return; 73 }; 74 75 /* Create arc based on another arc 76 */ NUANArc(NUANArc * arcsrc,int offset,int startId,int newStartId,int endId,int newEndId)77 NUANArc (NUANArc *arcsrc, int offset, int startId, int newStartId, int endId, int newEndId) 78 { 79 inputLabel= arcsrc->inputLabel; 80 outputLabel= arcsrc->outputLabel; 81 if (arcsrc->fromId == startId && newStartId >= 0) 82 fromId= newStartId; 83 else 84 fromId= arcsrc->fromId + offset; 85 if (arcsrc->toId == endId && newEndId >= 0) 86 toId= newEndId; 87 else 88 toId= arcsrc->toId + offset; 89 left= -1; 90 right= -1; 91 centre= -1; 92 return; 93 }; 94 95 /* Assign non-terminal vertices 96 */ AssignFromId(int Id)97 void AssignFromId (int Id) 98 { 99 fromId= Id; 100 }; 101 102 /* Assign non-terminal vertices 103 */ AssignToId(int Id)104 void AssignToId (int Id) 105 { 106 toId= Id; 107 }; 108 AssignInput(int Id)109 void AssignInput (int Id) 110 { 111 inputLabel= Id; 112 }; 113 AssignOutput(int Id)114 void AssignOutput (int Id) 115 { 116 outputLabel= Id; 117 }; 118 119 /* Assign centre context 120 */ AssignCentre(int centreData)121 void AssignCentre (int centreData) { centre= centreData; }; 122 123 /* Assign left context 124 */ AssignLeft(int leftData)125 void AssignLeft (int leftData) { left= leftData; }; 126 127 /* Assign right context 128 */ AssignRight(int rightData)129 void AssignRight (int rightData) { right= rightData; }; 130 131 /* Access functions */ 132 /* Get input label 133 */ GetInput()134 int GetInput() { return inputLabel; }; 135 136 /* Get output label 137 */ GetOutput()138 int GetOutput() { return outputLabel; }; 139 140 /* Get from Vertex 141 */ GetFromId()142 int GetFromId() { return fromId; }; 143 144 /* Get to Vertex 145 */ GetToId()146 int GetToId() { return toId; }; 147 148 /* Get centre context 149 */ GetCentre()150 int GetCentre() { return centre; }; 151 152 /* Get left context 153 */ GetLeft()154 int GetLeft() { return left; }; 155 156 /* Get right context 157 */ GetRight()158 int GetRight() { return right; }; 159 160 /* Transduction 161 */ Transduce(int iLabel)162 int Transduce (int iLabel) 163 { 164 if (inputLabel == iLabel) 165 return outputLabel; 166 else 167 return -1; 168 }; 169 170 /* Similarity checks 171 */ Compare(NUANArc * test)172 int Compare (NUANArc *test) 173 { 174 if (fromId > test->fromId) 175 return 1; 176 else if (fromId < test->fromId) 177 return -1; 178 else if (toId > test->toId) 179 return 1; 180 else if (toId < test->toId) 181 return -1; 182 else if (inputLabel > test->inputLabel) 183 return 1; 184 else if (inputLabel < test->inputLabel) 185 return -1; 186 else if (outputLabel > test->outputLabel) 187 return 1; 188 else if (outputLabel < test->outputLabel) 189 return -1; 190 else 191 return 0; 192 } 193 CompareSymbol(NUANArc * test)194 int CompareSymbol (NUANArc *test) 195 { 196 if (inputLabel > test->inputLabel) 197 return 1; 198 else if (inputLabel < test->inputLabel) 199 return -1; 200 else if (outputLabel > test->outputLabel) 201 return 1; 202 else if (outputLabel < test->outputLabel) 203 return -1; 204 else 205 return 0; 206 } 207 CompareReverse(NUANArc * test)208 int CompareReverse (NUANArc *test) 209 { 210 if (toId > test->toId) 211 return 1; 212 else if (toId < test->toId) 213 return -1; 214 else if (fromId > test->fromId) 215 return 1; 216 else if (fromId < test->fromId) 217 return -1; 218 else if (inputLabel > test->inputLabel) 219 return 1; 220 else if (inputLabel < test->inputLabel) 221 return -1; 222 else if (outputLabel > test->outputLabel) 223 return 1; 224 else if (outputLabel < test->outputLabel) 225 return -1; 226 else 227 return 0; 228 } 229 CompareForMin(NUANArc * test)230 int CompareForMin (NUANArc *test) 231 { 232 if (fromId > test->fromId) 233 return 1; 234 else if (fromId < test->fromId) 235 return -1; 236 else if (inputLabel > test->inputLabel) 237 return 1; 238 else if (inputLabel < test->inputLabel) 239 return -1; 240 else if (outputLabel > test->outputLabel) 241 return 1; 242 else if (outputLabel < test->outputLabel) 243 return -1; 244 else if (toId > test->toId) 245 return 1; 246 else if (toId < test->toId) 247 return -1; 248 else 249 return 0; 250 } 251 CompareWithContext(NUANArc * test)252 int CompareWithContext (NUANArc *test) 253 { 254 if (fromId > test->fromId) 255 return 1; 256 else if (fromId < test->fromId) 257 return -1; 258 else if (toId > test->toId) 259 return 1; 260 else if (toId < test->toId) 261 return -1; 262 else if (inputLabel > test->inputLabel) 263 return 1; 264 else if (inputLabel < test->inputLabel) 265 return -1; 266 else if (outputLabel > test->outputLabel) 267 return 1; 268 else if (outputLabel < test->outputLabel) 269 return -1; 270 else if (left > test->left) 271 return 1; 272 else if (left < test->left) 273 return -1; 274 else if (right > test->right) 275 return 1; 276 else if (right < test->right) 277 return -1; 278 else 279 return 0; 280 } 281 IsSame(NUANArc * test)282 bool IsSame (NUANArc *test) 283 { 284 if (inputLabel == test->inputLabel && outputLabel == test->outputLabel && fromId == test->fromId && toId == test->toId) 285 return true; 286 else 287 return false; 288 }; 289 HasSameLabels(NUANArc * test)290 bool HasSameLabels (NUANArc *test) 291 { 292 if (inputLabel == test->inputLabel && outputLabel == test->outputLabel) 293 return true; 294 else 295 return false; 296 }; 297 HasSameLabelsAndTo(NUANArc * test)298 bool HasSameLabelsAndTo (NUANArc *test) 299 { 300 if (inputLabel == test->inputLabel && outputLabel == test->outputLabel && toId == test->toId) 301 return true; 302 else 303 return false; 304 }; 305 HasSameLabelsAndFrom(NUANArc * test)306 bool HasSameLabelsAndFrom (NUANArc *test) 307 { 308 if (inputLabel == test->inputLabel && outputLabel == test->outputLabel && fromId == test->fromId) 309 return true; 310 else 311 return false; 312 }; 313 314 /* Print 315 */ Print()316 void Print() 317 { 318 printf ("%d %d %d %d (%d)\n", fromId, toId, inputLabel, outputLabel, centre); 319 return; 320 }; PrintText()321 void PrintText() 322 { 323 printf ("%d %d %c %d (%d)\n", fromId, toId, inputLabel, outputLabel, centre); 324 return; 325 }; 326 327 void Dump (GRXMLDoc &p_Doc ); 328 329 330 protected: 331 int inputLabel; /* input label */ 332 int outputLabel; /* output label */ 333 int fromId; /* from node */ 334 int toId; /* to node */ 335 int centre; /* left context */ 336 int left; /* left context */ 337 int right; /* right context */ 338 }; 339 340 #endif // __netw_arc_h__ 341