/* EXPORT->StoreVQTab: store VQTable in tabFN */ void StoreVQTab(VQTable vqTab, char *tabFN) { FILE *f; char *fn; short nid,s,sum; VQTable v=vqTab; VQNode n; fn = (tabFN==NULL)?vqTab->tabFN:tabFN; if ((f = fopen(fn,"w")) == NULL) HError(6111,"StoreVQTab: cannot create file %s",fn); /* Stamp each node with a unique id */ sum = 0; for (s=1; s<=v->swidth[0]; s++){ nid = 1; n = v->tree[s]; MarkTree(n,&nid); sum += (nid-1); } v->numNodes = sum; /* Write the Header */ fprintf(f,"%d %d %d %d %d ", v->magic,v->type,v->ckind,v->numNodes,v->swidth[0]); for (s=1; s<=v->swidth[0]; s++) fprintf(f,"%d ",v->swidth[s]); fprintf(f,"\n"); for (s=1; s<=v->swidth[0]; s++){ n = v->tree[s]; StoreTree(f,n,v->ckind,s); } fclose(f); }
/* StoreTree: store each node as an entry */ static void StoreTree(FILE *f, VQNode n, CovKind ck, short s) { if (n != NULL){ fprintf(f,"%d %d %d %d %d\n",s,n->vqidx,n->nid,n->lid,n->rid); WriteVector(f,n->mean,FALSE); switch(ck){ case NULLC: break; case INVDIAGC: WriteVector(f,(Vector)n->cov.var,FALSE); break; case FULLC: WriteTriMat(f,(TriMat)n->cov.inv,FALSE); break; } fprintf(f,"\n"); StoreTree(f,n->left,ck,s); StoreTree(f,n->right,ck,s); } }
void Pdb::SaveTree() { Value v = tree.Get(0); if(!IsType<NamedVal>(v)) return; const NamedVal& nv = ValueTo<NamedVal>(v); if(nv.val.type < 0) return; String w; Point p = tree.GetScroll(); w << p.x << ' ' << p.y << ' ' << tree.GetCursor() << ' ' << StoreTree(0); treetype.GetAdd(GetType(nv.val.type).name) = w; LOG("SaveTree " << GetType(nv.val.type).name << ' ' << w); }
String Pdb::StoreTree(int parent) { String result; int n = tree.GetChildCount(parent); for(int i = 0; i < n; i++) { int child = tree.GetChild(parent, i); if(tree.IsOpen(child)) { const NamedVal& nv = ValueTo<NamedVal>(tree.Get(child)); if(!IsNull(result)) result << ';'; result << nv.name; String w = StoreTree(child); if(!IsNull(w)) result << '{' << w << '}'; } } return result; }