char *getMsgString(int messageID) { char *value, *v2 = NULL; char *key = messages[0].key; char *defaultMessage = messages[0].message; int i, len, len2; twchar_t wArray[MAXPATHLEN]; len = sizeof(messages)/sizeof(messages[0]); for (i=0; i<len; i++) { if (messages[i].id == messageID) { key = messages[i].key; defaultMessage = messages[i].message; break; } } if (msgs_inProgress) { /* double fault - error generating error msg return default*/ return defaultMessage; } msgs_inProgress = TRUE; if (!msgs_initialized) { initializeMessages(sysGetLocaleStr()); msgs_initialized = TRUE; } value = GetPropertyValue(MsgFileHead, key); if (value == NULL) { value = defaultMessage; } len2 = DecodeMessage(value, wArray); v2 = sysWideCharToMBCS(wArray, len2); msgs_inProgress = FALSE; if (v2 == NULL) { return defaultMessage; } else { return v2; } }
void InferenceEngineLoopyBP::computeBeliefs(Beliefs &beliefs, FeatureGenerator *fGen, DataSequence *X, Model *m, int bComputePartition, int seqLabel, bool bUseStatePerNodes) { // Get adjacency matrix; values indicate edge index (use upper triangle only) iMatrix adjMat; if( m->isMultiViewMode() ) m->getAdjacencyMatrixMV(adjMat, X); else { // Quick and dirty, but I don't want to change Model::makeChain() int edgeID = 1; adjMat.create(X->length(),X->length()); for(int r=1; r<adjMat.getHeight(); r++) { adjMat(r,r-1) = edgeID; adjMat(r-1,r) = edgeID; edgeID++; } } int adjMatMax = adjMat.getMaxValue(); // 1. Initialize beliefs initializeBeliefs(beliefs, X, m, adjMat); // 2. Initialize messages std::vector<dVector> messages, prev_messages; initializeMessages(messages, X, m, adjMat, adjMatMax, false); for(unsigned int i=0; i<messages.size(); i++) { dVector v; prev_messages.push_back(v); } // 3. Initialize potentials Beliefs potentials; initializePotentials(potentials, fGen, X, m, adjMat, seqLabel, bUseStatePerNodes); // 4. Update loopy belief network int T = X->length(); int V = m->getNumberOfViews(); int nbNodes = V*T; int *messageUpdateOrder = new int[nbNodes]; for(int iter=0; iter<m_max_iter; iter++) { // Get message update order getRandomUpdateOrder(messageUpdateOrder, X, m); // Update messages for( int i=0; i<nbNodes; i++ ) { int xi = messageUpdateOrder[i]; for( int xj=0; xj<nbNodes; xj++ ) { if( !adjMat(xi,xj) ) continue; sendMessage(xi,xj,nbNodes,potentials,messages,adjMat,adjMatMax,m->isMaxMargin()); } } // Convergence check if( iter>0 ) { double error = 0; for(unsigned int i=0; i<messages.size(); i++) for(int j=0; j<messages[i].getLength(); j++) error += fabs(messages[i][j] - prev_messages[i][j]); if( error < m_min_threshold ) break; } // Copy messages for(unsigned int i=0; i<messages.size(); i++) prev_messages[i] = messages[i]; } // Compute beliefs & compute partition updateBeliefs(nbNodes, beliefs, potentials, messages, adjMat, adjMatMax); // 5. Clean up and Return if( messageUpdateOrder ) { delete[] messageUpdateOrder; messageUpdateOrder = 0; } }