[FeatureSet fs] setDesc   @../step5/featDesc
            fs  setAccess @../step2/featAccess

[CodebookSet cbs fs]                read ../step8/codebookSet
[DistribSet  dss cbs]               read ../step2/distribSet
[PhonesSet ps]                      read ../step2/phonesSet
[Tags tags]                         read ../step2/tags
[Tree dst ps:phones ps tags dss]    read ../step2/distribTree

SenoneSet sns [DistribStream str dss dst]

[TmSet tms]                         read ../step2/transitionModels
[TopoSet tps sns tms]               read ../step2/topologies
[Tree tpt ps:phones ps tags tps]    read ../step2/topologyTree
[DBase db]                          open ../step1/db.dat ../step1/db.idx -mode r
[Dictionary dict ps:phones tags]    read ../step1/convertedDict
[FMatrix ldaMatrix]                bload ../step5/ldaMatrix

AModelSet amo tpt ROOT
HMM hmm dict amo
Path path

cbs load ../step8/codebookWeights
dss load ../step8/distribWeights

cbs createAccus
dss createAccus

proc forcedAlignment {utt {method viterbi}} {
  set uttInfo [db get $utt]
  makeArray arr $uttInfo
  hmm make $arr(text) -optWord SIL
    if { $method != "labels" } { set score [path $method hmm -eval $uttInfo]
  } else { 
    set score [path bload ../step4/labels/$utt -hmm hmm]
    fs eval $uttInfo 
  }
  return score
}

foreach epoch {1 2 3} {

  cbs clearAccus
  dss clearAccus

  foreach utt [db] {
    puts  "$epoch:$utt [forcedAlignment $utt labels]"
    sns accu path
  }
  sns update

  cbs save codebookWeights.$epoch
  dss save  distribWeights.$epoch
}

exit