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