/* UCollectData: Collect data from segStore for each stream s of each state n and store in seqMat[n][s]*/ void UCollectData(Sequence **seqMat) { int i,j,s,numSegs,segLen; long int n; float obsPerState; Observation obs; Ptr p; numSegs = NumSegs(segStore); for (i=1;i<=numSegs;i++) { segLen=SegLength(segStore,i); obsPerState=((float) segLen)/((float) (nStates-2)); if (obsPerState < 1.0) HError(2122,"UCollectData: segment too short[%d]",segLen); for (j=1;j<=segLen;j++) { obs = GetSegObs(segStore,i,j); n = (long int)(((float)(j-1)/obsPerState)+2); for (s=1; s<=nStreams; s++){ if (hset.hsKind==DISCRETEHS){ p = (Ptr)((long int)obs.vq[s]); StoreItem(seqMat[n][s],p); }else StoreItem(seqMat[n][s],obs.fv[s]); } } } }
/* UCollectData: Collect data from segStore for each stream s of each state n and store in seqMat[n][s]*/ void UCollectData(Sequence ***seqMat) { int i,j,k,n,s,numSegs,segLen,order; float obsPerState; Observation obs; Ptr p; numSegs = NumSegs(segStore); for (i=1;i<=numSegs;i++) { segLen=SegLength(segStore,i); obsPerState=((float) segLen)/((float) (nStates-2)); if (obsPerState < 1.0) HError(2122,"UCollectData: segment too short[%d]",segLen); for (j=1;j<=segLen;j++) { obs = GetSegObs(segStore,i,j); n = (int)(((float)(j-1)/obsPerState)+2); for (s=1; s<=nStreams; s++){ if (hset.hsKind==DISCRETEHS){ p = (Ptr)((long)obs.vq[s]); StoreItem(seqMat[n][s][1],p); } else if(hset.msdflag[s]){ order = SpaceOrder(obs.fv[s]); if ((k = IncludeSpace(msdInfo[n][s],order))) StoreItem(seqMat[n][s][k],obs.fv[s]); else if(!ignOutVec) HError(2122,"UCollectData: no space corresponded to order[%d]",order); }else StoreItem(seqMat[n][s][1],obs.fv[s]); } } } }
/* EstimateModel: top level of iterative estimation process */ void EstimateModel(void) { LogFloat totalP,newP,delta; Boolean converged = FALSE; int i,iter,numSegs,segLen; IntVec states; /* array[1..numSegs] of State */ IntVec *mixes; /* array[1..S][1..numSegs] of MixComp */ if (trace&T_TOP) printf("Starting Estimation Process\n"); if (newModel){ UniformSegment(); } totalP=LZERO; for (iter=1; !converged && iter<=maxIter; iter++){ ZeroAccs(&hset, uFlags); /* Clear all accumulators */ numSegs = NumSegs(segStore); /* Align on each training segment and accumulate stats */ for (newP=0.0,i=1;i<=numSegs;i++) { segLen = SegLength(segStore,i); states = CreateIntVec(&gstack,segLen); mixes = (hset.hsKind==DISCRETEHS)?NULL: CreateMixes(&gstack,segLen); newP += ViterbiAlign(i,segLen,states,mixes); if (trace&T_ALN) ShowAlignment(i,segLen,states,mixes); UpdateCounts(i,segLen,states,mixes); FreeIntVec(&gstack,states); /* disposes mixes too */ } /* Update parameters or quit */ newP /= (float)numSegs; delta = newP - totalP; converged = (iter>1) && (fabs(delta) < epsilon); if (!converged) UpdateParameters(); totalP = newP; if (trace & T_TOP){ printf("Iteration %d: Average LogP =%12.5f",iter,totalP); if (iter > 1) printf(" Change =%12.5f\n",delta); else printf("\n"); fflush(stdout); } } if (trace&T_TOP) { if (converged) printf("Estimation converged at iteration %d\n",iter); else printf("Estimation aborted at iteration %d\n",iter); fflush(stdout); } }
/* LoadFile: load whole file or segments into segStore */ void LoadFile(char *fn) { BufferInfo info; char labfn[80]; Transcription *trans; long segStIdx,segEnIdx; static int segIdx=1; /* Between call handle on latest seg in segStore */ static int prevSegIdx=1; HTime tStart, tEnd; int i,k,s,ncas,nObs=0,segLen; LLink p; Observation obs; if((pbuf=OpenBuffer(&bufferStack, fn, 10, dff, FALSE_dup, FALSE_dup))==NULL) HError(2150,"LoadFile: Config parameters invalid"); GetBufferInfo(pbuf,&info); CheckData(fn,info); if (firstTime) InitSegStore(&info); if (segId == NULL) { /* load whole parameter file */ nObs = ObsInBuffer(pbuf); tStart = 0.0; tEnd = (info.tgtSampRate * nObs); LoadSegment(segStore, tStart, tEnd, pbuf); segIdx++; } else { /* load segment of parameter file */ MakeFN(fn,labDir,labExt,labfn); trans = LOpen(&transStack,labfn,lff); ncas = NumCases(trans->head,segId); if ( ncas > 0) { for (i=1,nObs=0; i<=ncas; i++) { p = GetCase(trans->head,segId,i); segStIdx = (long)(p->start/info.tgtSampRate); segEnIdx = (long)(p->end/info.tgtSampRate); if (segEnIdx >= ObsInBuffer(pbuf)) segEnIdx = ObsInBuffer(pbuf)-1; if (segEnIdx - segStIdx + 1 >= nStates-2) { LoadSegment(segStore, p->start, p->end, pbuf); if (trace&T_LD1) printf(" loading seg %s %f[%ld]->%f[%ld]\n",segId->name, p->start,segStIdx,p->end,segEnIdx); nObs += SegLength(segStore, segIdx); segIdx++; }else if (trace&T_LD1) printf(" seg %s %f->%f ignored\n",segId->name, p->start,p->end); } } } if (hset.hsKind == DISCRETEHS){ for (k=prevSegIdx; k<segIdx; k++){ segLen = SegLength(segStore, k); for (i=1; i<=segLen; i++){ obs = GetSegObs(segStore, k, i); for (s=1; s<=nStreams; s++){ if( (obs.vq[s] < 1) || (obs.vq[s] > maxMixInS[s])) HError(2150,"LoadFile: Discrete data value [ %d ] out of range in stream [ %d ] in file %s",obs.vq[s],s,fn); } } } prevSegIdx=segIdx; } if (trace&T_LD0) printf(" %d observations loaded from %s\n",nObs,fn); CloseBuffer(pbuf); ResetHeap(&transStack); }