xmlwriter.c

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

C
1,065
字号
/* 	goto STOP; *//*       } */    }  }  /* writing class label */  if (f->model.d[moNo]->model_type & GHMM_kLabeledStates) {    cLabel = f->model.d[moNo]->label[sNo];    rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "class", "%d", cLabel);    if (rc<0) {      GHMM_LOG(LERROR, "failed to write class label");      goto STOP;    }  }    /* duration (not implemented yet, maybe never */#if 0  if (f->model.d[moNo]->model_type & GHMM_kDurations) {    if (f->model.d[moNo]->duration[sNo] > 0) {      rc = xmlTextWriterWriteElement(writer, BAD_CAST "duration",				     BAD_CAST f->model.d[moNo]->duration[sNo]);      if (rc<0) {	GHMM_LOG(LERROR, "Error at xmlTextWriterWriteElement (duration)");	goto STOP;      }    }  }#endif  /* writing positions */  if ((f->model.d[moNo]->s[sNo].xPosition > 0)      && (f->model.d[moNo]->s[sNo].xPosition > 0)) {    if (xmlTextWriterStartElement(writer, BAD_CAST "position") < 0) {      GHMM_LOG(LERROR, "failed to start position element (position)"); goto STOP;}    if (0 > xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "x", "%d",					  f->model.d[moNo]->s[sNo].xPosition)) {      GHMM_LOG(LERROR, "failed to write x position"); goto STOP;}    if (0 > xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "y", "%d",					  f->model.d[moNo]->s[sNo].yPosition)) {      GHMM_LOG(LERROR, "failed to write y position"); goto STOP;}    if (xmlTextWriterEndElement(writer) < 0) {      GHMM_LOG(LERROR, "Error at xmlTextWriterEndElement (position)"); goto STOP;}  }  /* writing tied states */  if (f->model.d[moNo]->model_type & GHMM_kTiedEmissions) {    tied = f->model.d[moNo]->tied_to[sNo];    if (tied != GHMM_kUntied) {      rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "tiedTo", "%d", tied);      if (rc<0) {	GHMM_LOG(LERROR, "failed to write tiedTo element");	goto STOP;      }    }  }  return 0;STOP:  return -1;#undef CUR_PROC}/* ========================================================================= */static int writeDiscreteSwitchingStateContents(xmlTextWriterPtr writer,					       ghmm_xmlfile* f, int moNo,					       int sNo) {#define CUR_PROC "writeDiscreteSwitchingStateContents"  int bgId, cLabel, rc, order, tied;  char * tmp=NULL;  /* writing discrete distribution */  if (0 > xmlTextWriterStartElement(writer, BAD_CAST "discrete")) {    GHMM_LOG(LERROR, "Error at xmlTextWriterStartElement (discrete)");    goto STOP;  }  if (0 > xmlTextWriterWriteAttribute(writer, BAD_CAST "id", BAD_CAST "0")) {    GHMM_LOG(LERROR, "failed to write alphabet id");    goto STOP;  }  if (f->model.ds[moNo]->s[sNo].fix)    if (0 > xmlTextWriterWriteAttribute(writer, BAD_CAST "fixed", BAD_CAST "1")) {      GHMM_LOG(LERROR, "failed to write fixed attriute");      goto STOP;    }  if ((f->model.ds[moNo]->model_type & GHMM_kHigherOrderEmissions)      && f->model.ds[moNo]->order[sNo]) {    order = f->model.ds[moNo]->order[sNo];    if (0 > xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "order", "%d", order)) {      GHMM_LOG(LERROR, "failed to write order attribute for discrete distribution");      goto STOP;    }  } else    order = 0;  tmp = doubleArrayToCSV(f->model.ds[moNo]->s[sNo].b, pow(f->model.ds[moNo]->M, order+1));  if (tmp) {    if (0 > xmlTextWriterWriteRaw(writer, BAD_CAST tmp)) {      GHMM_LOG(LERROR, "Error at xmlTextWriterWriteRaw while writing"	       "discrete distribution CSV");      m_free(tmp);      goto STOP;    }    m_free(tmp);  } else {    GHMM_LOG(LERROR, "converting array to CSV failed for discrete distribution");    goto STOP;  }    /* end discrete distribution */  if (0 > xmlTextWriterEndElement(writer)) {    GHMM_LOG(LERROR, "Error at xmlTextWriterEndElement (discrete)");    goto STOP;  }  /* writing backgroung key */  if (f->model.ds[moNo]->model_type & GHMM_kBackgroundDistributions) {    bgId = f->model.ds[moNo]->background_id[sNo];    if (bgId != GHMM_kNoBackgroundDistribution) {      if (f->model.ds[moNo]->bp->name[bgId]) {	rc = xmlTextWriterWriteElement(writer, BAD_CAST "backgroundKey",				       BAD_CAST f->model.ds[moNo]->bp->name[bgId]);	if (rc<0) {	  GHMM_LOG(LERROR, "Error at xmlTextWriterWriteElement (backgroundKey)");	  goto STOP;	}      } else {	GHMM_LOG(LERROR, "background name is NULL pointer, invalid model");	goto STOP;      }    }  }  /* writing class label */  if (f->model.ds[moNo]->model_type & GHMM_kLabeledStates) {    cLabel = f->model.ds[moNo]->label[sNo];    rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "class", "%d", cLabel);    if (rc<0) {      GHMM_LOG(LERROR, "failed to write class label");      goto STOP;    }  }    /* duration (not implemented yet, maybe never */#if 0  if (f->model.ds[moNo]->model_type & GHMM_kDurations) {    if (f->model.ds[moNo]->duration[sNo] > 0) {      rc = xmlTextWriterWriteElement(writer, BAD_CAST "duration",				     BAD_CAST f->model.ds[moNo]->duration[sNo]);      if (rc<0) {	GHMM_LOG(LERROR, "Error at xmlTextWriterWriteElement (duration)");	goto STOP;      }    }  }#endif  /* writing positions */  if ((f->model.ds[moNo]->s[sNo].xPosition > 0)      && (f->model.ds[moNo]->s[sNo].xPosition > 0)) {    if (xmlTextWriterStartElement(writer, BAD_CAST "position") < 0) {      GHMM_LOG(LERROR, "failed to start position element (position)"); goto STOP;}    if (0 > xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "x", "%d",					  f->model.ds[moNo]->s[sNo].xPosition)) {      GHMM_LOG(LERROR, "failed to write x position"); goto STOP;}    if (0 > xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "y", "%d",					  f->model.ds[moNo]->s[sNo].yPosition)) {      GHMM_LOG(LERROR, "failed to write y position"); goto STOP;}    if (xmlTextWriterEndElement(writer) < 0) {      GHMM_LOG(LERROR, "Error at xmlTextWriterEndElement (position)"); goto STOP;}  }  /* writing tied states */  if (f->model.ds[moNo]->model_type & GHMM_kTiedEmissions) {    tied = f->model.ds[moNo]->tied_to[sNo];    if (tied != GHMM_kUntied) {      rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "tiedTo", "%d", tied);      if (rc<0) {	GHMM_LOG(LERROR, "failed to write tiedTo element");	goto STOP;      }    }  }  return 0;STOP:  return -1;#undef CUR_PROC}/* ========================================================================= */static int writeContinuousStateContents(xmlTextWriterPtr writer, ghmm_xmlfile* f,				      int moNo, int sNo) {#define CUR_PROC "writeContinuousStateContents"  int i;  int allFixed = 0;  char * estr; /* needed for WRITE_DOUBLE_ATTRIBUTE macro */  /* writing continuous distribution */  if (0 > xmlTextWriterStartElement(writer, BAD_CAST "mixture")) {    GHMM_LOG(LERROR, "Error at xmlTextWriterStartElement (mixture)");    goto STOP;  }  if (f->model.c[moNo]->s[sNo].fix)    allFixed = 1;  for(i=0; i < f->model.c[moNo]->s[sNo].M; i++){    switch (f->model.c[moNo]->s[sNo].density[i]) {      case normal:        if (0 > xmlTextWriterStartElement(writer, BAD_CAST "normal")) {          GHMM_LOG(LERROR, "Error at xmlTextWriterStartElement (normal)");          goto STOP;        }	WRITE_DOUBLE_ATTRIBUTE(writer, "mean", f->model.c[moNo]->s[sNo].mue[i]);	WRITE_DOUBLE_ATTRIBUTE(writer, "variance", f->model.c[moNo]->s[sNo].u[i]);        break;             case normal_left:        if (0 > xmlTextWriterStartElement(writer, BAD_CAST "normalTruncatedLeft")) {          GHMM_LOG(LERROR, "Error at xmlTextWriterStartElement (normalTruncatedLeft)");          goto STOP;        }	WRITE_DOUBLE_ATTRIBUTE(writer, "mean", f->model.c[moNo]->s[sNo].mue[i]);	WRITE_DOUBLE_ATTRIBUTE(writer, "variance", f->model.c[moNo]->s[sNo].u[i]);        WRITE_DOUBLE_ATTRIBUTE(writer, "min", f->model.c[moNo]->s[sNo].a[i]);        break;      case normal_right:             if (0 > xmlTextWriterStartElement(writer, BAD_CAST "normalTruncatedRight")) {          GHMM_LOG(LERROR, "Error at xmlTextWriterStartElement (normalTruncatedRight)");          goto STOP;        }	WRITE_DOUBLE_ATTRIBUTE(writer, "mean", f->model.c[moNo]->s[sNo].mue[i]);	WRITE_DOUBLE_ATTRIBUTE(writer, "variance", f->model.c[moNo]->s[sNo].u[i]);        WRITE_DOUBLE_ATTRIBUTE(writer, "max", f->model.c[moNo]->s[sNo].a[i]);        break;      case uniform:        if (0 > xmlTextWriterStartElement(writer, BAD_CAST "uniform")) {          GHMM_LOG(LERROR, "Error at xmlTextWriterStartElement (uniform)");          goto STOP;        }        WRITE_DOUBLE_ATTRIBUTE(writer, "min", f->model.c[moNo]->s[sNo].u[i]);        WRITE_DOUBLE_ATTRIBUTE(writer, "max", f->model.c[moNo]->s[sNo].mue[i]);        break;      default:        GHMM_LOG_PRINTF(LERROR, LOC, "invalid density %d at position %d", f->model.c[moNo]->s[sNo].density[i], i);	goto STOP;    }      /*optional values */     if (allFixed || f->model.c[moNo]->s[sNo].mixture_fix[i]){      if (0 > xmlTextWriterWriteAttribute(writer, BAD_CAST "fixed", BAD_CAST "1")) {	GHMM_LOG(LERROR, "failed to set fixed attribute"); 	goto STOP;      }    }    if (f->model.c[moNo]->s[sNo].M > 1){      WRITE_DOUBLE_ATTRIBUTE(writer, "prior", f->model.c[moNo]->s[sNo].c[i]);    }    if (0 > xmlTextWriterEndElement(writer)) {      GHMM_LOG(LERROR, "Error at xmlTextWriterEndElement (all densities)");      goto STOP;    }  }  /* end mixture tag */  if (0 > xmlTextWriterEndElement(writer)) {    GHMM_LOG(LERROR, "Error at xmlTextWriterEndElement (mixture)");    goto STOP;  }    /* writing positions */  if ((f->model.c[moNo]->s[sNo].xPosition > 0)      && (f->model.c[moNo]->s[sNo].yPosition > 0)) {    if (xmlTextWriterStartElement(writer, BAD_CAST "position") < 0) {      GHMM_LOG(LERROR, "failed to start position element (position)"); goto STOP;}    if (0 > xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "x", "%d",					  f->model.c[moNo]->s[sNo].xPosition)) {      GHMM_LOG(LERROR, "failed to write x position"); goto STOP;    }    if (0 > xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "y", "%d",					  f->model.c[moNo]->s[sNo].yPosition)) {      GHMM_LOG(LERROR, "failed to write y position"); goto STOP;}    if (xmlTextWriterEndElement(writer) < 0) {      GHMM_LOG(LERROR, "Error at xmlTextWriterEndElement (position)"); goto STOP;}  }  return 0;STOP:  return -1;#undef CUR_PROC}/* ========================================================================= */static int writeState(xmlTextWriterPtr writer, ghmm_xmlfile* f, int moNo, int sNo) {#define CUR_PROC "writeState"  int rc;  double w_pi;  unsigned char * w_desc=NULL;  char * estr; /* needed for WRITE_DOUBLE_ATTRIBUTE macro */  /* start state */  if (0 > xmlTextWriterStartElement(writer, BAD_CAST "state")) {    GHMM_LOG(LERROR, "Error at xmlTextWriterStartElement (state)");    goto STOP;  }  /* write id attribute */  if (0 > xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "id", "%d", sNo))    GHMM_LOG(LERROR, "failed to write statte id attribute");  /* read state attribute from different model types */  switch (f->modelType & PTR_TYPE_MASK) {  case GHMM_kDiscreteHMM:    w_pi = f->model.d[moNo]->s[sNo].pi;    w_desc = f->model.d[moNo]->s[sNo].desc;    break;  case (GHMM_kDiscreteHMM+GHMM_kTransitionClasses):    w_pi = f->model.ds[moNo]->s[sNo].pi;    w_desc = f->model.ds[moNo]->s[sNo].desc;    break;  case (GHMM_kDiscreteHMM+GHMM_kPairHMM):  case (GHMM_kDiscreteHMM+GHMM_kPairHMM+GHMM_kTransitionClasses):    /*    w_pi = f->model.d[moNo]->s[sNo].pi;    w_desc = f->model.d[moNo]->s[sNo];    */    break;  case GHMM_kContinuousHMM:  case (GHMM_kContinuousHMM+GHMM_kTransitionClasses):    w_pi = f->model.c[moNo]->s[sNo].pi;    w_desc = f->model.c[moNo]->s[sNo].desc;    break;  default:    GHMM_LOG(LCRITIC, "invalid modelType");}  /* write initial probability as attribute */  WRITE_DOUBLE_ATTRIBUTE(writer, "initial", w_pi);  /* write state description */  if (w_desc) {    if (xmlTextWriterWriteAttribute(writer, BAD_CAST "desc", BAD_CAST replaceXMLEntity(w_desc)))      GHMM_LOG(LERROR, "writing state description failed");  }  /* write state contents for different model types */  switch (f->modelType & PTR_TYPE_MASK) {  case GHMM_kDiscreteHMM:    rc = writeDiscreteStateContents(writer, f, moNo, sNo);

⌨️ 快捷键说明

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