To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Revision:

root / _FullBNT / BNT / general / sample_dbn.m @ 8:b5b38998ef3b

History | View | Annotate | Download (1.85 KB)

1
function seq = sample_dbn(bnet, varargin)
2
% SAMPLE_DBN Generate a random sequence from a DBN.
3
% seq = sample_dbn(bnet, ...)
4
%
5
% seq{i,t} contains the values of the i'th node in the t'th slice.
6
%
7
% Optional arguments:
8
%
9
% length - length of sequence  to be generated (can also just use sample_dbn(bnet,T))
10
% stop_test - name of a function which is used to decide when to stop;
11
%   This will be called as feval(stop_test, seq(:,t))
12
%   i.e., stop_test is passed a cell array containing all the nodes in the current slice.   
13
% evidence - initial evidence; if evidence{i,t} is non-empty, this node won't be sampled.
14

    
15
args = varargin;
16
nargs = length(args);
17

    
18
if (nargs == 1) & ~isstr(args{1})
19
  % Old syntax: sample_dbn(bnet, T)
20
  T = args{1};
21
else
22
  % get length
23
  T = 1;
24
  for i=1:2:nargs
25
    switch args{i},
26
     case 'length',      T = args{i+1}; 
27
     case 'evidence',    T = size(args{i+1}, 2);
28
    end
29
  end
30
end
31

    
32
ss = length(bnet.intra);
33
% set default arguments
34
seq = cell(ss, T);
35
stop_test = [];
36
for i=1:2:nargs
37
  switch args{i},
38
   case 'evidence',    seq = args{i+1}; % initialise observed nodes
39
   case 'stop_test',  stop_test = args{i+1};
40
  end
41
end
42

    
43
t = 1;
44
for i=1:ss
45
  if ~isempty(stop_test) | isempty(seq{i,t})
46
    ps = parents(bnet.dag, i);
47
    e = bnet.equiv_class(i,1);
48
    pvals = seq(ps);
49
    seq{i,t} = sample_node(bnet.CPD{e}, pvals);
50
    %fprintf('sample i=%d,t=%d,val=%d,ps\n', i, t, seq(i,t)); pvals(:)'
51
  end
52
end
53
t = 2;
54
done = 0;
55
while ~done
56
  for i=1:ss
57
    if ~isempty(stop_test) | isempty(seq{i,t})
58
      ps = parents(bnet.dag, i+ss) + (t-2)*ss;
59
      e = bnet.equiv_class(i,2);
60
      pvals = seq(ps);
61
      seq{i,t} = sample_node(bnet.CPD{e}, pvals);
62
      %fprintf('sample i=%d,t=%d,val=%d,ps\n', i, t, seq(i,t)); pvals(:)'
63
    end
64
  end
65
  if ~isempty(stop_test)
66
    done = feval(stop_test, seq(:,t));
67
  else
68
    if t==T
69
      done = 1;
70
    end
71
  end
72
  t = t + 1;
73
end