wolffd@0: function CPD = hhmm2Q_CPD(bnet, self, varargin) wolffd@0: % HHMMQ_CPD Make the CPD for a Q node in a 2 level hierarchical HMM wolffd@0: % CPD = hhmmQ_CPD(bnet, self, ...) wolffd@0: % wolffd@0: % Fself(t-1) Qps wolffd@0: % \ | wolffd@0: % \ v wolffd@0: % Qold(t-1) -> Q(t) wolffd@0: % / wolffd@0: % / wolffd@0: % Fbelow(t-1) wolffd@0: % wolffd@0: % wolffd@0: % optional args [defaults] wolffd@0: % wolffd@0: % Fself - node number <= ss wolffd@0: % Fbelow - node number <= ss wolffd@0: % Qps - node numbers (all <= 2*ss) - uses 2TBN indexing wolffd@0: % transprob - CPT for when Fbelow=2 and Fself=1 wolffd@0: % startprob - CPT for when Fbelow=2 and Fself=2 wolffd@0: % If Fbelow=1, we cannot change state. wolffd@0: wolffd@0: ss = bnet.nnodes_per_slice; wolffd@0: ns = bnet.node_sizes(:); wolffd@0: wolffd@0: % set default arguments wolffd@0: Fself = []; wolffd@0: Fbelow = []; wolffd@0: Qps = []; wolffd@0: startprob = []; wolffd@0: transprob = []; wolffd@0: wolffd@0: for i=1:2:length(varargin) wolffd@0: switch varargin{i}, wolffd@0: case 'Fself', Fself = varargin{i+1}; wolffd@0: case 'Fbelow', Fbelow = varargin{i+1}; wolffd@0: case 'Qps', Qps = varargin{i+1}; wolffd@0: case 'transprob', transprob = varargin{i+1}; wolffd@0: case 'startprob', startprob = varargin{i+1}; wolffd@0: end wolffd@0: end wolffd@0: wolffd@0: ps = parents(bnet.dag, self); wolffd@0: old_self = self-ss; wolffd@0: ndsz = ns(:)'; wolffd@0: CPD.dom_sz = [ndsz(ps) ns(self)]; wolffd@0: CPD.Fself_ndx = find_equiv_posns(Fself, ps); wolffd@0: CPD.Fbelow_ndx = find_equiv_posns(Fbelow, ps); wolffd@0: Qps = mysetdiff(ps, [Fself Fbelow old_self]); wolffd@0: CPD.Qps_ndx = find_equiv_posns(Qps, ps); wolffd@0: CPD.old_self_ndx = find_equiv_posns(old_self, ps); wolffd@0: wolffd@0: Qps = ps(CPD.Qps_ndx); wolffd@0: CPD.Qsz = ns(self); wolffd@0: CPD.Qpsizes = ns(Qps); wolffd@0: wolffd@0: CPD.transprob = transprob; wolffd@0: CPD.startprob = startprob; wolffd@0: CPD.start_counts = []; wolffd@0: CPD.trans_counts = []; wolffd@0: wolffd@0: CPD = class(CPD, 'hhmm2Q_CPD', discrete_CPD(0, CPD.dom_sz)); wolffd@0: wolffd@0: wolffd@0: