xmlwriter.c

来自「General Hidden Markov Model Library 一个通用」· C语言 代码 · 共 1,065 行 · 第 1/3 页

C
1,065
字号
    break;  case (GHMM_kDiscreteHMM+GHMM_kTransitionClasses):    rc = writeDiscreteSwitchingStateContents(writer, f, moNo, sNo);    break;  case (GHMM_kDiscreteHMM+GHMM_kPairHMM):  case (GHMM_kDiscreteHMM+GHMM_kPairHMM+GHMM_kTransitionClasses):    /*    rc = writeDiscretePairStateContents(writer, f, moNo, sNo);    */    break;  case GHMM_kContinuousHMM:  case (GHMM_kContinuousHMM+GHMM_kTransitionClasses):    rc = writeContinuousStateContents(writer, f, moNo, sNo);    break;  default:    GHMM_LOG(LCRITIC, "invalid modelType");}  if (rc) {    GHMM_LOG(LERROR, "writing state contents failed");    goto STOP;  }   /* end state*/  if (0 > xmlTextWriterEndElement(writer)) {    GHMM_LOG(LERROR, "Error at xmlTextWriterEndElement (state)");    goto STOP;  }  return 0;STOP:  return -1;#undef CUR_PROC}/* ========================================================================= */static int writeTransition(xmlTextWriterPtr writer, ghmm_xmlfile* f, int moNo,			   int sNo) {#define CUR_PROC "writeTransition"  int cos, i, j;  int out_states, * out_id;  double * * out_a;  double * w_out_a;  char * tmp;  ARRAY_MALLOC(w_out_a, cos);  /* write state contents for different model types */  switch (f->modelType & PTR_TYPE_MASK) {  case GHMM_kDiscreteHMM:    out_states = f->model.d[moNo]->s[sNo].out_states;    out_id     = f->model.d[moNo]->s[sNo].out_id;    out_a      = &(f->model.d[moNo]->s[sNo].out_a);    cos        = 1;    break;  case (GHMM_kDiscreteHMM+GHMM_kTransitionClasses):    out_states = f->model.ds[moNo]->s[sNo].out_states;    out_id     = f->model.ds[moNo]->s[sNo].out_id;    out_a      = f->model.ds[moNo]->s[sNo].out_a;    cos        = f->model.ds[moNo]->cos;    break;  case (GHMM_kDiscreteHMM+GHMM_kPairHMM):  case (GHMM_kDiscreteHMM+GHMM_kPairHMM+GHMM_kTransitionClasses):    /*    out_states = f->model.dp[moNo]->s[sNo].out_states;    out_id     = f->model.dp[moNo]->s[sNo].out_id;    out_a      = f->model.dp[moNo]->s[sNo].out_a;    cos        = f->model.dp[moNo]->cos;    */    break;  case GHMM_kContinuousHMM:  case (GHMM_kContinuousHMM+GHMM_kTransitionClasses):    out_states = f->model.c[moNo]->s[sNo].out_states;    out_id     = f->model.c[moNo]->s[sNo].out_id;    out_a      = f->model.c[moNo]->s[sNo].out_a;    cos        = f->model.c[moNo]->cos;    break;  default:    GHMM_LOG(LCRITIC, "invalid modelType");}  for (i=0; i<out_states; i++) {    if (0 > xmlTextWriterStartElement(writer, BAD_CAST "transition")) {      GHMM_LOG(LERROR, "Error at xmlTextWriterStartElement (transition)");      goto STOP;    }    /* write source id (current state attribute */    if (0 > xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "source", "%d", sNo))      GHMM_LOG(LERROR, "failed to write transition source attribute");    /* write target id as attribute */    if (0 > xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "target", "%d", out_id[i]))      GHMM_LOG(LERROR, "failed to write transition target attribute");    for (j=0; j<cos; j++)      w_out_a[j] = out_a[j][i];    tmp = doubleArrayToCSV(w_out_a, cos);    if (tmp) {      if (0 > xmlTextWriterWriteElement(writer, BAD_CAST "probability", BAD_CAST tmp)) {	GHMM_LOG(LERROR, "Error at xmlTextWriterWriteElement (transition probabilities)");	m_free(tmp);	goto STOP;      }      m_free(tmp);          } else {      GHMM_LOG(LERROR, "converting transition probabilities array to CSV failed");      goto STOP;    }    /* end transition */    if (0 > xmlTextWriterEndElement(writer)) {      GHMM_LOG(LERROR, "Error at xmlTextWriterEndElement (transition)");      goto STOP;    }  }  return 0;STOP:  return -1;#undef CUR_PROC}/* ========================================================================= */static int writeHMM(xmlTextWriterPtr writer, ghmm_xmlfile* f, int number) {#define CUR_PROC "writeHMM"  int rc=0, i, N;  int w_cos;  double w_prior;  unsigned char * w_name;  char * w_type;  char * estr; /* needed for WRITE_DOUBLE_ATTRIBUTE macro */  /* start HMM */  if (0 > xmlTextWriterStartElement(writer, BAD_CAST "HMM")) {    GHMM_LOG(LERROR, "Error at xmlTextWriterStartElement (HMM)");    goto STOP;;  }  /* write HMM attributes applicable */  switch (f->modelType & PTR_TYPE_MASK) {  case GHMM_kDiscreteHMM:    w_name  = f->model.d[number]->name;    w_type  = strModeltype(f->model.d[number]->model_type);    w_prior = f->model.d[number]->prior;    N       = f->model.d[number]->N;    w_cos   = 1;    break;  case (GHMM_kDiscreteHMM+GHMM_kTransitionClasses):    w_name  = f->model.ds[number]->name;    w_type  = strModeltype(f->model.ds[number]->model_type);    w_prior = f->model.ds[number]->prior;    N       = f->model.ds[number]->N;    w_cos   = 0;    break;  case (GHMM_kDiscreteHMM+GHMM_kPairHMM):  case (GHMM_kDiscreteHMM+GHMM_kPairHMM+GHMM_kTransitionClasses):    /*    w_name  = f->model.dp[number]->name;    w_type  = strModeltype(f->model.dp[number]->model_type);    w_prior = f->model.dp[number]->prior;    N       = f->model.dp[number]->N;    w_cos   = 0;    */    break;  case GHMM_kContinuousHMM:  case (GHMM_kContinuousHMM+GHMM_kTransitionClasses):    w_name  = f->model.c[number]->name;    if (f->model.c[number]->model_type)      w_type  = strModeltype(f->model.c[number]->model_type);    else      w_type  = strModeltype(f->modelType);    w_prior = f->model.c[number]->prior;    N       = f->model.c[number]->N;    w_cos   = f->model.c[number]->cos;    break;  default:    GHMM_LOG(LERROR, "invalid modelType");    goto STOP;}  if (w_name) {    if (xmlTextWriterWriteAttribute(writer, BAD_CAST "name", w_name))      GHMM_LOG(LERROR, "writing HMM name failed");  }  if (xmlTextWriterWriteAttribute(writer, BAD_CAST "type", BAD_CAST w_type))    GHMM_LOG(LERROR, "writing HMM type failed");  if (w_prior >= 0.0) {    WRITE_DOUBLE_ATTRIBUTE(writer, "prior", w_prior);  }  if (w_cos > 1)    if (0 > xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "transitionClasses",					      "%d", w_cos))      GHMM_LOG(LERROR, "failed to write no of transitionClasses");    /* write alphabet if applicable */  switch (f->modelType & (GHMM_kDiscreteHMM + GHMM_kTransitionClasses			  + GHMM_kPairHMM)) {  case GHMM_kDiscreteHMM:    rc = writeAlphabet(writer, f->model.d[number]->alphabet, kAlphabet);    break;  case (GHMM_kDiscreteHMM+GHMM_kTransitionClasses):    /*rc = writeAlphabet(writer, f->model.ds[number]->alphabet, kAlphabet);*/    break;  case (GHMM_kDiscreteHMM+GHMM_kPairHMM):  case (GHMM_kDiscreteHMM+GHMM_kPairHMM+GHMM_kTransitionClasses):    /*rc = writeAlphabet(writer, f->model.dp[number]->alphabets[0], kAlphabet);    if (rc) {      GHMM_LOG(LERROR, "writing first alphabet of discrete pair HMM failed");      goto STOP;    }    rc = writeAlphabet(writer, f->model.dp[number]->alphabets[1], kAlphabet);*/    break;  }  if (rc) {    estr = ighmm_mprintf(NULL, 0, "writing alphabet for HMM %d (type %d) failed");    GHMM_LOG(LERROR, estr);    m_free(estr);  }  /* write label alphabet if applicable */  if ((f->modelType & PTR_TYPE_MASK) == GHMM_kDiscreteHMM      && f->modelType & GHMM_kLabeledStates) {    if (writeAlphabet(writer, f->model.d[number]->label_alphabet, kLabelAlphabet))      GHMM_LOG(LERROR, "writing of label alphabet failed");  }  /* write background distributions if applicable */  if ((f->modelType & PTR_TYPE_MASK) == GHMM_kDiscreteHMM      && f->modelType & GHMM_kBackgroundDistributions) {    if (writeBackground(writer, f->model.d[number]->bp))      GHMM_LOG(LERROR, "writing of background distributions failed");  }  /* write all states */  for (i=0; i<N; i++)    if (writeState(writer, f, number, i)) {      estr = ighmm_mprintf(NULL, 0, "writing of state %d in HMM %d failed", i, number);      GHMM_LOG(LERROR, estr);      m_free(estr);      goto STOP;    }  /* write all outgoing transitions */  for (i=0; i<N; i++)    if (writeTransition(writer, f, number, i)) {      estr = ighmm_mprintf(NULL, 0, "writing transitions of state %d in HMM %d failed",			   i, number);      GHMM_LOG(LERROR, estr);      m_free(estr);      goto STOP;    }        /*end HMM*/  if (0 > xmlTextWriterEndElement(writer)) {    GHMM_LOG(LERROR, "Error at xmlTextWriterEndElement (HMM)");    goto STOP;  }  return 0;STOP:  return -1;#undef CUR_PROC}/* ========================================================================= */void ghmm_xmlfile_write(ghmm_xmlfile* f, const char *file) {#define CUR_PROC "ghmm_xmlfile_write"  int rc, i;  xmlTextWriterPtr writer;  xmlDocPtr doc;    /*   * this initialize the library and check potential ABI mismatches   * between the version it was compiled for and the actual shared   * library used.   */  LIBXML_TEST_VERSION    xmlSubstituteEntitiesDefault(1);  /* Create a new XmlWriter for DOM, with no compression. */  writer = xmlNewTextWriterDoc(&doc, 0);  if (writer == NULL) {    GHMM_LOG(LERROR, "can not create the xml writer");    goto STOP;  }  /* indenting writer to circumvent no space between SYSTEM and PUBLIC identifier */  xmlTextWriterSetIndent(writer, 1);  /* Start the document with the xml default for the version,   * encoding ISO 8859-1 and the default for the standalone   * declaration. */  rc = xmlTextWriterStartDocument(writer, NULL, MY_ENCODING, NULL);  if (rc < 0) {    GHMM_LOG(LERROR, "Error at xmlTextWriterStartDocument\n");    goto STOP;  }  /* Set the Document type declaration at the beginning of the document */  rc = xmlTextWriterWriteDTD(writer, BAD_CAST "mixture",			     BAD_CAST "-//ghmm.org//DOCUMENT ghmm V"DTD_VERSION"//EN",			     BAD_CAST "http://ghmm.sourceforge.net/xml/"DTD_VERSION"/ghmm.dtd",			     NULL);  if (rc < 0) {    GHMM_LOG(LERROR, "failed to write the DocType"); goto STOP;}  /* start real contents */  if (0 > xmlTextWriterStartElement(writer, BAD_CAST "mixture")) {    GHMM_LOG(LERROR, "Error at xmlTextWriterStartElement (mixture)");    goto STOP;;  }  if (xmlTextWriterWriteAttribute(writer, BAD_CAST "version", BAD_CAST DTD_VERSION) < 0) {    GHMM_LOG(LERROR, "failed to write version 1.0"); goto STOP;}  if (0 > xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "noComponents", "%d", f->noModels)) {    GHMM_LOG(LERROR, "failed to write the number of components"); goto STOP;}  /* write all models */  for (i=0; i<f->noModels; i++)    writeHMM(writer, f, i);  /* end mixture */  if (0 > xmlTextWriterEndDocument(writer)) {    GHMM_LOG(LERROR, "Error at xmlTextWriterEndDocument (mixture)");    goto STOP;  }  xmlFreeTextWriter(writer);  xmlSaveFormatFileEnc(file, doc, MY_ENCODING, 1);STOP:  xmlFreeDoc(doc);  /*   * Cleanup function for the XML library.   */  xmlCleanupParser();  /*   * this is to debug memory for regression tests   */  xmlMemoryDump();#undef CUR_PROC}#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?