comparison toolboxes/FullBNT-1.0.7/bnt/CPDs/@gaussian_CPD/CPD_to_scgpot.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 pot = CPD_to_scgpot(CPD, domain, ns, cnodes, evidence)
2 % CPD_TO_CGPOT Convert a Gaussian CPD to a CG potential, incorporating any evidence
3 % pot = CPD_to_cgpot(CPD, domain, ns, cnodes, evidence)
4
5 self = CPD.self;
6 dnodes = mysetdiff(1:length(ns), cnodes);
7 odom = domain(~isemptycell(evidence(domain)));
8 cdom = myintersect(cnodes, domain);
9 cheaddom = myintersect(self, domain);
10 ctaildom = mysetdiff(cdom,cheaddom);
11 ddom = myintersect(dnodes, domain);
12 cobs = myintersect(cdom, odom);
13 dobs = myintersect(ddom, odom);
14 ens = ns; % effective node size
15 ens(cobs) = 0;
16 ens(dobs) = 1;
17
18 % Extract the params compatible with the observations (if any) on the discrete parents (if any)
19 % parents are all but the last domain element
20 ps = domain(1:end-1);
21 dps = myintersect(ps, ddom);
22 dops = myintersect(dps, odom);
23
24 map = find_equiv_posns(dops, dps);
25 dpvals = cat(1, evidence{dops});
26 index = mk_multi_index(length(dps), map, dpvals);
27
28 dpsize = prod(ens(dps));
29 cpsize = size(CPD.weights(:,:,1), 2); % cts parents size
30 ss = size(CPD.mean, 1); % self size
31 % the reshape acts like a squeeze
32 m = reshape(CPD.mean(:, index{:}), [ss dpsize]);
33 C = reshape(CPD.cov(:, :, index{:}), [ss ss dpsize]);
34 W = reshape(CPD.weights(:, :, index{:}), [ss cpsize dpsize]);
35
36
37 % Convert each conditional Gaussian to a canonical potential
38 pot = cell(1, dpsize);
39 for i=1:dpsize
40 %pot{i} = linear_gaussian_to_scgcpot(m(:,i), C(:,:,i), W(:,:,i), cdom, ns, cnodes, evidence);
41 pot{i} = scgcpot(ss, cpsize, 1, m(:,i), W(:,:,i), C(:,:,i));
42 end
43
44 pot = scgpot(ddom, cheaddom, ctaildom, ens, pot);
45
46
47 function pot = linear_gaussian_to_scgcpot(mu, Sigma, W, domain, ns, cnodes, evidence)
48 % LINEAR_GAUSSIAN_TO_CPOT Convert a linear Gaussian CPD to a stable conditional potential element.
49 % pot = linear_gaussian_to_cpot(mu, Sigma, W, domain, ns, cnodes, evidence)
50
51 p = 1;
52 A = mu;
53 B = W;
54 C = Sigma;
55 ns(odom) = 0;
56 %pot = scgcpot(, ns(domain), p, A, B, C);
57
58