diff toolboxes/FullBNT-1.0.7/bnt/examples/limids/pigs1.m @ 0:e9a9cd732c1e tip

first hg version after svn
author wolffd
date Tue, 10 Feb 2015 15:05:51 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toolboxes/FullBNT-1.0.7/bnt/examples/limids/pigs1.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,153 @@
+% pigs model from Lauritzen and Nilsson, 2001
+
+seed = 0;
+rand('state', seed);
+randn('state', seed);
+
+% we number nodes down and to the right
+h = [1 5 9 13];
+t = [2 6 10];
+d = [3 7 11];
+u = [4 8 12 14];
+
+N = 14;
+dag = zeros(N);
+
+% causal arcs
+for i=1:3
+  dag(h(i), [t(i) h(i+1)]) = 1;
+  dag(d(i), [u(i) h(i+1)]) = 1;
+end
+dag(h(4), u(4)) = 1;
+
+% information arcs
+fig = 2;
+switch fig
+ case 0,
+  % no info arcs
+ case 1,
+   % no-forgetting policy (figure 1)
+   for i=1:3
+     dag(t(i), d(i:3)) = 1;
+   end
+ case 2,
+  % reactive policy (figure 2)
+  for i=1:3
+    dag(t(i), d(i)) = 1;
+  end
+ case 7,
+  % omniscient policy (figure 7: di has access to hidden state h(i-1))
+  dag(t(1), d(1)) = 1;
+  for i=2:3
+    %dag([h(i-1) t(i-1) d(i-1)], d(i)) = 1;
+    dag([h(i-1) d(i-1)], d(i)) = 1; % t(i-1) is redundant given h(i-1)
+  end
+end
+
+
+ns = 2*ones(1,N);
+ns(u) = 1;
+
+% parameter tying
+params = ones(1,N);
+uparam = 1;
+final_uparam = 2;
+tparam = 3;
+h1_param = 4;
+hparam = 5;
+dparams = 6:8;
+
+params(u(1:3)) = uparam;
+params(u(4)) = final_uparam;
+params(t) = tparam;
+params(h(1)) = h1_param;
+params(h(2:end)) = hparam;
+params(d) = dparams;
+
+limid = mk_limid(dag, ns, 'chance', [h t], 'decision', d, 'utility', u, 'equiv_class', params);
+
+% h = 1 means healthy, h = 2 means diseased
+% d = 1 means don't treat, d = 2 means treat
+% t = 1 means test shows healthy, t = 2 means test shows diseased
+
+if 0
+  % use random params
+  limid.CPD{final_uparam} = tabular_utility_node(limid, u(4));
+  limid.CPD{uparam} = tabular_utility_node(limid, u(1));
+  limid.CPD{tparam} = tabular_CPD(limid, t(1));
+  limid.CPD{h1_param} = tabular_CPD(limid, h(1));
+  limid.CPD{hparam} = tabular_CPD(limid, h(2));
+else
+  limid.CPD{final_uparam} = tabular_utility_node(limid, u(4), [1000 300]);
+  limid.CPD{uparam} = tabular_utility_node(limid, u(1), [0 -100]); % costs have negative utility!
+  
+  % h  P(t=1) P(t=2)
+  % 1  0.9   0.1
+  % 2  0.2   0.8
+  limid.CPD{tparam} = tabular_CPD(limid, t(1), [0.9 0.2 0.1 0.8]);
+  
+  % P(h1)
+  limid.CPD{h1_param} = tabular_CPD(limid, h(1), [0.9 0.1]);
+  
+  % hi di P(hj=1) P(hj=2),  j = i+1, i=1:3
+  % 1  1  0.8     0.2
+  % 2  1  0.1     0.9
+  % 1  2  0.9     0.1
+  % 2  2  0.5     0.5
+  limid.CPD{hparam} = tabular_CPD(limid, h(2), [0.8 0.1 0.9 0.5 0.2 0.9 0.1 0.5]);
+end
+
+% Decision nodes get assigned uniform policies by default
+for i=1:3
+  limid.CPD{dparams(i)} = tabular_decision_node(limid, d(i));
+end
+
+
+fname = '/home/cs/murphyk/matlab/Misc/loopybel.txt';
+
+engines = {};
+engines{end+1} = global_joint_inf_engine(limid);
+engines{end+1} = jtree_limid_inf_engine(limid);
+%engines{end+1} = belprop_inf_engine(limid, 'max_iter', 1*N, 'filename', fname, 'tol', 1e-3);
+
+exact = [1 2];
+%approx = 3;
+approx = [];
+
+max_iter = 1;
+order = d(end:-1:1);
+%order = d(1:end);
+
+NE = length(engines);
+MEU = zeros(1, NE);
+niter = zeros(1, NE);
+strategy = cell(1, NE);
+for e=1:NE
+  [strategy{e}, MEU(e), niter(e)] = solve_limid(engines{e}, 'max_iter', max_iter, 'order',  order);
+end
+MEU
+
+% check results match those in the paper (p. 22)
+direct_policy = eye(2); % treat iff test is positive
+never_policy = [1 0; 1 0]; % never treat
+tol = 1e-0; % results in paper are reported to 0dp
+for e=exact(:)'
+  switch fig
+   case 2, % reactive policy
+    assert(approxeq(MEU(e), 727, tol));
+    assert(approxeq(strategy{e}{d(1)}(:), never_policy(:)))
+    assert(approxeq(strategy{e}{d(2)}(:), direct_policy(:)))
+    assert(approxeq(strategy{e}{d(3)}(:), direct_policy(:)))
+   case 1, assert(approxeq(MEU(e), 729, tol));
+   case 7, assert(approxeq(MEU(e), 732, tol));
+  end
+end
+
+
+for e=approx(:)'
+  for i=1:3
+    approxeq(strategy{exact(1)}{d(i)}, strategy{e}{d(i)})
+    dispcpt(strategy{e}{d(i)})
+  end
+end
+