| 1 | /**CFile*********************************************************************** | 
|---|
| 2 |  | 
|---|
| 3 |   FileName    [markInProb.c] | 
|---|
| 4 |  | 
|---|
| 5 |   PackageName [mark] | 
|---|
| 6 |  | 
|---|
| 7 |   Synopsis    [Computation of transition probability matrix and convergence | 
|---|
| 8 |   checks in markov analysis.] | 
|---|
| 9 |  | 
|---|
| 10 |   Description [[Computation of transition probability matrix and convergence | 
|---|
| 11 |   checks in markov analysis.] | 
|---|
| 12 |  | 
|---|
| 13 |   Author      [Balakrishna Kumthekar] | 
|---|
| 14 |  | 
|---|
| 15 |   Copyright   [This file was created at the University of Colorado at | 
|---|
| 16 |   Boulder.  The University of Colorado at Boulder makes no warranty | 
|---|
| 17 |   about the suitability of this software for any purpose.  It is | 
|---|
| 18 |   presented on an AS IS basis.] | 
|---|
| 19 |  | 
|---|
| 20 | ******************************************************************************/ | 
|---|
| 21 |  | 
|---|
| 22 | #include "markInt.h" | 
|---|
| 23 |  | 
|---|
| 24 | /*---------------------------------------------------------------------------*/ | 
|---|
| 25 | /* Constant declarations                                                     */ | 
|---|
| 26 | /*---------------------------------------------------------------------------*/ | 
|---|
| 27 |  | 
|---|
| 28 |  | 
|---|
| 29 | /*---------------------------------------------------------------------------*/ | 
|---|
| 30 | /* Stucture declarations                                                     */ | 
|---|
| 31 | /*---------------------------------------------------------------------------*/ | 
|---|
| 32 |  | 
|---|
| 33 |  | 
|---|
| 34 | /*---------------------------------------------------------------------------*/ | 
|---|
| 35 | /* Type declarations                                                         */ | 
|---|
| 36 | /*---------------------------------------------------------------------------*/ | 
|---|
| 37 |  | 
|---|
| 38 |  | 
|---|
| 39 | /*---------------------------------------------------------------------------*/ | 
|---|
| 40 | /* Variable declarations                                                     */ | 
|---|
| 41 | /*---------------------------------------------------------------------------*/ | 
|---|
| 42 |  | 
|---|
| 43 |  | 
|---|
| 44 | /*---------------------------------------------------------------------------*/ | 
|---|
| 45 | /* Macro declarations                                                        */ | 
|---|
| 46 | /*---------------------------------------------------------------------------*/ | 
|---|
| 47 |  | 
|---|
| 48 |  | 
|---|
| 49 | /**AutomaticStart*************************************************************/ | 
|---|
| 50 |  | 
|---|
| 51 | /*---------------------------------------------------------------------------*/ | 
|---|
| 52 | /* Static function prototypes                                                */ | 
|---|
| 53 | /*---------------------------------------------------------------------------*/ | 
|---|
| 54 |  | 
|---|
| 55 |  | 
|---|
| 56 | /**AutomaticEnd***************************************************************/ | 
|---|
| 57 |  | 
|---|
| 58 |  | 
|---|
| 59 | /*---------------------------------------------------------------------------*/ | 
|---|
| 60 | /* Definition of exported functions                                          */ | 
|---|
| 61 | /*---------------------------------------------------------------------------*/ | 
|---|
| 62 |  | 
|---|
| 63 | /**Function******************************************************************** | 
|---|
| 64 |  | 
|---|
| 65 |   Synopsis    [Computes one-step transition probability matrix given the 0-1 | 
|---|
| 66 |   ADD of transition relation and a table of primary input probabiliites.] | 
|---|
| 67 |  | 
|---|
| 68 |   Description [Computes one-step transition probability matrix given the 0-1 | 
|---|
| 69 |   ADD of transition relation and a table of primary input probabiliites. tr is | 
|---|
| 70 |   the 0-1 ADD, cube is a cube of primary inputs and probTable is a hash table | 
|---|
| 71 |   that stores (<mdd_id>,<probability of x = 1>). The function returns the ADD | 
|---|
| 72 |   for one-step transition probability matrix.] | 
|---|
| 73 |  | 
|---|
| 74 |   SideEffects [None] | 
|---|
| 75 |  | 
|---|
| 76 |   SeeAlso     [] | 
|---|
| 77 |  | 
|---|
| 78 | ******************************************************************************/ | 
|---|
| 79 | bdd_node * | 
|---|
| 80 | Mark_addInProb( | 
|---|
| 81 |   bdd_manager *manager, | 
|---|
| 82 |   bdd_node *tr, | 
|---|
| 83 |   bdd_node *cube, | 
|---|
| 84 |   st_table *probTable) | 
|---|
| 85 | { | 
|---|
| 86 |     st_table *visited; | 
|---|
| 87 |     st_generator *gen; | 
|---|
| 88 |     bdd_node *result, *r, *k; | 
|---|
| 89 |  | 
|---|
| 90 |     do { | 
|---|
| 91 |         bdd_set_reordered_field(manager, 0); | 
|---|
| 92 |         visited = st_init_table(st_ptrcmp,st_ptrhash); | 
|---|
| 93 |         bdd_ref(result = bdd_read_one(manager)); | 
|---|
| 94 |         st_insert(visited,(char *)result,(char *)result); | 
|---|
| 95 |         bdd_ref(result = bdd_read_zero(manager)); | 
|---|
| 96 |         st_insert(visited,(char *)result,(char *)result); | 
|---|
| 97 |         result = MarkAddInProbRecur(manager,tr,cube,probTable,visited); | 
|---|
| 98 |         if (result) | 
|---|
| 99 |           bdd_ref(result); | 
|---|
| 100 |         st_foreach_item(visited,gen,&k,&r) { | 
|---|
| 101 |             bdd_recursive_deref(manager,r); | 
|---|
| 102 |         } | 
|---|
| 103 |         st_free_table(visited); | 
|---|
| 104 |     } while (bdd_read_reordered_field(manager) == 1); | 
|---|
| 105 |      | 
|---|
| 106 |     bdd_deref(result); | 
|---|
| 107 |     return(result); | 
|---|
| 108 |  | 
|---|
| 109 | } /* end of Mark_addInProb */ | 
|---|
| 110 |  | 
|---|
| 111 |  | 
|---|
| 112 | /*---------------------------------------------------------------------------*/ | 
|---|
| 113 | /* Definition of internal functions                                          */ | 
|---|
| 114 | /*---------------------------------------------------------------------------*/ | 
|---|
| 115 |  | 
|---|
| 116 | /**Function******************************************************************** | 
|---|
| 117 |  | 
|---|
| 118 |   Synopsis    [Implements the recursive step of Mark_addInProb.] | 
|---|
| 119 |  | 
|---|
| 120 |   Description [Implements the recursive step of Mark_addInProb.] | 
|---|
| 121 |  | 
|---|
| 122 |   SideEffects [None] | 
|---|
| 123 |  | 
|---|
| 124 |   SeeAlso     [] | 
|---|
| 125 |  | 
|---|
| 126 | ******************************************************************************/ | 
|---|
| 127 | bdd_node * | 
|---|
| 128 | MarkAddInProbRecur( | 
|---|
| 129 |   bdd_manager *manager, | 
|---|
| 130 |   bdd_node *tr, | 
|---|
| 131 |   bdd_node *cube, | 
|---|
| 132 |   st_table *probTable, | 
|---|
| 133 |   st_table *visited) | 
|---|
| 134 | { | 
|---|
| 135 |     int topTR,topC; | 
|---|
| 136 |     int index; | 
|---|
| 137 |     double *prob; | 
|---|
| 138 |     bdd_node *solT,*solE; | 
|---|
| 139 |     bdd_node *solPT,*solPE; | 
|---|
| 140 |     bdd_node *result; | 
|---|
| 141 |     bdd_node *unique; | 
|---|
| 142 |  | 
|---|
| 143 |     /* lookup in the cache */ | 
|---|
| 144 |     if(st_lookup(visited,tr,&result))  | 
|---|
| 145 |         return(result); | 
|---|
| 146 |  | 
|---|
| 147 |     /* the cube is one then return */ | 
|---|
| 148 |     if ( cube == bdd_read_one(manager))  | 
|---|
| 149 |         return tr; | 
|---|
| 150 |  | 
|---|
| 151 |     /* Obtain the top variable indexes */ | 
|---|
| 152 |     topTR = bdd_get_level_from_id(manager,bdd_node_read_index(tr)); | 
|---|
| 153 |     topC = bdd_get_level_from_id(manager,bdd_node_read_index(cube)); | 
|---|
| 154 |  | 
|---|
| 155 |     /* The function does not depend on the top variable of the cube */ | 
|---|
| 156 |     if (topTR > topC ) { | 
|---|
| 157 |         result = MarkAddInProbRecur(manager,tr,bdd_bdd_T(cube),probTable,visited); | 
|---|
| 158 |         return(result); | 
|---|
| 159 |     } | 
|---|
| 160 |  | 
|---|
| 161 |     /* If both top variables are equal, solve subproblems and combine */ | 
|---|
| 162 |     if (topTR == topC ) { | 
|---|
| 163 |         solT = MarkAddInProbRecur(manager,bdd_bdd_T(tr),bdd_bdd_T(cube), | 
|---|
| 164 |                                   probTable,visited); | 
|---|
| 165 |         if (solT == NULL) { | 
|---|
| 166 |             return NULL; | 
|---|
| 167 |         } | 
|---|
| 168 |         bdd_ref(solT); | 
|---|
| 169 |         solE = MarkAddInProbRecur(manager,bdd_bdd_E(tr),bdd_bdd_T(cube), | 
|---|
| 170 |                                   probTable,visited); | 
|---|
| 171 |         if (solE == NULL) { | 
|---|
| 172 |             bdd_recursive_deref(manager,solT); | 
|---|
| 173 |             return NULL; | 
|---|
| 174 |         } | 
|---|
| 175 |         bdd_ref(solE); | 
|---|
| 176 |         index = bdd_node_read_index(cube); | 
|---|
| 177 |         st_lookup(probTable,(char *)(long)index,&prob); | 
|---|
| 178 |         unique = bdd_add_const(manager,*prob); | 
|---|
| 179 |         if(unique == NULL) { | 
|---|
| 180 |             bdd_recursive_deref(manager,solT); | 
|---|
| 181 |             bdd_recursive_deref(manager,solE); | 
|---|
| 182 |             return NULL; | 
|---|
| 183 |         } | 
|---|
| 184 |         bdd_ref(unique); | 
|---|
| 185 |         solPT = bdd_add_apply_recur(manager,bdd_add_times,solT,unique); | 
|---|
| 186 |         if (solPT == NULL) { | 
|---|
| 187 |             bdd_recursive_deref(manager,solT); | 
|---|
| 188 |             bdd_recursive_deref(manager,solE); | 
|---|
| 189 |             bdd_recursive_deref(manager,unique); | 
|---|
| 190 |             return NULL; | 
|---|
| 191 |         } | 
|---|
| 192 |         bdd_ref(solPT); | 
|---|
| 193 |         bdd_recursive_deref(manager,unique); | 
|---|
| 194 |         bdd_recursive_deref(manager,solT); | 
|---|
| 195 |         unique = bdd_add_const(manager,1.0 - *prob); | 
|---|
| 196 |         if (unique == NULL) { | 
|---|
| 197 |             bdd_recursive_deref(manager,solE); | 
|---|
| 198 |             bdd_recursive_deref(manager,solPT); | 
|---|
| 199 |             return NULL; | 
|---|
| 200 |         } | 
|---|
| 201 |         bdd_ref(unique); | 
|---|
| 202 |         solPE = bdd_add_apply_recur(manager,bdd_add_times,solE,unique); | 
|---|
| 203 |         if (solPE == NULL) { | 
|---|
| 204 |             bdd_recursive_deref(manager,unique); | 
|---|
| 205 |             bdd_recursive_deref(manager,solPT); | 
|---|
| 206 |             bdd_recursive_deref(manager,solE); | 
|---|
| 207 |             return NULL; | 
|---|
| 208 |         } | 
|---|
| 209 |         bdd_ref(solPE); | 
|---|
| 210 |         bdd_recursive_deref(manager,unique); | 
|---|
| 211 |         bdd_recursive_deref(manager,solE); | 
|---|
| 212 |         result = bdd_add_apply_recur(manager,bdd_add_plus,solPT,solPE); | 
|---|
| 213 |         if (result == NULL) { | 
|---|
| 214 |             bdd_recursive_deref(manager,solPT); | 
|---|
| 215 |             bdd_recursive_deref(manager,solPE); | 
|---|
| 216 |             return NULL; | 
|---|
| 217 |         } | 
|---|
| 218 |         bdd_ref(result); | 
|---|
| 219 |         bdd_recursive_deref(manager,solPE); | 
|---|
| 220 |         bdd_recursive_deref(manager,solPT); | 
|---|
| 221 |         st_insert(visited,(char *)tr,(char *)result); | 
|---|
| 222 |         /* bdd_deref(result); */ | 
|---|
| 223 |         return(result); | 
|---|
| 224 |     } | 
|---|
| 225 |      | 
|---|
| 226 |     /* Split on a state variable, solve subproblems and combine by ite */ | 
|---|
| 227 |     solT = MarkAddInProbRecur(manager,bdd_bdd_T(tr),cube, probTable,visited); | 
|---|
| 228 |     if (solT == NULL) { | 
|---|
| 229 |         return NULL; | 
|---|
| 230 |     } | 
|---|
| 231 |     bdd_ref(solT); | 
|---|
| 232 |     solE = MarkAddInProbRecur(manager,bdd_bdd_E(tr),cube, | 
|---|
| 233 |                               probTable,visited); | 
|---|
| 234 |     if (solE == NULL) { | 
|---|
| 235 |         bdd_recursive_deref(manager,solT); | 
|---|
| 236 |         return NULL; | 
|---|
| 237 |     } | 
|---|
| 238 |     bdd_ref(solE); | 
|---|
| 239 |     result = bdd_unique_inter(manager,bdd_node_read_index(tr), | 
|---|
| 240 |                               solT,solE); | 
|---|
| 241 |     if (result == NULL) { | 
|---|
| 242 |         bdd_recursive_deref(manager,solT); | 
|---|
| 243 |         bdd_recursive_deref(manager,solE); | 
|---|
| 244 |         return NULL; | 
|---|
| 245 |     } | 
|---|
| 246 |     bdd_ref(result); | 
|---|
| 247 |     bdd_recursive_deref(manager,solT); | 
|---|
| 248 |     bdd_recursive_deref(manager,solE); | 
|---|
| 249 |     st_insert(visited,(char *)tr,(char *)result); | 
|---|
| 250 |     /* bdd_deref(result); */ | 
|---|
| 251 |     return(result); | 
|---|
| 252 |  | 
|---|
| 253 | } /* end of MarkAddInProbRecur */ | 
|---|
| 254 |  | 
|---|
| 255 |  | 
|---|
| 256 | /*---------------------------------------------------------------------------*/ | 
|---|
| 257 | /* Definition of static functions                                            */ | 
|---|
| 258 | /*---------------------------------------------------------------------------*/ | 
|---|
| 259 |  | 
|---|