예제 #1
0
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;
  }
}