wolffd@0: function T = convert_to_table(CPD, domain, evidence) wolffd@0: % CONVERT_TO_TABLE Convert a mlp CPD to a table, incorporating any evidence wolffd@0: % T = convert_to_table(CPD, domain, evidence) wolffd@0: wolffd@0: self = domain(end); wolffd@0: ps = domain(1:end-1); % self' parents wolffd@0: %cps = myintersect(ps, cnodes); % self' continous parents wolffd@0: cnodes = domain(CPD.cpndx); wolffd@0: cps = myintersect(ps, cnodes); wolffd@0: odom = domain(~isemptycell(evidence(domain))); % obs nodes in the net wolffd@0: assert(myismember(cps, odom)); % !ALL the CTS parents must be observed! wolffd@0: ns(cps)=1; wolffd@0: dps = mysetdiff(ps, cps); % self' discrete parents wolffd@0: dobs = myintersect(dps, odom); % discrete obs parents wolffd@0: wolffd@0: % Extract the params compatible with the observations (if any) on the discrete parents (if any) wolffd@0: wolffd@0: if ~isempty(dobs), wolffd@0: dvals = cat(1, evidence{dobs}); wolffd@0: ns_eff= CPD.sizes; % effective node sizes wolffd@0: ens=ns_eff; wolffd@0: ens(dobs) = 1; wolffd@0: S=prod(ens(dps)); wolffd@0: subs = ind2subv(ens(dps), 1:S); wolffd@0: mask = find_equiv_posns(dobs, dps); wolffd@0: for i=1:length(mask), wolffd@0: subs(:,mask(i)) = dvals(i); wolffd@0: end wolffd@0: support = subv2ind(ns_eff(dps), subs)'; wolffd@0: else wolffd@0: ns_eff= CPD.sizes; wolffd@0: support=[1:prod(ns_eff(dps))]; wolffd@0: end wolffd@0: wolffd@0: W1=[]; b1=[]; W2=[]; b2=[]; wolffd@0: wolffd@0: W1 = CPD.W1(:,:,support); wolffd@0: b1= CPD.b1(support,:); wolffd@0: W2 = CPD.W2(:,:,support); wolffd@0: b2= CPD.b2(support,:); wolffd@0: ns(odom) = 1; wolffd@0: dpsize = prod(ns(dps)); % overall size of the self' discrete parents wolffd@0: wolffd@0: x = cat(1, evidence{cps}); wolffd@0: ndata=size(x,2); wolffd@0: wolffd@0: if ~isempty(evidence{self}) % wolffd@0: app=struct(CPD); % wolffd@0: ns(self)=app.mlp{1}.nout; % pump up self to the original dimension if observed wolffd@0: clear app; % wolffd@0: end % wolffd@0: wolffd@0: T =zeros(dpsize, ns(self)); % wolffd@0: for i=1:dpsize % wolffd@0: W1app = W1(:,:,i); % wolffd@0: b1app = b1(i,:); % wolffd@0: W2app = W2(:,:,i); % wolffd@0: b2app = b2(i,:); % for each of the dpsize combinations of self'parents values wolffd@0: z = tanh(x(:)'*W1app + ones(ndata, 1)*b1app); % we tabulate the corrisponding glm model wolffd@0: a = z*W2app + ones(ndata, 1)*b2app; % (element of the cell array CPD.glim) wolffd@0: appoggio = normalise(exp(a)); % wolffd@0: T(i,:)=appoggio; % wolffd@0: W1app=[]; W2app=[]; b1app=[]; b2app=[]; % wolffd@0: z=[]; a=[]; appoggio=[]; % wolffd@0: end % wolffd@0: wolffd@0: if ~isempty(evidence{self}) wolffd@0: appoggio=[]; % wolffd@0: appoggio=zeros(1,ns(self)); % wolffd@0: r = evidence{self}; %...if self is observed => in output there's only the probability of the 'true' class wolffd@0: for i=1:dpsize % wolffd@0: appoggio(i)=T(i,r); % wolffd@0: end wolffd@0: T=zeros(dpsize,1); wolffd@0: for i=1:dpsize wolffd@0: T(i,1)=appoggio(i); wolffd@0: end wolffd@0: clear appoggio; wolffd@0: ns(self) = 1; wolffd@0: end