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 + -
显示快捷键?