wolffd@0: function marginal = marginal_nodes(engine, query, add_ev) wolffd@0: % MARGINAL_NODES Compute the marginal on the specified query nodes (cond_gauss) wolffd@0: % marginal = marginal_nodes(engine, query, add_ev) wolffd@0: % wolffd@0: % 'query' must be a singleton set wolffd@0: % add_ev is an optional argument; if 1, we will "inflate" the marginal of observed nodes wolffd@0: % to their original size, adding 0s to the positions which contradict the evidence wolffd@0: wolffd@0: if nargin < 3, add_ev = 0; end wolffd@0: wolffd@0: if length(query) ~= 1 wolffd@0: error('cond_gauss_inf_engine can only handle marginal queries on single nodes') wolffd@0: end wolffd@0: j = query; wolffd@0: bnet = bnet_from_engine(engine); wolffd@0: wolffd@0: if myismember(j, bnet.cnodes) wolffd@0: if ~myismember(j, engine.onodes) wolffd@0: [m, C] = collapse_mog(engine.mu{j}, engine.Sigma{j}, engine.T); wolffd@0: marginal.mu = m; wolffd@0: marginal.Sigma = C; wolffd@0: marginal.T = 1.0; % single mixture component wolffd@0: else wolffd@0: marginal.mu = engine.evidence{j}; wolffd@0: k = bnet.node_sizes(j); wolffd@0: marginal.Sigma = zeros(k,k); wolffd@0: marginal.T = 1.0; % since P(E|E)=1 wolffd@0: end wolffd@0: else wolffd@0: marginal = pot_to_marginal(marginalize_pot(engine.joint_dmarginal, j)); wolffd@0: if add_ev wolffd@0: marginal = add_ev_to_dmarginal(marginal, engine.evidence, bnet.node_sizes); wolffd@0: end wolffd@0: end wolffd@0: wolffd@0: marginal.domain = query;