about summary refs log tree commit diff
path: root/sourcecodes/bnt-master/SLP/scoring/score_dags.m
diff options
context:
space:
mode:
Diffstat (limited to 'sourcecodes/bnt-master/SLP/scoring/score_dags.m')
-rw-r--r--sourcecodes/bnt-master/SLP/scoring/score_dags.m74
1 files changed, 74 insertions, 0 deletions
diff --git a/sourcecodes/bnt-master/SLP/scoring/score_dags.m b/sourcecodes/bnt-master/SLP/scoring/score_dags.m
new file mode 100644
index 00000000..acda3e0f
--- /dev/null
+++ b/sourcecodes/bnt-master/SLP/scoring/score_dags.m
@@ -0,0 +1,74 @@
+function [score, cache] = score_dags(data, ns, dags, varargin)
+% SCORE_DAGS Compute the score of one or more DAGs
+% score = score_dags(data, ns, dags, varargin)
+%
+% data{i,m} = value of node i in case m (can be a cell array).
+% node_sizes(i) is the number of size of node i.
+% dags{g} is the g'th dag
+% score(g) is the score of the i'th dag
+%
+% The following optional arguments can be specified in the form of name/value pairs:
+% [default value in brackets]
+%
+% scoring_fn - 'bayesian' or 'bic' [ 'bayesian' ]
+%              Currently, only networks with all tabular nodes support Bayesian scoring.
+% type       - type{i} is the type of CPD to use for node i, where the type is a string
+%              of the form 'tabular', 'noisy_or', 'gaussian', etc. [ all cells contain 'tabular' ]
+% params     - params{i} contains optional arguments passed to the CPD constructor for node i,
+%              or [] if none.  [ all cells contain {'prior', 1}, meaning use uniform Dirichlet priors ]
+% discrete   - the list of discrete nodes [ 1:N ]
+% clamped    - clamped(i,m) = 1 if node i is clamped in case m [ zeros(N, ncases) ]
+% cache      - data structure used to memorize local score computations (cf. SCORE_INIT_CACHE function) [ [] ]
+%
+% e.g., score = score_dags(data, ns, mk_all_dags(n), 'scoring_fn', 'bic', 'params', [],'cache',cache);
+%
+% (Caching implementation : francois.olivier.c.h@gmail.com, philippe.leray@univ-nantes.fr)
+% ("Clamped" optimisation : Derek Hoiem <dhoiem@cs.cmu.edu>)
+
+[n ncases] = size(data);
+
+% set default params
+type = cell(1,n);
+params = cell(1,n);
+cache=[];
+for i=1:n
+  type{i} = 'tabular';
+  params{i} = { 'prior_type', 'dirichlet', 'dirichlet_weight', 1 };
+end
+scoring_fn = 'bayesian';
+discrete = 1:n;
+
+isclamped = 0; % DWH
+clamped = zeros(n, ncases);
+u = [1:ncases]'; % DWH
+
+args = varargin;
+nargs = length(args);
+for i=1:2:nargs
+  switch args{i},
+   case 'scoring_fn', scoring_fn = args{i+1};
+   case 'type',       type = args{i+1};
+   case 'discrete',   discrete = args{i+1};
+   case 'clamped',    clamped = args{i+1}, isclamped = 1; %DWH
+   case 'params',     if isempty(args{i+1}), params = cell(1,n); else params = args{i+1};  end
+   case 'cache',      cache=args{i+1} ;
+  end
+end
+
+NG = length(dags);
+score = zeros(1, NG);
+
+for j=1:n
+    if isclamped %DWH
+        u = find(clamped(j,:)==0);
+    end
+    for g=1:NG
+        if isempty(dags{g})
+            score(g)=-Inf;
+        else
+            ps = parents(dags{g}, j);
+            [scor cache] = score_family(j, ps, type{j}, scoring_fn, ns, discrete, data(:,u), params{j}, cache);
+            score(g) = score(g) + scor;
+        end
+    end
+end
\ No newline at end of file