wolffd@0
|
1 function bnet = mk_rnd_map_hhmm(varargin)
|
wolffd@0
|
2
|
wolffd@0
|
3 % We copy the deterministic structure of the real HHMM,
|
wolffd@0
|
4 % but randomize the probabilities of the adjustable CPDs.
|
wolffd@0
|
5 % The key trick is that 0s in the real HHMM remain 0
|
wolffd@0
|
6 % even when multiplied by a randon number.
|
wolffd@0
|
7
|
wolffd@0
|
8 obs_model = 'unique';
|
wolffd@0
|
9
|
wolffd@0
|
10 for i=1:2:length(varargin)
|
wolffd@0
|
11 switch varargin{i},
|
wolffd@0
|
12 case 'obs_model', obs_model = varargin{i+1};
|
wolffd@0
|
13 end
|
wolffd@0
|
14 end
|
wolffd@0
|
15
|
wolffd@0
|
16
|
wolffd@0
|
17 unique_obs = strcmp(obs_model, 'unique');
|
wolffd@0
|
18
|
wolffd@0
|
19 psuccess = 0.9;
|
wolffd@0
|
20 % must be less than 1, so that pfail > 0
|
wolffd@0
|
21 % otherwise we copy too many 0s
|
wolffd@0
|
22 bnet = mk_map_hhmm('p', psuccess, 'obs_model', obs_model);
|
wolffd@0
|
23 ns = bnet.node_sizes;
|
wolffd@0
|
24 ss = bnet.nnodes_per_slice;
|
wolffd@0
|
25
|
wolffd@0
|
26 U = 1; A = 2; C = 3; F = 4;
|
wolffd@0
|
27 %unique_obs = (bnet.nnodes_per_slice == 5);
|
wolffd@0
|
28 if unique_obs
|
wolffd@0
|
29 onodes = 5;
|
wolffd@0
|
30 else
|
wolffd@0
|
31 north = 5; east = 6; south = 7; west = 8;
|
wolffd@0
|
32 onodes = [north east south west];
|
wolffd@0
|
33 end
|
wolffd@0
|
34
|
wolffd@0
|
35 eclass = bnet.equiv_class;
|
wolffd@0
|
36 S=struct(bnet.CPD{eclass(F,1)});
|
wolffd@0
|
37 CPT = mk_stochastic(rand(size(S.CPT)) .* S.CPT);
|
wolffd@0
|
38 bnet.CPD{eclass(F,1)} = tabular_CPD(bnet, F, 'CPT', CPT);
|
wolffd@0
|
39
|
wolffd@0
|
40
|
wolffd@0
|
41 % Observation model
|
wolffd@0
|
42 if unique_obs
|
wolffd@0
|
43 CPT = zeros(ns(A), ns(C), 5);
|
wolffd@0
|
44 CPT(1,1,1)=1; % Theo state 4
|
wolffd@0
|
45 CPT(1,2,2)=1; % Theo state 5
|
wolffd@0
|
46 CPT(1,3,3)=1; % Theo state 6
|
wolffd@0
|
47 CPT(2,1,4)=1; % Theo state 9
|
wolffd@0
|
48 CPT(2,2,5)=1; % Theo state 10
|
wolffd@0
|
49 %CPT(2,3,:) undefined
|
wolffd@0
|
50 O = onodes(1);
|
wolffd@0
|
51 bnet.CPD{eclass(O,1)} = tabular_CPD(bnet, O, 'CPT', CPT);
|
wolffd@0
|
52 else
|
wolffd@0
|
53 for i=[north east south west]
|
wolffd@0
|
54 CPT = mk_stochastic(rand(ns(A), ns(C), 2));
|
wolffd@0
|
55 bnet.CPD{eclass(i,1)} = tabular_CPD(bnet, i, 'CPT', CPT);
|
wolffd@0
|
56 end
|
wolffd@0
|
57 end
|
wolffd@0
|
58
|
wolffd@0
|
59 % Define the CPDs for slice 2
|
wolffd@0
|
60
|
wolffd@0
|
61 startprob = zeros(ns(U), ns(A));
|
wolffd@0
|
62 S = struct(bnet.CPD{eclass(A,2)});
|
wolffd@0
|
63 transprob = mk_stochastic(rand(size(S.transprob)) .* S.transprob);
|
wolffd@0
|
64 bnet.CPD{eclass(A,2)} = hhmm2Q_CPD(bnet, A+ss, 'Fbelow', F, ...
|
wolffd@0
|
65 'startprob', startprob, 'transprob', transprob);
|
wolffd@0
|
66
|
wolffd@0
|
67 S = struct(bnet.CPD{eclass(C,2)});
|
wolffd@0
|
68 transprob = mk_stochastic(rand(size(S.transprob)) .* S.transprob);
|
wolffd@0
|
69 startprob = mk_stochastic(rand(size(S.startprob)) .* S.startprob);
|
wolffd@0
|
70 bnet.CPD{eclass(C,2)} = hhmm2Q_CPD(bnet, C+ss, 'Fself', F, ...
|
wolffd@0
|
71 'startprob', startprob, 'transprob', transprob);
|
wolffd@0
|
72
|
wolffd@0
|
73
|