comparison toolboxes/FullBNT-1.0.7/bnt/general/add_evidence_to_gmarginal.m @ 0:e9a9cd732c1e tip

first hg version after svn
author wolffd
date Tue, 10 Feb 2015 15:05:51 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:e9a9cd732c1e
1 function fullm = add_evidence_to_gmarginal(fmarginal, evidence, ns, cnodes)
2 % ADD_EVIDENCE_TO_GMARGINAL 'pump up' observed nodes back to their original size.
3 % function fullm = add_evidence_to_gmarginal(fmarginal, evidence, ns, cnodes)
4 %
5 % We introduce 0s into the array in positions which are incompatible with the evidence.
6 % for both discrete and continuous nodes.
7 %
8 % See also add_ev_to_dmarginal
9
10 dom = fmarginal.domain;
11 fullm.domain = fmarginal.domain;
12
13 % Find out which values of the discrete parents (if any) are compatible with
14 % the discrete evidence (if any).
15 dnodes = mysetdiff(1:length(ns), cnodes);
16 ddom = myintersect(dom, dnodes);
17 cdom = myintersect(dom, cnodes);
18 odom = dom(~isemptycell(evidence(dom)));
19 hdom = dom(isemptycell(evidence(dom)));
20
21 % Find the entries in the big table that are compatible with the discrete evidence.
22 % (We will put the probabilities from the small inferred table into these positions.)
23 % We could use add_ev_to_dmarginal to do this.
24 dobs = myintersect(ddom, odom);
25 dvals = cat(1, evidence{dobs});
26 ens = ns; % effective node sizes
27 ens(dobs) = 1;
28 S = prod(ens(ddom));
29 subs = ind2subv(ens(ddom), 1:S);
30 mask = find_equiv_posns(dobs, ddom);
31 %subs(mask) = dvals; % bug fix by P. Brutti
32 for i=1:length(mask),
33 subs(:,mask(i)) = dvals(i);
34 end
35 supportedQs = subv2ind(ns(ddom), subs);
36
37 if isempty(ddom)
38 Qarity = 1;
39 else
40 Qarity = prod(ns(ddom));
41 end
42 fullm.T = zeros(Qarity, 1);
43 fullm.T(supportedQs) = fmarginal.T(:);
44 fullm.T = myreshape(fullm.T, ns(ddom));
45
46
47 if isempty(cdom)
48 fullm.mu = [];
49 fullm.sigma = [];
50 return;
51 end
52
53 % Now put the hidden cts parts into their right blocks,
54 % leaving the observed cts parts as 0.
55 cobs = myintersect(cdom, odom);
56 chid = myintersect(cdom, hdom);
57 cvals = cat(1, evidence{cobs});
58 n = sum(ns(cdom));
59 fullm.mu = zeros(n,Qarity);
60 fullm.Sigma = zeros(n,n,Qarity);
61
62 if ~isempty(chid)
63 chid_blocks = block(find_equiv_posns(chid, cdom), ns(cdom));
64 end
65 if ~isempty(cobs)
66 cobs_blocks = block(find_equiv_posns(cobs, cdom), ns(cdom));
67 end
68
69 for i=1:length(supportedQs)
70 Q = supportedQs(i);
71 if ~isempty(chid)
72 fullm.mu(chid_blocks, Q) = fmarginal.mu(:, i);
73 fullm.Sigma(chid_blocks, chid_blocks, Q) = fmarginal.Sigma(:,:,i);
74 end
75 if ~isempty(cobs)
76 fullm.mu(cobs_blocks, Q) = cvals(:);
77 end
78 end