/* CloneSTriMat: return a clone of given TriMat */ STriMat CloneSTriMat(MemHeap *hmem, STriMat s, Boolean sharing) { STriMat t; /* the target */ if (s==NULL) return NULL; if (GetUse(s)>0 && sharing) { IncUse(s); return s; } t = CreateSTriMat(hmem,TriMatSize(s)); CopyTriMat(s,t); return t; }
/* Initialise: load HMMs and create accumulators */ static void Initialise(void) { int s,V; Boolean eSep; char base[MAXSTRLEN]; char path[MAXSTRLEN]; char ext[MAXSTRLEN]; /* Load HMM defs */ if(MakeOneHMM(&hset,BaseOf(hmmfn,base))<SUCCESS) HError(2028,"Initialise: MakeOneHMM failed"); if(LoadHMMSet(&hset,PathOf(hmmfn,path),ExtnOf(hmmfn,ext))<SUCCESS) HError(2028,"Initialise: LoadHMMSet failed"); SetParmHMMSet(&hset); if (hset.hsKind==DISCRETEHS || hset.hsKind==TIEDHS) HError(2030,"Initialise: HCompV only uses continuous models"); /* Create a heap to store the input data */ /*CreateHeap(&iStack,"InBuf", MSTAK, 1, 0.5, 100000, LONG_MAX);*/ /* Get a pointer to the physical HMM */ hmmId = GetLabId(base,FALSE); macroLink = FindMacroName(&hset,'h',hmmId); if (macroLink==NULL) HError(2020,"Initialise: cannot find hmm %s in hset",hmmfn); hmmLink = (HLink)macroLink->structure; /* Find out for which streams full covariance is needed */ CheckVarianceKind( ); /* Create accumulators for the mean and variance */ for (s=1;s<=hset.swidth[0]; s++){ V = hset.swidth[s]; accs[s].meanSum=CreateVector(&gstack,V); ZeroVector(accs[s].meanSum); if (fullcNeeded[s]) { accs[s].squareSum.inv=CreateSTriMat(&gstack,V); accs[s].fixed.inv=CreateSTriMat(&gstack,V); ZeroTriMat(accs[s].squareSum.inv); } else { accs[s].squareSum.var=CreateSVector(&gstack,V); accs[s].fixed.var=CreateSVector(&gstack,V); ZeroVector(accs[s].squareSum.var); } } /* Create an object to hold the input parameters */ SetStreamWidths(hset.pkind,hset.vecSize,hset.swidth,&eSep); obs=MakeObservation(&gstack,hset.swidth,hset.pkind,FALSE,eSep); if(segLab != NULL) { segId = GetLabId(segLab,TRUE); } if (trace&T_TOP) { printf("Calculating Fixed Variance\n"); printf(" HMM Prototype: %s\n",hmmfn); printf(" Segment Label: %s\n",(segLab==NULL)?"None":segLab); printf(" Num Streams : %d\n",hset.swidth[0]); printf(" UpdatingMeans: %s\n",(meanUpdate)?"Yes":"No"); printf(" Target Direct: %s\n",(outDir==NULL)?"Current":outDir); } }