/* ClusterVecs: apply required clustering to vectors in stream s */ void ClusterVecs(Sequence *seq, int s) { switch(tType) { case binTree: cs[s] = TreeCluster(&cStack,seq[s],cbSizes[s],ck,ck,cov[s]); break; case linTree: cs[s] = FlatCluster(&cStack,seq[s],cbSizes[s],ck,ck,cov[s]); break; default: HError(2590,"ClusterVecs: Unsupported tree type %d",tType); } if(trace&T_CLUST) ShowClusterSet(cs[s]); }
/* UniformSegment: and cluster within each state/segment */ void UniformSegment(void) { Sequence **seqMat; /* Matrix [2..numStates-1][1..numStreams]*/ Sequence seq; int count,size,i,s,n,m,M,j,k; long int vqidx; ClusterSet *cset; Cluster *c; StreamElem *ste; Covariance cov; CovKind ck; MixPDF *mp; TMixRec *tmRec = NULL; ShortVec dw; float x,z; Vector floor; if (trace & T_UNI) printf(" Uniform Segmentation\n"); seqMat = CreateSeqMat(); cov.var = NULL; /* dummy */ UCollectData(seqMat); if (trace&T_UNI) ShowSeqMat(seqMat); /* Cluster Each State/Stream and Init HMM Parms */ for (n=2; n<nStates; n++) { if (trace&T_UNI) printf(" state %d ",n); for (s=1; s<=nStreams; s++){ size = hset.swidth[s]; floor = vFloor[s]; ste = hmmLink->svec[n].info->pdf+s; if (hset.hsKind == TIEDHS){ tmRec = &(hset.tmRecs[s]); M = tmRec->nMix; tmRec->topM = tmRec->nMix; } else M = ste->nMix; if (trace&T_UNI) printf(" stream %d\n",s); seq = seqMat[n][s]; switch (hset.hsKind){ case PLAINHS: case SHAREDHS: ck = ste->spdf.cpdf[1].mpdf->ckind; cset = FlatCluster(&clustSetStack,seq,M,NULLC,ck,cov); if (trace&T_UNI) ShowClusterSet(cset); for (m=1; m<=M; m++){ mp = ste->spdf.cpdf[m].mpdf; if (mp->ckind != ck) HError(2123,"UniformSegment: different covkind within a mix\n"); c = cset->cl+m; if (uFlags&UPMIXES) ste->spdf.cpdf[m].weight = (float)c->csize/(float)seq->nItems; if (uFlags&UPMEANS) CopyVector(c->vCtr,mp->mean); if (uFlags&UPVARS) switch(ck){ case DIAGC: for (j=1; j<=size; j++){ z= c->cov.var[j]; mp->cov.var[j] = (z<floor[j])?floor[j]:z; } break; case FULLC: for (j=1; j<=size; j++){ for (k=1; k<j; k++) { mp->cov.inv[j][k] = c->cov.inv[j][k]; } z = c->cov.inv[j][j]; mp->cov.inv[j][j] = (z<floor[j])?floor[j]:z; } break; default: HError(2124,"UniformSegment: bad cov kind %d\n",ck); } } break; case DISCRETEHS: count = 0; dw = ste->spdf.dpdf; ZeroShortVec(dw); for (i=1; i<=seq->nItems; i++){ vqidx = (long int)GetItem(seq,i); if (vqidx<1 || vqidx>M) HError(2170,"UniformSegment: vqidx out of range[%ld]",vqidx); ++dw[vqidx]; ++count; } for (m=1; m<=M; m++){ x = (float)dw[m]/(float)count; if (x<mixWeightFloor) x = mixWeightFloor; dw[m] = DProb2Short(x); } break; case TIEDHS: ck = tmRec->mixes[1]->ckind; cset = FlatCluster(&clustSetStack,seq,M,NULLC,ck,cov); if (trace&T_UNI) ShowClusterSet(cset); for (m=1; m<=M; m++){ mp = tmRec->mixes[m]; if (mp->ckind != ck) HError(2123,"UniformSegment: different covkind within a mix\n"); c = cset->cl+m; if (uFlags&UPMIXES) ste->spdf.tpdf[m] = (float)c->csize/(float)seq->nItems; if (uFlags&UPMEANS) CopyVector(c->vCtr,mp->mean); if (uFlags&UPVARS) switch(ck){ case DIAGC: for (j=1; j<=size; j++){ z= c->cov.var[j]; mp->cov.var[j] = (z<floor[j])?floor[j]:z; } break; case FULLC: for (j=1; j<=size; j++){ for (k=1; k<j; k++) { mp->cov.inv[j][k] = c->cov.inv[j][k]; } z = c->cov.inv[j][j]; mp->cov.inv[j][j] = (z<floor[j])?floor[j]:z; } break; default: HError(2124,"UniformSegment: bad cov kind %d\n",ck); } } break; } ResetHeap(&clustSetStack); } if ((hset.hsKind == PLAINHS) || (hset.hsKind == SHAREDHS)) FixGConsts(hmmLink); } ResetHeap(&sequenceStack); }