1 /*---------------------------------------------------------------------------* 2 * search_network.h * 3 * * 4 * Copyright 2007, 2008 Nuance Communciations, Inc. * 5 * * 6 * Licensed under the Apache License, Version 2.0 (the 'License'); * 7 * you may not use this file except in compliance with the License. * 8 * * 9 * You may obtain a copy of the License at * 10 * http://www.apache.org/licenses/LICENSE-2.0 * 11 * * 12 * Unless required by applicable law or agreed to in writing, software * 13 * distributed under the License is distributed on an 'AS IS' BASIS, * 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 15 * See the License for the specific language governing permissions and * 16 * limitations under the License. * 17 * * 18 *---------------------------------------------------------------------------*/ 19 20 /* this file containts data structures needed for defining FSM network*/ 21 22 #ifndef _h_search_network_ 23 #define _h_search_network_ 24 25 #include"srec_sizes.h" 26 27 typedef struct FSMarc_t FSMarc; 28 typedef struct FSMnode_t FSMnode; 29 30 #define DEBUG_WDADD 0 31 32 /* DEBUG_WDADD: 33 it's really hard to debug the incremental word addition feature 34 without being able to navigate through the graph structure, this 35 is enabled in msdev by a compilation that uses actual pointers 36 for arc and node references, arc and node pointers can be expanded 37 in visual studio, but the IDs (offsets into base pointers) cannot. 38 During dev, care should be take to keep the !DEBUG_WDADD fast 39 40 ItoX, XtoP, etc .. convert IDs to X to Ptrs, where 41 I ... means ID 42 P ... means pointer 43 X ... means ID or pointer, depending on DEBUG_WDADD 44 */ 45 46 #if DEBUG_WDADD 47 48 #define IF_DEBUG_WDADD(EXPRESSION) EXPRESSION 49 #define printf_arc printf_arc1 50 #define printf_node printf_node1 51 #define TO_NODE(ARC) (ARC)->to_node 52 #define NEXT_NODE(NOD) (NOD)->next_node 53 #define LINKL_NEXT(ARC) (ARC)->linkl_next_arc 54 #define LINKL_PREV(ARC) (ARC)->linkl_prev_arc 55 #define FIRST_PREV(NOD) (NOD)->first_prev_arc 56 #define FIRST_NEXT(NOD) (NOD)->first_next_arc 57 #define ARC_XtoP(ARC) (ARC) 58 #define ARC_XtoI(ARC) ((arcID)((ARC)-fst->FSMarc_list)) 59 #define ARC_PtoX(ARC) (ARC) 60 #define ARC_ItoX(ARC_ID) (&fst->FSMarc_list[ARC_ID]) 61 #define NODE_XtoP(NOD) (NOD) 62 #define NODE_XtoI(NOD) ((nodeID)((NOD)-fst->FSMnode_list)) 63 #define NODE_PtoX(NOD) (NOD) 64 #define NODE_ItoX(NODE_ID) (&fst->FSMnode_list[NODE_ID]) 65 #define FSMARC_NULL NULL 66 #define FSMNODE_NULL NULL 67 #define FSMARC_FREE (FSMarc*)0xffffffff 68 #define FSMNODE_FREE (FSMnode*)0xffffffff 69 70 #else 71 72 #define IF_DEBUG_WDADD(EXPRESSION) 73 #define printf_arc 74 #define printf_node 75 #define TO_NODE(ARC) fst->FSMarc_list[(ARC)].to_node 76 #define NEXT_NODE(NOD) fst->FSMnode_list[(NOD)].un_ptr.next_node 77 #define LINKL_NEXT(ARC) fst->FSMarc_list[(ARC)].linkl_next_arc 78 #define LINKL_PREV(ARC) fst->FSMarc_list[(ARC)].linkl_prev_arc 79 #define FIRST_PREV(NOD) fst->FSMnode_list[(NOD)].first_prev_arc 80 #define FIRST_NEXT(NOD) fst->FSMnode_list[(NOD)].un_ptr.first_next_arc 81 #define ARC_XtoP(ARC) (&fst->FSMarc_list[(ARC)]) 82 #define ARC_XtoI(ARC) ((arcID)(ARC)) 83 #define ARC_PtoX(ARC) ((arcID)((ARC)-fst->FSMarc_list)) 84 #define ARC_ItoX(ARC_ID) ((arcID)(ARC_ID)) 85 #define NODE_XtoP(NOD) (&fst->FSMnode_list[(NOD)]) 86 #define NODE_XtoI(NOD) ((nodeID)(NOD)) 87 #define NODE_PtoX(NOD) ((nodeID)((NOD)-fst->FSMnode_list)) 88 #define NODE_ItoX(NODE_ID) ((nodeID)(NODE_ID)) 89 #define FSMARC_NULL MAXarcID 90 #define FSMNODE_NULL MAXnodeID 91 #define FSMARC_FREE MAXarcID-1 92 93 #endif 94 95 #if DEBUG_WDADD 96 typedef FSMnode* FSMnode_ptr; 97 typedef FSMarc* FSMarc_ptr; 98 #else 99 typedef nodeID FSMnode_ptr; 100 typedef arcID FSMarc_ptr; 101 #endif 102 103 /** 104 * @todo document 105 */ 106 typedef struct FSMnode_t 107 { 108 union { 109 FSMarc_ptr first_next_arc; 110 FSMnode_ptr next_node; 111 } un_ptr; 112 FSMarc_ptr first_prev_arc; /* this can be removed if not doing addword */ 113 } 114 FSMnode_t; 115 116 /** 117 * @todo document 118 */ 119 typedef struct FSMarc_t 120 { 121 #if DEBUG_WDADD 122 char* ilabel_str; 123 char* olabel_str; 124 #endif 125 FSMnode_ptr to_node; 126 FSMarc_ptr linkl_next_arc; 127 128 FSMnode_ptr fr_node; /* this can be removed if not doing addword */ 129 FSMarc_ptr linkl_prev_arc; /* this can be removed if not doing addword */ 130 131 labelID ilabel; /* input label */ 132 labelID olabel; /* output label */ 133 costdata cost; 134 } 135 FSMarc_t; 136 137 /*according to Johan:*/ 138 #define EPSILON_OFFSET 3 139 #define EPSILON_LABEL 0 140 #define WORD_BOUNDARY 1 141 #define PHONE_BOUNDARY 2 142 143 /* */ 144 #define WORD_EPSILON_LABEL 0 145 146 147 148 149 #endif 150