From 8070dc963753142bb86c4ed698d91fd623ed28e7 Mon Sep 17 00:00:00 2001 From: ziejd2 Date: Thu, 28 Sep 2017 15:04:40 -0500 Subject: BNW using Octave instead of Matlab. This version of BNW should perform the same as the original version. The only difference is that it uses Octave instead of Matlab when running BayesNet Toolbox during parameter learning. I am calling this BNW_1.02. It can be accessed at: compbio.uthsc.edu/BNW_1.02 --- sourcecodes/bnt-master/BNT/general/CVS/Entries | 50 +++++ sourcecodes/bnt-master/BNT/general/CVS/Entries.Log | 1 + sourcecodes/bnt-master/BNT/general/CVS/Repository | 1 + sourcecodes/bnt-master/BNT/general/CVS/Root | 1 + sourcecodes/bnt-master/BNT/general/Old/CVS/Entries | 9 + .../bnt-master/BNT/general/Old/CVS/Repository | 1 + sourcecodes/bnt-master/BNT/general/Old/CVS/Root | 1 + .../bnt-master/BNT/general/Old/bnet_to_gdl_graph.m | 18 ++ sourcecodes/bnt-master/BNT/general/Old/calc_mpe.m | 58 ++++++ .../bnt-master/BNT/general/Old/calc_mpe_bucket.m | 160 ++++++++++++++++ .../bnt-master/BNT/general/Old/calc_mpe_dbn.m | 41 +++++ .../BNT/general/Old/calc_mpe_given_inf_engine.m | 32 ++++ .../bnt-master/BNT/general/Old/calc_mpe_global.m | 28 +++ .../BNT/general/Old/compute_interface_nodes.m | 31 ++++ .../bnt-master/BNT/general/Old/mk_gdl_graph.m | 86 +++++++++ .../bnt-master/BNT/general/add_ev_to_dmarginal.m | 15 ++ .../BNT/general/add_evidence_to_gmarginal.m | 78 ++++++++ .../bnt-master/BNT/general/bnet_to_fgraph.m | 16 ++ .../bnt-master/BNT/general/compute_fwd_interface.m | 11 ++ .../BNT/general/compute_interface_nodes.m | 42 +++++ .../bnt-master/BNT/general/compute_joint_pot.m | 17 ++ .../BNT/general/compute_minimal_interface.m | 25 +++ .../BNT/general/convert_dbn_CPDs_to_pots.m | 30 +++ .../BNT/general/convert_dbn_CPDs_to_tables.m | 201 +++++++++++++++++++++ .../BNT/general/convert_dbn_CPDs_to_tables1.m | 162 +++++++++++++++++ .../BNT/general/convert_dbn_CPDs_to_tables_slow.m | 41 +++++ sourcecodes/bnt-master/BNT/general/dbn_to_bnet.m | 13 ++ sourcecodes/bnt-master/BNT/general/dbn_to_hmm.m | 81 +++++++++ .../BNT/general/determine_elim_constraints.m | 43 +++++ sourcecodes/bnt-master/BNT/general/dispcpt.m | 16 ++ .../bnt-master/BNT/general/do_intervention.m | 13 ++ sourcecodes/bnt-master/BNT/general/dsep.m | 15 ++ sourcecodes/bnt-master/BNT/general/dsep_test.m | 15 ++ .../bnt-master/BNT/general/enumerate_scenarios.m | 21 +++ .../bnt-master/BNT/general/fgraph_to_bnet.m | 30 +++ sourcecodes/bnt-master/BNT/general/hodbn_to_bnet.m | 21 +++ sourcecodes/bnt-master/BNT/general/is_mnet.m | 3 + .../BNT/general/linear_gaussian_to_cpot.m | 43 +++++ .../bnt-master/BNT/general/log_lik_complete.m | 30 +++ .../bnt-master/BNT/general/log_marg_lik_complete.m | 40 ++++ sourcecodes/bnt-master/BNT/general/mk_bnet.m | 93 ++++++++++ sourcecodes/bnt-master/BNT/general/mk_dbn.m | 133 ++++++++++++++ sourcecodes/bnt-master/BNT/general/mk_fgraph.m | 60 ++++++ .../bnt-master/BNT/general/mk_fgraph_given_ev.m | 48 +++++ .../bnt-master/BNT/general/mk_higher_order_dbn.m | 181 +++++++++++++++++++ sourcecodes/bnt-master/BNT/general/mk_limid.m | 93 ++++++++++ sourcecodes/bnt-master/BNT/general/mk_mnet.m | 14 ++ sourcecodes/bnt-master/BNT/general/mk_mrf2.m | 8 + .../bnt-master/BNT/general/mk_mutilated_samples.m | 38 ++++ sourcecodes/bnt-master/BNT/general/mk_named_CPT.m | 52 ++++++ .../bnt-master/BNT/general/mk_slice_and_half_dbn.m | 28 +++ .../bnt-master/BNT/general/noisyORtoTable.m | 32 ++++ .../bnt-master/BNT/general/partition_dbn_nodes.m | 17 ++ .../BNT/general/partition_matrix_vec_3.m | 22 +++ sourcecodes/bnt-master/BNT/general/sample_bnet.m | 34 ++++ .../bnt-master/BNT/general/sample_bnet_nocell.m | 0 sourcecodes/bnt-master/BNT/general/sample_dbn.m | 73 ++++++++ .../bnt-master/BNT/general/score_bnet_complete.m | 28 +++ .../BNT/general/shrink_obs_dims_in_gaussian.m | 12 ++ .../BNT/general/shrink_obs_dims_in_table.m | 15 ++ sourcecodes/bnt-master/BNT/general/solve_limid.m | 68 +++++++ .../bnt-master/BNT/general/unroll_dbn_topology.m | 28 +++ .../BNT/general/unroll_higher_order_topology.m | 30 +++ sourcecodes/bnt-master/BNT/general/unroll_set.m | 7 + 64 files changed, 2654 insertions(+) create mode 100644 sourcecodes/bnt-master/BNT/general/CVS/Entries create mode 100644 sourcecodes/bnt-master/BNT/general/CVS/Entries.Log create mode 100644 sourcecodes/bnt-master/BNT/general/CVS/Repository create mode 100644 sourcecodes/bnt-master/BNT/general/CVS/Root create mode 100644 sourcecodes/bnt-master/BNT/general/Old/CVS/Entries create mode 100644 sourcecodes/bnt-master/BNT/general/Old/CVS/Repository create mode 100644 sourcecodes/bnt-master/BNT/general/Old/CVS/Root create mode 100644 sourcecodes/bnt-master/BNT/general/Old/bnet_to_gdl_graph.m create mode 100644 sourcecodes/bnt-master/BNT/general/Old/calc_mpe.m create mode 100644 sourcecodes/bnt-master/BNT/general/Old/calc_mpe_bucket.m create mode 100644 sourcecodes/bnt-master/BNT/general/Old/calc_mpe_dbn.m create mode 100644 sourcecodes/bnt-master/BNT/general/Old/calc_mpe_given_inf_engine.m create mode 100644 sourcecodes/bnt-master/BNT/general/Old/calc_mpe_global.m create mode 100644 sourcecodes/bnt-master/BNT/general/Old/compute_interface_nodes.m create mode 100644 sourcecodes/bnt-master/BNT/general/Old/mk_gdl_graph.m create mode 100644 sourcecodes/bnt-master/BNT/general/add_ev_to_dmarginal.m create mode 100644 sourcecodes/bnt-master/BNT/general/add_evidence_to_gmarginal.m create mode 100644 sourcecodes/bnt-master/BNT/general/bnet_to_fgraph.m create mode 100644 sourcecodes/bnt-master/BNT/general/compute_fwd_interface.m create mode 100644 sourcecodes/bnt-master/BNT/general/compute_interface_nodes.m create mode 100644 sourcecodes/bnt-master/BNT/general/compute_joint_pot.m create mode 100644 sourcecodes/bnt-master/BNT/general/compute_minimal_interface.m create mode 100644 sourcecodes/bnt-master/BNT/general/convert_dbn_CPDs_to_pots.m create mode 100644 sourcecodes/bnt-master/BNT/general/convert_dbn_CPDs_to_tables.m create mode 100644 sourcecodes/bnt-master/BNT/general/convert_dbn_CPDs_to_tables1.m create mode 100644 sourcecodes/bnt-master/BNT/general/convert_dbn_CPDs_to_tables_slow.m create mode 100644 sourcecodes/bnt-master/BNT/general/dbn_to_bnet.m create mode 100644 sourcecodes/bnt-master/BNT/general/dbn_to_hmm.m create mode 100644 sourcecodes/bnt-master/BNT/general/determine_elim_constraints.m create mode 100644 sourcecodes/bnt-master/BNT/general/dispcpt.m create mode 100644 sourcecodes/bnt-master/BNT/general/do_intervention.m create mode 100644 sourcecodes/bnt-master/BNT/general/dsep.m create mode 100644 sourcecodes/bnt-master/BNT/general/dsep_test.m create mode 100644 sourcecodes/bnt-master/BNT/general/enumerate_scenarios.m create mode 100644 sourcecodes/bnt-master/BNT/general/fgraph_to_bnet.m create mode 100644 sourcecodes/bnt-master/BNT/general/hodbn_to_bnet.m create mode 100644 sourcecodes/bnt-master/BNT/general/is_mnet.m create mode 100644 sourcecodes/bnt-master/BNT/general/linear_gaussian_to_cpot.m create mode 100644 sourcecodes/bnt-master/BNT/general/log_lik_complete.m create mode 100644 sourcecodes/bnt-master/BNT/general/log_marg_lik_complete.m create mode 100644 sourcecodes/bnt-master/BNT/general/mk_bnet.m create mode 100644 sourcecodes/bnt-master/BNT/general/mk_dbn.m create mode 100644 sourcecodes/bnt-master/BNT/general/mk_fgraph.m create mode 100644 sourcecodes/bnt-master/BNT/general/mk_fgraph_given_ev.m create mode 100644 sourcecodes/bnt-master/BNT/general/mk_higher_order_dbn.m create mode 100644 sourcecodes/bnt-master/BNT/general/mk_limid.m create mode 100644 sourcecodes/bnt-master/BNT/general/mk_mnet.m create mode 100644 sourcecodes/bnt-master/BNT/general/mk_mrf2.m create mode 100644 sourcecodes/bnt-master/BNT/general/mk_mutilated_samples.m create mode 100644 sourcecodes/bnt-master/BNT/general/mk_named_CPT.m create mode 100644 sourcecodes/bnt-master/BNT/general/mk_slice_and_half_dbn.m create mode 100644 sourcecodes/bnt-master/BNT/general/noisyORtoTable.m create mode 100644 sourcecodes/bnt-master/BNT/general/partition_dbn_nodes.m create mode 100644 sourcecodes/bnt-master/BNT/general/partition_matrix_vec_3.m create mode 100644 sourcecodes/bnt-master/BNT/general/sample_bnet.m create mode 100644 sourcecodes/bnt-master/BNT/general/sample_bnet_nocell.m create mode 100644 sourcecodes/bnt-master/BNT/general/sample_dbn.m create mode 100644 sourcecodes/bnt-master/BNT/general/score_bnet_complete.m create mode 100644 sourcecodes/bnt-master/BNT/general/shrink_obs_dims_in_gaussian.m create mode 100644 sourcecodes/bnt-master/BNT/general/shrink_obs_dims_in_table.m create mode 100644 sourcecodes/bnt-master/BNT/general/solve_limid.m create mode 100644 sourcecodes/bnt-master/BNT/general/unroll_dbn_topology.m create mode 100644 sourcecodes/bnt-master/BNT/general/unroll_higher_order_topology.m create mode 100644 sourcecodes/bnt-master/BNT/general/unroll_set.m (limited to 'sourcecodes/bnt-master/BNT/general') diff --git a/sourcecodes/bnt-master/BNT/general/CVS/Entries b/sourcecodes/bnt-master/BNT/general/CVS/Entries new file mode 100644 index 00000000..de13cc9a --- /dev/null +++ b/sourcecodes/bnt-master/BNT/general/CVS/Entries @@ -0,0 +1,50 @@ +/add_ev_to_dmarginal.m/1.1.1.1/Thu Jun 27 20:34:32 2002// +/add_evidence_to_gmarginal.m/1.1.1.1/Wed May 29 15:59:56 2002// +/bnet_to_fgraph.m/1.1.1.1/Wed May 29 15:59:54 2002// +/compute_fwd_interface.m/1.1.1.1/Wed May 29 15:59:54 2002// +/compute_interface_nodes.m/1.1.1.1/Wed May 29 15:59:54 2002// +/compute_joint_pot.m/1.1.1.1/Mon Jun 7 15:50:34 2004// +/compute_minimal_interface.m/1.1.1.1/Wed May 29 15:59:54 2002// +/convert_dbn_CPDs_to_pots.m/1.1.1.1/Fri Nov 22 22:35:00 2002// +/convert_dbn_CPDs_to_tables.m/1.1.1.1/Thu Jan 23 18:44:50 2003// +/convert_dbn_CPDs_to_tables1.m/1.1.1.1/Thu Jan 23 18:49:48 2003// +/convert_dbn_CPDs_to_tables_slow.m/1.1.1.1/Wed May 29 15:59:58 2002// +/dbn_to_bnet.m/1.1.1.1/Wed May 29 15:59:54 2002// +/dbn_to_hmm.m/1.1.1.1/Sun Feb 2 00:23:38 2003// +/determine_elim_constraints.m/1.1.1.1/Wed May 29 15:59:54 2002// +/dispcpt.m/1.1.1.1/Wed May 29 15:59:58 2002// +/do_intervention.m/1.1.1.1/Wed May 29 15:59:54 2002// +/dsep.m/1.1.1.1/Wed May 29 15:59:54 2002// +/dsep_test.m/1.1.1.1/Sat Jan 18 23:10:16 2003// +/enumerate_scenarios.m/1.1.1.1/Wed May 29 15:59:54 2002// +/fgraph_to_bnet.m/1.1.1.1/Wed May 29 15:59:54 2002// +/hodbn_to_bnet.m/1.1.1.1/Wed Jul 24 14:48:06 2002// +/is_mnet.m/1.1.1.1/Sun Jun 16 20:01:22 2002// +/linear_gaussian_to_cpot.m/1.1.1.1/Wed May 29 15:59:58 2002// +/log_lik_complete.m/1.1.1.1/Wed May 29 15:59:54 2002// +/log_marg_lik_complete.m/1.1.1.1/Wed May 29 15:59:54 2002// +/mk_bnet.m/1.1.1.1/Wed May 29 15:59:54 2002// +/mk_dbn.m/1.1.1.1/Sat Feb 1 19:42:14 2003// +/mk_fgraph.m/1.1.1.1/Wed May 29 15:59:54 2002// +/mk_fgraph_given_ev.m/1.1.1.1/Mon Jun 24 18:56:26 2002// +/mk_higher_order_dbn.m/1.1.1.1/Tue Jul 23 13:17:04 2002// +/mk_limid.m/1.1.1.1/Wed May 29 15:59:54 2002// +/mk_mnet.m/1.1.1.1/Sun Jun 16 19:52:12 2002// +/mk_mrf2.m/1.1.1.1/Tue Dec 31 22:06:48 2002// +/mk_mutilated_samples.m/1.1.1.1/Wed May 29 15:59:54 2002// +/mk_named_CPT.m/1.1.1.1/Tue Mar 30 17:18:54 2004// +/mk_slice_and_half_dbn.m/1.1.1.1/Wed May 29 15:59:54 2002// +/noisyORtoTable.m/1.1.1.1/Mon Aug 2 22:05:58 2004// +/partition_dbn_nodes.m/1.1.1.1/Wed May 29 15:59:54 2002// +/partition_matrix_vec_3.m/1.1.1.1/Wed May 29 15:59:58 2002// +/sample_bnet.m/1.1.1.1/Thu Jun 10 01:17:46 2004// +/sample_bnet_nocell.m/1.1.1.1/Wed May 29 15:59:54 2002// +/sample_dbn.m/1.1.1.1/Wed May 29 15:59:54 2002// +/score_bnet_complete.m/1.1.1.1/Wed May 29 15:59:54 2002// +/shrink_obs_dims_in_gaussian.m/1.1.1.1/Wed May 29 15:59:58 2002// +/shrink_obs_dims_in_table.m/1.1.1.1/Wed May 29 15:59:58 2002// +/solve_limid.m/1.1.1.1/Mon Jun 7 15:48:02 2004// +/unroll_dbn_topology.m/1.1.1.1/Wed May 29 15:59:54 2002// +/unroll_higher_order_topology.m/1.1.1.1/Fri May 31 10:25:58 2002// +/unroll_set.m/1.1.1.1/Mon Dec 16 17:57:14 2002// +D diff --git a/sourcecodes/bnt-master/BNT/general/CVS/Entries.Log b/sourcecodes/bnt-master/BNT/general/CVS/Entries.Log new file mode 100644 index 00000000..24f16336 --- /dev/null +++ b/sourcecodes/bnt-master/BNT/general/CVS/Entries.Log @@ -0,0 +1 @@ +A D/Old//// diff --git a/sourcecodes/bnt-master/BNT/general/CVS/Repository b/sourcecodes/bnt-master/BNT/general/CVS/Repository new file mode 100644 index 00000000..08dc139c --- /dev/null +++ b/sourcecodes/bnt-master/BNT/general/CVS/Repository @@ -0,0 +1 @@ +FullBNT/BNT/general diff --git a/sourcecodes/bnt-master/BNT/general/CVS/Root b/sourcecodes/bnt-master/BNT/general/CVS/Root new file mode 100644 index 00000000..f3bd14a6 --- /dev/null +++ b/sourcecodes/bnt-master/BNT/general/CVS/Root @@ -0,0 +1 @@ +:ext:nsaunier@bnt.cvs.sourceforge.net:/cvsroot/bnt diff --git a/sourcecodes/bnt-master/BNT/general/Old/CVS/Entries b/sourcecodes/bnt-master/BNT/general/Old/CVS/Entries new file mode 100644 index 00000000..a1785ca4 --- /dev/null +++ b/sourcecodes/bnt-master/BNT/general/Old/CVS/Entries @@ -0,0 +1,9 @@ +/bnet_to_gdl_graph.m/1.1.1.1/Wed May 29 15:59:54 2002// +/calc_mpe.m/1.1.1.1/Mon Jun 17 21:58:38 2002// +/calc_mpe_bucket.m/1.1.1.1/Wed May 29 15:59:54 2002// +/calc_mpe_dbn.m/1.1.1.1/Wed May 29 15:59:54 2002// +/calc_mpe_given_inf_engine.m/1.1.1.1/Wed May 29 15:59:54 2002// +/calc_mpe_global.m/1.1.1.1/Wed May 29 15:59:54 2002// +/compute_interface_nodes.m/1.1.1.1/Wed May 29 15:59:54 2002// +/mk_gdl_graph.m/1.1.1.1/Wed May 29 15:59:54 2002// +D diff --git a/sourcecodes/bnt-master/BNT/general/Old/CVS/Repository b/sourcecodes/bnt-master/BNT/general/Old/CVS/Repository new file mode 100644 index 00000000..46960c1c --- /dev/null +++ b/sourcecodes/bnt-master/BNT/general/Old/CVS/Repository @@ -0,0 +1 @@ +FullBNT/BNT/general/Old diff --git a/sourcecodes/bnt-master/BNT/general/Old/CVS/Root b/sourcecodes/bnt-master/BNT/general/Old/CVS/Root new file mode 100644 index 00000000..f3bd14a6 --- /dev/null +++ b/sourcecodes/bnt-master/BNT/general/Old/CVS/Root @@ -0,0 +1 @@ +:ext:nsaunier@bnt.cvs.sourceforge.net:/cvsroot/bnt diff --git a/sourcecodes/bnt-master/BNT/general/Old/bnet_to_gdl_graph.m b/sourcecodes/bnt-master/BNT/general/Old/bnet_to_gdl_graph.m new file mode 100644 index 00000000..d6ff45f3 --- /dev/null +++ b/sourcecodes/bnt-master/BNT/general/Old/bnet_to_gdl_graph.m @@ -0,0 +1,18 @@ +function gdl = bnet_to_gdl_graph(bnet) +% BNET_TO_GDL_GRAPH Convert a Bayesian network to a GDL graph +% gdl = bnet_to_gdl_graph(bnet) +% +% Each node in the BN gets converted to a single node in the GDL graph, +% representing its family; its kernel function is the corresponding CPD. + +N = length(bnet.dag); +doms = cell(1,N); +for i=1:N + doms{i} = family(bnet.dag, i); +end + +U = mk_undirected(bnet.dag); +gdl = mk_gdl_graph(U, doms, bnet.node_sizes, bnet.CPD, 'equiv_class', bnet.equiv_class, ... + 'discrete', bnet.dnodes, 'chance', bnet.chance_nodes, ... + 'decision', bnet.decision_nodes, 'utility', bnet.utility_nodes); + diff --git a/sourcecodes/bnt-master/BNT/general/Old/calc_mpe.m b/sourcecodes/bnt-master/BNT/general/Old/calc_mpe.m new file mode 100644 index 00000000..5f55e708 --- /dev/null +++ b/sourcecodes/bnt-master/BNT/general/Old/calc_mpe.m @@ -0,0 +1,58 @@ +function [mpe, ll] = calc_mpe(engine, evidence, break_ties) +% CALC_MPE Computes the most probable explanation of the evidence +% [mpe, ll] = calc_mpe_given_inf_engine(engine, evidence, break_ties) +% +% INPUT +% engine must support max-propagation +% evidence{i} is the observed value of node i, or [] if hidden +% break_ties is optional. If 1, we will force ties to be broken consistently +% by calling enter_evidence N times. +% +% OUTPUT +% mpe{i} is the most likely value of node i (cell array!) +% ll is the log-likelihood of the globally best assignment +% +% This currently only works when all hidden nodes are discrete + +if nargin < 3, break_ties = 0; end + + +[engine, ll] = enter_evidence(engine, evidence, 'maximize', 1); + +observed = ~isemptycell(evidence); + +if 0 % fgraphs don't support bnet_from_engine +onodes = find(observed); +bnet = bnet_from_engine(engine); +pot_type = determine_pot_type(bnet, onodes); +assert(pot_type == 'd'); +end + +scalar = 1; +evidence = evidence(:); % hack to handle unrolled DBNs +N = length(evidence); +mpe = cell(1,N); +for i=1:N + m = marginal_nodes(engine, i); + % observed nodes are all set to 1 inside the inference engine, so we must undo this + if observed(i) + mpe{i} = evidence{i}; + else + mpe{i} = argmax(m.T); + % Bug fix by Ron Zohar, 8/15/01 + % If there are ties, we must break them as follows (see Jensen96, p106) + if break_ties + evidence{i} = mpe{i}; + [engine, ll] = enter_evidence(engine, evidence, 'maximize', 1); + end + end + if length(mpe{i}) > 1, scalar = 0; end +end + +if nargout >= 2 + bnet = bnet_from_engine(engine); + ll = log_lik_complete(bnet, mpe(:)); +end +if 0 % scalar + mpe = cell2num(mpe); +end diff --git a/sourcecodes/bnt-master/BNT/general/Old/calc_mpe_bucket.m b/sourcecodes/bnt-master/BNT/general/Old/calc_mpe_bucket.m new file mode 100644 index 00000000..40602725 --- /dev/null +++ b/sourcecodes/bnt-master/BNT/general/Old/calc_mpe_bucket.m @@ -0,0 +1,160 @@ +function [mpe, ll] = calc_mpe_bucket(bnet, new_evidence, max_over) +% +% PURPOSE: +% CALC_MPE Computes the most probable explanation to the network nodes +% given the evidence. +% +% [mpe, ll] = calc_mpe(engine, new_evidence, max_over) +% +% INPUT: +% bnet - the bayesian network +% new_evidence - optional, if specified - evidence to be incorporated [cell(1,n)] +% max_over - optional, if specified determines the variable elimination order [1:n] +% +% OUTPUT: +% mpe - the MPE assignmet for the net variables (or [] if no satisfying assignment) +% ll - log assignment probability. +% +% Notes: +% 1. Adapted from '@var_elim_inf_engine\marginal_nodes' for MPE by Ron Zohar, 8/7/01 +% 2. Only discrete potentials are supported at this time. +% 3. Complexity: O(nw*) where n is the number of nodes and w* is the induced tree width. +% 4. Implementation based on: +% - R. Dechter, "Bucket Elimination: A Unifying Framework for Probabilistic Inference", +% UA1 96, pp. 211-219. + + +ns = bnet.node_sizes; +n = length(bnet.dag); +evidence = cell(1,n); +if (nargin<2) + new_evidence = evidence; +end + +onodes = find(~isemptycell(new_evidence)); % observed nodes +hnodes = find(isemptycell(new_evidence)); % hidden nodes +pot_type = determine_pot_type(bnet, onodes); + +if pot_type ~= 'd' + error('only disrete potentials supported at this time') +end + +for i=1:n + fam = family(bnet.dag, i); + CPT{i} = convert_to_pot(bnet.CPD{bnet.equiv_class(i)}, pot_type, fam(:), evidence); +end + +% handle observed nodes: set impossible cases' probability to zero +% rather than prun matrix (this makes backtracking easier) + +for ii=onodes + lIdx = 1:ns(ii); + lIdx = setdiff(lIdx, new_evidence{ii}); + + sCPT=struct(CPT{ii}); % violate object privacy + + sargs = ''; + for jj=1:(length(sCPT.domain)-1) + sargs = [sargs, ':,']; + end + for jj=lIdx + eval(['sCPT.T(', sargs, num2str(jj), ')=0;']); + end + CPT{ii}=dpot(sCPT.domain, sCPT.sizes, sCPT.T); +end + +B = cell(1,n); +for b=1:n + B{b} = mk_initial_pot(pot_type, [], [], [], []); +end + +if (nargin<3) + max_over = (1:n); +end +order = max_over; % no attempt to optimize this + + +% Initialize the buckets with the CPDs assigned to them +for i=1:n + b = bucket_num(domain_pot(CPT{i}), order); + B{b} = multiply_pots(B{b}, CPT{i}); +end + +% Do backward phase +max_over = max_over(length(max_over):-1:1); % reverse +for i=max_over(1:end-1) + % max-ing over variable i which occurs in bucket j + j = bucket_num(i, order); + rest = mysetdiff(domain_pot(B{j}), i); + %temp = marginalize_pot_max(B{j}, rest); + temp = marginalize_pot(B{j}, rest, 1); + b = bucket_num(domain_pot(temp), order); + % fprintf('maxing over bucket %d (var %d), putting result into bucket %d\n', j, i, b); + sB=struct(B{b}); % violate object privacy + if ~isempty(sB.domain) + B{b} = multiply_pots(B{b}, temp); + else + B{b} = temp; + end +end +result = B{1}; +marginal = pot_to_marginal(result); +[prob, mpe] = max(marginal.T); + +% handle impossible cases +if ~(prob>0) + mpe = []; + ll = -inf; + %warning('evidence has zero probability') + return +end + +ll = log(prob); + +% Do forward phase +for ii=2:n + marginal = pot_to_marginal(B{ii}); + mpeidx = []; + for jj=order(1:length(mpe)) + assert(ismember(jj, marginal.domain)) %%% bug + temp = find_equiv_posns(jj, marginal.domain); + mpeidx = [mpeidx, temp] ; + if isempty(temp) + mpeidx = [mpeidx, Inf] ; + end + end + [mpeidxsorted sortedtompe] = sort(mpeidx) ; + + % maximize the matrix obtained from assigning values from previous buckets. + % this is done by building a string and using eval. + + kk=1; + sargs = '('; + for jj=1:length(marginal.domain) + if (jj~=1) + sargs = [sargs, ',']; + end + if (mpeidxsorted(kk)==jj) + sargs = [sargs, num2str(mpe(sortedtompe(kk)))]; + if (kk