wolffd@0: function marginal = marginal_nodes(engine, query, add_ev) wolffd@0: % MARGINAL_NODES Compute the marginal on the specified query nodes (loopy) wolffd@0: % marginal = marginal_nodes(engine, query, add_ev) wolffd@0: % wolffd@0: % 'query' must be a single node. wolffd@0: % add_ev is an optional argument; if 1, observed nodes will be set to their original size, wolffd@0: % otherwise they will be treated like points. wolffd@0: wolffd@0: if nargin < 3, add_ev = 0; end wolffd@0: wolffd@0: if length(query) > 1 wolffd@0: error('can only compute marginal on single nodes or families') wolffd@0: end wolffd@0: bnet = bnet_from_engine(engine); wolffd@0: ns = bnet.node_sizes(:); wolffd@0: wolffd@0: switch engine.msg_type wolffd@0: case 'd', wolffd@0: T = engine.marginal{query}; wolffd@0: if ~add_ev wolffd@0: marginal.T = shrink_obs_dims_in_table(T, query, engine.evidence); wolffd@0: else wolffd@0: marginal.T = T; wolffd@0: end wolffd@0: marginal.domain = query; wolffd@0: wolffd@0: case 'g', wolffd@0: if engine.disconnected_nodes_bitv(query) wolffd@0: marginal.T = 1; wolffd@0: marginal.domain = query; wolffd@0: if add_ev wolffd@0: marginal = add_ev_to_dmarginal(marginal, engine.evidence, ns) wolffd@0: end wolffd@0: return; wolffd@0: end wolffd@0: wolffd@0: marginal = engine.marginal{query}; wolffd@0: marginal.domain = query; wolffd@0: if ~add_ev wolffd@0: marginal = shrink_obs_dims_in_gaussian(marginal, query, engine.evidence, ns); wolffd@0: end wolffd@0: end wolffd@0: