wolffd@0: function bnet = mk_rnd_map_hhmm(varargin) wolffd@0: wolffd@0: % We copy the deterministic structure of the real HHMM, wolffd@0: % but randomize the probabilities of the adjustable CPDs. wolffd@0: % The key trick is that 0s in the real HHMM remain 0 wolffd@0: % even when multiplied by a randon number. wolffd@0: wolffd@0: obs_model = 'unique'; wolffd@0: wolffd@0: for i=1:2:length(varargin) wolffd@0: switch varargin{i}, wolffd@0: case 'obs_model', obs_model = varargin{i+1}; wolffd@0: end wolffd@0: end wolffd@0: wolffd@0: wolffd@0: unique_obs = strcmp(obs_model, 'unique'); wolffd@0: wolffd@0: psuccess = 0.9; wolffd@0: % must be less than 1, so that pfail > 0 wolffd@0: % otherwise we copy too many 0s wolffd@0: bnet = mk_map_hhmm('p', psuccess, 'obs_model', obs_model); wolffd@0: ns = bnet.node_sizes; wolffd@0: ss = bnet.nnodes_per_slice; wolffd@0: wolffd@0: U = 1; A = 2; C = 3; F = 4; wolffd@0: %unique_obs = (bnet.nnodes_per_slice == 5); wolffd@0: if unique_obs wolffd@0: onodes = 5; wolffd@0: else wolffd@0: north = 5; east = 6; south = 7; west = 8; wolffd@0: onodes = [north east south west]; wolffd@0: end wolffd@0: wolffd@0: eclass = bnet.equiv_class; wolffd@0: S=struct(bnet.CPD{eclass(F,1)}); wolffd@0: CPT = mk_stochastic(rand(size(S.CPT)) .* S.CPT); wolffd@0: bnet.CPD{eclass(F,1)} = tabular_CPD(bnet, F, 'CPT', CPT); wolffd@0: wolffd@0: wolffd@0: % Observation model wolffd@0: if unique_obs wolffd@0: CPT = zeros(ns(A), ns(C), 5); wolffd@0: CPT(1,1,1)=1; % Theo state 4 wolffd@0: CPT(1,2,2)=1; % Theo state 5 wolffd@0: CPT(1,3,3)=1; % Theo state 6 wolffd@0: CPT(2,1,4)=1; % Theo state 9 wolffd@0: CPT(2,2,5)=1; % Theo state 10 wolffd@0: %CPT(2,3,:) undefined wolffd@0: O = onodes(1); wolffd@0: bnet.CPD{eclass(O,1)} = tabular_CPD(bnet, O, 'CPT', CPT); wolffd@0: else wolffd@0: for i=[north east south west] wolffd@0: CPT = mk_stochastic(rand(ns(A), ns(C), 2)); wolffd@0: bnet.CPD{eclass(i,1)} = tabular_CPD(bnet, i, 'CPT', CPT); wolffd@0: end wolffd@0: end wolffd@0: wolffd@0: % Define the CPDs for slice 2 wolffd@0: wolffd@0: startprob = zeros(ns(U), ns(A)); wolffd@0: S = struct(bnet.CPD{eclass(A,2)}); wolffd@0: transprob = mk_stochastic(rand(size(S.transprob)) .* S.transprob); wolffd@0: bnet.CPD{eclass(A,2)} = hhmm2Q_CPD(bnet, A+ss, 'Fbelow', F, ... wolffd@0: 'startprob', startprob, 'transprob', transprob); wolffd@0: wolffd@0: S = struct(bnet.CPD{eclass(C,2)}); wolffd@0: transprob = mk_stochastic(rand(size(S.transprob)) .* S.transprob); wolffd@0: startprob = mk_stochastic(rand(size(S.startprob)) .* S.startprob); wolffd@0: bnet.CPD{eclass(C,2)} = hhmm2Q_CPD(bnet, C+ss, 'Fself', F, ... wolffd@0: 'startprob', startprob, 'transprob', transprob); wolffd@0: wolffd@0: