def sums(inputs, indices, latent_indicators, num_sums, inf_type=None, log=True, output=None): if indices is None: inputs = [inputs for _ in range(num_sums)] else: inputs = [(inputs, indices) for _ in range(num_sums)] # Generate a single Sums node, modeling 'num_sums' sum nodes within, # connecting it to inputs and latent_indicators s = spn.Sums(*inputs, num_sums=num_sums, latent_indicators=latent_indicators[-1]) # Generate weights of the Sums node weights = s.generate_weights() # Connect the Sums nodes to a single root Sum node and generate its weights root = spn.Sum(s) root.generate_weights() if log: mpe_path_gen = spn.MPEPath(value_inference_type=inf_type, log=True) else: mpe_path_gen = spn.MPEPath(value_inference_type=inf_type, log=False) mpe_path_gen.get_mpe_path(root) path_op = [mpe_path_gen.counts[weights]] return spn.initialize_weights(root), path_op
def sums(inputs, indices, latent_indicators, num_sums, inf_type, log=True, output=None): if indices is None: inputs = [inputs for _ in range(num_sums)] else: inputs = [(inputs, ind) for ind in indices] # Generate a single Sums node, modeling 'num_sums' sum nodes within, # connecting it to inputs and latent_indicators s = spn.Sums(*inputs, num_sums=num_sums, latent_indicators=latent_indicators[0]) # Generate weights of the Sums node s.generate_weights() # Connect the Sums nodes to a single root Sum node and generate its weights root = spn.Sum(s) root.generate_weights() if log: value_op = root.get_log_value(inference_type=inf_type) else: value_op = root.get_value(inference_type=inf_type) return spn.initialize_weights(root), value_op