text
[mlfp.git] / matlab / generate_sequences.m
blob587cee4bc2b77c15e456c600910694950c8fcc26
1 % Generate sample sequences from the model given.\r
2 function sequences = generate_sequences(model, num_sequences, sequence_length)\r
3 \r
4 for i=1:num_sequences\r
5     sequences(i).obs = generate_sequence_from_model(model, sequence_length);\r
6 end\r
7 \r
8 function sequence = generate_sequence_from_model(model, sequence_length)\r
9 \r
10 % Figure out which MC we want to use\r
11 which_mc = get_random_index(model.priors');\r
12 sequence = generate_sequence_from_mc(model.chain(which_mc), sequence_length);\r
14 function sequence = generate_sequence_from_mc(mc, sequence_length)\r
16 sequence = zeros(1, sequence_length);\r
18 % First generate the initial state\r
19 sequence(1) = get_random_index(mc.t');\r
20 % Now generate the next states based on the transition matrices\r
21 for i=2:sequence_length\r
22     sequence(i) = get_random_index(mc.T(sequence(i-1), :));\r
23 end\r
25 % Returns a random index, assuming that the passed in vector is a 1 x n\r
26 % vector whose contents sum to 1.\r
27 function index = get_random_index(dist)\r
28 assert(abs(sum(dist) - 1) < 0.001);\r
29 sequence_rand = rand(1);\r
30 current_min = 0;\r
31 index = -1;\r
32 for i=1:size(dist, 2)\r
33     current_max = current_min + dist(i);\r
34     if (sequence_rand >= current_min & sequence_rand < current_max)\r
35         index = i;\r
36         break;\r
37     end\r
38     current_min = current_max;\r
39 end\r
40 assert(index > 0 & index <= size(dist, 2))\r