[FeatureSet fs] setDesc @../step5/featDesc
[CodebookSet cbs fs] read ../step8/codebookSet
[DistribSet dss cbs] read ../step10/distribSet
[Tags tags] read ../step2/tags
[PhonesSet ps] read phonesSet
[QuestionSet qs ps:phones ps tags] read questionSet
Tree dst ps:phones ps tags dss
dst.ptreeSet read ../step10/ptreeSet
dst read ../step10/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
qs configure -padPhone pad
dst configure -padPhone pad
dss load ../step11/distribWeights.2
dss configure -minCount 250
proc findQuestion { tree node qs parent nodesA countA } {
upvar $countA count
upvar $nodesA nodes
if { [set p [$tree:$node configure -ptree]] >= 0} {
set c [$tree.ptreeSet.item($p) configure -count]
set question [$tree question $node -questionSet $qs]
set score [lindex $question 1]
set question [lindex $question 0]
if { [string length $question] } {
lappend nodes($score) [list $node $parent $question $c]
if {! [info exist count($parent)]} {set count($parent) 0}
}
}
}
puts "=============== starting with splitting tree nodes ====================="
foreach node [dst:] { findQuestion dst $node qs $node nodes count }
set scores [lsort -real -decreasing [array names nodes]]
while { [llength $scores] } {
set score [lindex $scores 0]
set nlist $nodes($score)
unset nodes([lindex $scores 0])
foreach node $nlist {
set name [lindex $node 0]
set par [lindex $node 1]
set quest [lindex $node 2]
set cnt [lindex $node 3]
if { [string length $quest] } {
set c $count($par)
puts "$name $quest ($score) ${par}($c) -> ([expr $c+1]) ([expr $c+2])"
dst split $name $quest ${par}($c) ${par}([expr $c+1]) ${par}([expr $c+2])
incr count($par) 3
for {} { $c < $count($par)} { incr c} {
if { [set idx [dst index ${par}($c)]] > -1} {
findQuestion dst ${par}($c) qs $par nodes count
}
}
}
}
if [array exists nodes] {
set scores [lsort -real -decreasing [array names nodes]]
} else { set scores {}}
}
dst write distribTreeClustered
dst.ptreeSet write ptreeSetClustered
puts "====================== introducing new models =========================="
set itemN [dst configure -itemN]
for { set i 0} { $i < $itemN} { incr i} {
if { [set ptree [dst.item($i) configure -ptree]] > -1} {
set node [dst.item($i) configure -name]
dst.ptreeSet.item($ptree) models [ModelArray dtabMA dss]
if { [llength [set models [dtabMA puts]]] } {
cbs add $node LDA 16 12 DIAGONAL
cbs:$node := cbs.item([dss:[lindex [lindex $models 0] 0] configure -cbX])
set cbX [cbs index $node]
foreach ds $models { dss:[lindex $ds 0] configure -cbX $cbX }
if { [dst.item($i) configure -model] < 0 } {
dss add $node $node
dst.item($i) configure -model [dss index $node]
}
}
dtabMA destroy
}
}
cbs write codebookSetClustered
dss write distribSetClustered
puts "==================== pruning away not needed ptrees ===================="
[DistribSet dss2 cbs]
foreach node [dst:] {
set model [dst:$node configure -model]
set ptree [dst:$node configure -ptree]
if { $ptree > -1 } { dst:$node configure -ptree -1 }
if { $model > -1 } {
set dsname [dss name $model]
dss2 add $dsname [cbs name [dss:$dsname configure -cbX]]
}
}
dst write distribTreeClusteredPruned
dss2 write distribSetClusteredPruned
exit