wolffd@0
|
1 function slice = get_slice_dbn(bnet, state, i, n, j, m, strides, families, ...
|
wolffd@0
|
2 CPT)
|
wolffd@0
|
3 % slice = get_slice(bnet, state, i, n, j, m, strides, families, cpt)
|
wolffd@0
|
4 %
|
wolffd@0
|
5 % GET_SLICE get one-dimensional slice of the CPT for node X_i^n
|
wolffd@0
|
6 % that corresponds to the different values of X_j^m, where all
|
wolffd@0
|
7 % other nodes have values given by state.
|
wolffd@0
|
8 % strides is the result of
|
wolffd@0
|
9 % calling compute_strides(bnet)
|
wolffd@0
|
10 % families is the result of calling compute_families(bnet)
|
wolffd@0
|
11 % cpts is the result of calling get_cpts(bnet)
|
wolffd@0
|
12 %
|
wolffd@0
|
13 % slice is a 1-d array
|
wolffd@0
|
14
|
wolffd@0
|
15
|
wolffd@0
|
16 if (n == 1)
|
wolffd@0
|
17
|
wolffd@0
|
18 k = bnet.eclass1(i);
|
wolffd@0
|
19 c = CPT{k};
|
wolffd@0
|
20
|
wolffd@0
|
21 % Figure out evidence on family
|
wolffd@0
|
22 fam = families{i, 1};
|
wolffd@0
|
23 ev = state(fam, 1);
|
wolffd@0
|
24
|
wolffd@0
|
25 % Remove evidence on node j
|
wolffd@0
|
26 pos = find(fam == j);
|
wolffd@0
|
27 ev(pos) = 1;
|
wolffd@0
|
28 dim = size(ev, 1);
|
wolffd@0
|
29
|
wolffd@0
|
30 % Compute initial index and stride
|
wolffd@0
|
31 start_ind = 1+strides(k, 1:dim)*(ev-1);
|
wolffd@0
|
32 stride = strides(k, pos);
|
wolffd@0
|
33
|
wolffd@0
|
34 % Compute the slice
|
wolffd@0
|
35 slice = c(start_ind:stride:start_ind+(bnet.node_sizes(j, 1)-1)*stride);
|
wolffd@0
|
36
|
wolffd@0
|
37 else
|
wolffd@0
|
38
|
wolffd@0
|
39 k = bnet.eclass2(i);
|
wolffd@0
|
40 c = CPT{k};
|
wolffd@0
|
41
|
wolffd@0
|
42 fam = families{i, 2};
|
wolffd@0
|
43 ss = length(bnet.intra);
|
wolffd@0
|
44
|
wolffd@0
|
45 % Divide the family into nodes in this time step and nodes in the
|
wolffd@0
|
46 % previous time step
|
wolffd@0
|
47 this_time_step = fam(find(fam > ss));
|
wolffd@0
|
48 prev_time_step = fam(find(fam <= ss));
|
wolffd@0
|
49
|
wolffd@0
|
50 % Normalize the node numbers
|
wolffd@0
|
51 this_time_step = this_time_step - ss;
|
wolffd@0
|
52
|
wolffd@0
|
53 % Get the evidence
|
wolffd@0
|
54 this_step_ev = state(this_time_step, n);
|
wolffd@0
|
55 prev_step_ev = state(prev_time_step, n-1);
|
wolffd@0
|
56
|
wolffd@0
|
57 % Remove the evidence for X_j^m
|
wolffd@0
|
58 if (m == n)
|
wolffd@0
|
59 pos = find(this_time_step == j);
|
wolffd@0
|
60 this_step_ev(pos) = 1;
|
wolffd@0
|
61 pos = pos + size(prev_time_step, 2);
|
wolffd@0
|
62 else
|
wolffd@0
|
63 assert (m == n-1);
|
wolffd@0
|
64 pos = find(prev_time_step == j);
|
wolffd@0
|
65 prev_step_ev(pos) = 1;
|
wolffd@0
|
66 end
|
wolffd@0
|
67
|
wolffd@0
|
68 % Combine the two time steps
|
wolffd@0
|
69 ev = [prev_step_ev; this_step_ev];
|
wolffd@0
|
70 dim = size(ev, 1);
|
wolffd@0
|
71
|
wolffd@0
|
72
|
wolffd@0
|
73 % Compute starting index and stride
|
wolffd@0
|
74 start_ind = 1 + strides(k, 1:dim)*(ev-1);
|
wolffd@0
|
75 stride = strides(k, pos);
|
wolffd@0
|
76
|
wolffd@0
|
77 % Compute slice
|
wolffd@0
|
78 if (m == 1)
|
wolffd@0
|
79 q = 1;
|
wolffd@0
|
80 else
|
wolffd@0
|
81 q = 2;
|
wolffd@0
|
82 end
|
wolffd@0
|
83 slice = c(start_ind:stride:start_ind+(bnet.node_sizes(j, q)-1)*stride);
|
wolffd@0
|
84 end
|
wolffd@0
|
85
|
wolffd@0
|
86
|
wolffd@0
|
87
|