diff toolboxes/FullBNT-1.0.7/bnt/examples/limids/asia_dt1.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/asia_dt1.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,100 @@
+% decision theoretic version of asia network
+% Cowell et al, p177
+% We explicitely add the no-forgetting arcs.
+
+Smoking = 1;
+VisitToAsia = 2;
+Bronchitis = 3;
+LungCancer = 4;
+TB = 5;
+Do_Xray = 6;
+TBorCancer = 7;
+Util_Xray = 8;
+Dys = 9;
+posXray = 10;
+Do_Hosp = 11;
+Util_Hosp = 12;
+
+n = 12;
+dag = zeros(n);
+dag(Smoking, [Bronchitis LungCancer]) = 1;
+dag(VisitToAsia, [TB Do_Xray Do_Hosp]) = 1;
+dag(Bronchitis, Dys) = 1;
+dag(LungCancer, [Util_Hosp TBorCancer]) = 1;
+dag(TB, [Util_Hosp TBorCancer Util_Xray]) = 1;
+dag(Do_Xray, [posXray Util_Xray Do_Hosp]) = 1;
+dag(TBorCancer, [Dys posXray]) = 1;
+dag(Dys, Do_Hosp) = 1;
+dag(posXray, Do_Hosp) = 1;
+dag(Do_Hosp, Util_Hosp) = 1;
+
+dnodes = [Do_Xray Do_Hosp];
+unodes = [Util_Xray Util_Hosp];
+cnodes = mysetdiff(1:n, [dnodes unodes]); % chance nodes
+ns = 2*ones(1,n);
+ns(unodes) = 1;
+limid = mk_limid(dag, ns, 'chance', cnodes, 'decision', dnodes, 'utility', unodes);
+
+% 1 = yes, 2 = no
+limid.CPD{VisitToAsia} = tabular_CPD(limid, VisitToAsia, [0.01 0.99]);
+limid.CPD{Bronchitis} = tabular_CPD(limid, Bronchitis, [0.6 0.3  0.4 0.7]);
+limid.CPD{Dys} = tabular_CPD(limid, Dys, [0.9 0.7 0.8 0.1  0.1 0.3 0.2 0.9]);
+limid.CPD{TBorCancer} = tabular_CPD(limid, TBorCancer, [1 1 1 0  0 0 0 1]);
+
+limid.CPD{LungCancer} = tabular_CPD(limid, LungCancer, [0.1 0.01  0.9 0.99]);
+limid.CPD{Smoking} = tabular_CPD(limid, Smoking, [0.5 0.5]);
+limid.CPD{TB} = tabular_CPD(limid, TB, [0.05 0.01  0.95 0.99]);
+limid.CPD{posXray} = tabular_CPD(limid, posXray, [0.98 0.5 0.05 0.5  0.02 0.5 0.95 0.5]);
+
+limid.CPD{Util_Hosp} = tabular_utility_node(limid, Util_Hosp, [180 120 160 15  2 4 0 40]);
+limid.CPD{Util_Xray} = tabular_utility_node(limid, Util_Xray, [0 1 10 10]);
+
+for i=dnodes(:)'
+  limid.CPD{i} = tabular_decision_node(limid, i);
+end
+
+engines = {};
+engines{end+1} = global_joint_inf_engine(limid);
+engines{end+1} = jtree_limid_inf_engine(limid);
+%engines{end+1} = belprop_inf_engine(limid);
+
+exact = [1 2];
+%approx = 3;
+approx = [];
+
+
+NE = length(engines);
+MEU = zeros(1, NE);
+niter = zeros(1, NE);
+strategy = cell(1, NE);
+
+tol = 1e-2;
+for e=1:length(engines)
+  [strategy{e}, MEU(e), niter(e)] = solve_limid(engines{e});
+end
+
+for e=exact(:)'
+  assert(approxeq(MEU(e), 47.49, tol))
+  assert(isequal(strategy{e}{Do_Xray}(:)', [1 0 0 1]))
+  
+  % Check the hosptialize strategy is correct (p180)
+  % We assume the patient has not been to Asia and therefore did not have an Xray.
+  % In this case it is optimal not to hospitalize regardless of whether the patient has
+  % dyspnoea or not (and of course regardless of the value of pos_xray).
+  asia = 2;
+  do_xray = 2;
+  for dys = 1:2
+    for pos_xray = 1:2
+      assert(argmax(squeeze(strategy{e}{Do_Hosp}(asia, do_xray, dys, pos_xray, :))) == 2)
+    end
+  end
+end
+
+
+for e=approx(:)'
+  approxeq(strategy{exact(1)}{Do_Xray}, strategy{e}{Do_Xray})
+  approxeq(strategy{exact(1)}{Do_Hosp}, strategy{e}{Do_Hosp})
+end
+
+ 
+