Mercurial > hg > camir-aes2014
view toolboxes/FullBNT-1.0.7/bnt/potentials/@scgpot/marginalize_pot.m @ 0:e9a9cd732c1e tip
first hg version after svn
author | wolffd |
---|---|
date | Tue, 10 Feb 2015 15:05:51 +0000 |
parents | |
children |
line wrap: on
line source
function smallpot = marginalize_pot(bigpot, keep) % MARGINALIZE_POT Marginalize a cgpot onto a smaller domain. % smallpot = marginalize_pot(bigpot, keep) sumover = mysetdiff(bigpot.domain, keep); cdom = myunion(bigpot.cheaddom, bigpot.ctaildom); csumover = myintersect(sumover, bigpot.cheaddom); dsumover = myintersect(sumover, bigpot.ddom); dkeep = myintersect(keep, bigpot.ddom); ckeep = myintersect(keep, bigpot.cheaddom); cheaddom = myintersect(keep, bigpot.cheaddom); assert(isempty(myintersect(csumover,bigpot.ctaildom))); ns = zeros(1, max(bigpot.domain)); ns(bigpot.ddom) = bigpot.dsizes; ns(bigpot.cheaddom) = bigpot.cheadsizes; ns(bigpot.ctaildom) = bigpot.ctailsizes; if sum(ns(csumover)) > 0 for i=1:bigpot.dsize bigpot.scgpotc{i} = marginalize_pot(bigpot.scgpotc{i}, ckeep, csumover, ns); end end if (isequal(csumover, cheaddom)) bigpot.ctaildom = []; end % If we are not marginalizing over any discrete nodes, we are done. if prod(ns(dsumover))==1 smallpot = scgpot(dkeep, cheaddom, bigpot.ctaildom, ns, bigpot.scgpotc); return; end if (~isempty(bigpot.ctaildom)) assert(0); return; end I = prod(ns(dkeep)); J = prod(ns(dsumover)); C = sum(ns(ckeep)); sum_map = find_equiv_posns(dsumover, bigpot.ddom); keep_map = find_equiv_posns(dkeep, bigpot.ddom); iv = zeros(1, length(bigpot.ddom)); % index vector p1 = zeros(I,J); A1 = zeros(C,J,I); C1 = zeros(C,C,J,I); for i=1:I keep_iv = ind2subv(ns(dkeep), i); iv(keep_map) = keep_iv; for j=1:J sum_iv = ind2subv(ns(dsumover), j); iv(sum_map) = sum_iv; k = subv2ind(ns(bigpot.ddom), iv); pot = struct(bigpot.scgpotc{k}); % violate object privacy p1(i,j) = pot.p; if C > 0 % so mu1 and Sigma1 are non-empty A1(:,j,i) = pot.A; C1(:,:,j,i) = pot.C; end end end % Collapse the mixture of Gaussians coef = mk_stochastic(p1); % coef must be convex combination %keyboard p2 = sum(p1,2); if (all(p2 == 0)) p2 = p2 + (p2==0)*eps; end A = []; S = []; pot = cell(1,I); ctailsize = sum(ns(bigpot.ctaildom)); tB = zeros(C, ctailsize); for i=1:I if C > 0 [A, S] = collapse_mog(A1(:,:,i), C1(:,:,:,i), coef(i,:)); end p = p2(i); pot{i} = scgcpot(C, ctailsize, p, A, tB, S); end smallpot = scgpot(dkeep, ckeep, bigpot.ctaildom, ns, pot);